gazebo/SLAM

VINS-Fusion 이란?

정지홍 2026. 5. 27. 12:47

VINS-Fusion

  • camera와 IMU를 결합하여, 로봇의 위치와 자세를 추정하는 slam이다.
    • 즉, 여러 센서의 측정값을 비선형 최적화로 묶어서, 현재의 위치+ pose + speed + Imu bias등을 추정한다.
      • 카메라 : 주변 특징점의 움직임을 봄
      • IMU : 가속도와 각속도를 측정
  • 이는 Visual-Inertial Odometry slam계열이다.
  • 이는 VINS-mono의 확장판이다.
    • VINS-Mono는 monocular carmera + IMU구조이다.
  • 동작 흐름
    • 1. Feature Tracking
      • 이미지에서 특징점을 뽑고, 다음 프레임에서 특징점이 어디로 이동했는지 추적한다.
    • 2. IMU Propagation
      • IMU의 가속도계 자이로스코프값을 사용해서, 짧은 시간동안의 움직임을 예측한다.
    • 3. Visual-Ineritail Optimization
      • 카메라 관측 오차와 IMU오차를 함께 최소화하는 최적화 문제를 푼다.
    • 4. Marginalization
      • 오래된 프레임은 제거하면서, 정보는 prior형태로 남겨서 계산량을 제한한다.
    • 5. Loop Fusion / Global Fusion
      • loop closure로 pose graph or global fusion을 통해서 장기 드리프트를 보정함.
  • 주요 기능
    • Visual - Inertial Odometry
      • 카메라와 IMU로 로컬위치/자세 추정
    • stereo VO/VIO
      • 스테레오 카메라만 사용 or 스테레오+IMU 사용
    • sliding - window optimization
      • 최근 프레임들을 묶어서, 비선형 최적화 수행
    • IMU preintegration
      • 고주파 IMU데이터를 효율적으로 최적화에 반영 
    • online spatial calibration
      • 카메라-IMU 외부 파라미터를 온라인 보정
    • online temporal calibration
      • 카메라와 IMU 시간 오프셋 보정
    • loop closure
      • 같은 장소를 다시 보았을때, 누적 드리프트를 줄임.
    • gps golbal fusion
      • VIO결과와 GPS를 결합해서 전역 좌표계 보정 가능

 

 

  • 전체 파이프라인
    • 1. feature tracking
    • 2. IMU Pre-integraion
      • imu는 카메라보다 훨씬 빠른 속도로 데이터가 들어온다. 이를 모두 넣으면 계산량이 처지니 imu preintegration과정을 거쳐야 한다.
    • 3. initialization
      • 초기화 과정은 vio-slam에서 매우 중요하다. 그래서 초기 위치 + 자세 + 속도 같은 것을 잘 잡아야한다.
    • 4. sliding window optimization
      • Vins-fusion은 모든 과거 프레임을 최적하 하지는 않는다. 왜냐면 이렇게 하면 계산량이 계속 커지기 때문...
        • 대신에 최근 몇개의 keyFrame or frame만 유지한다... 이를 sliding window라고 부른다.
    • 5. 최적화 문제로 오차를 줄인다.
    • 6. marginalization
    • 7. loop clouse
    • 8. pose , path , odometry출력 

 

