Аналіз INAV Blackbox: налаштування PID і фільтрів за логом
INAV використовують для навігації: утримання позиції, повернення додому, польотні завдання. Усе це спирається на внутрішній контур кутової швидкості. Якщо гіроскоп шумить, а PID налаштовані неправильно, квадрокоптер гірше тримає висоту, розгойдується в POSHOLD і перегріває мотори. Нижче — як записати лог, придатний для аналізу, що роблять параметри INAV і що показали дев’ять реальних логів INAV 6–8 у bbdoctor.
Налаштування запису: частота, необроблений гіроскоп, мотори
INAV задає частоту запису як частку від частоти циклу: 1,000,000 / looptime × blackbox_rate_num / blackbox_rate_denom. За стандартного looptime = 500 (2 кГц) співвідношення 1/2 дає 1 кГц, а 1/32 — приблизно 62 Гц. Два квадрокоптери з INAV 7.1 у нашій колекції записували логи на частотах 60 і 58 кадрів за секунду.
- 500 Гц або більше. Шум моторів і пропелерів переважно вище 80 Гц, резонанси рами — зазвичай від приблизно 100 Гц. Лог показує частоти лише до половини своєї частоти запису, тож лог на 60 Гц обривається на 30 Гц. bbdoctor запускає перевірки вібрацій і шуму моторів лише від 500 Гц. Теоретично 1/4 дає 500 Гц, але реальна частота циклу в наших логах була 1890–1990 Гц, тому 1/4 не дотягує до порога. Використовуй 1/2.
- GYRO_RAW. Дані гіроскопа до фільтрації. Без них не відрізнити вібрацію рами від роботи фільтрів, не виміряти затримку фільтра й не визначити, чи несправний датчик, чи стався збій прошивки.
- MOTORS. Команди моторам. Без них не визначити шум моторів, розподіл навантаження чи реакцію на стік; до того ж bbdoctor відхилить лог. Так сталося з одним із наших зразків INAV 7.0 (Matek H743).
- Накопичувач. Вбудована флеш-пам’ять уміщує лише кілька хвилин запису на 1 кГц; SD-карта має встигати записувати дані. В одному логу INAV 6.1.1 з плати H7 загубилося 27% кадрів і з’явилося 6 пропусків, тож до всіх його показників треба ставитися з обережністю.
blackbox GYRO_RAW blackbox MOTORS set blackbox_rate_num = 1 set blackbox_rate_denom = 2 save
Якщо флеш-чип невеликий, залиш частоту 500 Гц і роби короткі тестові польоти по 30–60 с. Щоб точно визначити резонанс, запиши один короткий лог 1/1 (2 кГц). Загальні рекомендації — у посібнику з налаштування Blackbox.
INAV 8 і новіші версії записують activeFlightModeFlags — режими, які справді були активними. Так легко відрізнити ACRO від самовирівнювання та навігаційних режимів. INAV 7 і старіші версії записують лише flightModeFlags — увімкнені перемикачі режимів; перемикач навігаційного режиму може бути ввімкнений, але сам режим не активується, наприклад через відсутність GPS-фіксації.
Як літати під час запису лога
PID можна оцінювати лише в режимі ACRO. В ANGLE, HORIZON і навігаційних режимах стік задає кут, а між стіком і контуром кутової швидкості працює контур кута. Тому реакція мало що говорить про PID. bbdoctor не враховує такі відрізки у висновку щодо PID. У другому польоті квадрокоптера H743 нижче (73 с, 78% часу в ANGLE/HORIZON) звіт описує шум, фільтри та розподіл навантаження, але нічого не каже про перерегулювання: оцінювати його тут немає за чим.
- Зроби 6–8 різких ролів і фліпів: різко поверни стік у центр і затримай його там на пів секунди. Якщо на кожній осі менше шести зупинок, перевірити відскок не вдасться; у якісному логу H743 була одна зупинка на кожній осі.
- Зроби 5–8 чітких скидань газу: набери висоту з газом понад 35%, різко скинь його до нуля й на секунду залиш стіки по центру. Скидання, що переходить у фліп, не годиться для аналізу propwash.
- Зроби кілька різких наборів газу від зависання до повного газу, а також політ із рівним газом на різних рівнях для карти шуму.
Для великого коптера фліпи не потрібні: достатньо коротких різких нахилів на безпечній висоті. Навігацію вимкни.
Параметри INAV, які налаштовують за логом
| Параметр | Типове значення | Що робить і коли змінювати |
|---|---|---|
mc_p_roll, mc_i_roll, mc_d_roll (для pitch — аналогічно) | 40 / 30 / 23 | Основні PID. Перерегулювання через контур P/D: зменш P або збільш D. I компенсує постійні сили: зміщений центр ваги, вітер. |
mc_p_yaw, mc_i_yaw, mc_d_yaw | 85 / 45 / 0 | D для yaw дорівнює нулю, тому в лозі немає поля axisD[2]. |
mc_cd_roll, mc_cd_pitch, mc_cd_yaw | 60 | Control Derivative — feedforward в INAV, залежить від швидкості руху стіка. Записується як axisF. |
gyro_main_lpf_hz | 60 Гц | Основний фільтр низьких частот гіроскопа (gyro_lpf_hz у заголовку). Нижче значення зменшує шум, але сповільнює реакцію. |
dterm_lpf_hz, dterm_lpf_type | 110 Гц, PT2 | Фільтр низьких частот для D-term. Якщо мотори гарячі, а шум проходить через D, знизь приблизно на 15%. |
dynamic_gyro_notch_enabled, dynamic_gyro_notch_min_hz, dynamic_gyro_notch_q | УВІМКНЕНО, 50 Гц, 120 | Динамічні режекторні фільтри (Matrix Filter). Нижня межа має бути нижче за резонанс, інакше фільтр його не дістане. |
rpm_gyro_filter_enabled, rpm_gyro_min_hz | ВИМКНЕНО, 100 Гц | Працює за телеметрією ESC; вмикай лише якщо вона (зазвичай окремим дротом) передає коректні оберти. |
setpoint_kalman_enabled, setpoint_kalman_q | УВІМКНЕНО, 100 | Фільтр Калмана для гіроскопа. Що вище q, то слабша фільтрація і менша затримка. |
d_boost_min, d_boost_max | 0.5 / 1.25 | D зменшується (×0.5) під час швидких рухів стіком і збільшується (×1.25) за різких зовнішніх збурень. |
tpa_rate, tpa_breakpoint, tpa_on_yaw | 0 / 1500 / ВИМКНЕНО | Вище порога TPA зменшує P, D і CD (FF); 0 = вимкнено. Якщо перерегулювання або тремтіння є лише на великому газі — увімкни. |
mc_iterm_relax, mc_iterm_relax_cutoff | RP / 15 | Не дає I надмірно накопичуватися під час швидкого руху стіком. Відскок: cutoff 15 → 10; для yaw задай mc_iterm_relax = RPY. |
antigravity_gain, antigravity_accelerator | 1 / 1 | Anti-gravity, де 1 означає вимкнено. Якщо ніс просідає під час різкої зміни газу — задай 2. |
airmode_type | STICK_CENTER | STICK_CENTER зупиняє зростання I за нульового газу й стіків по центру. В документації INAV для пропелерів до 7" рекомендовано THROTTLE_THRESHOLD. |
throttle_idle | 8 (%) | Мінімальні оберти моторів. Якщо під час propwash мотор стоїть на мінімальних обертах — додай 2. |
ez_enabled | ВИМКНЕНО | EzTune: коли ввімкнено, PID, фільтри й rates задаються повзунками ez_filter_hz, ez_response, ez_damping та іншими; ручні зміни перезаписуються. |
Типові значення взято з INAV Settings.md; свої перевір командою get. Багато параметрів не потрапляють у заголовок лога: там є PID-рядки, gyro_lpf_hz, dterm_lpf_hz, dynamicGyroNotchMinHz, TPA і rpm_gyro_*, але немає d-boost, anti-gravity, I-term relax, airmode_type та параметрів EzTune. Значення throttle_idle bbdoctor відновлює з minthrottle. Тому для цих параметрів звіт радить «перевірити командою get». Спершу збережи поточні значення:
get mc_ get dterm_lpf get dynamic_gyro_notch get antigravity get mc_iterm_relax get throttle_idle get airmode_type
Щоб перевірити всю конфігурацію, встав diff all у перевірку конфігурації.
Реальні логи INAV і що вони показали
INAV 7.1 на 60 Гц: вібрації невидимі, PID не оцінити
Matek F722SE на 6S (польоти тривалістю 213 і 171 секунду) та SpeedyBee F7 V3 (26 секунд) — обидва з blackbox_rate_denom = 32 і циклом 2 кГц — записували 60 і 58 кадрів за секунду. F722SE до того ж не записував GYRO_RAW, а всі польоти проходили виключно в ANGLE/HORIZON. Видно лише частоти 0–30 Гц, тож шум моторів, резонанси й фільтри поза межами лога. PID також неможливо оцінити: неправильні і частота, і режим.
Усе ж можна оцінити розподіл навантаження між моторами (у F722SE праві мотори працюють на 17% інтенсивніше: центр ваги зміщено праворуч, тож перевір акумулятор і важкі деталі, розташовані не по центру), напругу акумулятора під навантаженням, події failsafe і хронологію падіння. Це повільні процеси, для яких 60 Гц достатньо.

