ORB-SLAM2、VINS-MONO在嵌入式RK3399平台的ROS环境搭建与相机实测全流程记录

上周成功的在新的嵌入式平台RK3399上移植了SLAM开源框架ORB-SLAM2与VINS-MONO,并使用摄像头RealSense D435进行实测。现整理记录一下整体流程,对遇到的问题进行总结,便于后续查询与复现。

本人之前也有总结过PC端与JetSon TX2嵌入式平台上的开源SLAM框架搭建流程,欢迎有需要的朋友浏览查阅:
PC端ORB-SLAM2搭建:https://blog.csdn.net/nannan7777/article/details/102843929
PC端VINS-MONO搭建:https://blog.csdn.net/nannan7777/article/details/102915699
JetSon TX2嵌入式平台VINS-MONO搭建:https://blog.csdn.net/nannan7777/article/details/103128397

开源SLAM框架在嵌入式平台的ROS环境搭建与RealSense D435相机实测

  • 1、安装与配置ROS Kinetic Kame环境
      • 1.1、配置Ubuntu软件中心
      • 1.2、设置sources.list(软件源)
      • 1.3、安装 ROS Kinetic
      • 1.4、设置环境变量
      • 1.5、测试 ROS
  • 2、安装RealSense D435相机的ROS环境驱动
      • 2.1、安装Intel® RealSense™ SDK 2.0
      • 2.2、安装Intel® RealSense™ ROS
  • 3、ORB-SLAM2环境搭建与相机实测
      • 3.1、安装基本依赖
      • 3.2、安装与编译Pangolin:
      • 3.3、安装与编译Eigen3:
      • 3.4、安装与编译ORB_SLAM2:
  • 4、VINS-MONO环境搭建与相机实测
      • 4.1、安装依赖项ceres-solver
      • 4.2、安装与编译VINS-MONO

我这里已安装的基础环境与平台:
嵌入式平台RK3399、系统Ubuntu 16.04 (xubuntu轻量级桌面系统)、架构Arm64Python2.7.1OpenCV3.4.0Eigen3.3.7

1、安装与配置ROS Kinetic Kame环境

实时SLAM框架需要配合ROS平台使用,需按照Ubuntu版本指定安装对应的ROS版本,最后在ROS工作空间中编译与配置ORB-SLAM2开源框架。这里提供四种指令来查看Ubuntu版本:

uname -a
cat /proc/version
cat /etc/lsb-release
cat /etc/issue

我这里的系统版本为Xenial (Ubuntu 16.04),可以安装ROS Kinetic
ROS Kinetic官方说明:http://wiki.ros.org/Installation/Ubuntu?distro=kinetic

下面进行ROS Kinetic安装与配置:

1.1、配置Ubuntu软件中心

配置Ubuntu要求允许接受”restricted” “universe” 和 “multiverse”的软件源,一般是系统默认设置,可以在Software & Updates 中查看。

1.2、设置sources.list(软件源)

添加ROS官方软件源与设置秘钥,从packages.ros.org接收软件包。执行命令行如下:

sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'
sudo apt-key adv --keyserver hkp://ha.pool.sks-keyservers.net:80 --recv-key 0xB01FA116

如果上述源无法连接可以添加以下国内的源:

sudo sh -c '. /etc/lsb-release && echo "deb http://mirrors.ustc.edu.cn/ros/ubuntu/ $DISTRIB_CODENAME main" > /etc/apt/sources.list.d/ros-latest.list'

1.3、安装 ROS Kinetic

首先更新Debian包索引,确保系统软件处于最新版,执行命令行:sudo apt-get update

ROS Kinetic 含有多种库和工具,也有很多版本,比如工业版,基础版,高级版,豪华版,至尊豪华…
可以依据自己的需求进行个性化安装。我这里安装的是桌面完整版,命令行如下,安装完成后可用后可查看能使用的包:

sudo apt-get install ros-kinetic-desktop-full
apt-cache search ros-kinetic

之后解决ROS的环境依赖,执行如下命令行:

sudo rosdep init
rosdep update

1.4、设置环境变量

使用apt-get方式在 Ubuntu上安装 ROS,在使用前需要激活/opt/ros/kinetic/目录下的setup.bash文件来添加 ROS 环境变量,命令如下:

echo "source /opt/ros/kinetic/setup.bash" >> ~/.bashrc
source ~/.bashrc  #使环境变量设置立即生效

之后安装常用的插件,执行如下命令行:

sudo apt-get install python-rosinstall -y

1.5、测试 ROS

启动ROS环境,命令行:roscore
如果显示started core service [/rosout] ,说明 ROS 已经成功安装并配置。

问题记录-01 -------------------------------------------------------------------------------------------------------

