測(cè)對(duì)比與選型指南)
做2D激光SLAM算法對(duì)比這件事我拖了小半年才真正動(dòng)手。之前一直在單測(cè)Gmapping和Cartographer總覺得“四種算法放到同一臺(tái)機(jī)器、同一個(gè)場(chǎng)景里跑一遍”很麻煩——要處理不同的參數(shù)接口、調(diào)不同的建圖模式還要保證運(yùn)動(dòng)軌跡一致想想就頭大。但后來給一個(gè)客戶做倉儲(chǔ)AGV方案對(duì)方直接問“你們用哪個(gè)算法和另外幾種比到底好在哪里”我發(fā)現(xiàn)自己居然沒法用一份自測(cè)數(shù)據(jù)回答這才下定決心把這事徹底補(bǔ)上。這篇文章就用我實(shí)際跑出來的結(jié)果說話把這四種2D激光SLAM算法的建圖效果、適用邊界、調(diào)參體驗(yàn)一次講透。無論你是在做掃地機(jī)器人、服務(wù)機(jī)器人還是剛接觸SLAM建圖準(zhǔn)備入門的開發(fā)者都能從中找到適合自己的選型思路。1. 算法選型第一步四種經(jīng)典方案的核心原理與適應(yīng)邊界很多人一上來就問“哪個(gè)算法建圖最準(zhǔn)”這個(gè)問題本身就是外行問法。SLAM算法沒有絕對(duì)好壞只有適合不適合關(guān)鍵看你的機(jī)器人底盤有沒有里程計(jì)、現(xiàn)場(chǎng)環(huán)境有沒有明顯的回環(huán)、處理器算力夠不夠。在對(duì)比實(shí)測(cè)之前我先把四種算法的血統(tǒng)和脾氣梳理清楚。1.1 Gmapping粒子濾波代表小場(chǎng)景建圖的性價(jià)比之選Gmapping基于Rao-Blackwellized粒子濾波RBPF框架核心思路是用一組粒子表示機(jī)器人可能的軌跡每個(gè)粒子維護(hù)一張地圖通過不斷更新粒子的權(quán)重來逼近真實(shí)位姿。它的關(guān)鍵優(yōu)勢(shì)在于對(duì)激光雷達(dá)的噪聲和底盤的里程計(jì)誤差都有不錯(cuò)的容忍度——因?yàn)樗堰\(yùn)動(dòng)模型的預(yù)測(cè)和激光觀測(cè)的修正結(jié)合在了一起。當(dāng)年開源的時(shí)候Gmapping幾乎成了ROS社區(qū)2D建圖的默認(rèn)選擇直到今天仍然有大量老項(xiàng)目在跑它。但它的短板也很明顯粒子數(shù)量直接決定計(jì)算量粒子太少容易丟真實(shí)軌跡粒子太多又讓CPU吃不消。另外它只能維護(hù)小規(guī)模地圖在幾百平方米的范圍內(nèi)表現(xiàn)穩(wěn)定一旦場(chǎng)景擴(kuò)大到數(shù)千平方米或者出現(xiàn)長距離閉環(huán)粒子退化的問題就會(huì)讓建圖徹底翻車。1.2 Hector SLAM不用里程計(jì)也能出圖的應(yīng)急方案Hector SLAM走的是另一條路——它完全不依賴?yán)锍逃?jì)只靠激光掃描和已有地圖的匹配來估計(jì)位姿數(shù)學(xué)上用的是Gauss-Newton優(yōu)化把當(dāng)前幀激光點(diǎn)投影到柵格地圖上通過最小化占用概率差異來求最優(yōu)位姿。它的地圖用兩層?xùn)鸥駌esolutor和superresolutor同時(shí)維護(hù)低分辨率層負(fù)責(zé)粗略匹配高分辨率層做精細(xì)對(duì)齊。因?yàn)闆]有里程計(jì)約束Hector非常依賴激光雷達(dá)自身的頻率和精度更適合手持設(shè)備、無人機(jī)這類裝不了高質(zhì)量輪式里程計(jì)的場(chǎng)合。問題在于Hector沒有回環(huán)檢測(cè)能力。建圖過程中一旦出現(xiàn)匹配錯(cuò)誤錯(cuò)誤就會(huì)一直累積下去地圖后面部分會(huì)越來越歪。我見過不少新手在坑坑洼洼的地面上推著機(jī)器人跑Hector結(jié)果走廊盡頭的地圖直接扭成了S形就是這個(gè)原因。1.3 Karto SLAM圖優(yōu)化的早期布道者Karto SLAM是最早把圖優(yōu)化Graph Optimization思路做成開源實(shí)現(xiàn)的2D激光SLAM之一。它的做法是把機(jī)器人的每個(gè)位姿當(dāng)作圖中的節(jié)點(diǎn)把相鄰位姿之間的相對(duì)約束當(dāng)成邊然后用稀疏位姿調(diào)整SBA/SPA對(duì)整張圖做全局優(yōu)化。相比Gmapping和HectorKarto的最大進(jìn)步是引入了顯式的回環(huán)檢測(cè)——當(dāng)機(jī)器人回到曾經(jīng)到過的位置時(shí)算法能識(shí)別出這條約束把累積的漂移拉回來。所以在大場(chǎng)景測(cè)試中Karto的表現(xiàn)通常比前兩者穩(wěn)。但Karto的回環(huán)檢測(cè)比較簡單默認(rèn)條件下比較容易產(chǎn)生誤匹配在對(duì)稱環(huán)境或者布滿相似墻體的倉庫里回環(huán)邊可能給你胡亂加上反而把原本還算平整的地圖拉壞。這也是后來Cartographer著重優(yōu)化的點(diǎn)。1.4 Cartographer工業(yè)級(jí)閉環(huán)利器復(fù)雜場(chǎng)景的兜底選擇Cartographer是Google開源的項(xiàng)目在工程化程度上比前三個(gè)高出一個(gè)身位。它的核心設(shè)計(jì)是局部子圖submap加全局回環(huán)兩層結(jié)構(gòu)局部地用Ceres非線性優(yōu)化來把當(dāng)前激光幀匹配到最近的子圖里同時(shí)維持一個(gè)全局位姿圖定期做分支定界搜索來閉環(huán)。Cartographer還支持融合IMU和里程計(jì)的多傳感器輸入并且在架構(gòu)上把局部建圖和全局優(yōu)化徹底分離可以異步運(yùn)行。這意味著它在大面積、多回環(huán)的工業(yè)場(chǎng)景里建圖精度和穩(wěn)定性遠(yuǎn)超其他三種。代價(jià)是編譯安裝復(fù)雜、參數(shù)極多、占用資源相對(duì)高對(duì)剛?cè)腴T的開發(fā)者并不友好。而且它內(nèi)部有一些“隱含前置條件”比如純2D激光雷達(dá)在無特征環(huán)境里也容易出現(xiàn)“環(huán)閉崩壞”這個(gè)后文細(xì)說。2. 同一場(chǎng)地、同一底盤、同一行程公平對(duì)比實(shí)驗(yàn)設(shè)計(jì)為了避免“田忌賽馬”式的對(duì)比我把四種算法放在同一臺(tái)機(jī)器人上、用同一份rosbag回放數(shù)據(jù)跑確保輸入完全一致。下面說一下測(cè)試環(huán)境、數(shù)據(jù)采集和評(píng)價(jià)方式的細(xì)節(jié)。2.1 硬件平臺(tái)與軟件環(huán)境我用的是自研的兩輪差速底盤前輪帶編碼器輸出50Hz的里程計(jì)信息。激光雷達(dá)用了單線機(jī)械雷達(dá)10Hz掃描頻率標(biāo)稱測(cè)距范圍30米角分辨率0.18度在測(cè)試環(huán)境下實(shí)測(cè)有效測(cè)距大約20米。主控板是一塊Jetson Xavier NX理論算力足夠同時(shí)跑四種算法但我會(huì)單獨(dú)記錄每種的CPU占用率。軟件環(huán)境是Ubuntu 20.04加ROS Noetic。這里給新手提個(gè)醒Gmapping、Hector、Karto在ROS1下的驅(qū)動(dòng)包都相對(duì)成熟直接apt安裝就行Cartographer則建議直接用官方提供的install腳本編譯不要自己瞎改依賴版本否則光是ceres-solver就能折騰你半天。2.2 測(cè)試場(chǎng)地的三種典型場(chǎng)景我在同一個(gè)園區(qū)里選了三條典型路線閉合走廊場(chǎng)景約400米周長有轉(zhuǎn)角、有玻璃幕墻、有少量行人走動(dòng)。用來測(cè)試回環(huán)能力和弱紋理環(huán)境的表現(xiàn)。大廠房場(chǎng)景面積約1500平方米貨架整齊排列存在大量相似紋理頂部有鋼結(jié)構(gòu)橫梁。這是倉庫AGV的典型工況。辦公區(qū)混合場(chǎng)景有開放工位、隔斷、走廊盡頭死路動(dòng)態(tài)人員較多用來模擬服務(wù)機(jī)器人。三條路線我都用遙控器以相近速度約0.5m/s跑完采集bag后分別喂給四個(gè)算法。這里要額外提醒rosbag回放時(shí)激光和里程計(jì)必須帶時(shí)間戳同步否則不同算法對(duì)消息時(shí)序的敏感度差異會(huì)直接影響結(jié)果這種誤差比算法本身的差距還大。2.3 評(píng)價(jià)指標(biāo)不只看地圖好不好看還看過程消耗我把評(píng)價(jià)拆成三組指標(biāo)地圖質(zhì)量定性項(xiàng)墻體邊緣是否平直、轉(zhuǎn)角是否保持90度、重復(fù)紋理區(qū)域是否錯(cuò)位、閉環(huán)處是否重影。軌跡誤差定量項(xiàng)利用建圖過程中機(jī)器人經(jīng)過已知坐標(biāo)標(biāo)記點(diǎn)時(shí)地圖與實(shí)際位置的偏差來估算漂移量另外看閉環(huán)處的軌跡跳變值。工程成本項(xiàng)每種算法跑完一遍花的時(shí)間、峰值CPU占用、參數(shù)調(diào)優(yōu)消耗的嘗試次數(shù)。后兩項(xiàng)在純展示“建圖效果”的視頻里沒人會(huì)提但在實(shí)際工程項(xiàng)目里這些往往是決定選型的隱形關(guān)鍵。3. 建圖效果實(shí)測(cè)對(duì)比同樣一圈跑下來地圖差距肉眼可見這一章是這篇文章的核心我把三條路線里最有代表性的地圖現(xiàn)象梳理出來。需要先說明以下結(jié)論來自我的測(cè)試條件和參數(shù)配置換一臺(tái)雷達(dá)、換一種底盤絕對(duì)數(shù)值會(huì)有變化但在趨勢(shì)上有參考意義。3.1 走廊閉合場(chǎng)景Gmapping和Hector的拐點(diǎn)錯(cuò)位Karto和Cartographer的閉環(huán)對(duì)比在這個(gè)長走廊場(chǎng)景里Gmapping跑出來的地圖整體輪廓完整但轉(zhuǎn)角處有明顯的內(nèi)收變形。原因是走廊環(huán)境特征單一粒子濾波在機(jī)器人轉(zhuǎn)彎時(shí)容易出現(xiàn)“對(duì)稱歧義”粒子分布一分散地圖邊緣就顯得不那么銳利。不過它勝在穩(wěn)定從頭到尾沒有崩壞只是不夠好看。Hector的表現(xiàn)就差一些。因?yàn)闆]有里程計(jì)校正每次經(jīng)過輕微顛簸的路面時(shí)匹配誤差都會(huì)悄悄累積。跑到第二圈、回到起點(diǎn)附近時(shí)起點(diǎn)位置的墻體邊界已經(jīng)出現(xiàn)了約0.3~0.5米的錯(cuò)位整個(gè)走廊被拉長了一小截。這就是沒有回環(huán)的代價(jià)。Karto在閉環(huán)處給出了不錯(cuò)的表現(xiàn)——當(dāng)機(jī)器人回到起點(diǎn)附近時(shí)回環(huán)檢測(cè)能把累計(jì)漂移拉回大部分地圖起點(diǎn)處的重合誤差大概在0.1米以內(nèi)。但仔細(xì)觀察會(huì)發(fā)現(xiàn)它把靠近玻璃幕墻的那一段墻體拉得略微傾斜因?yàn)榧す庠诓A系姆瓷潼c(diǎn)本身就不穩(wěn)定回環(huán)邊把錯(cuò)誤的觀測(cè)也當(dāng)作約束加進(jìn)了全局優(yōu)化。Cartographer是唯一在三個(gè)閉環(huán)位置都做到幾乎無縫拼接的算法。它靠子圖機(jī)制把錯(cuò)誤控制在局部范圍全局優(yōu)化只在真正檢測(cè)到可靠回環(huán)時(shí)才起作用。最終地圖上墻體的厚度均勻、轉(zhuǎn)角尖銳基本達(dá)到了商用交付水平。3.2 大廠房相似紋理場(chǎng)景誤匹配率決定地圖成敗大廠房才是真正拉開差距的場(chǎng)地。這里貨架排列高度相似算法很難區(qū)分“這個(gè)貨架和那個(gè)貨架”非??简?yàn)回環(huán)檢測(cè)的魯棒性。Gmapping在這種場(chǎng)景下基本上在用直覺硬撐。粒子濾波依賴概率分布相似場(chǎng)景多了以后粒子會(huì)分散到多個(gè)“看起來都很像”的位置地圖里出現(xiàn)不少錯(cuò)位的“幽靈貨架”整體完整性受影響較大。Hector在重復(fù)紋理區(qū)域幾乎是無差別匹配經(jīng)常跳變到對(duì)稱位置然后把后續(xù)掃描全部帶偏。我的測(cè)試?yán)锼慌芡炅饲鞍攵魏蟀攵蔚貓D已經(jīng)嚴(yán)重扭曲只能重新來過。Karto比前兩者好很多但在某些回環(huán)時(shí)刻我還是能在rviz里看到它突然把整張圖擰了一下——這是誤回環(huán)導(dǎo)致的全局優(yōu)化崩壞。后來我把回環(huán)檢測(cè)的閾值調(diào)高、限制最大回環(huán)距離情況改善了一些。Cartographer依然是全場(chǎng)最穩(wěn)的。它的分支定界搜索策略要求候選匹配達(dá)到足夠高的評(píng)分才會(huì)被接受誤回環(huán)比Karto少一個(gè)數(shù)量級(jí)在相似紋理的大空間里依然能保持地圖整體結(jié)構(gòu)正確。3.3 辦公區(qū)動(dòng)態(tài)場(chǎng)景動(dòng)態(tài)障礙物過濾與地圖“臟點(diǎn)”對(duì)比辦公區(qū)測(cè)試?yán)锶俗邅碜呷ナ浅B(tài)。建圖時(shí)如果算法把所有動(dòng)態(tài)點(diǎn)都塞進(jìn)地圖后續(xù)導(dǎo)航會(huì)產(chǎn)生大量誤障礙物。我的觀察是四種算法在默認(rèn)配置下對(duì)動(dòng)態(tài)障礙物的處理能力都不算好但程度有區(qū)別。Gmapping的地圖里動(dòng)態(tài)人物會(huì)留下淡淡的“影子”因?yàn)榱W訛V波更新時(shí)對(duì)柵格占用概率的更新比較慢人走過去留下的痕跡要隔幾秒才消退Hector幾乎不動(dòng)動(dòng)態(tài)點(diǎn)因?yàn)槿鄙贂r(shí)間域?yàn)V波建出來的地圖里全是短暫出現(xiàn)的“飛點(diǎn)”Karto的表現(xiàn)居中Cartographer在配合高更新頻率時(shí)動(dòng)態(tài)點(diǎn)的影響最小這是因?yàn)樗淖訄D更新時(shí)間窗口較窄動(dòng)態(tài)點(diǎn)在多數(shù)情況下不會(huì)固化進(jìn)全局地圖。需要說明的是如果要真正做動(dòng)態(tài)環(huán)境建圖這四種算法都需要外接動(dòng)態(tài)目標(biāo)過濾節(jié)點(diǎn)比如基于激光點(diǎn)云背景差分的過濾器不能指望算法自己解決。4. 按數(shù)據(jù)說話軌跡精度、資源消耗與調(diào)參難度橫向打分上一章定性的地圖現(xiàn)象最終還是要落到具體數(shù)值上。我整理了一張橫向?qū)Ρ缺頂?shù)值是在前述三種測(cè)試場(chǎng)景下多次運(yùn)行取的中位數(shù)具體數(shù)值因環(huán)境會(huì)有浮動(dòng)但排序關(guān)系比較穩(wěn)定。4.1 軌跡精度與地圖貼合度指標(biāo)GmappingHector SLAMKarto SLAMCartographer閉環(huán)處重影走廊場(chǎng)景/最大縫隙約0.15米不閉環(huán)約0.4米錯(cuò)位約0.08米約0.03米相似紋理誤回環(huán)次數(shù)廠房場(chǎng)景不適用/無回環(huán)不適用/無回環(huán)2~3次可調(diào)整0~1次建圖完成后地圖整體傾斜度輕微內(nèi)收中等漂移輕微傾斜基本無對(duì)里程計(jì)的依賴強(qiáng)無里程計(jì)不能用無中有更好弱有IMU更好從地圖貼合度來說Cartographer在各場(chǎng)景中都排名第一尤其是帶多層回環(huán)的大空間它屬于“唯一能交付的”。Karto排名第二前提是你愿意花時(shí)間調(diào)回環(huán)閾值。Gmapping和Hector更適合作為快速原型階段的工具而不是最終交付方案。4.2 CPU資源占用與建圖速度算法峰值CPU占用Xavier NX 6核單場(chǎng)景建圖耗時(shí)約10分鐘bag內(nèi)存占用峰值Gmapping30粒子約25%約6分鐘約1.2GBHector約15%約8分鐘約800MBKarto約35%約9分鐘約1.5GBCartographer默認(rèn)配置約70%約7分鐘約2GB我這里測(cè)的是建圖模式還沒開實(shí)時(shí)定位模式。如果用同一套配置去跑在線SLAM并實(shí)時(shí)發(fā)布地圖Cartographer的CPU占用會(huì)更高在算力有限的低成本主控上很可能讓導(dǎo)航模塊一起卡頓。這是選型時(shí)值得權(quán)衡的點(diǎn)——精度是用算力換來的。4.3 調(diào)參難度排名從快速上手到深度調(diào)優(yōu)調(diào)參體驗(yàn)是新手最關(guān)心、也最容易忽略的一環(huán)。我的經(jīng)驗(yàn)打分如下最容易上手Gmapping。核心參數(shù)就那么幾個(gè)——粒子數(shù)、更新距離閾值、最大測(cè)距范圍調(diào)幾輪就能出圖。默認(rèn)參數(shù)在很多場(chǎng)景下就能跑通。次之Hector。需要調(diào)的主要是地圖分辨率、多分辨率層數(shù)、更新頻率參數(shù)數(shù)量不多但很敏感。尤其地圖分辨率設(shè)太高會(huì)導(dǎo)致實(shí)時(shí)匹配跟不上設(shè)太低會(huì)讓圖糊成一片。中等Karto。需要理解回環(huán)檢測(cè)、掃描匹配器、位姿圖優(yōu)化等概念參數(shù)分布在多個(gè)配置文件里新手容易漏調(diào)某處導(dǎo)致性能上不去。最難Cartographer。原生參數(shù)實(shí)現(xiàn)復(fù)雜光是lua配置里的參數(shù)就有數(shù)十個(gè)還涉及IMU權(quán)重、子圖大小、全局搜索采樣率等隱含概念。我建議新手先用官方默認(rèn)配置跑通再逐項(xiàng)調(diào)優(yōu)化目標(biāo)權(quán)重。5. 沖出建圖環(huán)節(jié)之后定位、導(dǎo)航和長期運(yùn)行的隱性成本建圖只是SLAM應(yīng)用的第一步。地圖建得好不好最終要體現(xiàn)在導(dǎo)航定位穩(wěn)不穩(wěn)、長期更新是否容易上。這一章聊聊我在把這些地圖投入實(shí)際導(dǎo)航系統(tǒng)之后發(fā)現(xiàn)的坑。5.1 從“好看的圖”到“能用的圖”地圖分辨率與代價(jià)不少人在rviz里看到一張漂亮的地圖就直接說“建圖成功”但放到move_base里做路徑規(guī)劃時(shí)才發(fā)現(xiàn)問題地圖分辨率通常0.05米每像素如果和定位初值偏差不在一個(gè)量級(jí)AMCL重定位會(huì)頻繁丟失導(dǎo)航時(shí)機(jī)器人會(huì)在地圖邊緣“抽風(fēng)”。從我的測(cè)體驗(yàn)來看Hector建出來的地圖因?yàn)榇嬖诶鄯e漂移在后續(xù)做AMCL定位時(shí)最容易出問題哪怕局部地圖再清晰全局坐標(biāo)框架是歪的導(dǎo)航就會(huì)跟著歪。Gmapping的地圖比較“穩(wěn)”但邊緣有噪點(diǎn)膨脹層半徑稍微調(diào)小一點(diǎn)就容易讓機(jī)器人貼墻太近。Karto和Cartographer建出的地圖在導(dǎo)航階段表現(xiàn)更好因?yàn)槿终`差小amcl粒子不需要在很大范圍內(nèi)反復(fù)撒網(wǎng)。5.2 地圖更新與閉環(huán)后的“二次破壞”我犯過一個(gè)典型錯(cuò)誤先用Cartographer建好一張廠房地圖后面因?yàn)樨浖苷{(diào)整需要局部更新地圖。結(jié)果局部重新建圖后整個(gè)全局地圖的變形比之前更大。這是因?yàn)樗惴ㄔ谌謨?yōu)化時(shí)會(huì)重新調(diào)整所有子圖的位姿局部更新會(huì)牽動(dòng)全局。如果你也遇到類似問題我的建議是建圖時(shí)盡量一次性把所有區(qū)域跑完不要分多次拼接迫不得已要更新時(shí)干脆清空局部區(qū)域重新建一張全圖省下來的時(shí)間不如重新來一次。5.3 從2D激光SLAM走向視覺SLAM或多傳感器融合我在實(shí)際項(xiàng)目里經(jīng)常遇到客戶從2D激光SLAM向更高精度定位方案升級(jí)的需求。如果你的建圖環(huán)境存在大量坡道、懸空物體、透明玻璃墻2D激光雷達(dá)本身就存在物理上的局限這時(shí)候就得考慮視覺SLAM或者多線激光雷達(dá)融合IMU的方案。2D激光SLAM的四套算法其實(shí)都把“平面世界”假設(shè)發(fā)揮到了極致。一旦環(huán)境不滿足這個(gè)假設(shè)比如機(jī)器人經(jīng)過減速帶時(shí)俯仰角變化過大Hector會(huì)瞬間丟失匹配Cartographer如果沒有IMU輔助也很容易掛掉。所以做復(fù)雜地形機(jī)器人時(shí)別再糾結(jié)這四種算法誰更強(qiáng)直接上3D方案或視覺慣性方案更省事。6. 踩坑實(shí)錄參數(shù)調(diào)試?yán)镒钊菀追傅膸讉€(gè)錯(cuò)誤最后把我這幾年調(diào)試這些算法時(shí)踩過的坑集中寫出來多數(shù)問題不在算法本身而是配置和操作順序出了偏差。6.1 Gmapping粒子數(shù)調(diào)到100反而更差剛接觸Gmapping時(shí)我迷信“粒子越多越精確”直接把粒子數(shù)調(diào)到100和200結(jié)果地圖不但沒有變得更清晰反而墻邊出現(xiàn)了大量摩擦感很重的噪點(diǎn)。原因是粒子數(shù)增多后重采樣過程更頻繁高頻噪聲更容易被留在柵格概率里。后來我回到30個(gè)粒子地圖反而干凈了。粒子數(shù)不是精度指標(biāo)它只是概率分布的表達(dá)精度超過環(huán)境復(fù)雜度需求之后只會(huì)增加噪聲和計(jì)算量。6.2 Hector在高分辨率地圖下的實(shí)時(shí)性陷阱做手持激光掃描時(shí)我把地圖分辨率設(shè)成了0.025米覺得這樣地圖會(huì)細(xì)膩很多結(jié)果Hector的匹配更新率直線下降機(jī)器人稍微動(dòng)快一點(diǎn)地圖就開始撕裂。還是那句話Hector完全依賴激光幀間匹配分辨率設(shè)得太高匹配算法來不及收斂反而得不償失。后來我保持在0.05米并在機(jī)器上加裝了IMU做姿態(tài)補(bǔ)償效果才穩(wěn)定下來。6.3 Karto的誤回環(huán)在裝修現(xiàn)場(chǎng)特別明顯有次客戶辦公室正在施工走廊里立了不少高度相似的分隔板Karto在跑到后半程時(shí)突然把所有分隔板的位置全部拉到了一起整張地圖像被捏變形了。排查后發(fā)現(xiàn)是激光在板間空隙產(chǎn)生了相似的射程模式回環(huán)檢測(cè)把它們當(dāng)成了同一位置。我當(dāng)時(shí)把回環(huán)檢測(cè)的最小響應(yīng)閾值提高了一截并限制了回環(huán)距離在15米內(nèi)問題才緩解。如果你在現(xiàn)場(chǎng)看到Karto地圖突然“擰”了一下優(yōu)先懷疑回環(huán)誤匹配而不是里程計(jì)漂移。6.4 Cartographer的“回環(huán)已優(yōu)化”不代表地圖一定正確Cartographer的回環(huán)能力強(qiáng)但它增加的約束如果和真實(shí)位姿不一致全局優(yōu)化也會(huì)把原本正確的地圖拉歪。我有一次在一條環(huán)形走廊里建圖因?yàn)榧す庠谀承﹨^(qū)域只測(cè)到單側(cè)墻體子圖約束完全依賴?yán)锍逃?jì)推算結(jié)果回環(huán)被認(rèn)為“成功閉合”但走廊的半徑被優(yōu)化得比實(shí)際小了不少。排查方法是在生成地圖后用卷尺實(shí)測(cè)幾個(gè)關(guān)鍵點(diǎn)之間的距離不要只看閉環(huán)處是否對(duì)齊。7. 如果讓我重新選一次按項(xiàng)目類型直接給結(jié)論寫到這里我不再重復(fù)那些詳細(xì)的對(duì)比數(shù)據(jù)直接給出實(shí)踐中驗(yàn)證過的選型結(jié)論。這幾種算法我都實(shí)際調(diào)過、翻過車、補(bǔ)救過下面的建議都是踩過坑之后的條件反射。如果項(xiàng)目是小型室內(nèi)服務(wù)機(jī)器人比如餐廳送餐、酒店引導(dǎo)地圖面積在幾百平方米以內(nèi)運(yùn)行環(huán)境相對(duì)規(guī)則Gmapping是最高效的選擇。它部署快、參數(shù)少、對(duì)底盤要求低項(xiàng)目周期能壓得很短。你不需要為了追求地圖好看多花兩周去調(diào)Cartographer。如果項(xiàng)目是無人機(jī)或者無法安裝輪式里程計(jì)的手持掃描設(shè)備Hector仍然值得考慮但前提是你愿意接受它沒有回環(huán)這個(gè)硬傷并且會(huì)額外引入IMU來做姿態(tài)輔助。它的應(yīng)用場(chǎng)景狹窄但在特定條件下確實(shí)沒有替代品。如果項(xiàng)目是倉儲(chǔ)AGV或工業(yè)巡檢機(jī)器人地圖面積動(dòng)輒上千平方米還有大量相似貨架Cartographer基本是當(dāng)前2D激光SLAM方案里最穩(wěn)妥的選擇。算力不夠的話Karto可以作為降級(jí)替換但要預(yù)留調(diào)回環(huán)參數(shù)的時(shí)間。需要提前考慮的是這臺(tái)機(jī)器人是否最終做長期運(yùn)行和定位如果是我會(huì)直接跳過Gmapping和Hector不要糾結(jié)。如果你只是自己在家里折騰一個(gè)ROS機(jī)器人、跑跑Gazebo仿真我的建議是四種算法都裝起來用小場(chǎng)景的數(shù)據(jù)分別跑一遍親自觀察地圖差異。很多SLAM概念——子圖、回環(huán)、粒子退化、掃描匹配——光看理論記不住親手跑幾遍地圖對(duì)比理解會(huì)深很多。建圖所用的rosbag還可以反復(fù)利用這也是最快的學(xué)習(xí)路徑。結(jié)尾寫這篇文章前我一直覺得算法對(duì)比這類內(nèi)容網(wǎng)上已經(jīng)很充足真正跑完才意識(shí)到零散的經(jīng)驗(yàn)和實(shí)測(cè)的結(jié)論之間隔著很多細(xì)節(jié)。不同算法對(duì)同一份數(shù)據(jù)的反應(yīng)差異是真的很大參數(shù)、環(huán)境、硬件都會(huì)改變最終結(jié)果。如果你也在做SLAM建圖的選型或者面試準(zhǔn)備希望這份實(shí)測(cè)記錄能幫你省掉一些我走過的彎路。后面如果有機(jī)會(huì)我再把手持建圖、多傳感器融合方向的實(shí)際案例整理出來繼續(xù)聊。