c++对imu的角速度积分得到表示旋转四元数

    xag::Quaterniond Predict(xag::Quaterniond orientation, Eigen::Vector3d gyro, double dt)
    {
        // 获取四元数的四个分量
        double q0_ = orientation.w();
        double q1_ = orientation.x();
        double q2_ = orientation.y();
        double q3_ = orientation.z();

        double gx_unbias = gyro[0];
        double gy_unbias = gyro[1];
        double gz_unbias = gyro[2];
        double q0 = q0_ + 0.5 * dt * (0 * q0_ + gx_unbias * q1_ + gy_unbias * q2_ + gz_unbias * q3_);
        double q1 = q1_ + 0.5 * dt * (-gx_unbias * q0_ + 0 * q1_ + gz_unbias * q2_ - gy_unbias * q3_);
        double q2 = q2_ + 0.5 * dt * (-gy_unbias * q0_ - gz_unbias * q1_ + 0 * q2_ + gx_unbias * q3_);
        double q3 = q3_ + 0.5 * dt * (-gz_unbias * q0_ + gy_unbias * q1_ - gx_unbias * q2_ + 0 * q3_);

        // double gx = gyro[0];
        // double gy = gyro[1];
        // double gz = gyro[2];
        // double q0 = q0_ + 0.5 * dt * (-gx * q1_ - gy * q2_ - gz * q3_);
        // double q1 = q1_ + 0.5 * dt * (gx * q0_ - gy * q3_ + gz * q2_);
        // double q2 = q2_ + 0.5 * dt * (gx * q3_ + gy * q0_ - gz * q1_);
        // double q3 = q3_ + 0.5 * dt * (-gx * q2_ + gy * q1_ + gz * q0_);

        xag::Quaterniond res(q0, q1, q2, q3);
        res.normalize();

        return res;
    }

这段代码的作用是:


✅ 根据角速度(gyroscope)预测姿态变化,用四元数积分方式计算新的姿态。


🧠 简单理解:

  • 给定当前姿态(四元数)和一段时间内的角速度(IMU 数据),

  • 利用角速度对四元数进行积分,

  • 预测出经过时间 dt 后的新姿态。


🔍 函数定义解析:

xag::Quaterniond Predict(xag::Quaterniond orientation, Eigen::Vector3d gyro, double dt)
参数名类型含义
orientation四元数(当前姿态)当前时刻设备的姿态
gyroEigen::Vector3d陀螺仪三轴角速度,单位 rad/s
dtdouble时间间隔(单位:秒)
⏎ 返回值四元数新的姿态(经过角速度积分后)

📌 核心思路:四元数微分

角速度是姿态的导数,四元数微分公式如下:

q˙=12q⊗ω\dot{q} = \frac{1}{2} q \otimes \omega

其中 ω\omega 表示角速度构成的纯虚四元数(0, wx, wy, wz),⊗\otimes 是四元数乘法。

本代码中使用的是**欧拉法(Euler Integration)**对该微分方程进行一次积分近似:

qt+dt≈qt+q˙⋅dtq_{t+dt} \approx q_t + \dot{q} \cdot dt


🔢 代码的数学等价形式:

从当前四元数 q=[q0,q1,q2,q3]q = [q_0, q_1, q_2, q_3],和角速度 ω=[gx,gy,gz]\omega = [gx, gy, gz],预测一个时间段 dtdt 之后的四元数:

qnext=q+12⋅q⊗[0,gx,gy,gz]⋅dtq_{next} = q + \frac{1}{2} \cdot q \otimes [0, gx, gy, gz] \cdot dt

然后再调用 .normalize() 保证结果为单位四元数(姿态四元数必须单位模)。


✅ 代码功能总结:

功能说明
利用角速度 gyro推进四元数(姿态)随时间 dt 的演化
不使用外部传感器(如加速度)单纯基于陀螺仪积分
返回单位四元数表示新时刻设备的旋转状态

⚠️ 注意事项:

  • 此方法是最简单的欧拉积分,数值精度有限,误差会积累

    • 实际系统中可能使用 Runge-Kutta 或四元数乘法矩阵法改进精度。

  • 长时间积分会出现 漂移,需要使用加速度、磁力计或视觉等传感器校正或融合(如使用 EKF 或 Mahony/Madgwick 滤波器)。


✅ 应用场景:

  • 姿态跟踪(Attitude Tracking)

  • IMU-only 导航或初始化阶段预测

  • 视觉惯性融合(VIO)预测过程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值