ERROR: unable to process source https://raw.githubusercontent.com/ros/rosdistro/master/rosdep/......

出现这个错误原因是因为raw.githubusercontent.com网站无法访问。
解决办法是修改hosts文件,添加这个网站的ip地址,执行如下命令行:

#打开hosts文件
sudo gedit /etc/hosts
#在文件末尾添加
151.101.84.133  raw.githubusercontent.com
#保存后退出再尝试

2、安装RealSense D435相机的ROS环境驱动

将Intel RealSense摄像头与ROS配合使用需安装ROS环境下的驱动。
RealSense-ROS官方说明:https://github.com/IntelRealSense/realsense-ros

2.1、安装Intel® RealSense™ SDK 2.0

首先需要安装librealsense2OpenCV,相关安装步骤在我上一篇博客中有详细说明与相关问题总结,这里不再赘述。
链接地址:https://blog.csdn.net/nannan7777/article/details/106790367

2.2、安装Intel® RealSense™ ROS

首先使用catkin方式创建自己的ROS工作空间,执行如下命令行:

mkdir -p ~/catkin_ws/src
cd ~/catkin_ws/src

之后将最新的RealSense-ROS源码下载拷贝至ROS工作空间路径,执行如下命令行:

git clone https://github.com/IntelRealSense/realsense-ros.git
cd realsense-ros/
git checkout `git tag | sort -V | grep -P "^\d+\.\d+\.\d+" | tail -1`
cd ..

检查一下所有的依赖库是否安装。我这里没有安装ddynamic_reconfigure,因此需要将安装包也拷贝至ROS工作空间路径。
ddynamic_reconfigure的官方下载链接:https://github.com/pal-robotics/ddynamic_reconfigure/tree/kinetic-devel

最后执行如下命令行完成RealSense-ROS的编译与安装:

catkin_init_workspace
cd ..
catkin_make clean
catkin_make -DCATKIN_ENABLE_TESTING=False -DCMAKE_BUILD_TYPE=Release
catkin_make install
echo "source ~/catkin_ws/devel/setup.bash" >> ~/.bashrc
source ~/.bashrc

完成RealSense-ROS的编译与安装后,在终端执行如下命令行启动相机:

source devel/setup.bash
roslaunch realsense2_camera rs_rgbd.launch

注:要想保证工作空间已配置正确,需确保ROS_PACKAGE_PATH环境变量包含工作空间目录,采用以下命令查看:
powershell echo $ROS_PACKAGE_PATH

问题记录-02 -------------------------------------------------------------------------------------------------------

ROS "Could not find the required component 'serial'. " 

当执行catkin_make时,出现找不到serial组件的错误。此时需要安装serial。
使用sudo apt-get install ros--serial下载 ROS 对应版本的工具包。我的 ROS 版本是 kinetic,故而执行如下命令行:

sudo apt-get install ros-kinetic-serial

问题记录-03 -------------------------------------------------------------------------------------------------------

在launch的文件内运行roslaunch rs_rgbd.launch出现错误:ResourceNotFound: realsense2_camera
或运行roslaunch realsense2_camera rs_rgbd.launch时出现错误:

[rs_rgbd.launch] is neither a launch file in package [realsense2_camera] nor is [realsense2_camera] a launch file name
The traceback for the exception was written to the log file

根本原因是找不到realsense2_camera包,可尝试执行sudo apt-get install ros-kinetic-rgbd-launch,或是因为没有正确配置环境变量路径,可执行source devel/setup.bash

3、ORB-SLAM2环境搭建与相机实测

ORB-SLAM2官方说明:https://github.com/raulmur/ORB_SLAM2
官方提供了在KITTI数据集,TUM数据集,以及在EuRoC数据集中单目,双目和RGB-D三种接口的SLAM系统示例,同时也提供了使用ROS节点来处理相机实时运行的SLAM示例。

3.1、安装基本依赖

sudo apt-get install libglew-dev
sudo apt-get install cmake
sudo apt-get install libpython2.7-dev
sudo apt-get install ffmpeg libavcodec-dev libavutil-dev libavformat-dev libswscale-dev
sudo apt-get install libdc1394-22-dev libraw1394-dev
sudo apt-get install libjpeg-dev libpng12-dev libtiff5-dev libopenexr-dev

3.2、安装与编译Pangolin:

cd ~
git clone https://github.com/stevenlovegrove/Pangolin.git
cd Pangolin
mkdir build
cd build
cmake ..
make -j4

3.3、安装与编译Eigen3:

#安装包下载网址:
#http://eigen.tuxfamily.org/index.php?title=Main_Page
#在该网站中,可以下载任意Eigen版本对应的文件。
cd eigen-3.3.7
mkdir build
cmake …/
sudo make install
sudo cp -r /usr/local/include/eigen3 /usr/include

