歡迎來到第七講,我居然能寫這么多,撒花??!
rosbag是用來儲存ros消息的東西。
在我們平時處理一些robotics問題的時候,我們得到一些數(shù)據(jù),有些時候我們需要實時的處理,即獲得數(shù)據(jù),寫好的程序分析數(shù)據(jù)然后得出結(jié)果,但另一些時候我們只是想采集數(shù)據(jù),事后分析,這些數(shù)據(jù)存儲在哪兒呢?就存儲在rosbag里了。
那么這一講我們就要搞定兩個簡單的問題
1:如何使用rosbag采集數(shù)據(jù)
2:如何重新使用儲存在rosbag里的數(shù)據(jù)
使用rosbag采集數(shù)據(jù)
對于第一個問題,我們用之前的寫的程序來講解。還記得在第三講,我們寫過一個pub_poseStamped.cpp的程序,什么?你是直接跳到這兒來的?那簡單解釋一下那個程序就是模仿我們有一個傳感器,能每隔100ms獲取機器人的位置和方向,并放到poseStamped這個消息類型中發(fā)布出來。那么接下來我們就使用rosbag來采集這個假的傳感器所發(fā)布出來的數(shù)據(jù)。
rosbag在采集數(shù)據(jù)時自身相當于一個subscriber程序
最開始幾講你寫一個publisher文件,就要寫有一個subscriber文件,他們總是成雙成對地出入。那么當你用rosbag采集數(shù)據(jù)時,你有publisher就行了,不需要再寫subscriber文件了。
那么具體怎么實施呢?
首先啟動roscore,rosbag才能記錄數(shù)據(jù)。
然后建立一個叫dataset的文件夾專門來儲存這些數(shù)據(jù),cd到那個文件夾去
然后在terminal中,寫入下面內(nèi)容
rosbag record /chatter -O record_poseStamped
這行命令第一個是表示我們要使用rosbag相關(guān)命令了,第二個record表示我們想要采集(記錄)數(shù)據(jù)。
第三個,由于我們之前說了,rosbag在采集數(shù)據(jù)時自身相當于一個subscirber程序,既然要subscribe,那么我們肯定需要指定subscriber哪個topic了,觀察我們在pub_poseStamped.cpp中,定義topic那一行我們定義的topic的名字是chatter,于是我們就在第三個參數(shù)寫入/chatter表示記錄這個topic發(fā)布出來的信息。rosbag可以同時記錄多個topic的信息,你只需要在record后接/topicA /topicB /topicC....即可。
命令行中-O及其后面的參數(shù),是用來給bag文件命名的。我們在記錄結(jié)束之后,rosbag的名字就會是record_poseStamped.bag,(如果參數(shù)是-o,那么記錄名字會自動加上年月日時間,比如上面的例子如果用rosbag record /chatter -o record_poseStamped,輸出會是record_poseStamped-2019-09-08-15-24-05.bag)。按下確認鍵后,你會看到下面的消息
[ INFO] [1551144307.272157111]: Subscribing to /chatter
[ INFO] [1551144307.274766644]: Recording to record_poseStamped.bag.
表示已經(jīng)在開始記錄chatter發(fā)布的消息了,消息會存儲到record_poseStamped.bag里。如果topic沒有消息發(fā)布,那么自然不會有任何東西會儲存到這個rosbag文件里,這個文件會一直處于檢測是否有消息發(fā)布的狀態(tài)。你如果去看dataset文件夾里的圖標,會發(fā)現(xiàn)一個叫record_poseStamped.bag.active的文件,表示這個bag文件目前正在處于記錄的狀態(tài)。
之后我們打開另一個terminal,輸入下面的命令
cd ~/catkin_ws
source devel/setup.bash
rosrun pub_sub_test pub_poseStamped
把pub_poseStamped跑起來。你應該看到print出很多信息,這時候你觀察跑rosbag那個terminal,什么也沒有輸出。 你可能會擔心,到底是不是在記錄發(fā)布出來的消息。rosbag里的topic名字和你publisher的名字是在對應上的,就一定在記錄。極少數(shù)情況rosbag會拒絕記錄新的消息,比如你的磁盤空間小于一個G了,rosbag會自動停止記錄,如果你的磁盤空間小于5個G了,會出現(xiàn)warning但是不影響記錄。
有些時候?qū)懗绦虻娜瞬⒉粫裵ublisher發(fā)布的消息print出來,你如果有成千上萬條消息發(fā)布都print出來確實很煩。這時候你publisher的terminal中沒什么信息print出來,rosbag的terminal中沒什么信息print出來,你可能慌得一匹,不知道消息有沒有被發(fā)布出來。你可以用下面的方式檢查一下你的topic有沒有發(fā)布消息。
打開另一個terminal,輸入
rostopic echo /chatter
這行命令會把你chatter這個topic發(fā)布的命令print到terminal中。按下確認之后你會安心地看到下面的內(nèi)容。

