cartographer環境建立以及建圖測試(詳細級)

2021-02-20 羽林君



目前機器人使用中需要進行SLAM建圖,因為移動機器人想要實現自主行走,核心在於實現自主定位導航,在自主定位導航技術中會涉及到定位、建圖、路徑規劃等問題,而地圖構建的好壞將直接影響機器人的行走路徑。機器人想要到達某個目的地,需要和人類繪製地圖一樣,描述環境、認識環境的過程主要就是依靠地圖

    

    而目前建圖方式有雷射雷達、視覺建圖、還有深度學習等。今天介紹的cartographer就屬於雷射slam。主流的雷射SLAM算法有hector、gmapping、karto、cartographer等。

下面簡單的介紹幾種SLAM算法:


  1.  hector是一種結合了魯棒性較好的掃描匹方法2D_SLAM方法和使用慣性傳感系統的導航技術。傳感器的要求較高,高更新頻率小測量噪聲的雷射掃描儀,不需要裡程計。使空中無人機與地面小車在不平坦區域運行存在運用的可能性。作者利用現代雷射雷達的高更新率和低距離測量噪聲,通過掃描匹配實時地對機器人運動進行估計。所以當只有低更新率的雷射傳感器時,即便測距估計很精確,對該系統都會出現一定的問題。

    hector基於優化的算法(解最小二乘問題),優缺點:不需要裡程計,但對於雷達幀率要求很高40Hz,估計6自由度位姿,可以適應空中或者地面不平坦的情況。初值的選擇對結果影響很大,所以要求雷達幀率較高。 

  2.  gmapping是一種基於粒子濾波的雷射SLAM算法,它已經集成在ROS中,是移動機器人中使用最多的SLAM算法。基於粒子濾波的算法用許多加權粒子表示路徑的後驗概率,每個粒子都給出一個重要性因子。但是,它們通常需要大量的粒子才能獲得比較好的的結果,從而增加該算法的的計算複雜性。此外,與PF重採樣過程相關的粒子退化耗盡問題也降低了算法的準確性。

 

    缺點:嚴重依賴裡程計,無法適應無人機及地面不平坦的區域,無迴環(雷射SLAM很難做迴環檢測),大的場景,粒子較多的情況下,特別消耗資源。

  3.  karto是基於圖優化的SLAM算法,用高度優化和非迭代cholesky矩陣進行稀疏系統解耦作為解。圖優化方法利用圖的均值表示地圖,每個節點表示機器人軌跡的一個位置點和傳感器測量數據集,箭頭的指向的連接表示連續機器人位置點的運動,每個新節點加入,地圖就會依據空間中的節點箭頭的約束進行計算更新。路標landmark越多,內存需求越大,然而圖優化方式相比其他方法在大環境下製圖優勢更大。

     karto採取的是spa(karto_slam)或g2o(nav2d),  karto的前端與後端採取的是單線程進行。

      

    4.LagoSLAM 是線性近似圖優化,不需要初始假設。基本的圖優化slam的方法就是利用最小化非線性非凸代價函數.每次迭代, 解決局部凸近似的初始問題來更新圖配置,過程迭代一定次數直到局部最小代價函數達到. (假設起始點經過多次迭代使得局部代價函數最小). 。假設圖中每個節點的相對位置和方向都是獨立的,作者求解了一個等價於非凸代價函數的方程組。為此,提出了一套基於圖論的程序,通過線性定位和線性位置估計,得到非線性系統的一階近似。

 

   5. cartographer是google開發的實時室內SLAM項目,cartographer採用基於google自家開發的ceres非線性優化的方法,cartographer的亮點在於代碼規範與工程化,非常適合於商業應用和再開發。並且cartographer基於submap子圖構建全局地圖的思想,能有效的避免建圖過程中環境中移動物體的幹擾。並且cartographer支持多傳感器數據(odometry、IMU、LaserScan等)建圖,支持2D_SLAM和3D_SLAM建圖。

    能天然的輸出協方差矩陣,後端優化的輸入項。成本較低的雷達也能跑出不錯的效果。cartographer是google推出的一套基於圖優化的SLAM算法。

    cartographer算法並沒有給人驚豔的感覺,但該算法的主要目標是實現低計算資源消耗,達到實時SLAM的目的,所以很適合嵌入式端的使用。

