一點Cartographer的調(diào)參心得:前端篇
上一篇文章介紹了 Cartographer 里和傳感器有關(guān)系的參數(shù)調(diào)整(傳感器篇),這次介紹一些前端部分里經(jīng)常調(diào)的參數(shù)。
Cartographer 前端部分比較簡單,主要就是負(fù)責(zé)點云匹配和生成 Submap。
參數(shù)的配置文件是 trajectory_builder_2d.lua。
調(diào)參整前端的參數(shù)之前,最好先關(guān)閉后端,方便觀察參數(shù)調(diào)整后對建圖的直接影響,可以將下面三個參數(shù)設(shè)置成 0 來關(guān)閉后端:
前端中最重要的一個參數(shù)就是?submaps.num_range_data,這個參數(shù)決定了用多少幀點云來構(gòu)造一副 Submap,取值非常有講究,需要考慮到各個傳感器的精度和運行平臺的算力。通??梢灾苯涌紤] 30/60/90 三個值作為參數(shù)。
Submap 是基于圖優(yōu)化的 SLAM 算法的精髓,使用很多幅的 Submap?來構(gòu)成一幅大地圖,Submap 包含了若干個 Node,每個 Node 就是一幀點云。建圖過程中的累計誤差,就是通過后端的圖優(yōu)化算法調(diào)整每一副 Submap 的位姿來消除的,讓整體地圖形成最優(yōu)。
submaps.num_range_data?取值越小,每一副 Submap 內(nèi)的累計誤差就會越小,后端的參數(shù)調(diào)的合適,那最終得到的地圖質(zhì)量就是最好的。
我們可以從兩個角度來考慮?submaps.num_range_data?的取值,一個是累計誤差,另一個是性能。
前端會帶來累計誤差的來源有兩個,分別是點云匹配誤差和傳感器誤差。
如果說傳感器質(zhì)量真的很差,會帶來大量的誤差,那最好把?submaps.num_range_data?設(shè)置成 30,讓前端生成盡可能多的 Submap,每一副 Submap 的累計誤差盡可能少。但代價就是需要消耗更多內(nèi)存,后端優(yōu)化也會需要更多的算力,如果 CPU 性能不夠,會讓整個 SLAM 算法無法實時運行,建圖和定位都出現(xiàn)延遲。如果傳感器質(zhì)量非常好,那可以毫不猶豫的把參數(shù)值設(shè)置成 90,既不影響建圖質(zhì)量,也能降低計算資源需求。
第二部分要介紹的是點云匹配器相關(guān)的參數(shù),前端中有兩個匹配器,一個是 Real Time Correlative Scan Match,另一個是 Ceres Scan Match。
Real Time Correlative Scan Match?是前端部分中的第一個匹配器,通過 use_online_correlative_scan_matching 來開關(guān)。在 Submap 構(gòu)建的流程中該匹配器用于較大范圍較粗略的搜索點云在 Submap 上的位置,目的是為了盡可能的消除傳感器帶來的錯誤。
在點云匹配前,carto 會利用先前的位姿加上 IMU 和里程計的角速度線速度來預(yù)測當(dāng)前點云可能的位置,如果里程計和IMU的質(zhì)量比較差,很可能會預(yù)測出錯誤的結(jié)果,導(dǎo)致第二個匹配器在有限的迭代步驟內(nèi)無法匹配出正確的位姿,從而給 Submap 帶來點云匹配的累計誤差,這種因為匹配失敗帶來的誤差是無法消除的,一旦插入了 Submap ,那就會永遠出現(xiàn)在地圖上了,看起來就是一面墻在地圖上有兩條黑線或者是很糊很厚。
在 IMU 和里程計的不可靠或者是沒有這倆傳感器的情況下最好打開?use_online_correlative_scan_matching 。RTCSM 匹配器的參數(shù)里,兩個搜索窗口的參數(shù)是重點觀察對象,real_time_correlative_scan_matcher.linear_search_window 和?real_time_correlative_scan_matcher.angular_search_window,這兩個參數(shù)作用指定 RTCSM 在預(yù)測位置的平移半徑和旋轉(zhuǎn)角度范圍內(nèi)進行搜索,linear_search_window?的單位是米,angular_search_window?的單位是弧度。
設(shè)置這兩個參數(shù)有一個比較直接好用的技巧,那就是先把兩個值都設(shè)置的很大,例如 1 和 math.rad(90),然后修改 carto 的源碼,?位置是?local_trajectory_builder_2d.cc 里的?AddAccumulatedRangeData 函數(shù),把函數(shù)內(nèi)的預(yù)測位姿 pose_prediction 和最終匹配位姿 pose_estimate_2d 都記錄下來,建圖完成后計算全部預(yù)測位姿和匹配位姿中的最大距離差和角度差,把這個差值作為兩個搜索窗口的參數(shù)值。
如果IMU和里程計都非??煽?,精度非常高,預(yù)測位姿和匹配位姿的差很小很小,可以嘗試關(guān)閉 RTCSM 匹配器,節(jié)約計算資源。當(dāng)搜索窗口設(shè)置的太大的時候,會消耗大量的內(nèi)存和算力,如果運行平臺的性能無法支撐,可以考慮關(guān)閉 IMU 和 里程計數(shù)據(jù)的輸入,只用激光雷達,同時保證機器人移動的盡可能慢和平滑,只有激光雷達的情況下 carto 會假設(shè)機器人是勻速移動,使用先前的兩個匹配位姿計算預(yù)估位姿。
未完待續(xù),等有空再更新