上集
將rosbag的數據feed給lego-loam,輸出地圖。另外寫了一個濾波節點,訂閱地圖,進行濾波操作,再發布出來。
由於輸入給lego-loam的數據來自於rosbag,所以需要rosbag提供時間信息。
rosbag play --clock recorded1.bag
由於rosbag的數據發布頻率比較快,導致了一個結果。rosbag播放完畢,時鍾停止,濾波節點中緩存了幾個數據還沒有處理完畢。失去了時鍾信息,濾波節點停止運行,但是沒有輸出報錯信息!!!
個人心得:濾波節點有兩個獨立的線程,一個是callback函數線程,一個是main函數線程,進而導致print出來的信息排布混亂。沒有花時間整理print出來的信息,也就沒能及時發現main函數線程因為缺失了時間信息而停止運行。因此,但凡遇到莫名其妙的bug,即使沒有報錯信息,首要任務是結合print出來的信息整理代碼的邏輯,快速縮小范圍再逐步排查原因。
解決方案
1. 最佳
-k, --keep-alive
rosbag play -k --clock recorded1.bag
bag文件中的數據播放完畢以后,繼續提供時間信息。
2. 次佳
-r FACTOR, --rate=FACTOR
rosbag play -r 0.1 --clock recorded1.bag
將發布頻率降低為原來的10%,留給濾波節點足夠的時間進行處理。
下集
首先啟動 roscore ,這一步會啟動ros的時鍾,提供時鍾信息。
接着啟動lego-loam。
播放lego-loam的數據集, rosbag play --clock recorded1.bag 。這時候,啟動了另一個時鍾,導致roscore啟動的時鍾停止。所以,當rosbag播放完畢后,ros的時鍾完全停止。這時候運行ros會報各種莫名其妙的錯誤。
解決方案
重新運行 roscore !