赞
踩
一个节点可以通过多个话题向外发布数据,也可以同时订阅多个其他节点发布的话题,相当于话题是一个多对多的订阅/发布模型。
可见,话题是节点之间实现数据传输的重要途径,也是机器人各个子系统之间交换数据的重要方式。
打开新终端并运行:
ros2 run turtlesim turtlesim_node
打开另一个终端并运行:
ros2 run turtlesim turtle_teleop_key
rqt_graph
这个工具,可以从上帝视角看到整个系统的状态。使用rqt_graph
来可视化显示节点和话题的连接关系, 在一个新的终端中,输入:
rqt_graph
可以看到一个新的界面,里边清晰的展示了ROS计算图的网络形态。
根据上图可以看到相关的节点和话题,先忽略图中的action。如果将鼠标悬停在最下面的topic上,您将看到如上图所示的颜色高亮显示。话题/turtle1/cmd_vel
的发布者是/teleop_turtle
节点,而订阅者是/turtlesim
节点,这个话题中传输的数据就是我们按下键盘之后形成的速度指令。在更加复杂的机器人系统中,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
中的位置,可以取消选中“Hide”
下的所有框:
如果想查看节点之间的话题到底发了什么数据内容,可以使用如下命令:
ros2 topic echo <topic_name>
既然我们知道节点/teleop_turtle
通过话题/turtle1/cmd_vel
向节点/turtlesim
发布数据,那么让我们使用echo
对该topic进行查看:
ros2 topic echo /turtle1/cmd_vel
一开始,这个命令不会返回任何数据。那是因为它在等待节点/teleop_turtle
发布一些东西。返回运行turtle_teleop_key
的终端,使用箭头移动turtle。观察echo
运行的终端,你会看到为你的每一个动作发布的位置数据:
linear:
x: 2.0
y: 0.0
z: 0.0
angular:
x: 0.0
y: 0.0
z: 0.0
---
原来键盘控制节点将点击的键盘按键变成了线速度和角速度,通过话题发送给海龟仿真器,海龟才动起来的。
话题不必只是点对点的通信;它可以是一对多,多对一,或多对多。类似查看节点的详细信息一样,我们也可以用如下命令查看话题的详细信息:
ros2 topic info /turtle1/cmd_vel
可以在终端中看到该话题的详细信息:
Type: geometry_msgs/msg/Twist
Publisher count: 1
Subscription count: 1
节点之间要想成功建立数据传输,必须发布和订阅同样数据类型的消息,发布者发布的是速度指令,订阅者想订阅位置信息可是行不通的。我们在运行ros2 topic list -t
之后看到的话题类型让我们知道每个话题可以发送什么类型的消息。回想一下,cmd_vel
话题的类型是:
geometry_msgs/msg/Twist
熟悉ROS1的应该并不陌生,这就是在ROS中常用的标准速度指令,以上内容表示在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
Vector3 angular
因此,Twist
中包含了两个三维向量,分别表示线速度和角速度。
现在您已经知道了消息的具体结构,可以使用以下命令直接从命令行将数据发布到话题上:
ros2 topic pub <topic_name> <msg_type> '<args>'
'<args>'
参数是您将传递给话题的实际数据,需要使用YAML的语法来描述。比如要发布速度指令Twist
,可以按如下方式输入完整命令:
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
选项并添加了--rate 1
选项,它告诉ros2 topic pub
以1 Hz的频率发布命令。
如果我们想查看某一个话题的发布频率,可以通过命令行来实现:
ros2 topic hz /turtle1/pose
在终端中可以看到/turtlesim
节点发布/turtle1/pose
话题的频率:
average rate: 59.354
min: 0.005s max: 0.027s std dev: 0.00284s window: 58
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。