最近在用MPU6050的DMP輸出姿態,基本上就是照搬網上的代碼,然後略微修改。不過有兩個地方可能需要特別注意一下:
1.自檢。
run_self_test();
查看函數定義如下:void run_self_test(void)
{
int result;
// char test_packet[4] = {0};
long gyro[3], accel[3];
result = mpu_run_self_test(gyro, accel);
if (result == 0x07) {
//if(1) {
/* Test passed. We can trust the gyro data here, so let's push it down
* to the DMP.
*/
float sens;
unsigned short accel_sens;
mpu_get_gyro_sens(&sens);
gyro[0] = (long)(gyro[0] * sens);
gyro[1] = (long)(gyro[1] * sens);
gyro[2] = (long)(gyro[2] * sens);
dmp_set_gyro_bias(gyro);
mpu_get_accel_sens(&accel_sens);
accel[0] *= accel_sens;
accel[1] *= accel_sens;
accel[2] *= accel_sens;
dmp_set_accel_bias(accel);
PrintChar("setting bias succesfully ......\n");
}
else
{
PrintChar("bias has not been modified ......\n");
}
}
2.姿態換算。
Roll = atan2(2 * q2 * q3 + 2 * q0 * q1, -2 * q1 * q1 - 2 * q2* q2 + 1)* 57.3; // roll Pitch = asin(-2 * q1 * q3 + 2 * q0* q2)* 57.3; // pitch Yaw = atan2(2*(q1*q2 + q0*q3),q0*q0+q1*q1-q2*q2-q3*q3) * 57.3; //yaw
Pitch範圍擴展爲-180~180,四元素換算代碼如下:
Roll = atan2(2 * q2 * q3 + 2 * q0 * q1, -2 * q1 * q1 - 2 * q2* q2 + 1)* 57.3; // roll
if(fabs(Roll) < 90.0) Pitch = asin(-2 * q1 * q3 + 2 * q0* q2)* 57.3;
else Pitch = (fabs(q0* q2 - q1 * q3)/(q0* q2 - q1 * q3)) *(180.0 - fabs(asin(-2 * q1 * q3 + 2 * q0* q2)* 57.3));
Yaw = atan2(2*(q1*q2 + q0*q3),q0*q0+q1*q1-q2*q2-q3*q3) * 57.3; //yaw
好處是強迫症看起來比較爽,壞處是在-90和90度時,Pitch會突變(其實Roll的變化也很劇烈了)