Robotique de navigation avec Turtlebot

Prérequis

Diapositives

Alternative text - include a link to the PDF!

Quelques alias

alias sb="source ~/.bashrc"
alias frames="rosrun tf2_tools view_frames.py && evince frames.pdf"
alias cm="cd ~/catkin_ws && catkin_make"

Travaux pratiques

1. Assemblage du Turtlebot (avec un robot réel)

⚠️ Attention : vous ne pourrez faire aucune erreur de câblage sauf avec le câble d’alimentation de la Raspberry Pi qui doit impérativement être branché comme sur le schéma ci-dessous au risque de déteriorer définitivement le matériel.

Attention au câble d’alimentation

▶️ Suivez cette vidéo pour assembler votre Turtlebot Burger :

Vidéo d’assemblage

2. Bringup du TB3 (avec un robot réel)

📀 Installez les dépendances suivantes :

sudo apt install ros-noetic-joy ros-noetic-teleop-twist-joy \
  ros-noetic-teleop-twist-keyboard ros-noetic-laser-proc \
  ros-noetic-rgbd-launch ros-noetic-rosserial-arduino \
  ros-noetic-rosserial-python ros-noetic-rosserial-client \
  ros-noetic-rosserial-msgs ros-noetic-amcl ros-noetic-map-server \
  ros-noetic-move-base ros-noetic-urdf ros-noetic-xacro \
  ros-noetic-compressed-image-transport ros-noetic-rqt* ros-noetic-rviz \
  ros-noetic-gmapping ros-noetic-navigation ros-noetic-interactive-markers ros-noetic-tf2-tools

sudo apt install ros-noetic-dynamixel-sdk
sudo apt install ros-noetic-turtlebot3-msgs
sudo apt install ros-noetic-turtlebot3
cd ~/catkin_ws/src
git clone https://github.com/ros4pro/turtlebot3_ros4pro.git
cd ~/catkin_ws && catkin_make
source ~/.bashrc

🔍 Vérifiez d’abord la configuration réseau de ROS sur votre PC et sur le TB3 : ROS_MASTER_URI doit pointer vers le Turtlebot. Vérifiez également que vous avez connecté le robot au Wifi avec les instructions de l’introduction. Si vous partagez le Wifi avec d’autres groupes, vérifiez aussi que vous avez renommé votre robot en y ajoutant votre numéro de groupe (par ex burger8).

🤖 En ssh sur le TB3 lancez la commande roslaunch turtlebot3_ros4pro bringup.launch. Le programme doit rester ouvert pendant toute la durée de la manipulation. S’il n’y a aucune erreur vous êtes prêt à piloter le robot depuis votre poste de travail, que ce soit pour la téléopération, la cartographie ou la navigation autonome.

2.bis. Bringup du Turtlebot (en simulation)

⚠️ Attention la simulation du TB3 n’est à utiliser qu’en dernier recours pour remplacer votre robot s’il ne fonctionne pas. Avant de passer en simulation demandez de l’aide pour réparer votre robot.

📥 Vous devez télécharger et installer le paquet ROS de simulation du TB3 :

🔍 La simulation remplace le robot donc vous ne devez ni essayer de lancer le bringup du TB3 et ni vous connecter au robot. À la place vous devez lancer le simulateur et configurer ROS_MASTER_URI pour pointer vers votre PC (ROS master = cette machine).

💻 Lancez roslaunch turtlebot3_gazebo turtlebot3_empty_world.launch, le simulateur Gazebo se lance et vous devez voir le TB3 au milieu de la fenêtre.

Plusieurs environnements de simulation sont disponibles :

3. Téléopération

🎮 La première étape pour piloter votre robot consiste à vérifier que votre poste de travail peut effectivement prendre le contrôle du Turtlebot, en le téléopérant via les touches du clavier.

💻 Dans un nouveau terminal lancez la commande roslaunch turtlebot3_ros4pro teleop_key.launch et gardez le focus sur le terminal pour controler le robot avec le clavier grâce aux touches indiquées. Vérifiez que vous pouvez avancer, reculer, tourner à gauche et à droite. Vous pouvez tuer ce dernier avec Ctrl+C lorsque vous avez terminé.

4. Cartographie

🗺️ Nous allons désormais créer la carte de l’environnement dans lequel votre Turtlebot évoluera lorsqu’il naviguera de manière autonome.

💻 Lancez le commande roslaunch turtlebot3_ros4pro slam.launch. RViz se lance et vous devriez apercevoir le robot, les scans du LIDAR et la carte en construction.

