我尝试倾斜补偿磁力计(BMX055)读数并尝试了我在网上找到的各种方法,但没有一种方法有效。
我最终尝试了几乎所有在 Google 上找到的结果。
我在 AVR 上运行它,如果能找到在 50 度以下的角度没有复杂函数(三角函数等)的东西,那就太棒了。
我有一个来自 gyro+acc(1g 重力=16k)的融合重力矢量(int16 以浮点数签名)。态度.vect_mag.x/y/z 是一个浮点数,但包含一个 16 位整数,范围从每个轴大约 -250 到 +250。
目前我尝试这段代码:
float rollRadians = attitude.roll * DEG_TO_RAD / 10;
float pitchRadians = attitude.pitch * DEG_TO_RAD / 10;
float cosRoll = cos(rollRadians);
float sinRoll = sin(rollRadians);
float cosPitch = cos(pitchRadians);
float sinPitch = sin(pitchRadians);
float Xh = attitude.vect_mag.x * cosPitch + attitude.vect_mag.z * sinPitch;
float Yh = attitude.vect_mag.x * sinRoll * sinPitch + attitude.vect_mag.y * cosRoll - attitude.vect_mag.z *sinRoll * cosPitch;
float heading = atan2(Yh, Xh);
attitude.yaw = heading*RAD_TO_DEG;
结果没有意义,但没有倾斜补偿的值是正确的。
未补偿的公式:
atan2(attitude.vect_mag.y,attitude.vect_mag.x);
工作正常(不倾斜时)
我有点不知道出了什么问题,正常的 atan2 返回一个很好的结果(平衡时),但是使用广泛的公式进行倾斜补偿完全失败。
我是否必须将 mag 向量值保持在特定范围内才能使三角函数起作用?有什么方法可以在没有触发功能的情况下进行补偿?
我很高兴能得到一些帮助。
更新:我发现 BMX055 磁力计的 X 和 Y 倒置,并且 Y 轴是 *-1 正弦/余弦函数现在似乎可以产生更好的结果。我正在尝试实现建议的矢量算法,到目前为止一直在努力:)