這篇文章是介紹cartographer在linuxPC環境(Ubuntu16)下進行源碼下載進行demo測試的教程,本文的前提條件是你的電腦裡已經安裝了ROS以下版本的任意一個:Noetic、Kinetic、Melodic。

    該算法主要分為兩個部分,第一個部分稱為Local SLAM, 該部分通過一幀幀的Laser Scan建立並維護一系列的Submap,而所謂的submap就是一系列的Grid Map。當再有新的Laser Scan中會通過Ceres Scan Matching的方法將其插入到子圖中的最佳位置。但是submap會產生誤差累積的問題,因此,算法的第二個部分,稱為Global SLAM的部分,就是通過Loop Closure來進行閉環檢測,來消除累積誤差:當一個submap構建完成,也就是不會再有新的laser scan插入到該submap時,算法會將該submap加入到閉環檢測中。閉環檢測的本質也是一個優化問題,該優化問題被表達成了一個pixel-accurate match的形式,解決優化問題的方法是Branch-and-Bound Approach.

作者:良知猶存

轉載授權以及圍觀:歡迎添加微信公眾號:羽林君

    cartographer的安裝主要包括三個部分:cartographer、cartographer-ros、ceres-solver。其中cartographer 是計算的部分,cartographer-ros是算法在ROS中通訊交互數據的部分,ceres-solver谷歌開發的一款用於非線性優化的庫,在谷歌的開源雷射雷達slam項目cartographer中被大量使用。

    

    安裝的方法有兩種,一種是官網的集成式下載配置,一種是把cartographer需要的依賴部分分別安裝配置。

    兩種方式區別就在於,第一種雖然方便,但是由於網絡問題(你懂的)所以Google的相關文件下載會失敗,所以就出現了,把依賴單獨下載編譯,最後下載cartographer進行編譯。

官網方式:

1. 安裝 wstool下載工具、rosdep和ninja編譯工具(ninja是一個新型的編譯小工具,用來替換複雜的make,從而實現快速編譯)

sudo apt-get update
sudo apt-get install -y python-wstool python-rosdep ninja-build

2. 建立一個wstool下載+ROS基本編譯的二合一環境

mkdir catkin_wscd catkin_wswstool init srcwstool merge -t src https://raw.githubusercontent.com/googlecartographer/cartographer_ros/master/cartographer_ros.rosinstall

這是 wstool 命令生成 .rosinstall 的文件裡面的內容,可以看到設置了cartographer、cartographer-ros下載連結。

靜靜等待下載,速度就取決你對於Google的認知。

3.安裝proto3.

    Protocol Buffers(簡稱Protobuf) ,是Google出品的序列化框架,與開發語言無關,和平臺無關,具有良好的可擴展性。Protobuf和所有的序列化框架一樣,都可以用於數據存儲、通訊協議。

src/cartographer/scripts/install_proto3.sh

此外其實除了Protobuf我們還可以配置其他依賴,這些腳本都在這個目錄,如果編譯過程中遇到依賴問題就可以去利用腳本去下載。

4.rosdep init在安裝ROS時候就安裝過了,不過這個經常會出現問題,我之前寫過一篇ROS安裝的文件,大家有興趣可以去看看

對於這個問題,有兩種解決思路:訪問DNS解析環節解決或者直接切換軟體源。

DNS解析環節解決:

切換linux軟體源:

sudo rosdep initrosdep updaterosdep install --from-paths src --ignore-src --rosdistro=${ROS_DISTRO} -y


5.最後一步編譯

catkin_make_isolated --install --use-ninjasource install_isolated/setup.bash


    但是好多時候因為下載問題,就會出現這樣那樣的問題,所以就出現了下面的方法,把包單獨下載,然後再進行編譯安裝。

