Parallel Tracking and Mapping
0. Abstract
- handled camera 사용
- 작은 공간에서 AR를 위해 만든 것
- thread를 나눠서 사용
- 이렇게 해서 batch optimization(BA) 사용 가능
- 여러 landmark를 만들 수 있다
1. Introduction
- AR은 사용자 환경에 대한 사전 정보가 필요
- 센서에서 prior 정보를 보고 있을 때 센서의 한계가 있다
- 센서와의 range로 인해 정확도가 바뀐다
- extensible tracking
- 처음에 알고있는 prior로 시작하여 점점 unknown으로 가면서 map을 이어가는 기술
- prior map이 없이도 작동하면 좋다
-> 본 논문은 calibration이 된 카메라를 사용하여 어떠한 모르는 환경에서도 pose를 추정하고 mapping할 수 있다
- 빠르고 정확한 camera tracking이 필요 + map 정보도 정확 + 새로운 정보가 map에 적용되어야한다
- 환경은 static, 공간은 small(사실은 한계)
2. Method
- tracking과 mapping을 parallel thread로 분리
- mapping은 keyframe에서만 한다. BA 사용
- map은 stereo pair를 사용해서 초기화한다. (5 point 알고리즘)
- 새 point를 만들 때는 epipolar search를 통한다
- 많은 point를 그릴 수 있다
- 로봇은 odometry 정보가 주어진다
- 로봇은 느리게 움직인다
- 하지만 hand-held camera는 그렇지 않다
- tracking과 mapping 분리
- mapping은 매 frame의 정보는 필요없다. 좋은 frame만 가지고 와서 사용
4. The Map
- M : point feature
- W : world coordinate frame
- point feature는 locallu plannar textured patch를 가지고 있다
- Pj : map에서 j번째 point
- PjW=(xjwyjWzjW1)T
- unit patch normal nj : 카메라를 바라보는 방향
- N개의 keyframe
- K : keyframe
- Ek,W
- 이미지 피라미드
- 8비트 이미지 -> 흑백 이미지
- 640x480 이미지를 반으로 줄여가면서 피라미드 -> 4개의 레벨
- sourse keyframe : feature가 처음 발견된 곳
5. Tracking
- 3D point가 이미 만들어졌다고 가정 (roatation과 translation을 활용하여 triangulation을 해서 3D point를 만든 상태)
pose tracking 순서
- motion model을 사용하여 pose의 초기값을 구한다
- motion model : decaying velocity model
- prior pose를 추정
- 정답에 근사한 prior pose 값을 가지고 map point를 image frame에 projection
- matching하기 좋은 50개의 feature 추출 (50개 충분)
- 이 feature를 활용하여 camera pose를 업데이트 (coarse match)
- 1000개도 해본다
- 1000개로 optimization -> 최종 pose 추정
- 50개면 H matrix가 작아서 빨리 가능하지만 정확도는 조금 부족하다. 그래서 50개로 한 후에 1000개로 조금 느리지만 정확하게 한다. -> coarse fine approach
5-1. Image acquistion
- 4 레벨의 이미지 피라미드
- FAST 사용
- decaying velocity model을 사용해서 prior pose estimation
5-2. camear pose and projection
- map point를 이미지에 projection

- p : j번에 point가 wordl
- E : wordl에서 camera로

- camera motion M (4x4 -> SE(3))
- SE(3)은 미분이 어렵다. 그래서 이걸 쉽게 하기 위해 변경
- SE(3)를 six-vector μ 로 만들 수 있다
- 처음 3개는 translation, 나머지 3개는 rotation과 magnitude 표현
5-3. Patch Search
- 옛날 기술
- 요즘은 descriptor match로 바뀌었다
5-4. Pose update
- correspondence가 생기면 이를 통해 camera pose를 update할 수 있다
- ej : reprojection error
5-5. 2-stage coarse-to-fine tracking
- pose를 coarse search한 후
- 1000개로 더 정확하게 뽑는다
5-6. Tracking quality and failure recovery
- tracking은 매 프레임마다 잘되고 있는지 확인할 수 있다
- feature observation의 품질을 확인해서 안 좋은 경우 keyframe이 되지 않도록
6. Mapping

- 5point 알고리즘을 통해 E, pose 구하기
- 새로운 key framde이 들어올 때마다 확정되고 보정된다
6-1. Map initailisation
- 5 point 알고리즘과 RANSAC 사용하여 E 구한다
- BA 수행
- mono에서는 scale을 구할 수 없는데 PTAM에서는 scale을 그냥 지정해준다
6-2. Keyframe Insertion and epipolar search
- keyframe을 하려면 tracking quality가 좋아야한다
- 적어도 20 frame은 떨어져있어야한다
- 가장 가까운 key point와 거리가 있어야한다
- keyframe이 추가되면 triangulation으로 point를 만들어야하는데 가장 가까운 frame을 사용해서 수행 (triangulation 하려면 2 view 필요)
6-3. Bundle adjustment
- reprojection error가 최소화되는 최적의 pose와 landmark 위치를 구해야한다
- tukey M-estimator 사용
- optimization : Levenberg-Marquardt
- local BA를 하면 속도가 빠르다
- local BA에서는 5개의 keyframe만 사용한다
6-4. Data association refinement
6-5. General Implementation notes
- 사용한 라이브러리 : libCVD, TooN -> 다 없어졌다
7. Results
- pose 추정 : 19.2ms
- local BA :170ms
- global BA : 380ms
- map의 keyframedl 100개가 넘어가면 global BA를 보기에는 너무 오래걸린다
- PTAM은 6600개의 feature
- EKF-SLAM은 114개
- 같은 시간동안 PTAM이 더 많은 feature를 처리한다
8. Limitations and Future Work
- motion blur, 조명 변환, stereo 초기화할 때 실패하는 경우가 있다