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

Как читать blackbox лог: от графиков к диагнозу

Открыл лог в Blackbox Explorer, а там три десятка линий. Explorer честно показывает всё, что записал полётник, но выводы делаешь сам. Ниже — семь шагов ручного разбора и один реальный лог: каждая находка bbdoctor с числами и как проверить её глазами, и когда автоматика обязана сказать «не знаю».

Чем читать лог: инструменты

ИнструментЧто делает за тебяЧто остаётся тебе
Blackbox Viewer (Blackbox Explorer)Все поля на шкале времени, синхронизация с видео, анализатор спектра: PSD, тепловые карты по газу и по оборотам, сравнение спектров через импорт CSV, экспорт в CSV. С релиза 2026.6 это вкладка Betaflight App; отдельный blackbox.betaflight.com заморожен.Найти нужные моменты, решить, что норма, и выбрать параметр.
INAV Blackbox ExplorerТо же для логов INAV.То же; обороты моторов INAV не пишет.
PIDtoolboxСпектрограммы по газу, step response, несколько логов рядом.Интерпретация и выбор параметра.
PID-Analyzer (Plasmatree)Скрипт на Python: step response деконволюцией, шум по газу.Интерпретация; от FF перелёт или от P/D, он не говорит.
blackbox_decodeЛог в CSV.Всё остальное — свои скрипты.
Mission Planner, UAV Log Viewer (ArduPilot)Графики сообщений .bin: RATE, PIDR/PIDP, VIBE, BAT, RCOU; FFT — веб-инструмент Filter Review.Выводы и границы VIBE.
PX4 Flight ReviewОнлайн-графики .ulg: слежение по угловой скорости, выходы на моторы, спектрограммы.Выводы и параметры.
bbdoctorНаходки «что не так → что делать» с числами, 90%-интервалами и командами под твою прошивку: Betaflight, EmuFlight, INAV, Rotorflight, ArduPilot, PX4.Покадрового просмотра и видео нет — это к Explorer. Решить, применять ли совет.

Это не конкуренты: Explorer — чтобы рассмотреть конкретную секунду полёта, автоматика — чтобы понять, на какую смотреть и что трогать.

Ручной разбор за 7 шагов

Поля называю так, как они записаны в логе (так их видно в CSV и в настройке графиков). Индекс 0 — roll, 1 — pitch, 2 — yaw. Анализатор спектра включается в меню View → Analyser (клавиша A), затем выбираешь линию в легенде.

  1. Шкала времени и режимы. В файле бывает несколько полётов, по одному на арм. Режим смотри во flightModeFlags: в ANGLE и HORIZON отклик PID читается хуже, чем в ACRO. По rcCommand[3] найди висение, сбросы газа и панчи. На кусках с разрывами записи спектрам не верь.
  2. Гироскоп против setpoint на флипах. gyroADC[0] и setpoint[0] на одном графике. Гироскоп проскакивает цель — перерегулирование. Качается после остановки стика — мало демпфирования или отскок. Плетётся на 20–30 мс позади — вялый отклик. Добавь axisP[0], axisD[0], axisF[0]: видно, какой член толкает квадрик.
  3. Моторы. motor[0..3]. 100% на панче в полный газ — нормально, короткое касание 100% на резком флипе тоже. Упираются подолгу на манёврах при среднем газе — нет запаса тяги. Мотор лежит на холостом после сброса газа — частая причина пропвоша. Одна пара в висении стабильно выше другой — центр тяжести.
  4. Спектр до и после фильтров. gyroUnfilt против gyroADC. Всё выше ~80 Гц — шум, а не полёт. Что осталось после фильтров, идёт в PID и греет моторы.
  5. Частота против газа. Диагональ, уезжающая вправо с газом, — моторы и пропы. Вертикальная полоса при любом газе — рама, стек или антенна (рис. 1).
  6. I-term в висении. axisI[0] и axisI[1] в норме гуляют около нуля. Держит одно значение весь полёт — компенсирует перекос: центр тяжести, кривой или уставший мотор.
  7. Напряжение и ток. vbatLatest и amperageLatest: просадка на банку на пиках тока, напряжение в конце. Скачок напряжения, делённый на скачок тока, — грубая оценка внутреннего сопротивления.
