ROS中記錄資料與回放
轉自:https://blog.csdn.net/ab748998806/article/details/51194019
在使用ROS系統的時候,我們可能會遇到這樣的需求——重現機器人在的執行狀況或者分析機器人的某些執行資料。這時候我們就十分需要對資料進行記錄和備份的功能,好在ROS提供了非常方便的這樣的功能。
一、記錄資料(通過建立bag檔案)
這一節裡介紹的是在一個執行中的ROS系統中記錄某一個話題的資訊,我們以小海龜節點為例,介紹如何在一個bag檔案裡記錄話題釋出的資訊。
首先執行ROS:
roscore
- 1
然後在另一個終端裡啟動小海龜節點:
rosrun turtlesim turtlesim_node
- 1
再在另一個終端裡啟動小海龜鍵盤鍵盤控制節點:
rosrun turtlesim turtle_teleop_key
- 1
啟動這個節點後我們會得到這樣的資訊:
Reading from keyboard
---------------------------
Use arrow keys to move the turtle.
- 1
- 2
- 3
就像命令列提示的一樣,我們按方向鍵就可以控制海龜移動了。
1、記錄當前存在的所有話題
首先在一個新的終端裡使用以下命令檢視當前存在的所有話題:
rostopic list -v
- 1
輸出類似於:
Published topics:
* /turtle1/color_sensor [turtlesim/Color] 1 publisher
* /turtle1/cmd _vel [geometry_msgs/Twist] 1 publisher
* /rosout [rosgraph_msgs/Log] 2 publishers
* /rosout_agg [rosgraph_msgs/Log] 1 publisher
* /turtle1/pose [turtlesim/Pose] 1 publisher
Subscribed topics:
* /turtle1/cmd_vel [geometry_msgs/Twist] 1 subscriber
* /rosout [rosgraph_msgs/Log] 1 subscriber
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
然後我們這樣記錄上面列表裡存在的所有的資訊:
mkdir ~/bagfiles
cd ~/bagfiles
rosbag record -a
- 1
- 2
- 3
我們先建立了一個臨時目錄,然後使用rosbag record
命令記錄資訊,-a
引數則指定了我們要記錄當前全部話題的資訊。
現在如前面所說的那樣,我們用鍵盤控制小海龜移動,持續10幾秒之後,按CTRL C
退出record命令。
檢視~/bagfiles
目錄,我們發現裡面多了一個這樣的檔案2016-04-19-20-35-30.bag
,檔名的意思是年-月-日-時-分-秒
,這個檔案裡記錄了這個檔名所示的時間裡所有話題裡的所有的資訊。
二、使用備份資料重現節點狀態
我們使用rosbag
命令將資料記錄在bag檔案之後,還可以利用裡面的資料重現我們節點的執行狀態。
在~/bagfiles
目錄裡執行下面的命令檢視檔案資訊:
rosbag info <your bagfile>
- 1
這裡得到輸出類似這樣:
path: 2016-04-19-20-35-30.bag
version: 2.0
duration: 2:08s (128s)
start: Apr 19 2016 20:35:30.97 (1461069330.97)
end: Apr 19 2016 20:37:39.83 (1461069459.83)
size: 1.1 MB
messages: 16369
compression: none [2/2 chunks]
types: geometry_msgs/Twist [9f195f881246fdfa2798d1d3eebca84a]
rosgraph_msgs/Log [acffd30cd6b6de30f120938c17c593fb]
turtlesim/Color [353891e354491c51aabe32df673fb446]
turtlesim/Pose [863b248d5016ca62ea2e895ae5265cf9]
topics: /rosout 19 msgs : rosgraph_msgs/Log (2 connections)
/rosout_agg 15 msgs : rosgraph_msgs/Log
/turtle1/cmd_vel 258 msgs : geometry_msgs/Twist
/turtle1/color_sensor 8039 msgs : turtlesim/Color
/turtle1/pose 8038 msgs : turtlesim/Pose
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
可以發現列出的檔案詳情包括資訊的數量、型別、記錄資訊的時間等等。
下一步我們使用這個檔案的資料來重現我們小海龜的執行狀態。
首先在turtle_teleop_key
節點執行著的終端裡按CTRL C
終止這個節點的執行,然後在~/bagfiles
目錄例子執行:
rosbag play <your bagfile>
- 1
得到的輸出類似:
[ INFO] [1461070112.371264040]: Opening 2016-04-19-20-35-30.bag
Waiting 0.2 seconds after advertising topics... done.
Hit space to toggle paused, or 's' to step.
- 1
- 2
- 3
- 4
- 5
然後檢視小海龜視窗,發現它在按照與之前相同的軌跡行進。
預設情況下,rosbag play
命令會等待0.2秒之後才開始釋出資訊,這是為了在釋出資訊之前通知所有訂閱資訊的節點,以使它們能夠及時地接收到rosbag play
釋出的資訊。這個等待時間可以用-d
選項指定。
因為rosbag record
記錄資料是有延遲的,所以在執行rosbag play
最初的一小段時間裡小海龜是不會動的,使用-s
選項後跟秒數可以跳過bag檔案記錄的前幾秒,從而是小海龜可以馬上動起來。
另一個有趣的選項是-r
,它可以改變資訊釋出的速度,比如
rosbag play -r 2 <your bagfile>
- 1
將會以原來的兩部速率釋出bag檔案內記錄的資訊,這其實等效於我們用原來兩倍的速度來按鍵盤。
三、記錄資料子集
在一個包含數百個話題的大型系統中,經常會發布諸如影象等的大量的資訊,把它們都記錄到一個檔案裡是不現實的,好在rosbag record
命令提供了僅記錄部分話題的能力。
還是在兩個終端裡分別啟動這兩個節點:
rosrun turtlesim turtlesim_node
rosrun turtlesim turtle_teleop_key
- 1
- 2
然後在~/bagfiles
目錄裡執行:
rosbag record -O subset /turtle1/cmd_vel /turtle1/pose
- 1
-O
選項指定了我們要儲存的bag檔案的名字,後面的/turtle1/cmd_vel
和 /turtle1/pose
則指定了我們要記錄資訊的話題。
同上面一樣,按幾下鍵盤,記錄一下10幾秒的資訊。
接下來在~/bagfiles
目錄裡檢視我們剛剛建立的檔案的資訊:
rosbag info subset.bag
- 1
得到:
path: subset.bag
version: 2.0
duration: 1:42s (102s)
start: Apr 19 2016 21:10:00.97 (1461071400.97)
end: Apr 19 2016 21:11:43.78 (1461071503.78)
size: 494.3 KB
messages: 6427
compression: none [1/1 chunks]
types: turtlesim/Pose [863b248d5016ca62ea2e895ae5265cf9]
topics: /turtle1/pose 6427 msgs : turtlesim/Pose
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
可以發現,這一次檔案內僅儲存了/turtle1/pose
和turtlesim/Pose
兩個話題的資訊。
四、rosbag record/play的侷限
我們可以發現,儘管我們記錄了小海龜的執行資料並且重新使用了它們,但是小海龜運動的形狀同以前並不完全相同。
這是因為,對於小海龜運動這類動作,極小的時間上的差別就會產生不同的結果,而rosbag記錄時間的精度又是有限的,我們不可能完全重現小海龜的狀態。所以要記住這一點——我們預設rosbag record/play
無法完美重現系統的狀態。