4.4 錄制回放工具——rosbag2
4.4 錄制回放工具——rosbag2
場景
機器人傳感器獲取到的信息,有時我們可能需要時時處理,有時可能只是采集數(shù)據(jù),事后分析,比如:
機器人導(dǎo)航實現(xiàn)中,可能需要繪制導(dǎo)航所需的全局地圖,地圖繪制實現(xiàn),有兩種方式,方式1:可以控制機器人運動,將機器人傳感器感知到的數(shù)據(jù)時時處理,生成地圖信息。方式2:同樣是控制機器人運動,將機器人傳感器感知到的數(shù)據(jù)留存,事后,再重新讀取數(shù)據(jù),生成地圖信息。兩種方式比較,顯然方式2使用上更為靈活方便。
在ROS2 中關(guān)于數(shù)據(jù)的留存以及讀取實現(xiàn),提供了專門的工具: rosbag2。
概念
是用于錄制和回放話題的一個工具集。
作用
實現(xiàn)了數(shù)據(jù)的復(fù)用,方便調(diào)試、測試。
案例
錄制并讀取數(shù)據(jù)。
實現(xiàn)步驟:
序列化;
反序列化;
編譯執(zhí)行。
準備:
終端下進入工作空間的src目錄,調(diào)用如下兩條命令分別創(chuàng)建C++功能包和Python功能包。

4.4.1 ros2 bag 命令工具
在 ROS2 中提供了 ros2 bag 命令工具,可以方便的實現(xiàn)數(shù)據(jù)的錄制回放等操作,ros2 bag 的基本使用語法如下:

4.4.2 rosbag2 編程(C++)
1.序列化
功能包 cpp02_rosbag 的 src 目錄下,新建 C++ 文件 demo01_writer.cpp,并編輯文件,輸入如下內(nèi)容:

2.反序列化
功能包 cpp02_rosbag 的 src 目錄下,新建 C++ 文件 demo02_reader.cpp,并編輯文件,輸入如下內(nèi)容:

3.編輯配置文件
1.package.xml
在創(chuàng)建功能包時,所依賴的功能包已經(jīng)自動配置了,配置內(nèi)容如下:

2.CMakeLists.txt
CMakeLists.txt 中的相關(guān)配置如下:

4.編譯
終端中進入當前工作空間,編譯功能包:
colcon build --packages-select cpp02_rosbag
5.執(zhí)行
當前工作空間下,啟動兩個終端,終端1執(zhí)行錄制程序,終端2執(zhí)行回放程序。
終端1輸入如下指令:

執(zhí)行完畢后,會在當前工作空間下生成一個名為 my_bag 的目錄。
終端2輸入如下指令:

該程序運行會讀取 my_bag 中記錄的數(shù)據(jù),其結(jié)果是在終端打印錄制的速度指令最終的線速度和角速度。
4.4.3 rosbag2 編程(Python)
1.序列化
功能包 py02_rosbag 的 py02_rosbag 目錄下,新建 Python 文件 demo01_writer_py.py,并編輯文件,輸入如下內(nèi)容:

2.反序列化
功能包 py02_rosbag 的 py02_rosbag 目錄下,新建 Python 文件 demo02_reader_py.py,并編輯文件,輸入如下內(nèi)容:

3.編輯配置文件
1.package.xml
在創(chuàng)建功能包時,所依賴的功能包已經(jīng)自動配置了,配置內(nèi)容如下:

2.setup.py
entry_points字段的console_scripts中添加如下內(nèi)容:

4.編譯
終端中進入當前工作空間,編譯功能包:
colcon build --packages-select py02_rosbag
5.執(zhí)行
當前工作空間下,啟動兩個終端,終端1執(zhí)行錄制程序,終端2執(zhí)行回放程序。
終端1輸入如下指令:

執(zhí)行完畢后,會在當前工作空間下生成一個名為 my_bag_py 的目錄。
終端2輸入如下指令:

該程序運行會讀取 my_bag 中記錄的數(shù)據(jù),其結(jié)果是在終端打印錄制的速度指令的話題、時間戳與其內(nèi)容(二進制格式)。

B站有完整的ros系列教程視頻,可以觀看完整內(nèi)容ros課程ROS2理論與實踐
更多內(nèi)容將在猛獅知識星球社區(qū)更新最新課程,后續(xù)將推出更多優(yōu)質(zhì)內(nèi)容——詳情可關(guān)注猛獅集訓(xùn)營公眾號和猛獅集訓(xùn)營官方網(wǎng)站。