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, а где ANGLE, HORIZON или навигация. В логах INAV 7 и старше есть только flightModeFlags — маска включённых переключателей, и режим приходится восстанавливать по ним. Это менее точно: навигационный режим может стоять на тумблере, но не включиться, например без GPS.
Что летать для лога
PID оцениваются только по полёту в ACRO. В ANGLE, HORIZON и навигационных режимах стик задаёт угол, а не скорость вращения: между стиком и контуром скорости сидит контур угла, и отклик на стик уже ничего не говорит о PID. bbdoctor такие участки из оценки PID исключает. Пример: второй полёт H743-квадрика на INAV 8 — 73 секунды, из них 78% в ANGLE/HORIZON. В отчёте есть шум, фильтры, перекос нагрузки и сопротивление батареи, но ни слова про перелёт и демпфирование — судить не по чему.
Программа на 30–60 секунд в ACRO:
- 6–8 резких роллов и флипов по roll и pitch; после каждого стик резко в центр и полсекунды держи. Если остановок меньше шести на ось, отскок после флипа не проверить: в хорошем логе H743-квадрика их было по одной на ось.
- 5–8 чистых сбросов газа: набери высоту на газу выше 35%, резко в ноль, стики секунду по центру. Сброс, который сразу переходит во флип, для оценки пропвоша не годится.
- Несколько панчей с висения до полного газа.
- Немного ровного полёта на разном газе — для карты шума.
Большому аппарату флипы не нужны: хватит коротких резких наклонов на безопасной высоте. Навигацию в этом полёте не включай.
Параметры 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 | ON, 50 Гц, 120 | Динамические notch-фильтры (Matrix Filter). Нижняя граница должна быть ниже частоты резонанса, иначе notch до него не дотянется. |
rpm_gyro_filter_enabled, rpm_gyro_min_hz | OFF, 100 Гц | RPM-фильтр по оборотам из телеметрии ESC. Включай, только если телеметрия реально работает (обычно отдельный провод от ESC) и обороты приходят правильные. |
setpoint_kalman_enabled, setpoint_kalman_q | ON, 100 | Фильтр Калмана на гироскопе. Больше q — слабее фильтрация и меньше задержка. |
d_boost_min, d_boost_max | 0.5 / 1.25 | Множители D: на резком стике D ослабляется (до ×0,5), на резких внешних возмущениях усиливается (до ×1,25). |
tpa_rate, tpa_breakpoint, tpa_on_yaw | 0 / 1500 / OFF | 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 не растёт. Для коптеров с пропами до 7" документация INAV советует THROTTLE_THRESHOLD. |
throttle_idle | 8 (%) | Холостой ход. Пропвош, при котором мотор лежит на холостых, — поднимай на 2. |
ez_enabled | OFF | EzTune: при 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 Гц хватает.

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. Что нашёл разбор:
- Сырой шум выше 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 до него не опускается. INAV 8 пишет в лог и частоты, на которых стоят notch-фильтры (поляgyroPeakPitch[0..2]): первый notch по pitch четверть полёта стоит на 125–127 Гц, то есть упирается в границу. Правильный порядок — протянуть раму, стек, камеру и антенну, записать короткий лог 1/1 (2 кГц) и только потом решать про notch. - ВЧ-шум на моторах 2,9% (больше всего у M3). bbdoctor отмечает его с 2,5%, критично — с 4%. По записанным составляющим PID видно, кто несёт шум: D-составляющая в 4–4,5 раза сильнее P, FF почти ноль. Совет отчёта:
dterm_lpf_hz185 → 157. - Перелёт: roll 30% (по 133 участкам с движением стика, 90%-й интервал 24–36%), pitch 25%. Демпфирование ζ ≈ 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 ради задержки, пока ось перелетает, нет смысла: сначала перелёт.
- Пропвош 0,6 °/с по 12 чистым сбросам из 15, на 12 панчах аппарат держит угол (pitch 1,0°, roll 0,6°). Отскок после флипов не проверить: по одной резкой остановке на ось.
Логика отчёта. По 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 Гц нет — тот от оборотов не зависит.

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 по логу
- Запись. От 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_rate0 → 20, а если TPA уже включена, +15 (в INAV она режет P, D и CD). - Пропвош. Если на сбросах мотор лежит на холостых —
throttle_idle+2 иairmode_type = THROTTLE_THRESHOLD, а не D. Сам airmode при этом должен быть включён:feature AIRMODEили режим AIR MODE на тумблере. - FF и сглаживание стиков — последними, когда контур уже не перелетает.
Одно изменение за полёт, после каждого потрогай моторы. Общий метод чтения отклика — в гайде настройка PID по blackbox.
Когда ничего не менять. Лог ниже 500 Гц — не трогай фильтры. Полёт в ANGLE или навигации — не трогай PID. Меньше пяти чистых сбросов — не лечи пропвош, меньше шести резких остановок на ось — не трогай 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в INAV не сработают. - Поля. Уставка пишется как
axisRate, а неsetpoint; составляющие PID —axisP,axisD,axisF. По ним bbdoctor и раскладывает шум моторов и перелёт по P, D и FF. - Нет оборотов по моторам. Найти по логу конкретный мотор с дисбалансом нельзя — только общий шум, резонансы и нагрузку. Подозреваешь мотор — ищи перестановками.
- Нумерация моторов 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 бесплатно разбирает 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 кГц.
Обновлено: