cartographer理論概述

本文概述了Cartographer的理論及簡要的梳理了其開源實現(xiàn)代碼的邏輯袜腥,目的在于起到拋磚引玉的作用,為選擇性的研究相關(guān)理論及實現(xiàn)提供參考缓溅。

1.?Cartographer理論概述

Cartographer主要理論是通過閉環(huán)檢測來消除構(gòu)圖過程中產(chǎn)生的累積誤差[1]惠昔。用于閉環(huán)檢測的基本單元是submap。一個submap是由一定數(shù)量的laser scan構(gòu)成豹绪。將一個laser scan插入其對應(yīng)的submap時价淌,會基于submap已有的laser scan及其它傳感器數(shù)據(jù)估計其在該submap中的最佳位置。submap的創(chuàng)建在短時間內(nèi)的誤差累積被認(rèn)為是足夠小的瞒津。然而隨著時間推移蝉衣,越來越多的submap被創(chuàng)建后,submap間的誤差累積則會越來越大巷蚪。因此需要通過閉環(huán)檢測適當(dāng)?shù)膬?yōu)化這些submap的位姿進(jìn)而消除這些累積誤差病毡,這就將問題轉(zhuǎn)化成一個位姿優(yōu)化問題。當(dāng)一個submap的構(gòu)建完成時钓辆,也就是不會再有新的laser scan插入到該submap時剪验,該submap就會加入到閉環(huán)檢測中。閉環(huán)檢測會考慮所有的已完成創(chuàng)建的submap前联。當(dāng)一個新的laser scan加入到地圖中時功戚,如果該laser scan的估計位姿與地圖中某個submap的某個laser scan的位姿比較接近的話,那么通過某種?scan match策略就會找到該閉環(huán)似嗤。Cartographer中的scan match策略通過在新加入地圖的laser scan的估計位姿附近取一個窗口啸臀,進(jìn)而在該窗口內(nèi)尋找該laser scan的一個可能的匹配,如果找到了一個足夠好的匹配烁落,則會將該匹配的閉環(huán)約束加入到位姿優(yōu)化問題中乘粒。Cartographer的重點內(nèi)容就是融合多傳感器數(shù)據(jù)的局部submap創(chuàng)建以及用于閉環(huán)檢測的scan match策略的實現(xiàn)。


2.?開源代碼邏輯

Google開源的代碼包含兩個部分:cartographer[2]和cartographer_ros[3]伤塌。cartographer主要負(fù)責(zé)處理來自雷達(dá)灯萍、IMU和里程計的數(shù)據(jù)并基于這些數(shù)據(jù)進(jìn)行地圖的構(gòu)建,是cartographer理論的底層實現(xiàn)每聪。cartographer_ros則基于ros的通信機(jī)制獲取傳感器的數(shù)據(jù)并將它們轉(zhuǎn)換成cartographer中定義的格式傳遞給cartographer處理旦棉,與此同時也將cartographer的處理結(jié)果發(fā)布用于顯示或保存,是基于cartographer的上層應(yīng)用药薯。


3.?cartographer代碼結(jié)構(gòu)

common:定義了基本數(shù)據(jù)結(jié)構(gòu)以及一些工具的使用接口绑洛。

sensor:定義了雷達(dá)數(shù)據(jù)及點云等相關(guān)的數(shù)據(jù)結(jié)構(gòu)。

transform:定義了位姿的數(shù)據(jù)結(jié)構(gòu)及其相關(guān)的轉(zhuǎn)換童本。

kalman_filter:?主要通過kalman濾波器完成對IMU真屯、里程計及基于雷達(dá)數(shù)據(jù)的估計位姿的融合,進(jìn)而估計新進(jìn)的laser scan的位姿穷娱。

mapping:定義了上層應(yīng)用的調(diào)用接口以及局部submap構(gòu)建和基于閉環(huán)檢測的位姿優(yōu)化等的接口绑蔫。

mapping_2d和mapping_3d:對mapping接口的不同實現(xiàn)运沦。


4.?mapping_2d代碼邏輯

4.1 cartographer::mapping_2d:: GlobalTrajectoryBuilder

cartographer::mapping_2d::GlobalTrajectoryBuilder類主要實現(xiàn)了接收處理上層應(yīng)用傳遞的傳感器數(shù)據(jù)的主要接口:

(1)??????AddImuData用于接收處理上層應(yīng)用傳遞的IMU數(shù)據(jù)。

