ROS2学习之旅(5)——理解ROS2 Graph中的话题(Topic)
ROS2将复杂系统分解为许多模块化的节点,话题(topics)是ROS Graph中的一个重要元素,它充当节点传递消息的总线。
![](https://img2020.cnblogs.com/blog/2418199/202107/2418199-20210713213327372-502332365.gif)
节点可以发布任意数量的话题,并可以同时订阅任意数量的话题。话题是数据在节点之间(在系统的不同部分之间)移动的重要方式之一。
![](https://img2020.cnblogs.com/blog/2418199/202107/2418199-20210713213325634-1482670427.gif)
1.启动节点
打开终端并运行:
ros2 run turtlesim turtlesim_node
打开另一个终端并运行:
ros2 run turtlesim turtle_teleop_key
此时,启动了两个节点turtlesim_node
和turtle_teleop_key
。
2.rqt_graph
通过rqt_graph
可以将节点和话题以及他们之间的连接可视化,安装rqt所有插件时,即安装了rqt_graph
。rqt的安装可以参考:rqt安装
要运行rqt_graph
,打开终端输入并运行:
rqt_graph
同样的,也可以打开rqt
,选择Plugins > Introspection > Nodes Graph进行添加。
![](https://img2020.cnblogs.com/blog/2418199/202107/2418199-20210713213325029-1173282021.png)
此时,应该可以看到上面的节点和主题,以及围绕图形外围的两个动作(暂时忽略)。如果将鼠标悬停在主题中心,会看到像上面的图片一样的颜色高亮显示。该图描述了/turtlesim
节点和/teleop_turtle
节点是如何通过一个主题相互通信的,/teleop_turtle
节点将数据(用于移动海龟的按键)发布到/turtle1/cmd_vel
话题,/turtlesim
节点订阅该话题以接收数据。
rqt_graph
的突出显示特性在检查通过许多不同方式连接的众多节点和话题时非常有用,是一个图形化的工具。
3.ros2 topic list
运行ros2 topic list
命令,可以得到系统中当前所活跃的所有话题:
/parameter_events
/rosout
/turtle1/cmd_vel
/turtle1/color_sensor
/turtle1/pose
ros2 topic list -t
将返回相同的话题列表,话题类型被添加在括号后面:
/parameter_events [rcl_interfaces/msg/ParameterEvent]
/rosout [rcl_interfaces/msg/Log]
/turtle1/cmd_vel [geometry_msgs/msg/Twist]
/turtle1/color_sensor [turtlesim/msg/Color]
/turtle1/pose [turtlesim/msg/Pose]
话题具有名称和类型两种属性。这些属性,特别是类型,是节点之间在传递数据时知道它们正在讨论相同信息的方式。如果想知道rqt_graph
中所有的话题,可以取消Hide下的所有复选框:
![](https://img2020.cnblogs.com/blog/2418199/202107/2418199-20210713213324771-1180873301.png)
4.ros2 topic echo
为了查看话题发送的数据,可以在终端运行:
ros2 topic echo <topiv_name>
如上所示,teleop_turtle
通过话题/turtle1/cmd_vel
向turtlesim
发送数据,可以通过echo
查看话题的具体数据:
ros2 topic echo /turtle1/cmd_vel
此时,不会返回任何数据,因为/teleop_turtle
此时还未发布数据。返回到运行turtle_teleop_key
的终端,并使用箭头移动海龟。 观察终端,会看到发布的每一个动作:
linear:
x: 2.0
y: 0.0
z: 0.0
angular:
x: 0.0
y: 0.0
z: 0.0
---
现在返回到rqt_graph
并取消Debug复选框。
![](https://img2020.cnblogs.com/blog/2418199/202107/2418199-20210713213324509-1006104027.png)
/_ros2cli_26646
是运行的echo
创建的节点(数字会改变),可以看到发布者正在通过cmd_vel
话题发布数据,并且有两个订阅者。
5. ros2 topic info
话题不只是一对一的交流,它可以是一对多、多对一或多对多。可以通过info
查看话题的属性信息,在终端运行:
ros2 topic info /turtle1/cmd_vel
此时会返回:
Type: geometry_msgs/msg/Twist
Publisher count: 1
Subscription count: 2
6.ros2 interface show
节点使用消息(messages)通过话题发送数据。发布者和订阅者必须发送和接收相同类型的消息进行通信。运行ros2 topic list -t
之后可以看到每个话题发布的消息类型,或者通过info
也可以获得某一消息的类型,回想一下cmd_vel
主题的类型:
geometry_msgs/msg/Twist
这表示在geometry_msgs
包里,有一个msg
叫做Twist
。
可以通过运行ros2 interface show <type>.msg
查看消息的细节,特别是消息的数据结构。
ros2 interface show geometry_msgs/msg/Twist
此时,终端返回:
# This expresses velocity in free space broken into its linear and angular parts.
Vector3 linear
Vector3 angular
根据终端返回的信息,可以得到/turtlesim
节点所期望的消息包含两个向量(线性向量和角向量),每个向量有三个元素,这与/teleop_turtle
通过echo
命令传递给/turtlesim
的数据结构是相同的:
linear:
x: 2.0
y: 0.0
z: 0.0
angular:
x: 0.0
y: 0.0
z: 0.0
---
7.ros2 topic pub
在已知消息结构之后,可以直接从命令行发布数据到话题,使用如下命令:
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}}"
--once
是一个可选参数,意思是“发布一条消息然后退出”。
将在终端中收到以下消息:
publisher: beginning loop
publishing #1: geometry_msgs.msg.Twist(linear=geometry_msgs.msg.Vector3(x=2.0, y=0.0, z=0.0), angular=geometry_msgs.msg.Vector3(x=0.0, y=0.0, z=1.8))
turtlesim
此时显示为:
![](https://img2020.cnblogs.com/blog/2418199/202107/2418199-20210713213324264-1399705347.png)
小海龟(通常是要模拟的真正的机器人)需要一个稳定的命令流来进行连续操作。所以,为了让小海龟继续移动,可以在终端运行:
ros2 topic pub --rate 1 /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}}"
这里与上面的区别是删除了--once
选项和增加了--rate 1
选项,这告诉ros2 topic pub
以1 Hz的频率稳定发布命令。
![](https://img2020.cnblogs.com/blog/2418199/202107/2418199-20210713213324059-201099615.png)
刷新rqt_graph
以图形化方式查看发生了什么,可以看到ros 2 topic pub ...
节点 (/_ros2cli_30358
)在/turtle1/cmd_vel
话题上发布,并且被两个ros2话题ros2 topic echo ...
节点(/_ros2cli_266461
)和/turtlesim
节点订阅。
![](https://img2020.cnblogs.com/blog/2418199/202107/2418199-20210713213323836-670855115.png)
最后,可以在pose
话题上运行echo
并重新查看rqt_graph
:
ros2 topic echo /turtle1/pose
![](https://img2020.cnblogs.com/blog/2418199/202107/2418199-20210713213323547-1888015063.png)
在本例中,/turtlesim
现在发布到pose
话题,并由一个新的echo
节点订阅。
8.ros2 topic hz
可以使用以下方法报告数据发布的速率:
ros2 topic hz /turtle1/pose
它将返回关于/turtlesim
节点向pose
话题发布数据的速率。
average rate: 59.354
min: 0.005s max: 0.027s std dev: 0.00284s window: 58
9.清理节点
不要忘记在每个终端中输入Ctrl+C
来停止节点运行。
10.总结
节点通过话题发布信息,允许任何数量的其他节点订阅和访问该信息。可以使用rqt_graph
和命令行工具检查话题上节点之间的连接。
如果给您带来帮助,希望能给点个关注,以后还会陆续更新有关机器人的内容,点个关注不迷路~欢迎大家一起交流学习。
都看到这了,点个推荐再走吧~
未经允许,禁止转载。