Xiang Gao, Tao Zhang 저자의 'Introduction to Visual SLAM from Theory to Practice' 책을 통해 SLAM에 대해 공부한 내용을 기록하고자 한다.
책의 내용은 주로 'SLAM의 기초 이론', 'system architecture', 'mainstream module'을 다룬다.
포스팅에는 기초 이론만 다룰 것이며, 실습을 해보고 싶다면 다음 github를 참조하자.
https://github.com/gaoxiang12/slambook2
Visual Odometry 이전 과정인 feature extraction 및 feature matching 과정에 대한 내용은 다음 글을 참조하자.
https://jjuke-brain.tistory.com/entry/Visual-Odometry-1-ORB-Feature-Feature-Matching
카메라의 motion(pose)를 추정할 때의 세 가지 경우 중 2D-2D case인 epipolar geometry를 다루는 내용은 다음을 참조하자.
목차
Triangulation
Epipolar geometry를 통해 카메라의 motion을 추정한 뒤, 이를 활용하여 feature point들의 위치를 추정해 주어야 한다.
그런데 monocular SLAM에서는 픽셀의 detph를 모르므로, triangulation을 통해 이러한 depth를 추정해줄 필요가 있다.
Triangulation이란, 같은 landmark(feature point)를 다른 위치에서 관측하고, 관측 위치와 landmark 간의 거리를 구하는 과정을 말한다.
Direct Solution
위와 같이 왼쪽 이미지가 reference인 \(I_1, I_2\) 이미지가 있다고 해보자.
카메라의 principal points \(O_1, O_2\)에 대해, \(O_1\)에서 \(O_2\)까지의 transform 을 \(\mathbf{R, t}\)로 표현한다.
\(p_1\)은 \(I_1\) 상의 feature point이며, \(p_2\)와 같은 feature를 가리킨다.
여기서 두 직선 \(\overrightarrow{O_1 p_1}\)과 \( \overrightarrow{O_2 p_2} \)는 점 \(P\)에서 교차하며, 이 점을 3D map point라 한다.
실제로 노이즈 때문에 그림과 같이 두 직선이 완전히 교차하지 않을 수 있다. (그림 상에서는 2차원으로 표현해서 교차해 보이지만, 실제로 3차원 상에서는 화면을 뚫고 들어가는 방향의 거리가 존재한다고 생각하면 된다.)
따라서 이를 least-square 개념으로 풀 수 있다.
Epipolar geometry의 정의에 따라, 두 feature points의 normalized coordinate를 각각 \(\mathbf{x}_1, \mathbf{x}_2\)라 하면 다음을 만족한다.
\( s_2 \mathbf{x}_2 = s_1 \mathbf{R} \mathbf{x}_1 + \mathbf{t} \)
이제 epipolar geometry의 결과인 \(\mathbf{R, t}\)를 바탕으로 두 feature points의 depth인 \(s_1\)과 \(s_2\)를 구하려 한다.
기하학적으로, \(I_2\)로의 projection을 \(p_2\)에 가깝게 하는 ray \(\overrightarrow{O_1 p_1}\)상의 3차원 점을 찾아볼 수 있다. (반대로 \(\overrightarrow{O_2 p_2}\)에 대해서도 가능하다.)
여러 방법이 있지만, 결과는 비슷하다. \(s_1\)을 계산해보자. 위 식에 \(\mathbf{x}_2^\wedge\)를 양변에 곱하면 다음 식을 얻는다.
\( s_2 \mathbf{x}_2^\wedge \mathbf{x}_2 = 0 = s_1 \mathbf{x}_2^\wedge \mathbf{R} \mathbf{x}_1 + \mathbf{x}_2^\wedge \mathbf{t} \)
스스로의 외적이 되므로 좌변은 영벡터가 되고, 우변은 \(s_1\)에 대한 방정식이 되어 \(s_1\)을 바로 구할 수 있다.
\(s_1\)을 구하면 \(s_2\)는 처음 식에 대입하여 쉽게 구할 수 있다.
이렇게 depth를 구할 수 있는데, 문제는 노이즈가 존재하기 때문에 epipolar geometry로 구한 \(\mathbf{R, t}\)가 위 식을 정확히 0으로 만들지 못한다는 것이다.
따라서 이와 같은 direct solution을 얻기보다 least-square solution을 얻는 방법이 더 일반적이다.
Least-square solution은 OpenCV 라이브러리에 구현되어 있다.
Limitation & Uncertainty
Triangulation을 수행할 때, 카메라가 점 \(O_1\)에서 충분히 많이 translation할 때에만 epipolar geometry에서 삼각형이 형성된다. 따라서 카메라가 회전만 할 경우에는 삼각형이 생성되지 않으므로 triangultaion을 수행할 수 없다.
또한, 아래와 같이 triangulation contradiction을 야기하는 triangulation의 uncertainty를 고려해야 한다.
Translation \(\mathbf{t}\)가 작을수록 pixel의 uncertainty \(\delta \theta\)에 의한 depth의 uncertainty \(\delta d\)가 커진다. (정량적으로 sin법칙을 통해 구해볼 수도 있다.)
Triangulation의 정확도를 높이기 위해서는 다음과 같은 방법을 사용한다.
- Feature points 추출 시 정확도를 향상시킨다. 즉, image의 resolution을 증가시킨다.
- 이는 계산량을 증가시키는 문제를 낳는다.
- Translation의 양을 증가시킨다.
- 직관적으로 생각해봐도 translation이 커질수록 보이지 않던 부분이 많이 보일 것이다. 하지만 외관이 너무 많이 바뀌어도 feature extraction과 matching이 어려워질 수 있다.
- 이러한 trade-off를 contradiction of triangulation이라 한다.
최근댓글