(2)??????AddOdometerPose用于接收處理上層應(yīng)用傳遞的里程計數(shù)據(jù)晾匠。

(3)??????AddHorizontalLaserFan用于接收處理上層應(yīng)用傳遞的雷達(dá)數(shù)據(jù)茶袒。

其中包含重要的對象成員:

(1)??????artographer::mapping_2d::LocalTrajectoryBuilder類的對象local_trajectory_builder_用于完成局部submap的構(gòu)建。

(2)??????cartographer::mapping_2d::SparsePoseGraph類的對象sparse_pose_graph_用于完成閉環(huán)檢測及全局位姿優(yōu)化凉馆。

在AddImuData和AddOdometerPose函數(shù)的實現(xiàn)中會將接收的相應(yīng)傳感器數(shù)據(jù)傳遞給local_trajectory_builder_對象處理。在AddHorizontalLaserFan函數(shù)的實現(xiàn)中則將新進(jìn)的laser fan傳遞給local_trajector_builder_對象用于局部submap構(gòu)建亡资,如果該laser fan被成功插入到某個submap澜共,那么該laser fan被插入后的相關(guān)信息則被傳遞給sparse_pose_graph_對象用于基于閉環(huán)檢測的全局位姿優(yōu)化。


4.2 cartographer::mapping_2d::LocalTrajectoryBuilder

cartographer::mapping_2d::LocalTrajectoryBuilder類主要完成局部submap的構(gòu)建锥腻。其提供了接收處理傳感器數(shù)據(jù)的public函數(shù):

(1)??????AddImuData用于處理IMU數(shù)據(jù)嗦董。

(2)??????AddOdometerPose用于處理里程計數(shù)據(jù)。

(3)??????AddHorizontalLaserFan用于處理雷達(dá)數(shù)據(jù)瘦黑。

以及包含了一些重要的private成員:

(1)??????ScanMatch成員函數(shù)基于submap已有的laser fan估計當(dāng)前l(fā)aser fan在submap中的位置京革。

(2)??????cartographer::kalman_filter::PoseTracker類的對象

pose_tracker_

用于融合基于雷達(dá)數(shù)據(jù)的laser fan的局部估計位姿、IMU數(shù)據(jù)以及里程計數(shù)據(jù)幸斥,進(jìn)而估計出較優(yōu)的laser fan的位姿匹摇。

在AddImuData和AddOdometerPose函數(shù)中會將IMU數(shù)據(jù)和里程計數(shù)據(jù)傳遞給pose_tracker_進(jìn)行處理。pose_tracker通過UKF不斷融合IMU和里程計數(shù)據(jù)進(jìn)而更新當(dāng)前位姿甲葬,因此通過pose_tracker可以獲取當(dāng)前l(fā)aser fan的估計位姿的一個較好的初始化值廊勃。進(jìn)一步的,在AddHorizontalLaserFan函數(shù)中會調(diào)用ScanMatch经窖,ScanMatch函數(shù)中通過在submap中局部匹配得到的當(dāng)前l(fā)aser fan的估計位姿被pose_tracker_用來調(diào)整該laser fan的初始化值坡垫。這樣pose_tracker_通過融合多傳感器數(shù)據(jù),進(jìn)而能夠估計出較優(yōu)的laser fan的位姿画侣。


4.3?cartographer::mapping_2d::SparsePoseGraph

cartographer::mapping_2d::SparsePoseGraph類主要完成基于閉環(huán)檢測的全局位姿優(yōu)化冰悠。其提供了接收處理新進(jìn)被插入到submap的laser fan相關(guān)信息的public函數(shù):

(1)??????AddScan?對新進(jìn)的laser fan進(jìn)行閉環(huán)檢測及在適當(dāng)?shù)臅r候進(jìn)行全局優(yōu)化。

以及一些重要的私有成員:

(1)??????ComputeConstraintsForScan對新近laser fan信息進(jìn)行處理并啟動閉環(huán)檢測scan match以及計算其約束配乱,進(jìn)而將約束添加到位姿優(yōu)化目標(biāo)中溉卓。

(2)??????AddWorkItem將laser fan與ComputeConstraintsForScan綁定,并將任務(wù)加入到隊列中宪卿。

(3)??????HandleScanQueue依此調(diào)度隊列中的任務(wù)的诵。

(4)??????sparse_pose_graph::ConstraintBuilder constraint_builder_?用于完成laser fan的scan match以及約束計算。

(5)??????RunOptimization優(yōu)化目標(biāo)佑钾。