INAV 8, Matek H743, 6S: резонанс 117 Гц і перерегулювання не через FF
Якісний лог: 995 Гц, GYRO_RAW, 55 секунд у ACRO, коефіцієнти значно вищі за стандартні: roll P 80, I 22, D 32, FF 100; pitch 88 / 24 / 35 / 110.
- Необроблений шум вище 80 Гц: roll 8.0, pitch 6.8, yaw 4.6 град/с. Межі bbdoctor: менше 4 — добре, 4–10 — шумно, понад 10 — критично. Після фільтрації — 1.07 град/с, затримка фільтра приблизно 2.3 мс, тобто фільтри справляються.
- Резонанс 117 Гц лише на pitch, на 12 дБ вище фонового рівня й незмінний на всіх рівнях газу: механічна причина (див. рисунок нижче). Фільтри послаблюють його приблизно на 17 дБ, але він усе одно доходить до PID-контуру. За частоти запису 995 Гц справжня частота неоднозначна: 117 Гц або 878 чи 1112 Гц, згорнуті вниз. До того ж
dynamicGyroNotchMinHzтут дорівнює 126 Гц. Якщо пік справді на 117 Гц, динамічний notch його не дістане: записані позиції notch (gyroPeakPitch[0..2], INAV 8) показують, що перший pitch-notch чверть польоту впирався в нижню межу, 125–127 Гц. Спершу зміцни раму, стеки, камеру й антену, потім запиши короткий лог 1/1 (2 кГц) і вирішуй щодо notch. - Шум моторів — 2.9% (найгірше на M3); bbdoctor позначає його від 2.5%, а від 4% вважає критичним. Записані PID-компоненти показують, що D несе у 4–4.5 раза більше цього шуму, ніж P, а FF — майже нічого. Звіт радить змінити
dterm_lpf_hzзі 185 на 157. - Перерегулювання: 30% на roll (133 відрізки руху стіком, 90% значень у діапазоні 24–36%), 25% на pitch. Демпфування ζ ≈ 0.42 і 0.41 за здорової норми 0.6–0.9: після піка реакція на 14% опускається нижче цілі й коливається приблизно на 7 Гц. FF виконує лише 22% (roll) і 19% (pitch) роботи та не випереджає рух стіка, тож перерегульовує сам контур P/D — зниження
mc_cd_*не допоможе. - Затримка від заданого значення до піка реакції roll: 31 мс (27.7–33.6), тоді як у чітко налаштованого коптера з feedforward це 4–12 мс. Не збільшуй FF, щоб скоротити затримку, поки вісь перерегульовує.
- Propwash (0.6 град/с, 12 чистих скидань із 15) і різкі набори газу (pitch 1.0°, roll 0.6°) у нормі. Відскок перевірити не вдалося: на кожній осі була лише одна різка зупинка.
Логіка звіту: зменшити P для pitch на 10%. P для roll залишити, бо вісь і так має затримку 31 мс; D для roll збільшити на 10% (32 → 35), лише коли зникне шум моторів, інакше мотори працюватимуть гарячіше.
set dterm_lpf_hz = 157 set mc_p_pitch = 79 save
Але спочатку перевір EzTune. Фільтри в цьому лозі точно відповідають формулі EzTune для ez_filter_hz = 190: gyro_lpf_hz 190, dterm_lpf_hz на 5 Гц нижче, нижня межа notch — дві третини (126), а notch Q — 250. Коефіцієнти pitch у 1.1 раза вищі за roll, тобто ez_axis_ratio дорівнює 110. Якщо get ez_enabled показує ON, EzTune перезапише наведені вище команди. Або виконай set ez_enabled = OFF (поточні PID і фільтри залишаться) і тоді застосуй зміни, або зміни повзунок: ez_filter_hz 190 → 160 задасть dterm_lpf_hz 155, але також знизить частоту фільтра гіроскопа до 160 Гц (більша затримка) і нижню межу notch до 106 Гц.
escRPM у цьому лозі працює й змінюється разом із газом, але rpm_gyro_filter_enabled = 0. RPM-фільтр прибрав би частину шуму моторів, але не резонанс 117 Гц, який не змінюється зі швидкістю моторів.

