最近有一點時間嘗試了 LiDAR SLAM 或稱為 LOAM,整理這些 Open Source 運行時碰到的問題,有些與 ROS 和 OpenCV 有關。 Visual SLAM 也接觸了 ORBSLAM3,有時間再記錄上來。
LOAM Open Source 統整
LOAM 全名 Lidar Odometry and Mapping,即 LiDAR SLAM,與基於相機的 Visual SLAM 區隔,以下條列幾個常見的開源專案 Git:
目前嘗試過上面幾個開源專案,記錄一下自己的進度,與該專案的特色:
尚未成功運行:
- M-LOAM — [Failed] Launch fail
- hdl_graph_slam — [Failed] RVIZ PointCloud2 Transform error
成功運行:
- LIO-SAM — [Success] Need a powerful PC, severe lag
- Loam_velodyne — [Success] can play with pcap file (with bug: Packet containing angle overflow)
- LeGO-LOAM — [Success] LiDAR + IMU.
- lidar_pose_estimator — [Success] Can run with kitti dataset (bin)
- FLOAM — [Success] This work is an optimized version of A-LOAM and LOAM with the computational cost reduced by up to 3 times
目前用起來 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" )