설정 파리미터 파일

 

  • imu
    • 1: imu 사용
    • 0 : imu 미사용
  • num of cam 
    • 1 : monocular camera
    • 2 : stereo camera
  • imu topic : imu메시지를 받을 ros토픽
  • image topic : 이미지를 받을 토픽
  • output path : 출력 경로
  • cam calib : 카메라 내부 파라미터 파일
  • estimate extrinsic
    • 카메라-imu 외부 파라미터 추정 여부이다. 즉, 위치/회전 관계를 VINS가 추정할지 정하는 옵션 
    • 0 : 아래에 따라오는 body_T_cam을 그대로 사용
    • 1 : 주어진 값을 초기값으로 쓰고, 실행중에 약간 보정
    • 2: extrinsic을 모르는 상태에서 추정 
  • body_T_cam
    • IMU body좌표계와 카메라 좌표계 관계
    • 앞의 3x3은 회전이다.
    • 마지막 열은 translation이다. 위 사진의 예시로는 x = 0.006m , y=0.095m , z=0.000m이다.
  • multiple thread
    • 1 : 멀티스레드 사용
    • 0 : 싱글 
  • feature tracking 설정
    • max_cnt : 한 프레임에서 추적할 최대 feature point 개수이다. 값이 클수록 안정성은 좋아지나 계산량이 증가.
    • min_dist : feature point사이의 최소 거리. 단위는 pixel이다.
    • freq : VINS가 처리할 이미지 주파수이다.
      • 만약 freq:10이라면, 카메라가 30Hz로 들어와도 10Hz수준으로 처리한다는 설정.
    • F_threshold 
      • feature matching에서 잘못 매칭된 feature를 제거할때 사용. 값이 작을수록 엄격하게 제거 
    • show track : feature tracking결과를 화면에 보여줄지 정함
      • 1 : tracking 이미지 표시
      • 0 : 표시하지 않음 
    • flow back : optical flow추적후에 backward를 체크할지 정함 
  • 최적화 solver설정 
    • max solver time : 한번의 optimization에 사용할 최대 시간이다. 단위는 초단위이다.
    • max num iterations : solver가 한번의 optimization에서 수행할 최대 반복 횟수.
    • keyframe parallax : keyframe을 선택할때 사용하는 parallax threshold이다.
  • imu noise설정
    • acc_n : 가속도 측정값이 얼마나 noisy한지 나타냄.
    • gyr_n : 자이로스코프 measurement noise이다.
    • acc_w : 가속도걔 bias random walk noise이다. 
    • gyr_w :  자이로스코프 bias random walk noise이다. 
    • g_norm : 중력가속도 크기 
    • estimate_td : camera와 imu 사이의 시간지연이다. 즉, time delay를 추정할지 결정
      • 0 : 추정 안함
      • 1 : vins 실행중 time delay 추정
    • td : camera와 imu 사이의 시간 offset이다.
  • load previous pose graph : 이전에 저장해둔 pose graph를 불러올지 정함
    • 0 : 이전 pose graph를 사용안함
    • 1 : 이전 pose graph를 불러옴 
  • pose_graph_save_path : psoe graph를 저장하거나 불러올 경로
  • save_image : pose graph용 or loop closure용 이미지를 저장할지 정함 
    • 0 : 저장 안함
    • 1 : 이미지 저장
 
 

 

VINS-Fusion이 실패하는 경우
 
  • 1. 시간 동기화 문제
    • 카메라와 imu의 timestamp가 어긋나면, 빠르게 움직일때 pose가 흔들림
    • 현상
      • - 초기화 실패
      • - scale 이상
      • - trajectory가 갑자기 튐
      • - 회전시에 위치가 크게 흔들림
  • 2. calibration 문제
    • 카메라 intrinsic , distortion, stereo extrinsic등이 틀리면, reprojection error가 커진다.
    • 현상
      • - 스테레어 depth가 이상함
      • - loop closure후에도 경로가 이상함
      • - feature는 잘 잡히나, trajectory가 휘어짐
  • 3. imu noise parameter문제
    • imu noise와 bias random walk값을 잘못 넣으면, imu를 너무 믿거나 안믿게 됨
    • 현상
      • - 진동에 민감함
      • - 정지 상태에서도 drift
      • - 빠른 움직임에서 발산 
  • 4. 특징점 부족
    • 현상
      • - loop closure fail
      • tracking lost
 

'gazebo > SLAM' 카테고리의 다른 글

[issac sim] FAST-LIVO2 - 1  (0) 2026.06.17
FAST-LIVO2  (0) 2026.06.08
[Slam] Vins-Fusion  (0) 2026.05.26
pySLAM  (1) 2025.12.06
rtabmap으로 3d 지도 작성  (0) 2025.06.27