ROS2学习笔记(三)从turtlesim学习ROS2主题

从turtlesim学习ROS2主题

前言

学习ROS2的路,并不能通过学习ROS1代替,因为ROS2的“内核”不同于ROS1,必须认认真真从头开始重新学习。

Ubuntu版本:20.04

ROS版本:Foxy

学习笔记回顾

1.ROS2话题

ROS2将整个系统分解为许多模块化节点。节点之间通讯的至关重要的通道就是Topic话题。
在这里插入图片描述

一个节点可以发布和订阅多个主题,相当于是多对多的订阅/发布模型。
在这里插入图片描述

话题是机器人各个子系统之间交换数据的重要途径。

2.启动小海龟模拟器和控制器

$ ros2 run turtlesim turtlesim_node
$ ros2 run turtlesim turtle_teleop_key

根据上一节的教程,想必大家已经很熟悉他们的节点了,分别为/turtlesim/teleop_turtle

3.rqt_graph功能软件

rqt_graph该软件可以对不断变化的节点和主题可视化显示,也可显示他们之间的关系。在ROS1中,该软件也是非常有用处。在一个新的终端中启动它:

$ rqt_graph

启动后的界面如下所示,学习过ROS1的同学一定是非常熟悉的,里面清晰的展示了ROS计算图的网络形态:
在这里插入图片描述

将鼠标移到中心的主题上,可以看到所示的颜色会高亮显示,清晰的展示了各个话题和节点之间的关系。话题、turtle1/cmd_vel的发布者是/teleop_turtle节点,订阅者是/turtlesim节点,这个话题中传输的数据就是键盘控制小海龟的速度值。

在未来的机器人开发中,该工具可以帮助我们更加直观的分析节点和话题之间的关系。

4.ros2 topic list

该命令可以将系统中正在运行的话题以列表的方式展示出来,打开新的终端,并且输入以下命令:

$ ros2 topic list
----
/parameter_events
/rosout
/turtle1/cmd_vel
/turtle1/color_sensor
/turtle1/pose

使用ros2 topic list -t命令可以显示相同的主题列表,并且在后面的括号中详细的反应主题的数据类型。

$ 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]

5.ros2 topic echo

使用该命令可以展示该话题所发布的数据:

$ ros2 topic echo <topic_name>

是什么数据能让小海龟听话的动起来,使用以下命令查看:

$ ros2 topic echo /turtle1/cmd_vel

起初,这个话题不会发布任何数据,因为我们并没有去控制它,当我们在控制器终端中按下控制按键,就能显示数据了:

//左转命令
linear:
  x: 0.0
  y: 0.0
  z: 0.0
angular:
  x: 0.0
  y: 0.0
  z: 2.0
---
//前进命令
linear:
  x: 2.0
  y: 0.0
  z: 0.0
angular:
  x: 0.0
  y: 0.0
  z: 0.0
---

从返回的数据中可知,键盘控制节点将速度转换成了线速度和角速度,通过话题发送给海龟模拟器,海龟才能动起来。

6.ros2 topic info

该命令相当于ROS1中的rostopic info,类似查看节点的详细信息一样,我们也可以用以下命令查看话题的详细信息:

$ ros2 topic info /turtle1/cmd_vel
----
Type: geometry_msgs/msg/Twist
Publisher count: 1
Subscription count: 1

7.ros2 interface show

当我们想编写发布和订阅的主题,知道了要发布的数据类型,但是如何查看数据的结构呢,跟着笔者一步一步操作查看:

$ ros2 topic list -t

可以看到,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
Vector3  angular

可见,Twist中包含了两个三维向量,分别为线速度和角速度。

8.ros2 topic pub

我们已经知道如何查看topic和数据结构了,那我们如何通过命令来发布一个话题。

$ ros2 topic pub <topic_name> <msg_type> '<args>'

这里的'<args>'参数就是具体要发布的数据,使用如下命令控制小海龟行走。--once参数代表的意思是只执行一遍就退出。

$ 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}}"
----
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))

可以看到小海龟动起来了。

在这里插入图片描述

如果希望小海龟按一定的频率一直行走,需要在命令中加入频率参数–rate,单位是Hz:

$ 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}}"

在这里插入图片描述

9.ros2 topic hz

可以通过该命令查看某一个话题的发布频率:

$ ros2 topic hz /turtle1/pose
----
average rate: 62.477
	min: 0.015s max: 0.016s std dev: 0.00039s window: 64
average rate: 62.496
	min: 0.015s max: 0.016s std dev: 0.00039s window: 127

总结

话题是机器人各个子系统之间交换数据的重要途径

Reference:

https://docs.ros.org/en/foxy/Tutorials/Topics/Understanding-ROS2-Topics.html

结语

本文也是基于笔者的学习和使用经验总结的,主观性较强,如果有哪些不对的地方或者不明白的地方,欢迎评论区留言交流~

为了能和读者进一步讨论问题,建立了一个微信群,方便给大家解答问题,也可以一起讨论问题。
加群链接

おすすめ

転載: blog.csdn.net/xiaokai1999/article/details/118858065