LOAM / SLAM 開源專案錯誤排除 – 【ROS 學習筆記】

最近有一點時間嘗試了 LiDAR SLAM 或稱為 LOAM,整理這些 Open Source 運行時碰到的問題,有些與 ROS 和 OpenCV 有關。 Visual SLAM 也接觸了 ORBSLAM3,有時間再記錄上來。

LOAM Open Source 統整

LOAM 全名 Lidar Odometry and Mapping,即 LiDAR SLAM,與基於相機的 Visual SLAM 區隔,以下條列幾個常見的開源專案 Git:

目前嘗試過上面幾個開源專案,記錄一下自己的進度,與該專案的特色:

尚未成功運行:

  1. M-LOAM — [Failed] Launch fail
  2. hdl_graph_slam — [Failed] RVIZ PointCloud2 Transform error

成功運行:

  1. LIO-SAM — [Success] Need a powerful PC, severe lag
  2. Loam_velodyne — [Success] can play with pcap file (with bug: Packet containing angle overflow)
  3. LeGO-LOAM — [Success] LiDAR + IMU.
  4. lidar_pose_estimator — [Success] Can run with kitti dataset (bin)
  5. FLOAM — [Success] This work is an optimized version of A-LOAM and LOAM with the computational cost reduced by up to 3 times
F LOAM 範例
FLOAM 範例

目前用起來 FLOAM 是在我的環境碰到最少問題的。

網路上有相當多針對上述這些專案做算法與代碼的分析討論,都寫得很詳細:

https://blog.csdn.net/weixin_44492024/article/details/101452315

https://blog.csdn.net/weixin_44156680/category_11120060.html

下面開始討論在編譯與運行時,遭遇過的問題。

ROS – RVIZ 相關問題

問題1:

遇到點雲等訊息沒有顯示在 RVIZ 畫面,甚至程序崩潰:

[rviz-3] process has died

可能是因為你的系統使用 Mesa graphics drivers (e.g. for Intel GPUs, inside a VM),可以嘗試關閉硬體加速:

export LIBGL_ALWAYS_SOFTWARE=1

再重新運行,一般就會正常顯示。可以先檢查 OpenGL 是否使用 Mesa:

glxinfo | grep OpenGL

參考來源

問題2:

Failed to transform from frame [/camera] to frame [map]

這個問題是在運行 LeGO LOAM時,rviz 出現的錯誤提示,這是因為 tf2 已經不會在 frame_id 前面加 /,所以需要將程式碼中多餘的 / 去掉即可。

參考來源

其他:

RVIZ官網有提供許多問題的解決方案:

http://wiki.ros.org/rviz/Troubleshooting

LOAM velodyne 相關問題

編譯成功後,在運行時遇到的崩潰錯誤:

[multiScanRegistration-2] process has died
[laserMapping-4] process has died

multiScanRegistration died 是因為 prebuild pcl library,需將它移除:

sudo apt-get remove --purge libpcl*

從官方網站重新下載 pcl 包:

https://pcl.readthedocs.io/projects/tutorials/en/latest/compiling_pcl_posix.html

依照步驟安裝:

$ tar xvfj pcl-pcl-1.7.2.tar.gz
$ cd pcl-pcl-1.7.2 && mkdir build && cd build
$ cmake -DCMAKE_BUILD_TYPE=Release ..
$ make -j2
$ make -j2 install

參考來源

laserMapping died 討論串給出的解法,是移除 loam_velodyne/CMakeLists.txt Line 35

add_definitions( -march=native )

參考來源

LeGO LOAM 相關問題

錯誤1:

fatal error: opencv/cv.h: No such file or directory

OpenCV 4 的標頭檔名稱改變,所以需要修改 LeGO LOAM的 Utility.h 文件,引用OpenCV 標頭檔的名稱:

#include <opencv/cv.h>
--> #include <opencv2/opencv.hpp>

參考來源

在 ORBSLAM3 也有一樣問題,發生在 DBoW2 library,這是一個用在閉環檢測/重定位的函式庫,基於詞袋模型計算兩張影像的相似程度,網上一樣有很多介紹就不再贅述。

參考來源

錯誤2:

error: #error PCL requires C++14 or above

如字面意思,使用的 PCL 版本要求 C++ 14,需要對 Lego LOAM的 CMakeLists.txt 做修改:

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -O3") 
--> set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14 -O3"

錯誤3

error: ‘Index’ is not a member of ‘Eigen’

Lego LOAM使用的 gtsam 版本為 4.0.0-alpha2,自帶的 Eigen 版本較舊,沒有 PCL 使用的 Eigen::Index 定義。官方討論區提到的做法是將 /usr/include/pcl-1.10/pcl/filters/voxel_grid.h,在 line 340 and line 669 中的 Eigen::Index 改為 int:

for (Eigen::Index ni = 0; ni < relative_coordinates.cols (); ni++)
-->
for (int ni = 0; ni < relative_coordinates.cols (); ni++)

參考來源

另一種方式是設置使用自己環境的 Eigen,取代 gtsam 自帶的 Eigen:

mkdir build && cd build
cmake -DGTSAM_BUILD_WITH_MARCH_NATIVE=OFF -DGTSAM_USE_SYSTEM_EIGEN=ON ..
sudo make install

參考來源

錯誤4:

/usr/bin/ld: cannot find -lBoost::serialization
/usr/bin/ld: cannot find -lBoost::thread
/usr/bin/ld: cannot find -lBoost::timer
/usr/bin/ld: cannot find -lBoost::chrono

在 CmakeList 中加入:

find_package(Boost REQUIRED COMPONENTS timer thread serialization chrono)

參考來源

hdl_graph_slam 相關問題

錯誤1:

“error: ‘CV_LOAD_IMAGE_GRAYSCALE’ was not declared in this scope”

這是 DSO 算法套件產生的 build error。 DSO 全名 Direct Sparse Odometry,顧名思義是基於直接法與稀疏矩陣的視覺里程演算法,網上有相當多的介紹,這邊就不多做討論:

https://github.com/JakobEngel/dso

https://vision.in.tum.de/research/vslam/dso?redirect=1

Error的原因與 LeGO LOAM錯誤1類似,因為 OpenCV 4 不再使用舊的參數名稱,需要修改為新的參數命名:

CV_LOAD_IMAGE_GRAYSCALE 
--> cv::IMREAD_GRAYSCALE

CV_LOAD_IMAGE_COLOR 
--> cv::IMREAD_COLOR

CV_LOAD_IMAGE_UNCHANGED 
--> cv::IMREAD_UNCHANGED

參考來源

錯誤2:

error: #error PCL requires C++14 or above

跟 LeGO LOAM的錯誤2是一樣的問題,發生在編譯 ndt_omp library 時,在其 CMakeLists.txt中添加:

ADD_COMPILE_OPTIONS(-std=c++11 )
ADD_COMPILE_OPTIONS(-std=c++14 )
set( CMAKE_CXX_FLAGS "-std=c++11 -O3" )

參考來源

https://mapostech.com/dependency/
上一篇:
下一篇: