[SLAM] 23. Visual-Inertial Odometry (VIO)의 역사
1. Why use IMU?
Direct SLAM의 특징
- fast tracking!
- fps가 빠른 카메라 필요
- 빠른 카메라 = more power = 큰 battery = 무거운 UAV = 짧은 running time(드론의 경우 체공시간)
- direct를 쓰게되면 시스템 성능이 안 좋아지는 경우가 생겼다
- localization을 빠르게 하지만 전력 소모가 적은 방법이 필요하다
Visual-Inertial(VI) SLAM의 sensor
- visual : camera
- inertial : imu
- 카메라보다 속도 빠름
- pose를 빠르게 추정 가능 -> imu를 활용하여 pose를 추정할 수 있다면 원하는 속도를 얻을 수 있다
- 카메라가 있기 때문에 조금의 drift는 있어도 된다
- linear acceleratioin과 angular velocity 활용
- linear acceleratioin : translation 구한다
- angular velocity : rotation 구한다
- 구한 translation, rotation을 visual 정보로 보정한다
- 두 센서의 조합이 좋다
camera
- slow motion에서 정확
- dense한 데이터가 들어오기 때문에 좋은 보정치를 얻을 수 있다 (rich information)
- 100Hz 이상이 될 수 없다
- monocular를 사용하면 scale ambiguity(모호성)가 생긴다
- 조명, 모션의 변화와 같이 lack of robustness
imu
- robust
- 1000Hz까지의 high output rate
- 높은 가속에도 좋은 결과
- matrix scale로 움직임을 복원 가능 -> monocular의 scale ambiguity 해소 가능(scale 값을 줄 수 있다)
- 등속 운동, noise가 있는 경우 결과가 좋지 않다 -> 카메라가 보정 가능
Why is it hard?

- imu 안에 2가지 센서가 있다
- linear accelerator : accel noise -> 노이즈가 작은 편
- gyroscope : gyro noise -> 시간이 지날수록 노이즈가 누적된다 -> rotation에 노이즈 크게 생긴다
- imu를 가만히 두어도 노이즈가 크게 생기기 때문에 imu 혼자서는 위치를 추정할 수 없다
2. VI Initialization
- imu 하나로는 불안정하니까 카메라를 사용해서 보정해야한다
sensor fusion
- camera : 30FPS / 이미지
- imu : 100~800FPS / motion 데이터
- 데이터들간에 syncing and fusing 필요
3ways to start VI system (initialization 부분)
- start stationary
- 카메라, imu 모두 가만히 있는 상태에서 시작 -> position이 없다 -> imu 노이즈 특성값, 카메라 위치도 알면서 motion값을 동시에 추론해가면서 동시에 시작하는 부분을 알 수 있다
- 단점 : 무조건 멈춘 상태에서 시작해야한다 / 움직임이 있으면 안된다
- 결과가 좋지 않다
- linear accelerator 값을 2번 적분 -> 이동거리(가속도-속도-거리) -> position 정보를 구한다 -> 카메라의 visual odometry 정보와 혼합해서 filter를 이용해서 통합
- 움직이는 상태에서 시작하는 방법
- imu의 노이즈값도 적분되기 때문에 노이즈 값으로 인해 결과가 좋지 않다
- least squares
Initialization 방법론
- martinelli 2012, 2016
- 하나의 3D point를 보는데 적어도 3개의 view와 그 사이에 imu 데이터가 있다고 하면
- fusion이 된 6DoF motion, scale, initial velocity를 얻을 수 있다
3. VIO
MSCKF
- Multi-State Constraint Kalman Filter
- camera와 imu 사용
- optimizer는 EKF(Extended Kalman Filter)를 사용
- null-space trick 사용
- 중간에 카메라 feature를 pose에 연관시키는 data association하는 부분에서 사용
- 기존 EKF에 비해 더 많은 feature를 사용할 수 있게 되었다
- motion prior가 있기 때문에 더 빠르게 동작가능
Optimization 방법들
- Optimization 방법이 filter보다 좋다
- Optimization 방식으로 visual과 inertial을 혼합할 수 있을까? 관련 연구 수행
- sliding window optimization
- global optimization
IMU pre-integration
연구 배경
- vision만 해도 factor graph를 풀 때 factor의 크기를 줄이기 위해 keyframe을 사용해서 factor graph를 compact하게 만들려고 노력했다
- 카메라는 30fps인데 imu는 데이터가 훨씬 많다
- imu는 incremetal하게 motion을 쌓아가기 때문에 keyframe 개념이 없다
- 모든 imu 값을 사용하기에는 너무 계산량이 많았다
- graph opimization을 할 때 어떻게 하면 imu를 sompact하게 담을 수 있을지 연구
연구 내용

- 카메라가 찍히고 그 사이마다 IMU가 많이 찍히는 형태 -> 계산량 많다
- 그래서 카메라 사이의 imu들을 preintegrated (미리 적분)해서 단 하나의 imu factor로 만들어 버리는 기법
- 기존의 factor optimization 방법을 그대로 사용할 수 있게 되었다
- VIO가 가능하게 되었다
- preintegration 하는 부분은 라이브러리에 구현되어 있다
OKVIS (2015)
- Open Keyframe-based Visual-Inertial SLAM
- keyframe-based sliding window BA on VIO
- 갑자기 어두워지는 부분에서도 잘 작동한다
Rovio
- rovio -> rovioli -> maplab으로 발전
- loosely-coupled VIO approach
- loosely-coupled
- visual-based odometry + imu-based odometry (EKF를 사용해서 혼합)
- visual의 경우는 SVO와 비슷하게 feature를 뽑은 후 direct하게 patch tracking을 통해 정보를 얻었다
- imu도 적절히 섞어서 안정적으로 pose 추정
- automatic IMU bias calibration
- imu bias값이 시간이 지나면서 흔들리게 되는데 실시간으로 calibration
- map merging 작업
- 하나의 큰 map으로 만들어준다
- 예를 들어 1층, 2층, 3층의 map이 있으면 이걸 하나의 건물로 합친다
- loop closure 활용
VINS-Mono
- VIO, VI SLAM에서 매우 유명
- sliding window BA를 하면서 tightly-coupled pre-integrated IMU
- loosely-coupled initializatino
- loop closure : DBoW2 사용
- automatic online IMU bias calibration
- loop closure를 사용하지 않아도 imu로 보정되기 때문에 drift가 많이 발생하지 않는다
Kimera
- sliding window BA를 사용하고 내부에서는 pre-integrated IMU factor를 사용한다
- stereo-inertial odometry에서도 가능
- loop closure : DBoW2 사용
- pose data를 기반으로 semantic feature map을 만드는 것
VI-DSO
- DSO의 photometric error랑 sliding window BA안에 imu 정보 넣어서 사용
- imu로부터 matrix scale을 얻을 수 있다
- 어두운 곳, 밝을 곳에서도 imu가 tracking할 수 있기 때문에 robust
Basalt
- IMU pre-integration의 단점
- non-linear한 imu의 pose값들이 pre-integration(적분)하면서 linear하게 바뀐다
- factor graph optimization할때는 계산이 간단해진다
- 하지만 non-linearity가 없어지기 때문에 pose에 대한 정확도가 떨어진다
- pre-integration된 IMU factor로부터 non-linearity를 복원
- 복원한 non-linearity만 factor optimization에 적용하여 정확하게 pose 추정
- 코드가 open되어 있는데 정말 잘 구현되어 있다
ORB-SLAM 3
- 기존의 ORB SLAM에 IMU를 넣은 것
- 빠른 imu initialization
- loop closure 가능
- map reuse