ROS话题 消息通讯机制
ROS节点间通过话题通信流程简图
通过示例理解话题及其命令行工具
我们继续接着前面的示例来深入理解一下什么是话题,由于前面的三个软件包都是发布者,我们需要酌情修改一 下,然后增加一个订阅者节点,这样就能真实的感受到ROS中节点如何通过话题进行通信了
接下来修改一下third_pkg软件包,由于最初的代码编写时发送的话题类型为字符串,这里我们需要将其修改为整 型,这样方便我们后面使用rqt_plot画图软件将话题数据可视化演示,在这里我们修改如下:
- 将默认的话题类型从
String
修改为Int32
; - 将话题名称从third_pkg修改为third_pkg_topic,方便我们与节点third_pkg区别开;
- 将发送话题的频率从10Hz改为2Hz,500ms发送一次
- 话题中的数据内容从0到4循环发送,这样方便我们查看动态发布过程
修改third_pkg.cpp源码文件
修改subscribe.cpp 源码文件
修改的配置文件
修改third_pkg的launch文件,增加启动subscribe_pkg_node
当编译工作空间完成后,通过执行third_pkg.launch文件查看运行后的效果
执行命令:roslaunch third_pkg third_pkg.launch
接下来通过rqt_graph来查看当前ROS系统中运行的节点及其直接话题通信概览图,直接在终端中输入rqt_graph
即可启动该工具
rostopic
命令工具使用
-
rostopic echo
可以显示在某个话题上发布的数据rostopic echo
是在终端命令行中显示节点的log信息,在ROS中还有一个可视化界面rqt_console也可以显示各节点的log信息,直接在终端中输入rqt_console即可启动该软件: -
rostopic hz
命令可以用来查看话题数据发布的频率 -
rostopic info
命令可以查看当前话题的消息类型及订阅和发布者信息 -
rostopic list
能够列出所有当前订阅和发布的话题 -
rostopic pub可以把数据发布到当前某个正在广播的话题上,该命令用法如下:
rostopic pub [topic] [msg_type] [args]
如果要想周期性的往话题中发布消息可以添加-r
选项 -
使用rqt_plot工具使话题数据实时显示可视化
理解topic的发布和订阅机制
解析发布者publisher节点代码
解析订阅者subscriber节点代码
理解ROS的自定义消息msg
了解msg的基本概念
msg文件:是一个描述ROS中所使用消息类型的简单文本,它们会被用来生成不同语言的源代码。
msg文件存放在软件包的msg目录下,msg文件实际上就是每行声明一个数据类型和变量名。可以使用的数据类型如下:
int8, int16, int32, int64 (plus uint*)
float32, float64
string
time, duration
other msg files
variable-length array[] and fixed-length array[C]
rosmsg
命令行工具
-
rosmsg list
:列出当前ros系统中所有的消息格式,通过wc
可以统计共有多少条消息 -
rosmsg show
:显示出消息的定义格式
下图中,linear
和angular
都是复合域,其数据类型是geometry_msgs/Vector3
一个复合域是由简单的一个或多个子域组合而 成,其中的每一个子域可能是另一个复合域或者独立的域,而且它们也都由基本数据类型组成
通过示例来理解如何创建和使用msg
现在我们来创建一个自定义的消息来演示整个过程如何操作:
首先来创建目录来存放我们将要创建的msg文件
接下来要确保msg文件被转换成为C++,Python和其他语言的源代码,要修改package.xml和CMakeLists.txt
在 CMakeLists.txt文件中,利用find_packag
函数,增加对message_generation
的依赖,这样就可以生成消息了。 你可以直接在COMPONENTS
的列表里增message_generation
然后就可以先将刚才添加的消息编译,然后查看ROS是否已经可以识别我们添加的自定义消息, 编译过程跟编译软件包相同,仍然是catkin_make
编译整个工作空间,当编译成功后开始利用学到的rosmsg
list查看有没有我们的消息
编译完成后记得执行source devel/setup.bash
,使环境变量生效