Betaflight용 자동 PID 튜닝 도구를 만들었습니다 — 내부 작동 원리
Source: Dev.to
문제
Betaflight은 실제 자동 튜닝 기능이 없습니다 (iNav나 Ardupilot과 달리). 우리가 가졌던 가장 가까운 것은 PIDtoolbox인데, 이는 블랙박스 데이터를 시각화하는 데는 훌륭하지만 실제로 무엇을 바꿔야 할지는 알려주지 않습니다. 여전히 무엇을 보고 있는지 알아야 합니다.
대부분의 파일럿은 다음 중 하나를 합니다:
- 다른 사람의 PID를 복사하고 최선을 기대한다
- 주말을 시험 비행과 수동 튜닝에 보낸다
- 누군가에게 쿼드를 튜닝해 달라고 돈을 지불한다
이 중 어느 것도 좋은 옵션은 아닙니다.
내가 만든 것
FPVtune — 베타플라이트 블랙박스 로그를 읽고 신경망을 사용해 최적화된 PID 설정을 생성하는 웹 기반 도구.
기본 흐름
- 블랙박스 로그를 기록합니다 (보통대로 30 초 정도 비행)
.bbl또는.bfl파일을 fpvtune.com에 업로드합니다- PID와 필터에 대한 전체 추천 세트를 받아봅니다
설치가 필요 없으며, 브라우저에서 바로 작동합니다.
Source: …
How it works under the hood
Blackbox parsing
Betaflight blackbox 로그는 사용자 정의 형식의 바이너리 파일입니다. 저는 Python 파서를 작성하여 자이로 데이터, 모터 출력, 목표값, PID 컨트롤러 출력(P/I/D 항목) 및 RC 명령을 기록된 샘플 레이트(보통 자이로는 2 kHz, PID는 500 Hz–1 kHz)로 추출합니다.
복잡한 부분은 서로 다른 Betaflight 버전을 처리하는 것입니다—로그 형식이 버전마다 바뀌었고, 손상된 로그, 부분 기록(비행 중 배터리 방전) 및 서로 다른 기록 레이트와 같은 엣지 케이스가 존재합니다.
Signal analysis
파싱이 끝나면 원시 데이터는 여러 분석 단계로 진행됩니다:
# Simplified version of the analysis pipeline
def analyze_axis(gyro, setpoint, pid_p, pid_d, motor, axis='roll'):
# Step response analysis - how fast does the quad respond?
step_response = compute_step_response(setpoint, gyro)
# Noise floor analysis - where is the noise?
noise_spectrum = np.fft.rfft(gyro)
noise_floor = estimate_noise_floor(noise_spectrum)
# Prop wash detection - oscillations after throttle changes
throttle_events = detect_throttle_cuts(motor)
propwash_severity = measure_oscillation(gyro, throttle_events)
# D-term noise vs effectiveness tradeoff
d_noise = rms(highpass(pid_d, cutoff=100))
d_effectiveness = correlation(pid_d, gyro_error_derivative)
return AnalysisResult(step_response, noise_floor,
propwash_severity, d_noise, d_effectiveness)
Key metrics extracted
- Step response delay – 스틱 입력과 쿼드 응답 사이의 ms
- Overshoot – 쿼드가 목표 각도를 초과하는가?
- Noise floor by frequency – 모터/프로펠러 소음이 나타나는 주파수
- Prop wash severity – 스로틀 급증 후 발생하는 진동
- D‑term noise ratio – D가 실제로 도움이 되는지, 아니면 잡음만 추가하는지
The neural network
모델은 추출된 특징들을 받아 최적의 PID 값을 예측합니다. 이는 “좋은” 튜닝이 알려진 ~2 000개의 블랙박스 로그(경험 많은 FPV 파일럿이 공유한 로그와 최종 PID 값) 데이터셋으로 학습되었습니다.
아키텍처는 세 개의 은닉층을 가진 간단한 피드‑포워드 네트워크입니다:
Input (28 features) → Dense(128, ReLU) → Dense(64, ReLU) → Dense(32, ReLU) → Output (18 PID values)
18개의 출력은 롤/피치/요에 대한 P, I, D와 필터 설정(자이로 로우‑패스, D‑term 로우‑패스, 노치 필터)을 포함합니다.
Why not just use rules?
처음에는 규칙 기반 시스템을 시도했습니다(“소음이 크면 D를 낮추고, 응답이 느리면 P를 올린다”). 간단한 경우에는 동작했지만 엣지 케이스에서는 붕괴되었습니다—예를 들어 소음이 높고 응답이 느린 경우는 보통 필터가 너무 공격적이라는 뜻이며, PID를 조정하기 전에 필터를 먼저 조정해야 합니다. 신경망은 이러한 다변량 상호작용을 손으로 작성한 규칙보다 훨씬 잘 처리합니다.
기술 스택
- Backend: Python, FastAPI
- Frontend: React
- Blackbox parser: Custom Python (기존 라이브러리로는 모든 엣지 케이스를 처리할 수 없었습니다)
- ML: 학습에 PyTorch, 추론에 ONNX
- Database: PostgreSQL
The whole thing is open source on GitHub.
Results so far
내가 직접 보유한 쿼드(5″ 프리스타일, 3″ 시네훕, 7″ 장거리)에서 테스트해 본 결과 놀라울 정도로 좋았습니다. 프리스타일 빌드에서 프로프 워시 처리 능력이 눈에 띄게 향상되었고, 필터 설정에 대해 전혀 고민할 필요가 없었습니다.
완벽하진 않으며—소음이 많은 빌드에서는 때때로 너무 공격적인 필터 설정을 제안하고, RPM 필터링 튜닝은 아직 지원하지 않습니다. 하지만 견고한 기본 튜닝을 얻기 위해서는 수시간의 수작업을 절약해 줍니다.
사용해 보기
The tool is live at fpvtune.com. It costs $9.90 for a full analysis, but I have a beta test code if you want to try it free:
코드: FPVTUNE-BETA-2026 (limited uses)
Upload your blackbox log, and on the payment page expand the “Activation Code” section and enter the code.
I’d love feedback from other pilots and devs. If you fly FPV and have blackbox logs lying around, give it a shot and let me know how the suggestions compare to your current tune.
If you’re interested in the technical details of blackbox log parsing or the training pipeline, I’m happy to write a follow‑up post going deeper into either topic.