Тепловые карты шума сырого гироскопа по газу: слева диагональ моторов, справа вертикальные полосы резонанса рамы
Шум сырого гироскопа по газу. A: roll, Betaflight 4.2.5, 4S, запись 2 кГц. Диагональ — моторы: пик уходит с 242 Гц на 20–25% газа к 398 Гц на 50–55% и к ~600 Гц на полном газе. B: pitch, Betaflight 4.5.1, 6S, запись 1013 Гц, шкала кончается на 506 Гц. Полосы около 186 и 225 Гц стоят на месте от 15 до 80% газа — это рама или стек, а не моторы. bbdoctor отмечает резонанс, видный как 186 Гц по pitch и 198 Гц по roll, но notch не советует: при записи 1013 Гц пик 186 Гц может на деле быть 827 или 1199 Гц. Пустые строки — на этом газе почти не летали.

Шаги 4 и 5 работают, только если лог пишется достаточно быстро: всё выше половины частоты записи зеркально заворачивается вниз и рисует ложные пики. Как настроить запись — в гайде настройка blackbox.

Один реальный лог целиком

Возьмём публичный лог, по которому собран пример отчёта: Betaflight 4.5.2, SpeedyBee F405 Mini, 4S, судя по имени VX3.5 — квадрик 3.5". 110 с лога, 107 в воздухе, всё в ACRO. Гироскоп 8 кГц, PID 4 кГц, запись 1 кГц, есть сырой гироскоп и eRPM. В отчёте 20 пунктов; ниже главные и откуда взялось каждое число.

Задние моторы нагружены на 50% сильнее — центр тяжести

Средняя команда за полёт: задние M1 и M3 — 28.7%, передние — 19.2%. Разница от 12% — «внимание», больше 30% — «критично». Подтверждение — I-term по pitch: медиана 45, а не около нуля, контроллер весь полёт доливает тягу назад. Обычно батарея или камера сдвинуты назад; другой вариант — много быстрого полёта вперёд, тогда в спокойном висении разницы почти нет. PID тут ни при чём: двигай батарею, пока квадрик не повиснет ровно на пальцах под центром рамы.

Roll: перерегулирование 36%, и виноват feedforward

Step response по roll — 36% (90%-интервал 29–44%), по 165 пригодным секундным окнам из 372 с движением стика (окна перекрываются); половину заданной скорости квадрик набирает за 8 мс. Нижняя граница выше 15% — это находка. Но совет не «опусти P» и не «подними D». На резких движениях стика feedforward делает 60% работы (FF против P), а гироскоп в среднем идёт на 3 мс впереди setpoint. Раз квадрик обгоняет команду, его тащит FF. Поэтому меняется только FF: f_roll 120 → 102, −15% от значения в заголовке, P и D не трогаем. Если перелёт останется только на резких флипах, следующий шаг — feedforward_boost 15 → 8. По pitch то же: 28% (23–37%), FF 56% работы, f_pitch 125 → 106.

set f_roll = 102
set f_pitch = 106
set simplified_pids_mode = OFF
save

simplified_pids_mode здесь не случайно: PID в логе не совпадают со слайдерами, и Configurator при следующем сохранении перезаписал бы ручные значения.

Резкое движение по roll: setpoint и гироскоп, ниже члены P, D и feedforward с крупными всплесками FF
Самое резкое движение по roll в примере, 0.8 с. A: стик пошёл на 200-й мс. На 100 °/с гироскоп отстаёт от setpoint на 10 мс, к 200 °/с уже обгоняет на 13 мс. Пик 267 °/с при цели 245. Когда стик отпускают, гироскоп проваливается на 66 °/с ниже setpoint (496-я мс). B: FF даёт всплески до +446 и −467 на ступеньках стика, P не выходит за 95, D — за ±88 (единицы PID в логе Betaflight).

Почему глазами 36% не увидишь: на этом движении пик всего на 22 °/с (9%) выше цели. Step response — ответ на идеальную мгновенную ступеньку, вычисленный деконволюцией по 165 окнам, а реальный стик — рампа около 100 мс. Зато на рампе видно то же самое в другой форме: гироскоп обгоняет setpoint, а всплески FF почти впятеро больше P. Подробнее — настройка PID по логу.

Сырой шум 4.1 °/с: механика, а не фильтры

