Настройка PID по blackbox: лечи причину, а не симптом
Квадрик перелетает после флипа. Форумный рецепт — «убавь P» или «добавь D». Беда в том, что одинаковый перелёт бывает от трёх разных причин, и две из них лечатся противоположно. Если перелёт даёт feedforward, снижение P его только усилит. Если контуру не хватает демпфирования, снижение FF ничего не изменит. Лог отвечает, какой это случай, если знать, куда смотреть.
Ниже — как bbdoctor строит и читает отклик PID, по каким признакам он разделяет причины и что получилось на шести реальных логах от Betaflight 3.1.5 до 2026.6.
Порядок: механика → шум → PID
- Механика. Целые пропы, моторы без люфта, затянутая рама, батарея не болтается. Погнутый проп никакой PID не вылечит.
- Шум и фильтры. RPM-фильтр (bidirectional DShot), разумные фильтры, холодные моторы после полёта. Подробно — в гайде шум и фильтры.
- PID. Сначала roll и pitch (P/D и feedforward), потом I, TPA и anti-gravity.
Почему именно так: D — это производная гироскопа, а производная усиливает высокочастотный шум и отправляет его прямо в моторы. Поэтому bbdoctor не предлагает поднимать D, если в том же логе на моторах больше 2.5% ВЧ-шума от диапазона, шум в PID идёт в основном от D-term или сырой шум гироскопа выше 80 Гц доходит до 10 °/с. В случае с 4.2.5 ниже контуру не хватало D, но сырой шум гироскопа 35.8 °/с превратил совет в P −10% (p_roll 42 → 38) и сначала механику.
Какой лог нужен
- ACRO. 30–60 секунд резких роллов и флипов по каждой оси с возвратом стика в центр. В ANGLE и HORIZON у Betaflight и INAV setpoint — это выход контура угла, а не твой стик. Если больше половины полёта прошло с самовыравниванием, отклик не считается. У ArduPilot и PX4 иначе: они пишут цель регулятора скорости (
RATE.RDes,vehicle_rates_setpoint), и отклик честный в любом режиме. - Частота записи. Отклик считается от 200 Гц, но рабочий минимум — 1 кГц. Ниже 500 Гц bbdoctor не меряет, насколько реально растёт D, а вердикт о раскачке не поднимает выше «info».
- Сколько манёвров. Анализ режет полёт на секундные окна с шагом 1/8 с и берёт те, где стик дал хотя бы 20 °/с. Для любого вывода по оси нужно минимум 10 пригодных окон, и не меньше четверти от всех. Для «критично» и для разбора причин — 50. Окна перекрываются, так что 65 окон — это примерно 8 секунд активного полёта.
- Поле setpoint должно писаться. Как всё это выставить — в гайде настройка blackbox.
Как читать step response
Step response — ответ на вопрос: как квадрик повернулся бы, если бы ты мгновенно дёрнул стик на заданную скорость. Кривая нормирована: 1.0 — заданная скорость вращения. Хорошая кривая быстро поднимается, чуть проскакивает 1.0 и сразу ложится.
Перелёт
Насколько пик выше 1.0. До 15% — норма. Каждая оценка идёт с 90-процентным интервалом, и вердикт строится по нему, а не по одному числу:
- warn — нижняя граница интервала выше 15%, crit — выше 35% (и окон не меньше 50);
- в норме — оценка до 15%, а верх интервала до 25%;
- на границе — оценка чуть выше 15%, интервал узкий. Менять пока нечего, сравни со следующим логом;
- оценка неуверенная — интервал шире 15 пунктов. По этому логу нельзя сказать, в норме ли отклик: нужны ещё 5–6 манёвров по оси.
Демпфирование ζ
bbdoctor подгоняет к кривой модель колебательного звена и берёт её коэффициент демпфирования ζ. Он говорит, сколько перелёта даёт сам контур P/D:
| ζ | Перелёт от контура | Как выглядит |
|---|---|---|
| 0.36 | ~30% | Глубокий провал после пика, несколько качаний |
| 0.5 | ~16% | Заметный провал, одно-два качания |
| 0.6 | ~9% | Небольшой горб, едва заметный провал |
| 0.7–0.9 | 5% и меньше | Горб и ровная полка — так и надо |
Раскачку bbdoctor называет, только когда согласны оба признака: ζ не выше 0.5 и провал ниже цели после пика от 4% (с вероятностью 90% не меньше 2%). Warn — при ζ до 0.40 или провале от 15%. Если модель легла на кривую плохо, ζ в отчёт не выводится, и судят только по провалу, не выше «info». Частота качания ниже 6 Гц у 5-дюймовика указывает скорее на I-term или тяжёлый аппарат, чем на D.
Скорость
- t50 — время до половины заданной скорости. У отзывчивых логов в этом гайде 7–12 мс.
- Задержка «setpoint → вращение» — от изменения setpoint до пика реакции, весь контур целиком: PID, FF, фильтры, моторы, пропы. Норма с feedforward — 4–12 мс, без него — до 15 мс. От 20 мс ось считается медленной, и снижать на ней P bbdoctor не советует. Путь от пульта до setpoint идёт сверху (на логе GEPRC ниже — ещё 12 мс).
Как строится кривая
Стик никто не дёргает идеальными ступеньками, поэтому отклик восстанавливается обратным счётом (деконволюцией). Для каждого секундного окна решается задача: какая реакция на мгновенную ступеньку дала бы этот гироскоп при этом стике. Подвохов два.
- Высокие частоты. Выше ~25 Гц в движениях стика энергии нет, и деконволюция там считает только шум. PID-Analyzer режет их крутой отсечкой около 25 Гц, но крутая отсечка сама рисует рябь (эффект Гиббса) — около 10% перелёта даже у отклика, где его нет. bbdoctor подавляет всё выше 80 Гц и сглаживает отклик гауссом на 30 Гц: у гаусса нет отрицательных лепестков, и ложного горба он не рисует.
- Погрешность метода. Окно и сглаживание всё равно оставляют небольшой горб. Поэтому тот же расчёт делается для идеального отклика — setpoint, сдвинутого на ту же задержку t50. Его перелёт (на наших логах 1–5%) вычитается из результата. Проверка на синтетике: чистая задержка даёт 0%, звено с ζ 0.5 — 15% при истинных 16%.
Дальше берётся медиана по окнам, а интервал строится бутстрэпом: 200 случайных пересборок набора окон. Поэтому в отчёте пишется «47% (90%: 44–53%)», а не голое число. Если сравниваешь с другими программами, учитывай это: 10% «перелёта» в инструменте с крутой отсечкой могут оказаться артефактом.
Один перелёт — три причины
| Причина | Что видно в логе | Что делать | Чего не делать |
|---|---|---|---|
| Feedforward (в 3.x — вес setpoint в D) | FF делает от 45% работы при резких движениях стика, P почти ничего не добавляет; на самых резких движениях гироскоп догоняет или обгоняет setpoint | Снизить f_roll/f_pitch на 15% (в 3.x — dterm_setpoint_weight). Моторы от этого не греются — безопасный первый шаг | Не трогать P и D |
| Мало демпфирования в контуре | FF делает меньше 45%, квадрик не обгоняет стик, ζ ниже 0.5, провал после пика и качание | Поднять базовый D на 15% (вместе с потолком), если моторы холодные; если шумят — снизить P на 10% | Не снижать FF — не поможет. Не снижать P, если ось и так медленная (от 20 мс) |
| Опережение (lead) | Контур задемпфирован (ζ от 0.6, провала нет), а перелёт больше чем вдвое выше того, что даёт такой контур; FF делает от 35% работы | Снизить FF. Не изменилось — вернуть: тогда толкает I-term | Не снижать P: с меньшим P контур слабее тянет назад, и перелёт растёт |
Ещё три картины, которые bbdoctor проверяет отдельно:
- перелёт растёт на высоком газе — это TPA, см. TPA и anti-gravity;
- плавные движения перелетают сильнее резких — базового D мало, а буст включается только на резких движениях, см. D Max и D Min;
- резкие движения перелетают сильнее плавных — буст feedforward, см. feedforward и RC smoothing.

