Retour
ROSEmbeddedTouch UI

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

Frontend DevelopmentRobotics IntegrationEmbedded SystemsUI/UX Design

Responsabilités

Architecture ROS/Web

Interface tactile

Visualisation 3D

Gestion des missions

Stack

Next.jsReactThree.jsReact Three FiberroslibRosBridge

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

1

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.

2

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é.

3

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

100% offline, aucune dépendance internet
Communication directe avec ROS
Contrôle complet du robot
Utilisé quotidiennement en production

Intéressé par ce projet ?

Contactez-moi pour en discuter ou voir une démo.

Me contacter