Betaflight derinimo matematika — ką iš tikrųjų daro kiekvienas terminas
Kas vyksta Betaflight viduje, kai pastumi slankiklį. Čia pateiktos formulės išvestos iš pid.c Betaflight šaltinio kode. Suprasti matematiką reiškia, kad konfigūratoriaus slankikliai tampa nuspėjami, o ne mistiniai (o iki tol aš juos stumdydavau maždaug kaip radijo imtuvo rankenėles — kol nuskamba).
PID valdymo kilpa
flowchart LR
RC[RC setpoint<br/>°/s] --> ERR
GYRO[Gyro measurement<br/>°/s] --> ERR
ERR([error = setpoint − gyro]) --> P[P term]
ERR --> I[I term]
GYRO --> D[D term<br/>derivative of gyro]
RC --> FF[FF<br/>derivative of setpoint]
P & I & D & FF --> SUM([sum → motor mix → ESC])Kilpa sukasi gyro sample rate greičiu (tipiškai 8 kHz su ICM-42688-P). Kiekvienas terminas skaičiuojamas laipsnių-per-sekundę erdvėje ir susumuojamas prieš paverčiant jį variklių komandomis per mixer'į.
P terminas — Proportional
Formulė:
1error = setpoint − gyro_rate [°/s]
2P = Kp × error
P reaguoja į dabartinį error. Pastumus P slankiklį, tiesiogiai skaliuojamas Kp.
| P reikšmė | Efektas |
|---|---|
| Per didelė | Greita ataka, bet oscilacija po nusistovėjimo — variklių „buzz“ |
| Teisinga | Aštrus atsakas, švariai nusistovi |
| Per maža | Vangu — dronas niekada nepasiekia užsakyto rate |
P taikomas error (setpoint − gyro). Kadangi setpoint yra įtrauktas, P sukuria „derivative kick“, kai setpoint šokteli. Būtent todėl D terminas sąmoningai taikomas vien gyro, o ne error — žr. žemiau.
D terminas — Derivative
Formulė:
1D = −Kd × d(gyro_rate)/dt
D — tai vien gyro matavimo išvestinė, o ne error. Tai daroma sąmoningai. Jei D būtų taikomas error, kiekviena stick'o įvestis sukeltų didelį D spike, nes setpoint keičiasi akimirksniu, o gyro — ne. Taikant D tik gyro, D reaguoja tik į realų sukimosi pagreitį, o ne į užsakytus šuolius.
Minuso ženklas atsiranda todėl, kad D priešinasi gyro rate pokyčiams: kai dronas greitėja link setpoint, D jį stabdo; kai jis peršoka, D stabdo grįžimą atgal.
D yra slopinimo terminas. Jis neleidžia P terminui peršokti ir oscilliuoti. P/D balansas nulemia uždaros kilpos atsako slopinimo koeficientą.
D yra low-pass filtruojamas (dviejų pakopų, konfigūruojamas per dterm_lpf1_hz ir dterm_lpf2_hz), kad nebūtų sustiprintas gyro triukšmas. Per didelis D be tinkamo filtravimo sukuria būdingą aukšto dažnio oscilaciją ir variklių kaitimą.
I terminas — Integral
Formulė:
1I += Ki × error × dt
I kaupia error laike. Jei dronas turi nuolatinį error (pvz., nosį pučia vėjas ir ji niekada nepasiekia užsakyto rate), I galiausiai tampa pakankamai didelis, kad jį įveiktų. I koreguoja steady-state error — vien P ir D terminai visada turės kažkiek liekamojo error, nes error artėjant prie nulio, grąžinamoji jėga irgi artėja prie nulio.
Anti-windup
I yra apribojamas iki ±PID_MAX_I, kad būtų išvengta „windup“ — situacijos, kai I išaugo labai didelis (pvz., įsibėgėjimo ar flip'o metu) ir tada nustumia droną toli už taikinio, kai jis grįžta.
iterm_relax
Darant greitas stick'o įvestis, I terminas gali „prisikrauti“, nes gyro reikia laiko pasiekti užsakytą rate flip'o metu. Šis papildomas krūvis sukelia bounce-back manevro pabaigoje. iterm_relax slopina I integravimą greitų įvesčių metu:
1setpoint_hf = |setpoint − low_pass_filtered(setpoint)|
2relax_factor = max(0, 1 − setpoint_hf / relax_threshold)
3I += Ki × error × dt × relax_factor
Kai stick'as juda greitai (setpoint_hf didelis), relax_factor krenta link 0 ir I nustoja kauptis. iterm_relax_cutoff parametras valdo slenksčio dažnį — didesnės reikšmės agresyviau slopina I greitų manevrų metu.
| Build dydis | iterm_relax_cutoff |
|---|---|
| 2–5" | 15 |
| 7" | 8 |
| 10"+ | 5 |
anti_gravity
Staigiai numetus gazą, dronas linkęs šiek tiek pasukti pitch/roll, nes keliamosios jėgos ir svorio balansas staiga pasikeičia. anti_gravity laikinai pastiprina I terminą tam kompensuoti:
1I_boost = I × (1 + anti_gravity_gain × |throttle_delta|)
Taikoma visada, kai |d(throttle)/dt| viršija jautrumo slenkstį. Tai laiko nosį lygią įvažiuojant į split-S ir išeinant iš dive'ų.
Feedforward (FF)
Formulė:
1FF = Kf × d(setpoint)/dt
FF yra proporcingas tam, kaip greitai juda stick'as, o ne kur jis yra. Jis numato, kokio variklių atsako reikės stick'o įvesčiai, ir įleidžia jį iškart, prieš P terminui spėjant sureaguoti į susidariusį error.
Efektas: FF pašalina vėlinimą tarp stick'o įvesties ir pradinio drono atsako. Aukštas FF = dronas reaguoja dar prieš atsiliekant — aštresnis pojūtis. Per daug FF = nervinga, spike'ai paleidus stick'ą.
Nustatyk FF į 0 visiems derinimo duomenų skrydžiams. FF įleidžia savo laiko artefaktą į step response kreivę, todėl P/D analizė tampa nepatikima.
FF taip pat turi glotninimo filtrą (ff_smooth_factor), kuris low-pass filtruoja setpoint išvestinę, kad triukšmo spike'ai nevirstų variklių komandomis.
Modeliuojamas step response: P, D, I, FF indėliai
Slankiklis → neapdorota reikšmė (BF 4.3+ Tuning skirtukas)
Betaflight 4.3+ pakeitė tiesioginį P/I/D skaičių įvedimą slankikliais. Suprasti šį atvaizdavimą padeda išvengti painiavos:
| Slankiklis | Ką jis skaliuoja | Efektas |
|---|---|---|
| Master Multiplier | Visus P, I, D kartu | Proporcingai garsiau ar tyliau bendrai |
| PD Balance | P:D santykį (pastovi sandauga) | Perkelia energiją tarp P ir D nekeičiant bendro gain'o |
| PD Gain | P ir D kartu | Didina/mažina agresyvumą |
| Stick Response / FF | Feedforward Kf | Reguliuoja stick'o aštrumą; nustatyk į 0 duomenų skrydžiams |
| Dynamic Damping (D Max) | d_max lubas | Žr. d_min / d_max žemiau |
Neapdorotos reikšmės vis dar pasiekiamos per CLI (set roll_p, set roll_i, set roll_d). Konfigūratorius jas apskaičiuoja iš slankiklių pozicijų. Po rankinio PID pakeitimo per CLI slankikliai gali nebeatspindėti faktinių reikšmių — visada patikrink CLI.
TPA — Throttle PID Attenuation
Esant dideliam gazui, varikliai gamina gerokai daugiau sukimo momento vienam komandos vienetui nei kabant vietoje. Be kompensacijos, PID'ai, kurie jaučiasi teisingi kabant, bus per daug atsakingi esant pilnam gazui — sukels oscilaciją ir variklių kaitimą greituose skrydžiuose.
Formulė:
1tpa_factor = 1 − tpa_rate × max(0, (throttle − breakpoint) / (1 − breakpoint))
2P_effective = P × tpa_factor
set tpa_rate = 50 → 50% sumažinimas esant pilnam gazui. set tpa_breakpoint = 1650 → slopinimas prasideda ties 65% gazo. (Tai iliustracinės reikšmės; realios numatytosios priklauso nuo Betaflight versijos.)
2" ripper pastaba: maži propelleriai turi labai aukštą RPM ir agresyviau reaguoja į komandų pokyčius. Pradėk nuo tpa_rate=60 (60% sumažinimas), breakpoint=60%.
d_min / d_max
Standartinis D yra fiksuota reikšmė. d_min ir d_max leidžia D dinamiškai kisti priklausomai nuo stick'o įvesties greičio:
1stick_velocity = |d(setpoint)/dt|
2d_boost = clamp(stick_velocity / d_min_boost_gain, 0, 1)
3D_effective = d_min + (d_max − d_min) × d_boost
- Kabant vietoje / esant pastoviam rate: stick_velocity ≈ 0 →
D_effective = d_min(mažesnis D → mažiau variklių kaitimo) - Greito manevro metu: stick_velocity aukštas →
D_effectivekyla linkd_max(daugiau slopinimo įvesčiai)
Taip gauni geriausią iš abiejų pusių: sumažintą D triukšmą ir kaitimą kruizuojant, bet pilną D slopinimą agresyvių įvesčių metu.
CLI komandos:
1set d_min_roll = 20 # base D (applied at rest)
2set d_roll = 30 # D_max — the peak D reached at high stick velocity
Nustatyk d_min_roll lygų d_roll (abu = tavo D reikšmei), kad išjungtum dinaminį D diapazoną ir skristum su fiksuotu D — būtina švariems derinimo duomenų skrydžiams. Taip, tai reiškia, kad prieš loginant reikės tą fiksuotą D vėl atsukti atgal; pamiršti šitą žingsnį — tradicija, kurią atlieku maždaug kas antrą sesiją.
RPM filtras
RPM filtras įdeda dinaminį notch ties kiekvieno variklio sukimosi dažniu ir jo harmonikomis:
1motor_rpm = motor_eRPM / (poles / 2) # eRPM telemetry → mechanical RPM
2fundamental_hz = motor_rpm / 60
3notch_n = fundamental_hz × n # n = 1, 2, 3 — harmonics
(eRPM, pranešamas per dvikryptį DSHOT, yra elektrinis RPM; padalijus iš polių porų skaičiaus, gaunamas mechaninis sukimosi dažnis, kurį seka notch'ai.)
Filtras seka realiu laiku, naudodamas eRPM telemetriją iš dvikrypčio DSHOT. Tai pašalina variklių triukšmą, kuris kitaip prasiskverbtų į D terminą ir pasireikštų kaip oscilacija.
Minimalaus dažnio apsauga:
1set rpm_filter_min_hz = lowest_expected_motor_Hz − 25
Žemiau šio dažnio RPM filtras išjungiamas, kad neįdėtų notch'ų į tą diapazoną, kuriame gyvena gyro skrydžio dinamika. Per maža reikšmė → filtras pašalina naudingą valdymo informaciją.
| Build | Minimalus Hz | Priežastis |
|---|---|---|
| 2" | 150 | Variklių fundamentai kabant ~200 Hz |
| 3" | 100 | Variklių fundamentai kabant ~150 Hz |
| 5" | 80 | Variklių fundamentai kabant ~120 Hz |
| 7"+ | 60 | Didesni propelleriai, mažesnis RPM |
Reikalauja: įjungto dvikrypčio DSHOT, ESC firmware, palaikančio RPM telemetriją (BLHELI_32, AM32, BLHELI_S su BlueJay).
Greita nuoroda
| Terminas | Ką pataiso | Ką daro perteklius |
|---|---|---|
| P | Vangumą, steady-state error | Oscilaciją po įvesčių |
| I | Ilgalaikį dreifą, vėjo korekciją | Žemo dažnio wobble, pogo keičiant gazą |
| D | Overshoot, per silpną slopinimą | Variklių kaitimą, aukšto dažnio buzz |
| FF | Stick-follow vėlinimą | Nervingą pojūtį, spike'us paleidus stick'ą |
| iterm_relax | Bounce-back po flip'ų | Lėtesnį I atsaką į ilgalaikius trikdžius |
| anti_gravity | Aukščio kritimą numetus gazą | Nedidelį per didelį koregavimą numetant gazą |
| TPA | Oscilaciją esant dideliam gazui | Vangumą esant dideliam gazui |
| d_min | Variklių kaitimą kabant | Mažiau slopinimo esant mažiems stick rate |
| d_max | Slopinimą greitų įvesčių metu | Variklių kaitimą ir triukšmą manevrų metu |
| RPM filtras | Variklių harmonikų triukšmą D | Fazės vėlinimą, jei nustatyta per agresyviai |
Susiję
- Tuning Flight Protocol — kaip surinkti duomenis, kurie praktiškai išmatuoja šiuos terminus
- Wobble-Test PID Protocol — nemokamų įrankių derinimo eiga
- BBL-Based PID Tuning Protocol — step response analizės metodologija
- Rate Modes — kaip stick'o pozicija atvaizduojama į setpoint °/s
- Rylo — DI paremta analizė ir PID rekomendacijos iš tavo
.bbllog'o → app.sintra.ai/community/helpers/rylo
Related Snippets
- BBL paremtas PID derinimo protokolas
Struktūrizuotas, blackbox paremtas PID derinimo protokolas, pagrįstas step … - Betaflight Rate režimai — formulės, palyginimas ir konvertavimas
Betaflight palaiko keturias rate režimų formules. Visos daro tą patį darbą — … - Betaflight Rates paaiškinti
Rates nusako, kaip greitai dronas sukasi reaguodamas į stick'ų judesį. Didesni … - Blackbox logginimo nustatymas ir lauko gidas
Blackbox įrašo kiekvieną jutiklio rodmenį, RC įvestį, PID išvestį ir variklio … - Cinematic tune iš Betaflight preset'ų
Betaflight ateina su Presets biblioteka, kurioje yra paruošti cinematic tune'ai. … - Derinimo skrydžio protokolas — kaip sukurti naudingą blackbox log'ą
Norint gauti gerus PID analizės rezultatus, reikia konkrečios skrydžio sekos. … - PID derinimas — wobble-test protokolas (nemokamų įrankių leidimas)
Sistemingas PID derinimo protokolas, pagrįstas Joshua Bardwell / Brian White … - PID pagrindai — P, I, D ir feedforward
PID kontroleris — tai pati skrydžio kontrolerio veikimo esmė. Suprasti, ką daro … - Rate preset'ai — 733 / 633 / 533 Betaflight'e ir Actual'e
533, 633, 733 — tai bendruomenės trumpiniai trims populiariems freestyle rate … - Rate profilio parinkimas ir Persistent Stats
Rate profilių perjungimas vidury sesijos per siųstuvo jungiklį ir asmeninių … - Rates Deep Dive — Expo kreivė, zonos ir throttle
Rates — tai ne tik „kaip greitai sukasi“ nustatymas. Jie nusako, kurioje stick'o …