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

Греются моторы: как настроить фильтры по blackbox логу

Сел после пака, а моторы такие, что палец не удержать. Или на газу слышно шуршание, в видео «желе», в висении квадрик мелко дрожит. Это шум, и первая мысль — крутить фильтры. Но фильтры не убирают причину. Механику они прячут и добавляют задержку, а если шум несёт feedforward от пульта, фильтры гироскопа вообще ни при чём. Ниже — четыре числа, по которым bbdoctor ищет источник шума в логе, разбор реальных логов и порядок правок.

Почему шум греет моторы

Гироскоп чувствует не только движения квадрика, но и всё, что вибрирует: дисбаланс пропа, подшипник, лучи, стек. Фильтры вырезают часть, остальное уходит в PID. P передаёт шум как есть, а D — производная, и его отклик растёт с частотой. До фильтра D-term колебание на 300 Гц той же амплитуды, что раскачка на 30 Гц, D усиливает в десять раз сильнее.

Дальше шум попадает в команды моторам. Ротор с пропом не успевает менять обороты так быстро: при сравнении оборотов с командой bbdoctor закладывает отставание ротора около 20 мс, это примерно фильтр с частотой среза 8 Гц. На 80 Гц обороты повторяют команду раз в десять слабее, на 300 Гц — почти никак. Тяги нет, а ток через обмотки дёргается на каждом колебании, и регулятор с мотором превращают его в тепло. Поэтому граница «шума» в bbdoctor — 80 Гц: выше неё полезных движений квадрика нет, только нагрев.

Четыре числа из лога

Все числа считаются только по участкам полёта, шум — это среднеквадратичное значение (СКЗ) выше 80 Гц.

ЧислоКак считаетсяНормаВниманиеПлохо
Сырой гироскоп, °/сСКЗ нефильтрованного гироскопа, худшая из осей roll и pitchниже 44–1010 и выше
Гироскоп после фильтров, °/сто же для отфильтрованного гироскопа (то, что видит PID)до 1 — есть запасбольше 3: шум идёт в PID—
Задержка фильтров, мссдвиг, при котором сырой и отфильтрованный гироскоп совпадают лучше всего (взаимная корреляция), среднее roll и pitchжёсткой нормы нет; в логах из этого гайда 0.8–3.2больше 1.5 при чистом шуме — можно выиграть—
ВЧ-шум моторов, % ходаСКЗ команд моторам, худший мотор; только для логов от 500 Гцдо 2.5больше 2.5больше 4

Есть и пятое число — кто несёт шум. Betaflight и INAV пишут составляющие PID в лог по отдельности: axisP, axisD, axisF. bbdoctor пропускает каждую через тот же фильтр «выше 80 Гц», переводит в проценты хода мотора (сумма PID 1000 — это весь ход) и считает долю каждого члена в энергии шума. У кого 60% и больше, тот и источник, иначе источник «смешанный».

Два уточнения. Задержка меряется между сырым и отфильтрованным гироскопом, поэтому это задержка цепочки гироскопа: ФНЧ, notch, RPM-фильтр. Фильтры D-term стоят дальше, их задержка в это число не входит. И частота записи: лог на 250 Гц видит частоты только до 125 Гц, а шум моторов лежит в сотнях герц. Поэтому шум моторов bbdoctor считает только по логам от 500 Гц.

Спектры гироскопа по roll до и после фильтров: слева широкий горб сырого шума на 200–450 Гц, 35.8 °/с, после фильтров 1.34 °/с; справа сырой шум 4.1 °/с и 0.53 °/с после фильтров
Спектр гироскопа по roll до фильтров (серый) и после (синий), шум — СКЗ выше 80 Гц (пунктир). A — Betaflight 4.2.5, 4S, лог 2 кГц: широкий горб на 200–450 Гц, сырой шум 35.8 °/с, после фильтров 1.34 °/с, а моторы при этом чистые (ВЧ-шум 0.8–0.9%). B — Betaflight 4.5.2, лог 1 кГц: сырой шум 4.1 °/с, после фильтров 0.53 °/с. Шкала дБ у панелей общая.

Откуда шум: четыре случая

Механика: шумит сырой гироскоп

