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 或数值不稳定。此时需要使用泰勒展开近似:

相关推荐
音视频牛哥8 天前
从 LLM、VLA、LLA、SLIM 到实时音视频感知底座:具身智能真正需要的不只是大模型
人工智能·llm·机器人视觉·slam·vla·多模态感知·机器人音视频
2601_9622935316 天前
第3.7章 机器人第三方库实战总结(七):OpenCV视觉SLAM核心库详解:API速查+源码实例+避坑指南
图像处理·opencv·计算机视觉·slam·第三方库
事已至此_先吃饭吧19 天前
ORB_SLAM2: Optimizer::PoseOptimization
slam
事已至此_先吃饭吧23 天前
ORB_SLAM2:词袋模型 Bag of Words
slam
熊猫_豆豆1 个月前
家庭扫地机器人路径规划Python版本
机器人·扫地机器人·slam·路径规划
事已至此_先吃饭吧1 个月前
调试 ORB_SLAM2 非ROS版本
slam
全息数据1 个月前
里程计运动模型及标定【激光slam(一)】
slam·激光slam·定位与建图
zh路西法1 个月前
【3D SLAM源码解读系列】(四) GTSAM与iSAM2——从回环约束到位姿图优化
c++·slam·gtsam·pgo·isam2
乱七八糟的屋子2 个月前
TooN 超详细入门实战教程|C++轻量极致精简矩阵库(机器人/SLAM专用)
矩阵·机器人·数值计算·slam·c++矩阵库·轻量线性代数·机器人数学
kobesdu2 个月前
激光雷达运动畸变是怎么来的,FAST-LIO又如何用IMU反向传播消除它?
ros·slam·fastlio