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

ICP는 최근접 이웃 대응과 강체 변환 추정을 번갈아 수행합니다. 잔차가 작다고 해서 복원된 자세가 정확하다는 것을 의미하지는 않습니다. 간단한 2D 형상을 사용하면 센서 노이즈 없이 초기화, 이상치 및 대칭성을 분리할 수 있습니다.

목표

이 구현은 점 간 거리 제곱을 최소화합니다. 각 반복에서 변환된 소스 포인트에 대한 목표 이웃을 찾고, 거리 임계값 내의 일치 항목을 유지하며, 특이값 분해(SVD)를 사용하여 회전/변환을 추정합니다. 행렬식 보정을 통해 반사를 방지합니다. 최대 100회 반복 후 종료됩니다. Open3D ICP 튜토리얼에서는 점 간 및 점-평면 목표를 구분하지만, 여기서는 점 간 목표만 구현했습니다.

입력 및 실행

스크립트를 다운로드하고 python3 engineering_labs.py를 실행하세요. Python 3.12.3, NumPy 1.26.4, Matplotlib 3.6.3 환경에서 테스트되었습니다. Open3D는 필수 사항이 아니며, Open3D 구현과의 속도 비교는 아닙니다.

목표는 3m와 2m 세그먼트로 구성된 L자 모양이며, 총 102개의 점으로 이루어져 있고, 한 모서리는 중복되어 있습니다. 소스 포인트는 실제 20° 회전과 (0.4, -0.3)m 이동의 역변환을 통해 생성됩니다. 센서 노이즈는 추가되지 않았습니다. 양호한 초기값은 18° 회전과 (0.35, -0.25)m 이동이고, 불량한 초기값은 110° 회전과 (1.5, 1)m 이동입니다.

세 가지 유형의 증거 읽기

잔차는 허용된 최근접 이웃 거리 대비 RMSE를 의미합니다. 커버리지는 임계값 내에 있는 모든 소스 포인트의 비율입니다. 합성 정답 데이터에는 회전 및 이동 오류도 허용됩니다.

조건 임계값 [m] 잔차 [m] 커버리지 회전 오차 [°] 이동 오차 [m]
양호한 초기화 0.5 0.023 1.000 1.258 0.055
불량한 초기화 0.5 0.151 0.539 171.699 2.519
이상치 30개, 넓은 임계값 10 1.117 1.000 71.412 2.657
이상치 30개, 좁은 임계값 0.5 0.023 0.773 1.258 0.055
대칭 원, 초기 회전 90° 0.5 약 0 1.000 90,000 대략 0
Diagram 1 · Use the button to switch views
합성 ICP 결과: 파란색 목표물, 주황색 정렬된 소스, 축 단위는 미터입니다.

초기화가 잘 되었음에도 불구하고 오류가 발생합니다. 규칙적으로 샘플링된 세그먼트의 인접점들 때문에 로컬 솔루션이 어긋나 있습니다. 커버리지 1,000만으로는 이 오류를 놓칠 수 있습니다. 이상치는 소스의 x=4–7m, y=3m에 있습니다. 목표물, 이상치 입력/출력 및 요약을 다운로드하십시오.

원과 벽에서 관측 불가능한 방향

원은 반지름이 1m이고 120개의 점으로 이루어져 있으며, 항등 변환이 참 변환으로 정의됩니다. 점 집합은 90° 회전 후에도 일치하므로, 실질적으로 0에 가까운 잔차와 90° 포즈 오차가 공존합니다. 추가 반복으로는 누락된 정보를 보충할 수 없습니다.

벽은 관련은 있지만 다른 문제를 제기합니다. 점 대 평면 오차는 벽 법선 방향의 변위를 측정하며 접선 방향의 움직임을 제대로 제약하지 못합니다. 유한한 점 대 점 벽은 끝점과 점 배치로부터 정보를 얻을 수 있지만, 끝점이 보이지 않는 긴 복도에서는 이러한 정보의 활용도가 떨어집니다. 원은 실행된 실험 결과이며, 벽에 대한 논의는 목적 함수의 방향 제약 조건을 설명합니다.

더 작은 임계값이 만능 해결책은 아닙니다

0.5m 임계값은 이러한 이상치를 제거하지만, 초기화 지점이 멀리 떨어져 있을 경우 정확한 대응점까지 제거할 수 있습니다. 서로 다른 임계값은 서로 다른 점을 선택하므로 잔차만으로는 직접 비교할 수 없습니다. 이 코드는 허용된 점이 세 개 미만일 경우 업데이트를 중지합니다. 하지만 세 개의 점만으로는 정확한 형상을 보장할 수 없습니다.

실질적인 해결책으로는 주행 거리계 초기화, 세밀한 정렬, 이상치 필터링, 다양한 방향으로 표면 관찰 등이 있습니다. 동일한 간격과 기준 조건에서 이러한 방법들의 효과를 측정하십시오.

SLAM 평가 계속

이것은 단일 프레임 2D 정합이며, 3D 주행 정확도 또는 이동 객체 강건성 테스트가 아닙니다. SLAM 평가에서는 궤적 오차, 타이밍 정렬 및 실패한 구간을 추가로 고려합니다. 먼저 초기 각도만 변경하여 수렴이 하나의 잔차 값으로 요약될 수 없는 이유를 확인하십시오.

동일한 계산을 로컬에서 실행

실행 가능한 전체 소스 ZIP을 압축 해제하거나, 실험 진입점, 생성된 커널 및 원본 PID 소스를 하나의 폴더에 저장하십시오. PID는 Python 표준 라이브러리를 사용하고, Kalman 및 ICP는 NumPy를 필요로 합니다. 원래 그림 생성 명령은 그대로 사용할 수 있습니다.

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

bad_init, outliers 및 symmetric_ring을 시도해 보세요. 이상치에 대한 임계값 10과 0.5를 비교해 보세요. 잔차가 거의 0에 가까운 경우에도 링이 90도 회전 오차를 유지할 수 있는지 확인하세요.

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.SLAM 평가 방법 — ATE, RPE, 런타임 및 실패율Explore another aspect of this fieldROS 2에서 지도 제작부터 내비게이션까지 — Jazzy와 Nav2를 활용한 최소한의 절차Explore another aspect of this fieldrosbag2를 사용하여 로봇 오류를 재현합니다: 입력, TF 및 시간