配置VI-ORB时出现的问题

在网上看到了pangjing的VI-ORB代码:https://github.com/jingpang/LearnVIORB

代码是根据这篇文章写的:Mur-Artal, R., & Tardós, J. D. (2017). Visual-inertial monocular slam with map reuse. IEEE Robotics & Automation Letters, 2(2), 796-803.

该文章是ORB-SLAM的作者在ORB-SLAM的基础上加入了惯性信息进行SLAM,具体文章过两天再看,先把pangjing的程序跑起来看看再说,在运行的过程中发现了一些问题,在此记录一下。


首先下载代码,我下载到home/wys/ORBSLAM/中,文件夹名称为LearnVIORB-RT,进入文件夹:

cd LearnVIORB-RT

在config/euroc.yaml文件中修改需要储存结果的路径以及读取数据的路径

然后编译:

./build.sh

编译时出现了错误:

CMake Error at CMakeLists.txt:33 (find_package):
Could not find a configuration file for package "OpenCV" that is compatible
with requested version "2.4.3".

The following configuration files were considered but not accepted:

/opt/ros/kinetic/share/OpenCV-3.2.0-dev/OpenCVConfig.cmake, version: 3.2.0
/usr/local/share/OpenCV/OpenCVConfig.cmake, version: 3.2.0

这是因为CMakeLists.txt中要求的opencv版本是2.4.3的,而我电脑上的时3.2.0,将:

find_package(OpenCV 2.4.3 REQUIRED)

改为:

find_package(OpenCV 3.0 QUIET)即可

再次编译,出现很多error,都是说文件中的usleep没有定义,该函数需要带有头文件unistd.h,ORB-SLAM2中的文件中都是带有该头文件的,不知道VIORB的作者为什么把这个删了,在用到usleep的文件中加上该头文件即可。

另外还有一个错误:

/usr/include/eigen3/Eigen/src/Core/AssignEvaluator.h:745:3: error: static assertion failed:YOU_MIXED_DIFFERENT_NUMERIC_TYPES__YOU_NEED_TO_USE_THE_CAST_METHOD_OF_MATRIXBASE_TO_CAST_NUMERIC_TYPES_EXPLICITLY
  EIGEN_CHECK_BINARY_COMPATIBILIY(Func,typename ActualDstTypeCleaned::Scalar,typename Src::Scalar);

参考:点击打开链接

这是Eigen3的bug,打开Thirdparty/g2o/g2o/solvers/linear_solver_eigen.h,将以下代码:

typedef Eigen::PermutationMatrix<Eigen::Dynamic, Eigen::Dynamic,SparseMatrix::Index> PermutationMatrix;

改为:

typedef Eigen::PermutationMatrix<Eigen::Dynamic, Eigen::Dynamic,int> PermutationMatrix;

对比ORB-SLAM2中的文件,作者直接把SparseMatrix::Index删除了,这两种改法似乎都没有问题,具体就不深究了。


再次编译,ROS又出问题了,出现:

[rosbuild] Error from directory check: /opt/ros/kinetic/share/ros/core/rosbuild/bin/check_same_directories.py /home/wys/ORBSLAM/LearnVIORB-RT/Examples/ROS/ORB_VIO
1
Traceback (most recent call last):
File "/opt/ros/kinetic/share/ros/core/rosbuild/bin/check_same_directories.py", line 46, in <module>
raise Exception
Exception
CMake Error at /opt/ros/kinetic/share/ros/core/rosbuild/private.cmake:102 (message):
[rosbuild] rospack found package "ORB_VIO" at "", but the current directory
is "/home/wys/ORBSLAM/LearnVIORB-RT/Examples/ROS/ORB_VIO". You should
double-check your ROS_PACKAGE_PATH to ensure that packages are found in the
correct precedence order.
Call Stack (most recent call first):
/opt/ros/kinetic/share/ros/core/rosbuild/public.cmake:177 (_rosbuild_check_package_location)
CMakeLists.txt:4 (rosbuild_init)


-- Configuring incomplete, errors occurred!

这是ROS路径没有添加到.bashrc文件中。

打开.bashrc文件:

sudo gedit ~/.bashrc

在最后添加:

export ROS_PACKAGE_PATH=$ROS_PACKAGE_PATH:/home/wys/ORBSLAM/LearnVIORB-RT/Examples/ROS/ORB_VIO

添加的语句一定要在最后,之前配置ORB-SLAM时,该路径就可以放在source ~/catkin_ws/devel/setup.bash这句话之前,不明白为什么,有谁知道的麻烦告知一下,不胜感激。

保存关闭后,在终端输入:

source ~/.bashrc

再次编译还会出现跟刚才一样的opencv版本不对的问题,要把Examples/ROS/ORB_VIO里面的CMakeLists.txt文件改了,这次再编译就没有问题了。


运行程序:

在LearnVIORB-RT文件夹中打开终端,输入:

roslaunch Examples/ROS/ORB_VIO/launch/testeuroc.launch

打开另一个终端,输入:

rosbag play ~/vins_data/V1_01_easy.bag (数据路径)

运行即可,截图如下:

配置VI-ORB时出现的问题