参考材料:
A Complementary Filter for Attitude Estimation of a Fixed-Wing UAV
mahony 互补滤波器
px4源码v1.7.3
四元数姿态解算
一边看程序一边讲原理:
AttitudeEstimatorQ::init()
得到初始四元数的过程:
1、首先建立在NED系下的旋转矩阵
k⃗ k → 为z轴,方向为D向,竖直向下
// Rotation matrix can be easily constructed from acceleration and mag field vectors
// 'k' is Earth Z axis (Down) unit vector in body frame
Vector<3> k = -_accel;
k.normalize();
i⃗ i → 是NED坐标系下的x轴,由施密特正交化得出:
//'i' is Earth X axis (North) unit vector in body frame, orthogonal with 'k'
Vector<3> i = (_mag - k * (_mag * k));
i.normalize();
施密特正交化:
β2=α2−(α2,β1)(β1,β1)⋅β1 β 2 = α 2 − ( α 2 , β 1 ) ( β 1 , β 1 ) ⋅ β 1
k⃗ k → 已经归一化所以分母为1
j⃗ j → 是NED坐标系下的y轴,由 i⃗ i → , k⃗ k → 叉乘得到垂直向量
// 'j' is Earth Y axis (East) unit vector in body frame, orthogonal with 'k' and 'i'
Vector<3> j = k % i;
2、填充旋转矩阵,并且转换为四元数:
// Fill rotation matrix
Matrix<3, 3> R;
R.set_row(0, i);
R.set_row(1, j);
R.set_row(2, k);
// Convert to quaternion
_q.from_dcm(R)
四元数 Q Q 与旋转矩阵 的转换关系
⎧⎩⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪q0=12(1+r11+r22+r33)−−−−−−−−−−−−−−−−√