2023. 3. 2. 04:38ㆍDevcorse/Visual SLAM(02.20~3.31)
PTAM - 2007
Parallel Tracking and Mapping for Small AR Workspaces
Abstract
손으로 카메라를 움직이며 작은 AR 작업공간을 위해 만들었다. tracking과 mapping를 thread를 나눠 처리한다.
one thread는 변동적인 camera motion을 tracking한다. 다른 thread는 이전 프레임을 보며 3D map을 만든다.
이로인해 계산량이 많은 batch optimisation을 사용할 수 있다.(batch optimisation = BA)
그 결과 수 천개를 다루는 landmark를 만들수 있었다.
Intoduction
그동안 AR은 유저의 환경의 사전지식이 필요했다. 이는 CAD model, AR marker가 해당된다.
tracking은 장비로 측정된 특징에 제한적이며, 이러한 제한은 해상도의 크기와 질이다.
이를 해결하기위해 extensible tracking의 기술이 있었다. 이 기술은 이전의 모르는 장면의 부터 init map까지 추적하는 기술이며 original map의 sensing range가 제공될때만 가능하다.
저자는 prior map없이 calibrated된 카메라를 가지고 모르는 장소에서 tracking 하고자한다. 발전되면 평면에서 vr simulation을 play할 수 있다. (그냥 ar임) 이를 위해 빠르고 정활하고 robust한 camera tracking을 하면서 map이 만들어져야한다. 동일 frame에 map이 바뀌면 고정적이여야하며, map은 크기가 작다.(작은건 그냥 기술적 한계이다.)
Method Overview In The ConText of SLAM
- Tracking and Mapping은 분리되어 2 threads에서 실행된다.
- Mapping 은 keyframes을 기반으로 실행되며 BUndle Adjustment를 사용한다.
- map은 2 veiew로부터 dense하게 만들어진다.(5-point algorithm) -> Essential matrix
- New points는 epipolar seach에서 시작한다. feature를 epipolar line에서 찾겠다. (descriptor가 없어 대안)
- 수천개의 points가 mapped 된다.
이전의 SLAM은 incremental mapping을 사용해왔지만, 이는 매 프레임마다 landmark가 갱신된다.
이는 로보틱스에서는 타 센서로부터의 값을 받아 보정하며, 움직이는 속도가 느려 가능했다.
VSLAM에는 맞지 않다. - visual만 사용, 빠른 속도의 움직임 -> keyframes
outlier는 RANSAC으로 처리한다.
이러한 이유로 2 task를 나눠 실행한다.
+ tracking을 매 프레임마다 실행하지 않으니 기존의 좋은 프레임만 사용하면 tracking 정보를 실시간으로 받을 필요가 없다. -> keyframe의 장점
bundle adjustment를 활용해 높은 정확도를 얻는다. (단 계산량이 많다)
The Map
map은 M개의 features, world coordinate frame W를 가진다. 각 point feature는 patch를 가진다.
map의 jth point 는 coordinates $p_{jw} = (x_{jW} y_{jW} z_{jW} 1)^{T}$를 가진다.
각 point는 unit patch normal $n_{j}$를 가지는데 카메라가 바라보는 방향? patch 라고 한다.
map은 N개의 keyframes를 가지며 $K_{i}$로 표현한다.
coordinate frame과 world의 변환을 $E_{K_{i}W}$로 표현한다. 각 keyframe은 640x480 부터 80x60 까지 4단계의 image pyramid의 gray image를 가진다. 각 point feature는 source keyframe이 있다.
Tracking
initial 3D points map을 가지고 있다고 가정하자.
1. 새 프레임은 카메라로부터 얻어지며, 이전 pose estimate는 motion model에서 만들어진다.
2. map points를 prior pose estimate를 토대로 이미지에 투영한다.
3. 매칭이 되기 좋은 50개의 feature를 뽑는다.
4. 뽑은 feature로 camera pose를 최적화한다.
5. 1000개의 point를 이미지에 재투영한다.
6. 마지막 포즈는 1000개의 feature로 최적화한다.
3번으로 대략적으로 위치 최적화후 5번으로 정밀 최적화 한다. (작은 H matrix로 최적화 후 큰 H matrix로 최적)
5.1 Image acquisition
640x480 원본으로 4단계 image pyramid를 만들고 FASR-10 corner detector를 사용한다.(nms 미사용)
50개의 feature를 뽑을 떄 decaying velocity model을 사용한다.
5.2 Camera pose and projection
$p_{jc} = E_{cW}p_{jw}$ 이는 [R|t]X와 같다.
여기에 camera image plane에 적용(camproj)하려면 K를 곱하면 (u,v)를 얻을 수 있다.
$E'_{CW} = ME_{CW} = exp(μ)E_{CW}$ 와 같이 카메라 좌표를 구하려면 미분이 필요하지만 이를 대신해 M으로 M을 대신해 exp(μ)를 사용한다.
이는 SE(3)를 대신해 6개의 파라미터로된 μ에 exp를 씌워 사용한다.
첫 3개는 이동을 뒤 3개는 axis angle을 표현한다.
5.3 patch search
더이상 안쓰여서 생략
-> patch observation 만들어진다-> discriptor로 대체됨
5.4 pose update


$e_{j}는 reprojection error$이며, 10번의 iteration의 reweighted least squares를 사용해 최적화 하며, M-estimator로 outlier를 없앤다.
5.6 Tracking quality and failure recovery
매 프레임마다 tracking의 질을 평가하여 일정 수준보다 떨어지면 keyframe에 포함시키지 않는다.
Mapping
initial map을 만들때 스테레오 기술을 사용하고 이후에는 새 프레임이 들어오면 tracking, 이를 토대로 keyframe, 이를 토대로 mapping한다.

6.1 map initialisation
5 point sereo algorithm, RANSAC을 사용해 E matrix를 구하고 triangulate해 mapping 하고 BA 한다.
스케일은 대충 아무거나 넣는다.
6.2 keyframe insertion and epipolar search
keyframe insertion 조건 tracking이 잘되야한다. 이전 keyframe보다 20프레임이 떨어져야한다. 가장 가까운 keyoint과 최소거리이상 떨어져야한다.
이후 triangulation을 할때 두번째 keyframe은 가장 가까운 keyframe을 사용한다.
6.3 Bundle Adjustment

Tukey M-estimator, Levenberg-marquardt을 사용해 ba를 한다.
150개 keypoint가 넘어가면 10초가 걸린다.
과거 코드의 라이브러리들이 사장되어 구현이 사실상 불가능에 가깝다.
'Devcorse > Visual SLAM(02.20~3.31)' 카테고리의 다른 글
| ORB SLAM paper (0) | 2023.03.04 |
|---|---|
| 모던 VSLAM 시스템의 구조 (0) | 2023.03.01 |
| Feature based SLAM (0) | 2023.03.01 |
| Bundle Adjustment (0) | 2023.02.28 |
| Least squares (0) | 2023.02.28 |