samedi 7 février 2015

Perfectionnisme, KIS et RTFM

Hier, je parlais de la calibration du magnétomètre. Malheureusement à cause d'un problème de sauvegarde (que j'ai du mal à m'expliquer, peut-être dû à l'IDE arduino que je continue à utiliser...), j'ai perdu cette calibration qui avait été bien compliquée.
En réessayant de la faire, toujours quelque chose de bizarre au niveau du magnétomètre. J'ai finalement trouvé le problème... Le magnétomètre n'utilise pas les mêmes conventions pour les axes que l'accéléromètre et le gyroscope.
Les corrections que j'appliquais sur x, se retrouvaient sur y.
De plus, la calibration utilisant un modèle d’ellipsoïde demande énormément de points et donne souvent un résultat très décevant.

J'ai donc petit à petit trouvé une méthode de calibration beaucoup plus simple : j'observe les courbes des signaux (mx, my, mz) un par un (grâce aux courbes en temps réel dans QgroundControl ou grâce à Arduscillo). Je bouge le capteur de manière à maximiser la mesure sur l'axe, puis à la minimiser. Pour cela il faut orienter l'axe du capteur vers le nord ou vers le sud, mais presque à la verticale (le champ magnétique fait un angle de 70° avec l'horizontale). Je fais ensuite de petits mouvements pour essayer de trouver l'optimum.
Je calcule ensuite la différence entre le min et le max, et je divise par deux pour trouver le biais. Keep It Simple (KIS)!

J'étais très content de cette nouvelle méthode qui m'a permis d'avoir de très bons résultats (ainsi que d'autres modification pour recevoir les mesures du magnétomètre à un rythme plus élevé, et pour sélectionner automatiquement la bonne plage de mesure pour le capteur). Et puis en relisant les commentaires dans le fichier duquel j'étais parti, j'ai vu que cette méthode était celle conseillée... RTFM (Read The F****** Manual).

"        //  The gyros and accelerometers can in principle be calibrated in addition to any factory calibration but they are generally
        //  pretty accurate. You can check the accelerometer by making sure the reading is +1 g in the positive direction for each axis.
        //  The gyro should read zero for each axis when the sensor is at rest. Small or zero adjustment should be needed for these sensors.
        //  The magnetometer is a different thing. Most magnetometers will be sensitive to circuit currents, computers, and
        //  other both man-made and natural sources of magnetic field. The rough way to calibrate the magnetometer is to record
        //  the maximum and minimum readings (generally achieved at the North magnetic direction). The average of the sum divided by two
        //  should provide a pretty good calibration offset. Don't forget that for the MPU9150, the magnetometer x- and y-axes are switched
        //  compared to the gyro and accelerometer!
"

J'ai toujours des problèmes de robustesse, la carte arduino se bloquant après quelques minutes. Cela pourrait venir de la bibliothèque wire qui est utilisée pour la communication I2C et qui n'a pas de protection en cas de blocage (à voir avec le "repeated start", ça me dit quelque chose, mais impossible de retrouver).
Apparemment, nous sommes nombreux à avoir ces problèmes, openROV par exemple https://github.com/OpenROV/openrov-software-arduino/issues/16 

J'hésite à installer une autre bibliothèque I2C ou à modifier I2Cdevlib comme proposé ici http://www.i2cdevlib.com/forums/topic/218-arduino-wire-endtransmission-readbytes-not-working/ 

Edit : le problème semblait en fait venir de la liaison série entre l'arduino et le PC. En changeant de port USB sur le PC et en réduisant la fréquence d'envoi des trames à 10Hz, plus de problème. Mais j'ai aussi modifié i2cdev.cpp...

Aucun commentaire:

Enregistrer un commentaire