ROS2入门教程—录制/回放数据
有的时候我们希望在别人已有的数据集上做开发,或者复现之前已经构建好的场景数据,这时候就可以用ROS2中的
ros2 bag
工具了。
ros2 bag
是一个命令行工具,可以实现对ROS2系统中话题数据的录制和回放,选定的数据会被打包放到一个数据库文件中,未来使用该工具即可按照时间轴回放所有话题数据。
在使用rosbag前,需要确认是否安装好了,因为通过桌面版安装ROS2的时候,是没有安装bag包的,需要自己进行安装,运行下面这句话:
sudo apt-get install ros-<distro>-ros2bag ros-<distro>-rosbag2*
博主使用的eloquent
版本的,因此需要执行以下命令安装:
sudo apt-get install ros-eloquent-ros2bag ros-eloquent-rosbag2*
1 配置
还是以小海龟仿真器为例,我们尝试录制控制海龟运动的速度指令,并实现回放。
打开新终端并运行:
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
我们已经知道/teleop_turtle
节点在/turtle1/cmd_vel
话题上发布命令,以使海龟在仿真器中移动。如果监听该话题,并且通过键盘控制小海龟移动,就可以看到速度指令的消息:
ros2 topic echo /turtle1/cmd_vel
起初不会显示任何内容,因为/teleop_turtle
节点没有发布任何数据。返回运行/turtle_teleop_key
的终端,选择它,使其处于活动状态。使用箭头键移动海龟,您将看到在运行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录制话题数据
要记录发布到话题的数据,请使用下列命令:
ros2 bag record <topic_name>
在对所选话题运行此命令之前,请打开一个新的终端并移动到您先前创建的bag_files
目录中,因为rosbag文件将保存在您运行它的目录中。
运行如下命令:
ros2 bag record /turtle1/cmd_vel
可以看到开始录制数据的日志提示:
[INFO] [rosbag2_storage]: Opened database 'rosbag2_2021_09_22-01_03_32/rosbag2_2021_09_22-01_03_32_0.db3' for READ_WRITE.
[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
已经开始在录制/turtle1/cmd_vel
话题中的消息了,回到键盘控制的窗口,控制小海龟完成一些运动,怎么动没关系,重要的是要把这些移动的指令都录制下来。
完成录制后,在运行ros2 bag
的终端中Ctrl+C
即可停止录制,已经录制好的数据会保存在“rosbag2_year_month_day-hour_minute_second”
命名的文件中。
您还可以录制多个话题,以及更改ros2 bag
保存的文件名。运行如下命令:
ros2 bag record -o subset /turtle1/cmd_vel /turtle1/pose
-o
参数是用来设置数据库文件名的,此时文件名叫subset
。多个话题名通过空格隔开就行,输入几个就会录制几个,录制时可以看到:
[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...
注意:如果觉得麻烦,可以用-a
参数录制所有话题的数据,不过这样容易产生环形依赖,可能造成系统的崩溃。
4 查看数据库文件
我们可以使用这个命令查看数据库文件的信息:
ros2 bag info <bag_file_name>
输出如下信息:
[INFO] [rosbag2_storage]: Opened database 'subset_0.db3' for READ_ONLY.
Files: subset_0.db3
Bag size: 96.0 KiB
Storage id: sqlite3
Duration: 20.12s
Start: Sep 22 2021 01:15:30.652 (1632244530.652)
End Sep 22 2021 01:15:50.664 (1632244550.664)
Messages: 1294
Topic information: Topic: /turtle1/cmd_vel | Type: geometry_msgs/msg/Twist | Count: 41 | Serialization Format: cdr
Topic: /turtle1/pose | Type: turtlesim/msg/Pose | Count: 1253 | Serialization Format: cdr
要查看单个消息,您必须打开数据库(在本例中为sqlite3)来检查它,这超出了ROS2的范围。
5 ros2 bag回放数据
关闭之前运行的键盘控制节点,确保目前是没有任何节点发送海龟运行指令的,接下使用如下命令回放录制好的数据:
ros2 bag play <bag_file_name>
终端中会提示:
[INFO] [rosbag2_storage]: Opened database 'rosbag2_2021_09_22-01_03_32_0.db3' for READ_ONLY.
小海龟仿真器中可以看到海龟按照之前控制的指令在运动。(虽然不是100%准确;turtlesim对系统计时的微小变化非常敏感)。
您可以使用ros2 bag
命令在ROS2系统中记录传递给话题的数据。无论你是与他人分享你的工作,还是对自己的实验进行反思,这都是一个很好的工具。