Robot Control Interface
L'interface homme-machine embarquée sur le robot
Défi
Créer l'interface de communication directe entre l'utilisateur et le robot, embarquée sur l'écran tactile, fonctionnelle même sans connexion internet.
Opportunité
Les robots ont un écran à l'avant. Sans interface dédiée, cet écran est inutile. J'ai construit le pont entre l'homme et la machine : un point de contrôle accessible à tout moment, directement sur le robot.
Disciplines
Responsabilités
Architecture ROS/Web
Interface tactile
Visualisation 3D
Gestion des missions
Stack
Contexte
Nos robots de livraison ont un écran tactile à l'avant. Cet écran est le point de contact direct entre l'utilisateur et la machine. Contrairement au dashboard web ou à l'app mobile qui nécessitent internet, cette interface fonctionne en local : elle communique directement avec le cerveau du robot (ROS) via WebSocket.
C'est l'interface qui permet de tout faire sur le terrain : créer des missions, déplacer le robot manuellement, voir ce qu'il voit via ses caméras, consulter ses logs, éditer sa map en temps réel, déverrouiller ses compartiments. Même si le robot est offline (pas de 4G, pas de WiFi), l'interface fonctionne.
Architecture
Communication directe avec ROS
L'interface se connecte au système ROS du robot via RosBridge WebSocket (ws://localhost:9090). Pas de serveur distant, pas d'internet requis. La connexion est établie au démarrage et maintenue en permanence avec reconnexion automatique en cas de coupure.
Topics et Services ROS
Deux patterns de communication : les Topics pour les flux continus (position GPS, niveau batterie, flux caméras, occupancy grid) et les Services pour les actions ponctuelles (démarrer une mission, déverrouiller un compartiment, redémarrer le robot). J'ai créé des hooks React custom pour abstraire cette complexité.
Architecture offline-first
Toute l'intelligence est côté robot (brain node ROS). L'interface n'est qu'une vue et un contrôleur. Elle peut fonctionner indéfiniment sans internet, seule la connexion WebSocket locale avec ROS est nécessaire. Le robot est autonome, l'interface est juste une fenêtre sur son état.
Interface utilisateur
Vue principale avec modèle 3D
L'écran d'accueil affiche le robot en 3D (React Three Fiber) avec ses infos clés : nom, modèle, kilométrage, batterie, température. L'utilisateur peut explorer le modèle avec OrbitControls. Les indicateurs temps réel (batterie, état des compartiments) sont mis à jour en continu via les topics ROS.
Gestion des missions
Interface complète pour créer des missions : sélection de la destination sur la map, choix du type de mission, ajout à la queue. Vue des missions en cours et en attente avec drag & drop pour réorganiser. Statuts en temps réel (PENDING, RUNNING, COMPLETED, FAILED).
Pilotage manuel et caméras
Mode pilotage avec joysticks tactiles virtuels (NippleJS) : gauche pour la vitesse linéaire, droite pour la rotation. Publication continue (~15Hz) sur le topic ROS. Affichage simultané des flux caméras (avant, arrière) pour voir où le robot va.
Édition de map et logs
Les admins peuvent éditer la map du robot en temps réel : ajouter/supprimer des POI, modifier les zones navigables. Vue des logs du robot avec filtres par niveau (debug, info, warning, error). Déverrouillage des compartiments pour les livraisons.
Stack technique
1Architecture React + Contexts
RosContext gère la connexion WebSocket globale. RosServiceManagerContext centralise l'état du robot : missions, batterie, compartiments, hardware status. Hooks spécialisés (useRosTopicSubscribe, useRosServiceClient) pour chaque interaction avec ROS.
2Topics ROS utilisés
Souscriptions : /brain_node/parking_mode_*, /camera/color/image_raw, /slam/occupancy_grid, /battery_state. Publications : /joy_touchscreen (commandes pilotage), /set_active_brake. Chaque topic typé en TypeScript pour la sécurité.
3Services ROS clés
brain_node/bapi/* : get_mission_manager_status, start_mission, cancel_mission, get_battery_data, unlock_compartment, start_parking, reboot_robot. Requêtes/réponses typées, gestion des timeouts et erreurs.
4Déploiement embarqué
Application dockerisée sur le compute du robot. Script de lancement qui ouvre Chromium en mode kiosk fullscreen sur l'écran tactile. Volumes montés pour accéder aux fichiers locaux (maps, configs). Démarrage automatique au boot du robot.
Impact
Autonomie totale sur le terrain
Les opérateurs peuvent tout faire depuis l'écran du robot, sans dépendre d'internet. Créer des missions, piloter manuellement, diagnostiquer un problème, voir les caméras. Tout est accessible localement.
Réactivité instantanée
Communication directe avec ROS, zéro latence réseau. Les commandes de pilotage sont transmises en ~15Hz. L'état du robot est affiché en temps réel. Quand tu bouges le joystick, le robot réagit instantanément.
Interface utilisée quotidiennement
Déployée sur tous les robots Hive depuis 2022. C'est l'interface principale pour les opérations terrain. Reconnexion automatique, gestion gracieuse des erreurs, feedback utilisateur clair. Fiable en conditions réelles.
Résultats
Stack technique
Intéressé par ce projet ?
Contactez-moi pour en discuter ou voir une démo.