✅作者简介:热爱科研的Matlab仿真开发者,擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。
🍎 往期回顾关注个人主页:Matlab科研工作室
👇 关注我领取海量matlab电子书和数学建模资料
🍊个人信条:格物致知,完整Matlab代码获取及仿真咨询内容私信。
🔥 内容介绍
在当今的智能感知与导航领域,单一传感器往往难以满足复杂环境下对精度、可靠性和鲁棒性的高要求。滤波跟踪视觉里程计(VO)通过对图像序列的分析处理,能够实时计算载体的运动信息,为系统提供丰富的视觉观测;而惯性导航系统(INS)则利用加速度计和陀螺仪,自主测量载体的加速度和角速度,经过积分运算得到载体的速度、姿态和位置,在短时间内具有较高的精度且不受外界环境干扰 。将二者融合,能使系统兼具视觉信息的丰富性和惯性导航的自主性,有效提升在复杂环境下的导航性能,无论是在室内缺乏 GPS 信号的场景,还是在室外光照变化剧烈、遮挡频繁的环境中,都能稳定工作。
然而,要实现 VO 与 INS 的高效融合,外参标定是绕不开的关键环节。外参标定的核心任务是精确求解相机到 INS 的坐标变换关系,包括平移、旋转和尺度参数。只有当这些外参准确无误时,来自 VO 的视觉信息和 INS 的惯性信息才能在统一的坐标系下进行无缝融合,从而为后续的定位、导航和地图构建等任务提供坚实的数据基础。倘若外参存在误差,那么视觉特征点的投影与 IMU 预积分轨迹就会出现不匹配的情况,导致位姿估计出现跳变,最终使整个多传感器融合系统的性能大幅下降。
VO 与 INS 系统简介
(一)滤波跟踪视觉里程计 VO
视觉里程计(VO)是一种通过处理图像序列来估计相机运动的技术,其工作原理基于对图像中特征点的提取、匹配与跟踪 。以常见的 ORB(Oriented FAST and Rotated BRIEF)特征点算法为例,在初始帧图像中,ORB 算法会快速检测出具有独特亮度和纹理特征的角点作为特征点,这些角点在图像中具有明显的局部特征,不易受光照、尺度和旋转变化的影响。当相机运动到下一帧时,ORB 算法通过计算描述子,在新帧中寻找与上一帧特征点具有相似描述子的点进行匹配,从而建立特征点的对应关系。基于这些匹配点对,利用对极几何原理构建基础矩阵或本质矩阵,进而通过分解矩阵求解出相机的旋转和平移参数,实现对相机位姿的估计。
在室内场景中,环境具有丰富的纹理和结构信息,VO 能够充分利用这些特征,准确地提取和匹配大量的特征点,从而实现高精度的位姿估计,满足室内导航、室内机器人定位等任务的需求 。在一些工业检测场景中,VO 可以快速、准确地确定检测设备的位置和姿态,为工业生产提供高效的视觉支持。但在纹理匮乏的场景,如大面积的白墙、雪地等环境中,由于缺乏足够的特征点,VO 的特征提取和匹配变得极为困难,导致位姿估计的精度急剧下降,甚至可能出现无法定位的情况。在光照变化剧烈的场景,如从室内突然移动到室外强光环境,图像的亮度和对比度会发生显著变化,这会影响特征点的提取和匹配的稳定性,使得 VO 的性能受到严重影响,容易产生较大的位姿估计误差。
(二)惯性导航系统 INS
惯性导航系统(INS)主要由惯性测量单元(IMU)、数据处理单元和导航计算机等部分构成 。其中,IMU 是 INS 的核心部件,通常包含三轴加速度计和三轴陀螺仪。加速度计依据牛顿第二定律,通过检测内部惯性质量在加速度作用下产生的相对位移,来测量载体在三个方向上的加速度;陀螺仪则基于角动量守恒定律,通过检测内部旋转质量在载体旋转时产生的相对角速度,来测量载体的角速度。当载体运动时,IMU 实时采集加速度和角速度数据,数据处理单元对这些原始数据进行滤波处理,去除噪声干扰,然后通过积分运算将加速度转换为速度,再将速度积分得到位移,同时根据陀螺仪测量的角速度更新载体的姿态信息,最终由导航计算机计算出载体的位置、速度和姿态等导航参数。
INS 具有自主性强的显著优势,不依赖于外部信号,无论是在深海、地下隧道等卫星信号无法覆盖的环境,还是在受到电磁干扰导致外部信号中断的情况下,都能独立工作,持续为载体提供导航信息,这在军事、航空航天等对自主性和可靠性要求极高的领域具有不可替代的作用。INS 还具有高频输出的特点,能够以较高的频率更新导航参数,满足高动态载体(如战斗机、导弹等)对实时性的严格要求。然而,INS 存在误差累积的问题,由于加速度计和陀螺仪本身存在噪声和漂移,随着时间的推移,积分运算会使这些微小的误差不断积累,导致导航误差逐渐增大,例如在长时间的航行中,INS 的定位误差可能会达到数千米,这极大地限制了其单独在长航时、高精度导航任务中的应用 。
外参标定原理与意义
(一)外参标定基本概念
Image
(二)外参标定的意义
准确的外参标定是多传感器数据融合的关键前提,直接关系到整个系统的性能表现 。在实际应用中,以自动驾驶车辆为例,车辆上搭载的相机用于识别道路标志、车道线和周围车辆等目标,INS 则提供车辆的姿态和加速度信息。若外参标定不准确,相机识别到的目标在 INS 坐标系中的位置就会出现偏差,当车辆根据融合数据进行决策时,可能会做出错误的判断,如错误估计与前车的距离,从而导致碰撞风险增加 。在无人机导航中,若 VO 与 INS 的外参存在误差,无人机在飞行过程中的位姿估计就会出现偏差,可能会偏离预定航线,无法准确到达目标位置,甚至在复杂环境中发生碰撞事故。在室内机器人导航场景中,外参标定误差会使机器人对环境的感知出现偏差,导致其在移动过程中频繁碰撞障碍物,无法完成预定的任务 。由此可见,精确的外参标定对于保障多传感器融合系统的导航精度和可靠性,确保各类应用场景下的安全与高效运行具有不可或缺的重要意义。
⛳️ 运行结果
Image
Image
Image
Image
Image
📣 部分代码
x_13 = x(1, 1 : 7); % LiDAR to INS
x_23 = x(1, 8 : 15); % Camera to INS
x_12 = [t_12, x(1, 16 : 20)];
mu = [1, 1, 1, 1, 1]; % Weight
% mu = [1, 1, 10, 10, 10]; % Worse
%% LiDAR to INS
quat_13 = x_13(1, 4 : 7);
quat_13 = quat_13 / sqrt(sum(quat_13.^2));
R_13 = quat2rotm(quat_13);
t_13 = x_13(1, 1 : 3)';
[m, ~] = size(pose_1_13);
for i = 2 : m
[R_1, t_1] = calcRelativePose_quat(pose_1_13(i - 1, :), pose_1_13(i, :));
[R_3, t_3] = calcRelativePose_quat(pose_3_13(i - 1, :), pose_3_13(i, :));
loss = loss + mu(1) * norm(R_1 * R_13 - R_13 * R_3, 2) + ...
mu(2) * norm(R_1 * t_13 + t_1 - R_13 * t_3 - t_13, 2);
end
%% Camera to INS
quat_23 = x_23(1, 4 : 7);
quat_23 = quat_23 / sqrt(sum(quat_23.^2));
R_23 = quat2rotm(quat_23);
t_23 = x_23(1, 1 : 3)';
s_23 = x_23(1, 8);
[n, ~] = size(pose_2_23);
for j = 2 : n
[R_2, t_2] = calcRelativePose_quat(pose_2_23(j - 1, :), pose_2_23(j, :));
[R_3, t_3] = calcRelativePose_quat(pose_3_23(j - 1, :), pose_3_23(j, :));
loss = loss + mu(1) * (norm(R_2 * R_23 - R_23 * R_3, 2))^2 + ...
mu(2) * (norm(R_2 * t_23 + t_2 * s_23 - R_23 * t_3 - t_23, 2)^2);
% loss = loss + mu(1) norm(R_2 R_23 - R_23 * R_3, 2) + ...
% mu(2) norm(R_2 t_23 + t_2 s_23 - R_23 t_3 - t_23, 2); % Worse
end
%% LiDAR to Camera
quat_12 = x_12(1, 4 : 7);
quat_12 = quat_12 / sqrt(sum(quat_12.^2));
R_12 = quat2rotm(quat_12);
t_12 = x_12(1, 1 : 3)';
s_12 = x_12(1, 8);
[p, ~] = size(pose_1_12);
for k = 2 : p
[R_1, t_1] = calcRelativePose_quat(pose_1_12(k - 1, :), pose_1_12(k, :));
[R_2, t_2] = calcRelativePose_quat(pose_2_12(k - 1, :), pose_2_12(k, :));
loss = loss + mu(1) * (norm(R_1 * R_12 - R_12 * R_2, 2)^2) + ...
mu(2) * (norm(R_1 * t_12 + t_1 - R_12 * t_2 * s_12 - t_12, 2)^2);
% loss = loss + mu(1) norm(R_1 R_12 - R_12 * R_2, 2) + ...
% mu(2) norm(R_1 t_12 + t_1 - R_12 t_2 s_12 - t_12, 2); % Worse
end
%% Between Extrinsics
loss = loss + mu(3) (s_23 - s_12)^2 + mu(4) norm(R_13 - R_12 R_23, 2) + mu(5) norm(t_13 - R_12 * t_23 - t_12, 2);
end
🔗 参考文献
🎈 部分理论引用网络文献,若有侵权联系博主删除