Bonjour, Habr!
Je m'appelle Aleksey, depuis 7 ans, je suis l'un des principaux développeurs de solutions Smart TV dans une grande entreprise de développement personnalisé d'Izhevsk. Chaque année, nous organisons un concours de décorations du Nouvel An, et chaque fois nous ne décorons rien, mais nous coupons toutes sortes de choses technologiques. Cette fois, ils ont croisé le drone et l'application Smart TV. Et ce qui en est ressorti - lire ci-dessous.
L'idée était tout à fait réalisable. Ils voulaient faire un quadricoptère en forme de traîneau du Père Noël, qui offrirait des cadeaux pour les employés au bureau à la musique. Dans le même temps, il a dû naviguer dans l'espace à l'aide de l'analyse des balises ArUco, interagir avec les applications de télévision («souffler» la fumée des tuyaux avec des vis de travail, faire sortir les animaux pour rencontrer / voir le quadricoptère).
Et pour les trois mois. Bien sûr, nous n'avions pas le temps.
Bien qu'à différents moments jusqu'à sept personnes aient travaillé sur le projet, le résultat était loin d'être idéal. En général, nous avons seulement appris à lancer un hélicoptère et à écrire des applications pour les téléviseurs. Configurez l'interaction du quadricoptère avec les téléviseurs. Mais tout d'abord.

