背景:SLAM小白,因为项目需要花了两天时间编译代码+连接雷达实现了交互。
踩了很多坑,简单记录一下,让后面感兴趣的朋友少走点弯路~ 肯定有很多不专业的、错误的地方,还请大家不吝赐教(噗通)
也可以见知乎:https://zhuanlan.zhihu.com/p/357020888/ (我发现从知乎复制内容到CSDN特别方便啊)未完待续惹
主要分为5个部分:
目录
1. 安装 ROS
2. 安装 OpenCV
3. 安装 GTSAM (Georgia Tech Smoothing and Mapping library, 4.0.0-alpha2)
4. 安装 PCL
5. 重头戏来了!编译 LeGO-LOAM-BOR
6. 跑包,在数据集上进行测试
7 删除LeGO-LOAM-BOR,重新下载编译LeGO-LOAM
8 与Velodyne VLP-16 三维激光雷达连接
9 实时建图:算法和雷达交互
10 小车及大范围场景的实时建图
参考文献
源代码github:https://github.com/RobustFieldAutonomyLab/LeGO-LOAM/
优化版本的代码:https://github.com/facontidavide/LeGO-LOAM-BOR/tree/speed_optimization
硬件设备:Intel NUC 10代i7(NUC10i7FNH)
软件系统:Ubuntu 16.04
如果要正确编译、运行算法,相关依赖库必须准确、完整安装好,要不然会各种报错,绕路踩坑。下面对相关依赖库安装流程简要叙述。观察CMakeLists.txt,主要需要以下几个库:
find_package(GTSAM REQUIRED QUIET)
find_package(PCL REQUIRED QUIET)
find_package(OpenCV REQUIRED QUIET)
当然,还有必须要的ROS。
机器预先已装 ROS-kinetic,具体安装过程这里不再赘述。
机器预先已装 OpenCV 4.3.0,具体安装过程这里不再赘述。
测试是否安装正确:
转到~/opencv-4.3.0/samples/cpp/example_cmake 目录下,打开终端,输入:
cmake .
make
./opencv_example
如果右上角,弹框出现 Hello OpenCV 则证明安装成功,如下图:
参考https://github.com/RobustFieldAutonomyLab/LeGO-LOAM/中Dependency
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
正在编译
安装完成示意
一开始没有注意要安装PCL,直接尝试编译LeGO-LOAM,发现无法通过编译,报错
Invoking "cmake" failed
或者
Invoking "make cmake_check_build_system" failed
后来才发现,需要安装PCL (捂脸)
PCL Address: https://github.com/PointCloudLibrary/pcl
4.1 首先提前安装PCL需要的各种依赖包
sudo apt-get update
sudo apt-get install git build-essential linux-libc-dev
sudo apt-get install cmake cmake-gui
sudo apt-get install libusb-1.0-0-dev libusb-dev libudev-dev
sudo apt-get install mpi-default-dev openmpi-bin openmpi-common
sudo apt-get install libflann1.8 libflann-dev
sudo apt-get install libeigen3-dev
sudo apt-get install libboost-all-dev
sudo apt-get install libvtk5.10-qt4 libvtk5.10 libvtk5-dev
sudo apt-get install libqhull* libgtest-dev
sudo apt-get install freeglut3-dev pkg-config
sudo apt-get install libxmu-dev libxi-dev
sudo apt-get install mono-complete
sudo apt-get install qt-sdk openjdk-8-jdk openjdk-8-jre
PCL可视化相关函数库安装
sudo apt-get install libopenni-dev
sudo apt-get install libopenni2-dev
(有的教程表示 Boost >= 1.43,CMake >= 2.6,at least gcc 4.7.3 on Linux,so, 装过的朋友尽量装新版的API。)
4.2 从Github上clone PCL源码
git clone https://github.com/PointCloudLibrary/pcl.git
4.3 编译PCL
cd pcl
mkdir release
cd release
cmake -DCMAKE_BUILD_TYPE=None -DCMAKE_INSTALL_PREFIX=/usr \
-DBUILD_GPU=ON -DBUILD_apps=ON -DBUILD_examples=ON \
-DCMAKE_INSTALL_PREFIX=/usr ..
make
4.4 安装
sudo make install
4.5 在自己的代码里,测试PCL点云显示(这步非常关键!)
测试代码pcl_test.cpp:
#include
#include
#include
#include
#include
#include
int main(int argc, char **argv) {
std::cout << "Test PCL !!!" << std::endl;
pcl::PointCloud::Ptr point_cloud_ptr (new pcl::PointCloud);
uint8_t r(255), g(15), b(15);
for (float z(-1.0); z <= 1.0; z += 0.05)
{
for (float angle(0.0); angle <= 360.0; angle += 5.0)
{
pcl::PointXYZRGB point;
point.x = 0.5 * cosf (pcl::deg2rad(angle));
point.y = sinf (pcl::deg2rad(angle));
point.z = z;
uint32_t rgb = (static_cast(r) << 16 |
static_cast(g) << 8 | static_cast(b));
point.rgb = *reinterpret_cast(&rgb);
point_cloud_ptr->points.push_back (point);
}
if (z < 0.0)
{
r -= 12;
g += 12;
}
else
{
g -= 12;
b += 12;
}
}
point_cloud_ptr->width = (int) point_cloud_ptr->points.size ();
point_cloud_ptr->height = 1;
pcl::visualization::CloudViewer viewer ("test");
viewer.showCloud(point_cloud_ptr);
while (!viewer.wasStopped()){ };
return 0;
}
CMakeLists.txt文件
cmake_minimum_required(VERSION 2.6)
project(pcl_test)
find_package(PCL 1.2 REQUIRED)
include_directories(${PCL_INCLUDE_DIRS})
link_directories(${PCL_LIBRARY_DIRS})
add_definitions(${PCL_DEFINITIONS})
add_executable(pcl_test pcl_test.cpp)
target_link_libraries (pcl_test ${PCL_LIBRARIES})
install(TARGETS pcl_test RUNTIME DESTINATION bin)
将pcl_test.cpp和CMakeLists.txt放在同一个文件夹下,如下图(具体文件夹没有要求)
执行:
cmake .
make
./pcl_test
4.6 然后报错:o(╥﹏╥)o 这个错误还是很常见的
bug: fatal error: pcl/visualization/pcl_visualizer.h: No such file or directory
这就体现了,运行测试代码的重要性,之前编译PCL都没有任何问题。
错误的原因是:没有正确安装好PCL库,PCL库的可视化需要依赖VTK库,所以如果没有提前装VTK,就会遇到这个问题。
解决方法:先装VTK和其他依赖包,再装PCL。(仔细一想,我是没有装VTK,惹)
4.7 安装VTK
4.7.1 在按照VTK之前,要安装依赖库X11,OpenGL和CMake-gui
首先安装X11
sudo apt-get install libx11-dev libxext-dev libxtst-dev libxrender-dev libxmu-dev libxmuu-dev
安装OpenGL
sudo apt-get install build-essential libgl1-mesa-dev libglu1-mesa-dev
安装 CMake-gui
sudo apt-get install cmake cmake-gui
4.7.2 下载VTK源代码
下载链接:https://www.vtk.org/download/
PCL和VTK可能存在版本需求,截止安装日2020年3月9日,PCL官网版本为1.11,(可以在/usr/include中寻找自己的PCL版本。)这里我下载的VTK版本是7.1.1,选择下图中的,VTK-7.1.1.tar.gz,下载完成后解压缩到文件夹中,自定义安装目录。(亲测可以使用。具体对应关系还不清楚惹。)
4.7.3 安装VTK
(1) 终端输入下指令,启动cmake-gui;
cmake-gui
(2) 设置where is the source code:的路径为文件夹VTK-7.1.1所在路径,如这里是/home/js/VTK-7.1.1;
(3) 设置where to build the binaries:的路径为/home/js/VTK-7.1.1/build,即在/home/VTK-7.1.1的路径下新建文件夹build;如下图
(4) 点击“Configure”,在弹出对话框中选择“Current Generator”为“Unix MakeFiles”,完成之后会提示“Configuring done”;
(5) 然后在里面勾选“VTK_GROUP_Qt”选项,再次点击“Configure”按钮,若提示警告信息,需要设置Qt安装路径,则设置路径后,再次点击“Configure”按钮;
(6) 提示“Configure done”,点击“Generate”按钮,在vtk_build会生成工程文件,完成之后会提示“Generating done”,如下图
(7) cd到vtk目录下的build文件夹,若没有则在使用$mkdir build来创建
(8) 终端输入,编译和安装
sudo make
sudo make install
至此,VTK安装完成!
4.8 卸载PCL
因为之前装了错误的PCL,所以需要卸载掉PCL,再重新安装。
终端内输入
sudo rm -r /usr/include/pcl-1.11 /usr/share/pcl-1.11 /usr/bin/pcl* /usr/lib/libpcl*
sudo apt-get remove libpcl-dev pcl-tools
即可。
4.9 重新安装PCL
因为已经安装好了依赖包,所以无需重新安装。重复4.2~4.4即可。
4.10 测试PCL
重复4.5步骤,此时不再显示错误,显示如下图形!
如果一开始不显示圆环(可能是一个矩形块)也不要紧,缩小即可见到。
PCL-1.11, VTK-7.1.1,Yes!
因为一开始编译LeGO-LOAM出错,所以这次装一下优化版本LeGO-LOAM-BOR,希望不出错(事实证明只是我一厢情愿罢了)。
执行:
cd ~/catkin_ws/src
git clone https://github.com/facontidavide/LeGO-LOAM-BOR.git
cd ..
catkin_make
呃,非常抱歉,还是没有编译成功。
5.1 出错1
报错:
Invoking "cmake" failed
pip install -U rosdep rosinstall_generator wstool rosinstall six vcstools
Invoking "make cmake_check_build_system" failed
-- Could NOT find cv_bridge (missing: cv_bridge_DIR)
cv_bridge 是opencv和ros连接起来的桥,这个意思就是ROS缺少了cv_bridge,下面提供解决方案。
5.1.1 下载cv_bridge
git clone https://github.com/ros-perception/vision_opencv.git
5.1.2 找到下载文件地址,将vision_opencv中的cv_bridge/拿出来,放到工作空间(catkin_wa/src)中,编译:
cd ~/catkin_ws/src/cv_bridge
mkdir build
cd build
cmake ..
make
sudo make install
(1) 很不幸,编译不通过,报错:
Boost include path: /usr/include
Could not find the following Boost libraries:
boost_python37
No Boost libraries were found. You may need to set BOOST_LIBRARYDIR to the
directory containing Boost libraries or BOOST_ROOT to the location of Boost.
这个意思是,电脑里找不到boost_python37库,这个原因可能是装了其他的python版本。导致命名出现问题。
解决方案:进入/usr/lib/x86_64-linux-gnu文件夹中查看相关boost_python库,如图所示,发现没有boost_python37的相关库,只有python-py35的库。
我们要建立python-py35到python-py37的软连接。如果没找到python-py35而是找到了python-py3x(x为数字,可能为6,对应python3.6版本;可能为7,对应python3.7版本或者其他数字),解决方案相同,建立软连接即可。
即 py35.s0 -> py37.so py35.a -> py37.a,打开终端,输入
cd /usr/lib/x86_64-linux-gnu/
sudo ln -s libboost_python-py35.so libboost_python37.so
sudo ln -s libboost_python-py35.a libboost_python37.a
5.1.3 重新编译cv_bridge,重复(2)中操作
编译成功啦!
5.2 出错2
然后我们重新编译LeGO-LOAM-BOR,继续报错:
Could not find a package configuration file provided by "pcl_ros" with any of the following names:
pcl_rosConfig.cmake
pcl_ros-config.cmake
这个好解决,缺少pcl-ros
打开终端输入
sudo apt-get install ros-kinetic-pcl-ros
安装pcl-ros。
5.3 出错3
然后我们重新编译LeGO-LOAM-BOR,继续报错:
CMake Error at /home/js/catkin_ws/devel/share/ddynamic_reconfigure/cmake/ddynamic_reconfigureConfig.cmake:113 (message):
Project 'ddynamic_reconfigure' specifies
'/home/js/catkin_ws/src/ddynamic_reconfigure-kinetic-devel/include' as an
include dir, which is not found. It does neither exist as an absolute
directory nor in
这个问题是缺少ddynamic_reconfigure
我们打开终端输入
sudo apt-get install ros-kinetic-ddynamic-reconfigure
安装ddynamic-reconfigure,然后将文件夹复制到catkin_ws/src中,如下图
5.4 出错4
然后我们重新编译LeGO-LOAM-BOR,继续报错:
make 66%时错误
error: return-statement with no value, in function returning ‘int’ [-fpermissive]
efine import_array() {if (_import_array() < 0) {PyErr_Print(); PyErr_SetString(PyExc_ImportError, "numpy.core.multiarray failed to import"); return NUMPY_IMPORT_ARRAY_RETVAL; } }
note: in definition of macro ‘import_array’
efine import_array() {if (_import_array() < 0) {PyErr_Print(); PyErr_SetString(PyExc_ImportError, "numpy.core.multiarray failed to import"); return NUMPY_IMPORT_ARRAY_RETVAL; } }
src/CMakeFiles/cv_bridge_boost.dir/build.make:62: recipe for target 'src/CMakeFiles/cv_bridge_boost.dir/module.cpp.o' failed
make[2]: *** [src/CMakeFiles/cv_bridge_boost.dir/module.cpp.o] Error 1
CMakeFiles/Makefile2:930: recipe for target 'src/CMakeFiles/cv_bridge_boost.dir/all' failed
make[1]: *** [src/CMakeFiles/cv_bridge_boost.dir/all] Error 2
Makefile:140: recipe for target 'all' failed
make: *** [all] Error 2
解决方法是,修改/home/js/catkin_ws/src/cv_bridge/src/module.hpp(根据自己的路径),将最后一段(36~40)行改为
static void do_numpy_import( )
{
import_array( );
}
5.5 然后我们重新编译LeGO-LOAM-BOR,终于成功了!!
catkin_make
6.1 针对LeGO-LOAM-BOR方法,在数据集上进行测试。
数据集地址:
https://github.com/TixiaoShan/Stevens-VLP16-Datasetgithub.com
https://github.com/RobustFieldAutonomyLab/jackal_dataset_20170608github.com
下载数据集,然后在catkin_ws中新建dataset文件夹,保存数据包,打开终端输入
cd ~/catkin_ws
mkdir dataset
然后拷贝数据包,如下图。
其中,nsh_indoor_outdoor.bag有国内百度网盘链接,提取码:l5rl
https://pan.baidu.com/s/1UswMElc81AKY8hnpmkjnrApan.baidu.com
打开终端,输入
roslaunch lego_loam_bor run.launch rosbag:=~catkin_ws/dataset/nsh_indoor_outdoor.bag lidar_topic:=/velodyne_points imu_topic:=/imu/data
其中,~catkin_ws/dataset/nsh_indoor_outdoor.bag 为数据集绝对路径,也可以cd进数据集文件夹,输入相对路径。其中,/imu/data是可选的
但是,很遗憾,失败了,提示无法打开数据包。
6.2 针对LeGO-LOAM-BOR方法,实时建图。
也不知道这个方法啥原因,我决定再试试给个机会,基于VLP雷达实时建图试试。
(1)首先要修改run.launch,可以另存为run1.launch:
(2)启动Velodyne16激光雷达
roslaunch velodyne_pointcloud VLP16_points.launch
(3)启动LeGO-LOAM-BOR
roslaunch lego_loam_bor run1.launch
可以正常启动,但是建图效果十分怪异,无法进行旋转,只是一个二维的,不给机会了,换回原来的方法!
7.1 编译LeGO-LOAM
我怀疑可能是LeGO-LOAM-BOR算法的问题,也有可能是我的问题。不管了,我准备卸载掉LeGO-LOAM-BOR,重新编译LeGO-LOAM。
搜索LeGO-LOAM-BOR,将所有与LeGO-LOAM-BOR相关的文件、文件夹都删去
因为LeGO-LOAM-BOR和LeGO-LOAM需要的依赖库相同,所以无需重复安装依赖库,直接下载编译即可。
cd ~/catkin_ws/src
git clone https://github.com/RobustFieldAutonomyLab/LeGO-LOAM.git
cd ..
catkin_make -j1
编译完成示意图:
7.2 跑包,在数据集上进行测试LeGO-LOAM
打开终端输入
roslaunch lego_loam run.launch
cd到数据集文件夹下面,重新开启一个终端,输入
rosbag play --clock nsh_indoor_outdoor.bag
或者是
rosbag play nsh_indoor_outdoor.bag --clock --topic /velodyne_points /imu/data
(也可以输入数据集绝对路径)
即可看到数据集运行效果
也可以更换数据集,
rosbag play --clock 1.bag
其他数据集加载方式完全相同。
VLP-16与计算机采用网线连接,而不是2D雷达多采用USB连接。
此时,出现了一个问题,终端输入ifconfig,找不到有限网卡,只有lo,无线网卡,并没有表示eth0等的有限网卡。
8.1 尝试重新装有限网卡驱动
尝试了重新装有限网卡驱动,首先
lspci | grep -i net.
找网络控制器,lspci. 找所有硬件设备,很抱歉,一串字母,我也不知道这个设备是什么网卡。如果有了解这个啥意思的欢迎留言告诉~
查阅了网上的资料,应该是I219-V网卡,对应的驱动型号是e1000e。从
Download Intel® Network Adapter Driver for PCIe* Intel® Gigabit Ethernet Network Connections under Linux*downloadcenter.intel.com
下载了网卡驱动,直接下载点击安装即可。
下载了两个版本:3.8.4和3.5.1,进行安装。
但是,并没有work,无法安装上有限网卡驱动,我怀疑是有限网卡驱动已经安装了。
8.2 尝试重新启动网络管理服务
该操作针对有线连接图标不见,ifconfig查看也无网卡的情况。
但是,并没有work,可能是由于这个解决方案是针对有线连接的图标不见的情形,并不是现在遇到的现在的找不到有限网卡的情形。
8.3 尝试更新系统内核
查阅了网上资料,有人也遇到同样的问题,他通过更新内核解决了,我于是也是尝试更新一下。
键入:uname -r
可以查看当前内核版本:目前是5.2.20
准备更新的内核:5.6.16
8.3.1 开始升级内核。先安装升级所需的libssl1.1
wget http://archive.ubuntu.com/ubuntu/pool/main/o/openssl/libssl1.1_1.1.0g-2ubuntu4_amd64.deb
sudo dpkg -i libssl1.1_1.1.0g-2ubuntu4_amd64.deb
8.3.2 下载内核
地址:https://kernel.ubuntu.com/~kernel-ppa/mainline/
选择 5.6.16
选择下面amd64中,标框的4个deb包。
直接下载即可
8.3.3 安装内核
然后双击安装即可,安装的顺序是 headers_all, headers_generic, modules_generic, image_generic。(不依照也没事,它会提示有依赖关系)。也可以sudo dpkg -i linux-*(包名)安装,但是直接安装更简单。
安装完执行sudo update-grub后重启计算机
打开终端即可看到内核已经更新( uname -r 也可以),5.6.16-050616-generic
8.4 查看有限网卡
打开终端输入 ifconfig,终于!出现了有限网卡eno1。原来就是内核版本的问题。
8.5 新建有线连接
新增有限连接网络 VLP-16 (名称任意设置)
然后选择IPV4 Settings,方法选为 Manual,更改网络配置。
address: 192.168.1.77
netmask: 255.255.255.0
gateway: 192.168.1.1
然后点击保存。(注意IP地址的77,可以为1到254除开201以外的所有值,因为201是激光雷达的默认IP。)
8.6 安装ROS依赖包(激光雷达驱动)
sudo apt-get install ros-kinetic-velodyne
PS: kinetic:与机器安装的ROS版本一致。
8.7 创建ROS工程
mkdir -p catkin_velodyne/src
cd catkin_velodyne/src
git clone https://github.com/ros-drivers/velodyne.git
cd ..
rosdep install --from-paths src --ignore-src --rosdistro kinetic -y
catkin_make
source devel/setup.bash
编译一切正常,准备与雷达连接。
8.8 开始连接雷达
Velodyne雷达与电脑网线连接,并给雷达供电(12V),可以发现右上角图标更换。
打开网络连接界面,可以发现网络已经连接。
在更新内核之前,是怎么都连接不上的!
当然,这也就意味着NUC无法通过WIFI上网了。需要联网的工作,尽量选择在之前完成。
此时,打开网页,网址处输入192.168.1.201,会弹出激光雷达的参数界面:
这表明,雷达连接一切正常。
8.9 测试雷达
打开终端,输入
roslaunch velodyne_pointcloud VLP16_points.launch
打开新的终端,输入下式,可以打开rviz,进行结果可视化
rosrun rviz rviz -f velodyne
不过刚打开是啥都没有的,需要自己订阅。
首先点击Add,添加pointsCloud2,
然后会发现左边的目录中多了个PointsCloud2,在该目录下点击topic,选择/velodyne_points,
即可以看到三维点云信息,如下图。
在终端中输入,可以记录数据:
rosbag record -o xxx.bag topic -name
比如velodyne_points,只保存/velodyne_points这个topic的数据(可以用rostopic list -v开看当前可用的topic),保存在当前目录的out.bag当中。
想简单点就
rosbag record -a
不过这个应该是保存了所有内容,所以体量非常大。
下图是连接激光雷达与NUC。
这里只针对LeGO-LOAM方法
首先,将LeGO-LOAM包里的run.launch文件进行修改,只需要将文件第4行中的true改成false即可,即
因为第4行 true表示虚拟运行,false表示真机器人运行。(之前的适用于LeGO-LOAM-BOR方法的launch文件不用管了)
打开终端输入
roslaunch velodyne_pointcloud VLP16_points.launch
再打开一个终端输入
roslaunch lego_loam run.launch
即可显示建图信息。(这是俺的教研室)
打开终端输入 rosbag record -a可以记录当前的数据。
运行结束后,打开两个终端,输入
roslaunch lego_loam run.launch
rosbag play --clock xxxxx.bag
xxxxx为自己保存的包名字。
即可以跑自己做出来的数据集。效果如下图,因为保存了所有的topic,所以内容会比较多。
装车
远距离通讯采用的是INSIGHT实时图传设备
办公室走廊实时建图
环土木交通楼实时建图
https://github.com/RobustFieldAutonomyLab/LeGO-LOAM/
https://github.com/facontidavide/LeGO-LOAM-BOR/tree/speed_optimization
https://blog.csdn.net/acyddlm/article/details/82974012
https://blog.csdn.net/fsencen/article/details/79386570
https://blog.csdn.net/weixin_41827934/article/details/90175635
https://blog.csdn.net/qq_29761791/article/details/94135193
https://www.cnblogs.com/winslam/p/12074432.html
http://www.bubuko.com/infodetail-3341579.html
http://blog.sina.com.cn/s/blog_c0468c8f0101ld2x.html
https://blog.csdn.net/qq_39346534/article/details/108617770
https://blog.csdn.net/yehe111/article/details/106800025/
https://blog.csdn.net/MIRANA0/article/details/106696334
https://www.jb51.net/article/192497.htm
https://blog.csdn.net/sinat_36502563/article/details/102996736
https://blog.csdn.net/m0_37931718/article/details/106612478
https://blog.csdn.net/mrh1714348719/article/details/103896168
https://blog.csdn.net/learning_tortosie/article/details/86527542
https://blog.csdn.net/qq_43535779/article/details/102579230