mardi 25 novembre 2014

Python et mavlink

J'ai pour l'instant fait quelques tests d'émission de message d'attitude avec Mavlink à partir d'un arduino connecté à une petite IMU.

Ces données sont envoyées par le port série, via un kit radio, puis récupérées sur un pc (mon pc en phase de développement,  puis un raspberry ensuite).

J'ai pour l'instant pu vérifier la bonne réception des trames avec QGroundControl.

Je souhaite maintenant recevoir les messages avec un programme python qui contiendra l'algorithme de pilotage et renverra des ordres en vitesse de moteur ou en position de barre.

Je me suis d'abord basé sur la documentation officiel

  git clone git://github.com/mavlink/mavlink.git
  cd mavlink/pymavlink
  python setup.py install

J'ai ensuite essayé de lancer un exemple (mavtester.py). Je suis malheusement tombé sur une erreur concernant le sous-module mavtest qui n'existait pas.

J'ai donc cherché à recompiler à partir de
  mavgen.py -o mavlinkv10.py mavlink/message_definitions/v1.0/common.xml

Cette fois j'obtiens l'erreur "No module named mavgen_python"

En fait l'erreur ne vient pas vraiment de là, mais de l'utilisation de mavgen.py au lieu de mavgenerate.py

Voici donc les bonnes commandes à exécuter :

  cd mavlink
  sudo python  mavgenerate.py -o mavlinkv10.py message_definitions/v1.0/common.xml

Cela lance une GUI permettant de choisir les messages à générer à partir d'un fichier xml de définition des messages.


A la fin de l'opération, j'ai eu un message me signalant que tout s'était bien passé.
Cependant, dans la console j'avais un message d'erreur, mais qui semble sans importance :

^CException in Tkinter callback
Traceback (most recent call last):
  File "/usr/lib/python2.7/lib-tk/Tkinter.py", line 1489, in __call__
    return self.func(*args)
  File "mavgenerate.py", line 172, in generateHeaders
    tkinter.messagebox.showinfo('Successfully Generated Headers', 'Headers generated successfully.')
  File "/usr/lib/python2.7/lib-tk/tkMessageBox.py", line 83, in showinfo
    return _show(title, message, INFO, OK, **options)
  File "/usr/lib/python2.7/lib-tk/tkMessageBox.py", line 72, in _show
    res = Message(**options).show()
  File "/usr/lib/python2.7/lib-tk/tkCommonDialog.py", line 48, in show
    s = w.tk.call(self.command, *w._options(self.options))
KeyboardInterrupt

Mais cela ne réglait pas plus le problème du manque de mavtest.

J'ai finalement modifié le script mavtester.py pour supprimer la dernière ligne qui était la seule à utiliser le module mavtest.

Le test se lance de la manière suivante
  python mavtester.py --device /dev/ttyUSB0

Mais le programme stoppait sur :

  Waiting for APM heartbeat

Cela ne fonctionnait pas, alors que des bits de vie étaient bien envoyés par l'arduino, ce que j'ai pu vérifier avec QgroundControl.

Etait-ce dû à un problème de version de la librairie (lors de l'installation avec setup.py, la version 0.9 et la version 1.0 sont copiées)?

J'ai cherché dans le code. mavutil.mavlink10() permet de vérifier si la version 1.0 est bien utilisée, et c'était le cas.

J'ai finalement trouvé l'erreur. Je n'avais pas précisé le baudrate dans la commande (il est par défaut à 115200).
Avec la commande suivante, j'arrive bien à revevoir le bit de vie.

  python mavtester.py --device /dev/ttyUSB0 --baudrate 57600

Un petit bit, mais qui fait toujours plaisir.

Le programme de test modifié est ici

Aucun commentaire:

Enregistrer un commentaire