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.
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.
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.
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).
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).
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).
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.
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.
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.
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.
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.
robot_state.inverse_kinematics.py,
coord_conversion).FrameWork.py.ESP32_Data.py) pour le mode manuel.5 DDL pour le bras (θ1 à θ5) plus commande d’outil (pince / électroaimant) et modes associés dans le protocole série.
Longueurs de liens dans le code : L1 = 203 mm, L2 = 195 mm, L3 = 150 mm, L4 = 187,5 mm.
4 marqueurs pour le plan de travail et un marqueur objet dédié à la cible avec le dictionnaire ArUco DICT_5X5_250.
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.
Threads Flask, framework (vision/série), audio_loop, update_robot_state (mode manuel).