ROS bag包資料的回放,提取任意話題資料,並轉化為txt檔案
一、通過bag檔案記錄話題訊息
當釋出話題的節點執行後,可以通過rostopic list
列出當前執行的話題,然後記錄:
mkdir bagfile
cd bagfile
rosbag record -a #記錄所有的話題
當訊息記錄完成後,結束ctrl+c終止record的命令列,在新建的bagfile檔案中會生成年-月-日-時-分-秒.bag
檔案。
二、資料重現
我們使用rosbag命令將資料記錄在bag檔案之後,還可以利用裡面的資料重現我們節點的執行狀態。
cd bagfile
rosbag info <file_name>
會顯示此bag檔案的一些詳細資訊(如下圖):
[email protected]:~/bag$ rosbag info MERGED_cv_lanekeeping_2018-04-25-16-14-52.bag path: MERGED_cv_lanekeeping_2018-04-25-16-14-52.bag version: 2.0 duration: 1:59s (119s) start: Apr 26 2018 04:14:52.51 (1524687292.51) end: Apr 26 2018 04:16:51.76 (1524687411.76) size: 14.4 GB messages: 621967 compression: none [13485/13485 chunks] types: can_msgs/Frame [64ae5cebf967dc6aae4e78f5683a5b25] dbw_mkz_msgs/BrakeCmd [c0d20e1056976680942e85ab0959826c] dbw_mkz_msgs/BrakeInfoReport [fc88af128b5b3213ea25ab325a9b3bbb] dbw_mkz_msgs/BrakeReport [5716c7ce378fb5a251e0ff30ac24500e] dbw_mkz_msgs/FuelLevelReport [f5ec1964dbda02fda82785b8035744e4] dbw_mkz_msgs/GearReport [785b94d5bfee677e7f0da982153f2711] dbw_mkz_msgs/Misc1Report [c5c1e0d6ba52586919873bf9b0355143] dbw_mkz_msgs/SteeringCmd [ff1fa11624bdc2aff2aeee5aa6014057] dbw_mkz_msgs/SteeringReport [435efc512abdd87ef2f942c0e8ed296d] dbw_mkz_msgs/SurroundReport [17a8c9ed72da4f55d44d6d71483cf0e3] dbw_mkz_msgs/ThrottleCmd [d75259a1444adebea30e45b37542c415] dbw_mkz_msgs/ThrottleInfoReport [8255d20d2bbc661ad39074024259c71a] dbw_mkz_msgs/ThrottleReport [dc371d36db36a47de2ffaa1302bf4aec] dbw_mkz_msgs/TurnSignalCmd [f1310dcd252c98fc408c6df907b9495a] dbw_mkz_msgs/WheelPositionReport [0e6f28c4c7a099c93cc2173da9808a16]
回放
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> #以兩倍的速度釋出記錄的訊息
三、選定話題記錄
1、查詢話題:
在資料回放的時候:新建終端,在終端輸入:
rostopic list -v
就會得到如圖:
[email protected]:~$ rostopic list -v
Published topics:
* /turtle1/cmd_vel [geometry_msgs/Twist] 1 publisher
* /rosout [rosgraph_msgs/Log] 4 publishers
* /rosout_agg [rosgraph_msgs/Log] 1 publisher
* /turtle1/color_sensor [turtlesim/Color] 1 publisher
* /turtle1/pose [turtlesim/Pose] 1 publisher
Subscribed topics:
* /turtle1/cmd_vel [geometry_msgs/Twist] 2 subscribers
* /rosout [rosgraph_msgs/Log] 1 subscriber
* /statistics [rosgraph_msgs/TopicStatistics] 1 subscriber
2、提取其中的資料成立新的bag包
在一個包含數百個話題的大型系統中,經常會發布諸如影象等的大量的資訊,把它們都記錄到一個檔案裡是不現實的,好在rosbag record
命令提供了僅記錄部分話題的能力。
rosbag record -O subset /turtle1/cmd_vel /turtle1/pose
-O
選項指定了我們要儲存的bag檔案的名字(subset.bag),後面的/turtle1/cmd_vel
和 /turtle1/pose
則指定了我們要記錄資訊的話題。
如果只是記錄num次資料:可以在-O 後買你新增引數:-r num
注:rosbag record/play
無法完美重現系統的狀態。
四、.bag檔案轉.txt
將file_name.bag
檔案中topic_name
話題的訊息轉換到Txt_name.txt
檔案中:
rostopic echo -b file_name.bag -p /topic_name > Txt_name.txt
五、.bag檔案生成失敗,只出現.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檔案