Real-time Robot Video Monitoring
Pipeline WebRTC ultra basse latence ~80ms
Défi
Permettre aux opérateurs de voir ce que voit le robot en temps réel, avec une latence suffisamment basse pour pouvoir intervenir à distance si nécessaire.
Opportunité
Ma V1 envoyait des screenshots via WebSocket à 10 FPS. L'opérateur pouvait ajuster la qualité et le framerate, mais le résultat était saccadé et instable. Pour une supervision efficace et une éventuelle télé-opération, il fallait un vrai flux vidéo basse latence.
Disciplines
Responsabilités
Architecture streaming
Pipeline WebRTC
Interface opérateur
Optimisation latence
Stack
Contexte
Superviser un robot autonome à distance nécessite de voir ce qu'il voit, en temps réel. Quand un robot rencontre une situation ambiguë ou un obstacle inattendu, l'opérateur doit pouvoir évaluer la situation et intervenir si besoin.
Ma première approche était simple : capturer des screenshots des caméras du robot et les envoyer via WebSocket. Ça fonctionnait pour du monitoring basique, mais avec 10 FPS max et une latence de 500ms+, impossible d'intervenir efficacement. J'ai donc migré vers WebRTC, le même protocole utilisé par Zoom et Google Meet, conçu pour la vidéo temps réel.
Architecture
V1 : Screenshots WebSocket
La première version capturait des frames JPEG des caméras du robot et les envoyait via WebSocket. L'opérateur pouvait ajuster le framerate (1-10 FPS) et la qualité de compression. Simple à implémenter, mais limité : pas de vrai flux vidéo, latence variable (300-800ms), et instable en cas de réseau fluctuant.
V2 : Migration WebRTC
WebRTC utilise UDP au lieu de TCP, ce qui permet de prioriser la latence sur la fiabilité. Si une frame est perdue, on passe à la suivante au lieu de retransmettre. Avec un encodage H.264 optimisé côté robot et un décodage hardware côté navigateur, j'ai atteint ~80ms de latence end-to-end. Suffisant pour piloter le robot à distance si nécessaire.
Interface opérateur
Vue multi-caméras
Le robot embarque plusieurs caméras (avant, arrière, latérales). L'interface permet de visualiser plusieurs flux simultanément ou de focus sur une caméra en fullscreen. Switch rapide entre les vues avec des raccourcis clavier.
Contrôles adaptatifs
L'opérateur peut ajuster la résolution et le bitrate en fonction de la bande passante disponible. Un indicateur affiche la latence en temps réel et la qualité de connexion. Fallback automatique vers une résolution inférieure si le réseau se dégrade.
Stack technique
1Pipeline vidéo côté robot
Capture des flux caméras via GStreamer, encodage H.264 avec FFmpeg optimisé pour la latence (tune=zerolatency). Le flux encodé est envoyé via WebRTC. Configuration fine des paramètres d'encodage pour minimiser le delay tout en maintenant une qualité acceptable.
2Signaling et négociation
Serveur de signaling en Python pour gérer la négociation WebRTC entre le robot et le navigateur de l'opérateur. Échange des SDP (Session Description Protocol) et des ICE candidates pour établir la connexion peer-to-peer.
3Interface React
Player vidéo custom basé sur l'API WebRTC du navigateur. Décodage hardware automatique si supporté. Affichage des métriques temps réel (latence, bitrate, frames perdues). Reconnexion automatique en cas de déconnexion.
Impact
Latence divisée par 6
Passage de ~500ms (V1 WebSocket) à ~80ms (V2 WebRTC). Cette latence permet non seulement de superviser, mais aussi d'intervenir en temps réel si le robot rencontre une situation problématique.
Supervision efficace
Les opérateurs peuvent suivre plusieurs robots simultanément depuis le dashboard. En cas d'alerte, un clic pour passer en vue fullscreen et évaluer la situation. La basse latence leur donne confiance pour prendre des décisions rapides.
Base pour la télé-opération
Ce pipeline vidéo est devenu la brique essentielle pour le mode de télé-opération. Couplé à l'interface de pilotage manuel, il permet de prendre le contrôle du robot à distance quand l'autonomie atteint ses limites.
Résultats
Intéressé par ce projet ?
Contactez-moi pour en discuter ou voir une démo.