vendredi 20 février 2015

Difficultés avec MAVLnk et Arduino

J'ai de nouveau essayé d'intégrer le décodage des trames mavlink sur un arduino.

Malheureusement, cela bloque toujours.
Il suffit que je fasse un Serial.read() pour que cela bloque lorsque j'envoie des messages mavlink vers l'arduino. J'ai essayé de limiter la fréquence d'envoi, de changer le baudrate, d'utiliser la librairie Fastserial, d'envoyer les messages depuis python, plutôt que depuis un autre arduino avec une liaison radio, mais rien n'y fait.

Le problème semble donc venir d'arduino qui se bloque, peut-être à cause d'un problème de buffer que je n'arrive pas à m'expliquer.

EDIT : peut-être une piste de (pseudo)solution en augmentant la taille logicielle du buffer dans ~/arduino-1.6.0/hardware/arduino/avr/cores/arduino/HardwareSerial.h

J'ai passé beaucoup de temps sur ce problème, en trouvant des traces sur internet d'autres ayant eu le problème mais sans que la solution n'apparaisse, ni même que le problème soit clairement identifié, ce qui est rageant.

J'ai donc décidé de contourner le problème, et de ne pas utiliser l'envoi des messages mavlink vers l'arduino, et de garder les trames NMEA, même si cela forme un tout un peu incohérent.

Afin de profiter des nombreux outils développés autour de Mavlink en attendant de trouver une vraie solution,  je fais donc faire en sorte d'avoir un programme python relais, qui recevra les messages mavlink venant de l'arduino au sol et de l'arduino embarqué, puis les transmettra vers une station de contrôle en UDP.
Ce programme recevra les commandes mavlink, et les convertira en trames NMEA.

Un peu compliqué mais mes tests montrent que ça devrait marcher.

Les messages que je souhaite utiliser sont :

HEARTBEAT comme bit de vie
ATTITUDE pour les donnée d'attitude issues du filtre embarqué
HIGHRES_IMU pour les données brutes dans les phases de calibration
MANUAL_CONTROL pour transmettre les ordres du joystick
ACTUATOR_CONTROL_TARGET (message standard ajouté récemment) pour les feedback actionneurs (vitesse et position moteur, position barre)
SET_ACTUATOR_CONTROL_TARGET (message standard ajouté récemment)
SCALED_PRESSURE pour la pression

Il me reste à choisir les messages pour :
-azimuth, elevation, ou position x,y,z
-vitesse du kite

Peut-être :
LOCAL_POSITION_NED
ou
VISUAL_POSITION_ESTIMATE et VISION_SPEED_ESTIMATE

Ainsi qu'à créer les messages pour la tension dans les lignes.

Aucun commentaire:

Enregistrer un commentaire