correggere magnetometro

Ciao a tutti ragazzi, mi trovo davanti a un "problema" prettamente matematico immagino..e sono un pò (abbastanza) arrugginito :stuck_out_tongue:

vi spiego, leggo dei dati da un magnetometro (HMC5803L) e mi calcolo l'angolo in relazione al nord:

double angle = atan2((double)HMC5803L_Read(Y),(double)HMC5803L_Read(X)) * (180 / PI) + 180;

ho anche un accellerometro+gyroscopio (MPU6050, è in arrivo una IMU gy-85 per comodità) e con questo mi ricavo gli angoli di rotazione:

            mpu.dmpGetQuaternion(&q, fifoBuffer);
            mpu.dmpGetGravity(&gravity, &q);
            mpu.dmpGetYawPitchRoll(ypr, &q, &gravity);
            gyroacc_x = ypr[0] * 180/M_PI;
            gyroacc_y = ypr[1] * 180/M_PI;
            gyroacc_z = ypr[2] * 180/M_PI;

ora il problema nasce dal fatto che il mio dispositivo non sarà sempre perfettamente in bolla su un piano e quindi quando ruota sugli assi X e Y, va a sballarmi completamente i valori dell'angolo a parità di rotazione sull'asse Z. Teniamo anche presente che le rotazioni sugli assi X e Y non supereranno MAI i 90° (sia in positivo che in negativo)

A questo punto devo riuscire a far capire al sensore che deve darmi sempre un valore più o meno corretto anche in caso di rotazione su un asse che non è Z

ho provato a fare un pò di calcoli per cercare di correggere col gyro+acc, e qui probabilmente ho fatto una cazzata gigante ma ve la propongo lo stesso :slight_smile:

    angle -= gyro_z;
    angle -= (gyro_y / 3.2); //3.2 è il fattore di divisione per far equivalere 90° a 28°

all'angolo sottraggo prima il valore che rilevo dal gyro in relazione all'asse Z(ho gli assi dei due sensori impostati diversamente per problemi di posizionamento su basetta..anche per questo aspetto la IMU :stuck_out_tongue: ). Successivamente sottraggo anche il valore gyro_y diviso per 3.2 che ho ricavato tramite equazione di scarto...cioè ogni circa 90° di spostamento rilevato dal gyro sull'asse Y, il magnetometro mi varia di 28°

le rlevazioni che ho fatto con queste sottrazioni diciamo che sono più precise che senza...però ha comunque molti errori, anche vero che sto usando un delay a 500ms e non ho provato a diminuirlo ancora...però cosa sapete dirmi?la direzione è giusta (non del magnetometro :smiley: :smiley: :smiley: ) o devo fare tutt'altro?

la Libreria che uso per la MPU6050 è MPU6050_6Axis_MotionApps20.h

Grazie mille a tutti :slight_smile:

Nessuno nessuno?