1. Topics

话题是节点交换消息的总线
节点可以向任意数量的话题发布数据,并同时订阅任意数量的话题

指令 功能
ros2 topic bw /topic 显示话题所使用的带宽
ros2 topic hz /topic 显示话题的发布频率
ros2 topic pub /topic type args 将数据发布到话题中
ros2 topic delay /topic 显示话题的延时
ros2 topic type /topic 显示话题的消息类型
ros2 topic echo /topic 显示话题对应的消息内容
ros2 topic info /topic 显示当前话题的通信信息
ros2 topic find message_type 按照类型查找话题
ros2 topic list 列出当前活动的话题

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过程姿态的更新依靠的是最开始的运动指令


谢谢