catographer框架分為前端和后端
前端包括雷達數據處理;位姿預測;掃描匹配和柵格地圖更新。
后端包括后端:線程池任務與調度;向位姿圖添加節點,計算節點的子圖內約束和子圖間約束(回環檢測);多分辨率地圖;基于分支定界算法的粗匹配,優化問題的構建與求解。
前端
雷達數據處理
local_trajectory_builder_2d.AddRangeData
點云數據處理,具體包括多傳感器時間同步,點云數據去畸,以及體素濾波。
位姿預測
local_trajectory_builder_2d.AddAccumulatedRangeData.ExtrapolatePose
利用pose,以及傳入的里程計,imu數據計算出線速度和角速度,不同的情況選擇參與運算的傳感器不同。利用線速度角速度乘以時間預測平移和姿態。
詳見《》
掃描匹配
掃描匹配的目的是找到雷達點云在柵格地圖中的位置與角度。
掃描匹配包括相關性掃描匹配RealTimeCorrelativeScanMatcher2D和ceres掃描匹配
將相關性掃描匹配的位姿作為ceres掃描匹配的初始值。
詳見《Cartographer 基于ceres的掃描匹配-CSDN博客》
更新概率柵格地圖
將雷達數據寫入概率柵格地圖
詳見《Cartographer 柵格地圖更新-CSDN博客》
后端
后端主要實現的是位姿圖優化。向位姿圖添加節點AddNode,計算節點的子圖內約束和子圖間約束(回環檢測);多分辨率地圖;基于分支定界算法的粗匹配,優化問題的構建與求解。
cartographer 中的節點共有兩類---關鍵幀節點和子圖節點。
關鍵幀指的是子圖關鍵幀,而子圖是由連續的若干個激光關鍵幀拼接到一起形成的子地圖。
在carto中子圖節點稱為submap,關鍵幀節點稱為node
構建約束是在這兩類節點之間構建。
圖中,三角表示子圖,圓圈表示節點,由于傳感器的一次掃描數據可能插入到多個不同的子圖,所以同一個節點可能和多個子圖之間存在一定的匹配關系。
子圖內約束:
local 坐標系下,子圖原點指向tracking_frame的坐標變換
????node和insertion_submaps之間的約束,由于在前端是,一個node只插入到了兩個submap中,所以個node最多只有兩個約束為子圖內約束。
子圖間約束:
根據global坐標計算初值,然后通過分支丁界算法粗匹配與ceres的精匹配,獲取校準后的位姿,最后計算local坐標系下,子圖原點指向校準后的節點間的坐標變換。
????????使用分支定界算法之前需要先構建多分辨率地圖。
構建優化問題,并求解:
- 確定2個節點在global坐標系下的相對位姿變換
- 通過其他方式再次獲取這兩個節點的相對位姿變換
- 對這2個先對位姿變換的差的最小二乘問題進行求解
- 進行求解之后會得到一個增量,將當前位姿加上這個增量后就得到了優化后的位姿
? ? ?cartographer中通過ceres添加殘差項構建優化問題求解。
詳見《》