ROS2教程(入门级):记录和回播数据
目标: 记录从话题发布出来的数据,以便我们可以随时回放和检查它。
背景知识
ros2 bag是一个用来记录你的系统中的话题所发布的数据的命令行工具。它可以收集任意多个话题所发布的数据,并且将数据保存在一个数据库中。你随后可以回播这些数据来复线你的测试结果以及实验结果。记录话题也是分享你的工作的重要方式,它允许其它人复现这个工作。
前提条件
备注
对于ROS 2 Foxy的用户来说,如果需要一个性能更强的rosbag2,可以查看foxy-future branch of rosbag2。这是一个官方支持的分支,它的性能接近Galactic的版本,它已经提升了性能,同时新增了功能。但是,在Foxy中不提供API的支持。对于那些刚刚接触这个教程的Foxy用户,你可以忽略这个,用默认安装的版本继续往下看就可以了。
你应该是已经安装好了ros2 bag,它是ROS2常规设置下的一部分。
如何你是通过Debians安装到你的linux上,而你的系统有没有找到后续的指令,可以通过下面的指令安装ros2 bag。
这个教程建立在一些概念上,比如说,节点、话题以及服务。这个教程会使用到turtlesim package,并且不要忘记在启动的每个新的终端上source ROS 2。如何你对上面的内容还没看过的,可以戳一下,过去了解一下。
sudo apt-get install ros-foxy-ros2bag \
ros-foxy-rosbag2-converter-default-plugins \
ros-foxy-rosbag2-storage-default-plugins
任务
1. 实验设置
你将会记录你输入到turtlesim系统的键盘数据,并在后面回播出来,所以,首先启动/turtlesim和/teleop_turtle节点。
打开一个新的终端并且运行:
ros2 run turtlesim turtlesim_node
打开另外一个终端,并且运行:
ros2 run turtlesim turtle_teleop_key
让我们新建一个文件夹来存储我们的记录,进行如下的操作:
mkdir bag_files
cd bag_files
2. 选择一个话题
ros2 bag 只能记录话题中正在发布的数据。为了看到系统中的话题,我们可以打开一个新的终端,并且运行下面的命令:
ros2 topic list
会看到下面的返回值:
/parameter_events
/rosout
/turtle1/cmd_vel
/turtle1/color_sensor
/turtle1/pose
在话题的那个教程中,你已经知道了,/turtle_teleop这个节点通过/turtle/cmd_vel这个话题发布指令,从而让小海龟在turtlesim中移动。
为了查看/turtle/cmd_vel正在发布的数据,可以运行下面的命令:
ros2 topic echo /turtle1/cmd_vel
一开始的时候,没有东西会打印出来,因为此时没有数据从teleop中发布出来。返回到你运行teleop的终端,并且选中它,然后使用尖头按键控制小海龟运动,这时,你就可以看到发布的数据会出现在你运行ros2 topic echo的终端上了。
linear:
x: 2.0
y: 0.0
z: 0.0
angular:
x: 0.0
y: 0.0
z: 0.0
---
3. ros2 bag record
为了记录下话题或发出的数据,需要使用下面的命令语法:
ros2 bag record <topic_name>
在你运行这个记录数据的命令之前,打开一个新的终端,并且进入你上面创建的准备用来保存bag文件的文件夹,因为rosbag会保存在你运行这个命令所在的路径下。
运行下面的命令:
ros2 bag record /turtle1/cmd_vel
你将会在终端上看到类似下面的输出,但是数据和时间是不一样的:
[INFO] [rosbag2_storage]: Opened database 'rosbag2_2019_10_11-05_18_45'.
[INFO] [rosbag2_transport]: Listening for topics...
[INFO] [rosbag2_transport]: Subscribed to topic '/turtle1/cmd_vel'
[INFO] [rosbag2_transport]: All requested topics are subscribed. Stopping discovery...
现在ros2 bag就开始记录从/turtle/cmd_vel中发布出来的数据了。返回到teleop到终端,并开始移动小海龟。小海龟的移动轨迹是什么样的不重要,重要的是,最好是能形成一种模式,这样在后面咱们回放rosbag中记录的数据的时候,你可以认出来,这个轨迹跟现在你所移动的轨迹是一样的。

按下Ctrl+c来停止记录。
数据会被记录在一个bag文件中,bag文件的命名规则是rosbag2_年_月_日_小时_分钟_秒。
3.1 Record multiple topics
你也可以记录多个话题,同时也可以改变rosbag文件的名字。
运行下面的命令:
ros2 bag record -o subset /turtle1/cmd_vel /turtle1/pose
使用-o这个选项,你可以给你的bag文件取一个独特的名字。后面这着的字符串就是它的名字,比如在上面的例子中,文件名是sunset。
希望一次性记录多个话题的话,只要简单的将每一个需要记录的话题的名称列举出来,使用空格键将他们分割开。
你将会看到下面的信息,确认两个话题都已经被记录了。
[INFO] [rosbag2_storage]: Opened database 'subset'.
[INFO] [rosbag2_transport]: Listening for topics...
[INFO] [rosbag2_transport]: Subscribed to topic '/turtle1/cmd_vel'
[INFO] [rosbag2_transport]: Subscribed to topic '/turtle1/pose'
[INFO] [rosbag2_transport]: All requested topics are subscribed. Stopping discovery...
你可以移动小海龟,然后当你结束的时候 ,按下Ctrl+c。
备注
还有一个选项,你可以在命令后面添加-a,加上之后,会记录你系统中全部话题发布的数据。
4. ros2 bag info
你可以通过下面的命令查看你记录的包的细节情况:
ros2 bag info <bag_file_name>
对sunset文件包使用这个命令,可以看到一系列返回数据:
ros2 bag info subset
Files: subset.db3
Bag size: 228.5 KiB
Storage id: sqlite3
Duration: 48.47s
Start: Oct 11 2019 06:09:09.12 (1570799349.12)
End Oct 11 2019 06:09:57.60 (1570799397.60)
Messages: 3013
Topic information: Topic: /turtle1/cmd_vel | Type: geometry_msgs/msg/Twist | Count: 9 | Serialization Format: cdr
Topic: /turtle1/pose | Type: turtlesim/msg/Pose | Count: 3004 | Serialization Format: cdr
为了看到个性化的数据,你必须的打开数据库,在这个例子中,使用的是sqlite3,来进行查看。这已经超出了ROS的范围。
5. ros2 bag play
在回放bag文件之前,在运行teleop的终端中输入Ctrl+c,以关闭它。然后,保证你的turtlesim窗口是可以看到的,这样可以让你看到bag文件中记录的动作。
输入下面的命令:
ros2 bag play subset
终端会然后下面的消息:
[INFO] [rosbag2_storage]: Opened database 'subset'.
你的海龟将会跟着当时记录的时候你输入的路径进行运动,但是也不是100%的一致,因为turtlesim对微笑的系统时间差异都很敏感。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9XwJn9fB-1625910829342)(https://docs.ros.org/en/foxy/_images/playback.png)]
因为subset文件记录的是/turtle/pose这个话题,不管你有没有移动小海龟,只要你让turtlesim运行着,ros2 bag都会持续进行记录。
这是因为只要/turtlesim这个节点还活跃着,它就会通过/tuttle/pose这个话题按照规律的间隔发送数据。也许你已经注意到上面通过ros2 bag info这个例子,结果里面显示,/turtle/cmd_vel这个话题的计数(count)这个信息只有9,这个数字显示的rosbag中记录下来的按下箭头按钮的次数。
还注意到,/turtle/pose也有一个计数的值,超过了3000次,这个是在记录的过程当中,从这个主题发布的数据超过了3000次。
为了看到位姿数据发布的频率,你可以运行下面的命令:
ros2 topic hz /turtle1/pose
总结
你可以通过ros2 bag系列命令来记录你的ROS2系统中通过话题发布的数据。不管你是需要将你的工作分享给其他人还是深入分析你的实验,这都是一个很好的工作。
下一步
前面的教程都已经是全部的命令行工具教程。后面将是讲述库文件的教程,会从创建一个工作空间开始。
你可以在接下来的教程里面,学习到更多关于ROS图的连接相关的内容。可以关注我或者订阅我的专栏:ROS 2专栏。
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐


所有评论(0)