[하이브리드 항법 시스템 제1편: 개요] GPS 없이 수백 km를 날아간다? 2차대전 조종사에게 배우는 하이브리드 항법 시스템
안녕하세요! 드론 자율비행과 항법 시스템을 연구하시는 대학생, 그리고 연구원 여러분.
우리가 흔히 사용하는 드론은 스마트폰만큼이나 빠르고 정확하게 위치를 찾아냅니다. 바로 전지구 위성 항법 시스템(GNSS, 흔히 GPS라 부름) 덕분이죠. 하지만 현대의 복잡한 전장이나 도심지 환경에서는 멀티패스 효과, 의도적인 전파 방해(Jamming), 그리고 기만(Spoofing) 공격 등으로 인해 GPS 신호가 끊어지는 일이 빈번하게 발생합니다. 만약 GPS가 완전히 차단된 상황에서 드론이 수백 km 떨어진 목표물을 정확히 타격해야 한다면 어떻게 해야 할까요?
이번 <자폭 드론의 ‘non-GPS 하이브리드 무인 항법 시스템’ 만들기> 연재 시리즈 제1편에서는, 제2차 세계대전 당시 태평양 한복판에서 항공모함을 찾아내던 전투기 조종사들의 지혜를 빌려, 이를 현대의 로보틱스(ROS2 & PX4) 기술로 재해석한 **’3단계 하이브리드 항법 시스템’**의 개요를 아주 자세하고 친절하게 살펴보겠습니다.
1. 역사적 통찰: 2차대전 조종사들은 어떻게 길을 찾았을까?
망망대해인 태평양에서 GPS도 없이, 심지어 계속해서 이동하는 항공모함을 찾아 돌아오는 것은 기적에 가까운 일이었습니다. 당시 조종사들은 크게 두 가지 논리를 결합하여 생존할 수 있었습니다.
- 추측 항법 (Dead Reckoning)과 바람의 극복 조종사들은 출발 위치를 기준으로 지도, 나침반(방향), 그리고 속도계와 시계를 이용해 자신의 현재 위치를 수학적으로 계산했습니다. 여기서 가장 무서운 적은 ‘바람’에 의한 밀림(Drift)이었습니다. 조종사들은 대기 속도와 지면 속도의 차이를 직관적으로 계산하여 기수를 바람이 불어오는 쪽으로 살짝 틀어 비행(Crabbing)하는 방식으로 경로 이탈을 막았습니다.
- 무선 유도 시스템 (YE-ZB System)을 통한 위치 초기화 하지만 수백 km를 날아가면 추측 항법의 오차는 필연적으로 수 km 단위로 벌어집니다. 이를 해결하기 위해 미 해군은 ‘YE-ZB’라는 라디오 등대 시스템을 도입했습니다. 항공모함이 360도를 30도씩 12개의 섹터로 나누어 각기 다른 모스 부호를 은밀한 주파수 대역(UHF)으로 송출하면, 조종사는 수신된 모스 부호를 듣고 “아, 내가 지금 항모 기준 240도~270도 사이에 있구나!”라고 확신하며 누적된 위치 오차를 머릿속에서 ‘0’으로 초기화(Reset)할 수 있었습니다.
우리는 이 과거의 위대한 유산을 최첨단 드론의 두뇌인 PX4 비행 제어 스택과 ROS2에 이식해 볼 것입니다.

2. 하이브리드 무인 항법 시스템의 3단계 아키텍처
우리가 앞으로 구현할 비-GPS 하이브리드 시스템은 컴퓨팅 자원이 한정된 드론 환경에 맞춰, ‘단순함으로 멀리 가고, 지능으로 정확히 타격하는’ 3단계 구조를 가집니다.
📍 1단계: 순항 단계 – 고전적 추측 항법과 Wind Estimation
드론이 이륙 후 목표물 근처까지 수백 km를 이동하는 긴 순항 단계입니다. GPS가 없으므로 관성 측정 장치(IMU), 지자기 센서(나침반), 대기속도계, 기압계를 융합하여 위치를 추정합니다.
일반적인 저가형 센서는 시간에 따라 오차가 무한히 발산(Drift)하므로, 산업용 고성능 INS(관성항법장치, 예: FOG 또는 고성능 MEMS)를 탑재하여 오차 누적 속도를 극단적으로 낮추는 것이 핵심입니다. 더불어 PX4의 EKF2(Extended Kalman Filter) 모듈은 드론의 공기 저항(Drag Specific Forces)과 대기속도를 바탕으로 풍향과 풍속(Wind Velocity North/East)을 실시간으로 추정해 냅니다.
- 바람 보정(Wind Correction Angle) 제어 로직 예시 (C++/ROS2) 과거 조종사가 하던 측풍 보정 계산을 현대의 C++ 코드로 알고리즘화하면 다음과 같이 표현할 수 있습니다.
// 1. 센서 및 EKF2 데이터 수집
float V_a = current_true_airspeed; // 드론의 대기속도
float V_wN = wind_state_north; // EKF2가 추정한 북향 풍속
float V_wE = wind_state_east; // EKF2가 추정한 동향 풍속
// 2. 바람의 절대 속도(V_w)와 방향(wind_dir) 계산
float V_w = sqrt(V_wN*V_wN + V_wE*V_wE);
float wind_dir = atan2(V_wE, V_wN);
// 3. 목표 경로(Target Course)와 풍향 사이의 상대 각도(theta) 계산
float target_course = atan2(target_Y - current_Y, target_X - current_X);
float theta = wind_dir - target_course;
// 4. 교차풍(Crosswind) 극복을 위한 크랩 각(WCA) 산출
// WCA = arcsin((WindSpeed * sin(theta)) / TrueAirspeed)
float crosswind = V_w * sin(theta);
float WCA = asin(crosswind / V_a);
// 5. 최종 요구 기수각(Required Heading)을 PX4 Offboard 토픽으로 퍼블리시
float required_heading = target_course - WCA;
trajectory_setpoint_msg.yaw = required_heading;
이 과정을 통해 드론은 강한 측풍이 불어도 목표 지점을 향해 묵묵히 직선 경로(Ground Track)를 유지하며 비행할 수 있습니다.
📍 2단계: 중간 보정 단계 – 지형지물 기반 위치 보정 (Pseudo-YE-ZB)
아무리 뛰어난 고성능 INS를 사용하더라도 수백 km를 날아가면 추측 항법의 오차는 1~2km 이상 벌어집니다. 과거 YE-ZB 전파 시스템이 조종사의 오차를 리셋해주었듯, 우리는 **’지형 참조 항법(Terrain Referenced Navigation, TRN)’**으로 이를 대체합니다.
모든 경로의 위성 지도를 드론에 저장할 필요는 없습니다. 중간중간 눈에 띄는 ‘체크포인트(예: 특이한 해안선, 섬, 뚜렷한 교차로)’의 템플릿(Template) 이미지만 저장해 둡니다. 드론이 해당 체크포인트 근처에 도달하면 하향 카메라를 켜고, OpenCV의 cv2.matchTemplate() 함수나 YOLO 기반 객체 탐지를 통해 실시간 지형과 저장된 템플릿을 대조합니다.