INAV 8, BetaFPV F411, крихітка 1S: D у дванадцять разів сильніший за P
Десять секунд на 973 Гц із GYRO_RAW. PID roll: P 17, I 86, D 50, FF 60; pitch 40 / 90 / 35 / 60. D для roll утричі більший за P, тоді як у стандартних налаштуваннях INAV D дорівнює 23, а P — 40. У лозі D-term roll у 12 разів сильніший за P і несе майже весь шум моторів: 5.5% на моторах (M4 — критично), 22.1 град/с необробленого шуму roll і 4.8 град/с після фільтрації. Схоже на помилку або переплутані значення — із цього звіт і починає:
set mc_d_roll = 35 save
Є ще три знахідки. RPM-фільтр увімкнено (rpm_gyro_filter_enabled = 1), але escRPM увесь політ показує те саме беззмістовне число, тож, схоже, фільтр працював без даних про оберти. Діагональні мотори M1+M4 постійно працюють інтенсивніше (на 46%): мікшер постійно коригує yaw, тож перевір, чи не нахилений мотор і чи збігаються пропелери. Propwash становив 9.4 град/с, але це лише за трьома чистими скиданнями газу (для впевненого висновку потрібно п’ять); у двох випадках найслабший мотор простояв на мінімальних обертах щонайменше 150 мс із пів секунди після скидання. Тут справа не в нестачі D — польотному контролеру вже нічим гальмувати. Якщо наступний політ це підтвердить: throttle_idle 8 → 10 і airmode_type = THROTTLE_THRESHOLD. Докладніше — у посібнику з propwash.
INAV 6.x: відфільтрований гіроскоп обнулився, а необроблений працював
Два квадрокоптери, обидва розбилися. INAV 6.1.1 на AocodaRC H7 Dual (3S): відфільтрований гіроскоп показує суцільний нуль протягом 0.9 с під час спрацювання failsafe, хоча пакети RC продовжують надходити. INAV 6.0.0 на iFlight Blitz F7 (6S): нуль протягом 1.5 с; failsafe за 1.4 с до удару із силою 9 g, газ падає з 32% до 4%, а пакети RC і далі надходять. В обох випадках необроблений гіроскоп продовжував бачити обертання: датчик був справний, нуль виник через прошивку.
bbdoctor визначає зависання, коли всі три осі гіроскопа залишаються абсолютно незмінними щонайменше 0.3 с у повітрі. Без GYRO_RAW не відрізнити збій прошивки від несправності датчика. Що робити: онови прошивку, перевір, чи не призначено failsafe на перемикач радіоапаратури, і переглянь failsafe_procedure. Якщо це трапляється і без failsafe, перевір пайку й живлення FC на 3.3 В.
Порядок налаштування INAV
- Запис. Від 500 Гц, GYRO_RAW, MOTORS. Виріши, як працювати з EzTune: налаштовувати повзунками або задати
ez_enabled = OFFі підбирати параметри вручну. - Механіка. Необроблений шум понад 4 град/с на roll або pitch, піки, що зростають разом із газом (пропелери, мотори), або пік сталої частоти (рама) — спершу перевір пропелери, гвинти й вібророзв’язку стека. Фільтри не виправляють механіку. Докладніше — у посібнику про шум і фільтри.
- Фільтри. Шум моторів від 2.5% і більше та теплі мотори: зменш
dterm_lpf_hzна 15%. Шум усе ще проходить: зменшgyro_main_lpf_hzна 15%. Резонанс нижче заdynamic_gyro_notch_min_hz: знизь межу після підтвердження частоти логом на 2 кГц. Якщо телеметрія ESC працює — увімкни RPM-фільтр. Якщо шум незначний, а мотори холодні — трохи послаб фільтри, щоб зменшити затримку. - P і D. За перерегулювання спершу перевір частку FF. Якщо вона мала, причина в P/D: зменш P, а якщо ζ нижче за 0.6 і мотори холодні — збільшуй D кроками по 10%.
- I, relax, anti-gravity, TPA. Відскок:
mc_iterm_relax_cutoff15 → 10, потім зменш I на 10%. Ніс просідає за різкого газу:antigravity_gain = 2. Перерегулювання чи тремтіння лише на великому газі: зміниtpa_rateз 0 на 20 або додай 15, якщо TPA вже ввімкнено (в INAV він масштабує P, D і CD). - Propwash. Мотор простоює на мінімальних обертах під час скидань газу: збільш
throttle_idleна 2 і задайairmode_type = THROTTLE_THRESHOLD, а не збільшуй D. Сам Airmode має бути ввімкнений:feature AIRMODEабо перемикач AIR MODE. - FF і згладжування стіка — насамкінець, коли контур перестане перерегульовувати.
За один політ змінюй один параметр; після кожної зміни перевіряй температуру моторів на дотик. Як читати перехідну характеристику, описано в посібнику з налаштування PID за Blackbox.
Коли нічого не змінювати. Якщо лог нижче 500 Гц — не чіпай фільтри. Якщо політ був в ANGLE або навігаційному режимі — не змінюй PID. Менше п’яти чистих скидань газу — не налаштовуй propwash; менше шести різких зупинок на кожній осі — не змінюй relax та I. Якщо помітно втрачено кадри — зроби новий політ. За необробленого шуму нижче 4 град/с, шуму моторів нижче 2.5% і демпфування 0.6–0.9 залиш налаштування як є: сильніша фільтрація додає затримку, а більше D нагріває мотори.
Чим логи INAV відрізняються від Betaflight
- Назви. Заголовок зберігає коефіцієнти в одному рядку:
rollPID:80,22,32,100означає P, I, D і FF; у CLI це окремі параметриmc_p_roll,mc_i_roll,mc_d_rollіmc_cd_roll. Команди Betaflight, як-отp_rollчиf_roll, не працюватимуть. - Поля. Задане значення записується як
axisRate, а неsetpoint; PID-компоненти — якaxisP,axisD,axisF. bbdoctor використовує їх, щоб визначити частку шуму моторів і перерегулювання від P, D та FF. - Немає RPM для кожного мотора. Лог не вкаже на один незбалансований мотор, лише на загальний шум, резонанси й навантаження. Підозрюєш мотор? Знайди його, міняючи компоненти місцями.
- Нумерація моторів Quad X така сама: M1 — правий задній, M2 — правий передній, M3 — лівий задній, M4 — лівий передній.
Спершу чистий внутрішній контур, потім навігація
Контролери позиції та висоти INAV видають задані кут і газ, які мають відтворити щойно налаштовані контури кута й кутової швидкості. Якщо roll має перерегулювання 30% і коливається на 7 Гц, POSHOLD розгойдуватиметься, а зміна nav_mc_pos_xy_p чи nav_mc_vel_xy_p виправлятиме не той контур. Дій у такому порядку:
- Чистий внутрішній контур, оцінений за логом ACRO.
- Газ зависання: знайди рівень газу (поле
rcCommand[3]), за якого квадрокоптер зависає, не набираючи й не втрачаючи висоту, і задай його дляnav_mc_hover_thr(ті самі одиниці 1000–2000). Контролер висоти відштовхується від цього значення. - Потім налаштуй коефіцієнти висоти (
nav_mc_pos_z_p,nav_mc_vel_z_*) і позиції (nav_mc_pos_xy_p,nav_mc_vel_xy_*), по одному за політ.
bbdoctor аналізує внутрішній контур, а не контролери навігації.
Автоматична перевірка
bbdoctor безкоштовно аналізує логи INAV Blackbox (.txt і .bbl) онлайн: вимірює все, що описано в прикладах вище, і пропонує команди в синтаксисі INAV CLI, розраховані від поточних значень. Оскільки пороги налаштовували на FPV-квадрокоптерах із Betaflight, для великих дронів наведені у звіті оцінки приблизні. Переглянь приклад звіту.
Часті запитання
Як записати необроблені дані гіроскопа в INAV?
У CLI введи blackbox GYRO_RAW, а потім save. Команда blackbox без аргументів показує поля, що записуються; MOTORS також має бути ввімкнено. Частоту визначають blackbox_rate_num і blackbox_rate_denom: для аналізу вібрацій і фільтрів потрібно 500 Гц або більше, а за looptime 500 це співвідношення 1/2 (приблизно 1 кГц). На практиці 1/4 дає трохи менше ніж 500 Гц, тож перевірки вібрацій не запускаються.
Чи є в INAV автоналаштування мультироторів?
Вбудований режим AUTOTUNE в INAV призначений для літаків. Мультиротори налаштовують вручну за логом або простіше — через EzTune (ez_enabled), який розраховує PID і фільтри за кількома повзунками. Коли EzTune ввімкнено, ручні зміни PID перезаписуються.
Що таке mc_cd_roll в INAV?
Control Derivative — аналог feedforward у Betaflight. Він спрямовує коптер у рух залежно від швидкості переміщення стіка, ще до реакції P. Типове значення — 60 для кожної осі. У заголовку лога це четверте число в rollPID, а в даних лога — поле axisF.
Чому мій лог INAV записаний на частоті 60 Гц?
Частота запису дорівнює частоті циклу, помноженій на blackbox_rate_num і поділеній на blackbox_rate_denom. За looptime 500 (2 кГц) і співвідношення 1/32 виходить приблизно 62 Гц, тож лог показує лише частоти від 0 до 30 Гц. Для 1 кГц задай blackbox_rate_num = 1 і blackbox_rate_denom = 2.
Оновлено: