Projet de majeure Robotique en 5ème Année à l'école CPE Lyon.
Auteur : Xavier Jannin
Objectif : Implémenter ROS
sur un robot constitué uniquement de moteurs et d'encodeurs.
Matériels utilisés :
- Petit robot à roues différentielles, avec des encodeurs fixés sur des roues touchant le sol.
- NUCLEO-STM32F411RE : intéragit avec la partie électronique (moteurs et encodeurs).
- Raspberry Pi 3 Model B : exécute ROS et permet le contrôle du robot.
Pour respecter une commande en vitesse /cmd_vel
, le DiffDriveController
génère des commandes en vitesse pour les moteurs du robots.
Les encodeurs permettent de connaître la position des roues et de vérifier que les commandes sont correctement réalisées.
Les positions et vitesses sont renvoyées au DiffDriveController
pour déterminer l'odométrie /odom
.
En complément, la Raspberry implémente des outils de navigation pour générer des commandes en vitesse pour que le robot se déplace à une position demandée. Ces outils sont aussi capable d'éviter des obstacles en connaissant la carte dans laquelle se déplace le robot :
Liste des fonctionnalités réalisées et/ou souhaitées pour ce projet :
ROS :
- Contrôle du robot :
-
DiffDriveController
: réalise l'odométrie + génère des commandes pour chaque moteur à partir d'une commande en vitesse. -
hardware_interface
: communication entre laSTM32
et leDiffDriveController
. - Envoyer de commandes en vitesse avec le clavier ou la souris.
- Visualisation des déplacements sur
RViz
.
-
- Navigation :
- Intégration de la Navigation Stack de ROS.
- Génération du chemin (avec évitement d'obstacles) pour aller vers la position demandée grâce à une carte.
- Génération des commandes pour déplacer le robot vers une position demandée.
- Déplacement sans rencontrer d'obstacles.
- Génération d'une carte à partir de capteurs (SLAM).
- Utilisation de capteurs (lidar, ...) pour positionner le robot sur la carte (AMCL).
STM32 :
-
Encoder
: classe pour récupérer la position d'un encodeur. -
Motor
: classe pour alimenter un moteur. -
PID
: classe pour réaliser un PID. -
VelocityJoint
: classe pour contrôler un moteur en vitesse grâce à un encodeur et un PID. -
rosserial
: communication avec ROS pour envoyer et recevoir des données.- : Envoie les informations des moteurs (position et vitesse).
- : Récupère les commandes en vitesse du
DiffDriveController
pour les moteurs. - : Topics pour récupérer les informations des encodeurs.
- : Topics pour modifier directement les valeurs des PIDs.
Pour faire fonctionner ce projet, il est nécessaire d'avoir les éléments suivants installés :
Partie STM32 :
STM32CubeIDE
: IDE pour compiler et téléverser le programme sur la STM32.
Partie Raspberry :
- Installation de l'image de
Ubiquity Robotics
qui a toute la configuration pour ROS et fonctionne directement en hotspot Wifi.
Partie ROS :
- ROS (à partir de la version
Kinetic
). - Les package suivants pour que la partie ROS puisse compiler et fonctionner :
Si la compilation ne fonctionne pas, essayer d'installer quelques packages supplémentaires :
velocity_controllers
ros_melodic_four_wheel_steering_controller
(peut-être optionnel)
Note :
Commande pour installer un package :
$ sudo apt-get install ros-<distro>-<package-name>
Avec :
<distro>
: nom de la distribution ROS utilisée (melodic
,kinetic
).<package-name>
: nom du package avec les_
remplacer par des-
(mouse_teleop
→mouse-teleop
).
Sur un ordinateur, exécuter les actions suivantes pour démarrer les outils principaux du projet : DiffDriveController
, Navigation
et contrôle avec la souris.
Avec le robot :
- Utiliser
STM32CubeIDE
pour téléverser le programme contenu dans le dossier STM32 sur laSTM32
. - Allumer la Raspberry et brancher la
STM32
dessus. - Se connecter sur le WiFi de la Raspberry :
ubiquityrobotXXXX
- Se connecter au Master ROS de la Raspberry :
export ROS_MASTER_URI=http://10.42.0.1:11311
- Compiler et sourcer le projet ROS sur l'ordinateur et la Raspberry, en étant dans le dossier ROS :
$ catkin_make $ source devel/setup.bash
- Lancer le launch file
robot_bringup.launch
du packagerobot_bringup
depuis l'ordinateur pour démarrer le projet :$ roslaunch robot_bringup robot_bringup.launch
Sans le robot, en simulation :
- Compiler et sourcer le projet ROS, en étant dans le dossier ROS :
$ catkin_make $ source devel/setup.bash
- Lancer le launch file
simulation.launch
du packagerobot_bringup
pour démarrer le projet :$ roslaunch robot_bringup simulation_bringup.launch
Dans les deux cas, RViz
s'ouvre pour visualiser les déplacements du robot.
Une autre fenêtre s'est aussi ouverte pour permettre l'envoie de commandes en vitesse au robot et le voir se déplacer sur RViz
(et aussi dans la réalité).
Enfin, l'outil 2D Nav Goal
de RViz
permet de donner une position sur la carte, et le robot essaye d'y aller de manière autonome.