上一篇博客是在虚拟机上安装VINS,莫名其妙的失败了,经过一番垂死挣扎,博主不得不承认,这个系列胎死腹中了,博主怀疑可能是虚拟机导致的问题,打算换成双系统试试。正好最近公司有个激光雷达的相关项目,博主借此机会搞来了一台新电脑,安装了双系统,下面先记录一下Lidar的学习过程,VIO系列待有空再补上。
Lidar SLAM没找到什么合适的入门书籍,还是把高博的《SLAM十四讲》拿出来重新学习一遍吧。
这回我们吸取教训,使用双系统来搭建整个环境。
双系统是请公司管理计算机的同事帮忙安装的,略过不谈。各位请自行百度,或向学长求救。
这部分见我VIO系列的VINS环境搭建文章。
安装时多行命令请一行行执行,以免漏装,以后不再重复
sudo apt install git #安装git
Kinetic自带Eigen3.2.92,我们需要重新安一下3.3.7。简单说下为什么,LeGO-LOAM采用gtsam作为全局优化,而gtsam最新版4.0,依赖于Eigen3.3.7,虽然gtsam自带Eigen3.3.7,但我们要将其配置成采用ROS系统带的Eigen,这样以后安装其他依赖于Eigen的软件时,就可以统一使用系统自带的Eigen,而不是每一个软件都要配一个对应版本的Eigen。
自带的Eigen会默认安装在以下文件夹中,如果大家发现Eigen安到别的地方去了,可以参考以下文章
Ubuntu 16.04, 卸载&安装 Eigen
Ubuntu中如何查找文件
sudo rm -rf /usr/include/eigen3 /usr/lib/cmake/eigen3 /usr/share/doc/libeigen3-dev /usr/share/pkgconfig/eigen3.pc /var/lib/dpkg/info/libeigen3-dev.list /var/lib/dpkg/info/libeigen3-dev.md5sums
sudo wget https://github.com/eigenteam/eigen-git-mirror/archive/3.3.7.tar.gz #下载Eigen3.3.7
sudo tar -xzvf 3.3.7.tar.gz
sudo mv eigen-git-mirror-3.3.7/ eigen-3.3.7/
cd eigen-3.3.7/
sudo mkdir build
cd build
sudo cmake ..
sudo make install
sudo ldconfig -v
cd ../..
sudo rm -r 3.3.7.tar.gz eigen-3.3.7/
这时我们可以看到在/usr/local/include
中已经有了eigen3文件夹,该文件夹内包含/Eigen
、/unsupported
、signature_of_eigen3_matrix_library
共两个文件夹和一个文件
由于目前程序都是以/usr/local/include/Eigen
或/usr/include/Eigen
作为Eigen的根目录的,故我们目前的安装目录可能导致程序报找不到Eigen的错。
目前有以下3种解决方法,可以根据自己需要来选择。
1、直接将/usr/local/include/Eigen
文件夹整个拷贝到/usr/local/include
以及/usr/include
下
sudo cp -r /usr/local/include/eigen3/Eigen /usr/local/include /usr/include
2、在/usr/local/include
以及/usr/include
下建立3个软链接,分别指向/Eigen
、/unsupported
、/eigen3
sudo ln -s /usr/local/include/eigen3/Eigen /usr/local/include/Eigen
sudo ln -s /usr/local/include/eigen3/unsupported /usr/local/include/unsupported
sudo ln -s /usr/local/include/eigen3/Eigen /usr/include/Eigen
sudo ln -s /usr/local/include/eigen3/unsupported /usr/include/unsupported
sudo ln -s /usr/local/include/eigen3 /usr/include/eigen3
3、以后在所有的CMakeLists.txt
中添加Eigen
目录
#CMakeLists.txt
...
include_directories( "/usr/local/include/eigen3" )
...
博主采用的是第2种方法,如果这步不解决该问题,等到编译LeGO-LOAM时会报找不到Eigen的错误。
安gtsam之前呢,我们得先安一下gtsam的依赖项,对,没错,没完没了的依赖项!
Prerequisites:
- Boost >= 1.43 (Ubuntu: sudo apt-get install libboost-all-dev)
- CMake >= 3.0 (Ubuntu: sudo apt-get install cmake)
- A modern compiler, i.e., at least gcc 4.7.3 on Linux.
Optional prerequisites - used automatically if findable by CMake:
- Intel Threaded Building Blocks (TBB) (Ubuntu: sudo apt-get install libtbb-dev)
- Intel Math Kernel Library (MKL)
理论上我们的系统上应该自带了boost 1.58版本,为了以防万一,你懂得
sudo apt-get install libboost-all-dev
同样,理论上我们的系统上应该自带了cmake 3.5.1版本,为了以防万一,你懂得
sudo apt-get install cmake
同样,理论上我们的系统上应该自带了TBB 4.4版本,为了以防万一,你懂得
sudo apt-get install libtbb-dev
注意!MKL可以不用装,如果一定要使用MKL的话,必须使用gtsam已打过补丁的Eigen版本,详见gtsam的CMakeLists的280行
去Intel Math Kernel Library (MKL)下载,产品选Intel Math Kernel Library for Linux
,下载项选Full Package
。
下载完成后,会得到一个名为l_mkl_2019.5.281.tgz
的压缩包,进入到该压缩包所在目录后,将该压缩包解压。
cd xxx #这里 xxx 代表了压缩包所在目录
tar -xvzf l_mkl_2019.5.281.tgz
解压后,会在该目录下生成一个l_mkl_2019.5.281
的文件夹,进入该文件夹,运行安装脚本
cd l_mkl_2019.5.281
sudo ./install_GUI.sh
此时会跳出像windows安装程序时一样的安装界面,一路accept、next、install后ok了。默认安装在/opt/intel
,赶紧去/opt
里找找看。
配置环境变量,需要输入参数,请参考Scripts to Set Environment Variables
sudo /opt/intel/mkl/bin/mklvars.sh intel64
安装完成后,我们要验证一下安装是否正确。
cd /opt/intel/mkl/examples #进入intel自带例子文件夹
sudo mkdir examples_core_c
sudo tar -xvzf examples_core_c.taz -C ./examples_core_c #将压缩包解压到examples_core_c文件夹
cd examples_core_c/cblas
sudo gedit makefile #由于我们强迫症上一步多建立了一级目录,也就是examples_core_c所以需要更改一下makefile里的相对索引
在makefile文件中将第74行的MKLROOT = ../..
改为MKLROOT = ../../..
,顺便提一句gedit的行号显示在右下角。
右上角点保存后退出。这时我们就可以编译了
sudo make -j12 libintel64 compiler=gnu #-j12是指用多少个线程去编译,采用多线程编译可以有效的节省编译时间
好了 此时我们就可以去/_results/gnu_lp64_parallel_intel64_lib
文件夹里去查看刚才生成的文件了,就是诸如.out
、.res
的文件,别看我,我也不知道这东西都是干什么的。。。。
最后别忘了把刚才下载和解压缩的l_mkl_2019.5.281文件夹和l_mkl_2019.5.281.tgz给删掉
rm -rf xxx/l_mkl_2019.5.281
rm -rf xxx/l_mkl_2019.5.281.tgz #xxx是我们之前下载该压缩包的目录
好了,现在我们可以开始安装gtsam
git clone https://bitbucket.org/gtborg/gtsam.git
cd gtsam/
gedit CMakeLists.txt # 修改284行,将)前的OFF改为ON,意为使能该编译选项,这里我们使用系统自带Eigen
sudo mkdir build &&cd build #如果是在home及其子文件下 不要加sudo 免得给自己找事
cmake ..
暂停一下,我们需要更改一下build文件夹中的GTSAMConfig.cmake文件
sudo gedit GTSAMConfig.cmake
将该文件中第17行的find_dependency
改为find_package
,否则在编译LeGO-LOAM时会遇到Invalid arguments to find_dependency
的错误,感谢这位博主提供的宝贵经验。修改后保存退出,我们继续
sudo make -j12 check #可选 如果是在home及其子文件下 不要加sudo 有多线程一定要记得开哦
sudo make -j12 install # 有多线程一定要记得开哦 一定要加sudo哦
check和install都比较耗时,如果cpu有多个线程一定要开多线程,不然就会像这位博主一样,花了一个多小时去编译,这里我们感谢一下这位博主的宝贵经验。
终于,终于,我们要开始正式安装LeGO-LOAM了,我打赌已经有人忘记我们最初的目标是安装LeGO-LOAM了。
LeGO-LOAM的编译需要使用catkin,还记得我们在装ROS时干了什么吗?不记得赶紧回去看看
cd ~/catkin_ws/src #进入ROS工作空间源代码目录
git clone https://github.com/RobustFieldAutonomyLab/LeGO-LOAM.git
cd .. #回到 ~/catkin_ws 目录下
catkin_make -j12 #作者原话是catkin_make -j1 这里初次编译时-j1目的是为了生成某些message types,以后就不用输了
#我这里改成12是采用多线程,目前还不清楚是否会产生什么后续问题
echo "source ./devel/setup.bash" >> ~/.bashrc #将环境变量加入到启动文件中,省的每次开shell都要重新输一遍
source ~/.bashrc #这两句安装ROS时我们也输过哦 忘记了可以回去看看
经过两天的艰苦奋斗(吐个槽,完全没体会到linux的便捷性),我们终于把LeGO-LOAM装好了,下面自然要跑一跑数据集看看效果喽。
感谢这位博主提供的官网数据集百度网盘链接,提取码:l5rl
自行下载数据集,并将数据集拷贝到ubuntu下。为了方便,我们在catkin_ws
下新建一文件夹作为以后数据集的存放处。
cd ~/catkin_ws
mkdir dataset
然后就把U盘中的nsh_indoor_outdoor.bag
放到这个dataset文件夹中。
然后激动人心的时刻到了!!!打开一个终端输入
roslaunch lego_loam run.launch
打开另一个终端输入
rosbag play --clock ~catkin_ws/dataset/nsh_indoor_outdoor.bag
当当当!!!
恭喜大家,当rviz软件上开始出现如上画面时,说明我们已经完成了一个阶段性的成果。至此本博文结束,下一篇博文开始介绍如何使用自己的数据集跑通LeGO-LOAM。