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'algoritmo ICP alterna la corrispondenza tra punti vicini e la stima tramite trasformazione rigida. Un residuo più piccolo non dimostra che la posa ricostruita sia corretta. Semplici forme 2D ci permettono di isolare l'inizializzazione, i valori anomali e la simmetria senza rumore del sensore.

Obiettivo

Questa implementazione minimizza le distanze punto-punto al quadrato. Ogni iterazione individua i punti vicini target per i punti sorgente trasformati, mantiene le corrispondenze entro una soglia di distanza e stima la rotazione/traslazione tramite SVD. Una correzione del determinante impedisce la riflessione. L'algoritmo si arresta dopo al massimo 100 iterazioni. Il tutorial ICP di Open3D distingue tra obiettivi punto-punto e punto-piano; qui viene implementato solo il primo.

Input ed esecuzione

Scarica lo script ed esegui python3 engineering_labs.py . È stato testato con Python 3.12.3, NumPy 1.26.4 e Matplotlib 3.6.3. Open3D non è richiesto e questo non è un confronto di velocità con la sua implementazione.

L'obiettivo è una L composta da segmenti di 3 m e 2 m, per un totale di 102 punti con un angolo duplicato. I punti sorgente sono generati dall'inverso della rotazione reale di 20° e dalla traslazione di (0,4, -0,3) m. Non è stato aggiunto alcun rumore del sensore. L'inizializzazione corretta è 18° e (0,35, -0,25) m; quella errata è 110° e (1,5, 1) m.

Lettura di tre tipi di evidenza

Il residuo indica l'RMSE sulle distanze accettate tra i punti più vicini. La copertura è la frazione di tutti i punti sorgente entro la soglia. La verità di base sintetica consente anche errori di rotazione e traslazione.

Condizione Soglia [m] Residuo [m] Copertura Errore di rotazione [°] Errore di traslazione [m]
Inizializzazione corretta 0,5 0,023 1,000 1,258 0,055
Inizializzazione errata 0,5 0,151 0,539 171,699 2,519
30 outlier, soglia ampia 10 1,117 1,000 71,412 2,657
30 outlier, soglia stretta 0,5 0,023 0,773 1,258 0,055
Cerchio simmetrico, rotazione iniziale di 90° 0,5 circa 0 1.000 90.000 circa 0
Diagram 1 · Use the button to switch views
Risultati ICP sintetici: bersaglio blu, sorgente allineata arancione, assi in metri.

Anche una buona inizializzazione lascia un errore: i punti vicini su segmenti campionati regolarmente consentono una soluzione locale traslata. Una copertura di 1.000 da sola non lo rileverebbe. I valori anomali si trovano alla sorgente x=4–7 m, y=3 m. Scarica il bersaglio, input/output dei valori anomali e riepilogo.

Direzioni non osservabili in cerchi e pareti

Il cerchio ha raggio 1 m e 120 punti, con l'identità definita come la vera trasformazione. Il suo insieme di punti corrisponde anche dopo una rotazione di 90°, quindi un residuo praticamente nullo coesiste con un errore di posa di 90°. Un numero maggiore di iterazioni non può fornire le informazioni mancanti.

Un muro presenta un problema correlato ma diverso. L'errore punto-piano misura lo spostamento lungo la normale al muro e vincola in modo inadeguato il movimento tangenziale. I muri finiti punto-punto possono ottenere informazioni dai punti finali e dal loro posizionamento, ma questo diventa inefficace in un corridoio lungo senza punti finali visibili. Il cerchio è un esperimento eseguito; la discussione sul muro spiega i vincoli direzionali dell'obiettivo.

Una soglia più bassa non è una soluzione universale

La soglia di 0,5 m elimina questi valori anomali, ma può anche eliminare corrispondenze corrette quando l'inizializzazione è lontana. Soglie diverse selezionano punti diversi, quindi i soli residui non sono direttamente confrontabili. Questo codice interrompe l'aggiornamento con meno di tre punti accettati; tre punti non sono di per sé una garanzia di una buona geometria.

Le opzioni pratiche includono l'inizializzazione dell'odometria, l'allineamento dal generale al particolare, il filtraggio dei valori anomali e l'osservazione di superfici con orientamenti diversi. Misurare i loro effetti sugli stessi intervalli e nelle stesse condizioni di riferimento.

Proseguire con la valutazione SLAM

Si tratta di una registrazione 2D a singolo fotogramma, non di un test di precisione di guida 3D o di robustezza con oggetti in movimento. La valutazione SLAM aggiunge errori di traiettoria, allineamento temporale e intervalli falliti. Variare inizialmente solo l'angolo iniziale per capire perché la convergenza non può essere riassunta da un singolo valore residuo.

Eseguire lo stesso calcolo in locale

Estrarre il file ZIP completo del codice sorgente eseguibile, oppure salvare il punto di ingresso dell'esperimento, i kernel generati e il codice sorgente PID originale in una cartella. Il PID utilizza la libreria standard di Python; Kalman e ICP richiedono NumPy. I comandi originali per la generazione della figura rimangono disponibili.

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

Prova bad_init, outliers e symmetric_ring. Confronta le soglie 10 e 0,5 per gli outlier. Verifica che l'anello sia in grado di mantenere un errore di rotazione di 90 gradi anche con un residuo prossimo allo zero.

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.Come valutare SLAM: ATE, RPE, tempo di esecuzione e guastiExplore another aspect of this fieldDalla mappatura alla navigazione in ROS 2: una procedura minimale con Jazzy e Nav2.Explore another aspect of this fieldRiproduzione dei guasti del robot con rosbag2: input, TF e tempo