sudo apt-get install libeigen3-dev 

3.4、安装与编译ORB_SLAM2:

注:在执行./build_ros.sh之前,需要在ORB_SLAM2/Examples/ROS/ORB_SLAM2/src/路径下的ros_rgbd.cc文件中修改自己相机的订阅信息,可以执行rostopic list查看ROS发布列表,并执行rosrun rviz rviz测试相机发布的RGB图像与深度图像rostopic分别是什么。

执行如下命令行完成ORB_SLAM2的编译与安装过程:

cd ~
#下载ORB_SLAM2源码:
git clone https://github.com/raulmur/ORB_SLAM2.git ORB_SLAM2
cd ORB_SLAM2
chmod +x build.sh
./build.sh
#添加路径到.bashrc文件:
vim ~/.bashrc
#增加如下路径到文件最后:
export ROS_PACKAGE_PATH=${ROS_PACKAGE_PATH}:/media/disk/ORB_SLAM2/Examples/ROS/
#重载环境变量:
source ~/.bashrc
#编译ROS包:
cd ~/ORB_SLAM2/
./build_ros.sh

编译安装后分别在两个终端执行如下命令行进行ORB_SLAM2的RGBD相机实测:
我这里RGBD相机接入RK3399开发板的USB3.0端口才可以正常工作,跟我上一篇博客提到的运行realsense-viewer时接入USB2.0才没有问题前后矛盾,也是挺奇怪的…

source devel/setup.bash
roslaunch realsense2_camera rs_rgbd.launch

rosrun ORB_SLAM2 RGBD /media/disk/ORB_SLAM2/Vocabulary/ORBvoc.txt /media/disk/ORB_SLAM2/Examples/ROS/ORB_SLAM2/Asus.yaml

下图是ORB_SLAM2成功运行的RGBD相机实测效果:
ORB-SLAM2、VINS-MONO在嵌入式RK3399平台的ROS环境搭建与相机实测全流程记录_第1张图片
问题记录-04 -------------------------------------------------------------------------------------------------------

ORB_SLAM2/src/System.cc: error: ‘usleep’ was not declared in this scope usleep(5000);

错误原因是‘usleep’变量没有定义,解决办法是找到对应的source文件中加入: #include
需要增加unistd.h头文件的文件有:

Examples/Monocular/mono_euroc.cc
Examples/Monocular/mono_kitti.cc
Examples/Monocular/mono_tum.cc
Examples/RGB-D/rgbd_tum.cc
Examples/Stereo/stereo_euroc.cc
Examples/Stereo/stereo_kitti.cc
src/LocalMapping.cc
src/LoopClosing.cc
src/System.cc
src/Tracking.cc
src/Viewer.cc

需要根据实际情况,错误提示哪个文件有问题,就去这个文件中加头文件。

问题记录-05 -------------------------------------------------------------------------------------------------------

/usr/lib/x86_64-linux-gnu/libboost_system.so: error adding symbols: DSO missing from command line

安装ORB_SLAM2时编译./build_ros.sh时出现上述报错。

错误原因是动态库中存在未解析到的函数,一种可能是因为ld自动递归地解析链接库,当加载A库的时候,一切正常,但是加载B库时ld会自动解析它的静态链接,所以就重复了,导致error adding symbols。解决办法是指定使用的链接库,即把libboost_system添加到链接库中,在Examples/ROS/ORB_SLAM2/Cmakelist.txt 文件后面加入以下两句话,再次编译即可:

target_link_libraries(Stereo boost_system boost_filesystem)  
target_link_libraries(RGBD boost_system boost_filesystem) 

问题记录-06 -------------------------------------------------------------------------------------------------------

我在第一次编译ORB_SLAM2时未修改ORB_SLAM2/Examples/ROS/ORB_SLAM2/src/路径下的ros_rgbd.cc文件,编译后使用RealSense D435相机实测时发现没有图像数据,Current Frame窗口黑屏,但经检查rostopic列表中相机的RGB图像与深度图像有正常数据输出。因此将ros_rgbd.cc文件中的订阅信息修改为自己相机发布的rostopic,重新编译./build_ros.sh后该问题得到解决。

下面是我ros_rgbd.cc文件中所修改的地方:

    message_filters::Subscriber rgb_sub(nh, "/camera/color/image_raw", 1);
    message_filters::Subscriber depth_sub(nh, "/camera/depth/image_rect_raw", 1);

当我重新编译./build_ros.sh时遇到如下错误:

Unknown CMake command "rosbuild_init"

其错误原因是因为ROS的当前工作目录没有设置正确,重新在.bashrc文件中设置一下ROS_PACKAGE_PATH路径, 删除build文件夹重新编译一下。之后我又遇到了如下错误:

