3D激光點雲數據處理入門(一)—— 使用LOAM進行點雲地圖創建
LOAM 原理簡述
論文地址 : LOAM: Lidar Odometry and Mapping in Real-time
作者主頁: Ji Zhang, Ph.D 其中有作者所有的相關論文,並且都附有 Video, 感興趣的可以去查看。
Google Scholar
作者想解決的問題: 構建低漂移的里程計。論文完成的工作是使用3D激光雷達構建出的里程計構來建三維點雲地圖。 但是作者的目標是縮小激光里程計的漂移和計算量,重點並不是構建出三維地圖,所以作者沒有考慮迴環問題(loop closure)。
作者實現的方法 : 作者的思路同SLAM(simulanteous localization and mapping)的思路一致,算法思路如下圖
主要經過以下幾個步驟
- Point Cloud Registration - 接收激光數據,完成點雲的註冊和特徵點雲(邊和麪)提取。
- Lidar Odometry - 通過特徵點雲的匹配以10hz頻率發佈一個里程計。此時的里程計精度並不高。
- Lidar Mapping - 接收里程計信息和當前點雲數據,基於粗匹配的里程計位姿進行精匹配,根據估計出的位姿將點雲註冊到地圖中,並按照1hz發佈更新後的位姿。
- Transform Integration - 接收 lidar odometry 和 lidar mapping 發佈的位姿信息,以10hz 的頻率發佈里程計信息。
topic關係
運行 'rosrun rqt_graph rqt_graph
, 我們可以查看各個 topic 和節點的關係。
算法分析
- 如何選取特徵點 邊點(edge point)和平面點 (planar point)
作者首先定義了一個衡量點平滑度的公式 , 通過測量點兩邊的距離差異,來衡量該點的平滑程度。c值最大的點將作爲邊點而cz值最小的點爲平面點。 將360度分爲四個區域,每個區域最多產生兩個邊點和四個平面點。這些邊點和平面點如下圖所示。
這些提取出來的點作爲特徵點來完成前後幀的匹配,來估計自身的位姿。
- 構建損失函數 特徵點選取後, 根據 tf 關係轉換到 map 座標系下,在map 中尋找最近的 邊點和平面點, 將兩個最近的邊點和平面點當成對應點構建一個轉換矩陣,(t_x, t_y, t_z, theta), 對該轉換舉證求雅克比,使用高斯牛頓法縮小損失函數直至收斂。
算法僞代碼
===========
未完待續!!!
- 矩陣的轉換和實現
- 算法結果
LOAM 建圖實踐
創建你的 ROS Workspace
$ mkdir -p ~/catkin_ws/src
$ cd ~/catkin_ws/
$ catkin_make
$ source devel/setup.bash
下載LOAM Package
$ cd ~/catkin_ws/src
$ git clone https://github.com/laboshinl/loam_velodyne.git
$ cd ..
$ catkin_make -DCMAKE_BUILD_TYPE=Release
$ source ~/catkin_ws/devel/setup.bash
下載數據包
$ wget http://www.aisl.cs.tut.ac.jp/databases/hdl_graph_slam/hdl_400.bag.tar.gz
$ tar -axvf hdl_400.bag.tar.gz
運行 LOAM
$ roslaunch loam_velodyne loam_velodyne.launch
$ rosbap play hdl_400.bag