Je ne me souviens pas dans la tête de qui je suis malade (certainement pas dans la mienne, mais ce n'est pas exact) l'idée est venue de lancer un bombardier quadricoptère au bureau. La tâche est nouvelle et pas facile, mais nous n'y avons rien trouvé au-delà de nos forces. Oui, nous avons fouillé sur Internet dans le but de trouver une bibliothèque pour contrôler le contrôleur d'hélicoptère. Oui, il était nécessaire de transférer l'image du flux de la webcam vers le client et de l'analyser sur le serveur. Oui, il a fallu faire une porte anti-bombe. Oui, vous devez généralement écrire un shell qui collecterait tout cela en lui-même. Et alors? Nous avons déjà fait tout cela (sauf pour contrôler le contrôleur). Par conséquent, le projet a reçu un feu vert.
Périphérique
Chaque erreur évolutive d'un hélicoptère lancinant bourdonnant au-dessus de votre tête, en principe, consiste en un ensemble de mécanismes et de schémas. C’est:
- contrôleur
- moteurs d'hélices
- batterie
- contrôleur de vitesse (ESC),
- antenne de télémétrie
- Module GPS et boussole,
- la caméra.
Les deux derniers points sont facultatifs. Le schéma de circuit de l'ami du giravion peut être vu ici:

Ce bien est mis sur le boîtier. Cependant, le corps a décidé d'en faire un. Parce que:
- vous avec une moustache
- avait besoin d'une coque exactement sous la forme d'un traîneau,
- c'était déjà indécemment cher.
Contrôleur

La partie la plus importante de toute larve d'hélicoptère. Il possède des accéléromètres sur trois axes, un firmware logiciel, des entrées pour l'installation des équipements périphériques et la connexion des moteurs, et une sortie pour le contrôle. Sans lui, aucun drone ne volera dans les airs. La pièce est si importante qu'elle est montée sur une plate-forme spéciale absorbant les chocs pour réduire les effets des vibrations et des charges de choc. Quelque chose comme ça:

Nous avons choisi un contrôleur relativement important. "Relativement", car alors j'ai regardé de plus près les monstres qui sont proposés aux oncles sérieux ... Néanmoins, le contrôleur dispose d'un GPS, d'une boussole, d'un pilote automatique, de toutes sortes d'autres bons petits pains, supporte jusqu'à 8 moteurs.
À proprement parler, de tels contrôleurs ne sont pas destinés uniquement à une fraternité qui plane verticalement. Ils peuvent être installés sur n'importe quelle plate-forme mobile, allant des hélicoptères, avions, se terminant par des voitures et des bateaux. Un tas de cas d'utilisation. Mais nous étions quelque peu distraits.
Les moteurs

Il y a beaucoup de ces amis. Rond, carré, courbes, oblique, grand, petit, cher et pas cher. La principale différence: consommation d'énergie maximale, intensité du courant et nombre de tours par seconde. Idéalement, le traîneau aurait dû pouvoir lever une canette de bière (0,5 kg). Après avoir estimé le poids total de la structure, nous avons calculé la force de levage approximative requise et pris des moteurs puissants de haute qualité. Comme il s'est avéré plus tard, ils n'ont jamais fonctionné à pleine capacité. Mais mieux vaut plus que moins ...
La batterie

La seule source d'énergie par laquelle un kamikaze potentiel restera dans l'air. Pendant le fonctionnement, plusieurs points intéressants ont été découverts.
Premièrement, le moignon bourdonnant de la technologie mange de l'énergie comme gratuite. La boîte est atterri pour le moment et prend beaucoup de temps à charger.
Deuxièmement, il mange non seulement, mais sait aussi laisser une charge "en réserve". L'idée est bonne, car lorsque la tension de seuil est atteinte, la voiture interrompt le vol et effectue un atterrissage en douceur, mais cela s'exprime dans le fait que la canette "atterrit" encore plus vite.
Contrôleur de vitesse

Une petite puce, sans laquelle les moteurs ne fonctionneront tout simplement pas. Conçu pour la distribution de tension des banques au moteur. Une chose très importante, vient généralement avec un moteur acheté.
Antenne de télémétrie

"
En substance, les équipements périphériques, cependant, sans lui, il ne sera pas possible de contrôler la branche sans issue du développement des objets volants. De plus, la télémétrie est utilisée non seulement pour le contrôle, mais aussi pour la transmission du signal vidéo de la caméra, il y a donc généralement deux antennes. Soit dit en passant, la télémétrie est effectuée en envoyant et en transmettant des signaux à une liste de canaux. Ils peuvent également être contrôlés par programme, mais ce n'est absolument pas recommandé, car c'est ainsi que nous refusons le pilote automatique filaire et écrivons le nôtre. Sur le genou. Et des substances et des bâtons. La dernière nuit. Comment nous aimons.
Module GPS

Le principal et presque le seul moyen de positionner un destructeur de nerfs volants dans l'espace. Habituellement, le module GPS contient également une boussole. Pour que rien ne puisse l'influencer en vol, le module est placé sur une barre spéciale pour que rien ne l'influence. Nous ne l'avons utilisé que pour la boussole, car dans la pièce, le GPS n'est pas très bon pour attraper. Prend en charge d'autres systèmes de positionnement.
Comme tout GPS qui se respecte, il peut faire des erreurs. L'erreur varie de plusieurs mètres à plusieurs continents. Mais en général, un appareil nécessaire dans la rue pour des missions à distance.
Appareil photo

Ce pour quoi tout est fait. L'orage des aéroports anglais peut non seulement discuter sous une caméra. Le contrôleur peut le stabiliser, le contrôler à distance et fournir des paramètres et des outils très détaillés pour sa gestion. Mais nous n'avons pas tout utilisé. Une autre fois.
La gestion
Tous les métiers d'ingénierie sapiens utilisant des contrôleurs sont essentiellement contrôlés par un programme: Mission Planer. Cela ressemble à ceci:

En savoir plus
ici .
Il présente la plus large gamme de fonctionnalités et de paramètres. Il y a une planification des tâches de vol, le géo-positionnement, le contrôle manuel, divers réglages et l'étalonnage de l'équipement.
Règle numéro 1: n'utilisez que ce dont vous avez besoin
Oui, le programme est nécessaire et utile. En principe. Mais pas pour notre tâche, car le diviseur d'air doit être contrôlé par un logiciel, et nous avons perdu beaucoup de temps pour gérer ce planificateur.
Le contrôle manuel lui-même peut être effectué selon vos désirs. Il existe des paramètres pour la télécommande, pour le joystick. Vous pouvez afficher le contrôle sur la souris et le clavier. La principale exigence est de calibrer le panneau de commande. Eh bien, gérez manuellement. Puisque nous sommes des développeurs paresseux, nous ne voulions pas gérer manuellement. Je voulais que le giravion vole de lui-même.
Contrôle de programme
Sur Internet, ils n'ont trouvé que
cette bibliothèque, conçue pour contrôler par programme la ressemblance des avions. Et il est écrit (roulement de tambour) en python. En général, pour les versions 2.x, mais aussi sur Python 3.5, cela fonctionnait de manière assez stable. La bibliothèque a des fonctionnalités riches et une documentation relativement bonne. Mais avant de commencer à écrire votre code de drone méga-contrôle, vous devez d'abord ... Oui, vous devez vous connecter au contrôleur.
Le micro-ordinateur Raspberry Pi a été utilisé comme composant logiciel de contrôle, sur lequel le serveur Web a été déployé sur le framework aiohttp.
Le schéma et les instructions pour connecter les "framboises" et le contrôleur peuvent être trouvés
ici .
Schématiquement, cela ressemble à ceci:

La méthode de connexion est la suivante. Le contrôleur et les framboises sont connectés par des fils selon le schéma spécifié. De cette façon, le signal radio envoyé et reçu par le contrôleur est émulé. Sur les framboises, vous devez exécuter un serveur proxy, qui s'accrochera au contrôleur et en transférera les données. La connexion peut être établie via la télémétrie ou via USB. Ils utilisent différents ports COM. La figure montre la méthode par télémétrie.
Règle numéro 2: documentation incomplète. Souvent, n'écrivez pas les choses les plus évidentes.
Par exemple, pour vous connecter de python au contrôleur, vous devez spécifier l'adresse et le port: connectionString = '127.0.0.1:14540'
Mais il s'est avéré que cette adresse et ce port doivent également être spécifiés dans la ligne de lancement du serveur proxy. Ici:
mavproxy.py —master=/dev/ttyAMA0 —baudrate 921600 —aircraft MyCopter
Oui, c'est évident, mais jamais évident. Et nous avons passé beaucoup de temps à le comprendre.
Cependant, même après avoir démarré le proxy avec la bonne ligne et après avoir réussi à se connecter au drone python, le miracle de la technique hostile ne voulait pas démarrer. Autrement dit, nous recevons des données de l'hélicoptère, nous les voyons, mais la future menace céleste de l'humanité refuse d'exécuter des commandes. Au dernier moment, il s'est avéré que les données pour se connecter au drone avaient besoin de beaucoup plus. Conditionnellement, il devrait commencer à envoyer des données à la télémétrie connectée, sinon, il ne l'a tout simplement pas connectée et s'est assis satisfait.
D'où la règle numéro 3: utiliser USB
Oui, la documentation était bien moindre, mais la stabilité de la connexion serait certainement plus élevée. Parce que je n'aurais pas à utiliser d'épingles à framboise.
Vol d'essai

Et soudain, il s'est avéré que:
- l'hélicoptère ne vole pas en douceur
- erreurs de sa télémétrie ± mètre ou plus,
- Pour un vol, des tâches comme: grimper de 10 à 20 mètres, voler 100 mètres vers le nord, etc.
Permettez-moi de vous rappeler que cette conception, créée sous l'influence d'hélicoptères du film "Avatar", a été lancée dans les murs du bureau, où il y a beaucoup d'équipement de bureau, de lampes, de ventilation et de décoration accrochés au plafond. Eh bien, il y a aussi des employés. En général, il est rapidement devenu évident qu'un vol intérieur sérieux serait lourd de 160 têtes coupées.
Règle numéro 4: utiliser des conditions de test normales
Si un char volant a une taille de 50 par 60 cm, sa présence dans l'air dans un espace clos entraînera inévitablement des dommages ou des dommages à ceux qui se trouvent à proximité. Une zone de test idéale serait une salle de gym.
Vision par ordinateur
Un portail distinct vers l'enfer était la tâche de la vision par ordinateur. L'idée est de lire les étiquettes ArUco, dont chacune a une position enregistrée dans le plan de la pièce, et par rapport à laquelle l'hélicoptère détermine sa position dans l'espace, ainsi que la position par rapport au point actuel de l'itinéraire.
Exemple d'étiquette:

Pour l'implémentation, la bibliothèque
openCV a été
utilisée . Il est utilisé pour reconnaître en général tout ce qui est, en particulier: les visages des personnes, les objets, les numéros de voiture et nos marques. L'installation de la bibliothèque sur le système d'exploitation framboise - Rasbian - est devenue un cauchemar avec lequel quatre personnes se sont affrontées en alternance. Néanmoins, nous l'avons résolu avec succès, et maintenant la machine a "appris" à reconnaître les marques dans le flux vidéo de la webcam. Mais encore une fois, il n'y avait pas assez de temps pour tout configurer. Par exemple, à partir de deux balises ou plus, la bibliothèque a renvoyé les numéros reconnus de toutes les balises et les données pour une seule. Pourquoi Il y a un grand mystère ...
La règle est importante: allouez suffisamment de temps pour affiner la solution
Autres sens
Pour que le mutant des ailes d'Icare ne colle pas aux obstacles surgissant soudainement, ils ont voulu utiliser des capteurs de distance. Ils étaient censés se trouver de tous les côtés de la voiture et devaient signaler l'approche d'un obstacle, à la suite de quoi l'hélicoptère devrait s'arrêter, faire un «pas de côté» et continuer à avancer le long du parcours.
Nous n'avons pas eu le temps de faire cette fonctionnalité du tout.
Itinéraires
Nous avons beaucoup parlé des trajectoires de vol de l'hélicoptère. Et quel genre d'animaux sont-ils? Je dirai tout de suite que cette fonctionnalité a été implémentée par le tout premier et dans son intégralité, mais ... n'était pas utile.
Les itinéraires de mouvement sont un graphique connecté avec des sommets, dont chacun a sa coordonnée tridimensionnelle dans l'espace de la pièce. En conséquence, l'hélicoptère doit suivre du point de départ au point d'arrivée, dans le dernier effectuer la mission de vol. Il s'ensuit en passant du sommet actuel au suivant. Puisque pour chaque sommet nous connaissons ses coordonnées, et pour l'hélicoptère nous connaissons son emplacement (boussole) et sa position (marques), alors déterminer où voler est une question purement technique. La tâche de trouver le chemin entre le point de départ et l'arrivée est résolue par une fonction récursive. Les routes, les bords et les pics sont stockés dans une base de données déployée sur les framboises.
La dernière règle: ne faites que ce dont vous avez besoin pour mettre en œuvre
Pile technologique
Hélicoptère:
Raspberry Pi ,
Rasbian ,
OpenCV ,
Python 3.5 ,
aiohttp ,
DroneKit ,
RPi.GPIO ,
SQLite .
Serveur avec dynamique pour TV:
node.js ,
Express ,
socket.io .
Applications TV:
JavaScript ES6 ,
webpack 2 ,
Canvas .
Référentiel avec code copter
ici . Pour les étoiles - les avantages du karma.
Quelques mots pour clarifier les termes (je vous demande de considérer toute évaluation subjective).
- Raspberry Pi. Micro-ordinateur à part entière avec broches et sorties disponibles pour une caméra spéciale et un écran tactile. C'est sur lui que se trouve le code de contrôle, le serveur web, la bibliothèque openCV. En fait, un hélicoptère est un serveur volant.
- Raspbian Système d'exploitation Linux pour les framboises. Il y en a plusieurs et en général vous pouvez en mettre, mais il est préférable d'en mettre des spécialement conçus, sinon il peut y avoir des problèmes d'interaction avec du matériel informatique, avec les mêmes broches par exemple. Il existe même une version adaptée de Windows 10.
- OpenCV. Bibliothèque pour reconnaître des éléments dans un flux vidéo. Sait également comment diffuser le flux vidéo, qui est utilisé dans le projet pour envoyer des images au client. (oui, l'hélicoptère a son propre client web)
- Python 3.5. Python 3.5. Pas 2. *.
- Aiohttp. Framework de serveur web asynchrone écrit en python. Pour une raison quelconque, il aimait davantage Django . Mais il y a un choix.
- DroneKit. Bibliothèque pour se connecter au contrôleur copter à partir du programme. Fonctionnalité très riche, associée à une documentation relativement bonne. En l'absence d'analogues - un outil génial.
- RPi.GPIO. Bibliothèque Python pour interagir avec les épingles de framboise. Vous permet d'activer et de désactiver les broches, d'écouter leurs valeurs. Impossible de transmettre des valeurs autres que 0 ou 1-ts. Ou je n'ai pas trouvé.
- SQLite SGBD + DB + bois de chauffage combinés en un seul fichier. Idéal pour les projets de formation et non commerciaux, si vous n'avez pas besoin de déployer quelque chose de lourdement chargé. Pratique pour apporter des modifications.
- Node.js. JavaScript côté serveur
- Express Framework de serveur Web écrit en node.js. Très confortable et minimaliste.
- Socket.io. Serveur et bibliothèque client pour implémenter le protocole webSocket. Le principal avantage est la stabilité du travail et les nombreuses fonctionnalités fournies.
Conclusions
Dans la formulation d'origine, la tâche est réalisable, même si elle nécessite beaucoup plus de temps et d'efforts. Étant donné que les méthodes de contrôle du pilote automatique et de l'hélicoptère sont légèrement moins que totalement liées au GPS, elles doivent être abandonnées dans le sens des commandes directes aux canaux de contrôle. Cela implique la nécessité d'écrire votre pilote automatique, qui est la tâche à résoudre. Et puis - pour tester, tester et tester.
Personnellement, j'étais intéressé. Et je ferai le bombardier cadeau automatisé de toute façon. Et à tous ceux qui sont intéressés, je laisserai peut-être
La seule règle est: fixez-vous des objectifs élevés et difficiles et allez-y!
Bonne chance à tous!