Шум сырого гироскопа выше 80 Гц: roll 4.1, pitch 2.4, yaw 2.5 °/с при границе «внимания» 4 °/с — едва за чертой. После фильтров 0.53 °/с при задержке ~1.4 мс, и отчёт пишет «Фильтры в норме». Значит, фильтры не трогаешь, а проверяешь пропы, подшипники и подвес стека. Вибрация 1× по моторам ровная: M1 1.1, M2 0.5, M3 1.8, M4 1.9 °/с; обороты при одинаковой команде расходятся не больше чем на 1.9%. Как искать плохой мотор, когда разброс большой, — в гайде вибрации по моторам.

Моторы до 610 Гц при записи 1 кГц

По eRPM моторы крутятся до 610 Гц, а лог 1000 Гц видит только до 500. Выше всё заворачивается вниз: 610 Гц в спектре нарисуются на 390. Разбор по моторам это учитывает, он идёт по фазе вращения из eRPM, а спектр и частоты резонансов в таком логе неоднозначны. Команда из отчёта:

set blackbox_sample_rate = 1/2
save

Дрожание FF от пульта: 2.1% диапазона мотора

Пока стики двигаются, составляющая FF выше 40 Гц — рывок на каждой ступеньке сигнала пульта — даёт 2.1% диапазона мотора по roll и 1.7% по pitch, рывков больше 5% — 34 и 28 в секунду. Полезная часть FF ниже 12 Гц — 1.5 и 1.2%. На неподвижных стиках — 0.40%, значит, источник в ступеньках стика. Пульт 494 Гц, сглаживание 185 Гц. ВЧ-шум PID-выхода на 89% даёт FF, на 10% — D. Поэтому D и фильтры D-term ради него не трогай, это только добавит задержку. Сначала снизить FF, а сглаживание — следующим полётом:

set feedforward_averaging = 2_POINT
set feedforward_smooth_factor = 65
save

Буст D почти не включается

Настроено d_min_roll = 30 и d_roll = 45, буст до ×1.50. bbdoctor меряет реальный коэффициент по записанному D-term: наклон axisD к производной гироскопа в полосе 8–40 Гц, блоками по 0.25 с, без вклада TPA. На самых резких движениях D дорастает лишь до ×1.06, по pitch — до ×1.04. Летаешь ты на d_min, поэтому демпфирование меняют через базовый D (колонка Derivative), а не через D Max. В 2025.12 имена сменили под интерфейс: базовый D — d_roll, потолок — d_max_roll; таблица по версиям — в гайде настройка PID.

Пропвош 1.1 °/с: в норме

Сброс газа — падение с уровня выше 35% больше чем на 25% хода за 0.15 с. Их 46, два сразу перешли во флип, и bbdoctor их выкидывает: движение стика даёт те же 15–80 Гц. По 44 чистым сбросам ошибка gyro − setpoint в полосе 15–80 Гц через 0.08–0.6 с после сброса — 1.1 °/с (RMS), основная частота ~20 Гц, норма — до 4. Трогать нечего; если пропвош всё же мешает — см. гайд пропвош.

Батарея: 3.23 В на банку при 72 А

Старт с 3.84 В на банку, не с полной. Устойчивый минимум 3.23 В (дольше 0.5 с), пик тока 72 А, в конце 3.66 В, ~248 мАч. Внутреннее сопротивление ≈ 7 мОм на банку — оценка по 182 участкам с резкой сменой тока, вместе с проводами. Банка на пределе — «внимание».

Что ещё

Как проверить каждую находку в Explorer

НаходкаЧто вывестиЧто должен увидеть
Центр тяжестиmotor[0..3], axisI[1]В висении M1 и M3 (задние в раскладке Betaflight) выше M2 и M4, axisI[1] около 45.
Перелёт от FFsetpoint[0], gyroADC[0], axisF[0], axisP[0]Гироскоп выше setpoint ещё на подъёме, пики axisF в разы больше axisP. Если FF маленький, а гироскоп качается после остановки стика — это P/D.
Сырой шумgyroUnfilt[0] и gyroADC[0] в анализатореСырой спектр заметно выше в 100–500 Гц, после фильтров почти ровный пол.
Моторы быстрее записиeRPM[0..3]Частота мотора = поле × 100 / (motor_poles / 2) / 60. При 14 полюсах 610 Гц — это 2562 в поле.
Дрожание FFaxisF[0], setpoint[0]На каждой ступеньке setpoint — короткий всплеск axisF; на неподвижном стике почти ноль.
ПропвошrcCommand[3], gyroADC[0..1]Качание ~20 Гц через 0.1–0.6 с после сброса; при 1 °/с его почти не видно.
ПросадкаvbatLatest, amperageLatestМинимум около 12.9 В на пиках до 72 А.

