Skip to content

Repository files navigation

Contrôleur Robot - Raspberry Pi Pico 2 & ROS 2 (Micro-ROS)

Une bibliothèque C modulaire et robuste pour piloter les moteurs pas-à-pas en boucle fermée MKS SERVO42E via une liaison RS485 (module MAX3485) depuis une Raspberry Pi Pico 2 et trois paa5100je pour génerer une odométrie. Le système communique désormais de manière autonome et asynchrone avec un Raspberry Pi 5 via Micro-ROS, en utilisant les deux cœurs du Pico 2 pour garantir des performances temps réel.


🚀 Interface ROS 2 (Micro-ROS)

Le Pico 2 exécute un nœud Micro-ROS nommé pico_robot_node.

1. Démarrer l'Agent sur le Raspberry Pi 5

Le Pico communique en série (UART0) sur les broches TX: 12 et RX: 13. Pour établir la communication, lancez l'agent Micro-ROS sur le Pi 5 avec la commande suivante :

ros2 run micro_ros_agent micro_ros_agent serial --dev /dev/ttyAMA0 -b 115200

Note : Le Pico 2 se reconnectera automatiquement en cas de perte de l'agent.

2. Les Topics disponibles

Nom du Topic Type de Message Sens Description
/pico/cmd_simple geometry_msgs/msg/Point32 📥 Sub Consigne de vitesse (RPM). x = Avant, y = Gauche, z = Droit.
/pico/odom_simple std_msgs/msg/Float32MultiArray 📤 Pub Odométrie & Twist (50Hz). [X, Y, Theta, Vx, Vy, Vz, Timestamp]
/pico/reset_odom std_msgs/msg/Empty 📥 Sub Remet l'odométrie (X, Y, Theta) à zéro.

3. Sécurité (Timeouts) ⚠️

Le robot possède un chien de garde (Watchdog) matériel strict pour éviter les accidents :

  • 0.5 seconde sans message : Freinage actif (Vitesse = 0, couple maintenu).
  • 10 secondes sans message : Coupure de l'énergie (Roue libre pour économiser la batterie). 👉 Il est donc impératif de publier la consigne en continu (par exemple à 10 Hz) pour faire rouler le robot.

4. Commandes de Test depuis le terminal (Pi 5)

Faire tourner les moteurs (Publication à 10 Hz grâce à -r 10) :

ros2 topic pub -r 10 /pico/cmd_simple geometry_msgs/msg/Point32 "{x: 50.0, y: -50.0, z: 0.0}"

Pour stopper le robot, faites Ctrl+C. Le timeout de sécurité coupera les moteurs 500ms plus tard.

Lire la position calculée par les capteurs optiques :

ros2 topic echo /pico/odom_simple

Remettre l'odométrie à zéro :

ros2 topic pub --once /pico/reset_odom std_msgs/msg/Empty 

5. Codes Couleur de la LED (Statut)

La LED RGB intégrée au Pico 2 indique l'état en temps réel du robot :

  • 🔴 Rouge : Démarrage et initialisation.
  • 🟪 Violet : Moteurs RS485 configurés.
  • 🟨 Jaune : En attente de l'Agent Micro-ROS (Recherche de la Pi 5).
  • 🟩 Vert : Connecté à ROS 2, prêt à recevoir des ordres !
  • 🟦 Bleu (Flash) : Réception et exécution d'une commande de vitesse en cours.

🎯 Calibration de l'Odométrie (Capteurs PAA5100)

Pour que l'odométrie soit précise, il est crucial de calibrer deux types de paramètres :

  1. Les constantes de conversion (C1, C2, C3) : Elles transforment les "ticks" bruts de chaque capteur en mètres.
  2. Le rayon du robot (R_ROBOT) : Il est utilisé pour calculer la rotation à partir des déplacements des capteurs.

Nous utilisons une procédure d'auto-calibration par rotation pure (sur place), permettant de s'affranchir des imprécisions des tests en ligne droite.

Protocole (Méthode de Rotation)

  1. Connaissance du rayon :

    • Assurez-vous que la constante R_ROBOT dans src/odom.cpp correspond exactement à la donnée CAO (distance centre robot <-> centre optique d'un capteur).
  2. Mesure des ticks en rotation :

    • Dans src/robot.cpp, activez le Mode 1 : #define CALIBRATION_MODE 1.
    • Flashez le Pico. Le robot attend 5 secondes, puis se met à tourner sur lui-même à vitesse constante.
    • Chronométrez le temps exact pour faire 1 tour complet en millisecondes.
    • Coupez le robot, et inscrivez ce temps dans src/robot.cpp : #define CALIB_ONE_TURN_MS 4500 (remplacez 4500 par votre temps).
    • Passez en Mode 2 : #define CALIBRATION_MODE 2.
    • Flashez. Posez le robot, il va effectuer exactement 10 tours puis s'arrêter tout seul (LED Cyan).
    • Lancez l'agent Micro-ROS sur la Pi 5 et relevez les ticks finaux de l'axe tangentiel (x) sur les 3 topics :
      • ros2 topic echo /pico/capteur1 (lire la valeur x)
      • ros2 topic echo /pico/capteur2 (lire la valeur x)
      • ros2 topic echo /pico/capteur3 (lire la valeur x)
  3. Calcul des Constantes (C1, C2, C3) :

    • La distance théorique parcourue par chaque capteur lors de ces 10 tours est : Distance = 10 * 2 * PI * R_ROBOT
    • Calculez vos gains : C_nouveau = Distance / ticks_mesures
    • Inscrivez ces 3 nouvelles valeurs dans src/odom.cpp.
  4. Finalisation :

    • Remettez #define CALIBRATION_MODE 0 et flashez.
    • Le robot publiera alors son odométrie complète et son "Twist" (Vitesses linéaires et angulaire) au format Float32MultiArray prêt à être reconstruit côté Pi 5.

📌 Fonctionnalités bas niveau (API C MKS SERVO)

Cette bibliothèque décompose la logique de communication pour offrir un contrôle total sur l'assemblage et l'envoi des trames :

  • Vitesse et Direction (Commande F6) avec gestion de l'accélération.
  • Activation / Désactivation du moteur (Commande F3) pour remplacer le fil physique "Enable".
  • Arrêt contrôlé (Commande F6 avec vitesse à 0) pour une décélération douce.
  • Arrêt d'urgence (Commande F7) pour couper immédiatement le mouvement.
  • Lecture de l'acquittement (ACK) avec timeout pour valider la bonne réception par le moteur.

🛠️ Pense-bête d'utilisation (Cheat Sheet)

Les trames MKS n'ont pas toutes la même longueur selon la commande envoyée. Attention à bien ajuster les tailles lors du calcul du Checksum (CRC) et de l'envoi.

On initialise toujours un buffer (ex: uint8_t ma_trame[7];) dans le main avant d'assembler les blocs.

About

No description, website, or topics provided.

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages