什么是ROS2 topics
上一篇笔记学习了节点,ROS2正是帮我们可以把一个复杂的系统分解成很多个模块化的节点。
topics(话题)是ROS的重要元素,它的作用就充当这些模块化的节点之间交换信息的总线。
节点通过发布和订阅的方式进行话题消息通信。话题不是只有点对点的通信方式。一个节点可以发布向任意数量的话题发布数据,同时也可以订阅任意数量的话题。从而实现一对多、多对一、多对多的通信方式。
话题里是什么样?
先来再次跑起海龟模拟器(turtlesim)和海龟操控键盘(turtle_teleop_key)。
查看话题列表
新开一个终端输入ros2 topic list
可以查看系统中当前存在的话题列表。
终端返回:
/parameter_events
/rosout
/turtle1/cmd_vel
/turtle1/color_sensor
/turtle1/pose
目前存在5个话题,从前一篇学习笔记中知道/turtlesim
和/teleop_turtle
节点都有*/turtle1/cmd_vel
*这个话题。从名称cmd_vel可以猜测:是command velocity (速度命令)的缩写,/teleop_turtle
节点通过这个话题发布速度,订阅者/turtlesim
节点收到后移动海龟。
话题回显
可以用ros2 topic echo <topic_name>
这个命令来回显话题中的数据。
来看一下/turtle1/cmd_vel
这个话题的数据:
ros2 topic echo /turtle1/cmd_vel
运行后没有看到任何东西,这时候在运行turtle_teleop_key的终端操作方向键,就立看到回显的话题数据了
所以正是通过/turtle1/cmd_vel
这个话题来使海龟移动。
查看话题信息
前面的操作已经知道了话题列表里话题的名称,现在可以用ros2 topic info <topic_name>
命令来看话题的更多信息。
查看一下/turtle1/cmd_vel
这个话题
ros2 topic info /turtle1/cmd_vel
终端返回:
可以看到这个话题的类型是geometry_msgs/msg/Twist
,发布者的数量1个,订阅者的数量1个。可以尝试多开几个海龟窗口,看看话题信息的变化。
ros2 interface show
我们已经了解到,节点使用消息通过话题发送数据。
发布者和订阅者必须传输相同类型的消息才能进行通信。
通过topic info
命令,我们知道了/turtle1/cmd_vel
的类型是geometry_msgs/msg/Twist
。(使用ros2 topic list -t
这个命令可以同时查看话题列表和每个话题的类型)。
geometry_msgs/msg/Twist
表示在geometry_msgs
包中有一个msg
叫做Twist
。
通过**ros2 interface show <msg type>
**这个命令可以查看消息类型的更多细节,特别是消息的数据结构。
查看一下geometry_msgs/msg/Twist
:
可以了解到这个消息类型中包含两个三维向量,分别是线速度和角速度。
其它补充
使用命令将数据发布到话题。可以使用ros2 topic pub <topic_name> <msg_type> '<args>'
这个命令直接在命令行测试消息发布到话题。
需要注意的是 '<args>'
参数需要以 YAML 语法输入,比如用以下命令发布一次消息:
ros2 topic pub --once /turtle1/cmd_vel geometry_msgs/msg/Twist "{linear: {x: 2.0, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: 1.8}}"
使用命令查看话题中数据发布的频率。可以使用ros2 topic hz <topic_name>
。
ROS2话题的学习就先到这了。
参考:
- ROS 2 Documentation:https://docs.ros.org/en/galactic/index.html