注!:在我編譯cartographer過程中,和文章所寫這種一氣呵成的感覺恰恰相反,我編譯了好多次才編譯成功的,而且中間出現各種編譯問題,基本都是版本問題。所以請大家注意下載各個分包的版本,切記,切記,切記~

你看我probuf版本下載記錄就知道了。


分包編譯方式:

cartographer分成6個部分,分別是eigen3.2.9,ceres1.13.0,protobuf大於3.0.0,cartographer,cartogpher_ros,abseil。分開進行編譯:

1.eigen

    Eigen是高級 C ++ 模板標頭庫,用於線性代數,矩陣和矢量運算,幾何變換,數值求解器和相關算法。自3.1.1版以來,Eigen是根據Mozilla Public License 2.0許可的開源軟體。早期版本是根據GNU較寬鬆通用公共許可證授權的。


注意警告:cartographer對eigen,ceres,protobuf有嚴格的版本限制,版本必須嚴格!!!

#選擇版本3.2.9git clone  https://gitlab.com/libeigen/eigen.gitmkdir buildcd buildcmake ..sudo make install


安裝完成

2.ceres

Ceres solver 是谷歌開發的一款用於非線性優化的庫,在谷歌的開源雷射雷達slam項目cartographer中被大量使用。

注意:ceres版本必須是1.13.0,其它版本與eigen3.2.9不匹配

#選擇版本1.13.0git clone https://github.com/ceres-solver/ceres-solver.gitmkdir buildcd buildcmake ..make -j8sudo make install

編譯過程中如果出現這個編譯問題:

Failed to find glog

-- Failed to find installed glog CMake configuration, searching for glog build directories exported with CMake.

-- Failed to find an installed/exported CMake configuration for glog, will perform search for installed glog components.

-- Failed to find glog - Could not find glog include directory, set GLOG_INCLUDE_DIR to directory containing glog/logging.h

這個原因是缺失glog庫(glog 是一個 C++ 日誌庫,它提供 C++ 流式風格的 API。在安裝 glog 之前需要先安裝 gflags,這樣 glog 就可以使用 gflags 去解析命令行參數),我們可以用apt-get install安裝,也可以下載源碼進行編譯安裝.

apt-get install安裝:

sudo apt-get install libgoogle-glog-dev

下載源碼進行編譯安裝:

git clone https://github.com/google/glog.gitcd glogmkdir buildcmake ..makesudo make install


再重新進行cere編譯安裝,又通過一關


3. protobuf

Protocol Buffers(簡稱Protobuf) ,是Google出品的序列化框架,與開發語言無關,和平臺無關,具有良好的可擴展性。Protobuf和所有的序列化框架一樣,都可以用於數據存儲、通訊協議。

注意:protobuf安裝方式特殊,腳本安裝

選擇版本3.0.0git clone https://github.com/protocolbuffers/protobuf.git./autogen.sh

這次也會遇到error問題,

第一個error    48: autoreconf: not found

是在不同版本的 tslib 下執行 autogen.sh 產生。它們產生的原因一樣,是因為沒有安裝automake 工具,  用下面的命令安裝好就可以了。

sudo apt-get install autoconf automake libtool

第二個error可能是下載問題,這邊會提示你下載失敗,你可以選擇注釋掉,或者使用我提供的第二種編譯方法:

#如遇見Error,prot:443,注釋autogen.sh腳本34行./configuremake -j8sudo make installsudo ldconfig#測試一下protobufprotoc --version#不出意外將會顯示libprotoc 3.0.0

第二種編譯方法:

    上文說到,我們在cartographer/scripts目錄下可以找到cartographer依賴文件的下載的腳本,這些的腳本裡面還有編譯的選項,這時候我們就可以看下install_proto3.sh 這個文件,裡面可以看到如下內容:

mkdir buildcd buildcmake -G Ninja \  -DCMAKE_POSITION_INDEPENDENT_CODE=ON \  -DCMAKE_BUILD_TYPE=Release \  -Dprotobuf_BUILD_TESTS=OFF \  ../cmakeninjasudo ninja install

