本项目试图在开源项目 AlvaAR 的基础上进行修改,实现相对可靠的AR导航功能。
本项目的核心部分是在前端为获取到的IMU数据增加一个基于时序记忆预测的卡尔曼滤波算法,从而缓解在相机运动过程中由于位姿突变导致的AR组件丢失的情况,从而提高AR导航的稳定性,优化项目性能。
本部分将深入解析本模块中卡尔曼滤波器的核心原理,结合代码实现进行数学推导说明。
卡尔曼滤波器通过递归算法实现最优估计,其核心流程分为两个阶段:
graph TD
A[预测阶段] -->|先验估计| B[更新阶段]
B -->|后验估计| A
本系统采用10维状态向量:
状态方程:
观测方程:
// 状态初始化
this.state = new Array(10).fill(0);
this.state[3] = 1; // 四元数w分量初始化
// 状态转移矩阵(当前简化为单位矩阵)
getStateTransitionMatrix(dt) {
const F = Array.from({ length: 10 }, () => new Array(10).fill(0));
for (let i = 0; i < 10; i++) F[i][i] = 1;
return F;
}
对应代码实现:
this.state = this.multiplyMatrices(F, this.state.map(val => [val])).map(row => row[0]);
对应代码实现:
const FP = this.multiplyMatrices(F, this.covariance);
const FPF_T = this.multiplyMatrices(FP, this.transposeMatrix(F));
this.covariance = this.addMatrices(FPF_T, this.processNoise);
对应代码实现:
getProcessNoiseMatrix(dt) {
const q = 0.01 * dt;
return Array.from({ length: 10 }, (_, i) =>
new Array(10).fill(0).map((_, j) => (i === j ? q : 0)));
}
对应代码实现:
const H = this.observationMatrix;
const HP = this.multiplyMatrices(H, this.covariance);
const HPH_T = this.multiplyMatrices(HP, this.transposeMatrix(H));
const S = this.addMatrices(HPH_T, this.observationNoise);
const K = this.multiplyMatrices(
this.multiplyMatrices(this.covariance, this.transposeMatrix(H)),
this.invertMatrix(S)
);
对应代码实现:
const innovation = measurement.map((val, i) => val - this.state[i]);
const K_innovation = this.multiplyMatrices(K, innovation.map(val => [val]));
this.state = this.state.map((val, i) => val + K_innovation[i][0]);
对应代码实现:
const KH = this.multiplyMatrices(K, H);
const I_KH = this.covariance.map((row, i) =>
row.map((val, j) => i === j ? 1 - KH[i][j] : -KH[i][j]));
this.covariance = this.multiplyMatrices(I_KH, this.covariance);
采用一阶龙格-库塔法进行四元数更新:
其中:
对应代码实现:
integrateQuaternion(q, omega, dt) {
const wx = omega[0] * dt / 2;
const wy = omega[1] * dt / 2;
const wz = omega[2] * dt / 2;
return [
q[0] + wx*q[3] + wy*q[2] - wz*q[1], // q_w
q[1] - wx*q[2] + wy*q[3] + wz*q[0], // q_x
q[2] + wx*q[1] - wy*q[0] + wz*q[3], // q_y
q[3] - wx*q[0] - wy*q[1] - wz*q[2] // q_z
];
}
位置和速度更新采用经典运动学方程:
对应代码实现:
const newVelocity = prevState.velocity.map((v, i) =>
v + prevState.acceleration[i] * dt);
const newPosition = prevState.position.map((p, i) =>
p + prevState.velocity[i] * dt + 0.5 * prevState.acceleration[i] * dt * dt);
卡尔曼滤波算法在传感器数据融合中表现出 卓越的噪声抑制能力 和 稳定性提升,具体体现在以下方面:
指标 | IMU原始数据 | KF滤波后数据 | 优化效果 |
---|---|---|---|
方差降低率 | - | - | X: 97.2%, Y:86.0%, Z:99.1% |
标准差范围 | 2.27~3.17 | 0.25~0.85 | 最大降低 96%(Z轴) |
极值范围 | ±13.4 m/s² | ±2.77 m/s² | 异常波动减少 79% |
- 图表特征:滤波后加速度曲线显著平滑,原始数据的剧烈震荡被有效抑制(如Z轴极端值从-12.5→-0.57)。
- 物理意义:提升位置/速度估计精度,降低运动轨迹漂移。
指标 | IMU原始数据 | KF滤波后数据 | 优化效果 |
---|---|---|---|
方差降低率 | - | - | X:92.8%, Y:94.9%, Z:95.9% |
标准差范围 | 5.73~6.19 | 0.23~0.45 | 最大降低 96%(Z轴) |
极值范围 | ±10.0 m/s² | ±0.81 m/s² | 动态响应更稳定 |
- 噪声抑制能力
加速度/角速度方差降低率均 >85%,Z轴优化最显著(99%)。
标准差缩小至原始值的 1/10~1/4,证明过程噪声(Q)与观测噪声(R)参数配置合理。 - 动态响应平衡
时间序列图显示滤波后数据仍能跟踪真实运动趋势(如X加速度在16:32:35的突变被保留)。
未出现明显滞后,表明状态转移矩阵(F)能有效描述系统动力学。 - 鲁棒性表现
在多轴(X/Y/Z)数据中均表现一致,验证了算法对复杂运动的适应性。
极值抑制效果显著(如Z加速度极值范围从-12.5~7.9→-0.57~0.81),避免异常值干扰。
该卡尔曼滤波器在 噪声抑制 方面取得了优异效果,为AR导航提供了高精度的传感器数据基础。下一步可针对具体应用场景(如快速旋转、线性加速)进行细粒度调参,并集成环境感知数据(视觉SLAM)以实现多模态融合。