cartographer源碼解析(1)

来源:https://www.cnblogs.com/carbo-T/archive/2020/05/27/12963794.html
-Advertisement-
Play Games

cartographer為Google提供的激光SLAM開源庫,通常通過其提供的ROS平臺封裝進行使用,該庫結構清晰,模塊完整,值得深入研究。 項目官網:https://google-cartographer.readthedocs.io/en/latest/ 項目Github:https://gi ...


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源碼。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 關於瀏覽器相容問題 目前主流瀏覽器有IE,edge,Chrome,firefox,Opera(歐朋),Safari(指南針) 由於目前的電腦操作系統很多,瀏覽器的版本迭代有很強,因此用戶的使用瀏覽器是參差不齊的,因此我們作為前端人員在設計網站在不同瀏覽器顯示效果時,相容性就很有必要考慮,最追求給用戶 ...
  • 第一步: 首先進入自己的博客園 -- 點擊<<設置>>--找到 <<博客側邊欄公告(支持HTML代碼) (支持 JS 代碼)>> 第二步: 加入如下代碼 <img style="width: 200px; height: 200px;" src="頭像路徑" alt="qq377905687的頭像" ...
  • 方法 說明 歸屬 alert(msg) 瀏覽器彈出警示框 瀏覽器 console.log(msg) 瀏覽器控制台列印輸出信息 瀏覽器 prompt(info) 瀏覽器彈出輸入框,用戶可以輸入 瀏覽器 程式示例: <!DOCTYPE html> <html lang="en"> <head> <met ...
  • 1.行內式js(很少使用) 以on開頭,如onclick HTML中推薦雙引號,JS推薦單引號 2.內嵌式js(常用) <script> alert('hello world'); <script> 3.外部js文件 <script src="my.js"></script> 利於代碼結構化 便於文 ...
  • 突發奇想,感覺ui組件的上傳圖片用著很方便,突然件想自己寫一個探索其原理 頭像上傳功能主要是前端通過formData將文件傳至伺服器然後伺服器將圖片保存至文件夾,並將其路徑返回至前端,前端渲染至頁面。 前端頁面如下所示(主要是為了寫一個簡單的例子): js部分:這裡使用的是原生的ajax請求將文件信 ...
  • 代碼示例:新聞頁面: 1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <meta name="viewport" content="width=device-width, initial-scale=1 ...
  • 對於那些存在對象之間複雜交互關係的系統,中介者模式提供了一種簡化複雜交互的解決方案,即通過引入一個中介者,將原本對象之間的兩兩交互轉化為每個對象與中介者之間的交互 模式動機 以微信聊天為例,可以用戶與用戶直接聊天,也可以通過微信群聊天。前者的話,用戶要和別的用戶加為好友,即用戶和用戶之間存在多對多關 ...
  • 背景 阿裡雲上有個阿裡巴巴編碼規範認證,我估算一下時間成本很低,多個認證也沒什麼壞處,就花了1分錢報了個名。這個認證報名後就可以下載鏈接下的編碼規範,然後參加個考試應該就OK了。 共48頁的規範實際上每讀一遍都是要花一些時間的,因為每讀一遍就會發現上面有些東西我不信。我需要去證明。過去證明過的因為J ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...