1.基本介绍
1.1.VINS-Fusion 基本介绍
VINS-Fusion 是继 VINS-Mono 和 VINS-Mobile(单目视觉惯导 SLAM 方案)后,香港科技大学沈劭劼老师开源的双目视觉惯导 SLAM 方案,VINS-Fusion 是一种基于优化的多传感器状态估计器,可实现自主应用(无人机,汽车和 AR / VR)的精确自定位。 VINS-Fusion 是 VINS-Mono 的扩展,支持多种视觉惯性传感器类型(单目摄像机+ IMU,双目摄像机+ IMU,甚至仅限双目摄像机)。开源项目组还展示了将 VINS 与 GPS 融合的模组示例。
图1 融合模组示例
特征如下:
多传感器支持(立体摄像机/单声道摄像机+ IMU /立体摄像机+ IMU)
在线空间校准(相机和 IMU 之间的转换)
在线时间校准(相机和 IMU 之间的时间偏移)
视觉循环闭合
参考文章:双目版 VINS 项目发布,小觅双目摄像头作为双目惯导相机被推荐 - 知乎 (zhihu.com)
1.2.IMU和GNSS基本介绍
1.2.1.IMU
惯性测量单元是测量物体三轴姿态角(或角速率)以及加速度的装置。一般的,一个IMU包含了三个单轴的加速度计和三个单轴的陀螺,加速度计检测物体在载体坐标系统独立三轴的加速度信号,而陀螺检测载体相对于导航坐标系的角速度信号,测量物体在三维空间中的角速度和加速度,并以此解算出物体的姿态。在导航中有着很重要的应用价值。
1.2.2.GNSS
全球导航卫星系统(英文:Global Navigation Satellite System,缩写:GNSS,又称全球卫星导航系统),是能在地球表面或近地空间的任何地点为用户提供全天候的3维坐标和速度以及时间信息的空基无线电导航定位系统。
全球导航卫星系统(GNSS)包括一个或多个卫星星座及其支持特定工作所需的增强系统。
全球卫星导航系统国际委员会公布的全球4大卫星导航系统供应商,包括中国的北斗卫星导航系统(BDS)、美国的全球定位系统(GPS)、俄罗斯的格洛纳斯卫星导航系统(GLONASS)和欧盟的伽利略卫星导航系统(GALILEO)。其中GPS是世界上第一个建立并用于导航定位的全球系统,GLONASS经历快速复苏后已成为全球第二大卫星导航系统,二者正处现代化的更新进程中;GALILEO是第一个完全民用的卫星导航系统,正在试验阶段;BDS是中国自主建设运行的全球卫星导航系统,为全球用户提供全天候、全天时、高精度的定位、导航和授时服务。
参考:全球导航卫星系统(为用户提供信息的空基无线电导航定位系统)_百度百科 (baidu.com)
1.3.视觉传感器
相机/视觉传感器是获取环境纹理信息的主要传感器,依据其工作方式的不同可以分为单目相机、双目相机、深度相机以及事件相机等。相较于其他传感器,相机成本较低,体积较小,能够获得外部环境的语义特征,因此常被用于多源融合的导航定位技术当中。利用视觉特征的视觉同时定位与建图(visual simultaneous localization and mapping,VSLAM)[10]技术,以相机作为传感器获取外部信息,通过对环境特征的连续跟踪来同时实现自身的位姿估计以及环境结构的重建。[1]
参考论文:[1]许智理,闫倬豪,李星星,等.面向智能驾驶的高精度多源融合定位综述[J].导航定位与授时,2023,10(03):1-20.DOI:10.19306/j.cnki.2095-8110.2023.03.001.
2.VINS-Fusion使用
2.1.环境配置
2.1.1.Ubuntu和ROS
Ubuntu 64 位 16.04 或 18.04。 ROS Kinetic 或 Melodic。
2.1.2.安装 Ceres Solver
Ceres Solver 是一个开源的 C++ 库,用于解决非线性最小二乘问题。它的自动微分、鲁棒优化算法以及高效的并行计算能力,使其成为解决复杂非线性优化问题的理想选择。它被广泛应用于计算机视觉、机器人和图像处理领域中的优化问题。
官方文档:安装 — Ceres Solver (ceres-solver.org)
GitHub地址:GitHub - ceres-solver/ceres-solver: A large scale non-linear optimization library
2.1.3.安装VINS-Fusion
下载库并进行catkin_make编译,执行以下命令:
cd ~/catkin_ws/src
git clone https://github.com/HKUST-Aerial-Robotics/VINS-Fusion.git
cd ../
catkin_make
source ~/catkin_ws/devel/setup.bash
2.2.EuRoC MAV 数据集测试VINS-Fusion
参考链接:
1、Ubuntu安装Vins-Fusion(2) —— Ubuntu20.04安装vins-fusion_ubuntu20 vinsfusion-CSDN博客
2、Ubuntu 18.04 ——— VINS-Fusion运行与EVO的评测与使用_ubuntu18从零开始搭建vins-fusion环境-CSDN博客
3、GitHub - HKUST-Aerial-Robotics/VINS-Fusion: 基于优化的多传感器状态估计器
2.2.1.下载EuRoC MAV 数据集
数据集地址:kmavvisualinertialdatasets – ASL Datasets (ethz.ch)
下载 MH_01_easy.bag文件
图2 MH_01_easy.bag文件下载
该数据集没有GPS数据,该数据集可以测试三种类型:单目相机+IMU(monocular camera + IMU)、双目立体相机+IMU(stereo cameras + IMU)、双目立体相机(stereo cameras)。
2.2.2.测试EuRoC MAV 数据集
打开四个终端分别运行,vins里程计、视觉循环闭合(可选)、rviz和播放bag文件。rviz中绿色路径是VIO里程计,红色路径是视觉循环闭合里程计。
(1)Monocualr camera + IMU
roslaunch vins vins_rviz.launch
rosrun vins vins_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_mono_imu_config.yaml
rosbag play MH_01_easy.bag
(2)Stereo cameras + IMU
roslaunch vins vins_rviz.launch
rosrun vins vins_node ~/catkin_ws/src/VINS-Fusion/config/euroc/euroc_stereo_imu_config.yaml
(可选) rosrun loop_fusion loop_fusion_node ~/catkin_ws/src/VINS-Fusion/config/euroc/euroc_stereo_imu_config.yaml
rosbag play MH_01_easy.bag
(3)Stereo cameras
roslaunch vins vins_rviz.launch
rosrun vins vins_node ~/catkin_ws/src/VINS-Fusion/config/euroc/euroc_stereo_config.yaml
(可选) rosrun loop_fusion loop_fusion_node ~/catkin_ws/src/VINS-Fusion/config/euroc/euroc_stereo_config.yaml
rosbag play MH_01_easy.bag
2.2.3.测试EuRoC MAV 数据集配置文件参数
参考:VINS fusion软件架构分析(2)---- 从参数文件读取参数_camerafactory::instance()-CSDN博客
(1)Monocualr camera + IMU
配置文件为:/config/euroc/euroc_mono_imu_config.yaml
图3 yaml文件部分参数1
imu:是否输入imu参数,1为有imu,0为没有imu;
num_of_cam:相机数量,1为单目相机,2为双目相机;
imu_topic:imu话题;
image0_topic:cam0相机话题;
image1_topic:cam1相机话题;
配置文件传入三个话题,分别为imu,cam0相机和cam1相机,该示例只使用了imu话题和一个相机话题。
图4 yaml文件部分参数2
estimate_extrinsic:设置成0,认为配置文件中的外参数准确,将一直使用配置文件中的外参数;设置成1,对外参数有一个初步猜测,将围绕这个初步猜测对外参数进行优化;
Body_T_cam0:cam0相机的外参数;
图5 yaml文件部分参数3
multiple_thread:多线程;
max_cnt:一帧图像最多允许筛选的特征点数目;
min_dist:两个特征点之间最小的距离;
F_threshold:cv::findFundamentalMat求解基础矩阵的系数;
show_track:设置成1,则允许在当前帧图像上标记出不同状态的特征点,并发布该图像到节点上;
flow_back::设置成1,则开启方向光源,提高特征点跟踪精度。
图6 yaml文件部分参数4
max_solver_time:最大优化时间,确保实时性;
max_num_iterations:优化最多迭代次数,确保实时性;
keyframe_parallax:判断是否是关键帧的视差阈值;
acc_n:加速度计的噪音;
gyr_n:陀螺仪的噪音;
acc_w:加速度计的随意游走噪音;
gyr_w:陀螺仪的随意游走噪音;
g_norm:重力加速度;
注意:和IMU相关的噪音需要通过对IMU标定得到。
图7 yaml文件部分参数5
estimate_td:在线估计相机和imu之间的时间偏移;
td:时间偏移的初始值,单位:s,读取图像时间+ td =真实图像时间(IMU时间);
图8 yaml文件部分参数6
load_previous_pose_graph:重新加载使用以前的姿态图;文件路径为“load_previous_pose_graph”;
pose_graph_save_path:保存文件路径;
save_image:将图像保存为姿态图,便于可视化;可以通过设置为0关闭此功能。
(2)Stereo cameras + IMU
配置文件为:/config/euroc/ euroc_stereo_imu_config.yaml
图9 相对于上一个yaml文件修改部分
更改num_of_cam:2,相机数量为2为双目相机;增加Body_T_cam1,cam1相机的外参数;
(3)Stereo cameras
配置文件为:/config/euroc/ euroc_stereo_config.yaml
图10 相对于上一个yaml文件修改部分
更改imu:0,没有imu,因此与imu相关参数全部没有。
2.3.KITTI 数据集测试VINS-Fusion
参考链接:GitHub - HKUST-Aerial-Robotics/VINS-Fusion: 基于优化的多传感器状态估计器
2.3.1.KITTI 数据集
该数据集有GPS数据,该数据集可以测试两种类型:双目立体相机+GPS(Stereo + GPS)、双目立体相机(Stereo)。
KITTI数据集介绍与使用说明:【深度估计】KITTI数据集介绍与使用说明 - 知乎 (zhihu.com)
2.3.2.下载和测试KITTI 数据集
(1)下载KITTI里程计数据集: KITTI Vision Benchmark 套件 (cvlibs.net);以序列 00 为例, 打开两个终端,分别运行 vins 和 rviz。
roslaunch vins vins_rviz.launch
(可选) rosrun loop_fusion loop_fusion_node ~/catkin_ws/src/VINS-Fusion/config/kitti_odom/kitti_config00-02.yaml
rosrun vins kitti_odom_test ~/catkin_ws/src/VINS-Fusion/config/kitti_odom/kitti_config00-02.yaml YOUR_DATASET_FOLDER/sequences/00/
(2)下载KITTI原始数据集:KITTI Vision Benchmark 套件 (cvlibs.net);以 2011_10_03_drive_0027_synced 为例。 打开三个终端,分别运行 vins、global fusion 和 rviz。 绿色路径是 VIO 里程计;蓝色路径是 GPS 全局融合下的里程计。
roslaunch vins vins_rviz.launch
rosrun vins kitti_gps_test ~/catkin_ws/src/VINS-Fusion/config/kitti_raw/kitti_10_03_config.yaml YOUR_DATASET_FOLDER/2011_10_03_drive_0027_sync/
rosrun global_fusion global_fusion_node
2.3.3.测试KITTI数据集配置文件参数
KITTI数据集配置文件参数与EuRoC MAV 数据集配置文件参数类似,请参考2.2.3章节。
3.总结
相机与IMU融合通过修改yaml文件实现,相机与GPS融合通过运行global程序实现。