ROS2 基础概念 话题
- 1. Topics
- 2. rqt_graph
- 3. 话题
- 4. 话题类型
- 5. 话题发布
- 6. 话题频率
1. Topics
话题是节点交换消息的总线
节点可以向任意数量的话题发布数据,并同时订阅任意数量的话题
2. rqt_graph
将使用rqt_graph
来可视化不断变化的节点和话题,以及它们之间的连接
/teolep_turtle
节点正在向/turtle1/cmd_vel
话题发布数据
/my_turtle
和 /turtlesim
节点订阅该话题以接收数据
为了后续描述的简便,/my_turtle
节点到此就退出了
3. 话题
在新终端中运行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]
由于知道/teolep_turtle
通过/turtle1/cmd_vel
话题向/turtlesim
发布数据
因此使用echo
来查看该话题:
$ ros2 topic echo /turtle1/cmd_vel
一开始没查询到话题,这是因为节点turtle_teleop_key
没有发布该话题的数据
只要切换节点turtle_teleop_key
的终端,使用键盘控制,乌龟会执行控制指令
也可以看到我们发布的话题数据
4. 话题类型
发布者和订阅者必须发送和接收相同类型的消息才能进行通信
cmd_vel
话题的类型为 geometry_msgs/msg/Twist
那么可以查看该话题类型
ros2 interface show geometry_msgs/msg/Twist
# This expresses velocity in free space broken into its linear and angular parts.
# 这表示自由空间中的速度,分为线性部分和角度部分。
Vector3 linear
float64 x
float64 y
float64 z
Vector3 angular
float64 x
float64 y
float64 z
5. 话题发布
现在已经有了消息结构,可以使用以下命令行直接将数据发布到话题上:
ros2 topic pub <话题名称> <消息类型> '<数据>'
例如:
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是可选参数,表示“发布一条消息然后退出”
如果要持续发布的话,需要删除--once
选项,添加了--rate 1
选项
话题将以1Hz的频率流发布话题数据
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}}"
海龟就一直转圈圈
6. 话题频率
上面提及到我们以1Hz的频率流发布话题/turtle1/cmd_vel
数据geometry_msgs/msg/Twist
那么可以通过查看 ros2 topic hz
如查看海龟姿态话题的频率:
ros2 topic hz /turtle1/pose
这里可以看到是60Hz左右,所以这个1s过程姿态的更新依靠的是最开始的运动指令
谢谢