[공부] 마커 & 기하 기반 6DoF 추정: fiducial marker, PnP, LINEMOD
시리즈 개요 의 첫 번째 방법론. 딥러닝 이전부터 로봇에서 널리 쓰인 기하 기반 접근을 정리한다.
1. 핵심 아이디어: 2D–3D 대응 → PnP
기하 기반 방법의 뼈대는 알려진 3D 점과 이미지에서 관측한 2D 점의 대응(correspondence)을 만들고, 이를 만족하는 카메라-물체 변환을 푸는 것이다. 이 문제를 PnP(Perspective-n-Point) 라고 한다.
카메라 투영 모델은 다음과 같다.
\[s \begin{bmatrix} u \\ v \\ 1 \end{bmatrix} = K \,[R \mid t] \begin{bmatrix} X \\ Y \\ Z \\ 1 \end{bmatrix}\]- \(K\): 카메라 내부 파라미터(intrinsics, calibration으로 획득)
- \((X,Y,Z)\): 물체 좌표계의 3D 점 / \((u,v)\): 이미지 픽셀
- 미지수: \(R, t\) (즉 6DoF 포즈)
3D–2D 대응이 최소 3~4쌍 이상 있으면 \(R, t\) 를 풀 수 있다. 실제로 어떻게 푸는지 대표 풀이법을 하나씩 본다.
P3P: 최소 3점, 최대 4개의 해
카메라 중심 \(C\) 에서 두 3D 점 \(A, B\) 를 보는 ray 사잇각 \(\theta_{AB}\) 는 픽셀 좌표만으로 계산된다. 정규화 ray \(\hat{r} = K^{-1}[u, v, 1]^\top\) 두 개의 cosine이다. 한편 \(A, B\) 는 물체 모델의 점이므로 둘 사이 거리 \(d_{AB}\) 도 안다. 그러면 미지의 카메라-점 거리 \(a = \lVert CA \rVert,\ b = \lVert CB \rVert\) 에 대해 코사인 법칙이 성립한다.
\[d_{AB}^2 = a^2 + b^2 - 2ab\cos\theta_{AB}\]- 3쌍의 대응이면 이런 방정식이 3개, 미지수도 거리 3개(\(a, b, c\))다. 정리하면 4차 다항식이 되어 실해가 최대 4개 나온다
- 그래서 P3P는 항상 4번째 점으로 검증한다: 각 후보 pose로 4번째 점을 재투영해 가장 잘 맞는 해를 고른다
- 거리 \(a, b, c\) 가 정해지면 3D-3D 정렬(Kabsch)로 \(R, t\) 를 복원한다. OpenCV의
SOLVEPNP_P3P/SOLVEPNP_AP3P
RANSAC의 최소 표본으로 쓰이는 것이 바로 이 P3P다. 표본이 작을수록 반복 수가 기하급수로 줄기 때문이다(기하학 글의 RANSAC 참고).
DLT와 EPnP: 대응이 많을 때
- DLT: 투영행렬 \(P = K[R \mid t]\) 의 12개 원소를 통째로 선형으로 푸는 방식(6쌍 이상). 그런데 \(K\) 를 이미 아는 상황에서도 12개를 다 풀므로 낭비고, 대수적 오차 최소화라 정확도가 낮다
- EPnP (Lepetit et al., 2009): 모든 3D 점을 4개의 제어점(control point)에 대한 무게중심 좌표로 표현한다. 그러면 미지수가 제어점들의 카메라 좌표 12개로 고정되어, 대응이 \(n\) 쌍이어도 \(O(n)\) 에 풀린다. 대응이 많은 실전에서 표준 초기해
반복 정밀화: 재투영 오차 최소화
닫힌형 해(P3P/EPnP)는 초기값이고, 최종적으로는 재투영 오차를 비선형 최소화(Levenberg–Marquardt)로 다듬는다.
\[\min_{R, t} \sum_i \left\lVert\, \begin{bmatrix} u_i \\ v_i \end{bmatrix} - \pi\!\left(K, R, t, X_i\right) \right\rVert^2\]- \(\pi(\cdot)\): 3D 점 \(X_i\) 를 현재 pose로 투영하는 함수, \((u_i, v_i)\): 관측 픽셀. “지금 pose로 다시 투영하면 관측과 몇 픽셀 어긋나는가”(camera calibration의 목적함수와 같은 형태)
- 잘못된 대응(outlier)에 대비해 전체를 RANSAC으로 감싼다. OpenCV
solvePnPRansac이 P3P 표본 + EPnP/LM 정밀화의 표준 조합이다
2. 인공 마커(Fiducial Marker)
물체나 환경에 알려진 패턴의 마커를 붙이면 대응 문제를 아주 쉽고 견고하게 만들 수 있다. 마커의 네 꼭짓점은 3D 좌표가 정확히 알려져 있으므로, 이미지에서 꼭짓점만 검출하면 곧바로 PnP를 풀 수 있다.
AprilTag
- 미시간대 APRIL 연구실에서 제안(Olson, 2011). QR코드를 닮은 2D 바코드형 마커
- 서브픽셀 정확도의 코너 검출 + 해밍 거리로 안전한 ID 디코딩 → 조명/블러/부분 가림에 강인
tag36h11등 여러 태그 패밀리 제공. AprilTag 3에서는 더 유연한 레이아웃 지원- 로봇에서 hand-eye calibration, 물체 위치 기준 마커, AR 등에 광범위하게 사용
ArUco / ChArUco
- OpenCV에 내장된 마커 시스템(Garrido-Jurado, 2014). 사용이 간편
- ChArUco는 체스보드 + ArUco를 결합해 코너 정확도를 높여 calibration에 유리
검출 파이프라인: 코너는 어떻게 나오나 (AprilTag 기준)
마커 검출기가 내부에서 하는 일은 대략 네 단계다.
- 이진화·세그멘테이션: 밝기 gradient 기반으로 어두운/밝은 영역 경계를 찾는다
- quad 검출: 경계 픽셀들을 클러스터링(union-find)하고 선분을 fitting해 사각형 후보를 만든다
- 코너 서브픽셀 정밀화: 경계의 gradient에 직선을 다시 맞추고, 네 직선의 교점으로 코너를 계산한다. 픽셀 격자보다 정밀한 코너가 나오는 이유이고, PnP 정확도의 원천이다
- 디코딩: homography로 태그 내부 격자를 정면으로 펴서 비트를 샘플링하고, 태그 사전과의 해밍 거리로 ID를 확정한다. 몇 비트가 틀려도 오류 정정이 되므로 오검출이 드물다
다중 마커 / marker board
마커 하나는 대응이 코너 4개뿐이다. 노이즈에 민감하고, 일부가 가려지면 통째로 실패한다. 실전 처방은 board다.
- 여러 마커의 상대 배치를 미리 알고 있는 판(board)을 쓰면, 검출된 모든 마커의 코너를 한 번의 PnP에 몰아넣을 수 있다. 대응이 4개에서 \(4N\) 개가 되어 정확도·안정성이 크게 오른다
- 일부 마커가 가려져도 나머지로 동작한다
- ChArUco가 calibration 표준인 이유가 이것이다: 체스보드 코너(검출이 가장 정밀) + ArUco ID(어느 코너인지 전역 식별)의 결합
- 크기·거리 감각: pose 오차는 대략 (코너 픽셀 노이즈) × (거리/마커 크기)에 비례해 커진다. 특히 회전(마커 법선 방향)이 가장 먼저 무너진다. 다음 절의 ambiguity와 직결되는 문제다
매니퓰레이션 팁: 마커 기반은 정확·고속이라 calibration, 고정 지그(fixture), 알려진 부품 정렬에 특히 강력하다. 다만 실제 대상 물체마다 마커를 붙이기 어려운 경우가 많다는 게 한계다.
3. 평면 마커의 함정: pose ambiguity와 IPPE
마커의 코너 4개는 모두 한 평면 위에 있다. 평면 대상의 PnP에는 고유한 함정이 있다. 원근 효과가 약하면 서로 다른 두 pose가 거의 같은 재투영을 만든다.
- 마커가 작거나 멀면 투영이 약한 원근(weak perspective)에 가까워지고, 카메라 ray에 대해 거울상으로 기울어진 두 자세(+θ / −θ) 의 재투영 차이가 코너 노이즈보다 작아진다
- 프레임마다 노이즈에 따라 두 해가 번갈아 선택되면 pose가 덜덜 떨리며 뒤집히는(flip) 현상이 생긴다. 마커 pose의 법선 방향이 튀는 전형적인 증상
- IPPE (Collins & Bartoli, 2014): 평면 전용 풀이법으로, homography의 1차 원근 전개에서 두 후보 해를 해석적으로 모두 계산하고 각각의 재투영 오차와 함께 반환한다. 정사각 마커 전용인 OpenCV
SOLVEPNP_IPPE_SQUARE가 마커 pose의 사실상 표준이다 - 실무 처방: 두 해의 오차 비율을 확인하고, 비슷하면(모호하면) 그 프레임의 회전을 신뢰하지 않는다. 이전 프레임과의 연속성으로 해를 고르거나, 시간 필터링, 또는 board로 대응을 늘려 모호성 자체를 줄인다
아래 위젯에서 직접 확인할 수 있다. 거리를 멀리 하거나 노이즈를 키우면 두 해의 오차가 비슷해지고 flip이 시작된다.
평면 마커의 pose ambiguity: flip은 언제 일어나는가
마커가 +θ로 기울어 있다(정답, 파랑). 하지만 거울상 기울기 −θ(주황)도 비슷한 재투영을 만든다. 거리를 멀리, 노이즈를 크게 해 보면 두 해의 오차가 비슷해지고, 프레임마다 선택이 뒤집히는 flip이 눈에 보인다.
4. 마커 없이: 특징점 & template
마커를 붙일 수 없을 때는 물체 자체의 기하/외형 정보를 사용한다.
특징점 기반
- SIFT/ORB 같은 로컬 특징으로 이미지와 물체 모델(텍스처가 있는 CAD/스캔)을 매칭 → 2D–3D 대응 → PnP + RANSAC
- 무늬(texture)가 있는 물체에 잘 동작. 금속처럼 무늬 없는 물체엔 취약
template 기반: LINEMOD
- Hinterstoisser 등(2012)이 제안한 무늬 없는 물체용 고전 방법. 물체를 수천 개 시점에서 렌더링해 template을 만들고, 입력 영상과 매칭해 대략적 포즈를 찾은 뒤 depth로 ICP 정밀화한다
- 무엇을 매칭하나: 밝기 자체가 아니라 gradient의 방향(orientation), 즉 물체 윤곽에서의 gradient 방향과 (depth가 있으면) 표면 normal 방향이다. 밝기 크기와 달리 방향은 조명 변화에 불변이라 texture-less 물체의 윤곽 정보를 안정적으로 쓸 수 있다
- 왜 빠른가: 방향을 몇 개 구간으로 양자화해 비트로 표현하고, 이웃 픽셀로 방향 비트를 퍼뜨리는 spreading으로 작은 위치 어긋남을 흡수한다. 유사도 계산이 비트 연산 + 사전계산된 response map 조회가 되어, 수천 개 template을 실시간으로 매칭한다
- 딥러닝 이전 texture-less 6DoF의 사실상 표준이었고, 이후 학습 기반 방법의 비교 기준(LINEMOD 데이터셋)이 됨
5. 장단점 정리
| 항목 | 마커 기반 | 특징점/template 기반 |
|---|---|---|
| 정확도 | 매우 높음 | 물체·환경에 따라 편차 |
| 속도 | 빠름(실시간) | 중간 |
| 사전 준비 | 마커 부착 필요 | 물체 CAD/template 필요 |
| 약점 | 마커를 못 붙이는 대상 | 무늬 없음/가림에 취약 |
| 대표 용도 | calibration, 지그, AR | 알려진 부품 인식 |
정리 & 다음 글
- 뼈대는 2D–3D 대응 + PnP(+RANSAC) 이다. 마커는 이 대응을 “공짜로” 만들어 준다. P3P(최소해)·EPnP(다수 대응)·재투영 오차 정밀화가 표준 조합이다.
- 평면 마커에는 pose ambiguity가 있다. 멀거나 작은 마커의 회전은 IPPE의 두 해 오차를 확인하고, board로 대응을 늘려 방어한다.
- 통제된 환경·calibration엔 여전히 최고의 실용성을 보인다.
- 하지만 임의의 물체·무늬 없는 표면엔 한계가 있어 깊이(point cloud) 기반 정합으로 확장한다.
- 다음 글: point cloud 정합 기반 6DoF 추정