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, а где ANGLE, HORIZON или навигация. В логах INAV 7 и старше есть только flightModeFlags — маска включённых переключателей, и режим приходится восстанавливать по ним. Это менее точно: навигационный режим может стоять на тумблере, но не включиться, например без GPS.

Что летать для лога

PID оцениваются только по полёту в ACRO. В ANGLE, HORIZON и навигационных режимах стик задаёт угол, а не скорость вращения: между стиком и контуром скорости сидит контур угла, и отклик на стик уже ничего не говорит о PID. bbdoctor такие участки из оценки PID исключает. Пример: второй полёт H743-квадрика на INAV 8 — 73 секунды, из них 78% в ANGLE/HORIZON. В отчёте есть шум, фильтры, перекос нагрузки и сопротивление батареи, но ни слова про перелёт и демпфирование — судить не по чему.

Программа на 30–60 секунд в ACRO:

  1. 6–8 резких роллов и флипов по roll и pitch; после каждого стик резко в центр и полсекунды держи. Если остановок меньше шести на ось, отскок после флипа не проверить: в хорошем логе H743-квадрика их было по одной на ось.
  2. 5–8 чистых сбросов газа: набери высоту на газу выше 35%, резко в ноль, стики секунду по центру. Сброс, который сразу переходит во флип, для оценки пропвоша не годится.
  3. Несколько панчей с висения до полного газа.
  4. Немного ровного полёта на разном газе — для карты шума.

Большому аппарату флипы не нужны: хватит коротких резких наклонов на безопасной высоте. Навигацию в этом полёте не включай.

Параметры 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_qON, 50 Гц, 120Динамические notch-фильтры (Matrix Filter). Нижняя граница должна быть ниже частоты резонанса, иначе notch до него не дотянется.
rpm_gyro_filter_enabled, rpm_gyro_min_hzOFF, 100 ГцRPM-фильтр по оборотам из телеметрии ESC. Включай, только если телеметрия реально работает (обычно отдельный провод от ESC) и обороты приходят правильные.
setpoint_kalman_enabled, setpoint_kalman_qON, 100Фильтр Калмана на гироскопе. Больше q — слабее фильтрация и меньше задержка.
d_boost_min, d_boost_max0.5 / 1.25Множители D: на резком стике D ослабляется (до ×0,5), на резких внешних возмущениях усиливается (до ×1,25).
tpa_rate, tpa_breakpoint, tpa_on_yaw0 / 1500 / OFFTPA: выше точки газа снижает 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_CENTERПри STICK_CENTER на нуле газа со стиками в центре I не растёт. Для коптеров с пропами до 7" документация INAV советует THROTTLE_THRESHOLD.
throttle_idle8 (%)Холостой ход. Пропвош, при котором мотор лежит на холостых, — поднимай на 2.
ez_enabledOFFEzTune: при ON PID, фильтры и рейты считаются из ползунков 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. PID у пилота заметно выше стандартных: roll P 80, I 22, D 32, FF 100; pitch 88 / 24 / 35 / 110. Что нашёл разбор:

Логика отчёта. По pitch — P на 10% ниже. По roll P не снижать: ось и так отвечает с задержкой 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 — 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 в этом логе живое и меняется с газом — телеметрия ESC приходит, а rpm_gyro_filter_enabled = 0. RPM-фильтр здесь можно включить: часть шума моторов он снимет, а резонанс 117 Гц нет — тот от оборотов не зависит.

Карта шума гироскопа по pitch в зависимости от газа: слева сырой гироскоп с яркой вертикальной полосой на 117 Гц, справа после фильтров, где полоса ослаблена, а шум выше 200 Гц исчез
INAV 8.0, Matek H743, лог 995 Гц: карта шума pitch по газу. Слева сырой гироскоп: вертикальная полоса на 117 Гц от 5 до 65% газа — резонанс рамы, на 12 дБ выше фона. Справа после фильтров: шум выше 200 Гц ушёл, полоса на 117 Гц ослаблена примерно на 17 дБ, но осталась.

