在安裝編譯cartographer-1.0.0的時候,我們可以看到**主要包括cartorgarpher_ros、cartographer、ceres-sover三個部分。其中,ceres-solver用於非線性優化,求解最小二乘問題;cartographer_ros為ros平台的封裝,獲取感測器資料,顯示和儲存處理結果;cartographer為演算法的底層實現,處理感測器資料,構建地圖。作為ros平台的封裝,cartographer_ros沒做實質性的工作,但是其充當了cartographer程式的守門人的角色,包含通往cartographer的鑰匙,故本次先針對cartographer_ros作乙個簡單快速的分析。
首先看下cartographer_ros的檔案結構,如下圖所示:
cartographer_ros目錄
然後我們具體分析下各目錄的內容:
cartographer_ros_msgs:部分msg、srv檔案;
cartographer_ros/cartographer_ros:基於ros實現的主要程式,包含各節點的實現檔案,入口節點cartographer_node的實現檔案node_mian.cc就在這裡;
configuration_files目錄
cartographer_ros/configuration_files:引數配置檔案,包括機械人引數、建圖引數、定位引數、檔案儲存引數等;
launch目錄
cartographer_ros/launch:節點啟動檔案,包括機械人、建圖、定位、檔案儲存等節點;
通過實際執行,分析一下ros節點的情況:
cartographer_ros節點圖
cartographer_ros的主節點,主要負責訂閱感測器資料、發布顯示資料。
主要負責訂閱子圖與發布柵格地圖。
主要負責發布地**件。
主要用於離線執行的節點,功能類似cartographer_node節點。
正如前面說的那樣,cartographer_ros主要有兩部分功能:
1.訂閱感測器資料與結果展示;
2.cartographer api的ros封裝;
故針對cartographer_ros,我們主要作簡單的梳理,將大部分的時間放到以後對cartographer演算法底層的研究,**流程如圖所示:
原圖:
cartographer_ros**結構
簡單說明一下,藍線是cartographer_ros的主流程,紫線是新建軌跡的流程,綠線是結束軌跡、優化的流程,黑線是發布顯示所需資料的流程。黑色填充的檔案在cartographer_ros目錄下的,綠色與紫色填充的檔案在cartographer目錄下。
沿著每個流程去理**,一層層剝開封裝,最後發現都是通過map_builder_bridge
、sensor_bridge
進入cartographer目錄下,去做實質的資料處理、建圖的底層工作。給人一種感覺,就是看完cartographer_ros發現還沒看到真正的程式,全是花裡胡哨的層層封裝以及c++的高階用法,也給閱讀原始碼的新手很大的壓力。但是,作為乙個產品級的原始碼,還是可以從背後多琢磨一下谷歌工程師的意圖,這就是仁者見仁智者見智的事情了。總之,從全域性結構去看,cartographer_ros的**結構就是這樣啦。
接下來,具體看一下主程式的流程:
node_main.cc
通過launc**件啟動節點
backpack_3d.launch & backpack_3d.lua
以backpack_3d.launch
為例,主要做了以下工作:
啟動cartographer_node、cartographer_occupancy_grid_node節點;
匯入.urdf檔案、.lua配置檔案路徑;
其中,.urdf檔案定義了機械人的座標變換,.lua檔案定義了建圖演算法的配置,包括感測器的種類、取樣率、發布頻率,以及位姿優化的引數等。
訂閱tf,使用.lua配置cartographer演算法引數、ros訂閱發布引數
定時發布submap/trajectory/landmark_pose/constraint/scan_matched_point_cloud
新建軌跡
**流程:addtrajectory()→
\rightarrow
→addextrapolator() + addsensorsampler() + launchsubscriber()→
\rightarrow
→handle…message()
檔案流程:node_main.cc→
\rightarrow
→node.cc→
\rightarrow
→map_builder_bridge→
\rightarrow
→結束軌跡
優化儲存
《原始碼閱讀》原始碼閱讀技巧,原始碼閱讀工具
檢視某個類的完整繼承關係 選中類的名稱,然後按f4 quick type hierarchy quick type hierarchy可以顯示出類的繼承結構,包括它的父類和子類 supertype hierarchy supertype hierarchy可以顯示出類的繼承和實現結構,包括它的父類和...
python原始碼剖析 Python原始碼剖析
第頁共 頁python 原始碼剖析 物件機制 1.物件 在python 的世界中,一切都是物件,乙個整數是乙個物件,乙個字串也是 乙個物件,更為奇妙的是,型別也是乙個物件,整數型別是乙個物件,字串類 型也是乙個物件。從 年guido 在那個聖誕節揭開 python 世界的大幕開始,一直到現在,pyt...
90 70 010 原始碼 CUBE查詢 原始碼
注 kylin原始碼分析系列基於kylin的2.6.0版本的原始碼,其他版本可以模擬。kylin中的查詢是在web頁面上輸入sql語句然後提交來執行相關查詢,頁面上的提交也是向kylin的rest server傳送restful請求,方法與前面文章介紹的cube構建的觸發方式類似,通過angular...