Dans l' article précédent, nous avons examiné la procédure de lancement d'un drone virtuel autonome dans les airs. Sous la direction de l'enseignant, même les écoliers parviennent à lancer le drone selon cette instruction. La question se pose: et ensuite? Eh bien, drone, bien monté. De plus, virtuel - dans les jouets et les simulateurs et plus joliment peint.
Dans une prochaine étape, nous proposons de créer un drone à tête chercheuse capable de voir votre objectif et de l'atteindre avec succès. Il est plus facile d'utiliser un ballon de couleur comme cible.
Une telle tâche (faire éclater une balle avec un drone autonome) a récemment été effectuée par des équipes de la section Aeronet du Robocross panrusse 2019 . Nous avons été inspirés par la chanson «Seek and destroy» du premier album d'un groupe américain qui a été très populaire durant ma jeunesse mouvementée.
Dans la prochaine série d'articles, nous verrons comment enseigner à un drone autonome à suivre les instructions simples du refrain de la chanson susmentionnée.
Nous avons donc besoin des éléments suivants:
- Un drone volant que nous pouvons contrôler depuis le programme
- Système de reconnaissance et d'orientation des cibles
- Combinez les deux points précédents ensemble - et, voila, vous pouvez rivaliser, dont le drone volera plus vite et plus de balles.
Ensuite, tout d'abord.
jMAVSim contrôlé par clavier
Imaginez un drone voyant une balle, comme dans l'image ci-dessus. La caméra du drone regarde droit devant.
Pour voler sur un ballon, notre drone doit pouvoir: avancer / reculer, tourner à gauche et à droite, voler plus haut et plus bas. La balle se déplacera dans l'objectif de la caméra non seulement à cause des rafales de vent, mais aussi de l'inclinaison du drone en roulis et en tangage, mais nous négligeons ces inclinaisons jusqu'à présent.
Nous contrôlerons la vitesse du drone en envoyant des messages via mavros au sujet /mavros/setpoint_velocity/cmd_vel_unstamped
.
Pour manipuler le drone depuis le clavier, nous utilisons le module curses ( description en russe , en anglais ).
L'algorithme est simple: les valeurs actuelles des vitesses souhaitées sont stockées dans une variable setvel de type geometry_msgs.msg.Twist . En appuyant sur un bouton du clavier, nous augmentons / diminuons la composante de vitesse souhaitée. Par la minuterie 20 fois par seconde, nous publions la vitesse dans le sujet spécifié.
Pour la vitesse d'avancement (par rapport au drone), une clarification est nécessaire. Le fait est que les vitesses de vol doivent être fixées dans le système de coordonnées local du "monde" dans lequel vole notre drone. Par conséquent, vous devez suivre la position actuelle (pose) du drone dans ce système de coordonnées. L'axe X du drone est tourné par rapport à l'axe X du "monde" d'un certain angle de lacet. Mavros publie la position actuelle du drone dans les coordonnées du "monde" dans le sujet /mavros/local_position/pose
. Après avoir obtenu l'angle de lacet à partir de la position afin d'obtenir et de publier la vitesse de drone souhaitée en coordonnées mondiales, nous multiplions la vitesse d'avancement souhaitée setvel_forward par cos (lacet) pour l'axe X et sin (lacet) pour l'axe Y du `` monde '', respectivement.

Texte intégral du programme: Pour exécuter le programme pour l'exécution, nous devons exécuter jMAVSim et y connecter mavros à l'aide de la commande roslaunch mavros (après avoir exécuté roscore s'il n'a pas été démarré automatiquement):
roslaunch mavros mavros_sitl.launch fcu_url:="udp://@192.168.7.14:14580"
Assurez-vous que nous sommes connectés en utilisant l'écho / mavros / état rostopique. Le champ connecté doit être = True.
Après cela, enregistrez le code du programme dans un fichier et exécutez-le avec la python fly_mavsim.py
. Le quadricoptère virtuel doit atteindre une hauteur d'environ 2 mètres (la hauteur de décollage est définie dans le paramètre MIS_TAKEOFF_ALT dans QGroundControl) et geler. À l'aide des boutons du clavier, il peut être contrôlé: flèches droite-gauche - tourner, flèches haut-bas - mouvement avant / arrière, u - voler haut (HAUT), d - voler bas (BAS), s - accrocher en place (ARRÊTER, toutes vitesses = 0), q - quittez le programme (QUIT) et atterrissez le quadricoptère.
Vous pouvez voler dans le monde virtuel, vérifier comment un drone virtuel idéal se comporte en vol.

