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 | 四元数(当前姿态) | 当前时刻设备的姿态 |
gyro | Eigen::Vector3d | 陀螺仪三轴角速度,单位 rad/s |
dt | double | 时间间隔(单位:秒) |
⏎ 返回值 | 四元数 | 新的姿态(经过角速度积分后) |
📌 核心思路:四元数微分
角速度是姿态的导数,四元数微分公式如下:
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)预测过程