[하이브리드 항법 시스템: 특별편] GPS 교란을 버텨라! PX4 Dead-Reckoning (추측 항법) 모드 완벽 가이드

안녕하세요! 자율비행 무인기 시스템의 최전선에서 밤낮없이 연구에 매진하고 계신 대학원생 및 연구원 여러분. 쿼드(QUAD) 드론연구소입니다.

우리는 그동안의 연재를 통해 고성능 외부 INS, ROS 2 통신 브릿지, 그리고 지형 대조 및 시각 서보잉 등 **’GPS가 없는 환경(GNSS-Denied)’**에서 드론이 살아남기 위한 다양한 하드웨어 및 소프트웨어 아키텍처를 구축해 왔습니다.

하지만, 여기서 매우 중요한 실무적인 질문이 하나 생깁니다. “드론이 비행하던 중 갑자기 적의 GPS 재밍(Jamming) 공격을 받거나 깊은 산속/도심 빌딩 숲으로 들어가 GPS 신호가 끊기면, 비행 제어기(PX4)는 내부적으로 어떻게 반응할까요?”

PX4는 기본적으로 GPS 신호를 잃으면 안전을 위해 임무를 중단하고 추락(또는 Failsafe 착륙)하도록 설계되어 있습니다. 아무리 훌륭한 보조 센서(VIO, 광학 흐름, 외부 INS)를 달아두었더라도, PX4가 이를 믿고 계속 비행하도록 허락하지 않으면 무용지물이 됩니다.

오늘은 이 문제를 근본적으로 해결해 줄 PX4의 숨겨진 비기, **’Dead-Reckoning (추측 항법) 모드’**의 원리와 파라미터 세팅법, 그리고 Gazebo 시뮬레이터와 MAVSDK-Python을 이용한 실전 테스트 방법까지 친절하고 깊이 있게 파헤쳐 보겠습니다!


1. EKF2의 두 가지 얼굴: Automatic 모드 vs. Dead-Reckoning 모드

PX4의 두뇌 역할을 하는 EKF2(Extended Kalman Filter 2)는 GPS 데이터의 신뢰성이 떨어졌을 때 대처하는 두 가지 모드를 제공합니다.

  • Automatic 모드 (EKF2_GPS_MODE = 0, 기본값): 야외 비행을 전제로 GPS 신호를 전적으로 신뢰하는 모드입니다. GPS 신호가 끊기면 EKF2는 곧바로 Failsafe를 발동시켜 기체를 착륙시키려 합니다. 더 큰 문제는 GPS 신호가 교란되었다가 다시 정상으로 돌아왔을 때 발생합니다. EKF2가 위치를 새로운 GPS 좌표로 **강제 초기화(Reset)**해버리기 때문에, 기체가 공중에서 순간적으로 덜컹거리거나(Jerky) 엉뚱한 곳으로 크게 튀는 현상이 발생합니다.
  • Dead-Reckoning 모드 (EKF2_GPS_MODE = 1): 간헐적인 GPS 단절이나 교란이 예상되는 환경(GNSS-Degraded & Denied)을 위한 모드입니다. GPS 데이터에 이상이 생기더라도 EKF2가 위치를 강제로 리셋하지 않습니다. 대신 VIO, 광학 흐름, 외부 INS 등 다른 보조 센서의 데이터에 의존하여 **부드럽게 위치 제어를 유지하며 지정된 경로를 계속 비행(추측 항법)**합니다.

2. 필수 파라미터 완벽 가이드

Dead-Reckoning 모드를 완벽하게 구동하기 위해서는 QGroundControl(QGC)에서 단순히 모드 하나만 켜는 것으로 끝나지 않습니다. 안전하고 신뢰성 있는 자율비행을 위해 다음 파라미터들을 유기적으로 설정해야 합니다.

📍 핵심 활성화 및 시동(Arming) 파라미터

  1. EKF2_GPS_MODE = 1 (Dead-reckoning): 이 모드를 활성화하는 가장 기본적인 스위치입니다.
  2. COM_ARM_WO_GPS = 0 (Deny arming): [매우 중요] 이 파라미터는 반드시 0으로 설정해야 합니다. Dead-Reckoning 모드는 “이륙 전부터 아예 GPS가 없는 상황”을 위한 것이 아닙니다. 이륙 시점에는 글로벌 좌표계(Global Frame)를 확립하기 위해 반드시 안정적인 GPS 신호가 필요합니다. 따라서 완벽한 GPS 신호가 확보되지 않으면 아예 이륙(Arming)을 차단하도록 설정해야 합니다.
  3. EKF2_GPS_CHECK: 기본값을 유지하여 이륙 전 엄격한 GPS 품질 검사를 통과하게 합니다.

📍 지상 고정 및 Timeout 파라미터 (고급 설정)

  1. EKF2_POS_LOCK = 1 (Enabled): 고정익의 대기속도계나 멀티로터의 VIO 센서들은 기체가 지상에 가만히 착륙해 있을 때 진동이나 노이즈로 인해 위치가 멋대로 흐르는(Drift) 현상이 발생할 수 있습니다. 이를 켜두면 지상 대기 시 위치를 단단히 고정(Lock)해 줍니다.
  2. EKF2_NOAID_TOUT: 보조 센서마저 끊겼을 때 추측 항법을 최대 몇 마이크로초(us)까지 유지할 것인지 결정하는 타임아웃 값입니다.
  3. COM_POS_LOW_EPH: 센서 오차가 누적되어 EKF2가 추정한 위치 불확실성(EPH)이 특정 임계값(m 단위)보다 커지면 Failsafe를 발동시킵니다. 수백 킬로미터를 추측 항법으로 날아가야 하는 자폭 드론의 경우, 이 값을 넉넉하게 키우거나 -1로 설정하여 강제로 꺼야 장거리 비행이 가능합니다.

📍 보조 센서(AGP) 추측 항법 파라미터

  1. EKF2_AGP_MODE = 1 (Dead-reckoning): 만약 ROS 2를 통해 고성능 외부 INS나 VIO 데이터를 보조 글로벌 위치 센서(AGP) 포트로 주입하고 계신다면, 이 슬롯들의 모드 역시 1로 변경해 주어야 통신 지연 시 기체가 튀는 것을 방지할 수 있습니다.

3. Gazebo SITL과 Python을 활용한 GPS 재밍(Jamming) 모사 테스트

랩실에서 실제 기체를 날리며 GPS를 차단하는 것은 매우 위험하고 어렵습니다. 따라서 우리는 Gazebo SITL (Software-In-The-Loop) 환경과 MAVSDK-Python을 사용하여 비행 중 GPS 신호가 끊어지는 상황을 안전하게 모사하고 검증할 것입니다.

시뮬레이터 상에서 의도적으로 GPS 신호를 끊으려면 SIM_GPS_USED 파라미터(기본값 10, 수신 위성 개수)를 0으로 일시적으로 변경하면 됩니다. 만약 외부 VIO나 INS의 고장도 모사하고 싶다면 SIM_AGP_FAIL (0=Stuck, 1=Drift) 파라미터를 조작할 수 있습니다.

💻 MAVSDK-Python 테스트 코드 구현

아래의 Python 코드는 드론을 이륙시켜 목표 지점으로 이동시키던 중, 강제로 SIM_GPS_USED를 0으로 만들어 GPS 재밍 상황을 발생시키는 자동화 테스트 스크립트입니다.

Python
import asyncio
from mavsdk import System
from mavsdk.param import ParamValue

async def run():
    # 1. 드론 시스템 연결 (SITL 환경)
    drone = System()
    await drone.connect(system_address="udp://:14540")

    print("드론 연결 대기 중...")
    async for state in drone.core.connection_state():
        if state.is_connected:
            print("드론이 성공적으로 연결되었습니다!")
            break

    # 2. 필수 파라미터 세팅 (Dead-Reckoning 모드 활성화)
    print("EKF2_GPS_MODE를 Dead-Reckoning(1)으로 설정합니다.")
    await drone.param.set_param_int("EKF2_GPS_MODE", 1)
    
    # 시동 전 GPS 확인 켜기
    await drone.param.set_param_int("COM_ARM_WO_GPS", 0)
    
    # 시뮬레이션용 GPS 위성 개수 정상화 (기본값 10)
    await drone.param.set_param_int("SIM_GPS_USED", 10)

    # 3. GPS 수신 대기 및 이륙 준비
    print("GPS 신호 대기 중...")
    async for health in drone.telemetry.health():
        if health.is_global_position_ok and health.is_home_position_ok:
            print("GPS 위치 확보 완료. 이륙 준비 끝.")
            break

    # 4. 시동(Arming) 및 이륙(Takeoff)
    print("시동을 겁니다.")
    await drone.action.arm()
    
    print("이륙 (고도 5m)")
    await drone.action.takeoff()
    await asyncio.sleep(10) # 10초간 안정적인 호버링 대기

    # 5. [테스트의 핵심] 비행 중 GPS 재밍 모사!
    print("\n🚨 [경고] 적의 GPS 재밍 공격 발생! SIM_GPS_USED -> 0 🚨")
    await drone.param.set_param_int("SIM_GPS_USED", 0)
    
    # 재밍 이후 기체 상태 모니터링 (15초간)
    for _ in range(15):
        position = await drone.telemetry.position().__anext__()
        print(f"현재 고도: {position.relative_altitude_m:.2f}m, "
              f"위도: {position.latitude_deg:.6f}, 경도: {position.longitude_deg:.6f} "
              f"(추측 항법으로 비행 유지 중...)")
        await asyncio.sleep(1)

    # 6. 테스트 종료 및 착륙
    print("\n테스트 완료. 착륙합니다.")
    await drone.action.land()

