Introduction
지난 포스트에서는 Essential Matrix와 Fundamental Matrix를 이용해 Epipolar Geometry에서 카메라의 Pose ($\mathbf{R,t}$)를 추정해 봤습니다. 이제 다음 단계로 추정된 Motion을 토대로 Feature들의 3D 공간 상에서의 위치를 추정하고자 합니다. 이를 위해서는 Object의 Depth 정보가 필요한데요. 문제는 Epipolar Geometry를 사용하는 Monocular 카메라는 depth 정보를 얻을 수 없습니다. 2D 영상만으로 해당 정보를 얻기 위해서 triangulation (삼각측량법)을 사용합니다.
Triangulation
Triangulation (삼각측량법)은 다른 위치에서 같은 landmark를 포착했을 때, 관측된 위치로부터 landmark까지의 거리를 유추하는 알고리즘입니다. 이전 포스트에서 언급했듯이 단일 이미지로는 $P$(landmark)의 위치를 특정할 수 없습니다. 오직 $P$가 $Image_1$에서는 $\overrightarrow{O_1p_1}$, $Image_2$에서는 $\overrightarrow{O_2p_2}$ 위에 어느 한 점에 위치함을 알 수 있습니다. 그러나 $Image_1, Image_2$ 두 개를 모두 알고 있다면, $\overrightarrow{O_1p_1}$와 $\overrightarrow{O_2p_2}$의 교점에 $P$를 특정할 수 있게 됩니다. 이것이 삼각측량법의 기본이며 전부입니다.
Normalized coordinates의 두 feature point를 각각 $\mathbf{x_1, x_2}$라고 할 때 아래와 같은 관계식을 만들 수 있습니다. 이는 [Epipolar Geometry/01] Epipolar Constraint 게시물 내용에서 유도할 수 있으니 궁금하신 분은 읽어주세요 :D
$$s_2 \mathbf{x_2} = s_1 R \mathbf{x_1 + t}$$
Essential matrix를 구하는 과정에서 $s_1, s_2$는 homogeneous를 가정해 생략했었는데요. 이제 $\mathbf{R, t}$를 구했으니, depth에 해당하는 $s_1, s_2$를 구할 차례입니다. 둘 중에 하나를 식에서 제외함으로써 일차 방정식 풀이로 나머지 하나를 구할 수 있습니다. 아래는 $s_2$를 제거해 $s_1$을 구할 예정입니다. 거기서 구한 값을 위 식에 대입함으로써 풀이를 마무리할 수 있습니다.
$$s_2 \mathbf{[x_2]_x x_2} = 0 = s_1 \mathbf{[x_2]_x R x_1 + [x_2]_x t}, \quad \mathbf{[\cdot]_x: outer product}$$
이로서 monocular camera로 얻은 2D-2D feature point가 주어졌을 때, camera pose ($\mathbf{R,t}$) estimation과 3D mapping까지 완료했습니다. 물론 real world에서는 관측 과정에서 많은 noise가 섞일 수 있습니다. 그 경우 최악에는 triangulation을 위한 교선이 형성되지 않겠죠. 이 경우 어쩔 수 없이 least-square problem을 풀어 원하는 결과를 얻어야 합니다.
Considerations
Epipolar geometry는 2D 영상 데이터만으로 카메라의 모션과 feature의 위치를 추정할 수 있는 훌륭한 기하학(?)입니다. 하지만 부족한 정보의 간극을 메꾸기 위해 많은 가정이 들어가게 되며, 이로 인해 여러 태생적 한계가 발생하게 됩니다. 이번 챕터에서는 그러한 부분들에 대해 다루도록 하겠습니다.
Scale Ambiguity
Monocular camera를 사용할 경우 반드시 겪게 되는 scale ambiguity는 epipolar geometry에서도 여전히 존재합니다. Essential matrix를 구하는 과정에 homoegeneous 개념을 도입했고, 이는 $\mathbf{R,t}$ 중 하나는 scale 값을 갖고 있어야 합니다. 이중 $\mathbf{R}$은 자체적인 constraints들이 있으며, 이는 scale과 연관이 없습니다. 따라서, $\mathbf{t}$가 scale을 담당하게 되며, homogeneous를 가정한다는 의미는 $\mathbf{t}$ 값을 1로 normalization 한다는 의미와 같습니다.
이 순간부터 우리는 $\mathbf{t}$ 값의 단위를 알 방법이 없어집니다. 만일 1.5라는 값을 얻었다고 가정한다면, 이 값이 1.5m인지 1.5cm인지 알 방법이 없습니다. 단위와 관계없이 식은 항상 성립하기 때문이죠. 이 말은 다르게 해석하면, epipolar geometry에서 구한 trajectory와 map은 real world에서의 정확한 scale을 알 수 없으며, loop closing이 거의 필수적으로 적용되어야 함을 의미합니다. 이런 현상을 잘 설명해 주는 그림이 있어 첨부합니다.
Pure Rotation Limitation
만약 순수하게 회전만 발생하는 경우 무슨 일이 일어날까요? 이는 epipolar geometry가 많이 사용되는 robotics 분야에서는 꽤나 흔한 상황입니다. 안타깝게도 epipolar geometry는 pure rotation에 굉장히 취약합니다. 아니, 약한 걸 넘어서 아예 구할 수 없습니다. Pure rotation 상황에서의 translation은 0이 되며, 이는 essential matrix 역시 0으로 만들게 됩니다. 이렇게 되면 $\mathbf{R}$ 역시 구할 수 없는 상황이 됩니다. 그렇기 때문에 SLAM 최적화를 위해서는 robot을 회전시키며 scene을 학습시키는 것보다는, 적당히 전진과 후진, 좌우로 움직이며 scene을 학습시키는 편이 좋다고 생각합니다.
다행히 translation이 0이 아니라고 가정해 봅시다. 그런데 만약 이번에는 translation 값이 매우 작으면 어떤 결과가 나올까요?
Triangulation Contradiction
Translation이 존재하나 매우 작은 상태에서는 또 다른 문제가 생기게 됩니다. 아래 그림을 보면 쉽게 이해가 될 텐데요. 짧게 요약하면 계산 결과가 굉장히 오차가 커지거나 불확실성을 띄게 됩니다.
$O_1, O_2, t$는 미리 정의된 값으로 볼 때, feature pixel의 위치에 오차($\delta x$)가 발생할 경우 $\delta \theta$가 커집니다. $t$가 작아질수록, $\delta \theta / \delta x$의 값이 커지게 됩니다. 그렇게 되면 측정된 depth의 오차($\delta d$)가 커지게 됩니다.
그렇다면 triangulation의 정확도를 높이려면 어떻게 해야 할까요? 크게 두 방법이 있으며 아래와 같습니다.
- Feature extraction의 정확도를 높여 $\delta x$를 최소화
- Frame 간 $t$를 크게 가져가 오차에 강건하게 함
그러나 위에서 언급한 방법들은 문제점들이 있어 사용하는데 주의가 필요합니다. 우선, feature extraction의 성능을 키우기 위해서는 image resolution의 증가는 필수적입니다. 이 경우 이미지 사이즈가 커지게 되고, 불가피하게 연산량의 증가로 이어집니다. 두 번째 방법의 단점은 프레임 간 변화가 커진다는 점입니다. 숨겨져 있던 물체가 등장하기도 하고, 반대로 물체가 장애물 뒤로 사라지기도 합니다. 광원의 변화는 필연적입니다. 이렇게 변화가 커지면 feature extraction 난이도 증가로 이어지며, 최적화를 위해 사용된 여러 기법들을 무용지물로 만들어 버립니다.
결국 딜레마에 빠지게 되는데요. Translation을 증가시킬 경우 feature matching의 실패로 이어지고, 반대의 경우 triangulation의 정확도를 믿을 수 없게 됩니다. 이런 상황을 contradiction of triangulation이라고 합니다.
Feature Pairs
앞서 우리는 camera pose estimation을 위해서는 최소 5개의 매칭쌍이 필요하다고 했습니다. 그리고 linear system에서 문제를 풀기 위해 8-point algorithm을 사용했습니다. 그렇다면 매칭쌍이 너무 많아지면 무슨 문제가 있을까요? 실제로 feature matching을 하면 10개 이하의 매칭쌍만 존재하는 경우는 거의 없습니다. 적게는 수십 개, 많게는 수백 개의 매칭쌍이 인접하는 프레임 사이에 존재하는 게 보통이죠.
$$\mathbf{Ae}=0$$
이 경우 위 식에서 $\mathbf{A}$는 $8 \times 9$가 아닌 $N \times 9$가 됩니다. Overdetermined equation 문제를 풀게 되는 거죠. 사실 이 자체로는 문제가 되지 않습니다. 진짜 문제는 noise가 포함된 real world 문제에서 모든 매칭쌍을 만족시킬 수 있는 essential matrix가 존재할 수 없다는 것입니다 (매우 낮은 확률로 가능할 수도 있겠죠..?). 결국 linear equation을 푸는 간단한 문제는 least-squared problem을 푸는 문제로 변하게 됩니다.
$$\underset{e}{min} ||\mathbf{Ae}||^2_2=\underset{e}{min}\mathbf{e^T A^T Ae}$$
보기만 해도 풀기 싫게 생겼습니다. 다행히 실전에서 위 문제를 풀지는 않습니다. 연산량도 많을뿐더러, outlier가 속한 계산은 정확도를 보장하기 힘들죠. 그렇기 때문에 실전에서는 RANSAC (random sample consensus) 알고리즘을 이용해 이상한 매칭쌍들, 즉 outlier인 확률이 높은 매칭쌍들을 제거해 줍니다.