초창기의 SLAM 은 주로 Filter 기반 (Kalman filter, Particle filter 등) 으로 수행되었지만 몇 년 전부터 Graph 기반 SLAM 으로 완전히 트렌드가 바뀌었습니다. Graph 기반 SLAM 에서 에러를 보정하기 위한 마지막 단계로 자주 수행되는 것이 Bundle Adjustment 입니다.
Structure From Motion
Structure from motion 은 2 장 이상의 이미지에서 대응점이 주어졌을 때, 3D 좌표와 카메라 파라미터 (여기서는 카메라 간의 Rotation / Translation) 을 구하는 것을 의미합니다.
이는 다음과 같은 과정으로 수행됩니다.
1. 같은 장면을 촬영한 이미지 여러 장을 모은다.
2. 특징점을 추출한다. (SIFT 등으로)
3. 특징점 매칭을 수행한다.
4. RANSAC 을 통해서 각 이미지 쌍 사이의 Fundamental Matrix 를 구한다.
5. Image Connectivity Graph 를 만들기도 한다. (optional) (ORB-SLAM 에서의 Covisibility Graph 처럼)
이때 문제가 되는 부분은, 여러 장의 이미지를 다루게 되면서 오차가 누적된다는 것입니다. 따라서 이 에러들을 한꺼번에 최소화할 수 있는 방법으로 나온 것이 Bundle Adjustment 입니다.
Bundle Adjustment
BA 는 3D point 의 좌표와 Camera Pose 를 조정하여, Reprojection 에러를 최소화하는 방법입니다.
Bundle 은 그림에서 하늘색 선 (ray) 를 의미합니다. 따라서 Bundle Adjustment 는 이 선들을 조정한다는 뜻입니다.
일반적으로 BA (Bundle Adjustment) 에서 Feature 들은 '정답'으로 보고, 우리가 추정한 것들 (Rotation / Translation, 3D point 의 좌표 등) 을 조정의 대상으로 봅니다.
만약 보라색 점이 실제 값이고, 주황색 점이 내가 예측한 점 \(X_{j}\) 을 이미지로 투영한 점이라고 하면, 둘 사이의 오차를 줄이기 위해서는 카메라를 옮기거나 , 포인트를 옮겨야 합니다.
따라서 모두의 에러가 줄어들도록 단체로 움직이는 것이 BA 입니다.
State Variable
State Variable 은 '우리가 조정하고자 하는 것' 입니다.
여기서 T 는 카메라 Pose (Rotation / Translation)를 의미하고, X 는 3D point (좌표) 를 의미합니다.
m 은 카메라의 갯수, n 은 3D point 의 갯수입니다.
Observed Points 는 내가 찾은 Feature 들, 즉 정답이라고 간주되는 점들을 의미하고, Projected points 는 RT 에 의해서 정해지는 투영된 점들입니다.
\(e_{ij}\) 는 \(i\) 번째 이미지에서 \(j\) 번째 3D point 를 투영했을 때, 정답과의 차이(에러)입니다.
따라서 우리가 얻고자 하는 것은 이 모든 에러를 최소화하는 E(x) 를 구하는 것입니다.
E(x) 를 구하는 방법 : Gauss - Newton 방식
여기서 에러는 결국 두 점간의 길이를 구하는 것이기 때문에, State 를 변경함으로써 에러가 얼마나 커지고 줄어드는지 알 수 있습니다.
따라서 Gradient Descent 처럼 State 를 조금씩 변경하는데 이때 테일러 급수를 사용하여 다음을 정의합니다.
위 내용은 경희대학교소프트웨어융합학과 황효석 교수님의 2023년 <3D데이터처리> 수업 내용을 요약한 것입니다.