目标:使用rqt_graph和命令行工具来探究 ROS2 topics。
1、背景
ROS2将复杂的系统分解为许多模块化nodes。Topics是ROS graph 的重要组成部分,充当nodes交换消息的总线。
Topic-SinglePublisherandSingleSubscriber
一个节点可以将数据发布到任意数量的主题,同时订阅任意数量的主题。
Topic-MultiplePublisherandMultipleSubscriber
主题是数据在节点之间移动的主要方式之一,因此也是在系统的不同部分之间移动的主要方式之一。
2、 探究ROS2中Topics
2.1 设置
启动 turtlesim,打开一个新终端并运行:
ros2 run turtlesim turtlesim_node
打开另一个新终端并运行:
ros2 run turtlesim turtle_teleop_key
默认情况下,这些节点的名称是 /turtlesim 和 /teleop_turtle。
2.2 rqt_graph
使用rqt_graph来可视化不断变化的节点和主题,以及它们之间的联系。
在开始学习使用 turtlesim, ros2, and rqt 了解了rqt_graph和rqt的相关使用。
要运行rqt_graph,打开一个新终端并输入以下命令:
rqt_graph
还可以通过打开 rqt 并选择Plugins > Introspection > Node Graph
.
看到上述节点和主题,以及围绕图形外围的两个操作,该图描述了 /turtlesim nodes和 /teleop_turtle nodes如何通过主题相互通信。/teleop_turtle 节点将数据(输入的用于移动 turtle 的击键)发布到 /turtle1/cmd_vel Topics,/turtlesim 节点订阅该主题以接收数据。
在检查具有许多节点和主题以多种不同方式连接的更复杂的系统时,rqt_graph 的突出显示功能非常有用。
rqt_graph是一个图形辅助工具。现在,我们将研究一些用于辅助Topics的命令行工具。
2.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的位置,可以取消选中隐藏下的所有框:
2.4 ros2 topic echo
要查看有关某个主题的数据,请使用:
ros2 topic echo <topic_name>
既然知道 /teleop_turtle 通过 /turtle1/cmd_vel 主题将数据发布到 /turtlesim,使用echo来自检该主题:
ros2 topic echo /turtle1/cmd_vel
开始,此命令不会返回任何数据。那是因为它正在等待 /teleop_turtle 发布某些内容。 返回正在运行turtle_teleop_key的终端,并使用箭头移动。观察同时运行回声的终端,将看到您所做的每个动作的位置数据正在发布:
现在返回到rqt_graph并取消选中“Debug”框。
/_ros2cli_10753 是刚刚运行的 echo 命令创建的节点(数字可能不同)。现在,可以看到发布者正在通过cmd_vel主题发布数据,并且订阅了两个订阅者。
2.5 ros2 topic info
主题不必只是一对一的交流;它们可以是一对多、多对一或多对多。
另一种看待这种情况的方法是运行:
ros2 topic info /turtle1/cmd_vel
这将返回:
Type: geometry_msgs/msg/Twist
Publisher count: 1
Subscription count: 2
2.6 ROS2接口展示
节点使用消息通过主题发送数据。发布者和订阅者必须发送和接收相同类型的消息才能进行通信。
之前在运行 ros2 topic list -t
后看到的主题类型让我们知道每个主题使用的消息类型。回想一下,cmd_vel主题具有以下类型:
/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]
这意味着在包geometry_msgs中有一个名为 Twist 的msg。
现在我们可以在这个类型上运行 ros2 界面显示来了解它的细节。具体来说,消息所需的数据结构。
# 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
这告诉您 /turtlesim 节点需要一条消息,其中包含两个向量,linear and angular,每个向量三个元素。这与 /teleop_turtle 使用 echo 命令传递给 /turtlesim 的数据,它的结构相同:
linear:
x: 2.0
y: 0.0
z: 0.0
angular:
x: 0.0
y: 0.0
z: 0.0
---
2.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))
\(通常是它要模拟的真实机器人)需要稳定的命令流才能连续运行。所以,要让继续移动,可以run命令:
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 的稳定流发布命令。
您可以刷新rqt_graph以图形方式查看正在发生的事情。你会看到 ros2 主题酒吧...节点 (/_ros2cli_11560) 正在 /turtle1/cmd_vel 主题上发布,该主题被 ros2 主题 echo 接收......节点 (/_ros2cli_11401) 和 /turtlesim 节点。
最后,您可以在pose topic 上运行 echo 并重新检查rqt_graph:
可以看到 /turtlesim 节点也正在发布到新的 echo 节点订阅的pose topic。
2.8 ros2 topic hz
对于此过程的最后一次反省,您可以使用以下方法查看数据的发布速率:
ros2 topic hz /turtle1/pose
average rate: 62.507
min: 0.015s max: 0.017s std dev: 0.00051s window: 64
average rate: 62.517
回想一下,将 turtle1/cmd_vel 的速率设置为 1 Hz 的稳定发布,使用 ros2 主题 pub --rate 1。如果使用 turtle1/cmd_vel 而不是 turtle1/pose 运行上述命令,您将看到反映该速率的平均值
3 总结
节点通过主题发布信息,这允许任意数量的其他节点订阅和访问该信息。使用rqt_graph和命令行工具检查了主题上的多个节点之间的连接。现在应该对数据如何在 ROS2系统中移动有一个很好的了解。