bbdoctor
Діагностика дрона за логом: Betaflight, INAV, ArduPilot, PX4
RUENESPTUA

Аналіз 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 кадрів за секунду.

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) звіт описує шум, фільтри та розподіл навантаження, але нічого не каже про перерегулювання: оцінювати його тут немає за чим.

  1. Зроби 6–8 різких ролів і фліпів: різко поверни стік у центр і затримай його там на пів секунди. Якщо на кожній осі менше шести зупинок, перевірити відскок не вдасться; у якісному логу H743 була одна зупинка на кожній осі.
  2. Зроби 5–8 чітких скидань газу: набери висоту з газом понад 35%, різко скинь його до нуля й на секунду залиш стіки по центру. Скидання, що переходить у фліп, не годиться для аналізу propwash.
  3. Зроби кілька різких наборів газу від зависання до повного газу, а також політ із рівним газом на різних рівнях для карти шуму.

Для великого коптера фліпи не потрібні: достатньо коротких різких нахилів на безпечній висоті. Навігацію вимкни.

Параметри 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_yaw85 / 45 / 0D для yaw дорівнює нулю, тому в лозі немає поля axisD[2].
mc_cd_roll, mc_cd_pitch, mc_cd_yaw60Control Derivative — feedforward в INAV, залежить від швидкості руху стіка. Записується як axisF.
gyro_main_lpf_hz60 ГцОсновний фільтр низьких частот гіроскопа (gyro_lpf_hz у заголовку). Нижче значення зменшує шум, але сповільнює реакцію.
dterm_lpf_hz, dterm_lpf_type110 Гц, 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_max0.5 / 1.25D зменшується (×0.5) під час швидких рухів стіком і збільшується (×1.25) за різких зовнішніх збурень.
tpa_rate, tpa_breakpoint, tpa_on_yaw0 / 1500 / ВИМКНЕНОВище порога TPA зменшує P, D і CD (FF); 0 = вимкнено. Якщо перерегулювання або тремтіння є лише на великому газі — увімкни.
mc_iterm_relax, mc_iterm_relax_cutoffRP / 15Не дає I надмірно накопичуватися під час швидкого руху стіком. Відскок: cutoff 15 → 10; для yaw задай mc_iterm_relax = RPY.
antigravity_gain, antigravity_accelerator1 / 1Anti-gravity, де 1 означає вимкнено. Якщо ніс просідає під час різкої зміни газу — задай 2.
airmode_typeSTICK_CENTERSTICK_CENTER зупиняє зростання I за нульового газу й стіків по центру. В документації INAV для пропелерів до 7" рекомендовано THROTTLE_THRESHOLD.
throttle_idle8 (%)Мінімальні оберти моторів. Якщо під час 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 Гц достатньо.

Спектр гіроскопа pitch: вгорі лог INAV 8 на 995 Гц із піком 117 Гц у необроблених даних; унизу лог INAV 7.1 на 60 Гц, спектр якого закінчується на 30 Гц
A: INAV 8 на 995 Гц, необроблений (сірий) і відфільтрований (синій) гіроскоп pitch: пік 117 Гц і горб біля 147 Гц, який фільтри майже прибирають. B: INAV 7.1 на 60 Гц у тому самому масштабі: спектр закінчується на 30 Гц; заштрихована частина до лога не потрапила.

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.

Логіка звіту: зменшити 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 Гц, який не змінюється зі швидкістю моторів.

Карта шуму гіроскопа pitch залежно від газу: ліворуч необроблений сигнал із яскравою вертикальною смугою на 117 Гц; праворуч після фільтрації, де смуга слабша, а шум вище 200 Гц зник
INAV 8.0, Matek H743, 995 Гц: шум pitch залежно від газу. Ліворуч — необроблений гіроскоп: смуга 117 Гц за будь-якого газу, на 12 дБ вище фонового рівня. Праворуч — після фільтрації: шум вище 200 Гц зник, смуга 117 Гц стала приблизно на 17 дБ слабшою, але залишилася.

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

  1. Запис. Від 500 Гц, GYRO_RAW, MOTORS. Виріши, як працювати з EzTune: налаштовувати повзунками або задати ez_enabled = OFF і підбирати параметри вручну.
  2. Механіка. Необроблений шум понад 4 град/с на roll або pitch, піки, що зростають разом із газом (пропелери, мотори), або пік сталої частоти (рама) — спершу перевір пропелери, гвинти й вібророзв’язку стека. Фільтри не виправляють механіку. Докладніше — у посібнику про шум і фільтри.
  3. Фільтри. Шум моторів від 2.5% і більше та теплі мотори: зменш dterm_lpf_hz на 15%. Шум усе ще проходить: зменш gyro_main_lpf_hz на 15%. Резонанс нижче за dynamic_gyro_notch_min_hz: знизь межу після підтвердження частоти логом на 2 кГц. Якщо телеметрія ESC працює — увімкни RPM-фільтр. Якщо шум незначний, а мотори холодні — трохи послаб фільтри, щоб зменшити затримку.
  4. P і D. За перерегулювання спершу перевір частку FF. Якщо вона мала, причина в P/D: зменш P, а якщо ζ нижче за 0.6 і мотори холодні — збільшуй D кроками по 10%.
  5. I, relax, anti-gravity, TPA. Відскок: mc_iterm_relax_cutoff 15 → 10, потім зменш I на 10%. Ніс просідає за різкого газу: antigravity_gain = 2. Перерегулювання чи тремтіння лише на великому газі: зміни tpa_rate з 0 на 20 або додай 15, якщо TPA вже ввімкнено (в INAV він масштабує P, D і CD).
  6. Propwash. Мотор простоює на мінімальних обертах під час скидань газу: збільш throttle_idle на 2 і задай airmode_type = THROTTLE_THRESHOLD, а не збільшуй D. Сам Airmode має бути ввімкнений: feature AIRMODE або перемикач AIR MODE.
  7. FF і згладжування стіка — насамкінець, коли контур перестане перерегульовувати.

За один політ змінюй один параметр; після кожної зміни перевіряй температуру моторів на дотик. Як читати перехідну характеристику, описано в посібнику з налаштування PID за Blackbox.

Коли нічого не змінювати. Якщо лог нижче 500 Гц — не чіпай фільтри. Якщо політ був в ANGLE або навігаційному режимі — не змінюй PID. Менше п’яти чистих скидань газу — не налаштовуй propwash; менше шести різких зупинок на кожній осі — не змінюй relax та I. Якщо помітно втрачено кадри — зроби новий політ. За необробленого шуму нижче 4 град/с, шуму моторів нижче 2.5% і демпфування 0.6–0.9 залиш налаштування як є: сильніша фільтрація додає затримку, а більше D нагріває мотори.

Чим логи INAV відрізняються від Betaflight

Спершу чистий внутрішній контур, потім навігація

Контролери позиції та висоти INAV видають задані кут і газ, які мають відтворити щойно налаштовані контури кута й кутової швидкості. Якщо roll має перерегулювання 30% і коливається на 7 Гц, POSHOLD розгойдуватиметься, а зміна nav_mc_pos_xy_p чи nav_mc_vel_xy_p виправлятиме не той контур. Дій у такому порядку:

  1. Чистий внутрішній контур, оцінений за логом ACRO.
  2. Газ зависання: знайди рівень газу (поле rcCommand[3]), за якого квадрокоптер зависає, не набираючи й не втрачаючи висоту, і задай його для nav_mc_hover_thr (ті самі одиниці 1000–2000). Контролер висоти відштовхується від цього значення.
  3. Потім налаштуй коефіцієнти висоти (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.

Оновлено:

Інші гайди