当前位置:   article > 正文

工程(十)——github代码ubuntu20.04在ROS环境运行单目和RGBD相机ORB-SLAM3稠密_orb-slam3稠密建图

orb-slam3稠密建图

博主创建了一个科研互助群Q:772356582,欢迎大家加入讨论交流一起学习。

加稠密建图:git@github.com:huashu996/ORB_SLAM3_Dense_YOLO.git

纯净版:git@github.com:huashu996/ORB_SLAM3.git

一. 坑的前言

orb-slam3的整个环境配置还是比较麻烦的,先将一些坑写在前面,供大家参考和避开这些坑。

1.1 主要配置

orb-slam3的配置要求还是很重要的,主要需要安装以下的第三方库和功能包

ubuntu 20.04

ROS noetic

Pangolin 0.6

Eigen 3

Opencv 4.2

usb_cam

1.2 Opencv的坑

其中opencv版本有比较严格的要求,建议先安装ROS中的cv_bridge和libopencv-dev,再安装和libopencv版本号一样的opencv库,这样可以避免opencv的版本冲突问题。

经过博主的多次实验,由于noekit的自带libopencv版本是4.2.0,如果安装opencv3会出现版本冲突使编译不通过。如果安装opencv4但不是4.2.0依然会产生冲突,但编译能够通过,但运行时会出现核心已转储的问题。所以直接安装和libopencv一样的版本。

1.3 Pangolin的坑

Pangolin不要直接选择最新的版本,而是安装0.6的版本,不然同样会出现编译问题。

1.4 核心已转储的坑

不少人在环境配置好和编译成功后,到最后一步运行时出现了核心已转储的问题。博主所遇到的核心已转储问题可以分为两种,一种是运行时闪一下viewer然后直接显示核心已转储,如下图所示。这种情况涉及到的因素主要为opencv的冲突问题以及pangolin的版本,需要重新安装一下。

另一种是运行一段时间出现核心已转储,如下所示,会出现New Map created的字样。这种问题处理比较简单,修改一下CMakelist文件。


<code class="language-plaintext hljs">New Map created with 118 points
段错误(核心已转储)</code>

二、环境配置

博主默认大家已经安装好ubuntu,替换好镜像源,安装好ROS等一些最基本的操作,网上的资料也很多。下面直接从配置环境的难点去讲述。

2.1 Opencv库

orb-slam3所用到的opencv主要有两个地方,一个是ROS的cv-bridge数据格式转换,另一个是C++的库。根据1.2的叙述按如下顺序进行安装。

  1. cv_bridge


<code class="language-plaintext hljs">sudo apt-get install libopencv-dev
sudo apt-get install ros-noekit-cv-bridge</code>
  1. opencv

安装过程看到libopencv版本是4.2.0,所以我们就去opencv官网找4.2.0的包,下载下来。

Releases - OpenCV

  • 安装opencv的依赖


<code class="language-plaintext hljs">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</code>
  • 将opencv解压到主目录下


<code class="language-plaintext hljs">mkdir build && cd build 
cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local ..
#电脑性能差可去掉-j4,性能很好可增加数字(线程)
make -j4
sudo make install</code>
  • opencv在make过程出现ippicv的下载问题

到官方网址下载对应的ippicv

https://github.com/opencv/opencv_3rdparty/tree/ippicv/master_20180723/ippicv


<code class="language-plaintext hljs">#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/"</code>

重新make opencv即可

  • 添加环境路径

配置OpenCV变量,编辑文件 /etc/ld.so.conf.d/opencv.conf(如果没有就会自动创建):


<code class="language-plaintext hljs">sudo gedit /etc/ld.so.conf.d/opencv.conf</code>

然后添加 OpenCV4 的 lib 路径:


<code class="language-plaintext hljs">/usr/local/opencv4/lib</code>

保存退出,执行:


<code class="language-plaintext hljs">sudo ldconfig</code>

编辑 ~/.bashrc 文件:


<code class="language-plaintext hljs">sudo gedit ~/.bashrc</code>

最后添加:


<code class="language-plaintext hljs">export PKG_CONFIG_PATH=${PKG_CONFIG_PATH}:/usr/local/opencv4/lib/pkgconfig
export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:./usr/local/opencv4/lib</code>

保存退出


<code class="language-plaintext hljs">source ~/.bashrc</code>
  • 验证opencv是否安装


<code class="language-plaintext hljs">pkg-config --modversion opencv</code>

2.2 Pangolin库

安装Pangolin 0.6(官网下载地址,不要下载最新master版,编译的时候可能有错误)

  1. 安装依赖项


<code class="language-plaintext hljs">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</code>
  1. 编译安装


