1. 程式人生 > >ROS中記錄資料與回放

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/poseturtlesim/Pose兩個話題的資訊。

四、rosbag record/play的侷限

我們可以發現,儘管我們記錄了小海龜的執行資料並且重新使用了它們,但是小海龜運動的形狀同以前並不完全相同。

這是因為,對於小海龜運動這類動作,極小的時間上的差別就會產生不同的結果,而rosbag記錄時間的精度又是有限的,我們不可能完全重現小海龜的狀態。所以要記住這一點——我們預設rosbag record/play無法完美重現系統的狀態。