Auteur Sujet: Flight Controller à base de RaspberryPi  (Lu 5005 fois)

Hors ligne drich

  • Pilote de planeur
  • **
  • Messages: 88
  • empereur reptilien
Flight Controller à base de RaspberryPi
« le: 27 décembre, 2015, 16:19:11 16:19 »
Salut, je me suis dit que ça pouvais en intéresser certains de parler de mon petit projet. (attention, pavé)

Je suis donc en train de me faire un contrôleur de vol tournant entièrement sur un Raspberry Pi, caméra y compris.

EDIT : code source ici pour les curieux => https://github.com/dridri/bcflight


Pourquoi ?
En tant que développeur je trouvais ça dommage de monter un drone en utilisant du "tout fait", et mon drone actuel étant mon tout premier je trouvais ça intéressant d'apprendre vraiment comment un multi-copter fonctionne. En plus du fait que cela permet d'avoir une vidéo FPV en HD voire Full HD, ce qui change du 640 lignes actuel.
L'intérêt s'y trouve également dans le fait qu'il est possible d'ajouter absolument tout ce que je veux dans mon drone  *gneu*


Le contrôleur de vol
Tout le projet est entièrement codé en C++, avec variables flottantes (nombres à virgule virtuellement infinis), et modulaire dans le sens où il est très simple d'ajouter un type de frame/driver de capteur/type de moteur/etc..

Dans le cas des capteurs, la norme avec les drones veut qu'ils communiquent via le bus I²C, ce qui permet à mon programme de détecter automatiquement les sensors présents sans avoir à reflasher quoi que ce soit.

Il peut gérer un maximum de 8 moteurs par PWM, avec un update rate jusqu'à 1kHz (looptime à 1000), gère le OneShot et autres bizarreries (par principe, puisque je peux ajouter dans le code de quoi les supporter).
J'ai également l'intention d'intégrer le contrôle des ESCs qui supportent le I²C (tels que les esc Afro) pour voir si il y a un gain quelconque.

La modularité est telle que le contrôleur peut également fonctionner sur autre chose qu'un Raspberry Pi, voire potentiellement un micro-contrôleur tel que ceux qu'on trouve dans les Naze32 et autres CC3D (j’essaierai quand je mettrai la main sur une de ces cartes). Dans ce cas le module vidéo sert seulement à contrôler une (ou plusieurs) caméra externe et le Tx vidéo.

La vidéo est en 720p à 30 fps, d'après ce que j'ai pu lire c'est possible de monter à 720p60 ou 1080p30 en procédant à quelques réglages fins. L'image est compressée à la fois en 6Mbps pour s'enregistrer sur microSD, et à la fois en 1Mbps pour être transmise en FPV.


La ground station
La ground station est également destinée au Raspberry Pi, et par extension aux PC (windows/mac/linux), ce qui permet une configuration vraiment poussée sans avoir à immobiliser le drone ni même le connecter avec un câble.

L'intérêt du Raspberry Pi est qu'il est possible d'y connecter à la fois un écran tactile pour le paramétrage en plus de le connecter à des lunettes FPV supportant l'HDMI.
je prévoie même d'y intégrer à terme la vision 3D, moyennant tout simplement un second récepteur vidéo (et un headset compatible bien sûr)

Sur mon prototype toutes les communications se font sur une unique antenne WiFi avec un Tx à 1000mW (ça fait dans les 1000 mètres de range).
Le pilotage racing n'étant vraiment pas pratique avec un PC ou un téléphone/tablette et les manettes RC wifi de bonne qualité n'existant pas (du moins pas encore) ça pose le problème de devoir se fabriquer une manette. J'attends donc de recevoir tous les composants pour m'en fabriquer une du même type que les Spektrum (le plastique étant fait par imprimante 3D), je vous donnerai des nouvelles de son avancement.


Les problèmes
Comme tout projet vient avec son lot de problèmes j'en ai ici un de taille : la latence d'image ! J'ai actuellement une latence de 150 à 200ms sur la vidéo 720p 30fps, ce qui est beaucoup trop. D'après l'équipe des créateurs du Raspberry, tout le process vidéo prend 50ms de latence, j'ai donc 100~150ms de trop, de ce que j'ai pu voir sur le net ça vient principalement du WiFi. Heureusement quelqu'un s'y est déjà heurté et a trouvé comment régler le problème : utiliser le WiFi comme une antenne radio classique en désactivant tout les systèmes de synchronisation et d'encryptage. Son projet est totalement open-source : Wifiboardcast

Une autre partie du problème pourrait venir du fait que le contrôleur de vol et la transmission vidéo se "battent" car le processeur du Raspberry Pi est un mono-cœur et doit donc partager son temps entre les deux (ce genre de problème ne se pose même pas dans le cas d'une caméra analogique). Une solution serait d'utiliser un Raspberry Pi 2, possédant 4 cœurs : 1 pour le contrôleur, 1 pour la vidéo et 2 autres disponibles pour par exemple faire de la détection de formes/distances sur le FPV (ça serait sympa de faire un système qui cartographie l'environnement pour l'afficher par dessus le FPV et mieux apprécier les distances :Biggrin: ). J'en ai donc commandé un pour tester tout ça.


Mes questions
J'ai deux petites questions :
- Pensez-vous avoir un jour la curiosité d'essayer mon contrôleur ? (je peux fabriquer la manette à prix coûtant). Pour savoir si je peux continuer à élargir ses possibilités ou rester cantonné à ma propre utilisation.
- Vous sauriez me dire comment se comporte un drone en mode accro ?  *gneu* N'ayant jamais eu l'occasion de piloter une machine en accro je sais absolument pas comment programmer ce mode. Est-ce que la machine tente de maintenir plus ou moins son inclinaison actuelle lorsque les Roll et Pitch rates sont relâchés à 0 ou est-ce que le drone part vraiment en roue libre ?

Voilà, dîtes-moi ce que vous en pensez, ou si vous avez des suggestions  ;)
« Modifié: 25 janvier, 2016, 02:04:34 02:04 par drich »

Hors ligne estya

  • AMR -Le Bureau-
  • Pilote de Mini-Racers
  • ******
  • Messages: 2526
  • tout est relatif.
Re : Flight Controller à base de RaspberryPi
« Réponse #1 le: 27 décembre, 2015, 16:55:50 16:55 »
haha, excellent ! :)
alors pour les questions : jveux bien tenter l'aventure  *gneu*
pour l'ACCRO : l'action sur les sticks donne une vitesse de prise d'angle à la machine, le stick au centre veut dire "arrête de mettre de l'angle et garde le", donc pas de remise à plat.
Le secrétariat est ouvert de 5h25 à 13h45 les lundi, mardi et jeudi ; fermé de 16h à 18h et dimanche. Sur rendez-vous uniquement. RaceBand 3 for ever <3

Hors ligne Barry_white

  • Avant j'étais le plus jeune...
  • Global Moderator
  • Pilote de Mini-Racers
  • *****
  • Messages: 2087
  • Sale Môme
Re : Flight Controller à base de RaspberryPi
« Réponse #2 le: 27 décembre, 2015, 19:21:04 19:21 »
Le mode accro n'inclu pas de remise a plat. Du coup les commandes sont differentes:
- en stab les stick donne une consigne d'angle. Plus tu vas dans les coins avec les manches plus tu prendra d'angle (jusqu'a une certaine limite reglable dans la fc). Donc quand tu remet les sticks aux neutres consigne d'angle de 0° d'ou la remise a plat;
- en accro les sticks donnes une consigne en angle par seconde °/s. Donc plus tu mets tes manches dans les angles plus ton quad va tourner vite sur l'axe solicite. Du coup c'est ce qui fait que quand les sticks sont aux neutres ton quad garde son inclinaison, jamais il ne part en roue libre: ilreste fixer dans son dernier angle de consigne.

Voila si je n'ai pas ete clair n'hesite pas a le dire  ;)

