commit 7171e58c4db561c1ceee1af70a369723410525c9 Author: Flag Date: Sat Jun 6 19:16:42 2026 +0000 feat(moulin-mapper): initial — démo web scan-matching Ping360 + ICP 2D diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e1cec4a --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +data/raw/ +*.bag +*.mcap +__pycache__/ +*.pyc +.DS_Store diff --git a/README.md b/README.md new file mode 100644 index 0000000..594d1ec --- /dev/null +++ b/README.md @@ -0,0 +1,43 @@ +# moulin-mapper + +Cartographie ROV multi-capteurs d'une chambre de moulin à marée, sans GPS ni USBL. + +## Principe + +Le ROV se positionne relativement aux **murs fixes** détectés par le Ping360 (scan-matching / ICP 2D), sans dérive cumulative. L'axe Z (colonne d'eau) est donné par la pression (profondeur) + Ping1D (hauteur fond). + +## Capteurs + +| Capteur | Rôle | +|---|---| +| Ping360 | Position X, Y, cap (scan-matching) | +| IMU | Attitude + prédiction haute fréquence | +| Pression | Profondeur sous surface (Z haut) | +| Ping1D | Hauteur au-dessus du fond (Z bas) | +| Caméra frontale | Odométrie visuelle, texture | +| 2 caméras latérales | Imagerie murs, stéréo éventuel | +| 2 side-scans | Imagerie fond et murs | + +## Structure + +``` +web/ → démo interactive (1 fichier HTML autonome) +pipeline/ → traitement données réelles (Python, à venir) +docs/ → rapports, notes techniques +data/ → données brutes et traitées +``` + +## Démo + +Page de démonstration : https://laboratoire.freeboxos.fr/moulin-mapper/ + +## Livrables + +- Plan de la chambre (contour 2D, DXF) +- Nuage de points 3D (`.ply` / `.las` / `.e57`) +- Hauteur d'eau, dimensions, verticalité des murs +- Trajectoire ROV annotée + +## Contact + +Cosma / Silent Flow — moulin à marée project diff --git a/web/index.html b/web/index.html new file mode 100644 index 0000000..4818340 --- /dev/null +++ b/web/index.html @@ -0,0 +1,1391 @@ + + + + + +Moulin à marée — cartographie ROV sans GPS + + + + + + + +
+

Moulin à marée
cartographie ROV sans GPS

+

+ Une chambre maçonnée partiellement inondée, géométrie inconnue. + Pas de GPS, pas d'USBL, pas de DVL — mais des murs fixes et un sonar 360°. +

+
+ Ping360 · scan-matching ICP + Plan + nuage 3D + Dérive IMU annulée +
+
+ + +
+

01 Le problème

+

+ Un moulin à marée possède une ou plusieurs chambres maçonnées sous le niveau de la mer, inondées + à marée haute. Ces chambres ont une géométrie unique — souvent un plan rectangulaire avec une + abside courbe à une extrémité — mais leur plan précis est inconnu (aucun relevé + ou archive). Elles peuvent être accessibles par un ROV de 450 mm de diamètre, mais pas par un + plongeur en sécurité. +

+

+ Le défi de positionnement: dans un espace confiné en maçonnerie, le GPS n'a aucun signal, + l'USBL nécessite un angle dégagé vers la surface (impossible sous voûte), et l'IMU seule accumule + une dérive de position croissante proportionnelle à √t. En 2–3 minutes, l'erreur + dépasse la taille de la pièce, rendant toute carte exploitable impossible. +

+

+ Solution: les murs de la chambre sont fixes et connus une fois le premier tour + effectué. Le Ping360 mesure les distances sur 360°. En recalant (scan-matching) chaque + nouveau balayage sur la carte accumulée, on obtient la correction de pose à chaque sweep — + l'erreur de position reste bornée quelle que soit la durée de la mission. +

+
+ + +
+

02 Suite capteurs BlueROV

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
CapteurFréquenceApportRôle dans le pipeline
Ping360
sonar rotatif mécanique
~1 sweep/2 sX, Y cap + Coupe horizontale 360°. Mesure la distance aux murs dans toutes les directions. + Chaque sweep donne ~400 points → scan-matching ICP → pose ROV recalée. +
IMU
accéléro + gyro + magnéto
100 Hzroll, pitch, yaw + Prédiction haute fréquence entre sweeps. Le yaw est fusionné avec le cap Ping360 recalé + pour éviter l'accumulation. Roll/pitch améliorent la correction de la coupe 2D inclinée. +
Capteur de pression
Bar30 / BlueRobotics
10 Hzprofondeur Z + Donne la profondeur absolue sous la surface de l'eau. Combiné avec la cote + de marée du moment → altitude absolue par rapport au fond de la chambre. +
Ping1D
altimètre acoustique
5–15 Hzhauteur fond + Distance au fond maçonné directement sous le ROV. Permet de "coller" la coupe + sonar à la bonne hauteur Z dans le volume 3D. Détecte aussi la voûte si orienté vers le haut. +
Caméra frontale
+ 2 caméras latérales
30 fpstexture X, Y local + Structure From Motion sur les séquences → texture des murs, photogrammétrie locale. + Raffinement de la carte dans les zones à fort contraste visuel (joints, pierres). +
Side-scan sonars ×2
imagerie acoustique latérale
continuimagerie murs + Imagerie acoustique des parois latérales pendant le déplacement. Détecte + fissures, joints, zones de décollement. Complément aux caméras dans l'eau turbide. +
+
+ + +
+
+

03 Démonstration — scan-matching ICP (vue de dessus)

+

+ Le ROV parcourt la chambre. Comparez dead-reckoning IMU seul vs recalage Ping360. +

+ +
+ + + + + +
+
+ Temps: + + 0 s +
+ +
+ + +
+
+
+ + +
+
+
+

04 Reconstruction 3D — nuage de points extrudé

+

+ Le contour 2D reconstruit est extrudé entre le fond (Ping1D) et la surface (pression). + Rotation à la souris. Cliquez "Exporter .ply" pour télécharger un vrai fichier PLY ASCII. +

+
+ +
+

Déplacez la souris sur le canvas 2D pour explorer, puis générez la 3D.

+ + +
+
Points:
+
Hauteur colonne:
+
Surface plan:
+
+
+
+
+ + +
+

05 Pourquoi ça marche

+

+ La chambre du moulin est un espace statique et rigide. Les murs ne bougent pas. + Cette propriété triviale est la clé du positionnement: on peut traiter le contour des murs comme + une référence absolue locale — une "carte" qui ne dérive pas, contrairement à toute mesure + inertielle. +

+

+ À chaque sweep complet du Ping360 (~2 s), on obtient une nouvelle coupe 2D des murs. + L'algorithme ICP (Iterative Closest Point) trouve la transformation rigide + (rotation + translation) qui aligne au mieux ces points sur la carte accumulée. + Cette transformation corrige la pose estimée du ROV sans aucune infrastructure + externe. C'est une fermeture de boucle permanente — à chaque tour du sonar. +

+ +
+

Encart mathématique

+

Dead-reckoning IMU seul: l'erreur de position croît comme σ_pos ∝ √t + (marche aléatoire). Après 3 min, avec σ_acc = 0.05 m/s², l'erreur typique dépasse 1 m.

+ +

Avec ICP: à chaque sweep, on minimise + E = Σ ||q_i − (R·p_i + t)||² sur les paires (point scan courant p_i, + point carte le plus proche q_i). L'erreur résiduelle est bornée par la précision du Ping360 + (~5 cm) et non par le temps — c'est une contrainte absolue renouvelée toutes les 2 s.

+ +

Convergence ICP 2D: en espace contraint et plan, + 5–10 itérations suffisent (l'initialisation par l'IMU est proche de la solution). La solution + unique existe si la chambre n'est pas circulaire — ce qui est le cas ici (4 coins + abside).

+ +

Z (profondeur): Z_abs = -P/(ρg) + (pression Bar30). Z_fond = Z_abs - alt_Ping1D. Pas de dérive: les deux capteurs + sont absolus (l'un par rapport à la surface, l'autre par rapport au fond local).

+
+
+ + +
+

06 Données extraites — livrables

+
+
+
📐
+
Plan/contour DXF
+
Contour 2D de la chambre, dimensions cotées, exportable CAD/GIS
+
+
+
+
Nuage de points .ply/.las
+
Volume 3D complet, compatible CloudCompare / ArcScene / Blender
+
+
+
📏
+
Dimensions chambre
+
Longueur, largeur, rayon abside, hauteur d'eau à la date de mission
+
+
+
📊
+
Hauteur colonne d'eau
+
Profil vertical pression → fond, évolution pendant la mission
+
+
+
🏗
+
Verticalité des murs
+
Détection d'aplomb / dévers par comparaison des coupes à différentes profondeurs
+
+
+
🛰
+
Trajectoire ROV
+
Chemin parcouru dans le référentiel chambre, qualité de couverture sonar
+
+
+
📸
+
Mosaïque photo
+
Imagerie texturée des parois depuis caméras latérales + side-scans
+
+
+
📄
+
Rapport mission PDF
+
Synthèse: plan, métriques, observations, recommandations patrimoniales
+
+
+
+ + + + + +