Лог A на рисунке: Betaflight 4.2.5, 215 секунд полёта. Сырой шум по roll 35.8 °/с, по pitch 23.8 — «плохо» с большим запасом. А после фильтров 1.34 °/с, моторы чистые: отчёт помечает сырой шум как критичный, а фильтры — «в норме». Фильтры честно справились, но ценой задержки 3.2 мс — самой большой во всех логах из этого гайда. Если смотреть только на отфильтрованный гироскоп или на моторы, проблемы не видно. А она есть: горб на 200–450 Гц дают пропы, моторы или что-то болтается.

Лечится это отвёрткой и новыми пропами, а не фильтрами. После ремонта сырой шум падает, и только тогда у фильтров появляется настоящий запас, чтобы вернуть часть задержки. Как найти конкретный мотор или проп — в гайде как найти плохой мотор по логу.

Тюн: шум проходит фильтры, и его несёт D

Лог C на втором рисунке: вупер 1S на INAV 8.0. Сырой гироскоп 22.1 °/с, после фильтров 4.8 — шум проходит фильтры, ВЧ-шум моторов 5.5%, это критично. 97% шума на моторах несёт D. Снижать D или частоты D-term фильтров здесь имеет смысл, но при 4.8 °/с после фильтров D просто усиливает то, что фильтры пропустили, так что пропы и раму тоже придётся лечить. А раньше всего этого в логе есть коэффициент, похожий на опечатку (ниже).

D может быть проблемой, даже пока моторы не дошли до 2.5%. Как только один D отправляет на моторы 1.5% хода и больше (от 3% — критично), bbdoctor выдаёт отдельную находку «Шум D-term идёт на моторы» с лестницей советов. Гироскоп после фильтров шумит 1 °/с и больше — сначала механика. RPM-фильтр выключен (dshot_bidir = OFF или rpm_filter_harmonics = 0) — включить его. Дальше частоты D-term фильтров −15% от текущих, а если D-term фильтр уже ниже 70 Гц, ниже не опускать: задержка растёт, толку мало, лучше снизить D на 10%. Моторы и после этого горячие — следующим полётом D −10%. Когда на моторах уже больше 2.5%, совет короче: механика, затем D-term фильтры −15% или меньше D.

Дрожание feedforward от пульта

Лог A на втором рисунке: VX3.5 на Betaflight 4.5.2, лог 1 кГц. ВЧ-шум моторов 3.0% — предупреждение. Стандартный совет «опусти D-term фильтры или снизь D» тут не помог бы: D несёт 4% шума, P — меньше процента, а 96% — feedforward. FF — это производная стика. Пульт шлёт команды пакетами, и на каждом пакете FF даёт рывок. В этом полёте составляющая FF выше 40 Гц — 3.6% хода мотора по roll, рывков больше 5% хода — 51 в секунду (по 112 секундам движения стиков).

Признак, который видно и без разбора: моторы шумят, пока двигаешь стики, а в висении чисто. В том же отчёте было перерегулирование 25–31%, поэтому первым шагом bbdoctor ставит снижение FF из той находки, следующим полётом — усреднение и сглаживание FF, потом feedforward_jitter_factor 7 → 12:

set feedforward_averaging = 2_POINT
set feedforward_smooth_factor = 65
save

Это имена Betaflight 4.3 и новее. В 4.2 bbdoctor берётся за ff_interpolate_sp (AVERAGED_2, а при пульте 500 Гц — AVERAGED_3), ff_spike_limit (до 50) и rc_smoothing_auto_smoothness (до 20). Как перелёт от FF выглядит в переходной характеристике — в гайде PID-тюнинг по blackbox.

Опечатка в коэффициентах

Тот же вупер: по roll P 17 и D 50, а по pitch P 40 и D 35 (по умолчанию в INAV D 23 при P 40). На одной оси D втрое больше P, а на соседней D меньше P — так настраивают редко, это похоже на ошибку ввода. В записи D-составляющая roll в 12 раз сильнее P. bbdoctor ловит такое правило: на одной оси D не меньше 2×P, а на другой D не больше P. Это он ставит первым, ведь опечатка правится одной строкой в CLI: D × 0.7 на этой оси, а если шум останется — механика и D-term фильтры:

