3D PLY Labeling Interface
Quand des millions de points deviennent des cartes navigables pour robots
Défi
Gérer des millions de points dans un navigateur. Permettre l'édition multi-utilisateur en temps réel. Livrer un outil que l'équipe veut utiliser au quotidien.
Opportunité
La V1 était une impasse. Charger tout le PLY côté client signifiait des crashs dès qu'on dépassait la taille d'un parking. Un seul éditeur signifiait des conflits et du travail perdu. Quand on a eu besoin d'annoter des villes entières, j'ai tout reconstruit from scratch.
Disciplines
Responsabilités
Architecture end-to-end
Serveur de streaming
Interface 3D
Système de collaboration
Stack
Contexte
Les robots autonomes naviguent grâce à des cartes SLAM : des nuages de points 3D enrichis de métadonnées. Où le robot peut-il s'arrêter ? Quels chemins peut-il emprunter ? Où peut-il circuler librement ? Tout est annoté manuellement.
La première version fonctionnait pour les petits espaces. Mais quand les clients ont demandé des entrepôts et des quartiers entiers, tout s'est effondré. Les onglets du navigateur crashaient. Les éditeurs écrasaient le travail des autres. Il fallait une nouvelle architecture.

Interface 3D
Visualisation et édition de nuages de points avec routes, zones et POIs

Vue complète de la map

Vue aérienne du circuit

Vue rapprochée avec zone

Détail zone et routes
Démonstration
Fonctionnalités clés en action
Edition de routes
Tracer des voies, définir les directions, délimiter où les robots peuvent circuler
Edition de zones
Définir des zones de circulation libre avec des limites polygonales
Architecture
Nuage de points côté serveur
Le PLY complet reste sur le serveur, indexé avec un KD-Tree pour des requêtes spatiales rapides. FastAPI gère à la fois le REST (auth, CRUD) et le WebSocket (streaming, sync). En navigant, seuls les points visibles sont envoyés. La mémoire reste constante quelle que soit la taille totale de la map.
Collaboration temps réel
Chaque map est une room WebSocket. Tu modifies quelque chose, tout le monde le voit instantanément. Des indicateurs de présence montrent qui travaille où. Une map de la taille d'une ville qui prenait 2 semaines à une personne se fait maintenant en 4 jours en équipe.
Interface
Rendu style moteur de jeu
Seuls les points visibles existent côté client. La caméra bouge, le serveur stream les nouveaux points, le client supprime les anciens. Mises à jour incrémentales de la géométrie Three.js. Navigation fluide même sur des maps de plusieurs millions de points.

Trois structures de données
Les POI pour les points d'arrêt. Les routes pour les voies dirigées. Les zones pour la circulation libre. Chacune avec des outils d'édition dédiés.

Panneau d'édition
Configuration détaillée des routes et paramètres de navigation

Éditeur de route
Stack technique
1Backend Python
FastAPI + WebSockets. Indexation spatiale KD-Tree. Pool de connexions MySQL asynchrone. Auth JWT avec isolation par room. Le serveur gère 10+ éditeurs simultanés sans broncher.
2Frontend React + Three.js
React Three Fiber pour la 3D. Zustand pour l'état. BufferGeometry dynamique avec mises à jour incrémentales. Navigation WASD. Reconnexion automatique en cas de coupure.
3Traçabilité complète
Chaque modification est loguée : qui, quand, valeurs avant/après. Flux d'activité en temps réel. Historique complet par entité. Quand quelque chose casse, on sait exactement ce qui s'est passé.
Résultats
Scale x10, même performance
La V1 crashait à 500k points. La V2 gère 5M+ sans broncher. Empreinte mémoire constante ~200MB. La limite est maintenant la map elle-même, plus l'outil.
Vélocité d'équipe x3
2 semaines en solo → 4 jours en équipe. Edition parallèle. Sync temps réel. Plus de conflits "qui a sauvegardé en dernier". L'outil s'efface devant le travail.
Utilisé en production au quotidien
Chaque nouveau déploiement client commence ici. Des dizaines de maps annotées. Audit intégré pour la conformité. L'outil que j'aurais aimé avoir quand j'ai commencé.
Résultats
Intéressé par ce projet ?
Contactez-moi pour en discuter ou voir une démo.