Vins-Fusion 视觉里程计
2024-10-20
算法使用
选择合适的场景
我应当在什么场景下使用该算法 ?
算法运行前,先将无人机放置在平稳的地方,且相机视角方向有足够静态特征的场景(不推荐在过暗、过曝、少纹理、运动物体多等地方),如下图所示:
运行算法
当无人机放置好后,可以开始运行算法:
# 打开第一个终端,初始化无人机 cd X152b bash scripts/one_shot_single.sh # 打开第二个终端,启动 Vins-Fusion 视觉里程计 cd X152b bash src/vins_fusion/run.sh
判断是否正常初始化
如何判断算法是否正常完成初始化 ?
当终端提示
Initialization finish!
时,表明 Vins-Fusion 初始化完成,如下图所示:评估和可视化
初始化完成后,然后用手缓慢拿起无人机,在纹理充足的场地中慢速( <1m/s)走一段距离,一般可以通过绕场地一圈回到出发点,观察里程计输出ROS话题
/mavros/vision_pose/pose.pose.position
结果值是否与初始值(x:0 y:0 z:0
)接近。如果偏差能控制在 cm 数量级,则表明 Vins-Fusion 运行良好。[可选] 使用 Foxglove 远程可视化
算法运行过程中,打开 Foxglove,可对程序运行状况进行可视化,如下图所示:
这里提供了布局配置文件,在Foxglove中导入该布局,实现上图
常见问题
Q: 初始化失败,终端提示 feature tracking not enough, please slowly move you device
初始化阶段相机视野中可用于跟踪的特征点过少,需要将无人机放置相机视角方向有足够静态特征的场景(不推荐在过暗、过曝、少纹理、运动物体多等地方)中重新运行。
Q: 初始化无论是否完成,终端大量提示 numerical unstable in preintegration
或 wait for imu ...
检查imu相关话题数据是否以正常频率更新(默认200Hz左右),或者检查标定情况,外参差异过大也会导致初始化失败。(例如正负号写反导致某个轴旋转了90度以上)
Q: 初始化完成后,依然会出现里程计飘的问题
可以根据现象一步步排查
1、如果是初始化后,静止不动都会直接飘了,需要看是否有(动态物体、频闪的光源等)大量存在于相机视野中,这些会导致 Vins-Fusion 认为场景在运动;
2、也可能是初始化过程中,即IMU预积分阶段时,无人机处于非静止状态,放大了无人机陀螺仪噪声估计误差。
3、可能是内外参关系与实际情况相差过大。需要检查相机和飞控是否牢固,排除因为摔飞机导致结构位移。或者需要重新标定内外参信息。
Q: 只给了一个粗糙的外参,但是开启自动优化后依然不准,或直接跑崩
可能的原因包含:
1、检查相机和IMU是否存在明显的结构松动情况
2、检查所给内外参是否明显的超过实际情况(例如相机到IMU的旋转矩阵在某个轴超过90度),需要重新联合标定相机-IMU
3、在进行标定自动优化时,注意不要用手或其他东西遮挡摄像头视野;手持绕场进行外参标定时,移动速度不易过快;确保相机画面能观察到足够稳定的场地纹理
Q: 在室内表现还行,但是在户外场景或者大的空间就不太行。
大概率问题都是相机基线过短造成的问题,失去尺度是比较正常的。(因为无人机尺寸限制,相机基线不好做很长,而 Realsense D430 基线只有5cm左右,难以应付开阔的大户外场景。)