前言
最近使用高翔博士修改的orb_slam2生成稠密点云,然后用八叉树生成二维栅格地图用来导航,但是建出来的图效果不太行,漂移太严重。
左边是cartographer跑出来的图,右边是orb_slam2的。
效果这么差一方面是我点云处理的不好,因为生成的点云在八叉树中是倾斜的,我自己手动调的角度,可能不那么精确,另一方面就是生成的pcd它本身就漂移,这是跑出来的pcd文件
于是看了其他的一些算法,想对这些算法做一些评估,跑的是同一个euroc数据集MH01_easy。
三种算法的安装
因为orb_slam2使用的库和orb_slam3有冲突,所以用的是两台电脑,两台电脑都装了vins_mono。装orb_slam3的是新装的系统。
1.orb_slam2
使用的是高翔博士的修改版GitHub - gaoxiang12/ORBSLAM2_with_pointcloud_map
因为安装编译比较麻烦之后有时间再补
2.vins_mono
2.1 安装系统包
sudo apt install ros-melodic-cv-bridge ros-melodic-tf ros-melodic-message-filters ros-melodic-image-transport
2.2 安装ceres_solver
安装依赖
sudo apt-get install cmake
sudo apt-get install libgoogle-glog-dev libgflags-dev
sudo apt-get install libatlas-base-dev
sudo apt-get install libeigen3-dev
sudo apt-get install libsuitesparse-dev
下载ceres_solver源码(注意版本兼容,选用1.14版本)
参考这篇文章
Ubuntu18.04安装Ceres1.14_ubuntu18安装ceres-CSDN博客
编译安装
mkdir build
cd build
cmake ..
make
make test
sudo make install
如果编译报错可能是cmake版本的问题,可以建立高版本的cmake软连接,一定不要使用automove,参见这篇
cmake升级、更新(ubuntu18.04)-CSDN博客
2.3 运行
roslaunch vins_estimator euroc.launch
roslaunch vins_estimator vins_rviz.launch
rosbag play --pause MH_01_easy.bag
数据集可以从这下载
kmavvisualinertialdatasets – ASL Datasets
3.orb_slam3
1. 安装库和依赖
Pangolin,opencv,eigen3,boost
pangolin同orb_slam2一样使用0.6版本,opencv和eigen3使用自带的就可以
boost
Boost Downloads 下载boost_1_77_0.tar.gz版本
tar -xvf boost_1_77_0.tar.gz
cd ./boost_1_77_0
./bootstrap.sh
sudo ./b2 install
rosdep 因为官网更新下载很容易失败,这里使用鱼香ros的rosdepc
sudo pip install rosdepc
//找不到pip就试试pip3
sudo pip3 install rosdepc
//如果还是没有就先执行下面的然后重复上面的
sudo apt-get install python3-pip
sudo rosdepc init
rosdepc update
之前屡试不爽但是新系统不知道为什么连不上网站,这里是用小鱼的一键安装
wget http://fishros.com/install -O fishros && . fishros
2. 编译
代码
git clone https://github.com/UZ-SLAMLab/ORB_SLAM3.git
编译
build.sh编译比较简单,先给build_sh赋一下权限
sudo chmod +x build.sh
我们opencv版本不对应,以及c++版本,在Cmakelists中改两处
1.找到
find_package(OpenCV 4.4)
改为
find_package(OpenCV 3 REQUIRED)
2.找到
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
改为
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14")
编译过程中如果出现interial段错误改build.sh中的make -j8把-j8全删掉就可以了。
如果编译没通过,需要删除ORB_SlAM3下的build和lib文件夹阿,以及Thirdparty下DBoW2和g2o里面的build和lib文件夹,Sophus下的build文件夹。不删除下次编译会报错,上述文件如果有些没有,那就是上次编译还没编译到那一步。
build_ros.sh编译多几步
首先和上面一样Cmakelists要改一下,还有一些
include_directories(
${PROJECT_SOURCE_DIR}
${PROJECT_SOURCE_DIR}/../../../
${PROJECT_SOURCE_DIR}/../../../include
${PROJECT_SOURCE_DIR}/../../../include/CameraModels
${Pangolin_INCLUDE_DIRS}
#加上下面这些,其中catkin一行不知道到底需不需要,都加上吧省得要重新编译(复制完后这一行删了)
${EIGEN3_INCLUDE_DIR}
${catkin_INCLUDE_DIRS}
${PROJECT_SOURCE_DIR}/../../../Thirdparty/Sophus
)
新版的ORB_SLAM3中Examples里没有ROS文件夹,把Eamples_old里面的复制过来就行了,然后需要将包的路径添加到bash文件中
sudo gedit ~/.bashrc
export ROS_PACKAGE_PATH=${ROS_PACKAGE_PATH}:/home/cr/ORB_SLAM3/Examples/ROS
将上面的代码复制进去,注意,一定要在放在source路径的后面不然后面不会显示,保险起见放在最后就好了。接下来看看输出的路径里有没有
echo ${ROS_PACKAGE_PATH}
代码也需要修改
在~/ORB_SLAM3/Examples/ROS/ORB_SLAM3/src/AR/ViewerAR.cc中
加上头文件
#include <Eigen/Dense>
#include <opencv2/core/eigen.hpp>
//vPoints.push_back(pMP->GetWorldPos());
注释掉上面的,改成下面的
cv::Mat WorldPos;
cv::eigen2cv(pMP->GetWorldPos(), WorldPos);
vPoints.push_back(WorldPos);
//cv::Mat Xw = pMP->GetWorldPos();
注释掉上面的,改成下面的
cv::Mat Xw;
cv::eigen2cv(pMP->GetWorldPos(), Xw);
在~/ORB_SLAM3/Examples/ROS/ORB_SLAM3/src/AR/ros_mono_ar.cc中
加上头文件
#include <Eigen/Dense>
#include <opencv2/core/eigen.hpp>
//cv::Mat Tcw = mpSLAM->TrackMonocular(cv_ptr->image,cv_ptr->header.stamp.toSec());
注释掉上面的,改成下面的
cv::Mat Tcw;
Sophus::SE3f Tcw_SE3f = mpSLAM->TrackMonocular(cv_ptr->image,cv_ptr->header.stamp.toSec());
Eigen::Matrix4f Tcw_Matrix = Tcw_SE3f.matrix();
cv::eigen2cv(Tcw_Matrix, Tcw);
最后输入下面命令更新一下共享库就可以编译了,同样的记得先给build_ros赋一下权限
sudo ldconfig
3.3 运行
./Examples/Monocular/mono_euroc ./Vocabulary/ORBvoc.txt ./Examples/Monocular/EuRoC.yaml /home/**********/MH_01_easy ./Examples/Monocular/EuRoC_TimeStamps/MH01.txt
*****换成自己的路径,注意这里的跑的不是bag包,而是数据集,因为后续评估需要数据集中的一个文件。
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
如果跑一半或者刚开始就闪退报错核心已转储,修改上面代码中yaml文件的
ORBextractor.nFeatures: 2000
改为3000,如果再不行就往上加,这个问题在之前跑orb_slam2时卡了很久,经过测试最终数值相差不大,下面的内容会给出结果
evo安装与评估
1. evo安装
pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple/ evo --upgrade --no-binary evo
之后终端输入evo tap键补全会出现其他命令,那就是安装成功了,没有也不要着急,重启一下电脑就好了。
sudo apt-get install python-tk
sudo apt-get install python3-tk
2. vins_mono测试
vins_mono生成的轨迹无法直接用于测试,所以要修改一下代码
Ubuntu 18.04 ——— VINS-Mono运行与EVO的评测与使用_vins-mono实现 ubuntu18.04-CSDN博客
参考这篇文章
修改完成后会有一个文件vins_result_loop.txt,这个就是要评估的文件,在我们上述下的数据集,也就是orb_slam3跑的数据集中,MH_01_easy/mav0/state_groundtruth_estimate0/data.csv这个文件是euroc格式,需要转成tum格式
evo_traj euroc data.csv --save_as_tum
再然后将vins_result_loop.txt和data.tum放到同一个目录下,执行下面的代码就可以出结果了
evo_ape tum data.tum vins_result_loop.txt -p --plot_mode=xyz -a --correct_scale --save_results ./test.zip
最后保存的结果的压缩包随便起个名就好
这里有可能会报错ModuleNotFoundError:No module named '_tkinter'
安装一下就好了
sudo apt-get install python-tk
sudo apt-get install python3-tk
再次执行就能看到结果了
3. ORB_SLAM3测试
ORB_SLAM2的跑出来的文件是可以直接用的,注意要评估的文件不是KeyFrameTrajectory.txt而是CameraTrajectory.txt
同样的和data.tum放到同一个目录下执行代码就可以看到结果
evo_ape tum data.tum CameraTrajectory.txt -p --plot_mode=xyz -a --correct_scale --save_results ./test.zip
结果对比和后续想法
orb_slam2
vin_mono
ORB_SLAM3_3000(修改了yaml文件)
ORB_SLAM3_2000(我跑了七八成核心转储了,不过轨迹文件也能用)
分析,虽然只跑了一个数据集但是数据很直观了,ORB_SLAM3的效果很棒,然后修改了yaml文件两组数据相差很小,之后会对ORBextractor.nFeatures的不同值测试多组数据集。
但是总归来说还是想建出一个合格的地图,任重道远,共勉共勉。