我們直接複製直接編譯即可。

4.abseil

abseil 是 google 開源的 C++通用庫,其目標是作為標準庫的補充。abseil 不但提供了標準庫沒有但很常用的功能,也對標準庫的一些功能進行了增強設計,使用 abseil 庫能使程序性能和開發效率都取得不錯的提升。

cartographer對abseil沒有版本要求,但是一定要有。

git clone https://github.com/abseil/abseil-cpp.gitmkdir buildcd buildcmake .. -DCMAKE_CXX_STANDARD=11make -j8sudo make install

不過在後續編譯abseil,大家可能會遇到這個問題

CMake Error at CMakeLists.txt:49 (find_package):

  By not providing "FindAbseil.cmake" in CMAKE_MODULE_PATH this project has

  asked CMake to find a package configuration file provided by "Abseil", but

  CMake did not find one.

  Could not find a package configuration file provided by "Abseil" with any

  of the following names:

    AbseilConfig.cmake

    abseil-config.cmake

  Add the installation prefix of "Abseil" to CMAKE_PREFIX_PATH or set

  "Abseil_DIR" to a directory containing one of the above files.  If "Abseil"

  provides a separate development package or SDK, be sure it has been

  installed.

不過沒事,是因為CMakeLists.txt在進行搜尋absil中,定義的名稱和你編譯abseil名稱不同,CMakeLists.txt是大寫的,而實際你編譯安裝後的包名稱為小寫。

修改如上所示:Abseil 修改為 absl 



5.carographer

注意:carographer和cartographer _ros版本必須對應

mkdir cartographercd cartographer & mkdir srccd src
git clone https://github.com/cartographer-project/cartographer.gitgit clone https://github.com/cartographer-project/cartographer_ros.git
catkin_make_isolated /*也可以用*/ catkin_make_isolated --install --use-ninja

編譯成功:

現在安裝了Cartographer和Cartographer的ROS集成,官方也提供了一些數據集,Deutsches Museum(德意志博物館),這樣我就可以很方便測試Cartographer生成地圖和其他的功能了

下載示例包(例如德意志博物館的2D和3D背包系列)到一個已知的位置

示例位於~/Downloads,並使用roslaunch來調出演示:

wget -P ~/Downloads https://storage.googleapis.com/cartographer-public-data/bags/backpack_2d/cartographer_paper_deutsches_museum.bag
roslaunch cartographer_ros demo_backpack_2d.launch bag_filename:=${HOME}/Downloads/cartographer_paper_deutsches_museum.bagwget -P ~/Downloads https://storage.googleapis.com/cartographer-public-data/bags/backpack_3d/with_intensities/b3-2016-04-05-14-14-00.bagroslaunch cartographer_ros demo_backpack_3d.launch bag_filename:=${HOME}/Downloads/b3-2016-04-05-14-14-00.bag

       

    又會是下載的問題,這些文件又大,下載速度又慢還經常失敗,我也是廢了九牛二虎之力下載下來的。

為了方便大家測試,大家可以公眾號後臺私我,或者添加我微信號,我把我下載好的文件發給大家。

截圖有限,之前操作都忘記截圖了,導致現在就只有一個了,大家湊合看了哈。

生成.pdstream地圖(等待直到cartographer_offline_node完成),

roslaunch cartographer_ros offline_backpack_2d.launch bag_filenames:=${HOME}/Downloads/cartographer_paper_deutsches_museum.bag

然後運行純定位:

roslaunch cartographer_ros demo_backpack_2d_localization.launch  load_state_filename:=${HOME}/Download/cartographer_paper_deutsches_museum.bag.pbstream   bag_filename:=${HOME}/Downloads/cartographer_paper_deutsches_museum.bag

此外還有turtlebot的數據,其實都是一樣的,大家也可以看一下創客智造的cartographer_turtlebot教程。

這就是我分享的cartographer的簡單測試使用,未來我會介紹更加詳細的cartographer使用以及源碼解析。此外如果大家有什麼更好的思路,也歡迎分享交流哈。

