Я делаю компас с компенсацией наклона, используя MMC5983 и LIS2HH12. У меня есть расчеты курса и наклона, и оба устройства были откалиброваны.
При наклоне компаса на -5 градусов направление движения компаса c будет «колебаться» на 23 градуса, но если его наклонить до -15 градусов, колебание уменьшится до 6,1 градуса. Я изобразил колебание против угла наклона ниже. Я не уверен, почему это иногда калибруется, а не другие (см. Второй график). Три разных заголовка на втором графике указывают мне, что некоторые точки калибруются, а другие нет.
Код: {
void calc_tilt () {
float pitch = asinf(-accel.x);
float roll = asinf((accel.y)/ (cosf(pitch)));
accel.pitch = pitch;//rotation arond y-axis
accel.roll = roll;//rotation around x-axis
if ((pitch == 90) || (pitch ==-90)){
roll = 0;
}
}
void calc_comp_field () {
mag.x_comp = mag.x*cosf(accel.pitch) + mag.z*sinf(accel.pitch);
mag.y_comp = mag.x*sinf(accel.roll)*sinf(accel.pitch) + mag.y*cosf(accel.roll) - mag.z*sinf(accel.roll)*cosf(accel.pitch);
mag.z_comp = -mag.x*cosf(accel.roll)*sinf(accel.pitch) + mag.y*sinf(accel.roll) + mag.z*cosf(accel.roll)*cosf(accel.pitch);
}
void getHead () {
float heading = 0;
if((mag.x_comp ==0)&&(mag.y_comp<0)){
heading = 90;
} else if ((mag.x_comp==0)&&(mag.y_comp>0)){
heading = 0;
}
heading = (atan2f(-mag.y_comp,mag.x_comp))*(180/M_PI);
if(heading < 0){
heading = heading + 360;
} else if (heading >360){
heading = heading - 360;
}
mag.heading = heading;
}
колебание компаса против угла наклона
Stati c Данные курса по компасу при 10 градусах крена