if __name__ == "__main__":
    # Python 3.7+ asyncio 실행
    asyncio.run(run())

터미널에서 make px4_sitl gz_x500_vision 명령어로 Gazebo를 띄운 후 위 스크립트를 실행해 보십시오. “적의 GPS 재밍 공격 발생!”이라는 메시지와 함께 SIM_GPS_USED가 0이 되어도, 드론이 Failsafe로 추락하거나 발작을 일으키지 않고 VIO 및 IMU 데이터를 활용해 부드럽게 호버링 상태를 유지(추측 항법)하는 것을 직관적으로 확인할 수 있습니다.

저희 QUAD 드론 연구소 📺YouTube 채널 멤버쉽 [💎다이아몬드 회원]으로 가입하시면 풀 테스트를 위한 모든 교재와 소스를 받아 보실 수 있습니다.


4. 비행 로그(.ulg)를 통한 EKF2 내부 상태 검증

테스트를 성공적으로 마쳤다면, 진정한 연구원답게 비행 로그 데이터를 열어 내부에서 어떤 일이 일어났는지 수치적으로 증명해야 합니다.

비행 후 생성된 .ulg 로그 파일을 다운로드하여 PlotJuggler 프로그램으로 열어보십시오.

  • Estimator Innovations (estimator_innovations): 이 토픽은 EKF2 필터가 예측한 위치와 실제 센서 측정치 간의 오차(Innovation)를 보여줍니다. 시뮬레이션 상에서 SIM_GPS_USED = 0이 되어 GPS 신호가 끊어지는 바로 그 시점부터, GPS 속도 및 위치 이노베이션 그래프가 더 이상 변하지 않고 평평한 선(flat-line)을 유지하는 것을 확인할 수 있습니다.
  • 보조 센서 융합 검증: 이때 VIO나 대기속도계, 광학 흐름 센서의 데이터가 정상적으로 들어오고 있다면, 기체의 수평/수직 위치 제어 상태가 무효화되지 않고 정상 상태 플래그를 유지하는 것을 볼 수 있습니다. 만약 다른 보조 센서마저 없다면, 10여 초 뒤(Timeout) EKF는 최종적으로 위치 유효성을 포기하고 비상 착륙 절차로 넘어가게 됩니다.

마무리하며

이번 블로그에서는 PX4의 Dead-Reckoning(추측 항법) 모드를 활용하여 무인기가 GPS 단절 환경에서도 생존할 수 있는 소프트웨어적 안전망을 구축해 보았습니다. EKF2_GPS_MODE를 비롯한 관련 파라미터들의 숨겨진 역할과, Gazebo 및 MAVSDK를 통한 모의 재밍 테스트 방법까지 익히셨으니 이제 어떤 악천후나 교란 환경에서도 든든하게 비행할 수 있는 기반이 마련되었습니다.

앞으로 우리가 구현할 하이브리드 항법(비전 기반 지형 대조 및 정밀 서보잉) 시스템은 바로 이 튼튼한 ‘추측 항법 모드’ 위에서 구동될 것입니다. 기술의 한계를 돌파하며 새로운 무인기 항법의 패러다임을 만들어가고 계신 연구원 여러분의 도전을 쿼드 드론연구소가 늘 응원합니다.

궁금한 점이 있으시거나 추가적인 로그 분석에 도움이 필요하시다면 언제든 댓글이나 메일로 질문을 남겨주세요! 감사합니다.


YouTube Tutorial

Author: maponarooo, CEO of QUAD Drone Lab

Date: May 29, 2026

Similar Posts

답글 남기기