Пять реальных случаев
Эталон: 2% при ζ 0.73
Лог plasmatree_good_tune, Betaflight 3.1.5 — эталон хорошей настройки среди логов, на которых калибровались пороги bbdoctor. Roll 2% (90%: 1–3%), pitch 5%, yaw без перелёта. ζ по roll 0.73, провала нет, t50 9 мс, задержка «setpoint → вращение» 10 мс. Коэффициенты P 19, I 12, D 18 на 4.x не переноси: фильтры, D и feedforward там работают иначе.
Заводская настройка 3.1.5: 87% от веса setpoint
Лог 18_stock_tune, 7.9 кГц. Roll 87% (79–93%), pitch 65%. В 3.x setpoint в лог не пишется, его восстанавливают по стикам и рейтам. На самых резких движениях гироскоп обгоняет задание, а контур без толчка от стика так не умеет. Значит, толкает dterm_setpoint_weight = 190, который в 3.x работает вместо feedforward. Совет — 190 → 100, одна настройка на все оси. По roll ещё и качание (ζ 0.36), но D здесь — только следующий шаг: d_roll 20 → 23, если качание останется.
3,5-дюймовик на 4.5.2: 47%, из них почти всё — FF
Лог vx35_18-23. Roll 47% (44–53%), t50 7 мс. Feedforward делает 60% работы, ошибка слежения на самых резких движениях почти нулевая. ζ 0.62 — такой контур сам дал бы около 9% перелёта, остальное добавил FF. По pitch 27%, и FF там тоже делает 59% работы. Совет — только FF:
set f_roll = 102
set f_pitch = 106
set simplified_pids_mode = OFF
save
Последняя строка нужна потому, что PID в этом логе уже не совпадают со слайдерами, и Configurator при сохранении их бы перезаписал. Ещё одна деталь: буст D поднимается только до ×1.15 из настроенных ×1.67, то есть летает квадрик в основном на d_min_roll = 30, а не на 50.
Betaflight 2026.6: 35% от самого контура
Лог GEPRC F405 записан на 247 Гц. Roll 35% (33–38%). FF делает только 29% работы, и квадрик не обгоняет стик — это не feedforward. После пика отклик проваливается на 5% ниже цели и качается с частотой ~9 Гц, ζ 0.49 (вероятно 0.42–0.50). Pitch выглядит так же (ζ 0.50), поэтому совет один на обе оси — поднять базовый D на 15%:
set d_roll = 39
set d_max_roll = 46
set d_pitch = 53
set d_max_pitch = 63
set simplified_pids_mode = OFF
save
P здесь снижать нельзя: задержка по roll и так 24 мс, по pitch 28 мс, и ещё ~12 мс сверху добавляет пульт на 50 пакетов в секунду, пока стик доходит до setpoint. Шум D на 247 Гц в логе не виден, поэтому после первого полёта на 1–2 минуты потрогай моторы.

