ULG → 시계열 데이터 변환 가이드
Raw고객으로부터 PX4 ULog 파일(.ulg)과 차트 요구사항을 받아, 시계열 어노테이터용 dm_schema JSON을 만드는 전체 과정을 다룹니다.
flowchart TD
subgraph 고객 제공물
A["① ULG 파일들 (.ulg)"]
B["② 차트 그룹 정의서<br/>(어떤 센서를 묶을지, 그룹 순서, 채널 이름)"]
end
subgraph 내부 작업
C["③ 트랙 설정 파일 작성<br/>(track-config.yaml)<br/>⏱ 고객별 1회"]
D["④ 변환 스크립트 실행<br/>(ulg2dm.py)<br/>⏱ 파일 수만큼 반복"]
E["⑤ 스키마 검증<br/>(validate_dm_schema.py)<br/>⏱ 변환 후 매번"]
end
subgraph 결과물
F["⑥ dm_schema JSON<br/>(어노테이터에 로드 가능)"]
end
B --> C
A --> D
C --> D
D --> E
E -->|✓ 통과| F
E -->|✗ 오류| D
| 구분 | 빈도 | 설명 |
|---|---|---|
| 트랙 설정 파일 작성 | 고객별 1회 | 고객 요구사항을 YAML로 변환 |
| 변환 스크립트 실행 | ULG 파일 수만큼 반복 | 공통 스크립트, 설정만 교체 |
| 스키마 검증 | 변환 후 매번 | 결과 JSON이 올바른지 확인 |
Python 패키지 설치
Section titled “Python 패키지 설치”Python 3.8 이상이 필요합니다.
| 패키지 | 용도 |
|---|---|
pyulog | PX4 ULog 바이너리 파일을 파싱하여 채널 데이터를 추출 |
pyyaml | 트랙 설정 파일(YAML)을 읽기 위해 사용 |
numpy | 서로 다른 샘플레이트의 센서 데이터를 공통 타임그리드로 리샘플링(선형 보간) |
샘플 파일 다운로드
Section titled “샘플 파일 다운로드”실습에 필요한 파일을 다운로드합니다:
| 파일 | 설명 | 다운로드 |
|---|---|---|
log_55_2026-2-11-15-59-02.ulg | PX4 비행 로그 샘플 (12MB) | 다운로드 |
ulg2dm.py | ULG → dm_schema 변환 스크립트 | 다운로드 |
track-config.yaml | 트랙 설정 파일 예시 | 다운로드 |
validate_dm_schema.py | dm_schema 검증 스크립트 | 다운로드 |
1단계: 고객 요구사항 분석
Section titled “1단계: 고객 요구사항 분석”고객이 제공하는 것
Section titled “고객이 제공하는 것”- Raw ULG 파일 — PX4 오토파일럿이 기록한 바이너리 센서 로그
- 차트 그룹 정의 — 어떤 센서값들을 함께 보여줄지 (예: 엑셀, 문서, 구두)
고객 요구사항 예시:
- 자세 (roll, pitch, yaw 각도)
- GPS 위치 (위도, 경도, 고도)
- 로컬 위치 (NED 좌표계 x, y, z)
- 배터리 (전압, 전류)
- 모터 출력 (motor 0~3)
ULG 파일의 채널 목록 확인
Section titled “ULG 파일의 채널 목록 확인”고객의 요구사항을 YAML 설정 파일로 변환하려면, ULG 파일에 어떤 채널이 존재하는지 먼저 확인해야 합니다:
출력 예시:
2단계: 트랙 설정 파일 작성
Section titled “2단계: 트랙 설정 파일 작성”고객의 차트 그룹 정의를 track-config.yaml 형식으로 변환합니다. 고객별 1회만 작성하면 됩니다.
YAML 형식
Section titled “YAML 형식”| 고객 요구사항 | YAML 설정 |
|---|---|
| ”자세 차트에 roll, pitch, yaw” | 1개 track, 3개 channels |
| ”GPS 위치 차트” | 1개 track, lat/lon/alt channels |
| 차트 순서 | tracks 배열 순서 = 화면 표시 순서 |
| 차트 이름 | track.name |
| 센서값 이름 | channel.name |
3단계: 변환 실행
Section titled “3단계: 변환 실행”단일 파일 변환
Section titled “단일 파일 변환”출력:
존재하지 않는 채널/필드 처리
Section titled “존재하지 않는 채널/필드 처리”설정 파일에 적은 채널이나 필드가 ULG 파일에 없으면 경고를 출력하고 해당 채널을 건너뜁니다:
4단계: 결과 검증
Section titled “4단계: 결과 검증”변환된 JSON이 시계열 어노테이터 스키마에 맞는지 검증합니다.
성공 시:
오류 발생 시
Section titled “오류 발생 시”검증 스크립트는 어디가 왜 잘못되었는지와 해결 방법을 함께 안내합니다:
변환 결과 JSON 구조
Section titled “변환 결과 JSON 구조”변환 결과는 시계열 어노테이터 스키마에 정의된 형식을 따릅니다.
부록: 자주 사용하는 PX4 채널
Section titled “부록: 자주 사용하는 PX4 채널”| 채널 | 주요 필드 | 용도 |
|---|---|---|
vehicle_attitude_setpoint | roll_body, pitch_body, yaw_body | 자세 설정값 |
vehicle_attitude | q[0]~q[3] | 자세 쿼터니언 |
vehicle_local_position | x, y, z, vx, vy, vz | 로컬 위치/속도 (NED) |
vehicle_global_position | lat, lon, alt | 글로벌 위치 (EKF 융합, lat/lon은 deg 단위) |
vehicle_gps_position | lat, lon, alt, vel_n_m_s | GPS 원시 데이터 (lat/lon은 degE7, alt는 mm. scale 필요) |
sensor_gps | lat, lon, alt, vel_n_m_s | PX4 v1.14+ 에서 vehicle_gps_position 대신 사용 |
battery_status | voltage_v, current_a, discharged_mah | 배터리 |
actuator_motors | control[0]~[3] | 모터 출력 |
actuator_outputs | output[0]~[7] | PWM 출력 |
sensor_combined | gyro_rad[0~2], accelerometer_m_s2[0~2] | IMU 원시 |
vehicle_acceleration | xyz[0], xyz[1], xyz[2] | 가속도 |
vehicle_angular_velocity | xyz[0], xyz[1], xyz[2] | 각속도 |
cpuload | load, ram_usage | 시스템 리소스 |