一、环境准备与ROS安装
1.1 系统要求与双系统安装
首先,LeGO_LOAM肯定是基于ros进行的,所以我们要装好ubuntu系统,我这里安装的是ubuntu20.04,这是最后一个支持ros的Ubuntu发行版了,ROS Noetic Ninjemys安装的过程我们可以按照ros官网的教程来安装,最好安装比较全的版本。
最好可以去ros官网安装一下,可以让我们更了解ros的发展历程和版本迭代cn/ROS/Installation - ROS Wiki
视频教程推荐:当然,如果你的ubuntu系统还没有装好,我建议去b站看机器人阿杰的视频,他教的双系统安装可以说是非常非常nice,但显卡的驱动也可以不按照他说的必须安装nvidia的,也可以安装软件商店里的。
ros安装好之后,我们要从这里开始复现LeGO_LOAM了,由于各种库文件的版本迭代,会有很多报错,下面的内容,大致包含了在Noetic上的会报的所有错误了。
二、依赖环境配置
LeGO_LOAM本身是利用了一些第三方库来简化代码工作的,比如gtsam,tbb,boost等等,我们要想让代码顺利运行起来,第一步就是要安装好这些第三方库,解决好这个对第三方库的依赖问题。
2.1 基础依赖安装
要安装一些依赖库,用apt安装就可以
sudo apt-get install libboost-all-dev
sudo apt-get install cmake
sudo apt-get install libtbb-dev
sudo apt-get install libparmetis-dev
2.2 GTSAM编译安装
我们还要编译安装gtsam,这是LeGO_LOAM中用于图优化的库,这在LeGO_LOAM中发挥了很重要的作用。随便找一个文件夹,克隆一下gtsam,注意我们安装第三方库的时候,涉及到了两种方法,一种是直接应用apt来安装,另一种就是安装gstsam的方法,从github上把代码克隆下来,然后进行编译安装,但是我们最终都是安装到了系统上,所以当第三方库已经安装完成时,我们可以把刚刚这个临时文件夹删掉,不会影响已经安装的库的使用。
git clone https://github.com/borglab/gtsam.git
mkdir build
cd build
cmake ..
make check (optional, runs unit tests)
make install
然后我们可以克隆LeGO_LOAM库,首先创建一个工作空间,工作空间的名字可以随便起,但是既然是一个工作空间的话,里面一定要有src文件夹,我们在工作空间的src目录中克隆LeGO_LOAM源代码。
mkdir LeGOLAOM_ws
cd LeGOLAOM_ws
mkdir src
cd src
git clone https://github.com/RobustFieldAutonomyLab/LeGO-LOAM.git
cd ..
catkin_make
catkin_make是编译指令,并且这个编译指令需要在工作空间目录下进行的,这一点一定要注意,而且工作空间下一定要有一个src,legoloam的源代码放在src目录下,才能开始编译(编译一上来就会找src的)
三、LeGO-LOAM源码编译与排错
3.1 创建工作空间
现在我们可以克隆LeGO_LOAM库,首先创建一个工作空间,工作空间的名字可以随便起,但是既然是一个工作空间的话,里面一定要有src文件夹,我们在工作空间的src目录中克隆LeGO_LOAM源代码。
mkdir LeGOLAOM_ws
cd LeGOLAOM_ws
mkdir src
cd src
git clone https://github.com/RobustFieldAutonomyLab/LeGO-LOAM.git
cd ..
catkin_make
catkin_make是编译指令,并且这个编译指令需要在工作空间目录下进行的,这一点一定要注意,而且工作空间下一定要有一个src,legoloam的源代码放在src目录下,才能开始编译(编译一上来就会找src的)
3.2 常见编译错误解决方案
虽然源码已经准备好了,但是在这里进行编译的话,大概率还会报错,反正我是遇到了,第一个是opencv的依赖问题
错误1:OpenCV头文件缺失
现象:
opencv/cv.h: No such file or directory
解决方案: 我们需要改一下代码里的这一部分,把include/utility.h中的opencv改一下,
// #include <opencv/cv.h>
#include <opencv2/imgproc.hpp>
这样就能找到ubuntu20.04所带的opencv了,这其实是一个版本问题,如果我们使用的是 OpenCV 3.x 或者更高版本就很容易碰见这个问题,<opencv/cv.h>
是一个旧版本的头文件路径,已经被拆分为多个模块化头文件,并且这些头文件存放的位置也发生了变化,所以这里有所改变。
错误2:C++标准版本过低
改完opencv之后并没有完事大吉,当我再次进行编译时,我又遇到了新问题,就是这个关于PCL的报错内容
现象:
#error PCL requires C++14 or above
解决方案:
这个提示我们可以很明显的看到提示,这里的报错提示说PCL需要c++14或以上,但代码里只支持了C++11,这就是产生错误的原因,所以需要我们改一下,避免PCL出现异常。
# set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -O3")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14")
把上面的改成下面的就解决了PCL库的报错问题。
错误3:Boost组件缺失
随后我又遇到了关于Boost的报错,这个意思其实也很明显,主要是说有一些boost的组件找不到,即依赖项找不到,如下图所示
现象:
解决方案: 找不到这几个东西,那我们就在CMakelists.txt里面改一下,添加一句
find_package(Boost REQUIRED COMPONENTS timer thread serialization chrono)
这样find_package就能找到Boost的这些组件,最后链接到代码上去。
然后再进行catkin_make,就能编译成功啦,编译成功之后应该可以在工作空间下看到一个新的devel和build文件夹,这里面有关于编译的所有内容。
最后需要进行就是运行代码了,按照github上的教程来就好。
一定要记得在运行前source一下source devel/setup.bash
,当然如果我们觉得每次运行都得重新source很麻烦,可以将这个source指令写入.bashrc中,以后就不用每次都进行source了。写入方式也不难,我们直接编辑.bashrc文件就好。
vim ~/.bashrc
在文件末尾加入下面的代码
source /path/to/your/ros_workspace/devel/setup.bash
关于这个.bashrc文件,它是在每个终端打开时进行自动进行的source,所以我们以后任意打开终端,都不用再source了。如果我们想它在当前终端中立即生效的话,我们需要手动source一下,即
source ~/.bashrc
然后如图所示输入roslaunch指令roslaunch lego_loam run.launch
,legolaom就运行起来了。
点击【SLAM经典算法详解】Ubuntu 20.04部署LeGO-LOAM:从环境配置到KITTI适配,解决常见编译错误查看全文