AHRS

void AHRSupdate(float gx, float gy, float gz, float ax, float ay, float az, float mx, float my, float mz) {

float norm;

float hx, hy, hz, bx, bz;

float vx, vy, vz, wx, wy, wz; //v*当前姿态计算得来的重力在三轴上的分量

float ex, ey, ez;

// auxiliary variables to reduce number of repeated operations

float q0q0 = q0*q0;

float q0q1 = q0*q1;

float q0q2 = q0*q2;

float q0q3 = q0*q3;

float q1q1 = q1*q1;

float q1q2 = q1*q2;

float q1q3 = q1*q3;

float q2q2 = q2*q2;

float q2q3 = q2*q3;

float q3q3 = q3*q3;

// normalise the measurements

norm = sqrt(ax*ax + ay*ay + az*az);

ax = ax / norm;

ay = ay / norm;

az = az / norm;

norm = sqrt(mx*mx + my*my + mz*mz);

mx = mx / norm;

my = my / norm;

mz = mz / norm;

// compute reference direction of magnetic field

hx = 2*mx*(0.5 - q2q2 - q3q3) + 2*my*(q1q2 - q0q3) + 2*mz*(q1q3 + q0q2);

hy = 2*mx*(q1q2 + q0q3) + 2*my*(0.5 - q1q1 - q3q3) + 2*mz*(q2q3 - q0q1);

hz = 2*mx*(q1q3 - q0q2) + 2*my*(q2q3 + q0q1) + 2*mz*(0.5 - q1q1 - q2q2);

bx = sqrt((hx*hx) + (hy*hy));

bz = hz;

// estimated direction of gravity and magnetic field (v and w)

//参考坐标n系转化到载体坐标b系的用四元数表示的方向余弦矩阵第三列即是。

//处理后的重力分量

vx = 2*(q1q3 - q0q2);

vy = 2*(q0q1 + q2q3);

vz = q0q0 - q1q1 - q2q2 + q3q3;

//处理后的mag,反向使用DCM得到

wx = 2*bx*(0.5 - q2q2 - q3q3) + 2*bz*(q1q3 - q0q2);

wy = 2*bx*(q1q2 - q0q3) + 2*bz*(q0q1 + q2q3);

wz = 2*bx*(q0q2 + q1q3) + 2*bz*(0.5 - q1q1 - q2q2);

// error is sum of cross product between reference direction of fields and direction measured by sensors 体现在加速计补偿和磁力计补偿,因为仅仅依靠加速计补偿没法修正Z轴的变差,所以还需要通过磁力计来修正Z轴。(公式28)。《四元数解算姿态完全解析及资料汇总》的作者把这部分理解错了,不是什么叉积的差,而叉积的计算就是这样的。计算方法是公式10。

ex = (ay*vz - az*vy) + (my*wz - mz*wy);

ey = (az*vx - ax*vz) + (mz*wx - mx*wz);

ez = (ax*vy - ay*vx) + (mx*wy - my*wx);

// integral error scaled integral gain

exInt = exInt + ex*Ki* (1.0f / sampleFreq);

eyInt = eyInt + ey*Ki* (1.0f / sampleFreq);

ezInt = ezInt + ez*Ki* (1.0f / sampleFreq);

// adjusted gyroscope measurements

//将误差PI后补偿到陀螺仪,即补偿零点漂移。通过调节Kp、Ki两个参数,可以控制加速度计修正陀螺仪积分姿态的速度。(公式16和公式29)

gx = gx + Kp*ex + exInt;

gy = gy + Kp*ey + eyInt;

gz = gz + Kp*ez + ezInt;

/

你可能感兴趣的:(AHRS)