Mark2 — Bras robotique assistant 5 DDL

Commande multimodale : voix, vision ArUco, téléopération par gant ESP32 et interface web

Mark2 est un bras robotique assistant 5 DDL qui combine commande vocale, perception visuelle par marqueurs ArUco, cinématique inverse et interface web de supervision. L’architecture logicielle modulaire en Python et Flask permet d’orchestrer la détection, la planification géométrique et l’exécution des commandes moteurs pour un pilotage intuitif en mode automatique par voix et vision ou en mode manuel via un gant ESP32 avec IMU.

Objectif

Permettre un pilotage souple du bras : déplacements en coordonnées cartésiennes, prise d’objet guidée par la vision, retour à l’origine, et téléopération directe par la pose de la main (pitch/roll) complétée par un joystick. Le système doit rester modulaire côté logiciel (Python, Flask) pour itérer rapidement sur la chaîne perception, planification géométrique et exécution sur servomoteurs.

Architecture

L’orchestration est pilotée par main.py, qui lance les modules audio, vision, cinématique, gant ESP32, et commande série autour d’un état partagé robot_state.

Schéma d'architecture Mark2

Backend et IHM

Flask agrège l’état du robot, les journaux et les commandes utilisateur. Le front combine HTML/JavaScript et une scène Three.js pour la visualisation 3D avec modes manuel et automatique, saisie X,Y,Z, séquences par blocs et choix d’outil (pince ou électroaimant).

Vision et cinématique

OpenCV détecte les ArUco, homographie à quatre points, puis coord_conversion et solve_inverse_kinematics dans inverse_kinematics.py (longueurs de liens L1–L4 en mm).

Audio et commandes

PyAudio enregistre après détection de seuil et Google SpeechRecognition (fr-FR) interprète les phrases (déplacement va en x… y… z…, prise, ouverture ou fermeture, retour maison, bascule de mode).

Gant ESP32

ESP32_Data.py interroge l’ESP32 en HTTP (/angles) pour récupérer pitch et roll des MPU-6050 ainsi que le joystick et les mapper en consignes articulaires en mode manuel.

Technologies et outils utilisés

  • Langages : Python (principal), JSON, HTML/CSS/JavaScript, G-code (impression 3D)
  • Web : Flask, API REST, Three.js (visualisation 3D)
  • Vision : OpenCV, détection ArUco
  • Audio : PyAudio, SpeechRecognition (Google)
  • Modèle géométrique : trigonométrie pour l’IK (SymPy disponible dans le projet pour extensions symboliques)
  • Embarqué : ESP32 (Wi-Fi, HTTP), deux MPU-6050 (bus I2C), joystick analogique
  • Matériel : Raspberry Pi (ordinateur monocarte), PCA9685 (PWM servos), caméra USB, servos
  • Communication : Wi-Fi et HTTP vers le gant avec liaison série vers le contrôleur bras
  • CAO / fabrication : modélisation et pièces imprimées pour le bras et le gant

Choix techniques et solutions retenues

  • PCA9685 : pilotage multi-canaux PWM pour les servos sans saturer les GPIO du Raspberry Pi, avec une alimentation 5 V dédiée aux actionneurs pour séparer logique et puissance.
  • Flask : API REST légère et pages dynamiques pour le prototype avec couplage simple à OpenCV et au port série dans un même processus Python.
  • Reconnaissance vocale : Google SpeechRecognition pour itérer vite sur la grammaire de commandes en français, au prix d’une dépendance réseau.
  • Homographie ArUco : quatre marqueurs fixes pour définir le plan de travail et aligner les coordonnées image avec le repère du robot avant conversion et IK.
  • Gant ESP32 : requêtes HTTP périodiques pour réutiliser la pile IP du PC et isoler le firmware du gant de la logique Flask.

Démonstration vidéo