set mc_d_roll = 35
save
Три столбчатые диаграммы шума моторов по членам PID: в первой основную часть несёт FF, во второй и третьей D, но во второй шум мал, а в третьей велик
Шум выше 80 Гц, который каждый член PID отправляет на моторы, в % хода мотора (среднее roll и pitch); под числом — доля в энергии шума по всем осям, как её считает bbdoctor. Шкалы у панелей разные. A — VX3.5, Betaflight 4.5.2: моторы 3.0%, из них 96% несёт feedforward. B — 6S, Betaflight 4.5.1: D несёт 83%, но моторы чистые, 0.5%. C — вупер 1S, INAV 8.0: D несёт 97%, моторы 5.5%.

Доля и величина — разные вещи. В логе B D несёт 83% шума, но шума всего 0.5% хода, моторам всё равно, трогать нечего. Доля говорит, кого лечить, величина — надо ли лечить вообще.

Порядок правок

  1. Механика. Новые пропы из одной пачки, протянутые винты моторов, каждый мотор покрути рукой: ровно, без хруста и люфта. Лучи без трещин, стек на мягких проставках, камера, антенна и ремешок батареи не болтаются.
  2. RPM-фильтр. Нужен двунаправленный DShot (dshot_bidir = ON), регуляторы на Bluejay, AM32 или BLHeli_32 и правильный motor_poles (число магнитов в колоколе). Число гармоник — rpm_filter_harmonics, в 4.1–4.2 gyro_rpm_notch_harmonics; 0 значит, что фильтр выключен. Чтобы проверить его работу, пиши в лог и обороты — см. настройку blackbox.
  3. Динамический notch — для резонансов, не привязанных к оборотам. С работающим RPM-фильтром ему обычно хватает 1–2 вырезов (dyn_notch_count, BF 4.3+). Пик, который стоит на одной частоте при разном газе (на 6 дБ над фоном минимум в 60% диапазонов газа, выше 60 Гц), bbdoctor считает резонансом рамы или стека. Статический notch он предлагает, только если частота однозначна: лог пишется на частоте PID-цикла или от 2 кГц, а пик ниже половины частоты Найквиста. В трёх 6S-логах на 4.5.1 (запись 1013 Гц при PID-цикле 4 кГц) пики видны на 186–226 Гц, и, например, «206 Гц» на деле может быть 206, 807 или 1219 Гц. Вместо notch наугад bbdoctor просит короткий лог с blackbox_sample_rate = 1/1.
  4. ФНЧ (lowpass). −15% от текущих частот — у D-term, если шум несёт D, или у гироскопа, если шум проходит фильтры или его несёт P. Ниже 70 Гц D-term фильтр не опускай.
  5. D — последним и только если шум несёт D, а фильтры уже низкие. Имена D в 2025.12 поменялись — см. ниже.

Исключение из этого порядка одно: коэффициент, похожий на опечатку, исправляй первым. Одно изменение за полёт. После каждого — 30–60 секунд в воздухе, посадка, отключи батарею и потрогай моторы. Стали холоднее — оставляешь, нет — откатываешь.

Главное правило: не поднимай D на горячих и шумных моторах, даже ради пропвоша. И обратное: если в отчёте перерегулирование по roll или pitch, снижать D ради холодных моторов нельзя — перелёт вырастет. bbdoctor в таком случае оставляет только совет про механику и фильтры D-term.

Имена фильтров в разных версиях Betaflight

ЧтоBetaflight 4.0–4.2Betaflight 4.3–4.5 и 2025.12
Динамический ФНЧ гироскопаdyn_lpf_gyro_min_hz / dyn_lpf_gyro_max_hzgyro_lpf1_dyn_min_hz / gyro_lpf1_dyn_max_hz
Статический ФНЧ1 гироскопаgyro_lowpass_hzgyro_lpf1_static_hz
ФНЧ2 гироскопаgyro_lowpass2_hzgyro_lpf2_static_hz
Динамический ФНЧ D-termdyn_lpf_dterm_min_hz / dyn_lpf_dterm_max_hzdterm_lpf1_dyn_min_hz / dterm_lpf1_dyn_max_hz
Статический ФНЧ1 D-termdterm_lowpass_hzdterm_lpf1_static_hz
ФНЧ2 D-termdterm_lowpass2_hzdterm_lpf2_static_hz
Гармоники RPM-фильтраgyro_rpm_notch_harmonics (4.1–4.2)rpm_filter_harmonics
Слайдеры фильтров4.2: только в Configurator, раньше не былоsimplified_gyro_filter, simplified_dterm_filter

В 2025.12 имена фильтров те же, но поменялся смысл D: базовый теперь d_roll/d_pitch, а верхний — d_max_roll/d_max_pitch.

