Pilote automatique
Préambule
Lancez roscore puis vrep. Dans vrep, chargez la scène Corridors.ttt que nous vous fournissons. Il s'agit d'un environnement intérieur. Importez dans cette scène votre drone (load model). Sauvegardez le tout (le drone dans les couloirs) comme une scène.
Si ce n'est pas encore fait, téléchargez le package demo-teleop depuis gitlab.
cd ~/ros-ws/src git clone https://github.com/HerveFrezza-Buet/demo-teleop.git
Contrôleur interruptible
Utilisation de "safe-drone"
Lancez v-rep, lancez la simulation. Pour rappel, visualisez les topics liés à la simulation du drone.
rostopic listNous allons piloter le drone via le contrôleur sécurisé fourni par demo-teleop. Le noeud safe_drone_teleop souscrit à :
- cmd_vel_in Il s'agit du topic où la commande de mouvement du drone doit être envoyée. Normalement, on l'enverrait sur /drone/cmd_vel pour piloter le drone, mais l'idée est d'untercaler un contrôleur entre la commande et le drone.
- cmd_vel_out Il s'agit de la commande envoyée au drone (à remaper sur /drone/cmd_vel donc). Sauf reprise en main d'urgence par l'utilisateur, sauf phase de décollage et d'atterrissage (qui n'existent pas sur notre drone simulé), le topic cmd_vel_out est un simple renvoi de la commande qui entre sur cmd_vel_in, c'est en cela que le noeud safe_drone_teleop s'intercale entre la commande du drone et le drone. Bien entendu, si l'utilisateur reprend la main, c'est une autre commande qui est envoyée au drone. De même, si le noeud de contrôle cesse d'émettre une commande sur cmd_vel_in (il peu crasher par exemple), une sécurité fait que la commande d'arrêt est envoyée au drone.
- takeoff Il s'agit d'un topic sur lequel le noeud publie un message std_msgs/Empty pour faire décoller le drone. C'est ainsi qu'un drone bebop ou ardrone décolle. Ceci n'a pas d'effet sur le drone simulé, qui ne souscrit pas à un topic takeoff.
- reset Idem, mais pour la remise à zéro (à ne pas faire en vol...).
- land Idem, pour l'atterrisage.
- status Le noeud safe_drone_teleop publie sur ce topic son statut. La valeur de la chaine publiée est l'une des valeurs suivantes :
- "landed" Le drone est posé au sol.
- "taking off" Le drone est en cours de décollage.
- "manual flight" Le drone est en vol, contrôlé via le clavier.
- "automatic flight" Le drone est en vol, contrôlé via cmd_vel_in.
- "landing" Le drone est en cours de d'atterrissage.
rosrun demo_teleop safe_drone_teleop.py cmd_vel_in:=/cmd_vel cmd_vel_out:=/drone/cmd_velCe noeud attend des commandes au clavier pour le vol manuel, et sur le topic cmd_vel pour le vol automatique. Observez le statut dans un autre terminal...
rostopic echo /status... et pilotez votre drone au clavier en visualisant le drone et son statut. Vous pouvez modifier les paramètres de safe_drone_teleop en cours d'exécution (les vitesses lineaires et angulaires, mais aussi le délai avant la reprise du vol automatique) en lançant
rosrun rqt_reconfigure rqt_reconfigure
Un premier contrôleur
Dans votre workspace (dans le sous-dossier src), décompressez le package flow_control_py.tar.gz. Ce package définit des contrôleurs, vous pourrez ajouter les vôtres.
Pour le serveur, commençons par regarder le noeud flow_control_001.py (nous supposons ici que vrep et safe_drone_teleop sont en cours d'exécution).
rosrun flow_control_py flow_control_001.pyVisualisez le topic d'image /image_out/compressed pendant que vous jouez avec le drone.
Lisez bien (et comprenez...) le code de flow_control_001.py.
Contrôleur par flux optique
Contrôleur naïf
Remplaçons le contrôleur flow_control_001.py par flow_control_002.py (il suffira de lancer ce noeud-là à la place). Lisez le code attentivement. Le fait d'avoir un retour graphique des éléments du calcul (flux optique dans les régions, affichage du twist calculé) est un bon moyen pour débugger.
rosrun flow_control_py flow_control_002.py image_in/compressed:=/drone/front/compressed
Au fait... avez-vous compris comment marche ce contrôleur ?
Contrôleur réaliste
Implémentez (dans flow_control_003.py, flow_control_004.py...) vos essais de contrôleurs, en essayant de rendre le drone le plus autonome possible (prise de virages, freinage devant un cul de sac, etc...).
Passage sur un vrai drone