💻 Dans un nouveau terminal lancez la commande roslaunch turtlebot3_ros4pro teleop_key.launch et gardez le focus sur le terminal pour contrôler le robot avec le clavier comme précédemment. Cependant cette fois-ci, votre carte est en cours d’enregistrement. Quand la carte est terminée ne quittez ni RViz ni le terminal de la cartographie.

💻 Dans un nouveau terminal lancez la commande roscd turtlebot3_ros4pro/maps/ pour aller dans le dossier où la carte est enregistrée.

💾 La commande qui va suivre va supprimer la carte précédente s’il y en a une, le cas échéant faites-en une copie si vous souhaitez la conserver. Lancez la commande roslaunch turtlebot3_ros4pro map_saver.launch qui va sauvegarder la carte dans le dossier maps du package turtlebot3_ros4pro (fichiers maps.yaml et maps.pgm).

5. Navigation

💻 Lancez le commande roslaunch turtlebot3_ros4pro navigation.launch pour lancer la localisation et la navigation autonome.

👀 Sur RViz vous devez voir le robot, les scans du LIDAR, les particules de AMCL et la carte que vous avez enregistrée.

📍 Si le robot est mal localisé, utilisez l’outil 2D Pose Estimate sur RViz. Cliquez et Glissez avec la souris pour positionner le robot sur la carte.

📍 Pour donner des ordres de navigation, utilisez l’outil 2D Nav Goal sur RViz. Cliquez et Glissez avec la souris sur la carte là où le robot doit aller.

6. Scenario de navigation

🚗 L’objectif final du TP est de faire passer le robot par une suite de 4 ou 5 points de passage, comme pour une patrouille, avec un retour au point de départ. Si cela n’est pas déjà fait, choisissez plusieurs points de passage faciles à mesurer avec un mètre depuis le point de départ, avec un grand nombre d’obstacles sur le chemin. Si l’environnement a fortement changé, pensez à enregistrer une nouvelle carte.

🐍 Les commandes pour naviguer jusqu’à chaque point de passage seront des instructions dans un fichier Python. Le noeud simple_navigation_goals.py auquel vous pourrez accéder en tapant roscd turtlebot3_ros4pro/src/nodes est une ébauche de script Python pour y parvenir.

🐍 Complétez ce fichier Python afin d’exécuter le scenario et ainsi effectuer la patrouille. Pour exécuter le scénario lancez la navigation en arrière plan comme indiqué dans 2.5 Navigation puis lancez la commande rosrun turtlebot3_ros4pro simple_navigation_goals.py.

🧳 Challenge additionnel : Carry my luggage

Challenge inspiré de l’épreuve “Carry my luggage” de la RoboCup @Home. Pour info, le réglement de la compétition se trouve ici (mais ça n’apporte rien pour votre projet) : https://athome.robocup.org/wp-content/uploads/2019_rulebook.pdf

🗺️ Prérequis : avoir une carte représentative de l’environnement.

➡️ Phase 1 : Follow me

Vous avez toute liberté pour préparer le début de l’épreuve (ex. comment faire que le robot soit bien localisé dès le début ?).

Le robot part d’un point connu et doit suivre un humain qui va à un endroit inconnu par le robot (mais à l’intérieur de la carte). L’humain commence l’épreuve en étant en face du robot à une distance de 50 cm.

Le robot doit suivre l’humain en maintenant une distance comprise entre 20cm minimum et 1m maximum.

Pour être valide, l’humain doit avoir un déplacement non trivial : il ne va pas toujours tout droit et il fait varier sa vitesse de marche dans la limite du raisonnable. Distance minimum de marche demandée 4 mètres (mais vous êtes libres de faire plus si ça vous arrange, ça n’impactera pas directement la note). Il faut obligatoirement que le robot traverse une porte.

Lorsque l’humain est arrivé à sa destination, il s’arrête pendant une durée d’au moins 3 secondes. Le robot doit alors comprendre que la phase 1 est terminée et passer à la phase 2.

↩️ Phase 2 : Go home

Le robot doit repartir et naviguer en totale autonomie jusqu’à son point de départ. Sur le retour, vous rajouterez jusqu’à :

Si le robot arrive à destination (à +-20cm, +-15°) la phase 2 est validée.

↙️ Phase 3 : Dock

Le robot doit chercher où se trouve sa base et s’y accoster. La position grossière de la base est connue mais cette partie n’est validée que si le robot réussi un accostage précis sans contact : la distance entre le robot et la base soit être supériere à 5mm et inférieure à 2cm.

Vous avez toute liberté pour choisir un objet qui représentera la base du robot. Un pot de peinture par exemple serait un choix pertinent (la symétrie radiale peut simplifier la détection).

Documentation