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.
O ICP alterna entre correspondência de vizinhos mais próximos e estimativa de transformação rígida. Um resíduo menor não prova que a pose recuperada está correta. Formas 2D simples permitem isolar a inicialização, outliers e simetria sem ruído do sensor.
Objetivo
Esta implementação minimiza as distâncias ponto a ponto ao quadrado. Cada iteração encontra vizinhos alvo para pontos de origem transformados, mantém as correspondências dentro de um limite de distância e estima a rotação/translação por SVD. Uma correção de determinante evita a reflexão. O processo para após, no máximo, 100 iterações. O tutorial Open3D ICP distingue objetivos ponto a ponto e ponto a plano; apenas o primeiro é implementado aqui.
Entradas e execução
Baixe o script e execute python3 engineering_labs.py . O teste foi realizado com Python 3.12.3, NumPy 1.26.4 e Matplotlib 3.6.3. O Open3D não é necessário, e esta não é uma comparação de velocidade com sua implementação.
O alvo é um L formado por segmentos de 3 m e 2 m, totalizando 102 pontos com um canto duplicado. Os pontos de origem são gerados pelo inverso da rotação real de 20° e translação de (0,4, −0,3) m. Nenhum ruído do sensor é adicionado. A inicialização correta é de 18° e (0,35, −0,25) m; a incorreta é de 110° e (1,5, 1) m.
Leia três tipos de evidência
Resíduo significa RMSE sobre as distâncias aceitas do vizinho mais próximo. Cobertura é a fração de todos os pontos de origem dentro do limite. A verdade fundamental sintética também permite erros de rotação e translação.
| Condição | Limite [m] | Resíduo [m] | Cobertura | Erro de rotação [°] | Erro de translação [m] |
|---|---|---|---|---|---|
| Boa inicialização | 0,5 | 0,023 | 1,000 | 1,258 | 0,055 |
| Má inicialização | 0,5 | 0,151 | 0,539 | 171,699 | 2,519 |
| 30 outliers, limiar amplo | 10 | 1,117 | 1,000 | 71,412 | 2,657 |
| 30 outliers, limiar estreito | 0,5 | 0,023 | 0,773 | 1,258 | 0,055 |
| Círculo simétrico, rotação inicial de 90° | 0,5 | aproximadamente 0 | 1,000 | 90.000 | aproximadamente 0 |
Mesmo uma boa inicialização deixa um erro: pontos vizinhos em segmentos amostrados regularmente permitem uma solução local deslocada. A cobertura 1.000 sozinha não detectaria o erro. Os outliers estão na fonte x=4–7 m, y=3 m. Baixe o alvo, entrada/saída de outliers e resumo.
Direções não observáveis em círculos e paredes
O círculo tem raio de 1 m e 120 pontos, com a identidade definida como a transformação verdadeira. Seu conjunto de pontos também coincide após uma rotação de 90°, portanto, essencialmente zero resíduo coexiste com um erro de pose de 90°. Mais iterações não podem fornecer informações faltantes.
Uma parede apresenta um problema relacionado, mas diferente. O erro ponto-plano mede o deslocamento ao longo da normal da parede e restringe pouco o movimento tangencial. Paredes com erro ponto-a-ponto finito podem obter informações dos pontos finais e do posicionamento dos pontos, mas isso se torna insuficiente em um corredor longo sem pontos finais visíveis. O círculo representa um experimento executado; a discussão sobre a parede explica as restrições direcionais do objetivo.
Um limite menor não é uma solução universal
O limite de 0,5 m remove esses outliers, mas também pode eliminar correspondências corretas quando a inicialização é feita muito distante. Limiares diferentes selecionam pontos diferentes, portanto, os resíduos sozinhos não são diretamente comparáveis. Este código para de atualizar com menos de três pontos aceitos; três pontos, por si só, não garantem uma boa geometria.
Opções práticas incluem inicialização da odometria, alinhamento de grosso para fino, filtragem de outliers e observação de superfícies com diferentes orientações. Meça seus efeitos nos mesmos intervalos e condições de referência.
Continuação para avaliação SLAM
Este é um registro 2D de quadro único, não um teste de precisão de direção 3D ou robustez a objetos em movimento. A avaliação SLAM adiciona erros de trajetória, alinhamento de tempo e intervalos de falha. Varie apenas o ângulo inicial primeiro para ver por que a convergência não pode ser resumida por um único valor residual.
Execute o mesmo cálculo localmente
Extraia o arquivo ZIP executável completo, ou salve o ponto de entrada do experimento, os kernels gerados e o código-fonte PID original em uma pasta. O PID usa a biblioteca padrão do Python; Kalman e ICP requerem NumPy. Os comandos originais de geração de figuras permanecem disponíveis.
python3 -m pip install numpy==1.26.4
python3 experiment.py icp --parameters '{"case":"good_init","threshold":0.5}' > result.json
Experimente bad_init, outliers e symmetric_ring. Compare os limiares 10 e 0,5 para outliers. Verifique se o anel consegue manter um erro de rotação de 90 graus mesmo com resíduo próximo de 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.
Comentários
Entre na sua conta para continuar.
Ainda não há dados.