在AddScan函數(shù)中會將laser fan相關(guān)信息與ComputeConstraintsForScan函數(shù)綁定西疤,并將綁定好的任務(wù)通過AddWorkItem函數(shù)加入到隊列中。HandleScanQueue函數(shù)則依次調(diào)度隊列中的任務(wù)休溶。第一次調(diào)用AddWorkItem時會直接啟動ComputeConstraintsForScan任務(wù)代赁,且在第一次ComputeConstraintsForScan任務(wù)時啟動HandleScanQueue調(diào)度扰她。在ComputeConstrainsScan中,通過constraint_builder_對象完成閉環(huán)檢測的scan match以及約束計算芭碍。當(dāng)所有約束計算完成時徒役,則會進(jìn)行RunOptimization優(yōu)化目標(biāo)。


4.4?Scan

Match

LocalTrajectoryBuilder中的scan match策略與SparsePoseGraph中的scan match策略是不同的窖壕。前者使用scan_matching::RealTimeCorrelativeScanMatcher忧勿,后者則使用scan_matching::FastCorrelativeScanMatcher。二者的目標(biāo)優(yōu)化均是由scan_matching::CeresScanMatcher完成瞻讽。

5.?總結(jié)

要將Cartographer的原理及實現(xiàn)詳細(xì)地講解清楚并不是短短兩千字能完成的鸳吸。為此,本文概述了Cartographer的理論及簡要的梳理了cartographer源碼的邏輯速勇,目的在于起到拋磚引玉的作用晌砾,進(jìn)而有利于選擇性的研究相關(guān)理論及實現(xiàn)。Cartographer的重點內(nèi)容是融合多傳感器數(shù)據(jù)的局部submap創(chuàng)建以及用于閉環(huán)檢測的scan match策略烦磁。重點內(nèi)容對應(yīng)的實現(xiàn)是:1)基于UKF的多傳感器數(shù)據(jù)融合對應(yīng)cartographer/kalman_filter目錄下的文件养匈;2)scan match策略對應(yīng)cartographer/mapping_2d/scan_matching目錄下的文件。后續(xù)有機(jī)會也會對這些重點內(nèi)容及實現(xiàn)進(jìn)行詳細(xì)地梳理都伪。


Reference:

[1] Wolfgang Hess., Damon Kohler., Holger

Rapp., Daniel. Andor. Real-time loop closure in 2D lidar slam.?

ICRA,?2016.

[2]

https://github.com/googlecartographer/cartographer

[3] https://github.com/googlecartographer/cartographer_ros

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末呕乎,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子院溺,更是在濱河造成了極大的恐慌楣嘁,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件珍逸,死亡現(xiàn)場離奇詭異逐虚,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)谆膳,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進(jìn)店門叭爱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人漱病,你說我怎么就攤上這事买雾。” “怎么了杨帽?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵漓穿,是天一觀的道長。 經(jīng)常有香客問我注盈,道長晃危,這世上最難降的妖魔是什么凝化? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任玉工,我火速辦了婚禮,結(jié)果婚禮上汹胃,老公的妹妹穿的比我還像新娘陨亡。我一直安慰自己至朗,他們只是感情好孕讳,可當(dāng)我...
    茶點故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布奇徒。 她就那樣靜靜地躺著,像睡著了一般偿乖。 火紅的嫁衣襯著肌膚如雪击罪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天贪薪,我揣著相機(jī)與錄音外邓,去河邊找鬼。 笑死古掏,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的侦啸。 我是一名探鬼主播槽唾,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼光涂!你這毒婦竟也來了庞萍?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤忘闻,失蹤者是張志新(化名)和其女友劉穎钝计,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體齐佳,經(jīng)...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡私恬,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了炼吴。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片本鸣。...
    茶點故事閱讀 39,965評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖硅蹦,靈堂內(nèi)的尸體忽然破棺而出荣德,到底是詐尸還是另有隱情,我是刑警寧澤童芹,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布涮瞻,位于F島的核電站,受9級特大地震影響假褪,放射性物質(zhì)發(fā)生泄漏署咽。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一嗜价、第九天 我趴在偏房一處隱蔽的房頂上張望艇抠。 院中可真熱鬧幕庐,春花似錦、人聲如沸家淤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽絮重。三九已至冤寿,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間青伤,已是汗流浹背督怜。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留狠角,地道東北人号杠。 一個月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像丰歌,于是被迫代替她去往敵國和親姨蟋。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,914評論 2 355