두 지형의 특징점이 일치하는 순간, 드론은 “아, 내가 지금 정확히 이 섬 위(절대 좌표)에 있구나!”라고 인식합니다. 이때 틀어져 있던 EKF2의 로컬 좌표를 해당 절대 좌표로 강제 초기화(Reset/Loop Closure)하여 그동안 쌓인 수 km의 오차를 단숨에 ‘0’으로 만듭니다.
📍 3단계: 종말 단계 – 정밀 시각적 서보잉 (Visual Servoing)
드론이 목표물 근처 반경에 도달하면 최후의 정밀 타격(또는 착륙)을 위해 ‘종말 단계’로 전환합니다. 이 단계는 과거 조종사가 육안으로 적군의 항공모함을 발견하고 급강하 폭격을 시도하는 것과 같습니다.
이때는 지도상의 ‘좌표’로 이동하는 것이 무의미합니다. 대신 온보드 전방 하향 카메라와 YOLOv8 같은 딥러닝 객체 탐지 알고리즘을 사용해 목표물(예: 적 전차, 벙커, 특정 마커)을 실루엣만으로 포착해 냅니다.

목표물을 카메라가 포착하면, 목표물의 이미지 상 중심 픽셀 (u,v) 와 실제 카메라 화면의 정중앙 픽셀 (uc,vc) 사이의 오차(Position Error)를 계산합니다. 이 오차가 ‘0’이 되도록 제어 입력을 생성하는 기술을 **이미지 기반 시각적 서보잉(IBVS, Image-Based Visual Servoing)**이라고 합니다.
ROS2 시스템은 이 오차를 기반으로 다이렉트 속도 벡터(Velocity Setpoint)를 생성하고, 이를 PX4의 Offboard 모드를 통해 기체에 직접 명령합니다.
- PX4 Offboard 속도 제어 예시 (ROS2 Python 기반)
# 목표물 중심점 오차를 계산 (예: 픽셀 단위 오차를 속도 지령으로 변환)
error_x = target_u - image_center_u
error_y = target_v - image_center_v
# 비례 제어(P 제어)를 통한 속도 명령 생성
vel_x = Kp * error_y # 화면의 y오차가 드론의 전진(x) 속도로 변환
vel_y = Kp * error_x # 화면의 x오차가 드론의 측면(y) 속도로 변환
# TrajectorySetpoint 메시지 퍼블리시
msg = TrajectorySetpoint()
msg.position = [float('nan'), float('nan'), float('nan')] # 위치 제어 무시
msg.velocity = [vel_x, vel_y, descent_velocity] # 속도 제어 활성화
msg.yaw = target_yaw
self.trajectory_setpoint_publisher.publish(msg)
이처럼 좌표가 아닌 시각적 피드백에 의해 기체의 속도를 제어함으로써, 설령 목표물이 이동 중이더라도 끝까지 추적하여 정밀하게 명중할 수 있습니다.
🚀 마무리하며
지금까지 제2차 세계대전 조종사들의 추측 항법과 무선 유도 논리를 현대의 로보틱스 기술로 부활시킨 **’3단계 비-GPS 하이브리드 항법 시스템’**의 전체적인 청사진을 살펴보았습니다.
이 시스템은 각 알고리즘의 장점으로 서로의 단점을 보완합니다. 추측 항법의 ‘오차 누적’은 지형 대조의 ‘절대 위치 초기화’로 해결하고, 지형 데이터가 없는 낯선 타격 지점에서는 ‘시각적 서보잉’이 끝까지 임무를 완수하게 만듭니다.
다음 제2편에서는 이 엄청난 시스템을 하드웨어 파손 걱정 없이 개발하고 테스트할 수 있도록, 자율 비행의 두뇌인 PX4 EKF2의 원리와 Gazebo SITL(Software In The Loop) 시뮬레이션 환경을 구축하는 방법에 대해 아주 상세하게 파헤쳐 보겠습니다.
앞으로 이어질 ROS2 코딩과 컴퓨터 비전(OpenCV/YOLO)의 융합 과정에 많은 기대 부탁드립니다!
YouTube

Author: maponarooo, CEO of QUAD Drone Lab
Date: April 11, 2026
