4.4 录制回放工具——rosbag2
4.4 录制回放工具——rosbag2
场景
机器人传感器获取到的信息,有时我们可能需要时时处理,有时可能只是采集数据,事后分析,比如:
机器人导航实现中,可能需要绘制导航所需的全局地图,地图绘制实现,有两种方式,方式1:可以控制机器人运动,将机器人传感器感知到的数据时时处理,生成地图信息。方式2:同样是控制机器人运动,将机器人传感器感知到的数据留存,事后,再重新读取数据,生成地图信息。两种方式比较,显然方式2使用上更为灵活方便。
在ROS2 中关于数据的留存以及读取实现,提供了专门的工具: rosbag2。
概念
是用于录制和回放话题的一个工具集。
作用
实现了数据的复用,方便调试、测试。
案例
录制并读取数据。
实现步骤:
序列化;
反序列化;
编译执行。
准备:
终端下进入工作空间的src目录,调用如下两条命令分别创建C++功能包和Python功能包。

4.4.1 ros2 bag 命令工具
在 ROS2 中提供了 ros2 bag 命令工具,可以方便的实现数据的录制回放等操作,ros2 bag 的基本使用语法如下:

4.4.2 rosbag2 编程(C++)
1.序列化
功能包 cpp02_rosbag 的 src 目录下,新建 C++ 文件 demo01_writer.cpp,并编辑文件,输入如下内容:

2.反序列化
功能包 cpp02_rosbag 的 src 目录下,新建 C++ 文件 demo02_reader.cpp,并编辑文件,输入如下内容:

3.编辑配置文件
1.package.xml
在创建功能包时,所依赖的功能包已经自动配置了,配置内容如下:

2.CMakeLists.txt
CMakeLists.txt 中的相关配置如下:

4.编译
终端中进入当前工作空间,编译功能包:
colcon build --packages-select cpp02_rosbag
5.执行
当前工作空间下,启动两个终端,终端1执行录制程序,终端2执行回放程序。
终端1输入如下指令:

执行完毕后,会在当前工作空间下生成一个名为 my_bag 的目录。
终端2输入如下指令:

该程序运行会读取 my_bag 中记录的数据,其结果是在终端打印录制的速度指令最终的线速度和角速度。
4.4.3 rosbag2 编程(Python)
1.序列化
功能包 py02_rosbag 的 py02_rosbag 目录下,新建 Python 文件 demo01_writer_py.py,并编辑文件,输入如下内容:

2.反序列化
功能包 py02_rosbag 的 py02_rosbag 目录下,新建 Python 文件 demo02_reader_py.py,并编辑文件,输入如下内容:

3.编辑配置文件
1.package.xml
在创建功能包时,所依赖的功能包已经自动配置了,配置内容如下:

2.setup.py
entry_points字段的console_scripts中添加如下内容:

4.编译
终端中进入当前工作空间,编译功能包:
colcon build --packages-select py02_rosbag
5.执行
当前工作空间下,启动两个终端,终端1执行录制程序,终端2执行回放程序。
终端1输入如下指令:

执行完毕后,会在当前工作空间下生成一个名为 my_bag_py 的目录。
终端2输入如下指令:

该程序运行会读取 my_bag 中记录的数据,其结果是在终端打印录制的速度指令的话题、时间戳与其内容(二进制格式)。

B站有完整的ros系列教程视频,可以观看完整内容ros课程ROS2理论与实践
更多内容将在猛狮知识星球社区更新最新课程,后续将推出更多优质内容——详情可关注猛狮集训营公众号和猛狮集训营官方网站。