[rospack] Error: could not call python function 'rosdep2.rospack.init_rospack_interface'

通过执行如下命令行更新ROS的依赖,再次编译后问题得以解决:

sudo rosdep fix-permissions
rosdep update

问题记录-07 -------------------------------------------------------------------------------------------------------

[ERROR] Failed to contact master at [localhost:11311]. Retrying...
[ERROR] [1446531999.044935824]: [registerPublisher] Failed to contact master at [localhost:11311]. Retrying...

解决办法是运行roscore,检查是否正常打开。
注:每次进行运行测试时都要首先运行 roscore

4、VINS-MONO环境搭建与相机实测

4.1、安装依赖项ceres-solver

问题记录-08 -------------------------------------------------------------------------------------------------------

首先这里需要注意的是,在视觉SLAM十四讲第六章中,按照书中安装的ceres-solver库版本,以及网上大多数教程安装的版本都会和Eigen3(3.3.7)有冲突,我在VINS-MONO编译时发现会报如下错误:

/usr/local/include/ceres/internal/integer_sequence_algorithm.h:70:16: error: ‘integer_sequence’ is not a member of ‘std’
/usr/local/include/ceres/internal/integer_sequence_algorithm.h:70:51: error: wrong number of template arguments (4, should be 1)
 struct SumImpl, N1, N2, Ns...>> {
                                                  ^
/usr/local/include/ceres/internal/integer_sequence_algorithm.h:60:8: note: provided for ‘template<class Seq> struct ceres::internal::SumImpl’
 struct SumImpl;
/usr/local/include/ceres/internal/variadic_evaluate.h:74:52: error: ‘ParameterBlockIndices’ was not declared in this scope
                               ParameterBlockIndices());

这里换成1.14.0版本的ceres-solver问题得以解决。
先删除之前的ceres-solver版本,执行如下命令行:

sudo rm -r /usr/local/lib/cmake/Ceres
sudo rm -rf /usr/local/include/ceres /usr/local/lib/libceres.a
sudo rm -r /usr/local/share/Ceres

之后执行如下命令完成ceres-solver的编译与安装:

#下载
wget ceres-solver.org/ceres-solver-1.14.0.tar.gz
#解压
tar xvf ceres-solver-1.14.0.tar.gz
cd ceres-solver-1.14.0
#创建编译目录
mkdir build
#切换到编译目录
cd build
#生成Makefile
cmake ..
#编译
make -j4
make test
#安装
sudo make install

4.2、安装与编译VINS-MONO

直接按照如下命令行进行VINS-MONO的安装:

mkdir -p vins-mono-catkin_ws/src #新建ROS工作空间,这里我的文件夹命名为vins-mono-catkin_ws
cd vins-mono-catkin_ws/src/
git clone https://github.com/HKUST-Aerial-Robotics/VINS-Mono.git
cd ../
catkin_make
source ~/vins-mono-catkin_ws/devel/setup.bash

至此VINS-MONO已安装完毕,下面在使用RGBD相机实测时发现一些问题:

问题记录-09 -------------------------------------------------------------------------------------------------------

由于VINS-MONO需要获取惯导IMU数据,我这里外接了一块IMU芯片,但很遗憾的是这块RK3399开发板无法正常识别串口转USB的ttyUSB端口。
要解决这个问题首先需要确认Ubuntu对USB转串口设备的支持,执行命令行:lsmod | grep usbserial
如果有usbserial,说明系统支持USB转串口。我这里没有,因此需要先安装ch340驱动或者cp210驱动。
安装ch340驱动可参考链接:https://www.cnblogs.com/huang-y-x/p/10747849.html
安装cp210驱动对内核版本有要求,我这里内核版本4.4.52过低无法安装,需要先升级内核版本。但我尝试了很久也没能正确升级,不知道是否跟这块嵌入式板子烧录的非完全Ubuntu版本有关。

问题记录-10 -------------------------------------------------------------------------------------------------------

之后我也尝试了内置惯导IMU芯片的RealSense D435i相机,奇怪的是这款RGBD相机无法在RK3399平台上进行数据传输,会产生如下提示,怀疑也是端口的驱动问题。

Failed to read busnum/devnum

这里暂时搁置,后面有进展的话会继续更新。

p.s. 今天入职满一周年了啦,以后不能再使用“萌新”身份为所欲为有点遗憾hhhhh
希望自己始终坚持学习,不断打磨自己,早日成为一位专业素养过硬的、靠谱的科研工作者。

————————————————————————————————

等待放高温假回家吃西瓜的乔木小姐
2020.07.09

你可能感兴趣的:(ORB,SLAM2,Vins-Mono,环境搭建,嵌入式,ubuntu,SLAM,三维重建,视觉算法,建图,SLAM,ROS,SLAM)