Cette vidéo a été produite dans le cadre du concours « Mon projet en 5 minutes », organisé par le club EEA que j’ai remporté. Elle présente le système de façon synthétique : commandes, interface et comportement du bras.

Elle complète le tableau de bord ci-dessus : même chaîne logicielle (Flask, vision, audio, série), mais mise en scène pour une présentation courte devant un public.

Conception mécanique

Bras robotique Mark2 5 DDL

Le bras est construit autour d’une structure imprimée en FDM : segments rigides, articulations servomécaniques, base et préhenseur. Le design a été affiné en plusieurs itérations : premier prototype pour valider la cinématique inverse, second prototype avec caméra, alimentation intégrée, câblage rationalisé et interface d’outils interchangeables.

La caméra est positionnée pour observer le plan de travail et les marqueurs ArUco et les câbles sont routés le long du bras pour limiter les accrochages lors des mouvements répétés.

Changement d’outil en un clip

Sous le préhenseur, l’interface d’outil repose sur trois points de contact : VCC, GND et un signal PWM pour piloter le servo de l’outil (pince, électroaimant, etc.) sans recâbler à chaque changement. Le clip mécanique assure à la fois la tenue et la continuité électrique.

Démonstration changement d'outil en un clip

Conception électronique

Côté bras, le schéma représente la liaison I2C entre le Raspberry Pi et le PCA9685, et une alimentation 5 V haute disponibilité pour les servos (ex. prise depuis une source type ATX) afin de ne pas tirer le courant moteur depuis le Pi.

Schéma électronique bras Mark2

Le gant de téléopération repose sur un ESP32, deux MPU-6050 sur le même bus I2C avec adresses distinctes (broche AD0), et un joystick analogique avec bouton poussoir. L’ensemble est alimenté et câblé pour une lecture stable des inclinaisons et du joystick.

Gant de contrôle ESP32
Schéma électronique gant

Contributions

  • Conception de l’architecture logicielle Python/Flask : routes REST, threads vision, audio et état gant, état partagé robot_state.
  • Développement de la cinématique inverse et du mapping image ↔ repère robot (inverse_kinematics.py, coord_conversion).
  • Mise en œuvre du pipeline ArUco avec homographie à quatre marqueurs, détection d’objet et enchaînement pour la prise dans FrameWork.py.
  • Implémentation de la commande vocale (PyAudio, seuil, parsing des commandes) et intégration aux mouvements.
  • Développement du gant ESP32 et du lien HTTP (ESP32_Data.py) pour le mode manuel.
  • Interface web (dashboard, Three.js, séquences par blocs) et itérations mécaniques sur le bras et le système d’outils à clip.

Métriques clés

Degrés de liberté

5 DDL pour le bras (θ1 à θ5) plus commande d’outil (pince / électroaimant) et modes associés dans le protocole série.

Modèle géométrique

Longueurs de liens dans le code : L1 = 203 mm, L2 = 195 mm, L3 = 150 mm, L4 = 187,5 mm.

Vision

4 marqueurs pour le plan de travail et un marqueur objet dédié à la cible avec le dictionnaire ArUco DICT_5X5_250.

Communications

Liaison série robot à 9600 bauds par défaut dans FrameWork.init_serial_connection et configuration Wi-Fi ESP à 115200 bauds dans main.py pour l’écoute série.

Parallélisme

Threads Flask, framework (vision/série), audio_loop, update_robot_state (mode manuel).

Limites actuelles et niveau de validation

Validé

  • IK et déplacements cartésiens via l’IHM
  • Pipeline ArUco + prise sur scène de démonstration
  • Commandes vocales (grammaire fixe) et bascule auto/manuel
  • Téléopération gant sur banc avec ESP32 joignable en HTTP

En cours d’amélioration

  • Robustesse vision (éclairage, flou, occlusion des marqueurs)
  • Calibration fin du repère image ↔ robot sur tout l’espace utile
  • Fiabilité longue durée de la liaison série et du routage câbles