2D-3D 대응점

알려진 맵 안의 nn개의 3D 점 {Xi}\{\mathbf{X}_i\}와 카메라 이미지에서의 그 2D 투영점 {ui}\{\mathbf{u}_i\}가 주어지면, Perspective-n-Point (PnP) 문제는 카메라 자세 [Rt][R|\mathbf{t}]를 추정한다. 이는 맵이 이미 존재할 때 SLAM 시스템이 새 프레임마다 위치를 추정하는 표준적인 방법이다.

P3P

Perspective-3-Point 문제는 정확히 3개의 대응점을 사용한다 — 자세의 6 자유도(각 2D 점이 2개의 제약을 준다)에 맞는 최소 사례다. 기하학적으로는 고전적인 “코사인 법칙” 시스템으로 환원된다: 시선 사이의 세 각도는 이미지로부터 알 수 있고, 점 사이의 세 거리는 맵으로부터 알 수 있으며, 이로부터 최대 4개의 실수 해를 갖는 다항식 시스템이 나온다. 4번째 대응점으로 모호성을 해소한다. 필요한 점의 수가 매우 적기 때문에, P3P는 RANSAC 안에서 선택되는 최소 해법이다 — 필요한 반복 횟수는 샘플 크기에 대해 지수적으로 증가하므로, s=3s = 3은 더 큰 해법에 비해 큰 이점을 가진다.

EPnP

EPnP (Lepetit et al., 2009)는 nn개의 3D 점을 4개의 가상 제어점(virtual control point)의 가중합으로 표현하여, nn과 무관하게 12개의 미지수(카메라 프레임에서의 제어점 좌표)를 추정하는 문제로 PnP를 환원한다. O(n)O(n) 복잡도 덕분에 대규모 대응점 집합에서도 효율적이며, 많은 파이프라인의 기본값이다 (cv::solvePnP가 직접 지원한다).

DLT와 SVD의 역할

직접 선형 변환(DLT)은 n6n \geq 6개의 대응점으로부터 3×43 \times 4 투영 행렬 PP 전체를 동차 선형 시스템으로 풀어내며, SVD를 사용한다: 해는 가장 작은 특이값에 대응하는 오른쪽 특이 벡터다. 자세는 이후 P=K[Rt]P = \mathbf{K}[R|\mathbf{t}]의 분해(내부 파라미터도 모를 때는 RQ 분해)를 통해 추출된다. DLT는 더 단순하지만 EPnP보다 정확도가 낮다. 실무에서는 둘 중 하나가 재투영 오차를 최소화하여 정제되는 초기화 역할을 한다.

비선형 정제 (모션 전용 번들 조정)

어떤 해법이 초기 자세를 제공하든, 정확한 답은 맵 점을 고정한 채 자세만에 대해 재투영 오차를 최소화하는 데서 나온다:

T=argminTSE(3)iρ ⁣(uiπ(TXi)2)T^* = \arg\min_{T \in SE(3)} \sum_{i} \rho\!\left(\big\|\mathbf{u}_i - \pi(T\,\mathbf{X}_i)\big\|^2\right)

여기서 π\pi는 카메라 투영 함수이고, ρ\rho는 남아 있는 이상치의 영향을 제한하는 강건 커널(예: Huber)이다. 이는 몇 번의 반복으로 가우스-뉴턴 또는 레벤버그-마쿼트로 풀리며 — 특징 기반 SLAM에서 매 프레임마다 실행되는 “모션 전용 BA(motion-only BA)” 단계다.

일반적인 파이프라인

  1. 현재 프레임의 키포인트를 맵 점과 매칭한다 (디스크립터 매칭 또는 투영 기반 탐색).
  2. P3P를 이용한 RANSAC으로 이상치 매칭을 제거하고 초기 자세를 얻는다.
  3. 모든 인라이어에 대해 비선형 최소제곱법(재투영 오차에 강건 커널 적용)으로 자세를 정제한다.

흔한 함정

SLAM에서의 의미

PnP는 특징 기반 SLAM의 추적 근간이다: ORB-SLAM은 매 프레임마다 로컬 맵 점과 매칭하여 PnP를 풀어 추적하며, 추적 실패 후 재지역화도 장소 인식 후보에 대한 PnP다. 비주얼 로컬라이제이션 서비스(질의 이미지 대 사전 구축 맵)가 카메라 자세를 계산하는 방식도 마찬가지다. 2D-2D(초기화)와 3D-3D(포인트 클라우드 정렬)와 함께, PnP는 모든 SLAM 엔지니어가 알아야 할 세 가지 대응점 문제의 삼두마차를 완성한다.

실습

관련 문서