[SLAM] 23. Visual-Inertial Odometry (VIO)의 역사

happy_quokka·2023년 11월 30일
0

SLAM

목록 보기
24/28

1. Why use IMU?

Direct SLAM의 특징

  • fast tracking!
    • 드론, AR에서 많이 사용
  • 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 하는 부분은 라이브러리에 구현되어 있다
    • iSAM
    • GTSAM

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

0개의 댓글