Les changements de vitesse des frappes sont résumés, vous pouvez faire voler le drone en cercle, en spirale, autour d'un certain point, simulant un système de ciblage.
Puis le plaisir commence: à partir d'un drone sphérique dans le vide, nous entrons dans le monde réel.
Drone réel contrôlé par clavier
Il existe de nombreuses instructions sur le réseau pour assembler et configurer les copters sur la pile PX4. Un processus assez détaillé est décrit dans la documentation des développeurs .
Comme j'ai utilisé un drone prêt à l'emploi, cela m'a évité de nombreux squats lors de l'assemblage et de la configuration préliminaire du système.
En tant qu'ordinateur de bord, nous utilisons Raspberry PI 3 Model B +, avec Raspbian + ROS Kinetic installé. Raspberry est connecté au contrôleur de vol Pixracer via uart, selon le schéma:

Le module GPS est connecté au port GPS du contrôleur de vol. J'utilise le module TS100 de Radiolink, la qualité est bonne, le coût n'est pas élevé.
ROS Kinetic peut être installé par vous-même en suivant les instructions . Sur Raspberry, vous devez configurer l'accès via Wifi et ssh ( voici une instruction, par exemple ).
Vous pouvez également utiliser l' image finie pour Raspberry de la société "Copter Express". Dans ce cas, vous devez désactiver le package intelligent par défaut, dont nous n'avons pas besoin:
sudo systemctl stop clever sudo systemctl disable clever
Une autre image Raspberry avec ROS et OpenCV est décrite ici , je ne l'ai pas essayée dans mon travail, mais les outils utilisés sont similaires.
Après avoir allumé le drone et connecté à Raspberry via ssh, nous lançons mavros et vérifions la connexion avec le contrôleur de vol:
roslaunch mavros px4.launch fcu_url:='/dev/ttyAMA0:921600' gcs_url:='tcp-l://0.0.0.0:5760' rostopic echo /mavros/state
Si tout fonctionne correctement, une fois par seconde, nous recevons des messages sur l'état du contrôleur de vol avec le champ Connected = True.
Le paramètre gcs_url
dans l'appel gcs_url
est nécessaire pour que nous puissions connecter le QGroundControl au contrôleur de vol du drone via WiFi via TCP-bridge. Les paramètres de connexion sont définis dans QGroundControl:
Pour préparer le drone au vol autonome, je suis en quelques étapes simples:
1.Assurez-vous que le drone vole bien en mode manuel. Pour ce faire, les bons paramètres doivent être sélectionnés et tous les capteurs calibrés. L'utilisation d'un drone disponible dans le commerce m'a sauvé des ennuis à ce stade. J'ai utilisé l'estimateur LPE avec GPS activé et un baromètre:
2. Si le système démarre dans un nouvel endroit ou pour la première fois, vous devez attendre que le module GPS se "réchauffe". Avec un travail régulier dans la rue, le GPS capte généralement de 16 à 22 satellites.
3. Avant de voler vers un nouvel endroit et si le drone ne tient pas de point, vous devez recalibrer la boussole:
Vous devez utiliser une boussole externe et vous assurer que l'orientation correcte est définie dans les paramètres:
Si tous les réglages sont effectués correctement, le drone doit maintenir le point en toute confiance en mode HOLD et voler de manière stable en mode Position.
Après des vols d'essai réussis en mode manuel, nous pouvons vérifier le fonctionnement de notre programme fly_jmavsim.py sur un vrai drone: la vidéo .
Un vrai drone ne vole pas aussi parfaitement qu'un virtuel - mais il doit également obéir aux commandes du clavier - voler dans la bonne direction et s'arrêter à la commande.
Si cela se produit, au lieu du contrôle du clavier, nous pouvons utiliser la vision par ordinateur, dont nous parlerons de la configuration dans le prochain article. Les premiers tests de chasse au ballon ressemblaient à ceci .
Les paramètres de notre contrôleur de vol + code de programme sont affichés sur le github .