ROS2学习笔记4--认识ros2话题topic
Posted 鸿_H
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ROS2学习笔记4--认识ros2话题topic相关的知识,希望对你有一定的参考价值。
概要:这篇主要认识ros2话题topic
环境:ubuntu20.04,ros2-foxy,vscode
2.1.4认识ros2话题topic(原文:https://docs.ros.org/en/foxy/Tutorials/Topics/Understanding-ROS2-Topics.html
)
>>
教程>>
认识ros2话题topic
你正阅读的是ros2较老版本(Foxy),但仍然支持的说明文档.想查看最新版本的信息,请看galactic版本链接( https://docs.ros.org/en/galactic/Tutorials.html
)
认识ros2话题topic
目标:使用rqt_graph和指令工具去认识ros2话题
课程等级:初级
时长:20min
目录:
1.背景
2.预备知识
3.步骤
3.1配置
3.2 rqt_graph
3.3 ros2 topic list
3.4 ros2 topic echo
3.5 ros2 topic info
3.6 ros2 interface show
3.7 ros2 topic pub
3.8 ros2 topic hz
3.9 Clean up
4.总结
5.下一步
1.背景
ros2将复杂系统划分成许多模块化节点.话题是ros网络中一个至关重要的元素,扮演着节点间信息交互班车角色.
一个节点发布消息到多个话题,同时每个话题可有许多订阅者.
(话题通讯方式,一对一,一对多,多对一,多对多)
话题是两个节点之间的数据沟通的一种重要方式,也可为系统的不同组成部分之间(数据沟通).
2.预备知识
前面课程提供了一些关于这里要构建节点的有用背景信息.
老规矩,别忘记在新打开终端source
一下配置文件(环境变量)(个人看法,如果ros2的环境变量写到启动脚本.bashrc里面,没必要再source一次了).
3.步骤
3.1配置
现在,你应该可以轻松开启小乌龟仿真
新开一个终端,运行如下指令:
ros2 run turtlesim turtlesim_node
新开另一个终端,运行:
ros2 run turtlesim turtle_teleop_key
回顾前面课程,这些节点默认名字为/turtlesim
和/teleop_turtle
3.2 rqt_graph
本课程全过程使用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是图形化审查工具.现在我们看看使用指令工具来审查话题.
3.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
哪里,你可以不选择任何的隐藏框框:
现在,然而,清除(上面的)操作以避免看着产生疑惑.
3.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
的终端,键入字母移动小乌龟,再看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
话题发布数据,有两个订阅器正在订阅.
3.5 ros2 topic info
话题并不仅仅一对一通信,也可以一对多,多对一,多对多通信
另一种方式查看话题是:
ros2 topic info /turtle1/cmd_vel
会返回:
Type: geometry_msgs/msg/Twist
Publisher count: 1
Subscription count: 2
3.6 ros2 interface show
节点通过消息话题发数据.发布器和订阅器发送和接收的消息类型相同才能通信.
输入ros2 topic list -t
指令可让我们方便查看话题类型,让我们知道每个话题传送的消息类型.回归cmd_vel
话题,其是这么个类型:
geometry_msgs/msg/Twist
这意味着其类型为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
这就告诉你节点/turtlesim
的消息有两个vector
,linear
和angular
,每个vector
含有三个元素.如果回顾前面节点/teleop_turtle
到节点/turtlesim
的通信话题使用echo
查看消息类型,有着相同的结构:
linear:
x: 2.0
y: 0.0
z: 0.0
angular:
x: 0.0
y: 0.0
z: 0.0
---
3.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))
并且你会看到小乌龟这么运动:
小乌龟(通常真实机器人效仿它的)要求有稳定的指令来持续运动.所以,为了让小乌龟一直运动,你可输入:
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}}"
这里不同点在于,使用-rate 1
参数代替了--once
参数,前者是表示ros2 topic pub
发布指令频率为1hz
你可以更新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
节点正在订阅该话题
3.8 ros2 topic hz
这个过程的最后一个思考,你可使用如下指令获取发布数据的速度:
ros2 topic hz /turtle1/pose
其会返回节点/turtlesim
发送数据到话题pose
的速度:
average rate: 59.354
min: 0.005s max: 0.027s std dev: 0.00284s window: 58
回归之前,你使用ros2 topic pub --rate 1
指令来设置turtle1/cmd_vel
节点发布数据数度为1hz
.如果你运行上面指令使用turtle1/cmd_vel
代替turtle1/pose
,你将会看到均匀反映速度(现象).
3.9 Clean up
到这个点,你一定有很多的节点正在运行,别忘了,在每个终端使用ctrl+c
结束这些节点的运行.
4.总结
节点通过话题发布消息,其他节点可以通过订阅(话题)来获取消息.在本课程中,通过rqt_graph
以及命令行工具,你学习了多个节点通过话题连接起来.现在,你应该对于ros2
系统数据传输有了很好认识.
5.下一步
下面,在认识ros2
服务 课程中,你会学习ros
图的另外一种通信类型.
其他
topic 话题是节点node信息交流的一种载体,topic交流可采用方式是一对一,一堆多,多对一.
个人认为关键点:
ros2 topic list#查看话题
ros2 topic list -t#查看带有类型属性后缀的话题
ros2 topic echo <topic_name>#输出话题的内容
ros2 topic info <topic_name>##输出话题本身信息
ros2 interface show <type> #输出类型的信息结构
ros2 topic pub <topic_name> <msg_type> '<args>'#给话题直接发布消息
ros2 topic hz <topic_name>#查看消息发布的速度
碰到问题,小乌龟turtlesim
安装异常(键盘控制只能原点旋转,并不能直线移动),导致,里面的信息通信的ros网络图是复现失败的.
这课程是在等毕业证那十几天搞的,室友问,现在在线翻译这么强大,为啥还在这里瞎折腾呢?我说,我的目地是好好认真看一下,了解一下,自己折腾,目前是我想到最好的办法来获得最佳效果,即使这翻译有点别扭,哈哈哈.
#####################
不积硅步,无以至千里
好记性不如烂笔头
感觉有点收获的话,麻烦大大们点赞收藏哈
以上是关于ROS2学习笔记4--认识ros2话题topic的主要内容,如果未能解决你的问题,请参考以下文章