1. 程式人生 > >Graph-based SLAM的Cartographer系統的實現與分析

Graph-based SLAM的Cartographer系統的實現與分析

1 背景簡介

Cartographer是一個Google於2016年開源的專案,它是一種在多平臺和感測器配置下,提供2D和3D實時同時定位與建圖(SLAM)的系統。
論文《Real-Time Loop Closure in 2D LIDAR SLAM》對Cartographer對系統進行了詳細的闡述。

2 系統概述

2.1 系統總覽

Cartographer主要理論是通過閉環檢測來消除構圖過程中產生的累積誤差。用於閉環檢測的基本單元是submap。一個submap是由一定數量的laser scan構成。將一個laser scan插入其對應的submap時,會基於submap已有的laser scan及其它感測器資料估計其在該submap中的最佳位置。submap的建立在短時間內的誤差累積被認為是足夠小的。然而隨著時間推移,越來越多的submap被建立後,submap間的誤差累積則會越來越大。因此需要通過閉環檢測適當的優化這些submap的位姿進而消除這些累積誤差,這就將問題轉化成一個位姿優化問題。
當一個submap的構建完成時,也就是不會再有新的laser scan插入到該submap時,該submap就會加入到閉環檢測中。閉環檢測會考慮所有的已完成建立的submap。當一個新的laser scan加入到地圖中時,如果該laser scan的估計位姿與地圖中某個submap的某個laser scan的位姿比較接近的話,那麼通過某種 scan match策略就會找到該閉環。
Cartographer中的scan match策略通過在新加入地圖的laser scan的估計位姿附近取一個視窗,進而在該視窗內尋找該laser scan的一個可能的匹配,如果找到了一個足夠好的匹配,則會將該匹配的閉環約束加入到位姿優化問題中。Cartographer的重點內容就是融合多感測器資料的區域性submap建立以及用於閉環檢測的scan match策略的實現。
總體流程圖如圖1所示:

圖1 總體流程圖

2.2 區域性二維的實時定位和建圖

系統實現2D SLAM結合了局部的和全域性的方法,區域性和全域性的方法都對Lidar觀測到的位置進行了優化。這個位置包括(x,y)座標的轉化,以及角度的旋轉,實際上就是對scan點集的優化。平臺採用的是IMU測量方向,然後將其對映到2D平面上。
在區域性方法中,每個連續的點集被拿來和整個地圖的一部分進行匹配,就是和submap進行匹配。使用一種非線性的優化方法將submap和scan點集聯絡起來,這也是scan matching的過程。區域性方法積累的誤差在之後的全域性方法去掉。
如圖2所示,灰色的網格代表的是一次scan點集的範圍,黑色的點表示hit(障礙物)的網格。

圖2 SCAN

2.3閉環的實現

因為一個submap是由少數的幾個連續scan點集生成的,所以誤差很小。論文中優化所有點集和submap位置的方法使用的是Sparse Pose Adjustment。一個scan點集被插入submap中的相對位置會被儲存下來,用於之後的閉環優化。除了這些位置資訊,還有的包含scan點集和submap,而且這個submap不再變化的時候,都會被用來作為閉環檢測。一個scan matcher一直會在後臺不斷的執行,當一個好的scan match被找到之後,這個相應的位置也會被加入到優化問題中。
求解方法如圖3所示。

圖3 求解方法

3 安裝

注:這裡基本是按照官方文件操作的,喜歡官方文件和英文的請移步。

3.1 系統要求

  • 64-bit, modern CPU (e.g. 3rd generation i7)
  • 16 GB RAM
  • Ubuntu 14.04 (Trusty) and 16.04 (Xenial)
  • gcc version 4.8.4 and 5.4.0
  • ROS Indigo or Kinetc

3.2 建立和安裝

3.2.1 安裝wstool和rosdep

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

3.2.2 在catkin_ws資料夾中建立一個新的工作空間

$ mkdir catkin_ws
$ cd catkin_ws
$ wstool init src

3.2.3 安裝proto3

$ src/cartographer/scripts/install_proto3.sh

3.2.4 合併cartographer_ros.rosinstall檔案並獲取依賴關係的程式碼

$ wstool merge -t src https://raw.githubusercontent.com/googlecartographer/cartographer_ros/master/cartographer_ros.rosinstall
$ wstool update -t src

3.2.4 安裝deb依賴項

$ sudo rosdep init
$ rosdep update
$ rosdep install --from-paths src --ignore-src --rosdistro=${ROS_DISTRO} -y

3.2.5 構建並安裝

$ catkin_make_isolated --install --use-ninja
$ source install_isolated/setup.bash

4 測試

實驗資料來源為Google工作人員通過裝有鐳射雷達、IMU和里程計裝置的揹包採集的資料,可在指定網站下載。
4.1 下載2D揹包示例包

$ wget -P ~/Downloads https://storage.googleapis.com/cartographer-public-data/bags/backpack_2d/cartographer_paper_deutsches_museum.bag

4.2 啟動2D揹包資料進行演示

$ roslaunch cartographer_ros demo_backpack_2d.launch bag_filename:=${HOME}/Downloads/cartographer_paper_deutsches_museum.bag

4.3 執行效果

圖4 執行效果

5 分析與總結

從圖4可以看出此係統的總體建圖效果比較理想,但是與論文的效果(如圖5所示)相比,部分細節效果較差,初步猜測為電腦(Lenovo Y450)效能有限,導致迴環檢測環節減小累積誤差的效能降低,具體原因有待考證。

圖5 論文中的效果

Cartographer是Google的開源SLAM庫,並且包含了ROS介面,主要依賴的感測器是鐳射雷達(Lidar)和慣性導航儀(IMU),用於2D和3D的室內SLAM。
它的設計目標是為了解決在有限的計算資源下,能夠實時地獲取相對較高精度的2D地圖,考慮到基於模擬策略的粒子濾波方法在較大環境時對記憶體和計算資源的高需求,Cartographer採用基於圖網路的優化方法。
論文中指出,它主要的貢獻並不在演算法層面,而是提供了工程上高效率、Robust的程式碼實現。它的一個關鍵點在於將branch and bound(分支限界演算法)引入到 loop closure的過程中,提高與之前submap比較的效率。
這個系統的目標應用場景:室內服務機器人(如掃地機器人)、無人機等計算資源有限、對精度要求不高、且需要實時避障和尋路的應用。
在無人車領域,可以首先探索在地下車庫進行無人駕駛的應用。
宣告

1. 這是之前的實驗報告,現在只是整理成部落格,參考(甚至是Copy)了很多資料,印象中有泡泡機器人微信公眾號的文章以及知乎使用者的評論,在此表達感謝。我以後會養成引用的習慣,尊重知識版權。
2. 去年9月份做的實驗,而且Cartographer一直在更新,本教程不一定完全適用,有問題請百度或Google。