cartographer為Google提供的激光SLAM開源庫,通常通過其提供的ROS平臺封裝進行使用,該庫結構清晰,模塊完整,值得深入研究,
專案官網:https://google-cartographer.readthedocs.io/en/latest/
專案Github:https://github.com/cartographer-project/cartographer
環境安裝與配置具體參考:https://www.cnblogs.com/lvchaoshun/p/9824528.html
安裝程序中可能會碰到一些版本沖突之類的問題,耐心上網尋求解決方法,
溫馨提示:本系列主要介紹原始碼內容,不介紹環境搭建,僅作為自己學習程序記錄,可能會比較亂,有疑問歡迎留言討論,
下面進入正題,下圖是cartographer官網提供的軟體架構圖,本系列將通過cartographer_ros封裝庫中呼叫順序,對程式主線進行介紹,暫未使用到的或次要的資訊以后有空再分析,

首先我們找到cartographer_ros中程式入口,即cartographer_ros/cartographer_ros/cartographer_ros/node_main.cc,其中的main函式為cartographer_ros節點啟動的程式入口,

其他都是ros平臺初始化相關的函式,只用看98行Run方法,

可以看到該函式內主要是些初始化作業,創建map_builder傳給node進行初始化、讀取pbstream地圖檔案,并呼叫StartTrajectoryWithDefaultTopics函式,該函式定義在node.cc中,

我們會發現AddTrajectory是核心功能入口,××該函式需重點關注,之后我們還會回來一個個分析其中呼叫的關鍵函式,

該函式功能比較多,我們一步步看,首先363行創建一個set保存傳感器話題的編號,用于之后訂閱器訂閱,366行呼叫map_builder_bridge_實體的AddTrajectory函式,在cartographer_ros中類名包含“bridge”的類基本上都是作為“橋梁”呼叫cartographer原始碼的類,我們可以看到map_builder_bridge_為map_builder_bridge.cc中定義的MapBuilderBridge的實體,此時關注map_builder_bridge.cc中定義的AddTrajectory函式內容,

根據cartographer全域配置引數和最初Run方法中定義的map_builder實體型別,我們了解到map_builder_為cartographer/mapping/map_builder.cc中定義的MapBuilder類的實體,上圖函式內容分為兩塊,一塊呼叫map_builder_的AddTrajectoryBuilder函式,創建trajectory_builder并設定結果回呼,回傳一個路徑id作為當前軌跡的編號,詳情下篇再介紹;另一塊主要初始化一個SensorBridge實體,并放入sensor_birdges_這個map中,以及保存該路徑id對應的配置引數,
接下來我們回到node.cc中核心功能入口函式,368與369行分別創建與當前路徑編號對應的位姿預測器(PoseExtrapolator)與傳感器采樣器(TrajectorySensorSamplers),根據配置引數創建實體沒啥好說的,371行啟動ros話題訂閱器,并設定回呼函式,這之后的創建定時器和記錄話題編號也很簡單,我們主要關注話題訂閱的回呼函式,

上圖截取了LaunchSubsribers函式的部分代碼,通過其回呼函式,我們發現最侄訓呼叫sensor_bridge.cc中定義的HandleLaserScan函式,此處僅僅舉個例子,該函式僅處理激光雷達資料(普通LaserScan型別訊息、多回波、點云等),其他傳感器資料(如IMU、里程計等)會呼叫不同的回呼函式,
我們觀察HandleLaserScan函式實作,

首先對點云細分,默認num_subdivisions_per_laser_scan_=10,points物件的型別為cartographer_ros自定義型別,其中保存了每個點的光強、位置與時間增量,time_to_subdivision_end保存了最后一個點的時間增量,即一塊細分點云間時間間隔(第一個點之前的時刻到最后一個點之后的時刻之間的時間間隔),之后做一些時間戳的運算,或許是諸如(..., -0.06, -0.04, -0.02, 0)的一組時間戳,最后呼叫HandleRangefinder將資料添加到全域路徑構造器,如下圖所示,

此處trajectory_builder_會是GlobalTrajectoryBuilder類的實體,是由于map_builder_的AddTrajectoryBuilder函式中呼叫了對應的建構式,此處已涉及cartographer原始碼,

本節主要介紹了cartographer_ros封裝是如何跳轉到cartographer原始碼中的,主要包括ros節點、map_builder與trajectory_builder的創建,pose_extrapolator與trajectory_sensor_samplers的初始化以及傳感器話題訂閱與處理,從下一節開始,將根據呼叫順序介紹cartographer原始碼,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/24330.html
標籤:C++
上一篇:C++基礎之面向物件
下一篇:手把手教系列之FIR濾波器設計