Betaflight 4.2.5: плавные движения 32%, резкие 1%
Лог v0002, 2 кГц. Roll 23% от контура. Если разделить окна по величине движения, плавные (до 101 °/с) перелетают на 32%, резкие (от 800 °/с) — на 1%. По логу видно, что на резких движениях D доходит до потолка ×1.52 (d_min_roll 23 → d_roll 35), а плавные летят на базовых 23. Классическое лечение — поднять базовый D. Но здесь шумит гироскоп (см. первый раздел), поэтому совет — P −10%.
P, I и D по отдельности
- P — жёсткость. Мало D для такого P — перелёт и качание. Мало P — ватный отклик, большая задержка, квадрик хуже держит курс на пропвоше. Снижай P против перелёта, только если причина — контур, а ось не медленная.
- I — удерживает против постоянных сил: смещённый центр тяжести, ветер, длинные манёвры. Слишком большой I относительно P даёт медленную раскачку 1.5–10 Гц в спокойном полёте. bbdoctor ищет узкий пик в ошибке слежения при стике в пределах ±40 °/с и проверяет, ведёт ли его I-term: связь с ошибкой от 0.5 и I/P на этой частоте от 1. Тогда совет — I −15%. Не ведёт — это люфты (батарея, мачта GPS) или ветер, и коэффициенты не трогай. Если I подолгу упирается в свой предел (проверяется с 2025.12), что-то постоянно тянет квадрик: центр тяжести, перекошенный мотор или проп. Отскок после флипов — тоже часто I, см. отскок после флипов.
- D — демпфирование и главный источник нагрева моторов. bbdoctor меряет, какой D реально работает в полёте, а не только настроенный. Базовый D и буст разобраны в гайде D Max и D Min.
Roll и pitch отвечают по-разному
На том же логе VX3.5 задержка по roll 3.8 мс (90%: 2.9–5.0), по pitch 9.5 мс (8.5–10.6). Интервалы не пересекаются — разница настоящая. Объяснение в коэффициентах: P по pitch 42, по roll 59. Когда P отстающей оси ниже 85% от быстрой, bbdoctor говорит, что этого одного хватает. Совет — сначала доделать шаги по перелёту, а потом скорее опустить P по roll к ~50, чем поднимать pitch, который и так перелетает. Если разницы в P нет, частая причина — развесовка: батарея далеко от центра увеличивает инерцию по pitch.
Имена D по версиям и ловушка слайдеров
| Версия | Базовый D | Потолок буста |
|---|---|---|
| 4.0–4.2 | d_min_roll | d_roll |
| 4.3–4.5 | d_min_roll («Derivative») | d_roll («D Max») |
| 4.6 / 2025.12+ | d_roll («Derivative») | d_max_roll («D Max») |
Один и тот же совет «подними d_roll» на 2025.12 поднимет базовый D, а на 4.5 — только потолок, до которого квадрик может почти не доходить. Подробно — в гайде D Max и D Min. Пример для 4.5 (базовый 30, потолок 50), +10% демпфирования по roll:
set d_min_roll = 33
set d_roll = 55
set simplified_pids_mode = OFF
save
Слайдеры. Пока simplified_pids_mode не OFF, Configurator при сохранении пересчитает PID из слайдеров и затрёт ручные правки. И никогда не делай simplified_tuning apply поверх ручной настройки: он заново посчитает PID из множителей слайдеров к заводским значениям.
INAV, ArduPilot, PX4
- INAV:
mc_p_roll,mc_i_roll,mc_d_roll,mc_cd_roll(CD — это feedforward), то же для pitch и yaw. TPA —tpa_rateиtpa_breakpoint. Подробно — разбор логов INAV. - ArduPilot:
ATC_RAT_RLL_P/_I/_D/_FF, то же для PIT и YAW. Для ArduCopter начни со встроенного AUTOTUNE, лог — для проверки результата. Нужна быстрая запись (бит ATTITUDE_FAST вLOG_BITMASK). Подробнее — логи ArduPilot. - PX4:
MC_ROLLRATE_P/_I/_D/_FF.MC_ROLLRATE_Kумножает P, I и D разом — учитывай его, когда сравниваешь числа. Автотюн:MC_AT_EN = 1, запуск — из QGroundControl (PID Tuning). Для лога включи бит High rate вSDLOG_PROFILE. См. разбор ULog.
Безопасность
- Сидишь в CLI с подключённой батареей — пропы сняты.
- Одно изменение за полёт, шаг 10–15%. Иначе не поймёшь, что сработало.
- Первый полёт после правки — короткий и невысоко, палец на дизарме.
- После минуты полёта потрогай моторы. Заметно теплее — верни как было.
- Не гоняйся за нулём: 5–12% перелёта с ровной полкой после пика — хорошая настройка, а не проблема.
- Если болтает именно на сбросе газа — это отдельная история, см. пропвош.
Проверить свой лог
Загрузи лог в bbdoctor — бесплатно. Отчёт покажет перелёт с интервалом по каждой оси, ζ и провал, долю feedforward в работе, задержку, разницу между осями и команды CLI от твоих текущих значений с правильными именами для версии. Как выглядит такой отчёт — в демо-отчёте, а настройки без полёта можно проверить по diff all на странице проверки конфига.
Частые вопросы
Как понять, перелёт от feedforward или от P?
Посмотри, кто делает работу при резких движениях стика. Если на feedforward приходится 45% и больше, а на самых резких движениях гироскоп догоняет или обгоняет setpoint, перелёт даёт FF: снижай f_roll и f_pitch на 15%, P и D не трогай. Если FF делает меньше 45%, а после пика отклик проваливается ниже цели и качается (ζ ниже 0.5), виноват контур P/D.
Какой D менять в Betaflight 4.5 и в 2025.12?
Базовый, на котором ты летаешь большую часть времени. В 4.3–4.5 это d_min_roll (колонка Derivative), а d_roll — только потолок буста (D Max). С 4.6/2025.12 имена совпадают с колонками: базовый d_roll, потолок d_max_roll. Меняй оба в одной пропорции, как это делает слайдер.
Насколько менять PID за раз?
Один параметр за полёт, шаг 10–15%. После первой минуты полёта потрогай моторы: заметно теплее, чем до правки, — верни как было. Шаг 10–15% достаточно крупный, чтобы разница была видна в логе сверх погрешности замера в несколько процентов, и достаточно мелкий, чтобы не проскочить удачное значение.
Что значит ζ (демпфирование) в отчёте?
Это то, насколько быстро гаснет качание после пика. При ζ 0.5 контур сам по себе даёт около 16% перелёта и заметно качается, при 0.7 — около 5% и почти без качания. У хорошей настройки 0.6–0.9. Ниже 0.5 с провалом после пика — значит, демпфирования (D) мало для текущего P.
Обновлено: