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°.
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.
| Capteur | Fréquence | Apport | Rôle dans le pipeline |
|---|---|---|---|
| Ping360 sonar rotatif mécanique |
~1 sweep/2 s | X, 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 Hz | roll, 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 Hz | profondeur 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 Hz | hauteur 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 fps | texture 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 |
continu | imagerie 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. |
Le ROV parcourt la chambre. Comparez dead-reckoning IMU seul vs recalage Ping360.
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.
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.
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).
Pièce en L non convexe avec niches. Portée sonar limitée à ~5 m. Le ROV ne voit jamais toute la pièce d'un coup. La carte s'accumule submap par submap. Dans le long couloir, la dérive longitudinale persiste (dégénérescence sonar parallèle). La fermeture de boucle la corrige brutalement.
Dans un couloir droit, les murs parallèles forment une géométrie symétrique selon l'axe longitudinal.
L'ICP ne peut pas distinguer un décalage avant/arrière — il y a une infinité de solutions équivalentes.
La dérive longitudinale persiste même avec scan-matching. La fermeture de boucle (loop closure) résout ce problème:
quand le ROV revient près d'un keyframe ancien, on détecte la correspondance par comparaison de scan, on ajoute une contrainte
dans le pose-graph, et une optimisation globale (g2o / linéarisée) corrige toutes les poses d'un coup.