我在这个特定问题上浪费了 2 天(和晚上),并且在倾斜补偿我的磁力计输出方面完全失败。
我尝试了我在谷歌和开源示例中可以阅读的所有内容,没有任何东西可以指导我对两者(滚动和俯仰)进行适当的倾斜补偿。.
设置:我使用校准值而不是统一值。
我有一个融合的重力矢量,它工作正常且准确。
传感器是 9dof BMX055 ( http://www.mouser.com/ds/2/621/BST-BMX055-DS000-01-274824.pdf ) 每个轴上的磁力计最小值/最大值为 +- 512 (小差异,但所有轴都归零)。硬件是 Sam3X8e (Cortex M3),全部用 C 语言编写。
浮点和三角函数可以很快完成,所以没问题。BMX055 芯片对齐,使引脚 20、19、18 指向前面。
数据表第 159-161 页显示了方向。当我上升前,音高上升。
当我抬起左侧时,滚动上升。
示例值:
指向我的算法在水平调平时调用 305 度的方向
Pitch: 0 , Roll 0 : MAG cal: x 132 y 93 z -364
Pitch: +24, Roll 0 : MAG cal: x -109 y 93 z -397
Pitch: +46, Roll 0 : MAG cal: x -303 y 89 z -351
Pitch: 0 , Roll -44 : MAG cal: x 151 y 352 z -235
Pitch: 0 , Roll +36 : MAG cal: x 130 y -140 z -328
Pitch: 78 , Roll -2 : MAG cal: x -503 y 93 z -199
Pitch: 7 , Roll -53 : MAG cal: x 135 y 424 z -180
对齐应该始终在 305 度左右(尽我所能),也许 +- 5 度。
公式:(到处都用同一个)
uint16_t compass_tilt_compensation(float roll_radians, float pitch_radians,float mag_y, float mag_x, float mag_z)
{
float tilt_compensated_heading;
float MAG_X;
float MAG_Y;
float cos_roll;
float sin_roll;
float cos_pitch;
float sin_pitch;
int16_t heading;
//pitch_radians =roll_radians;
//roll_radians *= -1;
//mag_x *= -1;
//roll_radians=0.0f;
//pitch_radians=0;v
//pitch_radians *=-1;
cos_roll = cos(roll_radians);
sin_roll = sin(roll_radians);
cos_pitch = cos(pitch_radians);
sin_pitch = sin(pitch_radians);
#if 0
MAG_X = mag_x*cos_pitch+mag_y*sin_roll*sin_pitch+mag_z*cos_roll*sin_pitch;
MAG_Y = mag_y*cos_roll-mag_z*sin_roll;
tilt_compensated_heading = atan2f(-MAG_Y,MAG_X);
#else
MAG_X = mag_x * cos_pitch + mag_z * sin_pitch;
MAG_Y = mag_x * sin_roll * sin_pitch + mag_y * cos_roll - mag_z * sin_roll * cos_pitch;
tilt_compensated_heading = atan2f(-MAG_Y,MAG_X);
//tilt_compensated_heading = atan2f(-mag_y,mag_x); // works fine when leveled
#endif
//convert to degree from 0-3599
heading = tilt_compensated_heading * RAD_TO_DEG * 10;
if ( heading < 0 )
{
heading += 3600;
}
return heading;
}
我尝试了各种组合,我尝试只修复一个轴并将一个轴始终保持为 0,在任何输入上交换 X/Y 俯仰/滚动,*-1。
结果总是完全错误的。有时(取决于我尝试通过试验/错误来反转或不反转值的位置)这些值似乎几乎是线性的。有时一个轴在正区域得到补偿。
然而,滚动和俯仰总是会导致“随机”跳跃和航向变化。
数学从来不是我最喜欢的,现在我后悔了。
我个人的猜测是这个公式在principe是正确的,mag在principe中工作(毕竟我在练级时获得了适当的学位)但我不知何故喂了一些错误的东西。(如Y和X需要互换,z*-1,pitch需要*-1)
在这个主题上擅长的人可以看看并指导我如何获得正确的标题吗?
今晚能睡几个小时而不必再梦见一个功能失调的算法会很棒:)
更新:此处的倾斜补偿适用于指向 305 度航向时的负滚动。这里也用到了:http ://www.emcu.it/MEMS/Compass/MEMS_Compass_A_RTM1v3.pdf