本公眾號全部原創乾貨已整理成一個目錄,回復[ 資源 ]即可獲得。

申明以上部分內容是參考了別人的文章,如有侵權,請告知,我將刪除!

相關焦點

  • 手把手教你Cartographer從入門到精通!
    該算法可以實現實時定位和建圖。Cartographer建圖過程2、Cartographer建立的柵格地圖可以達到5cm的精度,該算法廣泛應用於服務機器人、掃地機器人、倉儲機器人、自動駕駛等領域,是最優秀的雷射SLAM框架之一。
  • Cartographer代碼逐行解析
    Cartographer是google在2016年推出的一套基於圖優化的雷射這套算法可以融合多種傳感器數據,以較低的資源消耗、較高的實時性構建柵格地圖(這裡僅指二維地圖,雖然cartographer也支持3d建圖,但建出來的地圖既不是柵格地圖也不是3d點雲或其他常見格式,這種地圖只能用於定位,沒法用於路徑規劃、任務決策等,所以稍顯雞肋,目前業界很少使用這種地圖))。可以說這套算法是目前雷射slam界算法中的老師傅:沒有新算法的眼花繚亂,但穩健、出色。
  • 利用Robosense 16線雷達在自己機器人上跑cartographer 2D(二)
    首先要在工作目錄 source 下,然後執行命令:source devel_isolated/setup.bashcartographer_rosbag_validate -bag_filename your_bag_path.baglua文件定義在:src/cartographer_ros/cartographer_ros
  • 利用XECU和雷射雷達快速搭建入門級的自動駕駛小車
    利用XECU和雷射雷達快速搭建入門級的自動駕駛小車1 簡介如果關注過我們之前的推文和視頻演示,相信大家對我們的XECU應該已經很熟悉了。那麼今天就向大家介紹一下,如何利用我們的XECU和雷射雷達快速搭建自己的入門級自動駕駛小車。
  • 循環圖-斷頭谷收益測試,以及搬磚難度測試!
    在之前體驗服就測試過關於循環圖的收益了,詳情👉體驗服循環圖-斷頭谷188PL收益測試!
  • 企業級滲透測試服務思考
    今年網絡安全的紅藍對抗為人們安全觀念和意識的轉變帶來了契機,雖然企業安全防禦技術爭論不休,但唯一不爭的共識是,企業能夠建立最好的安全防禦體系的方式就是通過對抗演練來進行檢驗。企業市場也不斷湧現紅藍對抗的建設需求,攻防演練得到企業的重視,攻擊視角能幫助防守團隊找到防守視角的盲點,企業級滲透測試服務的採購也成為企業安全團隊思考的問題。
  • LiLi-OM: 走向高性能固態雷射雷達慣性裡程計和建圖系統
    「LiLi-OM提出了一種新的固態和機械雷射雷達的緊耦合雷射雷達-慣性裡程計和建圖方案。其前端是,基於特徵的輕量級雷射雷達裡程計為自適應關鍵幀選擇提供快速運動估計。後端是,通過邊緣化執行基於關鍵幀的分層滑動窗口優化方法,用於直接融合IMU和雷射雷達測量數據。
  • 【泡泡圖靈智庫】面向高性能的固態雷射-慣性裡程計與建圖
    我們提出的系統具有較好的實時性,定位建圖精度優於SOTA。我們發布了使用Livox Horizon和Xsens MTi-670記錄的固態雷射雷達數據集。方法1.系統框架圖2:系統框架我們提出的雷達-慣性裡程計方法如圖2,3D雷射雷達(Livox Horizon)以10hz頻率輸出點雲,IMU以200hz輸出加速度和角速度,二者進行了時間同步。我們希望同時估計雷達的運動並建立全局一致的地圖。
  • 接口測試簡介以及接口測試用例設計思路
    5.為什麼要進行接口測試因為不同端(前段,後端)的工作進度不一樣,所以我們要針對最開始出來的接口,以及需要調用其他公司的(銀行,支付寶,微信,qq等)一些接口進行接口測試及驗證數據,從安全層面來說,只依賴前端進行限制已經完全不能滿足系統的安全要求(繞過前面實在太容易),需要後端同樣進行控制,在這種情況下就需要從接口層面進行驗證。
  • 使用PowerDesigner畫ER圖詳細教程
    它從用戶的觀點出發對信息進行建模,主要用於資料庫的概念級設計。通常人們先將現實世界抽象為概念世界,然後再將概念世界轉為機器世界。三、實體、屬性及標識符的表達介紹PowerDesigner概念數據模型以及實體、屬性創建。一、新建概念數據模型1)選擇File-->New,彈出如圖所示對話框,選擇CDM模型(即概念數據模型)建立模型。
  • 軟體測試工具大放送,測試人必備的「武器庫」!
    左圖表達了在一個完整的測試系統中,TestView Manager用來定製、管理各種測試活動; WebLoad模擬多個用戶行為進行測試,所測試的是系統性能,容量,穩定性和抗攻擊性;WebFT 模仿單一用戶行為進行測試,所測試的是系統功能,漏洞,兼容性和穩定性; WebLoad Analyzer對Web服務、中間件和資料庫進行監控和分析,找出問題原因和故障點。
  • 機器人環境感知研究現狀簡述
    ,本文主要沿算法研究時間、分算法類型、從機器人自主運動角度對部分經典研究成果進行分析概述,最後從地圖重構效率、環境內容完整性及碰撞檢測效率等方面對比多種感知算法生成的不同類型的地圖。然而,後來的學者指出了SLAM的系統效率及魯棒性方面有待提升,從而對SLAM算法的研究進入了下一階段。該階段主要研究SLAM系統的基本性質,包括可觀測性、收斂性和一致性,SLAM框架逐漸得到完善,系統性能顯著提升。
  • fcBGA-H封裝瞬態熱特性 仿真&測試(三)
    本節我們討論瞬態模擬方法並嘗試儘可能詳細的匹配真實測試條件。
  • 《部落衝突》怎麼建立部落與建立部落技巧教學
    本次給大家帶來的是COC部落衝突中建立一個比較厲害的部落的方法,相信有很多玩家都是希望能夠成為一個超級公會的會長,但是超級公會也是從零開始一步一步來的
  • springboot多環境配置logback的詳細介紹
    2.非常充分的測試:Logback經過了幾年,數不清小時的測試。Logback的測試是完全不同級別的。3.非常充分且不斷更新的文檔4.Logback-classic非常自然實現了SLF4j:Logback-classic實現了SLF4j。在使用SLF4j中,你都感覺不到logback-classic。
  • 詳細測試數據得出結論!
    空說沒意義,實際來測試一下就知道了ps:紫分解隨機性較大,基本都是虧的,故不測試這裡測試的是85級的藍白首先是藍裝:>武器、防具、首飾各10件(都是85級的)測試分解機為11級測試①:藍裝/11級分解機從下面表格可以看出每個金幣值分解無色數量一樣,其他晶體隨機,有極低的概率暴擊得出:無色價格在
  • Android穩定性測試利器-Monkey介紹及環境配置
    它向系統發送偽隨機的用戶事件流(如屏幕的點擊、滑動和系統按鍵操作等),實現對正在開發的app進行壓力測試。Monkey主要用於對android系統中開發的app進行穩定性測試。Monkey在使用時需要通過USB將手機設備與PC相連,在PC端使用Adb shell命令調用設備端的Monkey程序,設備端的Monkey程序自己生成隨機的操作序列來執行。
  • 視覺SLAM核心綜述:地圖初始化、實時跟蹤、局部建圖、迴環檢測、BA優化,工程技巧
    SLAM是指某種行動裝置(如機器人、無人機、手機、汽車、智能 穿戴設備等) 從一個未知環境裡的未知地點出 發, 在運動過程中通過傳感器(如相 機、雷射雷達、 IMU等)觀測定位 自身位置和姿態,再根據自身位 姿進行增量式的地圖構建