- 由于相机实时在线运行需要ROS,但Ubuntu22.04只支持ROS2,于是重装Ubuntu20.04。
- 上一篇文章跑通的是官方版本的ORB_SLAM2,不支持点云显示。高翔修改版本支持RGB-D相机的点云显示功能。
高翔修改版本ORB_SLAM2:https://github.com/gaoxiang12/ORBSLAM2_with_pointcloud_map
环境:ubunntu20.04、opencv3.4.12编译、pangolin0.5编译、PCL1.10、eigen3.3.7、ROS noetic
- 查看PCL版本:dpkg -l | grep libpcl
- 查看eigen版本:pkg-config --modversion eigen3
备注:我先编译的OpenCV3.4.12,再装的ROS noetic,后面一直用的OpenCV3.4.12编译和运行,普通编译和运行问题比较少。但在ROS编译和运行时遇到了很多问题,主要是ROS noetic自带OpenCV4.2.0会和编译的OpenCV3.4.12出现版本冲突,基于ROS编译时由于会使用到cv_bridge,默认调用OpenCV4.2.0,网上也有一些方案修改cv_bridge,但十分麻烦,后来发现直接用OpenCV4编译源代码,只需要修改个别报错,相对简单。因此,可以在配置环境的时候,优先装ROS noetic,自带OpenCV4.2,就可以不用装OpenCV3.4.12了,把报错改一改即可,不用考虑版本冲突带来的奇奇怪怪的报错。
普通编译(以下使用OpenCV3.4.12编译)
- 只需要其中的子文件夹 ORB_SLAM2_modified、需要原始ORB SLAM2官方版本中的Vocabulary文件夹
- 删除三个build文件夹
ORB_SLAM2_modified/build
ORB_SLAM2_modified/Thirdparty/DBoW2/build
ORB_SLAM2_modified/Thirdparty/g2o/build
- 编译
chmod +x build.sh
./build.sh
出现一堆pcl相关的报错
在CmakeLists.txt中增加set(CMAKE_CXX_STANDARD 14)
重新编译,就只有eigen3相关的警告了
普通运行
高翔修改的点云版本好像只支持RGBD的点云显示,使用双目运行时,出现当前帧和map Viewer都可以显示、PCL窗口(按R键标准可视化)全黑的情况。而且终端输出显示Global map的Size一直为0。
./bin/stereo_euroc Vocabulary/ORBvoc.bin Examples/Stereo/EuRoC.yaml /home/juling/Documents/data/MH_01_easy/mav0/cam0/data /home/juling/Documents/data/MH_01_easy/mav0/cam1/data Examples/Stereo/EuRoC_TimeStamps/MH01.txt
于是跑了一下RGBD的例子,看一下点云是否有输出,排除一下情况。
./bin/rgbd_tum Vocabulary/ORBvoc.txt Examples/RGB-D/TUM1.yaml /home/juling/Documents/data/rgbd_dataset_freiburg1_xyz Examples/RGB-D/associations/fr1_xyz.txt
可以实时显示点云。保存为pcd文件,用pcl_viewer打开。
修改如下代码,恢复彩色点云图。
稠密程度:TUM1.yaml中的PointCloudMapping.Resolution参数可改变点云稠密程度。
下图左边是0.00001,右边是0.01的情况。
ROS编译
安装ROS Noetic:http://wiki.ros.org/noetic/Installation/Ubuntu
# 配置环境变量
sudo gedit ~/.bashrc
添加source /opt/ros/noetic/setup.bash
source ~/.bashrc
使用ROS编译前,在bashrc中添加环境变量,然后在终端echo一下,看输出是否正确。
export ROS_PACKAGE_PATH=${ROS_PACKAGE_PATH}:/home/juling/Documents/projects/ORBSLAM2_with_pointcloud_map-master/ORB_SLAM2_modified
echo $ROS_PACKAGE_PATH
备注: 如果添加的ORB_SLAM的ROS路径在setup.bash路径的前面, echo路径的时候,发现路径没有更改。所以将export的路径放在最后一行即可。
错误一:ModuleNotFoundError: No module named ‘rospkg’
pip install rospkg
错误二:Unable to find either executable ‘empy’ or Python module ‘em’… try installing the package ‘python3-empy’
pip install python3-empy
错误三:一堆PCL相关报错POINT_CLOUD_REGISTER_POINT_STRUCT
CmakeList.txt中添加set(CMAKE_CXX_STANDARD 14)
错误四:fatal error: pcl/common/transforms.h: No such file or directory 25 | #include <pcl/common/transforms.h>
# CmakeLists.txt中增加PCL库相关
find_package(PCL REQUIRED ) #修改后的set(LIBS
${OpenCV_LIBS}
${EIGEN3_LIBS}
${Pangolin_LIBRARIES}
${PROJECT_SOURCE_DIR}/../../../Thirdparty/DBoW2/lib/libDBoW2.so
${PROJECT_SOURCE_DIR}/../../../Thirdparty/g2o/lib/libg2o.so
${PROJECT_SOURCE_DIR}/../../../lib/libORB_SLAM2.so
${PCL_LIBRARIES} #修改后的
错误五:undefined reference to symbol,error adding symbols: DSO missing from command line
在ORB_SLAM2_modified/Examples/ROS/ORB_SLAM2/CMakeLists.txt文件中添加-lboost_system没有解决问题
应该是OpenCV3与ROS自带OpenCV4冲突的问题
github issues:https://github.com/raulmur/ORB_SLAM2/issues/990
参考解决:https://blog.csdn.net/YLYwj/article/details/131766994
sudo apt install mlocate
locate libopencv_imgproc.so
locate libopencv_core.so
可以看到相关文件的路径,一般在/usr/lib/x86_64-linux-gnu/文件夹下搜索,即可找到libopencv_imgproc.so.4.2.0和libopencv_core.so.4.2.0文件,复制到ORB_SLAM2_modified/lib文件夹中,然后ORB_SLAM2/Examples/ROS/ORB_SLAM2路径下的CmakeLists.txt中添加两行。
set(LIBS
${OpenCV_LIBS}
${EIGEN3_LIBS}
${Pangolin_LIBRARIES}
${PROJECT_SOURCE_DIR}/../../../Thirdparty/DBoW2/lib/libDBoW2.so
${PROJECT_SOURCE_DIR}/../../../Thirdparty/g2o/lib/libg2o.so
${PROJECT_SOURCE_DIR}/../../../lib/libORB_SLAM2.so
${PCL_LIBRARIES} ####### 5
#-lboost_system ####### 6
${PROJECT_SOURCE_DIR}/../../../lib/libopencv_imgproc.so.4.2.0 ####### 7
${PROJECT_SOURCE_DIR}/../../../lib/libopencv_core.so.4.2.0 ####### 8
重新编译以后,编译通过。但有版本冲突的警告。
ROS运行
roscore
rosrun ORB_SLAM2 Stereo Vocabulary/ORBvoc.txt Examples/Stereo/EuRoC.yaml true
运行报segmentation fault (core dumped)
错误。
修改Example/ROS下的CmakeLists.txt,删除-march=native重新编译,没有解决问题。
有没有可能是点云版本的只支持RGBD的ROS功能包,用RGBD试一下,排除一下问题。
https://vision.in.tum.de/data/datasets/rgbd-dataset/download
roscore
rosrun ORB_SLAM2 RGBD Vocabulary/ORBvoc.txt Examples/RGB-D/TUM1.yaml
rosbag play --pause /home/juling/Documents/data/rgbd_dataset_freiburg1_room.bag
rosrun仍然报核心已转储的错误。应该是OpenCV版本冲突的问题,因为基于OpenCV3编译成功以后,有警告。
删除所有build的文件夹,修改所有CmakeLists.txt中的OpenCV版本为4.2.0,重新进行普通编译(因为ROS编译需要用到DBoW2和g2o),再进行ROS编译。
find_package(OpenCV 4.2 QUIET)
错误:error: ‘CV_LOAD_IMAGE_UNCHANGED’ was not declared in this scope
修改所有的CV_LOAD_IMAGE_UNCHANGED为cv::IMREAD_UNCHANGED即可
此时编译通过,且没有版本冲突的警告。
再次运行RGBD的例子。此时,报了一个pcl no data的错误。并且出现bag运行,map Viewer以及点云窗口都无显示的情况。
注意:TUM 数据官网中提到 “factor = 5000 # for the 16-bit PNG files,OR: factor = 1 # for the 32-bit float images in the ROS bag files”。这个问题就是5000是普通模式下的,此处是ROS模式。将TUM1.yaml复制出来,重命名为TUM1_ROS.yaml,并将深度校正系数DepthMapFactor改为1.0。即可解决这个问题。另外,注意前面提到的bashrc中的ROS_PACKAGE_PATH。
运行成功。
参考:
https://blog.csdn.net/Evanzxh/article/details/120993982
https://www.jianshu.com/p/5e7b8358893f
https://blog.csdn.net/crp997576280/article/details/104220926/