ros2 bag
是一個命令行工具,用於記錄發布在系統中話題上的數據。它累積記錄任意數量話題的數據,並將其保存在數據庫中。然后可以重放數據以再現測試和實驗的結果。記錄話題數據也是分享工作和讓別人重現工作的好方法。
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
節點在/turtle1/cmd_vel
話題上發布命令以使海龜在turtlesim
中移動。
要查看/turtle1/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_files
目錄中,因為rosbag文件將保存在運行它的目錄中,然后執行:
ros2 bag record /turtle1/cmd_vel
將在終端中看到以下消息(日期和時間會不同):
[INFO] [rosbag2_storage]: Opened database 'rosbag2_2021_07_14-09_39_06/rosbag2_2021_07_14-09_39_06_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
話題上發布的數據:

按下ctrl+c
來停止記錄。
保存的文件名稱具有以下格式:
rosbag2_year_month_day-hour_minute_second
3.1記錄多個話題
使用ros2 bag
同樣可以記錄多個數據:
ros2 bag record -o subset /turtle1/cmd_vel /turtle1/pose
-o
選項允許為包文件選擇一個唯一的名稱,下面的字符串(subset)是文件名。
要一次記錄多個話題,只需用空格分隔出每個話題即可。
將看到以下消息,確認正在錄制兩個話題:
[INFO] [rosbag2_storage]: Opened database 'subset/subset_0.db3' for READ_WRITE.
[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>
在subset
包文件上運行這個命令將返回一個關於該文件的信息列表:
Files: subset_0.db3
Bag size: 25.2 KiB
Storage id: sqlite3
Duration: 1.551s
Start: Jul 14 2021 09:48:54.316 (1626227334.316)
End: Jul 14 2021 09:48:55.868 (1626227335.868)
Messages: 98
Topic information: Topic: /turtle1/pose | Type: turtlesim/msg/Pose | Count: 98 | Serialization Format: cdr
Topic: /turtle1/cmd_vel | Type: geometry_msgs/msg/Twist | Count: 0 | Serialization Format: cdr
要查看各個消息,必須打開數據庫(在本例中是sqlite3)來檢查它,這超出了ROS2的范圍。
5.ros2 bag play
在運行teleop
的終端中鍵入Ctrl+C
,重新播放bag文件,確保海龜窗口是可見的:
ros2 bag play rosbag2_2021_07_14-09_39_06
終端返回:
[INFO] [rosbag2_storage]: Opened database 'rosbag2_2021_07_14-09_39_06/rosbag2_2021_07_14-09_39_06_0.db3' for READ_ONLY.
海龜將遵循在記錄時輸入的相同路徑(盡管不是100%准確,turtlesim對系統時間的微小變化很敏感)。

6.總結
可以使用ros2 bag
命令記錄在ROS2系統中傳遞的話題上的數據。無論是在與他人分享工作,還是在檢查自己的實驗,這都是一個值得了解的好工具。
如果給您帶來幫助,希望能給點個關注,以后還會陸續更新有關機器人的內容,點個關注不迷路~歡迎大家一起交流學習。
都看到這了,點個推薦再走吧~
未經允許,禁止轉載。