【发布时间】:2014-06-27 03:32:54
【问题描述】:
我尝试倾斜补偿磁力计 (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 sin/cos 函数现在似乎可以带来更好的结果。 我正在尝试实现建议的矢量算法,到目前为止很挣扎:)
【问题讨论】:
标签: avr magnetometer tilt