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

Настройка PID по blackbox: лечи причину, а не симптом

Квадрик перелетает после флипа. Форумный рецепт — «убавь P» или «добавь D». Беда в том, что одинаковый перелёт бывает от трёх разных причин, и две из них лечатся противоположно. Если перелёт даёт feedforward, снижение P его только усилит. Если контуру не хватает демпфирования, снижение FF ничего не изменит. Лог отвечает, какой это случай, если знать, куда смотреть.

Ниже — как bbdoctor строит и читает отклик PID, по каким признакам он разделяет причины и что получилось на шести реальных логах от Betaflight 3.1.5 до 2026.6.

Порядок: механика → шум → PID

  1. Механика. Целые пропы, моторы без люфта, затянутая рама, батарея не болтается. Погнутый проп никакой PID не вылечит.
  2. Шум и фильтры. RPM-фильтр (bidirectional DShot), разумные фильтры, холодные моторы после полёта. Подробно — в гайде шум и фильтры.
  3. 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) и сначала механику.

Какой лог нужен

Как читать step response

Step response — ответ на вопрос: как квадрик повернулся бы, если бы ты мгновенно дёрнул стик на заданную скорость. Кривая нормирована: 1.0 — заданная скорость вращения. Хорошая кривая быстро поднимается, чуть проскакивает 1.0 и сразу ложится.

Перелёт

Насколько пик выше 1.0. До 15% — норма. Каждая оценка идёт с 90-процентным интервалом, и вердикт строится по нему, а не по одному числу:

Демпфирование ζ

bbdoctor подгоняет к кривой модель колебательного звена и берёт её коэффициент демпфирования ζ. Он говорит, сколько перелёта даёт сам контур P/D:

ζПерелёт от контураКак выглядит
0.36~30%Глубокий провал после пика, несколько качаний
0.5~16%Заметный провал, одно-два качания
0.6~9%Небольшой горб, едва заметный провал
0.7–0.95% и меньшеГорб и ровная полка — так и надо

Раскачку bbdoctor называет, только когда согласны оба признака: ζ не выше 0.5 и провал ниже цели после пика от 4% (с вероятностью 90% не меньше 2%). Warn — при ζ до 0.40 или провале от 15%. Если модель легла на кривую плохо, ζ в отчёт не выводится, и судят только по провалу, не выше «info». Частота качания ниже 6 Гц у 5-дюймовика указывает скорее на I-term или тяжёлый аппарат, чем на D.

Скорость

Как строится кривая

Стик никто не дёргает идеальными ступеньками, поэтому отклик восстанавливается обратным счётом (деконволюцией). Для каждого секундного окна решается задача: какая реакция на мгновенную ступеньку дала бы этот гироскоп при этом стике. Подвохов два.

Дальше берётся медиана по окнам, а интервал строится бутстрэпом: 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 проверяет отдельно:

Три кривые отклика по roll: хорошая настройка с перелётом 2%, заводская настройка 3.1.5 с перелётом 87% и квадрик на 4.5.2 с перелётом 47% от feedforward
Отклик по roll трёх квадриков, каждая кривая нормирована на установившийся уровень. A — эталонная настройка (Betaflight 3.1.5): пик 1.05, за вычетом погрешности метода 2%. B — заводская настройка 3.1.5 (лог 7.9 кГц): пик почти 1.9, провал до 0.8 и качание — 87%, причина — вес setpoint в D. C — 3,5-дюймовик на 4.5.2: пик 1.49 (47%) и только неглубокий провал после него: 60% работы делает feedforward.

Пять реальных случаев

Эталон: 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 минуты потрогай моторы.

Две кривые отклика по roll: недодемпфированный контур с провалом и качанием и здоровый отклик, пунктиром — идеальный отклик тем же методом
A — Betaflight 2026.6, лог 247 Гц: пик 1.39 через ~50 мс, провал до 0.95 и качание ~9 Гц, ζ 0.49. B — Betaflight 4.5.1, 1 кГц: пик 1.16, по roll и pitch по 12%, t50 10–12 мс — трогать нечего. Пунктир — то, что метод рисует для идеального отклика с той же задержкой: его горб в 4% вычитается из перелёта. Заливка — разброс между отдельными окнами, отсюда медиана и интервал.

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 по отдельности

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.2d_min_rolld_roll
4.3–4.5d_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

Безопасность

Проверить свой лог

Загрузи лог в 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.

Обновлено:

Другие гайды