参考链接:
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.
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
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。
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”。
运行:
roslaunch lego_loam run.launch
播放数据集:
虽然/imu/data 是可选的,但如果提供它可以大大提高估计精度。
rosbag play *.bag --clock --topic /velodyne_points /imu/data
如果你在安装Ubuntu的时候是选择联网更新安装的话,那么应该Eigen3、pcl-1.10和OpenCV都是有的,但是由于20.04自带的是OpenCV4,所以要对Loam代码做一点改动:
找到utility.h
中的:#include
,修改为#include
。即可成功编译。
主要是让LeGO-LOAM支持C++14,所以只需要修改下载下来的源码中CMakeList.txt:
set(CMAKE_CXX_FLAGS "-std=c++14")
/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::Index
x修改成int
。
/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)
/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
在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);