INAV 8, BetaFPV F411, 1S-вупер: D в 12 раз сильнее P

10 секунд полёта, 973 Гц, GYRO_RAW есть. PID по roll: P 17, I 86, D 50, FF 60; по pitch — 40 / 90 / 35 / 60. Roll D втрое больше P, хотя в стандарте INAV D 23 при P 40. В логе D-составляющая по roll в 12 раз сильнее P, и почти весь шум на моторы идёт через неё: ВЧ-шум на моторах 5,5% (M4, критично), сырой гироскоп 22,1 °/с по roll, после фильтров остаётся 4,8 °/с. Похоже на опечатку или перепутанные P и D, и отчёт начинает именно с этого:

set mc_d_roll = 35
save

Ещё три находки по тому же логу. RPM-фильтр включён (rpm_gyro_filter_enabled = 1), а поле escRPM весь полёт держит одно и то же бессмысленное число — оборотов от ESC фильтр, судя по всему, не получал и работал вхолостую. Диагональ M1+M4 постоянно нагружена сильнее (46%): микшер всё время компенсирует yaw — наклонённый мотор или пропы разного шага. Пропвош 9,4 °/с, но всего по трём чистым сбросам (для уверенного вывода нужно хотя бы пять), и в двух из трёх самый слабый мотор лежит на холостых 150 мс и дольше из полусекундного окна после сброса. Это не нехватка D — полётнику просто нечем тормозить. Если подтвердится на следующем полёте: throttle_idle 8 → 10 и airmode_type = THROTTLE_THRESHOLD. Подробнее — в гайде пропвош.

INAV 6.x: отфильтрованный гироскоп упал в ноль, а сырой жил

Два разных аппарата, оба упали. INAV 6.1.1 на AocodaRC H7 Dual (3S): отфильтрованный гироскоп показывает ровный ноль 0,9 с, одновременно срабатывает failsafe, хотя пакеты с пульта продолжают приходить. INAV 6.0.0 на iFlight Blitz F7 (6S): ноль 1,5 с, failsafe за 1,4 с до удара, газ падает с 32 до 4%, удар 9 g, и пакеты с пульта тоже продолжают приходить. В обоих случаях сырой гироскоп в эти же секунды видит вращение: датчик жив, ноль появился уже в прошивке.

bbdoctor считает «заморозкой» участок, где все три оси гироскопа не меняются ни на единицу 0,3 с и дольше, причём аппарат до этого летел. Без GYRO_RAW сбой прошивки от отказа датчика не отличить — ещё одна причина его писать. Что делать: обновить прошивку, проверить, не назначен ли failsafe на тумблер пульта, и посмотреть failsafe_procedure. Если ноль появляется и без failsafe — пайка и питание 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, а если TPA уже включена, +15 (в INAV она режет P, D и CD).
  6. Пропвош. Если на сбросах мотор лежит на холостых — throttle_idle +2 и airmode_type = THROTTLE_THRESHOLD, а не D. Сам airmode при этом должен быть включён: feature AIRMODE или режим AIR MODE на тумблере.
  7. FF и сглаживание стиков — последними, когда контур уже не перелетает.

Одно изменение за полёт, после каждого потрогай моторы. Общий метод чтения отклика — в гайде настройка PID по blackbox.

Когда ничего не менять. Лог ниже 500 Гц — не трогай фильтры. Полёт в ANGLE или навигации — не трогай PID. Меньше пяти чистых сбросов — не лечи пропвош, меньше шести резких остановок на ось — не трогай 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 бесплатно разбирает blackbox-логи INAV (.txt и .bbl) онлайн: всё, что посчитано в разборах выше, с командами в синтаксисе CLI INAV от твоих текущих значений. Пороги подобраны на 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 и фильтры считаются из нескольких ползунков. Ручные правки PID при включённом EzTune перезаписываются.

Что такое 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 Гц. Поставь blackbox_rate_num = 1 и blackbox_rate_denom = 2 — будет 1 кГц.

Обновлено:

Другие гайды