IMU预积分-旋转残差求雅可比

目录

[1. 残差定义](#1. 残差定义)

[2. 雅可比推导](#2. 雅可比推导)

[3. 右乘BCH近似雅可比的逆的实现](#3. 右乘BCH近似雅可比的逆的实现)


1. 残差定义

根据IMU预积分(VINS)中的推导,帧间imu积分项的残差定义如下:

其中,旋转残差项的形式来源为:

中的q代表四元数。假设为旋转误差对应的旋转向量,则:

等于虚部的2倍:

IMU预积分(VINS)中以四元数 的形式对残差的雅可比进行了推导,本篇笔记该用以旋转矩阵R李群)的形式推导该残差对下述扰动量的雅可比:

推导过程会用到李群的BCH公式与伴随性质:

(1)BCH公式

其中,分别代表两个旋转向量(李代数),代表对李代数进行指数映射得到李群(旋转矩阵),分别代表左乘BCH近似雅可比的逆和右乘BCH近似雅可比的逆。

(2)伴随

其中,代表旋转矩阵。

2. 雅可比推导

**求导过程采用右乘扰动模型,因为误差(扰动)定义在载体b系。**雅可比的推导过程如下:

1. 对 i 时刻无关量求导

2. 对 i 时刻旋转误差向量求导

3. 对 i 时刻陀螺仪bias误差求导

4. 对 j 时刻无关量求导

5. 对 j 时刻旋转误差向量求导

3. 右乘BCH近似雅可比的逆的实现

右雅可比

其中,代表一个旋转向量,代表将旋转向量转为反对称矩阵,代表旋转角的大小(旋转向量的模长)。

右雅可比的逆

代码实现:

cpp 复制代码
#include <Eigen/Core>
#include <Eigen/Geometry>

/**
 * @brief 计算 SO(3) 右雅可比的逆 J_r^{-1}(phi)
 * @param phi 旋转向量 (李代数 so3)
 * @return 3x3 的右雅可比逆矩阵
 */
Eigen::Matrix3d RightJacobianInv(const Eigen::Vector3d& phi) {
    const double theta = phi.norm();
    Eigen::Matrix3d I = Eigen::Matrix3d::Identity();
    
    // 1. 计算反对称矩阵 phi^
    Eigen::Matrix3d phi_hat;
    phi_hat << 0, -phi(2), phi(1),
               phi(2), 0, -phi(0),
               -phi(1), phi(0), 0;

    // 2. 根据角度大小选择计算方式
    if (theta < 1e-6) {
        // 小角度近似:J_r^{-1} ≈ I + 0.5 * phi^
        return I + 0.5 * phi_hat;
    } else {
        // 正常角度:使用闭式公式
        double theta2 = theta * theta;
        double sin_theta = sin(theta);
        double cos_theta = cos(theta);

        // 计算系数: [1/theta^2 - (1+cos(theta))/(2*theta*sin(theta))]
        double coeff = (1.0 / theta2) - (1.0 + cos_theta) / (2.0 * theta * sin_theta);

        // 组合公式: I + 0.5*phi^ + coeff * (phi^)^2
        return I + 0.5 * phi_hat + coeff * phi_hat * phi_hat;
    }
}

代码中对数值稳定性进行了处理。当旋转角很小,趋近于0时,直接使用上面的闭式公式会导致分母为 0 或数值不稳定。此时需要使用泰勒展开近似

相关推荐
全息数据18 小时前
里程计运动模型及标定【激光slam(一)】
slam·激光slam·定位与建图
zh路西法21 小时前
【3D SLAM源码解读系列】(四) GTSAM与iSAM2——从回环约束到位姿图优化
c++·slam·gtsam·pgo·isam2
乱七八糟的屋子10 天前
TooN 超详细入门实战教程|C++轻量极致精简矩阵库(机器人/SLAM专用)
矩阵·机器人·数值计算·slam·c++矩阵库·轻量线性代数·机器人数学
kobesdu18 天前
激光雷达运动畸变是怎么来的,FAST-LIO又如何用IMU反向传播消除它?
ros·slam·fastlio
记帖19 天前
STM32C5开发LSM6DSOW(1)----轮询获取陀螺仪数据
imu·stm32cubeide·mems·stm32c5·stm32cubemx2·stm32c542cct6·lsm6dsow
记帖20 天前
STM32C5开发LSM6DSR(1)----轮询获取陀螺仪数据
imu·stm32cubeide·mems·stm32c5·stm32cubemx2·stm32c542cct6·lsm6dsr
酸梅果茶1 个月前
【7】lightning_lm项目-LIO 前端 -IVox 局部地图
前端·slam
a1117761 个月前
机器人导航入门指南(从 0 到 1)
笔记·学习·slam
酸梅果茶1 个月前
【6】lightning_lm项目-LIO 前端 -点云预处理模块
前端·slam
酸梅果茶1 个月前
【2】lightning_lm项目-阶段1-基础理解
slam