加稠密建图:[email protected]:huashu996/ORB_SLAM3_Dense_YOLO.git
纯净版:[email protected]:huashu996/ORB_SLAM3.git
orb-slam3的整个环境配置还是比较麻烦的,先将一些坑写在前面,供大家参考和避开这些坑。
orb-slam3的配置要求还是很重要的,主要需要安装以下的第三方库和功能包
ubuntu 20.04
ROS noetic
Pangolin 0.6
Eigen 3
Opencv 4.2
usb_cam
其中opencv版本有比较严格的要求,建议先安装ROS中的cv_bridge和libopencv-dev,再安装和libopencv版本号一样的opencv库,这样可以避免opencv的版本冲突问题。
经过博主的多次实验,由于noekit的自带libopencv版本是4.2.0,如果安装opencv3会出现版本冲突使编译不通过。如果安装opencv4但不是4.2.0依然会产生冲突,但编译能够通过,但运行时会出现核心已转储的问题。所以直接安装和libopencv一样的版本。
Pangolin不要直接选择最新的版本,而是安装0.6的版本,不然同样会出现编译问题。
不少人在环境配置好和编译成功后,到最后一步运行时出现了核心已转储的问题。博主所遇到的核心已转储问题可以分为两种,一种是运行时闪一下viewer然后直接显示核心已转储,如下图所示。这种情况涉及到的因素主要为opencv的冲突问题以及pangolin的版本,需要重新安装一下。
另一种是运行一段时间出现核心已转储,如下所示,会出现New Map created的字样。这种问题处理比较简单,修改一下CMakelist文件。
New Map created with 118 points
段错误(核心已转储)
博主默认大家已经安装好ubuntu,替换好镜像源,安装好ROS等一些最基本的操作,网上的资料也很多。下面直接从配置环境的难点去讲述。
orb-slam3所用到的opencv主要有两个地方,一个是ROS的cv-bridge数据格式转换,另一个是C++的库。根据1.2的叙述按如下顺序进行安装。
cv_bridge
sudo apt-get install libopencv-dev
sudo apt-get install ros-noekit-cv-bridge
opencv
安装过程看到libopencv版本是4.2.0,所以我们就去opencv官网找4.2.0的包,下载下来。
https://opencv.org/releases/
安装opencv的依赖
sudo apt-get install build-essential cmake git
sudo apt-get install libgtk2.0-dev pkg-config libavcodec-dev
sudo apt-get install libavformat-dev libswscale-dev
sudo apt-get install python-dev python-numpy python3-dev python3-numpy
sudo apt-get install libtbb2 libtbb-dev libjasper-dev libdc1394-22-dev
sudo apt-get install libjpeg-dev libpng-dev libtiff-dev
将opencv解压到主目录下
mkdir build && cd build
cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local ..
#电脑性能差可去掉-j4,性能很好可增加数字(线程)
make -j4
sudo make install
opencv在make过程出现ippicv的下载问题
到官方网址下载对应的ippicv
https://github.com/opencv/opencv_3rdparty/tree/ippicv/master_20180723/ippicv
#1.将ippicv放入opencv源码中新建立的ippicv文件夹
cd opencv-4.2.0
mkdir ippicv
#2.修改opencv的cmake ippicv下载源
gedit ~opencv-4.2.0/3rdparty/ippicv/ippicv.cmake
# 将47行的
"https://raw.githubusercontent.com/opencv/opencv_3rdparty/${IPPICV_COMMIT}ippicv/"
# 改为步骤1中手动下载的文件的本地路径(也就是将网络下载的模式改为本地文件下载的模式):
"/home/cxl/opencv-4.2.0/ippicv/"
重新make opencv即可
添加环境路径
配置OpenCV变量,编辑文件 /etc/ld.so.conf.d/opencv.conf(如果没有就会自动创建):
sudo gedit /etc/ld.so.conf.d/opencv.conf
然后添加 OpenCV4 的 lib 路径:
/usr/local/opencv4/lib
保存退出,执行:
sudo ldconfig
编辑 ~/.bashrc 文件:
sudo gedit ~/.bashrc
最后添加:
export PKG_CONFIG_PATH=${PKG_CONFIG_PATH}:/usr/local/opencv4/lib/pkgconfig
export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:./usr/local/opencv4/lib
保存退出
source ~/.bashrc
验证opencv是否安装
pkg-config --modversion opencv
安装Pangolin 0.6(官网下载地址,不要下载最新master版,编译的时候可能有错误)
安装依赖项
sudo apt-get install libglew-dev libboost-dev libboost-thread-dev libboost-filesystem-dev
sudo apt-get install ffmpeg libavcodec-dev libavutil-dev libavformat-dev libswscale-dev libpng-dev
编译安装
cd Pangolin
mkdir build && cd build
cmake -DCPP11_NO_BOOST=1 ..
make
sudo make install
验证
cd ../examples/HelloPangolin
mkdir build && cd build
cmake ..
make
./HelloPangolin
#成功会弹出如下窗口
直接命令安装即可
sudo apt-get install libeigen3-dev
git clone https://github.com/UZ-SLAMLab/ORB_SLAM3.git
(1)解压源文件修改CMakeLists.txt中的opencv路径:
注意需要改两个CMakeLists.txt
ORB_SLAM3/CMakeLists.txt
ORB_SLAM3/Examples_old/ROS/ORB_SLAM3/CMakeLists.txt
set(CMAKE_PREFIX_PATH "/usr/local/opencv4.2.0")
find_package(OpenCV 4.2.0 REQUIRED)
(2)CMakeLists.txt最上方添加:
注意需要改两个CMakeLists.txt
ORB_SLAM3/CMakeLists.txt
ORB_SLAM3/Examples_old/ROS/ORB_SLAM3/CMakeLists.txt
#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")改为
set(CMAKE_CXX_STANDARD 14)
(3)去掉-march=native,避免运行一段时间后核心已转储的问题
注意需要改4个CMakeLists.txt
ORB_SLAM3/CMakeLists.txt
ORB_SLAM3/Examples_old/ROS/ORB_SLAM3/CMakeLists.txt
ORB_SLAM3/Thirdparty/DBoW2 /CMakeLists.txt
ORB_SLAM3/Thirdparty/g2o/CMakeLists.txt
# set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -O3 -march=native ")
# set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -O3 -march=native")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -O3")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -O3")
(4)将find_package(Eigen3 3.1.0 REQUIRED)修改为:
find_package(Eigen3 REQUIRED)
(5)安装python2.7:
sudoaptinstall libpython2.7-dev
(6)添加ROS环境:
在编译ros版本时候需要初始化ROS
sudo gedit ~/.bashrc
export ROS_PACKAGE_PATH=${ROS_PACKAGE_PATH}:/home/cxl/workspace/ORB_SLAM3/Examples/ROS
#保存退出
source ~/.bashrc
经过上述修改后,再进行编译,大概率会通过
cd ORB_SLAM3
chmod +x build.sh
./build.sh
一定先编译build.sh通过后再编译ros版本
cd ORB_SLAM3
chmod +x build_ros.sh
./build_ros.sh
安装usb_cam
sudo apt-get install ros-noetic-camera-calibration
#启动摄像头
roslaunch usb_cam usb_cam-test.launch
或者源码安装usb_cam
cd catkin_ws/src
git clone https://github.com/bosch-ros-pkg/usb_cam.git
cd ..
ctakin_make
source ./devel/setup.bash
roslaunch usb_cam usb_cam-test.launch
相机标定
#启动摄像头
roslaunch usb_cam usb_cam-test.launch
#新开一个终端,开始标定
rosrun camera_calibration cameracalibrator.py --size 10x7 --square 0.0085 image:=/usb_cam/image_raw camera:=/usb_cam --k-coefficients=4
cameracalibrator.py 标定程序需要以下几个输入参数:
–size为棋盘格的规格(内部角点行列个数),
–square为棋盘格的大小(棋盘格的边长,单位是m),
image:=指定了图像的TOPIC,
–k-coefficients为畸变模型参数个数,
camera:=/usb_cam摄像头
–no-service-check禁用
set_camera_info检查服务
都变成绿色位置了就按下CALIBRATE按钮,等一段时间就可以完成标定。完成后点击SAVE保存标定使用的图像以及标定结果,会显示保存地址,可以打开查看,然后再COMMIT退出程序,标定完成。找到标定结果文件后,按照其数据修改Examples_Old/ROS/ORB_SLAM3目录下Asus.yaml。
运行orb_slam3
在运行程序之前,需要将ORB_SLAM3/Examples_Old/ROS/ORB_SLAM3/src/ros_mono.cc和ORB_SLAM3/Examples_Old/ROS/ORB_SLAM3/src/AR/ros_mono_ar.cc的接收话题名称更改
ros::NodeHandle nodeHandler;
ros::Subscriber sub = nodeHandler.subscribe("/usb_cam/image_raw", 1, &ImageGrabber::GrabImage,&igb);
ros::spin();
之后再运行代码
source /home/cxl/workspace/ORB_SLAM3/Examples/ROS/ORB_SLAM3/build/devel/setup.bash
roslaunch usb_cam usb_cam-test.launch
rosrun ORB_SLAM3 Mono Vocabulary/ORBvoc.txt Examples/Monocular/EuRoC.yaml
配置RealSense D435驱动
#Install ROS Kinetic, on Ubuntu 16.04, ROS Melodic on Ubuntu 18.04 or ROS Noetic on Ubuntu 20.04.
sudo apt-get install ros-$ROS_DISTRO-realsense2-camera
sudo apt-get install ros-noetic-rgbd-launch
#无点云
roslaunch realsense2_camera rs_camera.launch
#有点云生成
roslaunch realsense2_camera demo_pointcloud.launch
# 生成对齐的深度图像
roslaunch realsense2_camera rs_rgbd.launch align_depth:=true
#其他使用说明见官方文档
https://github.com/IntelRealSense/realsense-ros/tree/ros1-legacy
#可以进入/opt/ros/noetic/share/realsense2_camera对源码进行修改
运行orb_slam3
在运行程序之前,需要将ORB_SLAM3/Examples_Old/ROS/ORB_SLAM3/src/ros_rgbd.cc的接收话题名称修改
ros::NodeHandle nh;
message_filters::Subscriber rgb_sub(nh, "/camera/color/image_rect_color", 100);
message_filters::Subscriber depth_sub(nh, "/camera/aligned_depth_to_color/image_raw", 100);
typedef message_filters::sync_policies::ApproximateTime sync_pol;
message_filters::Synchronizer sync(sync_pol(10), rgb_sub,depth_sub);
sync.registerCallback(boost::bind(&ImageGrabber::GrabRGBD,&igb,_1,_2));
之后编译运行代码
roslaunch realsense2_camera rs_rgbd.launch align_depth:=true
#一定加上align_depth:=true这样深度图和可见光才能对齐
rosrun ORB_SLAM3 RGBD Vocabulary/ORBvoc.txt Examples/RGB-D/RealSense_D435i.yaml
RGBD稠密建图
编译
#加入ROS环境
gedit ~/.bashrc
export ROS_PACKAGE_PATH=${ROS_PACKAGE_PATH}:/home/cxl/workspace/ORB_SLAM3_Dense_YOLO/Examples/ROS/YOLO_ORB_SLAM3_with_pointcloud_map
source ~/.bashrc
#编译
chmod +x build.sh
chmod +x build_ros.sh
./build.sh
./build_ros.sh
运行
roslaunch realsense2_camera rs_rgbd.launch align_depth:=true
roslaunch YOLO_ORB_SLAM3_with_pointcloud_map camera_topic_remap.launch
rosrun ORB_SLAM3_Dense_YOLO RGBD Vocabulary/ORBvoc.txt Examples/RGB-D/RealSense_D435i.yaml