Ловушка слайдеров (4.3+): если simplified_dterm_filter = ON, Configurator при сохранении вкладки со слайдерами пересчитывает частоты от множителя, и ручные значения пропадают. В реальном логе VX3.5 D-term стоит на 180/420 Гц при включённом слайдере с множителем 100 — а слайдер при множителе 100 дал бы заводские 75/150, то есть частоты поставлены вручную или пресетом. Меняешь частоты через CLI — выключай слайдер.

Считай от своих текущих значений (get dterm_lpf в CLI покажет их). bbdoctor собирает команды из заголовка лога: каждая частота × 0.85, чтобы опустить на 15%, или × 1.15, чтобы поднять, а в конце выключает слайдер. Для D-term этого VX3.5 (180/420 Гц, ФНЧ1 158, ФНЧ2 150) снижение на 15% выглядело бы так. Это пример арифметики, а не совет для этого лога: там шум несёт FF.

set dterm_lpf1_dyn_min_hz = 153
set dterm_lpf1_dyn_max_hz = 357
set dterm_lpf1_static_hz = 134
set dterm_lpf2_static_hz = 128
set simplified_dterm_filter = OFF
save

И не используй simplified_tuning apply как «быструю правку»: он пересчитывает фильтры и PID от заводских значений Betaflight, а не от твоих, и молча сбрасывает ручной тюн.

Когда фильтры можно ослабить

Меньше фильтрации — меньше задержка и лучше гасится пропвош. bbdoctor советует поднять частоты фильтров гироскопа на 15%, только когда сходится всё сразу:

Для заводских частот 4.5 (250/500 Гц, ФНЧ2 500) команды были бы такими:

set gyro_lpf1_dyn_min_hz = 288
set gyro_lpf1_dyn_max_hz = 575
set gyro_lpf1_static_hz = 288
set gyro_lpf2_static_hz = 575
set simplified_gyro_filter = OFF
save

Если шум и задержка проходят, но шумит сырой гироскоп или есть резонанс, отчёт пишет «запас есть, но ослаблять рано». Если не проходят шум или задержка, он просто пишет «фильтры в норме» (а при шуме после фильтров больше 3 °/с предупреждает), а по логу медленнее 500 Гц вердикта об ослаблении нет вообще. Пример — 6S на Betaflight 4.5.1 как раз с этими заводскими частотами: после фильтров 0.6 °/с, задержка 2.2 мс, по двум числам запас огромный. Но сырой гироскоп 7.4 °/с и резонанс на 206 Гц. Запас создают фильтры, которые сейчас работают на шумную механику: ослабишь их — пустишь шум на моторы. Ещё пример — Betaflight 4.2, 6S, лог 534 Гц: после фильтров 0.31 °/с, задержка 2.8 мс, но сырой гироскоп 4.7 °/с, тоже «рано». Из 17 логов, где удалось измерить и сырой гироскоп, и задержку, все пять условий сразу не выполнились ни разу: чистая механика встречается реже, чем кажется.

Задержка против пропвоша

Задержка — цена фильтрации. В логах для этого гайда она от 0.8 мс (INAV 6.0) до 3.2 мс (тот самый Betaflight 4.2.5 с горбом на 200–450 Гц). Чтобы понять, много ли это, переведи задержку в фазу: на 50 Гц, в середине полосы пропвоша, 1 мс — это 18° запаздывания, 3.2 мс — уже 58°. Чем позже PID видит колебание, тем хуже он его гасит. Отсюда пропвош, а при большой задержке — ещё и собственная раскачка контура.

Пример — два полёта VX3.5 на Betaflight 4.5.2. В первом гироскопный ФНЧ стоял на 250/500 Гц, D-term — на 75/150. Во втором — 300/700 и 180/420. Задержка упала с 2.2 до 1.2 мс, а худший по осям шум после фильтров остался около 1.4–1.5 °/с в обоих полётах. ВЧ-шум моторов вырос с 1.6 до 3.0%, но 96% этого шума во втором полёте — feedforward, а не D. Да и стиками во втором полёте работали больше: 112 секунд против 45. Возвращать D-term фильтры вниз ради моторов здесь бессмысленно. Как задержка выглядит в переходной характеристике, разобрано в гайде PID-тюнинг по blackbox.

Типичные ошибки

INAV, ArduPilot и PX4

INAV. ФНЧ гироскопа — gyro_main_lpf_hz (по умолчанию 60 Гц), динамический ходит между gyro_dyn_lpf_min_hz и gyro_dyn_lpf_max_hz и включается через gyro_use_dyn_lpf = ON до 7.x или gyro_filter_mode = DYNAMIC с 8.0 (там же появился режим ADAPTIVE). D-term — dterm_lpf_hz (по умолчанию 110, у вупера из примера 120). D — mc_d_roll / mc_d_pitch, FF — mc_cd_roll / mc_cd_pitch. RPM-фильтр rpm_gyro_filter_enabled работает только с отдельным проводом телеметрии регуляторов. Подробнее — разбор логов INAV.

ArduPilot. ФНЧ гироскопа — INS_GYRO_FILTER (в большинстве логов ArduCopter из нашей подборки 20 Гц), фильтр D — ATC_RAT_RLL_FLTD / ATC_RAT_PIT_FLTD. bbdoctor масштабирует их так же, × 0.85 или × 1.15. Шум моторов и резонансы в ArduPilot режет гармонический notch INS_HNTCH_* по газу, по телеметрии ESC или по FFT. Для резонанса рамы с однозначной частотой bbdoctor предлагает второй notch — INS_HNTC2_* с INS_HNTC2_MODE = 0. Подробнее — анализ логов ArduPilot.

PX4. ФНЧ гироскопа — IMU_GYRO_CUTOFF, фильтр D — IMU_DGYRO_CUTOFF. Сдвиг между записанными топиками у PX4 не равен задержке фильтра (бывает 0 при срезе 30–60 Гц), поэтому задержку bbdoctor оценивает по настройке: √2/(2π·fc) для ФНЧ второго порядка. При 40 Гц, как в большинстве PX4-логов из подборки, это 5.6 мс — больше, чем у любого Betaflight-лога выше. При 70 Гц — 3.2 мс. Статический notch — IMU_GYRO_NF0_FRQ / IMU_GYRO_NF0_BW (с 1.13; раньше — IMU_GYRO_NF_FREQ / IMU_GYRO_NF_BW), динамический (по оборотам ESC или по FFT) — IMU_GYRO_DNF_EN. Подробнее — анализ PX4 ULog.

Как проверить автоматически

Загрузи лог в bbdoctor: .bbl и .bfl Betaflight, .txt INAV, .bin ArduPilot или .ulg PX4. Отчёт посчитает все четыре числа, разложит шум моторов по P, D и FF, найдёт резонансы с проверкой однозначности частоты и даст команды CLI от твоих текущих частот, со слайдером, выключенным там, где он перезаписал бы правку. Посмотри пример отчёта. Лога нет, а есть diff all — проверка конфига покажет выключенные ФНЧ и dyn notch, RPM-фильтр без телеметрии и слайдеры далеко от 1.0.

Частые вопросы

Почему греются моторы на Betaflight?

Из-за шума выше 80 Гц в командах моторам. Тяги он не создаёт: ток в обмотках дёргается на каждом колебании и уходит в тепло. Источник видно по логу: механика (шумит сырой гироскоп), D-term или дрожание feedforward от пульта. Фильтры трогай, только когда знаешь, какой член PID несёт шум.

Что снижать первым: фильтры или D?

Сначала механика и RPM-фильтр. Если шум на моторах несёт D, опусти частоты D-term фильтров на 15% от текущих, а если D-term фильтр уже ниже 70 Гц — снизь D на 10%. Если шум несёт feedforward, не помогут ни фильтры, ни D: нужно сглаживание FF. Одно изменение за полёт.

Можно ли ослабить фильтры ради пропвоша?

Только если сходится всё сразу: после фильтров шум ниже 1 °/с, задержка больше 1.5 мс, сырой гироскоп ниже 4 °/с, резонансов рамы нет, лог записан на 500 Гц или чаще. Тогда подними частоты фильтров гироскопа на 15% и трогай моторы после каждого полёта.

Насколько горячие моторы — это уже много?

Сядь сразу после обычного пака, отключи батарею и возьмись за колокол. Держишь палец несколько секунд — нормально. Отдёргиваешь сразу, пахнет лаком или один мотор заметно горячее остальных — так летать нельзя, ищи причину по логу. После каждой правки фильтров начинай с короткого полёта на 30–60 секунд.

Обновлено:

Другие гайды