目录
系统:Ubuntu 20.04
ros:noetic
本文基于Ubuntu20.04从零开始搭建vins-mono环境并测试数据集继续搭建,一些基础配置就不详细写了。
一、安装依赖项
二、安装Pangolin
三、安装ros
四、安装opencv
五、ceres-1.14.0
以上全部内容见vins-mono环境搭建一文。
六、安装vins-fusion
1、源码
cd ~/catkin_ws/src
git clone https://github.com/HKUST-Aerial-Robotics/VINS-Fusion.git
2、修改配置文件
①在 VINS-Fusion/camera_models/include/camodocal/chessboard/Chessboard.h 中添加
#include <opencv2/imgproc/types_c.h>
#include <opencv2/calib3d/calib3d_c.h>
②在 VINS-Fusion/camera_models/include/camodocal/calib/CameraCalibration.h 中添加
#include <opencv2/imgproc/types_c.h>
#include <opencv2/imgproc/imgproc_c.h>
③在 VINS-Fusion/global_fusion/CMakeLists.txt 中第5行
VINS-Fusion/camera_models/CMakeLists.txt 中第5行
VINS-Fusion/loop_fusion/CMakeLists.txt 中第5行
VINS-Fusion/vins_estimator/CMakeLists.txt 中第5行改为
set(CMAKE_CXX_STANDARD 14)
④在 VINS-Fusion/loop_fusion/src/pose_graph.cpp 中
同目录下 keyframe.cpp 中
查找替换
CV_FONT_HERSHEY_SIMPLEX 改为 cv::FONT_HERSHEY_SIMPLEX
⑤在 VINS-Fusion/loop_fusion/src/ThirdParty/DVision/BRIEF.cpp 中
VINS-fusion/vins-estamator/src/featureTracker/feature_tracker.cpp 添加
#include <opencv2/imgproc/types_c.h>
⑥在 VINS-fusion/vins-estamator/src/KITTIGPSTest.cpp 中
同目录下 KITTIOdomTest.cpp 中
查找替换
CV_LOAD_IMAGE_GRAYSCALE 改为 cv::IMREAD_GRAYSCALE
3、编译
cd ~/catkin_ws
catkin_make
source ~/catkin_ws/devel/setup.bash
4、运行
依旧是多终端命令运行(alt+T打开),并且不同的运行模式对应不同的第二行命令。
4.1官方数据集
数据集下载省略,具体看之前的文章,这里直接写运行命令了。
终端一:
roslaunch vins vins_rviz.launch
终端二:
#单目+IMU
rosrun vins vins_node ~/catkin_ws/src/VINS-Fusion/config/euroc/euroc_mono_imu_config.yaml
#双目
rosrun vins vins_node ~/catkin_ws/src/VINS-Fusion/config/euroc/euroc_stereo_config.yaml
#双目+IMU
rosrun vins vins_node ~/catkin_ws/src/VINS-Fusion/config/euroc/euroc_stereo_imu_config.yaml
#双目+GPS
rosrun vins kitti_gps_test ~/catkin_ws/src/VINS-Fusion/config/kitti_raw/kitti_10_03_config.yaml
终端三(可选择,执行回环检测):
#单目+IMU
rosrun loop_fusion loop_fusion_node ~/catkin_ws/src/VINS-Fusion/config/euroc/euroc_mono_imu_config.yaml
#双目
rosrun loop_fusion loop_fusion_node ~/catkin_ws/src/VINS-Fusion/config/euroc/euroc_stereo_config.yaml
#双目+IMU
rosrun loop_fusion loop_fusion_node ~/catkin_ws/src/VINS-Fusion/config/euroc/euroc_stereo_imu_config.yaml
终端四:
#其他
rosbag play ./MH_01_easy.bag
#双目+GPS
rosrun global_fusion global_fusion_node
完成~
4.2自制数据集
1)参数标定
参考Ubuntu20.04下vins-mono用自己数据并跑通(手机摄像头/离线)一文。
2)数据打包
自己的数据集打包参考Ubuntu20.04下vins-mono用自己数据并跑通(手机摄像头/离线)一文。
3)添加yaml文件
在VINS-Fusion/config 下新建文件夹并命名为 android
复制 euroc 目录下的 cam0_mei.yaml 和 euroc_mono_imu_config.yaml 文件并贴到 android 文件下,并将第二个yaml重命名为 android_config.yaml
①打开android_config.yaml
第15、16行,相机分辨率
第19行,外旋转矩阵估计设置为1(非精确值)
第48-52行,imu参数
第55行,同步时差估计设置为1(打开)
(可选)第59行,回环重定位设置为1(打开)
画重点:如果要进行重定位,那在保存第一次的轨迹时需要提前新建文件夹,fusion和momo不一样,不能自己建文件夹。如果路径里的文件夹不存在的话,没办法保存,会直接中断回环进程。
保存关闭
②打开cam0_mei.yaml
根据之前的标定结果改一下分辨率和参数
重点!!!!
projection_parameters下面的四个参数要改成fx,fy,cx,cy,不能用原本的,不然就会遇见能打开rviz有画面但是没有轨迹,终端疯狂报错 Not enough features or parallax; Move device around 的情况。
保存关闭
4)更改源码
①在 VINS-Fusion/vins_estimator/src/utility/visualization.cpp 中
第156-171行,修改为
ofstream foutC2(VINS_RESULT_PATH, ios::app);
foutC2.precision(9);
foutC2.setf(ios::fixed, ios::floatfield);
foutC2 << header.stamp.toSec() << " ";
foutC2.precision(6);
foutC2 << estimator.Ps[WINDOW_SIZE].x() << " "
<< estimator.Ps[WINDOW_SIZE].y() << " "
<< estimator.Ps[WINDOW_SIZE].z() << " "
<< tmp_Q.x() << " "
<< tmp_Q.y() << " "
<< tmp_Q.z() << " "
<< tmp_Q.w() << endl;
foutC2.close();
②在 VINS-Fusion/loop_fusion/src/pose_graph.cpp 中
第184-197行,修改为
ofstream loop_path_file2(VINS_RESULT_PATH, ios::app);
loop_path_file2.setf(ios::fixed, ios::floatfield);
loop_path_file2.precision(9);
loop_path_file2 << cur_kf->time_stamp << " ";
loop_path_file2.precision(6);
loop_path_file2 << P.x() << " "
<< P.y() << " "
<< P.z() << " "
<< Q.x() << " "
<< Q.y() << " "
<< Q.z() << " "
<< Q.w() << endl;
loop_path_file2.close();
第827-840行,修改为
ofstream loop_path_file2(VINS_RESULT_PATH, ios::app);
loop_path_file2.setf(ios::fixed, ios::floatfield);
loop_path_file2.precision(9);
loop_path_file2 << (*it)->time_stamp << " ";
loop_path_file2.precision(6);
loop_path_file2 << P.x() << " "
<< P.y() << " "
<< P.z() << " "
<< Q.x() << " "
<< Q.y() << " "
<< Q.z() << " "
<< Q.w() << endl;
loop_path_file2.close();
保存关闭
5)运行
终端一:
roslaunch vins vins_rviz.launch
终端二:
rosrun vins vins_node ~/catkin_ws/src/VINS-Fusion/config/android/android_config.yaml
(可选)终端三:
rosrun loop_fusion loop_fusion_node ~/catkin_ws/src/VINS-Fusion/config/android/android_config.yaml
终端四:
rosbag play output.bag
完毕
存在问题:
初始化超级快,几乎是一开始轨迹就飞了,由于本身标定的不太精确,所以不确定是标定的问题还是fusion就这么容易飞……
解决:fusion因为不提供外参矩阵自动标定,所以不仅需要自己标相机和imu的参数,还需要联合标定,全部标完以后轨迹就准了。
七、参考资料
在ubuntu20.04上配置VINS_Fusion(亲测有效,一应俱全)
Ubuntu20.04从零开始搭建vins-mono环境并测试数据集