学完ORB_SLAM2源码后,想用一个小项目巩固所学知识。思虑良久~决定在ORB_SLAM2源码的基础上添加稠密建图的线程,并用kinect2相机实现自己卧室的三维重建。
话不多说,先上效果图。
带闭环的稠密地图重建
不带闭环的稠密地图重建
在完成这个小项目的过程中,每当遇到编译和运行环节,屏幕上大概率会出现红红的warnings和errors。一开始还能稳住心态,遇到问题就google,但后来发现很多博客或github上的issue并不会把修改code的原理讲清楚且有些答案本身就有错误,对于新手小白不太友好。如果不求甚解,盲目地相信博客,还可能造成不可逆转的后果,比如像我一样。。。误修改权限导致ubuntu系统崩溃,痛心疾首!恨不得当场摔鼠标键盘!
为此我记录下自己在ORB_SLAM2+kinect2稠密建图实战过程中踩过的坑,注明那些容易犯错的地方,警醒自己一定要真正把问题搞明白!重要的事情说三遍,真正把问题搞明白!真正把问题搞明白!真正把问题搞明白!
那么首先,我们让代码跑起来~
高翔博士开源了不带闭环的稠密建图,地址如下:
https://github.com/gaoxiang12/ORBSLAM2_with_pointcloud_map
在此基础上大佬们开源了另一个带闭环的稠密建图,地址如下:https://github.com/tiantiandabaojian/ORB-SLAM2_RGBD_DENSE_MAP
我们将以带闭环的稠密建图为基础,搭建环境并对其中的部分bug做修改,方便大家快速跑出效果图。
具体的安装流程参照以下博客即可,这里我主要记录一下可能出现的问题,分析原因并给出解决办法(在本机上已实验证明可行)
ORB SLAM 2 + 构建点云地图 复现 - 简书
使用ORBSLAM2进行kineticV2稠密建图,实时转octomap建图以及导航 - 古月居
问题记录:
1. 安装Kinect开源驱动iai_kinect2和libfreenect2(为什么这里要装两个驱动?)
iai_kinect2是ros的驱动,而libfreenect2是kinect2的驱动,iai_kinect2可以建立在libfreenect上也可以在OpenNI上。这里如果出现编译错误,将error复制粘贴到搜索框一般都比较容易解决。
2. 使用iai_kinect2里面的kinect2_calibration进行标定时生成的yaml文件不全
经过实验,发现标定颜色/深度/同步的照片张数至少要50张才能正常生成yaml文件。
3. 编译ORB-SLAM2_RGBD_DENSE_MAP-master时出现很多与eigen3有关的warnings,且忽视warnings运行后出现段错误。
ubuntu18下对应的ros版本为melodic,默认是3.3以上,而运行ORB-SLAM2_RGBD_DENSE_MAP-master最高是3.2的版本。
查看eigen3的版本
pkg-config --modversion eigen3
删除和安装eigen可以参考以下链接:ubuntu16.04卸载、安装eigen_TB81266的博客-CSDN博客_ubuntu卸载eigen3
4. 编译ORB-SLAM2_RGBD_DENSE_MAP-master时缺失ORBvoc.txt.tar.gz,并有与pcl1.7相关的warnings
原始的ORB-SLAM2_RGBD_DENSE_MAP-master中的Vocabulary中没有ORBvoc.txt.tar.gz,需要从其他地方拷贝过来,与pcl1.7有关的warnings可以忽略。需要注意的是当一次编译没通过时最好删除所有产生的build文件,以免影响第二次编译。
5. 成功编译了ORB-SLAM2_RGBD_DENSE_MAP-master,但最后运行时不显示点云地图
查阅了大量资料,都说是pcl库的问题,实际上不是,将pointcloudmapping.h 文件中bool loopbusy;
改为bool loopbusy=false即可。
参考博客:
ORBSLAM2_稠密地图+回环__YAO阿瑶的博客-CSDN博客_orbslam 稠密地图
6. 运行ORB-SLAM2+kinect后可以显示画面,但地图画面很窄,看上去有些奇怪
kinect2分辨率设置不合理。Kinect2的topic一共有三种,对应不同的分辨率。其中hd是1920的,qhd是四分之一的960的,而sd是最小的。选择qhd比较合适,对应的Camera.width: 960; Camera.height: 540
视觉SLAM实战(二):ORB-SLAM2 with Kinect2 - 半闲居士 - 博客园
7. 运行ORB-SLAM2+kinect时地图扭曲,
内参和畸变参数设置不对,需要根据标定结果进行设置,值得注意的是在yaml文件中设置的内参是相机标定结果的一半。
ORB-SLAM2:(三)仿真实现&kinect2在线定位建图_$南山种豆$的博客-CSDN博客
补充:
build.sh和build_ros.sh是脚本文件,运行脚本文件可以使编译过程自动运行,但要注意运行前需要chmod +x build_ros.sh,提高权限,否则可能找不到该脚本文件。
由于个人设置了两个ros工作空间,本以为不同工作空间互不影响,但实际上如果出现了相同的节点名,会产生很多预料之外的后果。例如,本想运行带稠密建图的节点结果ros一直在执行不带稠密建图的节点,找原因浪费了大量的时间。。。