OpenVINS SITL 검증 - 회전 확인 및 균일 텍스처 발산 (2026-09-06)

요약

Legion 5 노트북(x86_64, native SITL)에서 PX4 + Gazebo Harmonic + OpenVINS 파이프라인이 end-to-end로 정상 동작 확인. 이전 세션의 21km 발산 문제 중 카메라-IMU 회전(extrinsic) 오류 가설은 증거 기반으로 기각했고, 카메라 하향 틸트 수정으로 나무 충돌/하늘 노출 문제는 해결됨. 다만 새로운 실패 모드(균일한 잔디 텍스처에서 뱅킹 선회 시 단안 스케일 발산)를 확인, 원인 규명 완료.


1. 회전(extrinsic) 문제 기각 — 증거

이전 세션에서 “직진은 정상, 첫 yaw에서 21km 발산”이 관측되어 카메라-IMU 회전 방향(T_imu_cam)이 반대로 들어갔을 가능성을 의심함. 두 가지 독립적 검증으로 기각:

  1. 소스 추적: OpenVINS(VioManagerOptions.h)가 yaml 키 이름 T_imu_cam을 읽을 때 반전 없이 그대로 로드. 우리 파일의 키 이름이 정확히 일치 → 반전 문제 아님.
  2. 필터 자기수렴 검증: calib_cam_extrinsics: 1(온라인 보정)로 실행 시, 필터가 수렴한 회전값이 기존 하드코딩 값과 거의 동일(q_ItoC ≈ (-0.5, 0.5, -0.5, 0.5)). 값이 틀렸다면 필터가 다른 방향으로 끌고 갔을 것.

회전 관련 재작업 불필요. (부가적으로 수직 lever arm ~19cm 오차는 실재하나 발산 원인은 아님, 낮은 우선순위)

2. 실제 원인이었던 것 — 물리적 충돌 + 저텍스처 지오메트리

  1. 6m 정사각형 비행 경로가 forest.sdf의 실제 나무 위치와 겹쳐 렌즈가 캐노피에 파묻힘
  2. 카메라가 수평 장착 상태라 프레임의 ~60%가 하늘(특징점 0개), 남은 캐노피 특징점들도 비슷한 깊이에 몰려있어 단안 스케일 추정에 취약한 조건

조치: 비행 경로를 나무와 겹치지 않게 재설계 + 카메라 ~30° 하향 틸트 (SDF 수정, 회전 extrinsic도 새 각도에 맞게 재계산)

3. 조치 후 재검증 결과

정지/이륙/직진 구간은 여전히 0.3m 이내로 정확. 나무 충돌·하늘 노출 문제는 해소됨. 그러나 뱅킹 선회(banking circle) 구간에서 새로운 발산 발생:

구간 오차
정지~이륙 0.26 m
선회 시작 0.39 m
첫 선회 중 0.43 m → 1.72 m로 급증
선회 지속 1.2~2.5 m
착륙 4.1 m (착륙 후 ZUPT로 ~8m에서 안정화, 이전처럼 무한 발산은 아님)

비행 중 RMSE 1.6m, 최대 4.1m.

원인: 착지 지형이 무늬 없는 균일한 잔디 — 특징점들이 전부 비슷한 깊이(지면 ~2.5m 아래)에 위치해 단안 스케일 관측성이 원래도 약한 상태였고, 뱅킹 선회(회전+이동이 동시에 섞이는 운동)가 여기에 부하를 더함. 발산 시작 시점 프레임 확인 결과 그림자/역광/모션블러까지 겹쳐 특징점 매칭 신뢰도가 급격히 떨어진 구간과 일치.

4. 다음 단계 후보