Contents — find the section you need

Change parameters and verify

Open the panel, then press Run to load Python. You can stop execution and reset parameters. Results are computed on this device. No Python installation is required.

Local execution steps below are optional for reproducing the source results; they are not required for the browser experiment.

The experiment controls are in English.

Open experiment panel in a new tab

Download reproduction source

L'algorithme ICP alterne entre la correspondance des plus proches voisins et l'estimation par transformation rigide. Un résidu plus faible ne garantit pas l'exactitude de la pose reconstruite. Des formes 2D simples permettent d'isoler l'initialisation, les valeurs aberrantes et la symétrie, indépendamment du bruit du capteur.

Objectif

Cette implémentation minimise les carrés des distances point à point. À chaque itération, elle recherche les voisins cibles des points sources transformés, conserve les correspondances à une distance inférieure à un seuil et estime la rotation/translation par SVD. Une correction du déterminant empêche la réflexion. L'algorithme s'arrête après 100 itérations au maximum. Le tutoriel Open3D ICP distingue les objectifs point à point et point à plan ; seul le premier est implémenté ici.

Entrées et exécution

Téléchargez le script et exécutez-le. Ce test a été réalisé avec Python 3.12.3, NumPy 1.26.4 et Matplotlib 3.6.3. Open3D n'est pas requis et cette comparaison de performances n'est pas effectuée avec son implémentation.

La cible est un L composé de segments de 3 m et 2 m, soit 102 points au total, avec un coin dupliqué. Les points sources sont générés par l'inverse d'une rotation réelle de 20° et d'une translation de (0,4 ; −0,3) m. Aucun bruit de capteur n'est ajouté. L'initialisation correcte est de 18° et (0,35 ; −0,25) m ; la mauvaise est de 110° et (1,5 ; 1) m.

Lire trois types de données

Le résidu correspond à l'erreur quadratique moyenne (RMSE) calculée sur les distances aux plus proches voisins acceptées. La couverture représente la fraction de tous les points sources situés à l'intérieur du seuil. La vérité terrain synthétique autorise également les erreurs de rotation et de translation.

Condition Seuil [m] Résidu [m] Couverture Erreur de rotation [°] Erreur de translation [m]
Bonne initialisation 0,5 0,023 1,000 1,258 0,055
Mauvaise initialisation 0,5 0,151 0,539 171,699 2,519
30 valeurs aberrantes, seuil large 10 1,117 1,000 71,412 2,657
30 valeurs aberrantes, seuil étroit 0,5 0,023 0,773 1,258 0,055
Cercle symétrique, rotation initiale de 90° 0,5 environ 0 1,000 90 000 environ 0
Diagram 1 · Use the button to switch views
Résultats ICP synthétiques : cible bleue, source alignée orange, axes en mètres.

Même une bonne initialisation laisse une erreur : les points voisins sur les segments régulièrement échantillonnés permettent une solution locale décalée. Une couverture de 1 000 à elle seule ne suffirait pas. Les valeurs aberrantes se situent à la source, x = 4–7 m, y = 3 m. Téléchargez la cible, les entrées/sorties des valeurs aberrantes et le résumé.

Directions inobservables dans les cercles et les murs

Le cercle a un rayon de 1 m et 120 points, l’identité étant définie comme la transformation réelle. Son ensemble de points correspond également après une rotation de 90°, de sorte qu’un résidu pratiquement nul coexiste avec une erreur de pose de 90°. Des itérations supplémentaires ne peuvent pas fournir les informations manquantes.

Un mur pose un problème similaire, mais différent. L'erreur point-plan mesure le déplacement le long de la normale au mur et contraint mal le mouvement tangentiel. Les murs finis point à point peuvent tirer des informations des extrémités et de l'emplacement des points, mais cette méthode s'avère peu efficace dans un long couloir sans extrémités visibles. Le cercle représente une expérience réalisée ; la discussion sur le mur explique les contraintes directionnelles de l'objectif.

Un seuil plus bas n'est pas une solution universelle

Le seuil de 0,5 m élimine ces valeurs aberrantes, mais peut également supprimer des correspondances correctes lorsque l'initialisation est éloignée. Différents seuils sélectionnent différents points, de sorte que les résidus seuls ne sont pas directement comparables. Ce code cesse de se mettre à jour avec moins de trois points acceptés ; trois points ne garantissent pas à eux seuls une bonne géométrie.

Les options pratiques incluent l'initialisation de l'odométrie, l'alignement grossier-fin, le filtrage des valeurs aberrantes et l'observation de surfaces avec différentes orientations. Mesurez leurs effets sur les mêmes intervalles et dans les mêmes conditions de référence.

Poursuivre avec l'évaluation SLAM

Il s'agit d'un recalage 2D sur une seule image, et non d'un test de précision de conduite 3D ou de robustesse face aux objets en mouvement. L'évaluation SLAM (/fr/blog/posts/slam-evaluation.html) ajoute les erreurs de trajectoire, l'alignement temporel et les intervalles ayant échoué. Commencez par modifier uniquement l'angle initial pour comprendre pourquoi la convergence ne peut être résumée par une seule valeur résiduelle.

Exécuter le même calcul localement

Extrayez le fichier ZIP contenant le code source complet et exécutable (/uploads/labs/playground/lab-sources.zip) ou enregistrez le point d'entrée de l'expérience (/uploads/labs/playground/experiment.py), les noyaux générés (/uploads/labs/playground/kernels.py) et le code source PID original (/uploads/labs/pid_lab.py) dans un même dossier. PID utilise la bibliothèque standard Python ; Kalman et ICP nécessitent NumPy. Les commandes de génération de figures originales restent disponibles.

python3 -m pip install numpy==1.26.4
python3 experiment.py icp --parameters '{"case":"good_init","threshold":0.5}' > result.json

Essayez bad_init, outliers et symmetric_ring. Comparez les seuils 10 et 0,5 pour la détection des valeurs aberrantes. Vérifiez que la bague conserve une erreur de rotation de 90 degrés même avec un résidu quasi nul.

Code, data and reproduction

The ZIP contains the same computation code as the browser, synthetic data and comparison cases. These are not physical measurements.

Download reproduction package · Instructions (EN/JA) · Files and experiment conditions (JSON)

Extract the ZIP into a new directory, then run:

python3 reproduce.py --experiment icp

This Lab compares 5 cases. PID uses Python’s standard library; Kalman/ICP require NumPy. See the instructions for dependencies and tested versions.

Related reading

Separate point-cloud residuals from trajectory correctness.Comment évaluer le SLAM — ATE, RPE, temps d’exécution et défaillancesExplore another aspect of this fieldDe la cartographie à la navigation dans ROS 2 — une procédure minimale Jazzy et Nav2Explore another aspect of this fieldReproduire les pannes du robot avec rosbag2 : entrées, TF et temps