参考链接:
Loam:Ubuntu20.04下的编译与运行.
Floam:Ubuntu20.04下的编译与运行.

一、源码及数据集下载

源码链接: https://github.com/RobustFieldAutonomyLab/LeGO-LOAM.
将下载好的源码放入建立好的ros工作空间下即可。

关于数据集,在作者的github上也提供了两份不同的数据集,但是我使用的是测试loam的数据集和作者提供的第一份数据集,这里我把原址和百度云地址都贴在下面:

NSH indoor outdoor 数据集:
https://drive.google.com/file/d/1s05tBQOLNEDDurlg48KiUWxCp-YqYyGH/view.
数据集的百度云地址:https://pan.baidu.com/s/1TnLl_8OF5tvv8i-yzrHc7g. 密码: 0qno

作者提供的2份数据集:
https://drive.google.com/drive/folders/1_t5fX5yIqY-y6sAifY8pVWX4O9LCK5R2.
数据集的百度云地址:https://pan.baidu.com/s/1SkrqfN82il1m6jhkLZT-WA. 密码: oqo8

https://drive.google.com/drive/folders/16p5UPUCZ1uK0U4XE-hJKjazTsRghEMJa.

二、安装gtsam

wget -O ~/Downloads/gtsam.zip https://github.com/borglab/gtsam/archive/4.0.0-alpha2.zip
cd ~/Downloads/ && unzip gtsam.zip -d ~/Downloads/
cd ~/Downloads/gtsam-4.0.0-alpha2/
mkdir build && cd build
cmake ..
sudo make install

三、建立ROS工作空间

Ubuntu20.04对应的ROS版本为Noetic,可以按照官网手册安装。建议安装时采用Desktop-Full Install。
安装ROS Noetic: lhttp://wiki.ros.org/noetic/Installation/Ubuntu.
安装好以后即可创建工作空间:

$ mkdir -p ~/catkin_ws/src
$  cd ~/catkin_ws/src
$  catkin_init_workspace
$  cd ~/catkin_ws/
$  catkin_make
$  echo "source ~/catkin_ws/devel/setup.sh" >> ~/.bashrc

然后将git下来的文件中src下的LeGO-LOAM复制到工作空间src下即可catkin_make。

四、LeGO-LOAM的编译

cd ~/catkin_ws/src
git clone https://github.com/RobustFieldAutonomyLab/LeGO-LOAM.git
cd ..
catkin_make -j1  

单独编译ROS包:

catkin_make -DCATKIN_WHITELIST_PACKAGES="lego_loam;cloud_msgs" 

第一次编译代码时,需要在“catkin_make”后面加上“-j1”来生成一些消息类型。以后的编译不需要“-j1”。

五、LeGO-LOAM的运行

运行:

roslaunch lego_loam run.launch

播放数据集:
虽然/imu/data 是可选的,但如果提供它可以大大提高估计精度。

rosbag play *.bag --clock --topic /velodyne_points /imu/data

播放完全的rviz效果:
在这里插入图片描述

六、可能会遇到的问题

1. OpenCV 版本问题

如果你在安装Ubuntu的时候是选择联网更新安装的话,那么应该Eigen3、pcl-1.10和OpenCV都是有的,但是由于20.04自带的是OpenCV4,所以要对Loam代码做一点改动:
找到utility.h中的:#include<opencv/cv.h>,修改为#include <opencv2/imgproc.hpp>。即可成功编译。

2.pcl问题

(1) C++14环境

主要是让LeGO-LOAM支持C++14,所以只需要修改下载下来的源码中CMakeList.txt:

set(CMAKE_CXX_FLAGS "-std=c++14")

(2) 报错:‘Index’ is not a member of ‘Eigen’

/usr/include/pcl-1.10/pcl/filters/voxel_grid.h:340:21: error: ‘Index’ is not a member of ‘Eigen’ 340 | for (Eigen::Index ni = 0; ni < relative_coordinates.cols (); ni++)

对于这个问题,我在LeGO-LOAM的issues中找到了答案:
https://github.com/RobustFieldAutonomyLab/LeGO-LOAM/issues/215.
方法是将voxel_grid.h中报错的Eigen::Indexx修改成int

3. /usr/bin/ld问题

报错如下:

/usr/bin/ld: 找不到 -lBoost::serialization
/usr/bin/ld: 找不到 -lBoost::thread
/usr/bin/ld: 找不到 -lBoost::timer
/usr/bin/ld: 找不到 -lBoost::chrono

在CMakeLists中加入:

find_package(Boost REQUIRED COMPONENTS timer thread serialization chrono)

4. 运行报错

/home/miking/catkin_ws/devel/lib/lego_loam/mapOptmization: error while loading shared libraries: libmetis.so: cannot open shared object file: No such file or directory

解决办法:

/home/miking/catkin_ws/devel/lib/lego_loam/mapOptmization: error while loading shared libraries: libmetis.so: cannot open shared object file: No such file or directory

对于这个问题,我同样也在LeGO-LOAM的issues中找到了答案:
https://github.com/RobustFieldAutonomyLab/LeGO-LOAM/issues/160.
原因是未安装 libmetis 库。通过安装libparmetis-dev修复它重新运行即可:

sudo apt-get install libparmetis-dev

3. rviz问题

在loam中这两个问题也遇到过。
类似于Failed to transform from frame [/camera] to frame [map]的报错问题,其实就是把代码中与rviz相关的frame_id的反斜杠给去掉重新编译即可。以订阅的地图点云为例,其相关的Topic为/registered_cloud,所以在代码中找到/registered_cloud对应的发布者pubRegisteredCloud,将其对应的frame_id中的\去掉即可。
而对应rviz显示大圈圈的问题,只要将每种点云的style修改成Flat Squares即可。

cloudMsgTemp.header.frame_id = "camera_init";
pubRegisteredCloud.publish(cloudMsgTemp);

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