Почему иногда «не хватает данных»

Когда данных мало, автоматика обязана промолчать, иначе она уверенно советует ерунду. Пороги bbdoctor:

ПроверкаМинимумЕсли меньше
Весь лог10 с в воздухеВсё понижается до «инфо», команд нет
Step response по оси10 пригодных окон, не меньше четверти всех«Мало данных для отклика»
«Критично» по перелёту, глубокий разбор PID50 окон на осьНе выше «внимания», часть проверок молчит
Отскок после флипов6 резких остановок на осьНе проверяется
Клевок на панчах6 панчей без движения стиковНе проверяется
Пропвош3 чистых сброса, для «внимания» — 5Без оценки; при 3–4 — только «инфо»

Пример: лог Betaflight 4.2.5 (2 кГц, 4S, 215 с в воздухе): 15 сбросов газа, но 12 сразу переходят во флип или ролл. Усреднить все 15 — «пропвош» 18.4 °/с, «критично» (порог 10). По отдельным сбросам — от 1.4 до 58.6 °/с: большие числа дают сами флипы. Три чистых сброса — 1.8 °/с, норма. Программа без отбраковки манёвров отправила бы тебя поднимать D и холостой ход на квадрике без пропвоша.

Вторая защита — «погрешность метода уже вычтена». Деконволюция рисует немного перелёта даже у идеального отклика, особенно когда setpoint не записан и восстановлен по стикам. bbdoctor прогоняет тот же расчёт на setpoint, сдвинутом на ту же задержку, и вычитает. Лог Betaflight 4.5.1 с выключенной записью setpoint (801 Гц, 6S): по pitch 29% сырого перелёта, из них 9% — погрешность, в отчёте 20%. По yaw сырые 9.6% целиком оказались погрешностью: «перерегулирования нет».

Как понять, можно ли верить числам

Порядок работы: одно изменение за полёт

  1. Запиши 1–2 минуты в ACRO: висение, плавные развороты, 5–6 сбросов газа, по 6–8 флипов и роллов с резким возвратом стика в центр, 6–8 панчей без движения стиков.
  2. Загрузи файл в онлайн-анализ blackbox лога. Начинай с «критично» и механики; PID на перекошенной раме и битых пропах подбирать бесполезно.
  3. Одно изменение — один полёт. Для этого лога: батарея на место, потом FF, потом сглаживание FF. blackbox_sample_rate меняй с любым шагом: на полёт он не влияет. Настраиваешь с батареей на столе — пропы сняты.
  4. Те же пропы, похожая банка с похожим зарядом, тот же стиль полёта.
  5. Сравни кнопкой «Сравнить анализы» под историей. Если 90%-интервалы до и после пересекаются, это «без изменений»; полёты разного стиля (средний газ отличается на 10% хода и больше или длительность — втрое) помечаются.

Ограничения

Дальше — по конкретным проблемам: шум и фильтры, пропвош, PID по step response.

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

Чем открыть blackbox лог Betaflight?

В Blackbox Viewer: с релиза 2026.6 это вкладка Betaflight App (app.betaflight.com), а отдельный Blackbox Explorer заморожен. Для INAV есть свой INAV Blackbox Explorer. Если нужен готовый разбор с числами и командами CLI, загрузи файл в bbdoctor.

Какие файлы логов понимает bbdoctor?

Blackbox Betaflight, EmuFlight, INAV и Rotorflight (.bbl, .bfl, .txt), ArduPilot .bin и PX4 .ulg. Формат определяется по содержимому. Текстовый .log ArduPilot и .tlog не подходят, логи ArduPlane, Rover и самолётов PX4 тоже.

Можно ли доверять автоматическому анализу?

Каждая оценка идёт с 90%-интервалом, а ниже минимума данных вывода просто нет. Погрешность метода вычитается, советы сверяются между собой. Но это подсказка, а не приговор: меняй по одному параметру и проверяй следующим логом.

Сохраняется ли мой лог?

Лог хранится только для пересчёта анализа и удаляется автоматически; сроки хранения лога и отчёта указаны в политике конфиденциальности. Ссылку на отчёт ты можешь отправить кому захочешь.

Обновлено:

Другие гайды