<code class="language-plaintext hljs">cd Pangolin 
mkdir build && cd build
cmake -DCPP11_NO_BOOST=1 ..
make
sudo make install</code>
  1. 验证


<code class="language-plaintext hljs">cd ../examples/HelloPangolin
mkdir build && cd build
cmake ..
make
./HelloPangolin
#成功会弹出如下窗口</code>

2.3 Eigen库

直接命令安装即可


<code class="language-plaintext hljs">sudo apt-get install libeigen3-dev</code>

三.orb-slam3编译运行

git clone https://github.com/UZ-SLAMLab/ORB_SLAM3.git

3.1 编译前修改

(1)解压源文件修改CMakeLists.txt中的opencv路径:

注意需要改两个CMakeLists.txt

ORB_SLAM3/CMakeLists.txt

ORB_SLAM3/Examples_old/ROS/ORB_SLAM3/CMakeLists.txt


<code class="language-plaintext hljs">set(CMAKE_PREFIX_PATH "/usr/local/opencv4.2.0") 
find_package(OpenCV 4.2.0 REQUIRED)</code>

(2)CMakeLists.txt最上方添加:

注意需要改两个CMakeLists.txt

ORB_SLAM3/CMakeLists.txt

ORB_SLAM3/Examples_old/ROS/ORB_SLAM3/CMakeLists.txt


<code class="language-plaintext hljs"> #set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")改为
 set(CMAKE_CXX_STANDARD 14)</code>

(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


<code class="language-plaintext hljs"># 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")</code>

(4)将find_package(Eigen3 3.1.0 REQUIRED)修改为:


<code class="language-plaintext hljs">find_package(Eigen3 REQUIRED)</code>

(5)安装python2.7:


<code class="language-plaintext hljs">sudoaptinstall libpython2.7-dev</code>

(6)添加ROS环境:

在编译ros版本时候需要初始化ROS


<code class="language-plaintext hljs">sudo gedit ~/.bashrc
export ROS_PACKAGE_PATH=${ROS_PACKAGE_PATH}:/home/cxl/workspace/ORB_SLAM3/Examples/ROS
#保存退出
source ~/.bashrc</code>

3.2 编译

经过上述修改后,再进行编译,大概率会通过


<code class="language-plaintext hljs">cd ORB_SLAM3
chmod +x build.sh
./build.sh</code>

一定先编译build.sh通过后再编译ros版本


<code class="language-plaintext hljs">cd ORB_SLAM3
chmod +x build_ros.sh
./build_ros.sh</code>

3.3 运行

3.3.1 单目

  1. 安装usb_cam


<code class="language-plaintext hljs">sudo apt-get install ros-noetic-camera-calibration
#启动摄像头
roslaunch usb_cam usb_cam-test.launch</code>

或者源码安装usb_cam


<code class="language-plaintext hljs">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</code>
  1. 相机标定


<code class="language-plaintext hljs">#启动摄像头
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</code>

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。

  1. 运行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的接收话题名称更改


<code class="language-plaintext hljs">    ros::NodeHandle nodeHandler;
    ros::Subscriber sub = nodeHandler.subscribe("/usb_cam/image_raw", 1, &ImageGrabber::GrabImage,&igb);
    ros::spin();</code>

之后再运行代码


<code class="language-plaintext hljs">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</code>

3.3.2 RGBD

  1. 配置RealSense D435驱动


<code class="language-plaintext hljs">#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对源码进行修改</code>
  1. 运行orb_slam3

在运行程序之前,需要将ORB_SLAM3/Examples_Old/ROS/ORB_SLAM3/src/ros_rgbd.cc的接收话题名称修改


<code class="language-plaintext hljs">ros::NodeHandle nh;
message_filters::Subscriber<sensor_msgs::Image> rgb_sub(nh, "/camera/color/image_rect_color", 100);
message_filters::Subscriber<sensor_msgs::Image> depth_sub(nh, "/camera/aligned_depth_to_color/image_raw", 100);
typedef message_filters::sync_policies::ApproximateTime<sensor_msgs::Image, sensor_msgs::Image> sync_pol;
message_filters::Synchronizer<sync_pol> sync(sync_pol(10), rgb_sub,depth_sub);
sync.registerCallback(boost::bind(&ImageGrabber::GrabRGBD,&igb,_1,_2));</code>

之后编译运行代码


<code class="language-plaintext hljs">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</code>
  1. RGBD稠密建图

编译


<code class="language-plaintext hljs">#加入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</code>

运行


<code class="language-plaintext hljs">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</code>

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/350579
推荐阅读
相关标签
  

闽ICP备14008679号