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

前言前端

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

    

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


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

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

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

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

 

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

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

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

      

    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_ws
cd catkin_ws
wstool init src
wstool merge -t src https://raw.githubusercontent.com/googlecartographer/cartographer_ros/master/cartographer_ros.rosinstall

這是 wstool 命令生成 .rosinstall 的文件裏面的內容,能夠看到設置了cartographer、cartographer-ros下載連接。

wstool update -t src

靜靜等待下載,速度就取決你對於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 init
rosdep update
rosdep install --from-paths src --ignore-src --rosdistro=${ROS_DISTRO} -y

5.最後一步編譯

catkin_make_isolated --install --use-ninja
source 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.9
git clone  https://gitlab.com/libeigen/eigen.git
mkdir build
cd build
cmake ..
sudo make install


安裝完成

2.ceres

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

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

#選擇版本1.13.0
git clone https://github.com/ceres-solver/ceres-solver.git
mkdir build
cd build
cmake ..
make -j8
sudo 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.git
cd glog
mkdir build
cmake ..
make
sudo make install

再從新進行cere編譯安裝,又經過一關

3. protobuf

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

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

選擇版本3.0.0
git 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行
./configure
make -j8
sudo make install
sudo ldconfig
#測試一下protobuf
protoc --version
#不出意外將會顯示libprotoc 3.0.0

第二種編譯方法:

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

mkdir build
cd build
cmake -G Ninja \
  -DCMAKE_POSITION_INDEPENDENT_CODE=ON \
  -DCMAKE_BUILD_TYPE=Release \
  -Dprotobuf_BUILD_TESTS=OFF \
  ../cmake
ninja
sudo ninja install

咱們直接複製直接編譯便可。

4.abseil

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

cartographer對abseil沒有版本要求,可是必定要有。

git clone https://github.com/abseil/abseil-cpp.git
mkdir build
cd build
cmake .. -DCMAKE_CXX_STANDARD=11
make -j8
sudo 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 cartographer
cd cartographer & mkdir src
cd src


git clone https://github.com/cartographer-project/cartographer.git
git 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來調出演示:

# 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 

       

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

爲了方便你們測試,你們能夠公衆號後臺私我,或者添加我微信號,我把我下載好的文件發給你們。

截圖有限,以前操做都忘記截圖了,致使如今就只有一個了,你們湊合看了哈。

生成.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使用以及源碼解析。此外若是你們有什麼更好的思路,也歡迎分享交流哈。

END

推薦閱讀

【1】linux開發各類I/O操做簡析,以及select、poll、epoll機制的對比

【2】嵌入式底層開發的軟件框架簡述 

【3】CPU中的程序是怎麼運行起來的 必讀
【4】什麼?還不懂c++vector的用法,你憑什麼勇氣來的!
【5】階段性文章總結分析

本公衆號所有原創乾貨已整理成一個目錄,回覆[ 資源 ]便可得到。

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

相關文章
相關標籤/搜索