IMU 的加速度计和陀螺仪的姿态估计?

Attitude estimation from accelerometer and gyroscope of an IMU?

我很难理解下面包含的方程式的数学推导。这段代码是 SparkFun IMU 库示例的一部分,可以在 here 中找到。 有人可以帮我理解使用反正切函数来估计横滚、俯仰和偏航背后的理论吗?磁力计数据如何用于获得正确的偏航估计?我能在网上找到的所有资源都没有以我能理解的方式回答这些问题。

 float roll = atan2(ay, az);
 float pitch = atan2(-ax, sqrt(ay * ay + az * az));

 float heading;
 if (my == 0)
   heading = (mx < 0) ? PI : 0;
 else
 heading = atan2(mx, my);

 heading -= EARTH_DECLINATION * PI / 180;

 if (heading > PI) heading -= (2 * PI);
 else if (heading < -PI) heading += (2 * PI);

 // Convert everything from radians to degrees:
 heading *= 180.0 / PI;
 pitch *= 180.0 / PI;
 roll  *= 180.0 / PI;

假设 ay 和 az 是磁力计给出的距原点的偏移量,则 atan(ay, az) 将为您提供产生该偏移量的角度。

sqrt(ay * ay + az * az) 遵循毕达哥拉斯定理,为您提供 "offset triangle" 第三边的长度,以便能够计算音高。 -ax 来自音调的定义方式。

atan2(y,x) 是角度 theta,如下图所示:

在三个维度中,您有三个平面,并且 atan2() 应用于 x、y 和 z 中的一对,具体取决于您正在为哪个平面计算 theta(滚动、俯仰、偏航)。

当处于稳定速度(即不改变速度或方向)时,值 ax、ay、az 每个仅测量加速度的重力分量。加速度下数值会不准确。在这一点上,你必须更聪明一点,结合来自其他传感器(如陀螺仪或磁力计)和其他加速器的信息——也就是说,当静止的 ax、ay、az 总和为 1G——任何其他东西时,都会产生额外的加速度.加速器测量加速度,但其中包括重力加速度。也就是说,当处于稳定速度时,加速器是相对于重力的倾斜传感器。

磁力计计算根据其 x 和 y 分量确定相对于北方的角度,并补偿真北和磁北之间的差异 (the magnetic declination)。磁力计的 x 和 y 分量在与磁场对齐时最大,因为它们是正交安装的,它们的相对值使用 atan2(mx,my) 解析为单个方向。 x 和 y 从常规顺序交换,因为罗盘方向顺时针增加,而数学角度逆时针增加。

在实践中,您需要使用传感器功能来组合来自陀螺仪(angular 速度)、加速器和磁力计的信息,并且可能还应用一些启发式方法来准确跟踪运动。这些传感器中的每一个都有不同的混杂因素和一些测量元素重叠,因为单个外力可以对多个传感器产生影响。这可以用来区分不同种类的运动和姿态。它很复杂,这可能就是为什么本文不尝试处理它的原因。