27.5.5. 옵티컬 플로우 및 VIO 퓨전
하늘이 뻥 뚫린 야외에서의 비행은 GPS(Global Positioning System)라는 훌륭한 나침반이 존재하지만, 울창한 숲속, 다리 밑, 혹은 실내 창고 환경으로 진입하는 순간 GPS 신호는 차단(Denied)되거나 극심한 다중 경로(Multi-path) 반사로 인해 오도된다. 이러한 GPS 음영 지역(GPS-Denied Environment) 에서 드론이 제자리에 호버링(Hovering)하거나 정밀한 자율 주행을 수행하기 위해서는 자체적인 ‘시각적’ 항법 센서가 필요하다.
PX4-Autopilot의 확장 칼만 필터(EKF2)는 이러한 시각 센서 데이터를 융합하기 위해 두 가지 강력한 파이프라인을 지원한다. 첫째는 2차원 평면 이동을 감지하는 옵티컬 플로우(Optical Flow, fuseOptFlow) 이며, 둘째는 3차원 공간 전체의 위치와 자세 변화를 완전하게 읽어내는 VIO(Visual Inertial Odometry, fuseEvPos / fuseEvYaw) 다. 본 절에서는 이 두 가지 비전 알고리즘이 EKF 아키텍처 내에서 어떻게 관측 모델로 구성되고, 기존 관성/기압 센서들과 결합하는지 종합적으로 분석한다.
1. 옵티컬 플로우(Optical Flow) 퓨전 메커니즘
옵티컬 플로우 센서(예: PMW3901 칩셋)는 마치 컴퓨터용 광학 마우스처럼 작동한다. 기체 하단에 부착된 렌즈가 지면 텍스처(Texture)의 흐름 패턴을 고속으로 촬영하고 분석하여, X축과 Y축 방향의 각속도(Angular Rate, 단위: rad/s) 단위 센서 데이터를 EKF에 전달한다.
1.1 관측 모델과 야코비안(\mathbf{H}) 구성
옵티컬 플로우 퓨전(Ekf::fuseOptFlow())의 가장 큰 특징은, 센서가 출력하는 값 자체는 ’속도(Velocity, m/s)’가 아니라 ‘각속도(rad/s)’ 라는 점이다. 따라서 예상 관측치(Predicted Measurement)를 계산하기 위해서는 필연적으로 EKF가 추정 중인 ‘지상고(Ground Clearance)’ 데이터가 필요하다.
\text{Predicted Flow Rate (rad/s)} = \frac{\text{Velocity (m/s) relative to ground}}{\text{Height above ground (m)}}
이 기하학적 종속성 때문에, 옵티컬 플로우의 야코비안 행렬 \mathbf{H} 는 다음과 같이 다차원 상태 변수에 얽히게 된다(Cross-coupled).
- 지구 기준 X, Y 수평 속도 (인덱스 4, 5번): 기체의 절대적인 이동 속도.
- 기체의 자세(Roll, Pitch) 및 가속도계 바이어스 (0~3번 및 13~14번): 기체가 기울어짐에 따라 발생하는 가상의 ’시야 이동(Camera Rotation)’을 보상하기 위함.
- 지상고를 결정하는 수직 상태 (기압계 p_D 또는 지형 고도 상태 변수): 지상고가 야코비안 행렬의 분모에 들어가므로, 비행 고도가 낮아질수록(분모가 작아질수록) 센서 데이터가 상태 벡터에 미치는 영향력(\mathbf{H} 성분 크기)이 극도로 증폭된다.
1.2 광학 흐름 센서의 한계와 거리 센서(Range Finder) 의존성
분모에 들어가는 ‘지상고’ 값이 부정확하다면, 광속(Optical Flow) 데이터는 기체의 속도를 완전히 잘못 산출(Scale Error)하게 만든다. 따라서 옵티컬 플로우 퓨전을 활성화(EKF2_OF_CTRL 파라미터)하기 위해서는 라이다(LiDAR) 기반의 1차원 거리 측정 센서(Range Finder)의 퓨전이 강제(Mandatory) 전제 조건이 된다. fuseOptFlow() 함수 내부는 거리 센서 데이터의 유효성을 끊임없이 검사하며, LiDAR 데이터가 끊어지면 옵티컬 플로우 퓨전 역시 즉각 중단된다.
2. VIO (Visual Inertial Odometry) 외부 비전 결합 메커니즘
옵티컬 플로우가 2차원 평면의 “움직임 속도“만을 알려주는 보조 센서라면, VIO(예: Intel RealSense T265, OAK-D 등)는 카메라 렌즈와 내부 IMU를 자체적으로 퓨전하여 외부 보조 컴퓨터(Companion Computer, 예: Raspberry Pi)에서 계산된 절대적인 3차원 위치(Position), 속도(Velocity), 그리고 자세(Quaternion) 를 MAVLink(ROS2 odometry 토픽)를 통해 EKF에 직접 꽂아 넣는 강력한 시스템이다. PX4에서는 이를 외부 비전(External Vision, EV) 시스템이라고 부른다.
2.1 EKF 외부 비전(fuseEv) 파이프라인 구조
src/lib/ecl/EKF/ev_pos_fusion.cpp 와 ev_yaw_fusion.cpp 등에 나뉘어 구현된 VIO 퓨전 로직은, GPS가 제공하는 퓨전 아키텍처(fuseVelPosHeight)를 거의 동일하게 모방하면서도 VIO만의 특수한 성질을 반영한다.
- 위치 퓨전 (
fuseEvPos): VIO가 보내온 3차원 평행 및 수직 좌표(X, Y, Z)를 EKF 위치 상태 변수(7, 8, 9번)에 융합한다. GPS를 대체하는 완벽한 위치 결정 소스다. - 헤딩 퓨전 (
fuseEvYaw): VIO가 계산해 낸 쿼터니언에서 요(Yaw) 각도를 뽑아내어 지자계 센서를 대체(EKF2_EV_CTRL파라미터 마스크)한다. 실내 철골 구조물에 의한 자기장 노이즈가 극심한 창고 환경에서 지자계를 아예 꺼버리고 카메라로 회전축을 잡는 데 사용된다.
2.2 VIO 퓨전의 프레임 정렬(Frame Alignment) 보상
GPS는 철저히 지구 중심의 절대 좌표계(NED)를 따르지만, VIO 센서는 처음 부팅되고 전원이 켜진 그 순간과 장소의 렌즈 방향을 좌표계의 원점(0,0,0)과 기본 방위축으로 삼는 로컬 기준 프레임(Local Reference Frame) 의 성격을 띤다.
만약 기체 전원을 켠 채로 사람이 손으로 들고 다른 방으로 90도 꺾어서 이동한 후 VIO 노드를 재실행한다면, EKF 내부의 NED 방위와 VIO가 바라보는 방위 사이에 거대한 좌표축 회전 불일치 오차(Yaw Alignment Error) 가 발생하게 된다. PX4 EKF2는 이를 해결하기 위해 EV 시스템과 EKF 캘리브레이션 프레임 간의 오프셋을 추정하는 별도의 상태 변수들을 가동하여, VIO 데이터가 EKF 안으로 들어오기 전에 3차원 회전 정렬(Rotational Alignment)을 거치게 만든다.
3. 소결
옵티컬 플로우와 VIO는 드론의 활동 영역을 야외 창공에서 실내 물류 센터, 동굴, 협곡 지대까지 비약적으로 확장시켜 준 비전 AI 시대의 총아다.
옵티컬 플로우는 값싸고 가벼우며 연산량이 적지만 지상고 센서에 완벽히 종속적이고 수직/수평 기하학적 미분 행렬 구조가 대단히 복잡하다. 반면 VIO는 3D 풀-스케일 좌표를 깔끔하게 던져주어 GPS를 그대로 흉내 내지만, 국소 기준 좌표계(Local Frame)의 누적되는 표류(Drift) 오차와 프레임 정렬 불일치를 EKF 단에서 조율해 주어야 하는 과제를 안겨준다.
다음 두 개의 하위 절에서는 이 두 시각 센서 퓨전 파이프라인에서 발생하는 가장 치명적인 수학적 난제들인, 광학 카메라 렌즈의 “순수 병진 이동(Translation)과 기체 회전 왜곡(Rotation)의 분리 연산식” 그리고 “VIO 회전 정렬 오차 공분산 행렬 업데이트” 로직의 C++ 코드를 깊숙이 해부하도록 하겠다.