上周成功的在新的嵌入式平台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
我这里已安装的基础环境与平台:
嵌入式平台RK3399
、系统Ubuntu 16.04
(xubuntu轻量级桌面系统)、架构Arm64
、Python2.7.1
、OpenCV3.4.0
、Eigen3.3.7
实时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安装与配置:
配置Ubuntu要求允许接受”restricted” “universe” 和 “multiverse”的软件源,一般是系统默认设置,可以在Software & Updates 中查看。
添加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'
首先更新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
使用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
启动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
#保存后退出再尝试
将Intel RealSense摄像头与ROS配合使用需安装ROS环境下的驱动。
RealSense-ROS官方说明:https://github.com/IntelRealSense/realsense-ros
首先需要安装librealsense2
,OpenCV
,相关安装步骤在我上一篇博客中有详细说明与相关问题总结,这里不再赘述。
链接地址:https://blog.csdn.net/nannan7777/article/details/106790367
首先使用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-
下载 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
ORB-SLAM2官方说明:https://github.com/raulmur/ORB_SLAM2
官方提供了在KITTI数据集,TUM数据集,以及在EuRoC数据集中单目,双目和RGB-D三种接口的SLAM系统示例,同时也提供了使用ROS节点来处理相机实时运行的SLAM示例。
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
cd ~
git clone https://github.com/stevenlovegrove/Pangolin.git
cd Pangolin
mkdir build
cd build
cmake ..
make -j4
#安装包下载网址:
#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
注:在执行
./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相机实测效果:
问题记录-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
。
问题记录-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
直接按照如下命令行进行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