目标:使用 rqt_graph 和命令行工具来反思 ROS 2 主题。
教程级别:初学者
时间: 20分钟
内容
背景
先决条件
任务
1 设置
2 rqt_graph
3 ros2主题列表
4 ros2主题回显
5 ros2 主题信息
6 ros2界面展示
7 ros2主题发布
8 ros2 主题赫兹
9 清理
概括
下一步
ROS 2 将复杂的系统分解为许多模块化节点。主题是 ROS 图的重要元素,充当节点交换消息的总线。
一个节点可以向任意数量的主题发布数据,同时订阅任意数量的主题。
主题是数据在节点之间移动的重要方式之一,因此在系统的不同部分之间移动。
上一教程提供了一些关于此处构建的节点的有用背景信息。
到目前为止,您应该可以轻松启动 turtlesim。
打开一个新的终端并运行:
ros2 run turtlesim turtlesim_node
打开另一个终端并运行:
ros2 run turtlesim turtle_teleop_key
回想一下之前的教程,这些节点的名称默认为/turtlesim
、/teleop_turtle
在整个教程中,我们将使用rqt_graph
可视化不断变化的节点和主题,以及它们之间的联系。
turtlesim教程告诉您如何安装 rqt 及其所有插件,包括rqt_graph
.
要运行 rqt_graph,请打开一个新终端并输入命令:
rqt_graph
您还可以通过打开 rqt 并选择Plugins > Introspection > Nodes Graph来打开 rqt_graph 。
您应该会看到上面的节点和主题,以及图形外围的两个操作(我们暂时忽略它们)。如果将鼠标悬停在中心的主题上,您会看到如上图所示的颜色突出显示。
该图描述了/turtlesim
节点和/teleop_turtle
节点如何通过主题相互通信。该/teleop_turtle
节点将数据(您输入的用于移动海龟的击键)发布到主题/turtle1/cmd_vel
,并且该/turtlesim
节点订阅该主题以接收数据。
rqt_graph 的突出显示功能在检查具有许多节点和以许多不同方式连接的主题的更复杂系统时非常有用。
rqt_graph 是一个图形自省工具。现在我们将了解一些用于自省主题的命令行工具。
在新终端中运行该命令将返回系统中当前活动的所有主题的列表: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 中的什么位置,您可以取消选中隐藏下的所有框:
不过现在,请选中这些选项以避免混淆。
要查看某个主题上发布的数据,请使用:
ros2 topic echo
由于我们知道将/teleop_turtle
数据发布到主题/turtlesim
之上/turtle1/cmd_vel
,让我们使用echo
该主题进行反思:
ros2 topic echo /turtle1/cmd_vel
起初,此命令不会返回任何数据。那是因为它正在等待/teleop_turtle
发布一些东西。
返回正在运行的终端turtle_teleop_key
并使用箭头移动乌龟。echo
同时观察你正在运行的终端,你会看到你所做的每一个动作都发布了位置数据:
linear: x: 2.0 y: 0.0 z: 0.0 angular: x: 0.0 y: 0.0 z: 0.0 ---
现在返回 rqt_graph 并取消选中Debug框。
/_ros2cli_26646
是我们刚刚运行的创建的节点echo
(数字会改变)。现在您可以看到发布者正在通过该cmd_vel
主题发布数据,并且订阅了两个订阅者。
话题不必只是点对点的交流;它可以是一对多、多对一或多对多。
另一种看待这个问题的方法是运行:
ros2 topic info /turtle1/cmd_vel
将返回:
Topic: /turtle1/cmd_vel Publisher count: 1 Subscription count: 2
节点使用消息通过主题发送数据。发布者和订阅者必须发送和接收相同类型的消息才能进行通信。
我们之前在运行后看到的主题类型让我们知道每个主题可以发送什么类型的消息。回想一下,该主题具有以下类型:ros2 topic list -t
cmd_vel
geometry_msgs/msg/Twist
这意味着在包中geometry_msgs
有一个msg
名为Twist
.
现在我们可以运行这个类型来了解它的细节,特别是消息期望的数据结构。
ros2 interface show
ros2 msg show geometry_msgs/msg/Twist
This expresses velocity in free space broken into its linear and angular parts. Vector3 linear Vector3 angular
这告诉您该/turtlesim
节点正在等待一条消息,其中包含两个向量linear
和angular
,每个向量包含三个元素。如果您还记得我们看到的通过命令/teleop_turtle
传递给的数据,它具有相同的结构:/turtlesim
echo
linear: x: 2.0 y: 0.0 z: 0.0 angular: x: 0.0 y: 0.0 z: 0.0 ---
现在您有了消息结构,您可以使用以下命令直接从命令行将数据发布到主题上:
ros2 topic pub' '
参数'
是您将传递给主题的实际数据,采用您刚刚在上一节中发现的结构。
请务必注意,此参数需要以 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))
你会看到你的乌龟像这样移动:
乌龟(通常是它要模拟的真实机器人)需要稳定的命令流才能连续运行。所以,为了让海龟继续移动,你可以运行:
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
和添加了选项,它告诉以 1 Hz 的稳定流发布命令
--rate 1
ros2 topic pub
您可以刷新 rqt_graph 以图形方式查看发生了什么。您将看到节点 ( ) 正在通过主题发布,并且现在正在被节点( ) 和节点接收。ros 2 topic pub ...
/_ros2cli_30358
/turtle1/cmd_vel
ros2 topic echo ...
/_ros2cli_26646
/turtlesim
echo
最后,您可以在主题上运行pose
并重新检查 rqt_graph:
ros2 topic echo /turtle1/pose
在这种情况下,/turtlesim
现在发布到pose
主题,并echo
订阅了一个新节点。
对于此过程的最后一次反省,您可以使用以下方法报告数据发布的速度:
ros2 topic hz /turtle1/pose
/turtlesim
它将返回有关节点向主题发布数据的速率的数据pose
。
average rate: 59.354 min: 0.005s max: 0.027s std dev: 0.00284s window: 58
回想一下,您使用 将发布的速率设置turtle1/cmd_vel
为稳定的 1 Hz 。如果您使用而不是运行上述命令,您将看到反映该速率的平均值。ros2 topic pub --rate 1
turtle1/cmd_vel
turtle1/pose
此时,您将有很多节点在运行。不要忘记进入Ctrl+C
每个终端来阻止他们。
节点通过主题发布信息,这允许任意数量的其他节点订阅和访问该信息。在本教程中,您使用 rqt_graph 和命令行工具检查了主题上多个节点之间的连接。您现在应该对数据如何在 ROS 2 系统中移动有了很好的了解。
接下来,您将通过教程了解 ROS 2 服务了解ROS 图中的另一种通信类型