上面那行命令其實也相當于你跑了一個subscriber并且把收到的消息print出來。并且格式固定??梢钥吹矫恳粍t消息由
---分開。然后顯示出你消息的header(我們第三講講過header這個包含的成員由seq,stamp,frame_id,他們分別對應uint32,time,string類型的變量,沒有印象了可以再回去回顧)。同時print出來了pose的內(nèi)容,即position和orientation。當你覺得記錄到足夠的數(shù)據(jù)之后,點擊rosbag在運行的那個terminal并按下
ctrl+c,rosbag就會停止記錄并被保存下來了。每次記錄完數(shù)據(jù),我們都要馬上檢查一下是否記錄成功。這時候我們在terminal中使用下面的命令可以看到rosbag的信息
rosbag info record_poseStamped.bag
運行這行命令,我們可以看到下面的信息。

其中我們可以看到這個bag文件記錄了多少消息,記錄的是哪個topic的消息,消息的類型是什么等。讀者自行研究了。
至此利用rosbag采集(記錄)數(shù)據(jù)工作就完成了。
重新使用儲存在rosbag內(nèi)的數(shù)據(jù)
當你采集完成數(shù)據(jù)之后,要拿回去分析,這時你就需要重新把儲存在bag里的消息發(fā)布出來。
首先確保roscore已經(jīng)運行,cd到你rosbag所在的文件夾,然后執(zhí)行下面的命令
rosbag play record_poseStamped.bag
這時你會看到下面的內(nèi)容

表示bag已經(jīng)在發(fā)布消息了。上面的操作是什么意思呢?
當你重新使用rosbag的數(shù)據(jù)(即使用rosbag play bag_name.bag)的時候,你的rosbag自身相當于一個publisher程序。
你的消息會在rosbag記錄的topic的名字下重新發(fā)布出來。如果你打開一個terminal,重新運行我們之前的sub_poseStamped.cpp對用的那個node,即在新的terminal中source之后運行
rosrun pub_sub_test sub_poseStamped
你應該會看到和第三講里面同事運行pub和sub程序時一樣的內(nèi)容。只不過這時候我們的rosbag取代了那個pub程序而已。
這兒稍微值得注意的一點是,我們上面print出來的Bag Time是這個rosbag收到每一則消息時的時間,并不是我們poseStamped里那個stamp儲存的時間。
總結(jié)
這么快就總結(jié)了,我是不是越來越懶了,飄了...不是滴,主要是關(guān)于rosbag最主要的作用就是兩個:作為subscriber接收信息并儲存,作為publisher重新發(fā)布信息,沒有太多需要解釋的。雖然其實rosbag ...后面還可以跟許多命令。詳情可以見
http://wiki.ros.org/rosbag/Commandline
比如網(wǎng)頁中在rosbag record部分,你可以在rosbag record后接--duration命令指定最長記錄多少時間;
rosbag play部分,你可以在rosbag play 后接--pause命令,這樣你開始運行bag時不發(fā)布數(shù)據(jù),直到你按下空格鍵它才開始發(fā)布,同樣你再按空格鍵rosbag又會暫停發(fā)布。
rosbag filter部分,你可以使用rosbag filter 命令拆分一個rosbag。正如filter部分中的例子所說
rosbag filter input.bag output.bag "t.to_sec() <= 1284703931.86"
上面的命令需要你有inputbag,然后它會把Bag Time<=1284703931.86的部分提取出來,重新放到一個新的ouput.bag里。這個命令在你bag文件很大你只需要其中一部分時還是很管用的。記錄圖片的rosbag動不動就幾十個G.
總是記住它最基礎(chǔ)的作用然后你根據(jù)你的需要去慢慢研究使用更高級的命令。
前面七講我們說了發(fā)布接收了那么多數(shù)據(jù),是時候把數(shù)據(jù)可視化一下了。下一講我們學習一下rviz的基礎(chǔ),這是ros自帶的強大的可視化程序。