如何在ros上编写一个简单的node并进行通信

2023-05-16

如何在ros上编写一个简单的node并进行通信。

 

这里采用ros教程的例子,稍作修改。

 

与C++不同的是,python不需要在package中加入message_runtime以及message_generation.

我自己的package文件如下:


 

.......

.......

  <buildtool_depend>catkin</buildtool_depend>
  <build_depend>roscpp</build_depend>
  <build_depend>rospy</build_depend>
  <build_depend>std_msgs</build_depend>
  <build_depend>message_generation</build_depend>

  <build_export_depend>roscpp</build_export_depend>
  <build_export_depend>rospy</build_export_depend>
  <build_export_depend>std_msgs</build_export_depend>

  <exec_depend>roscpp</exec_depend>
  <exec_depend>rospy</exec_depend>
  <exec_depend>std_msgs</exec_depend>
  <exec_depend>message_runtime</exec_depend>

........

........

 

对CMakeLists.txt也不需要作什么更改。

 

之后就可以开始放你的pyton文件了,当然,你也可以先吧python文件方好,放在包的scripts文件夹中(需要自己新建)。

这里假设你发布信息的python文件叫talker.py,且代码如下:
 

#!/usr/bin/env python

import rospy
from std_msgs.msg import String

def talker():
    pub = rospy.Publisher('chatter', String, queue_size=10)
    rospy.init_node('talker', anonymous=True)
    rate = rospy.Rate(10) # 10hz
    while not rospy.is_shutdown():
        hello_str = "hello world %s" % rospy.get_time()
        rospy.loginfo(hello_str)
        pub.publish(hello_str)
        rate.sleep()

if __name__ == '__main__':
    try:
        talker()
    except rospy.ROSInterruptException:
        pass        

这里,对每一行的代码进行解析:

1.

#!/usr/bin/env python

每个python ros节点的顶部都将有此声明,第一行确保脚本作为python叫脚本执行。

 

2.

import rospy

from std_msgs.msg import String

rospy是每个ros node必须要的,std_msg.msg import String则声明需要用到String类型,其他的std_msgs包内的msg文件夹中的类型也都可以根据需要而调用。(这里,String是用来发布信息的)

 

3.

pub = rospy.Publisher('chatter',String,queue_size = 10)

rospy.init_node('talker',anonymous = True)

这部分定义了talker与tos其他部分的接口

pub = rospy.Publisher("chatter",String,queue_size = 10)表示:该结点向 /chatter 主题发布String类型的信息。queue_size=10表示如果如何的订阅者接受信息的速度不够快,则限制排队的信息。

 

rospy.init_node('talker',anonymous=True)则是告诉rospy你的结点名为talker。那边的什么什么=true则使得可以有多个结点同时命名为talker,因为该语句最后会给你的结点命名为talker+(随机数)。rospy只有得到该信息后,才能实现与master的通信。

注意:这里的名字不可以有斜杠"/"。

 

4.

rate = rospy.Rate(10) #10Hz

 

5.

while not rospy.is_shutdown():

    hello_str = "hello world %s" % rospy.get_time()

    rospy.loginfo(hello_str)

    pub.publish(hello_str)

    rate.sleep()

循环是一个相当标准的rospy构造:rospy.is_shutdown()检查rospy是否还在运行,运行状态下,pub.publish会发布一个字符串给主题"chatter".循环时还调用rate.sleep()睡眠足够长的时间,以便通过循环保持所需的速率。

rospy.loginfo(str) 则打印消息到屏幕、结点的日志文件、rosout。

 

6.

try:

    talker()

except rospy.ROSInterruptException:

    pass

除了标准的python __main__检查外,这亥捕获了一个rospy。

rospy.ROSInterruptException异常可以由rospy.sleep()和rospy.Rate.sleep()方法引发。

 

你的接受信息的文件叫listener.py,内容如下:

#!/usr/bin/env python

import rospy
from std_msgs.msg import String

def callback(data):
    rospy.loginfo(rospy.get_caller_id() + 'I heard %s', data.data)

def listener():

    rospy.init_node('listener', anonymous=True)

    rospy.Subscriber('chatter', String, callback)

    rospy.spin()

if __name__ == '__main__':
    listener()

1.

这里的from std_msgs.msg import String声明了你的结点接受的类型为String

 

2.

rospy.init_node('listener',anonymous = True) 说明该结点明为listener,anonymous跟上面讲到的一样。

 

3.

rospy.spin()则是让你的结点持续运行,知道结点被杀为止。与roscpp不同的是,rospy.spin()不会影响订阅者的回调函数,因为这些函数有自己的线程。

 

回归正题:

之后,把python文件变为可执行文件,使用指令:

$ chmod +x taliker.py

$ chmod +x listener.py

 

然后你就可以建立自己的节点拉,使用指令:

$ cd ~/catkin_ws

$ catkin_make

 

然后就可以用

$ roscore

$ rosrun [包名] [节点名]

运行你编写的节点。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在ros上编写一个简单的node并进行通信 的相关文章

随机推荐

  • C++【类与对象】——运算符重载

    文章目录 一 运算符重载1 定义 二 加号运算符重载1 code格式 xff08 1 xff09 通过成员函数实现加号运算符重载 xff08 2 xff09 通过全局函数实现加号运算符重载 2 作用3 拓展 xff08 1 xff09 运算
  • C++【类与对象】——继承

    文章目录 一 基本语法1 code格式2 作用 二 继承方式1 图解 xff08 核心 xff09 2 总结 三 继承中的对象模型1 总结 四 构造和析构顺序1 引入2 总结 五 同名成员访问1 引入2 同名成员属性访问方式3 同名成员函数
  • 【ROS基础指令】ROS基础指令、基本知识快速查询

    ROS学习 ROS相关指令积累1 ros基础指令2 ros常用工具指令关于rviz关于rqt关于gazebo关于launch关于run关于PX4 如何自定义数据类型仿真 ROS相关指令积累 1 ros基础指令 功能指令初始化创建工作空间ca
  • 【cartographer_slam源码阅读】4-6激光雷达数据的转换

    HandleLaserScanMessage 函数 作用 xff1a 利用 ToPointCloudWithIntensities函数 将ros中的数据转换为carto中定义的数据类型 xff1b 传入 HandleLaserScan 函数
  • prometheus二次开发之HTTP api(一)

    Prometheus在 api v1的路径下开放了HTTP接口 xff0c 用户可以通过这些接口进行二次开发 这篇笔记挑选了此次监控平台可能会用到的接口进行解析 1 请求 amp 响应格式 1 JSON响应格式 以JSON格式进行响应 若A
  • prometheus二次开发之HTTP api(二)

    接以上prometheus二次开发之HTTP api xff08 一 xff09 xff1a https blog csdn net weixin 44723434 article details 104282636 最近做监控方案发现可能
  • 从 JavaScript 中的数组中删除空对象

    从数组中删除空对象 xff1a 使用 Array filter 方法遍历数组 将每个对象传递给 Object keys 方法并检查键的长度是否不等于 0 filter 方法将返回一个不包含空对象的新数组 span class token k
  • 耦合,紧耦合,松耦合,解耦

    一 耦合 耦合是两个或多个模块之间的相互关联 在软件工程中 xff0c 两个模块之间的耦合度越高 xff0c 维护成本越高 因此 xff0c 在系统架构的设计过程中 xff0c 应减少各个模块之间的耦合度 xff0c 以提高应用的可维护性
  • 实习日记之SNMPV3不难

    SNMPv3 的连接 snmpwalk v 3 u a a MD5 A Qaz1234567 x AES X Qaz1234567 l authPriv 10 0 31 132 1 3 6 1 2 1 6 前面 v 3 xff0c 意思是在
  • 一些控制算法学习

    pid LQR xff08 LQG xff09 xff0c 鲁棒控制 xff08 H无穷 xff09 xff0c 自适应控制 xff08 包含滑膜 xff0c 反步法 xff0c mrac模型参考 xff0c L1自适应 xff09 xff
  • Qt和其它GUI库的对比

    Windows 下的 GUI 库 Windows 下的 GUI 解决方案比较多 xff1a 基于 C 43 43 的有 Qt MFC WTL wxWidgets DirectUI Htmlayout xff1b 基于 C 的有 WinFor
  • stm32初学 Keil debug断点调试的步骤

    网上没搜到 xff0c 自己简单写一个 xff0c 希望对大家有用 1 在debug模式下 xff0c 将需要观察的变量选中 xff0c 右键Add to添加到 Watch 1中 原本Watch应该位置在右下角见图二 xff0c 是我拖到了
  • 关于a++和++a

    作者 xff1a Huya天涯过客 写此博文的初衷是想将自己的心得体会与Java初学者进行分享 xff0c 已在该领域纵横多年的技术大佬请自行跳过 刚学到数据类型以及变量赋值的同学们肯定会接触到自增运算符这个知识点 xff0c 绝对有很多人
  • Nuttx学习笔记(一)——Nuttx系统开发环境搭建

    最近刚开始接触Nuttx xff0c 在配置环境的时候踩了一些坑 xff0c 写下这篇博客记录一下 本人搭建开发环境的时候 xff0c 参考了官方文档和YouTube上的一个大佬的视频 xff0c 链接如下 xff1a 官方文档 http
  • Linux驱动_驱动设计的思想(面向对象、设备树)

    一 Linux驱动 驱动设计的思想 xff08 面向对象 分层 分离 xff09 总则 xff1a Linux驱动 61 驱动框架 43 硬件操作 61 驱动框架 43 单片机 1 面向对象就是用结构体表示某个对象 2 分层 3 分离 事实
  • 2惠普暗影精灵恢复出厂设置

    因为之前把电脑送去惠普售后店维修了 xff08 寻找惠普官方售后店的方法 xff1a 关注微信公众号惠普服务 xff09 xff0c 拿回来的时候系统被店里的人重装了 xff0c 不但C盘只剩下十几G的空间 xff0c 而且多了阴魂不散的3
  • Ubuntu18.04屏幕自动旋转解决方法

    Ubuntu屏幕突然自己旋转 xff0c 大概率是因为开了重力感应 xff0c 电脑倾角变动后 xff0c 屏幕跟随旋转 首先先把屏幕转回来 终端输入 xrandr span class token operator span q 查看连接
  • 傅里叶与图像特征简介

    傅里叶变换在图像处理中有着广泛的应用 xff0c 主要应用方向有 xff1a 图像增强与去噪 边缘检测 特征提取 图像压缩等 其核心思想是使用傅里叶变换将图像由空间域转换至频率域 xff0c 通过对频率域进行不同的运算操作 xff0c 实现
  • openCPU开发demo详解包括线程调度、队列等的使用

    OpenCPU开发例程的详细解释 xff0c 包括各种功能的测试 xff0c 如线程 队列等 源代码为osi demo c 初步学习 xff0c 可能有误 xff0c 仅供参考 demo详解 代码部分系统函数fibo textTrace 输
  • 如何在ros上编写一个简单的node并进行通信

    如何在ros上编写一个简单的node并进行通信 这里采用ros教程的例子 xff0c 稍作修改 与C 43 43 不同的是 xff0c python不需要在package中加入message runtime以及message generat