加入星計劃,您可以享受以下權益:

  • 創(chuàng)作內(nèi)容快速變現(xiàn)
  • 行業(yè)影響力擴散
  • 作品版權保護
  • 300W+ 專業(yè)用戶
  • 1.5W+ 優(yōu)質(zhì)創(chuàng)作者
  • 5000+ 長期合作伙伴
立即加入
  • 正文
    • 算法分析
    • 安裝介紹
    • 官網(wǎng)方式:
    • DNS 解析環(huán)節(jié)解決:
  • 相關推薦
  • 電子產(chǎn)業(yè)圖譜
申請入駐 產(chǎn)業(yè)圖譜

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

2020/12/14
378
閱讀需 29 分鐘
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點資訊討論

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

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

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

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

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

2.gmapping 是一種基于粒子濾波的激光 SLAM 算法,它已經(jīng)集成在 ROS 中,是移動機器人中使用最多的 SLAM 算法?;诹W訛V波的算法用許多加權粒子表示路徑的后驗概率,每個粒子都給出一個重要性因子。但是,它們通常需要大量的粒子才能獲得比較好的的結(jié)果,從而增加該算法的的計算復雜性。此外,與 PF 重采樣過程相關的粒子退化耗盡問題也降低了算法的準確性。

缺點:嚴重依賴里程計,無法適應無人機及地面不平坦的區(qū)域,無回環(huán)(激光 SLAM 很難做回環(huán)檢測),大的場景,粒子較多的情況下,特別消耗資源。

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

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

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

?5.?cartographer 是 google 開發(fā)的實時室內(nèi) SLAM 項目,cartographer 采用基于 google 自家開發(fā)的 ceres 非線性優(yōu)化的方法,cartographer 的亮點在于代碼規(guī)范與工程化,非常適合于商業(yè)應用和再開發(fā)。并且 cartographer 基于 submap 子圖構建全局地圖的思想,能有效的避免建圖過程中環(huán)境中移動物體的干擾。并且 cartographer 支持多傳感器數(shù)據(jù)(odometry、IMU、LaserScan 等)建圖,支持 2D_SLAM 和 3D_SLAM 建圖。

能天然的輸出協(xié)方差矩陣,后端優(yōu)化的輸入項。成本較低的雷達也能跑出不錯的效果。cartographer 是 google 推出的一套基于圖優(yōu)化的 SLAM 算法。

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

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

算法分析

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

安裝介紹

cartographer 的安裝主要包括三個部分:cartographer、cartographer-ros、ceres-solver。其中 cartographer 是計算的部分,cartographer-ros 是算法在 ROS 中通訊交互數(shù)據(jù)的部分,ceres-solver 谷歌開發(fā)的一款用于非線性優(yōu)化的庫,在谷歌的開源激光雷達 slam 項目 cartographer 中被大量使用。

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

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

官網(wǎng)方式:

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

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

2.?建立一個 wstool 下載+ROS 基本編譯的二合一環(huán)境

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

這是 wstool 命令生成 .rosinstall 的文件里面的內(nèi)容,可以看到設置了 cartographer、cartographer-ros 下載鏈接。

wstool?update?-t?src

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

3. 安裝 proto3.

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

src/cartographer/scripts/install_proto3.sh

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

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

對于這個問題,有兩種解決思路:訪問 DNS 解析環(huán)節(jié)解決或者直接切換軟件源。

DNS 解析環(huán)節(jié)解決:

切換 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

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

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

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

分包編譯方式:

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

1.eigen

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

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

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

安裝完成

2.ceres

Ceres solver 是谷歌開發(fā)的一款用于非線性優(yōu)化的庫,在谷歌的開源激光雷達 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

編譯過程中如果出現(xiàn)這個編譯問題:

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 去解析命令行參數(shù)),我們可以用 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 出品的序列化框架,與開發(fā)語言無關,和平臺無關,具有良好的可擴展性。Protobuf 和所有的序列化框架一樣,都可以用于數(shù)據(jù)存儲、通訊協(xié)議。

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

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

這次也會遇到 error 問題,

第一個 error48: autoreconf: not found

是在不同版本的 tslib 下執(zhí)行 autogen.sh 產(chǎn)生。它們產(chǎn)生的原因一樣,是因為沒有安裝 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 這個文件,里面可以看到如下內(nèi)容:

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 庫能使程序性能和開發(fā)效率都取得不錯的提升。

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

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

不過在后續(xù)編譯 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

編譯成功:

建圖開發(fā)

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

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

示例位于~/Downloads,并使用 roslaunch 來調(diào)出演示:

# Download the 2D backpack example bag.wget -P ~/Downloads https://storage.googleapis.com/cartographer-public-data/bags/backpack_2d/cartographer_paper_deutsches_museum.bag
# Launch the 2D backpack demo.roslaunch?cartographer_ros?demo_backpack_2d.launch?bag_filename:=${HOME}/Downloads/cartographer_paper_deutsches_museum.bag# Download the 3D backpack example bag.wget -P ~/Downloads https://storage.googleapis.com/cartographer-public-data/bags/backpack_3d/with_intensities/b3-2016-04-05-14-14-00.bag# Launch the 3D backpack demo.roslaunch cartographer_ros demo_backpack_3d.launch bag_filename:=${HOME}/Downloads/b3-2016-04-05-14-14-00.bag

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

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

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

生成 .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 的數(shù)據(jù),其實都是一樣的,大家也可以看一下創(chuàng)客智造的 cartographer_turtlebot 教程。

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

相關推薦

電子產(chǎn)業(yè)圖譜

一個程序員,喜歡寫文章,還喜歡打籃球,也喜歡吉他鋼琴的駁雜之人。日常更新自己,分享包括但不限于C/C++、嵌入式、物聯(lián)網(wǎng)、Linux等編程學習筆記,同時,公眾號內(nèi)包含大量的學習資源。歡迎關注,一同交流學習,共同進步!