文章目的:使用ROS錄製數據並解析(txt, img)
文章核心部分轉載自:ROS學習篇(七)rostopic消息記錄、回放、轉.txt
一、通過Bag文件記錄話題消息
當發佈話題的節點運行後,通過rostopic list
列出當前運行的話題,然後記錄:
mkdir bagfile
cd bagfile
rosbag record -a #記錄所有的話題
當消息記錄完成後,結束ctrl+c終止record的命令行,在新建的bagfile文件夾(可以在任意位置,方便找到就行)中會生成年-月-日-時-分-秒.bag
文件。
以Intel realsense zr300舉例(可以不用看這個例子),由於realsense zr300傳感器比較多,其驅動maplab_realsense發佈的話題比較多,有imu,fisheye,color,depth,IR等等
我通過rosbag record -a
記錄所有的數據,得到:
二、數據重現
我們使用rosbag命令將數據記錄在bag文件之後,還可以利用裏面的數據重現我們節點的運行狀態。
cd bagfile
rosbag info <file_name>
會顯示此bag文件的一些詳細信息(如下圖),之前錄製了所有的topic的信息,因此,當使用rosbag info的時候,會顯示所有topic的信息。
回放
cd bagfile
rosbag play <bagfile_name>
默認情況下,rosbag play
命令會等待0.2秒之後纔開始發佈信息,這是爲了在發佈信息之前通知所有訂閱信息的節點,以使它們能夠及時地接收到rosbag play發佈的信息。這個等待時間可以用-d選項指定。
因爲rosbag record
記錄數據是有延遲的,所以在執行rosbag play
最初的一小段時間裏消息不會發布,使用-s
選項後跟秒數可以跳過bag文件記錄的前幾秒。
-r
,它可以改變信息發佈的速度:
rosbag play -r 2 <bagfile_name> #以兩倍的速度發佈記錄的消息
回放指定話題
rosbag play <your bagfile name> --topics /topic_name
三、錄製選定的話題進行錄製數據
在一個包含數百個話題的大型系統中(比如我剛提到的realsense zr300),經常會發布諸如圖像等的大量的信息,把它們都記錄到一個文件裏是不現實的,好在rosbag record
命令提供了僅記錄部分話題的能力。
rosbag record -O subset /zr300_node/device_time /zr300_node/imu /zr300_node/fisheye/image_raw
-O
選項指定了我們要保存的bag文件的名字(subset.bag),後面的 /zr300_node/device_time /zr300_node/imu /zr300_node/fisheye/image_raw
則指定了三個我們要記錄信息的話題。
注:rosbag record/play
無法完美重現系統的狀態。解釋:
rosbag受制於其本身的性能無法完全複製錄製時的系統運行行爲,rosplay也一樣。對於像turtlesim這樣的節點,當處理消息的過程中系統定時發生極小變化時也會使其行爲發生微妙變化,用戶不應該期望能夠完美的模仿系統行爲。
四、.bag文件轉.txt
將file_name.bag
文件中topic_name
話題的消息轉換到Txt_name.txt
文件中:
rostopic echo -b file_name.bag -p /topic_name > Txt_name.txt
比如我,將上述錄製的bag數據中imu的部分提取到txt文件中來:
rostopic echo -b subset.bag -p /zr300_node/imu > imu.txt
五、.bag 文件失敗,只出現.bag.active文件
經驗之談:在沒有ctrl+c打斷的情況下,數據一般會是.bag.active的狀態,如果進行了Ctrl+c終止,還是.bag.active的狀態,那可能就是在數據錄製的過程中卡掉了,建議重新錄製,即便是使用下面的命令恢復成了.bag文件,內部的數據還是丟失了。
恢復
恢復:
- ①切換到"xxx.bag.active"文件所在的目錄下;
- ②命令行輸入“rosbag reindex xxx.bag.active”;
- ③輸入"rosbag fix xxx.bag.active outfile_name.abg";
注:
在第二步結束後,除了原來的以.bag.active爲後綴的文件之外,還會生成一個以.bag.org.active爲後綴的文件,注意該文件只是中間文件,第三部輸入的時候不要對該文件進行修復。
在第三步結束之後,會生成正常的.bag文件
六、使用rxplot畫時間趨勢曲線
在ROS系統中,標量數據可以根據消息中提供的時間戳作爲時間序列繪製圖形。
運行可以發佈話題的節點後,可以通過rostopic list
查看當前的發佈的話題,現在,我們不再去使用rostopic echo <topic>
,而是通過rxplot
命令就能夠看到隨時間變化的值的曲線。
rqt_plot /topic/data //單個話題,單個數據
rqt_plot /topic/x:y:z //單個話題,向量數據
rqt_plot /topic/x /topic/y /topic/z
或者先打開GUI界面:
rosrun rqt_plot rqt_plot
然後在topic宏輸入項觀測的話題就可以了。
但是當某個話題數據較多時,需要plot單個數據纔會有曲線,或是根本不行。待進一步研究…
在此採用第一種方法,繪製imu的加速度隨時間變化曲線:
輸入:
rqt_plot /zr30_node/imu/x:y:z
得到: