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

Динамический notch и резонанс рамы: что резать, а что чинить

Узкий пик в спектре гироскопа можно вырезать notch-фильтром или устранить в железе. Ниже разберём, как по логу отличить шум моторов от резонанса рамы, как bbdoctor находит резонанс и почему он иногда отказывается называть частоту, и какие настройки notch реально стоят в логах Betaflight 4.2–2025.12, INAV 8 и PX4.

Notch, ФНЧ и RPM-фильтр: что убирает каждый и чем ты платишь

Все три фильтра чистят гироскоп до того, как он попадёт в PID, и все три добавляют задержку. Разница в том, что именно они режут:

Задержка notch зависит от того, где он стоит и насколько он широкий. Ниже — расчёт для цикла 4 кГц и биквада, устроенного как в Betaflight. Важна задержка на 20–40 Гц: на этих частотах живут движения квадрика.

ФильтрЗадержка на 20 ГцНа 40 Гц
PT1 250 Гц0,63 мс0,61 мс
PT1 100 Гц1,52 мс1,32 мс
Статический notch 160 Гц, cutoff 120 (Q 1,71)0,60 мс0,68 мс
Статический notch 469 Гц, cutoff 3280,24 мс0,24 мс
Динамический на 200 Гц, dyn_notch_q 5000,16 мс0,18 мс
Динамический на 100 Гц, dyn_notch_q 5000,36 мс0,52 мс
Динамический на 70 Гц, dyn_notch_q 5000,58 мс1,29 мс
Динамический на 100 Гц, dyn_notch_q 1201,45 мс1,88 мс

Отсюда два правила. Узкий notch высоко по частоте почти бесплатный. Широкий или низкий notch стоит как хороший ФНЧ. И три notch, стоящие рядом, задерживают сигнал втрое сильнее одного.

Шум моторов или резонанс рамы: диагональ против вертикали

Лучше всего это видно на тепловой карте «газ — частота»: по горизонтали частота, по вертикали газ, яркость — уровень шума. Частота вращения моторов растёт с газом, поэтому их гармоники рисуют диагонали. Резонанс рамы — собственная частота конструкции, и от газа она не зависит. Он рисует вертикальную линию.

Тепловые карты сырого гироскопа по roll и pitch для 6S-квадрика на Betaflight 4.5.1: вертикальные полосы около 198 и 186 Гц тянутся от малого газа до 85%
Сырой гироскоп, 6S-квадрик на Betaflight 4.5.1, лог 1013 Гц. На висении (газ 20–30%) моторы крутятся около 192 Гц, на газе выше 80% — около 467 Гц, а полосы на 198 Гц (roll) и 186 Гц (pitch) стоят на месте при любом газе. Ярче всего они на 20–40%: там через них проходит первая гармоника моторов и раскачивает раму.

Обрати внимание на последнюю деталь: резонанс почти всегда ярче там, где мимо него проходит линия мотора. Мотор — это источник, рама — усилитель. Хорошо это видно на 7-дюймовом квадрике на Betaflight 4.6, где пилот уже поставил статический notch на 160 Гц.

Тепловая карта pitch 7-дюймового квадрика: слева сырой гироскоп с вертикальной линией около 162 Гц и диагональю моторов, справа отфильтрованный, почти тёмный на той же шкале
7 дюймов, Betaflight 4.6.0, лог 1980 Гц, одна шкала на обеих картах. Слева сырой гироскоп: линия около 162 Гц на 16–22 дБ выше соседних частот при газе 25–40%, где моторы крутятся на 139–178 Гц, а на остальном газе — 0–8 дБ. Справа гироскоп после фильтров: на 162 Гц при газе 30–40% было +4…+5 дБ, стало около −39 дБ.

На этом логе bbdoctor резонанс не объявил: линия выше порога лишь примерно в половине интервалов газа, а нужно 60%. И это верно: такой пик стоит на границе между рамой и моторами, и с ним справляются фильтры, которые уже стоят. Шум после фильтров здесь 0,66 °/с, так что трогать фильтры незачем. Но сырой шум 7,9 °/с, и bbdoctor правильно говорит: ищи причину в пропах, моторах и раме.

Как bbdoctor находит резонанс и почему иногда не называет частоту

Логику детектора полезно знать, чтобы читать отчёт:

  1. Полёт режется на окна по 256 отсчётов с перекрытием 50%. Каждое окно попадает в один из 20 интервалов газа по своему среднему газу. Интервал учитывается, если в нём хотя бы 4 окна.
  2. Для roll и pitch в каждом интервале считается спектр, а затем «фон» — скользящая медиана по 15 соседним частотам. Шаг сетки — частота записи, делённая на 256: около 4 Гц на логе 1 кГц, около 16 Гц на 4 кГц.
  3. Частота считается резонансом, если пик на ней выше фона больше чем на 6 дБ хотя бы в 60% интервалов газа. Частоты ниже 60 Гц и в верхних 5% до частоты Найквиста не смотрятся.
  4. Пики на roll и pitch ближе 10 Гц друг к другу объединяются в один.

Дальше главное. Blackbox в Betaflight при делителе пишет каждый N-й отсчёт без фильтра от наложения спектров. Всё, что выше половины частоты записи, складывается обратно, и пик на 827 Гц в логе 1013 Гц выглядит как 186 Гц. Обратно по логу это не распутать, поэтому bbdoctor перечисляет кандидатов: f, fs − f и fs + f.

ЛогЗапись / цикл PIDПик в логеКандидатыВердикт
BF 4.5.1, 6S, полёт 11013 Гц / 4 кГц206 Гц roll, +8 дБ, 71% интервалов206, 807, 1219notch не предлагается
BF 4.5.1, 6S, полёт 21013 Гц / 4 кГц186 pitch, 198 roll, +6–7 дБ186, 827, 1199 / 198, 815, 1211notch не предлагается
BF 4.5.1, 6S, полёт 31013 Гц / 4 кГц190 и 226 pitch, 202 roll, +7 дБ190, 823, 1203 и т. д.notch не предлагается
INAV 8.0.0, 6S995 Гц / 2 кГц117 Гц pitch, +12 дБ, 100% интервалов117, 878, 1112notch не предлагается
PX4 1.15.4, 6S8013 Гц469 Гц pitch, +6 дБоднозначностатический notch

Правило однозначности в коде такое: лог пишется на частоте цикла PID, или запись не ниже 2 кГц и пик ниже половины частоты Найквиста. Для лога 2 кГц это значит «ниже 500 Гц». Три полёта 6S-квадрика — классика: стоит blackbox_sample_rate = 1/4, и настоящий резонанс может сидеть на 186 Гц в лучах или на 827 Гц в стеке. От этого зависит и notch, и то, где искать проблему.

Спектры roll и pitch до и после фильтров: на сыром гироскопе пики 202 Гц на roll и 190 и 226 Гц на pitch, на отфильтрованном они на 26–28 дБ ниже
Третий полёт того же 6S-квадрика, спектр всего полёта. Серая линия — сырой гироскоп (пики от −1 до −3 дБ на 202 Гц roll, 190 и 226 Гц pitch), синяя — после фильтров (от −28 до −30 дБ). RPM-фильтр, один динамический notch и ФНЧ снимают с этих пиков 26–28 дБ, но маленькие горбы на тех же частотах остаются и после фильтров.

На этих трёх логах bbdoctor пишет «Фильтры: запас есть, но ослаблять рано (задержка 2,2–2,3 мс)». После фильтров шум 0,5–0,6 °/с, но сырой 4,8–7,4 °/с, и есть резонанс. Поднимать срезы, пока механика не исправлена и частота не известна, — значит пустить этот пик в PID.

Настройки динамического notch по версиям

Имена параметров менялись дважды: в 4.2 и в 4.3. Если не уверен, что есть в твоей прошивке, набери в CLI get dyn_notch: он покажет все параметры с таким началом имени.

ВерсияКак включитьПараметрыЗаметки
4.0–4.1feature DYNAMIC_FILTERdyn_notch_range (LOW/MEDIUM/HIGH/AUTO), dyn_notch_width_percent, dyn_notch_q, dyn_notch_min_hzверхняя граница задаётся пресетом; по умолчанию AUTO, 8, 120, 150
4.2feature DYNAMIC_FILTERdyn_notch_max_hz вместо range, dyn_notch_min_hz, dyn_notch_width_percent, dyn_notch_qвики 4.2: с RPM width 0 и Q 250, без RPM — 8 и 120
4.3, 4.4, 4.5, 4.6, 2025.12dyn_notch_count больше 0dyn_notch_count (до 5, в 2025.12 до 7), dyn_notch_q, dyn_notch_min_hz, dyn_notch_max_hzновый алгоритм (SDFT), width и feature убраны; по умолчанию 3 notch, Q 300, 150–600 Гц в 4.3 и 100–600 Гц в 2025.12

Что стоит в реальных логах из нашего набора (все с bidirectional DShot, кроме последнего):

КвадрикПрошивкаcountQmin–max, Гц
6S-квадрик, три полёта выше4.5.11500100–600
MASTER5 V24.5.12350120–650
Nazgul F5 V24.4.12500120–600
GEPRC, F4052025.12.5240090–400
REKON 74.6.0350070–400, плюс статический 160 Гц
F745, 4.2.8, RPM не работает (dshot_bidir 0)4.2.8width 8120150–600

Сколько notch. С рабочим RPM-фильтром начинай с одного-двух. Вики 4.3 прямо пишет, что больше двух-трёх нужно редко, а часто хватает одного. Без RPM-фильтра notch работают вместо него: вики советует три-четыре notch с Q около 120–150.

Q. Вики 4.3 называет 300–450 хорошим диапазоном для фристайла. С RPM-фильтром логи держат 350–500. Низкий Q оправдан только без RPM, когда notch должен накрыть размазанный шум моторов.

min_hz и max_hz. Найди на тепловой карте самую низкую линию, которую хочешь поймать (с RPM-фильтром это обычно резонанс, без него — 1× моторов на висении). Поставь dyn_notch_min_hz примерно на 20 Гц ниже. Вики советует держать минимум как можно выше: так меньше задержка. В логах выше это 90–120 Гц на квадриках поменьше и 70 Гц на 7 дюймах, где моторы на газе 20–35% крутятся на 125–155 Гц. dyn_notch_max_hz ставь чуть выше самого высокого нужного пика: чем шире диапазон, тем грубее разрешение.

set dyn_notch_count = 1
set dyn_notch_q = 500
set dyn_notch_min_hz = 100
set dyn_notch_max_hz = 600
save

Это конфиг 6S-квадрика из таблицы, а не универсальный рецепт. Для Betaflight 4.3+ с RPM-фильтром он разумный как отправная точка.

Статический notch как временная мера

Если частота однозначна, bbdoctor даёт команду статического notch: центр — на частоту резонанса, нижний срез — 0,7 от неё. В Betaflight Q считается из центра и среза: Q = f·c / (f² − c²). При c = 0,7f выходит Q ≈ 1,37, и полоса по −3 дБ тянется от 0,7f до 1,43f. Вырез специально широкий. Частота резонанса гуляет от затяжки винтов и температуры, а по тепловой карте лога 4 кГц она известна с точностью до половины шага сетки, около 8 Гц. Если лог 1/1 подтвердит, что резонанс 6S-квадрика действительно на 186 Гц, команда будет такой:

set gyro_notch1_hz = 186
set gyro_notch1_cutoff = 130
save

Пилот 7-дюймового выбрал 160/120: это Q 1,71, вырез чуть уже. По таблице выше такой notch стоит около 0,6 мс на 20 Гц, как PT1 на 250 Гц. Это нормальная цена за один пик, но не повод ставить два «на всякий случай». Вики 4.3 предлагает разумный обмен: если статический notch взял на себя резонанс, который стоит на одной частоте везде, убавь dyn_notch_count на один.

INAV. Статического notch гироскопа в INAV нет вообще (есть только acc_notch_hz для акселерометра), поэтому bbdoctor для INAV команду не даёт. Остаётся динамический: dynamic_gyro_notch_enabled, dynamic_gyro_notch_q, dynamic_gyro_notch_min_hz. В нашем логе INAV стоят Q 250 и минимум 126 Гц. Если лог на полной частоте подтвердит резонанс на 117 Гц, динамический notch туда не дотянется, пока не опустишь минимум примерно до 100. Подробнее — в гайде по blackbox в INAV.

ArduPilot. bbdoctor включает второй гармонический notch в режиме фиксированной частоты, с полосой f/2 и ослаблением 40 дБ. После INS_HNTC2_ENABLE = 1 обнови список параметров, чтобы появились остальные INS_HNTC2_*. Подробнее — в гайде по логам ArduPilot.

PX4. С версии 1.13 это IMU_GYRO_NF0_FRQ и IMU_GYRO_NF0_BW, в 1.12 и раньше — IMU_GYRO_NF_FREQ и IMU_GYRO_NF_BW. Полоса у bbdoctor — 0,3 от частоты. Лог PX4 1.15.4 записан на 8 кГц, пик 469 Гц однозначен, и команды такие:

param set IMU_GYRO_NF0_FRQ 469
param set IMU_GYRO_NF0_BW 141

В том же логе включён FFT-notch (IMU_GYRO_FFT_EN = 1), но его диапазон 30–150 Гц, и до 469 Гц он не достаёт. А IMU_GYRO_CUTOFF = 40 даёт задержку около 5,6 мс. Notch на 469 Гц с полосой 141 Гц стоит около 0,1 мс. Но bbdoctor и здесь пишет «ослаблять рано»: сырой шум по roll 6,4 °/с, сначала механика. Разбор PX4 — в гайде по ULog.

Сначала железо: что проверять по частоте

bbdoctor делит резонансы на два диапазона и подсказывает, куда смотреть. Это та же граница, что в тексте его вывода:

Точная частотаЧто обычно звенитЧто сделать
60–250 Гцлучи и рама, болтающаяся камера, антенна, батарея на слабом ремнепротянуть винты лучей, осмотреть лучи на трещины и расслоение, закрепить камеру и антенну, затянуть ремень и подложить резинку под батарею
250 Гц и вышестек полётника и ESC на мягких проставках, крепёж, стойки, верхняя декапроверить проставки (пережатый стек уже не мягкий), гайки стека, стойки и винты верхней пластины

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

Проверка коротким логом на полной частоте

  1. Включи запись на частоте цикла PID. В Betaflight 4.3+ это set blackbox_sample_rate = 1/1, в INAV — blackbox_rate_num = 1 и blackbox_rate_denom = 1, в PX4 — биты 4 (High rate) и 8 (Raw FIFO high-rate IMU Gyro) в SDLOG_PROFILE, в ArduPilot 4.5+ — INS_RAW_LOG_OPT и бит IMU_RAW в LOG_BITMASK. Флешка будет заполняться в 4 раза быстрее, чем на 1/4.
  2. Проверь, что пишется сырой гироскоп. В 4.5 и новее у него своё поле, в 4.0–4.4 нужен debug_mode = GYRO_SCALED. Подробности — в гайде по настройке blackbox.
  3. Слетай минуту: висение, плавный разгон по прямой до 70–80% газа, ступеньки газа по несколько секунд. Детектору нужны окна во многих интервалах газа, а не только на висении.
  4. Загрузи лог в bbdoctor. Если резонанс однозначен, вывод будет называться «Резонанс на X Гц при любом газе», и под ним будут команды notch.
  5. Сначала исправь механику и слетай ещё раз. Notch ставь, только если пик остался. После него сделай ещё один лог: горб на этой частоте после фильтров должен исчезнуть, а шум после фильтров не должен вырасти.
  6. Верни обычный делитель записи.
set blackbox_sample_rate = 1/1
save

Ошибки, которые встречаются чаще всего

И когда ничего не трогать: bbdoctor резонанса не видит, сырой шум ниже 4 °/с (его порог «механика чистая»), шум после фильтров ниже 1 °/с, моторы после полёта тёплые, а не горячие. Notch не лечит и низкочастотные колебания. В одном логе PX4 1.17 bbdoctor нашёл пик на 42 Гц в ошибке (gyro − setpoint) только по pitch, и по фазе моторов выходит, что его раскачивает P. Совет там — снизить P по pitch на 10% и сравнить следующий полёт, а не ставить фильтр. Да и детектор резонансов ниже 60 Гц не смотрит.

Загрузи свой лог в анализатор или посмотри пример отчёта. Конфиг без полёта можно проверить на странице проверки diff: там ловится, например, выключенный динамический notch без RPM-фильтра.

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

Сколько динамических notch-фильтров ставить, если работает RPM-фильтр?

Обычно один-два. RPM-фильтр уже вырезает гармоники каждого мотора, и динамическому notch остаётся ловить то, что с оборотами не связано: резонанс рамы и остатки шума пропов. Вики Betaflight 4.3 пишет, что больше двух-трёх нужно редко, а часто хватает одного. В большинстве наших логов 4.5 стоит dyn_notch_count = 1 с Q 500, в логе 2025.12 — два notch с Q 400. Каждый лишний notch на низкой частоте добавляет задержку.

Что ставить против резонанса рамы: статический или динамический notch?

Сначала чини механику. Если резонанс остался и его частота точно известна по логу 1/1, ставь статический: он стоит ровно на частоте и не уезжает на другие пики. Динамический справится, если частота попадает между dyn_notch_min_hz и dyn_notch_max_hz и ему хватает свободных notch, но с одним notch при RPM-фильтре он будет разрываться между резонансом и остатками шума моторов.

Что означает dyn_notch_q?

Добротность notch, умноженную на 100: dyn_notch_q = 500 — это Q = 5. Ширина полосы по уровню −3 дБ равна частоте, делённой на Q: на 200 Гц при Q 5 это 40 Гц. Чем выше Q, тем уже вырез и меньше задержка в полосе управления, но тем точнее он должен попадать в пик. Без RPM-фильтра вики 4.3 советует Q 120–150, с ним в логах обычно 350–500.

Уберёт ли notch желе на видео?

Нет. Желе — это вибрация самой камеры, а фильтр гироскопа меняет только то, что видит PID-контур. Камеру он не успокоит. Ищи причину в механике: разбалансированный проп, мотор, крепление камеры. Notch помогает косвенно, если вибрацию раскачивают сами моторы, получая шум в командах. Частоту ищи по логу так же, как резонанс.

Обновлено:

Другие гайды