Pour ta solution chapeau !!! Moi ce qui m'intrigue le plus c'est de faire du fpv en hd et wifi sans latence. Apres comment ça se passe si tu veux voler avec d'autres ???

Hors ligne drich

  • Pilote de planeur
  • **
  • Messages: 88
  • empereur reptilien
Re : Flight Controller à base de RaspberryPi
« Réponse #3 le: 27 décembre, 2015, 20:03:12 20:03 »
Ah nickel merci, donc c'est bien ce que je pensais : il faut maintenir l'angle actuel lorsqu'on relâche les sticks. Me disais bien que partir en roue libre c'était pas le top  *gneu*

Citer
Moi ce qui m'intrigue le plus c'est de faire du fpv en hd et wifi sans latence. Apres comment ça se passe si tu veux voler avec d'autres ???
Ben comme j'ai pu le dire ça monte jusqu'à 200ms de latence, c'est beaucoup trop. De ce que j'ai pu lire le maximum acceptable en FPV c'est dans les 60~70ms, donc c'est pas encore ça. J'espère que le Raspberry Pi 2 et la WiFi en mode analogique suffiront à régler le problème.
Sinon je peux aussi tenter de sortir la vidéo directement par la sortie composite et envoyer le signal à un émetteur vidéo analogique, mais là je peux dire au revoir à la HD...

Pour voler avec d'autres en mode WiFi classique c'est tout bête : le drone étant configuré en mode point d'accès WiFi, il suffit de changer son nom de point d'accès (SSID).
Dans le cas du système semi-analogique Wifibroadcast, d'après ce que dit son créateur la carte se cale sur un canal/slot disponible ("The WIFI cards still obeys to the standard wifi CSMA/CA (collision avoidance). This means that using wifibroadcast will use free slots in the channel and does not disrupt other users")

Hors ligne TiTidom

  • AMR Team
  • Pilote ULM
  • ****
  • Messages: 183
    • Le Blog-RC de TiTidom
Re&nbsp;: Flight Controller à base de RaspberryPi
« Réponse #4 le: 27 décembre, 2015, 21:01:31 21:01 »
Salut :)

Une petite question à la lecture de ton post : pourquoi te tourner vers un bus i2c alors qu'il est limité en terme de bande passante ? À choisir, je serais plutôt parti sur du SPI ce qui t'ouvre beaucoup plus de possibilités ;)

Bravo en tout cas pour l'initiative du projet, j'ai hâte de lire son avancée.

@++

Envoyé de mon SM-G900F en utilisant Tapatalk


Hors ligne drich

  • Pilote de planeur
  • **
  • Messages: 88
  • empereur reptilien
Re : Flight Controller à base de RaspberryPi
« Réponse #5 le: 27 décembre, 2015, 21:37:58 21:37 »
Le truc c'est que la quasi totalité des accéléromètres, gyroscopes, magnétomètres, baromètres et j'en passe sont tous faits pour un bus I²C uniquement... D'ailleurs on peut facilement déduire que ça vient du fait qu'en SPI il n'y a pas d'adressage, ce qui oblige à utiliser un GPIO de plus pour chaque sensor...

Hors ligne AbdrX

  • AMR -Le Bureau-
  • Pilote de Mini-Racers
  • ******
  • Messages: 2795
  • D.B.A. Don't Bother Asking. Mode 1 sinon RIEN §
Re : Flight Controller à base de RaspberryPi
« Réponse #6 le: 27 décembre, 2015, 22:14:14 22:14 »
ah je dis bravo pour l'idée et l'initative, que ca aboutisse ou pas, c'est genial d'avoir des idées comme ca !!

feloche ! :)

Hors ligne TiTidom

  • AMR Team
  • Pilote ULM
  • ****
  • Messages: 183
    • Le Blog-RC de TiTidom
Re&nbsp;: Flight Controller à base de RaspberryPi
« Réponse #7 le: 28 décembre, 2015, 14:08:03 14:08 »
@drich : le mpu6500, il est pas en spi ? (De mémoire)

Je disais ça car toutes les algo arrivent aux limites de l' i2c ces temps ci.... Alors autant partir sur une solution pérenne :)

@++

Envoyé de mon SM-G900F en utilisant Tapatalk


Hors ligne drich

  • Pilote de planeur
  • **
  • Messages: 88
  • empereur reptilien
Re : Flight Controller à base de RaspberryPi
« Réponse #8 le: 28 décembre, 2015, 14:40:23 14:40 »
Ah peut-être bien, c'est juste que pour l'instant j'utilise des PCB Breakout tout faits et il n'y a que l'I²C de câblé. Mais à terme j'ai prévu de faire un shield pour le Raspberry Pi, donc à ce moment là je pourrai envisager le SPI en effet.

Sinon pour contourner le problème j'ai triché en profitant de Linux : j'utilise deux threads d'exécution parallèle, un qui récupère les données des sensors (il tourne dans les 200~250Hz, c'est limité par l'I²C apparemment ouaip), et l'autre qui est la boucle principale de rate/stabilisation qui tourne à la vitesse que je veux.
Pour réduire encore plus je pourrai créer un thread par sensor, de sortent qu'ils s'exécutent de façon concurrentielle (quand l'un est bloqué, l'autre prend le fil d'exécution); mais j'ai toujours un goulot d'étranglement sur l'I²C car il peut faire qu'une seule transaction à la fois.

Le best du best, c'est d'utiliser un FPGA (je pense tenter le coup à long terme), le principe d'un FPGA c'est que c'est un circuit physiquement programmable dans le sens où on peut littéralement câbler les transistors comme on veut. Du coup ça serait possible de créer plusieurs interfaces SPI/I²C totalement isolées pour chaque sensor et de les faire tourner entièrement en parallèle sans qu'elles ne se bloquent. Avec ça on peut facilement atteindre des fréquences au dessus des 1KHz

Hors ligne calouemm

  • Pilote de planeur
  • **
  • Messages: 76
Re : Flight Controller à base de RaspberryPi
« Réponse #9 le: 29 décembre, 2015, 09:09:39 09:09 »
Whahou, je ne comprend pas la moitié de ce qui est écrit mais j'adore l'idée. Bravo pour l'initiative et je vais continué à suivre ce post avec grand plaisir. 

Hors ligne drich

  • Pilote de planeur
  • **
  • Messages: 88
  • empereur reptilien
Re : Flight Controller à base de RaspberryPi
« Réponse #10 le: 17 janvier, 2016, 22:55:43 22:55 »
Salut je reviens donner des nouvelles !  :Biggrin:
Je viens de passer près de deux semaines, jours et nuits (oui oui, j'ai que ça à faire..) à bosser sur ce FC.

J'ai donc commencé à faire un début de design de shield (un circuit qu'on vient emboiter par dessus le raspberry pi, avec tous les périphériques pré-câblés), ce qui permettra à terme je l'espère de pouvoir distribuer le produit final.

Et j'ai surtout passé la majorité de mon temps sur le système vidéo à base de WiFi, il y a encore peu de temps j'avais une latence entre 200 et 500ms, avec des drops (images qui disparaissent/se figent) de plusieurs secondes se produisant assez régulièrement, c'était donc inenvisageable de faire du racing avec ça.
Mais à force d'acharnement j'en suis venu à un résultat plutôt satisfaisant : du 1280x720p à 30~45 images par secondes, en qualité 2Mbps (je vous laisse taper "h264 720p 2mbps" sur youtube pour voir ce que ça peut donner), avec une latence entre 150ms et 200ms et sans aucun drop  *yeah* . Le tout étant enregistré en parallèle sur le drone lui-même en 10Mbps et avec du son.
Pour donner un ordre d'idée pour les "150ms à 200ms", un clignement d'oeil dure entre 100 et 150ms.

A côté de ça j'ai aussi conçu une manette, de taille similaire à ce qui se fait dans le domaine. Avec écran tactile 3.5" RGB, les deux joysticks, et quelques boutons. La sortie vidéo se fait par HDMI, numérique oblige, du coup je pense acheter le Razer OSVR qui est en fait un casque à réalité virtuelle avec entrée HDMI, vision 3D et lentilles avec un champ de vision à 110° (et bientôt 150°, ce qui est équivalent à la vision humaine) et un taux de rafraîchissement à 120Hz qui m'assurera de n'avoir aucune latence supplémentaire.

Il ne me reste plus qu'à réussir à imprimer en 3D la télécommande (j'en suis à ma 5ème tentative ratée) et je devrais pouvoir vous faire quelques vidéos du projet terminé  :)

