13.6.2. ULog 기반 비행 데이터 심층 프로파일링 (Flight Review & PlotJuggler 활용)

13.6.2. ULog 기반 비행 데이터 심층 프로파일링 (Flight Review & PlotJuggler 활용)

드론 개발의 뼈아픈 역사는 비행 중에 추락(Crash)하거나 롤링(Rolling)/피칭(Pitching) 방향으로 미친 듯이 발산(Oscillation)하며 땅에 꽂히는 무수한 사건들의 궤적이다. 허공에 부서진 프레임과 프로펠러 조각 앞에서 “바람 때문인가?”, “모터가 탔는가?”, “칼만 필터가 미쳐버린 것인가?” 와 같은 무의미한 상상력을 발휘하는 것은 공학의 영역이 아니다.

PX4-Autopilot은 이 불가해한 사건들이 일어난 찰나의 과거 1밀리초(1\text{ms}) 단위의 파편들을 완벽하게 영구 기록(Storage)하는 메커니즘을 펌웨어 단에 내장해 두었다. 본 절에서는 비행 중 쌓이는 압축형 타임머신 기록 장치인 **ULog(*.ulg 파일)**의 시스템 아키텍처와, 이를 낱낱이 파헤치고 셜록 홈스의 지도력으로 진단을 내릴 수 있게 해주는 필수 분석 플랫폼인 Flight Review(웹)PlotJuggler(데스크톱) 의 고해상도 해부 기법(Profiling Technique)을 체계적으로 서술한다.

1. ULog 아키텍처: 마이크로초 단위의 시계열 스냅샷 통(Bucket)

NuttX RTOS 상에서 돌아가는 PX4의 로거(Logger) 모듈 스레드는 무자비한 기록자이다.

시스템이 시동(Arming)이 걸린 그 순간부터, 로딩 스레드는 uORB 미들웨어 메시징 버스 위를 흐르는 거의 모든 중요 C구조체(Topic 데이터)를 압축(Compression LZ4 알고리즘 등)하여 MicroSD 카드 속단에 무정지(Non-blocking) 파일 디스크립터(File Descriptor) 스트림으로 밀어 넣는다.

  • 기록 밀도: IMU 자이로센서의 날 것(Raw) 흔들림값(sensor_gyro)부터 시작해, 수천 줄을 통과해 나온 모터 최종 PWM 출력값(actuator_outputs), 배터리 전류 소모량 파형(battery_status)에 이르기까지 보통 50\text{Hz} 에서 250\text{Hz} 주사율로 초고해상도 다차원 배열 벡터로 적층한다.
  • 압축 파일(.ulg) 하나당 보통 수십 메가바이트(\text{MB})를 할당하며, 이는 “마그네토미터(나침반)에 간섭이 언제부터 어떻게 시작되어 고도를 떨어뜨렸는지” 그 폭주 임계점 지뢰밭을 역재생(Rewind)할 수 있는 완벽한 시계열(Time Series) 데이터 덩어리가 된다.

2. 대중적 시각화의 정점: Flight Review (웹 기반 플랫폼)

이 무차별적인 바이트(Byte) 바이너리 파일을 시각화하여 엔지니어링 지표로 만들어주는 가장 공식적이고 우아한 관문은 Flight Review (logs.px4.io 또는 review.px4.io) 플랫폼이다.

브라우저에 ULog 파일을 드래그 앤 드롭(Drag and Drop)하기만 하면, PX4 생태계 커뮤니티가 마련해 둔 수백 개의 Python 로직 스크립트가 돌아가며 이 파일을 스캐닝하고 치명적인 요약 그래프 대시보드를 즉각 뽑아낸다.

2.1 Flight Review의 3대 필수 강타 디버그 플롯(Plot)

  1. 세트포인트 추종(Tracking) 반응 그래프 (Roll/Pitch/Yaw Angular Rate):
    가장 화려하면서도 슬픈 그래프다. 비행 제어기 PID 알고리즘이 목표로 찍은 앵귤러 속도(Setpoint, 예: 붉은 선)를 향해 실제 기체 자이로(Estimated, 예: 녹색 선)가 과충격(Overshoot)이나 지연(Lag) 없이 얼마나 착 달라붙어 따라다니는지를 눈으로 입증한다. 만약 이 두 선이 요동치며 이격된다면, 즉각 PID 튜닝 게인(Gain) 값을 다시 짜야 하는 명백한 1급 처방전이다.
  2. 진동 프로파일링 (Vibration Metrics, 스펙트로그램):
    모터 베어링 파손이나 프레임 뒤틀림에 의해 발생한 기계적 X,Y,Z 진동(Acceleration Noise) 피크를 FFT(Fast Fourier Transform)로 변환해 3D 히트맵으로 부각해 준다. 만약 Z축 진동수준이 주황색이나 빨간색 임계선(\text{rms} 초과 영역) 안에 들어왔다면, EKF2 필터가 파괴되어 드론이 급발진 상승할 확률이 높다는 섬뜩한 파판정 경고다.
  3. 액추에이터(Actuator) 모터 포화 상태 지표:
    모터가 클리핑(Clipping), 즉 PWM 한계치 끝 스로틀 100%에 부딪혀 오도 가도 못하고 발악하고 있는 현상을 직관적으로 나타내준다. 하드웨어 스펙 한계 붕괴를 한눈에 볼 수 있다.

3. 심미경적 딥 레벨 프로파일링 툴: PlotJuggler

고인물(Expert) 임베디드 코어 개발자들의 영역으로 넘어오게 되면 Flight Review의 아름답고 고정된 요약 템플릿만으로는 한계가 발생한다.
내가 새로 짠 사용자 정의(Custom) uORB 토픽(custom_app_data_s)을 열람해야 하거나, 특정 센서 인덱스 값과 타임스탬프 스파이크를 마이크로초 단위 휠 로라(Wheel-roll)로 줌-인(Zoom-in)하여 겹쳐서 도식화(Overlay)해야 할 때는 로컬 데스크톱 프로그램인 PlotJuggler가 무대의 막을 올린다.

3.1 C++ Qt 기반 고속 타임라인 시각화 아키텍처

PlotJuggler는 ULog 파서 플러그인을 탑재하여 기가바이트(\text{GB}) 급 로그도 단 몇 초 만에 RAM에 해체 로딩(Loading)시킨다.

  • 다차원 시계열 플로팅(Multi-dimensional Series): 화면 좌우 분할 플롯(Plot) 기능으로 나침반 간섭 곡선(Magnetometer X, Y 궤도)과 모터 순간 암페어(Ampere) 소비 곡선을 같은 화면, 같은 세미-투명 레이어 탭으로 완전히 겹쳐 렌더링(Rendering)한다. 두 곡선 사이에서 자기장 교란의 인과율이 모터 스로틀 펌핑 전류 변동과 완벽히 동기화되어 스파크를 일으켰다는 것을 1\text{ms} 레이턴시도 없이 눈으로 잡아낼 수 있는 경이로운 공학 돋보기라 할 수 있다.

결론적으로, 현장의 드론 개발자가 비행 로그의 미로를 헤치고 ULog 구조의 밑바닥을 더듬는 이 과정(Profiling)은 단순한 후처리 작업(Post-process)이 아니다. 그것은 기계가 죽어가면서 남긴 차가운 숫자의 파동 속에서, 통신, 센서 노이즈, PID 알고리즘과 외부 바람이라는 물리 역학이 어떻게 충돌하여 에러를 일으켰는지를 정확한 시계열 수식으로 되돌려 역해석(Reverse-engineering)하는 PX4 아키텍처 엔지니어링의 최고 예술이자 고행의 길이다.