En tout cas je peux dire que ce projet et le drone (http://forum.amr-asso.com/index.php?topic=1696.0) que j'ai fait avec m'auront coûté un bras..


Je vais enfin bientôt pouvoir vous rejoindre sur les pistes   *yeah*
« Modifié: 18 janvier, 2016, 01:19:26 01:19 par drich »

Hors ligne AbdrX

  • AMR -Le Bureau-
  • Pilote de Mini-Racers
  • ******
  • Messages: 2795
  • D.B.A. Don't Bother Asking. Mode 1 sinon RIEN §
Re : Flight Controller à base de RaspberryPi
« Réponse #11 le: 18 janvier, 2016, 06:29:08 06:29 »
wow, sacré projet !

hate de voir le resultat final ou presque final ! :p

Hors ligne drich

  • Pilote de planeur
  • **
  • Messages: 88
  • empereur reptilien
Re : Flight Controller à base de RaspberryPi
« Réponse #12 le: 18 janvier, 2016, 16:12:27 16:12 »
Et hate de savoir si le wifi ne va pas interférer avec vos RC en 2.4GHz O0

Edit : voilà une petite photo du boitier de la télécommande que j'ai enfin réussi à imprimer :
« Modifié: 18 janvier, 2016, 20:48:21 20:48 par drich »

Hors ligne drich

  • Pilote de planeur
  • **
  • Messages: 88
  • empereur reptilien
Re : Flight Controller à base de RaspberryPi
« Réponse #13 le: 23 février, 2016, 19:39:46 19:39 »
Hello tout le monde, je reviens avec le résultat final de tout ce travail !

Après m'être battu plusieurs semaines avec mon WiFi et plusieurs jours avec mes joysticks j'ai enfin un résultat viable.
Mes nouveaux ESCs (Afro 12A SimonK) ont une bien meilleure réponse comparé à ceux que j'avais avant, cependant leur contrôle à l'air bien plus "brut" et mes moteurs génèrent beaucoup de vibrations rendant totalement instable le mode stabilisé, il va donc falloir que je retravaille mes algorithmes de lissage...

J'ai pas mal amélioré le Flight Controller, il n'y a pas besoin de le re-compiler pour modifier des paramètres, même ceux qui sont proches du matériel, un simple fichier de configuration suffit à changer le type de frame, les multiplicateurs de PIDs, le type de connexion entre drone et télécommande et pleins de trucs. Ca ressemble à ça : (d'ailleurs si vous voulez bien me dire si ça vous semble lisible même sans connaissances en programmation ça me permettrait de tâter le terrain niveau simplicité de la chose)
---- Help ----
-- Vector( x, y[, z[, w]] ) <= z and w are 0 by default
-- Voltmeter{ device = "device_name", channel = channel_number[, shift = 0.0 by default][, multiplier = 1.0 by default] }
-- Socket{ type = "TCP/UDP/UDPLite", port = port_number[, broadcast = true/false] } <= broadcast is false by default


stabilizer.loop_time = 2500


--- Setup battery sensors : voltage sensor is mandatory, current sensor is strongly advised
battery = {
voltage = Voltmeter{ device = "ADS1015", channel = 0, multiplier = 3.0 }, -- Battery voltage
current = Voltmeter{ device = "ADS1015", channel = 1, shift = -2.5, multiplier = 1.0 / 0.028 }, -- Battery current draw, in amperes.
-- ^ For current sensor, in this particular example a Pololu ACS709 is connected to ADS1015 channel 1, which is centered around VCC/2 (=> 2.5V) and outputs 0.028V per Amp
}


--- Choose your frame type by uncommenting it and commenting the others
--frame.type = "PlusFrame"
--frame.type = "XFrame"
frame.type = "XFrameVTail"

if frame.type == "PlusFrame" then
-- TODO
elseif frame.type == "XFrame" or frame.type == "XFrameVTail" then
-- Set motors PWM pins
-- The pins numbers are the hardware PWM output pins of the board being used
if board.type == "rpi" then
-- See http://pinout.xyz/ or http://elinux.org/RPi_Low-level_peripherals#P1_Header
frame.motors = {
front_left = {
pin = 18,
},
front_right = {
pin = 23,
},
rear_left = {
pin = 24,
},
rear_right = {
pin = 25,
},
}
end
-- Set PID multipliers for each motor ( input vector is : { Roll, Pitch, Yaw } )
if frame.type == "XFrame" then
frame.motors.front_left.pid_vector  = Vector(  1.0, -1.0, -1.0 )
frame.motors.front_right.pid_vector = Vector( -1.0, -1.0,  1.0 )
frame.motors.rear_left.pid_vector   = Vector(  1.0,  1.0, -1.0 )
frame.motors.rear_right.pid_vector  = Vector( -1.0,  1.0,  1.0 )
elseif frame.type == "XFrameVTail" then
frame.motors.front_left.pid_vector  = Vector(  1.0,    -2.0/3.0,  0.0 )
frame.motors.front_right.pid_vector = Vector( -1.0,    -2.0/3.0,  0.0 )
frame.motors.rear_left.pid_vector   = Vector(  1.0/5.0, 4.0/3.0,  1.0 )
frame.motors.rear_right.pid_vector  = Vector( -1.0/5.0, 4.0/3.0, -1.0 )
-- use XFrame as type, since V-Tail only differs by its PID multipliers
frame.type = "XFrame"
end
end


--- Setup controller
controller.link = Socket{ type = "TCP", port = 2020 }


--- Setup camera
camera.link = Socket{ type = "UDPLite", port = 2021, broadcast = false }
if board == "rpi" then
--- Choose your camera here (Raspicam is the only supported by "rpi" for now)
camera.type = "Raspicam"
end

J'ai réussi à réduire la latence vidéo à 100~120ms, apparemment je ne pourrais pas descendre plus bas car j'ai atteints les limites physiques du capteur vidéo. Du coup ça donne du 800x600 à 50~60FPS.


Côté télécommande je me suis beaucoup amusé, la sortie vidéo se fait par le port HDMI du Raspberry Pi qui sert de RC Controller. Du coup j'ai investi dans un casque à réalité virtuelle, le Razer OSVR (qui permettra donc de gérer de la vidéo en 3D à l'avenir) et j'ai programmé un HUD (c'est plus du tout un OSD à ce niveau) qui s'affiche en 3D par dessus la vidéo et qui donne ça (la vidéo est coupé et le drone est pas à plat) :

Il ya deux fois la même image légèrement décalée, une par oeil; et la déformation sert à compenser les lentilles 110° du casque VR (réalité virtuelle).
L'immersion est totale c'est juste hallucinant  :Biggrin:

Du coup il ne me reste que le petit problème de filtrage des vibrations à régler, je poste une vidéo du résultat et c'est parti pour vous rejoindre sur les races  *yeah*


Tout le code est ici => https://github.com/dridri/bcflight

Hors ligne Barry_white

  • Avant j'étais le plus jeune...
  • Global Moderator
  • Pilote de Mini-Racers
  • *****
  • Messages: 2087
  • Sale Môme
Re : Flight Controller à base de RaspberryPi
« Réponse #14 le: 23 février, 2016, 19:48:37 19:48 »
Ro la vache chapeau bas !!!quand est-ce qu'on se croisera sur le terrain histoire de pouvoir voir ce résultat ?

Sinon 100ms de latence vidéo ça me parait bien haut  :-\
A voir comment tu voles mais j'ai peur que dès que tu commences à mettre du gaz ça pose problème.