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

Аналіз PX4 ULog: вібрації, фільтри й налаштування регулятора швидкості обертання

Flight Review будує хороші графіки, але залишає відкритими головні питання: який пік важливий, причина в механіці чи в регуляторі, який фільтр змінювати та чи містить лог достатньо даних. Усі приклади нижче взято з реальних логів PX4 1.12–1.17, на яких тестували bbdoctor, і кожне число виміряне.

Як отримати корисний лог

Файл .ulg лежить у log/ на SD-карті; його також можна завантажити через QGroundControl → Analyze Tools → Log Download. У 11 із 18 наших логів PX4 використано типовий SDLOG_PROFILE = 1: гіроскоп є лише в sensor_combined із частотою 200 Гц, усередненою у вікнах IMU_INTEG_RATE (200 Гц у 17 із 18 логів), а в логах 1.12 vehicle_rates_setpoint записувався лише з частотою 5–50 Гц. Такий лог не показує ні вібрацій вище 100 Гц, ні реакції контуру швидкості обертання.

Біт SDLOG_PROFILEЗначенняЩо додає
0 Default+1Стандартний набір тем
4 High rate+16Задане значення швидкості обертання, кутову швидкість і команди моторів із високою частотою
8 Raw FIFO high-rate IMU (Gyro)+256Сирий гіроскоп у sensor_gyro_fifo з частотою датчика
9 Raw FIFO high-rate IMU (Accel)+512Те саме для акселерометра; логи стають ще більшими

Додавай біти до поточного значення, а не замінюй його: 1 стане 273, а 25 (Default + System identification + High rate) — 281. У логу PX4 1.15.4 з ARK FMU v6X і SDLOG_PROFILE = 1023 (біти 0–9) тема sensor_gyro_fifo містить 800 пакетів по 10 відліків за секунду (8 кГц), відфільтровані значення швидкості обертання та actuator_motors записані з частотою 800 Гц: 25 МБ за 43 секунди, а реєстратор усе одно пропустив 0.13 с у 4 розривах.

sd_bench -r 100
param set SDLOG_PROFILE 273
reboot

Після зміни SDLOG_PROFILE потрібне перезавантаження. Стандартні теми передають приблизно 50 КБ/с (за документацією PX4); High rate разом із Raw FIFO збільшує потік у кілька разів. Лог псують затримки запису на сотні мілісекунд, а не низька середня швидкість: запусти sd_bench у MAVLink Console і використовуй карту обсягом не більш як 32 ГБ (обмеження NuttX). У логу PX4 1.16.2 зі стандартним профілем втрачено 5.4 с: за такого потоку даних майже напевно винна карта.

Оберти моторів. Щоб визначити, який саме мотор спричиняє вібрацію, потрібна тема esc_status з RPM: двонаправлений DShot, телеметрія DShot (DSHOT_TEL_CFG) або ESC DroneCAN. У версіях 1.16–1.17 для двонаправленого DShot потрібен DSHOT_BIDIR_EN = 1 і правильне значення MOT_POLE_COUNT; у поточній документації обидва замінено протоколом виходу BDShot і параметрами DSHOT_MOT_POL1…12. У нашому лозі 1.17 тема esc_status записана з частотою 167 Гц, а в лозі 1.12 — 4 Гц.

Тестовий політ: 20–30 секунд висіння, плавні зміни газу, а потім 10–20 коротких різких рухів стиком по кожній осі. Stabilized підходить: PX4 записує задану швидкість обертання в кожному режимі. Перевороти не потрібні. Для Betaflight дивись інструкцію з налаштування blackbox.

Вібрації: на що дивитися

Будь обережний із accel_vibration_metric і gyro_vibration_metric: судячи з наших логів, їхній масштаб змінюється між версіями. У лозі 1.12.3 із шумом сирого гіроскопа 68.5 °/с медіанне значення метрики акселерометра — 0.06; на апараті 1.15.4 із шумом удесятеро меншим — 1.6, а на апараті 1.17 — 11.7. Порівнюй значення лише в межах однієї версії та одного апарата.

bbdoctor вимірює RMS шуму сирого гіроскопа вище 80 Гц на roll і pitch: менш як 4 °/с — чисто, 4–10 — шумно, понад 10 — погано. Резонанс — це пік вище 60 Гц, який перевищує локальний фон на 6 дБ або більше принаймні у 60% діапазонів газу. Частоту можна визначити однозначно, якщо гіроскоп записаний із повною частотою датчика (sensor_gyro_fifo) або з частотою не менш як 2 кГц, а пік нижче половини частоти Найквіста; інакше отримаєш кілька можливих частот. Як визначити конкретний мотор: вібрації дрона: знайди несправний мотор.

Реальні випадки з логів

PX4 1.15.4: резонанс 469 Гц і статичний notch

Згаданий вище лог 1.15.4 з ARK FMU v6X (6S, сирий гіроскоп 8 кГц): bbdoctor виявив пік 469 Гц лише на pitch, на 6 дБ вище фону за будь-якого газу. Шум сирого гіроскопа: roll 6.4, pitch 1.6, yaw 2.1 °/с; після фільтрації залишається 0.11 °/с. Вище 250 Гц найімовірніше винні м'які кріплення стека й кріпильні елементи, а не промені.

Ліворуч: спектр pitch у PX4 1.15.4 до й після фільтрації з піком на 469 Гц; праворуч: спектр сирого pitch за двох рівнів газу, де пік на 469 Гц не зміщується
PX4 1.15.4, 6S, сирий гіроскоп із sensor_gyro_fifo на 8 кГц. Ліворуч: pitch до фільтрів (сірий) і після (синій); відфільтроване значення записується з частотою 800 Гц, тому синя лінія обривається на 400 Гц. Праворуч: сирий pitch приблизно за 34% (A) і 37% (B) газу: піки моторів на 280–400 Гц зміщуються, а пік близько 469 Гц залишається на місці.

Як тимчасове рішення можна встановити статичний notch на цій частоті:

param set IMU_GYRO_NF0_FRQ 469
param set IMU_GYRO_NF0_BW 100

Ширина смуги зазвичай становить приблизно 30% частоти, але IMU_GYRO_NF0_BW обмежена 100 Гц (так само IMU_GYRO_NF_BW у версії 1.12). Є два нюанси. По-перше, бортовий FFT увімкнений, але типово шукає лише в діапазоні IMU_GYRO_FFT_MIN–IMU_GYRO_FFT_MAX (30–150 Гц); усі записані ним піки були в межах 31–146 Гц. Динамічний notch на основі FFT ніколи не виявить 469 Гц, а для піка, що не зміщується, статичний notch кращий за розширення діапазону пошуку. По-друге, за значення IMU_GYRO_CUTOFF = 40 низькочастотний фільтр другого порядку вже послаблює 469 Гц приблизно на 43 дБ, тож notch дасть користь, коли підвищиш частоту зрізу, щоб зменшити затримку 5.6 мс. Висновок bbdoctor: запас є, але спершу виправ механіку.

PX4 1.17: автоколивання pitch на 42 Гц

Квадрокоптер 4S на FMU v6C, сирого гіроскопа немає, але записано esc_status. За 63 секунди спокійного польоту похибка pitch (гіроскоп − задане значення) має вузький пік 41.7 Гц, на 28 дБ вище фону, амплітудою 11.5 °/с — нижче частот моторів (61–87 Гц). На roll із такими самими P 0.18, I 0.15 і D 0.003 піка немає. Когерентність між гіроскопом і командою моторів на цій частоті дорівнює 1.0, фаза +13°: коливання спричиняє P.

Спектр гіроскопа мінус задане значення у PX4 1.17: вузький пік 42 Гц на pitch, на цій частоті піка на roll немає, діапазон частот моторів 61–87 Гц вищий за пік
PX4 1.17.0, 4S, спектр похибки (гіроскоп − задане значення) за 63 секунди спокійного польоту. На pitch (синій) пік 42 Гц; на roll (сірий) із такими самими коефіцієнтами рівень тут нижчий на 31 дБ. Помаранчевим показано частоту обертання моторів (5–95-й перцентиль, 61–87 Гц).
param set MC_PITCHRATE_P 0.162

Це зменшення P на 10%. Політай ще раз: пік зменшився — причина була в контурі; зріс — поверни попереднє значення P; не змінився — поверни P і перевір механіку. Зверни увагу на фільтри: на 42 Гц лише IMU_GYRO_CUTOFF = 40 додає приблизно 90° затримки фази, а IMU_DGYRO_CUTOFF = 20 ще сильніше зрізає D і додає власну затримку, тож D погано гасить ці коливання. Вища частота зрізу гіроскопа допомогла б, але без сирого гіроскопа шум не перевіриш: зараз зменш P, а до фільтрів повернись пізніше з профілем 281.

PX4 1.12.3: шум 68.5 °/с у лозі з частотою 222 Гц

Стара плата FMU v3, 4S, профіль 1. Шум сирого гіроскопа вище 80 Гц: roll 68.5, pitch 27.8, yaw 14.5 °/с. Лог бачить лише діапазон 80–111 Гц. Пік також не зміщується за будь-якого газу, але за частоти запису 222 Гц його справжня частота може бути 94, 129 або 316 Гц. Тож не встановлюй notch навмання: спершу перевір пропелери, мотори й кріплення, а потім запиши короткий лог Raw FIFO, щоб точно визначити частоту.

PX4 1.12.3: мотор 2 і друга гармоніка

Апарат 6S, у повітрі понад 15 хвилин, мотори обертаються зі швидкістю 2500–3170 об/хв (42–53 Гц) за даними esc_status. Порядковий аналіз (гіроскоп демодульовано за фазою обертання кожного мотора) виявив компоненту 2× амплітудою 5.3 °/с на M2 і майже нульову на інших моторах: зазвичай так буває через пошкоджену лопать або невідповідний крок лопатей. Але RPM записувався лише з частотою 4 Гц, а 2× (приблизно 83 Гц) близька до межі 100 Гц, тож це підказка, а не остаточний висновок. На стандартному Quad X мотор 2 стоїть ззаду ліворуч; у цього апарата нестандартний SYS_AUTOSTART, тому перед зняттям пропелера перевір мікшер.

Фільтри PX4

ПараметрВерсіїЩо робитьКоли змінювати
IMU_GYRO_CUTOFFусіНизькочастотний фільтр гіроскопа (типове значення 40 Гц, як у 10 із 18 наших логів)Підвищуй, щоб зменшити затримку, якщо відфільтрований гіроскоп чистий і мотори залишаються прохолодними
IMU_DGYRO_CUTOFFусіНизькочастотний фільтр для D, яка працює з похідною кутової швидкості. Типове значення 20 Гц (30 у 1.12)Знижуй, щоб зменшити шум моторів; демпфування швидких коливань стане слабшим
IMU_GYRO_NF0_FRQ, IMU_GYRO_NF0_BW, IMU_GYRO_NF1_*1.13+Статичні notchЛише за однозначно визначеної частоти резонансу
IMU_GYRO_NF_FREQ, IMU_GYRO_NF_BW1.12Статичний notchТе саме
IMU_GYRO_DNF_EN (біт 0 — RPM ESC, біт 1 — FFT), IMU_GYRO_DNF_HMC, IMU_GYRO_DNF_BW1.13+ (у 1.12 — IMU_GYRO_DYN_NF)Динамічний notch за RPM або бортовим FFTЯкщо маєш телеметрію RPM, використовуй біт 0
IMU_GYRO_FFT_EN, IMU_GYRO_FFT_MIN, IMU_GYRO_FFT_MAX1.12+Бортовий FFT; типово шукає в діапазоні 30–150 Гц (32–192 у 1.12)Сам по собі нічого не фільтрує

PX4 фільтрує кожен відлік FIFO із повною частотою датчика й лише потім знижує частоту до IMU_GYRO_RATEMAX (типово 400 Гц, у 16 із 18 наших логів — 800 Гц). Тому notch на 469 Гц працює з контролером на 800 Гц.

Затримка. bbdoctor бере затримку низькочастотного фільтра гіроскопа з його параметра: √2/(2π·fc) для фільтра другого порядку. Різниця часу між записаними темами нічого не говорить про затримку фільтра: у PX4 вона може бути нульовою за частоти зрізу 30–60 Гц.

IMU_GYRO_CUTOFF, Гц2530406080
Затримка, мс9.07.55.63.752.8

Підвищення частоти зрізу. Змінюй кроками по 10 Гц (40 → 50 → 60). Після кожного кроку політай 20–30 секунд, приземлись і торкнись моторів та ESC: документація PX4 попереджає, що вони можуть перегрітися аж до пошкодження. Зупинись, коли шум на FFT каналів виконавчих механізмів помітно зросте, і повернись на крок назад. Якщо шум сирого гіроскопа перевищує 4 °/с, не чіпай фільтри й виправ механіку. Чому шум нагріває мотори: шум і налаштування фільтрів.

param set IMU_GYRO_CUTOFF 50

Регулятор швидкості обертання: P, I, D, FF і K

Регулятор швидкості обертання PX4 обчислює K·(P·похибка + I·інтеграл − D·кутове прискорення) + FF·задане значення. D працює з виміряним прискоренням, а не з похибкою, тому різкі рухи стиком не спричиняють стрибка D. Параметри: MC_ROLLRATE_P/I/D/FF/K і відповідні параметри для PITCHRATE та YAWRATE, а також межі інтегратора MC_RR_INT_LIM, MC_PR_INT_LIM, MC_YR_INT_LIM.

Множник K. За K = 1 маємо паралельну форму; за P = 1 — стандартну форму, де K є загальним коефіцієнтом підсилення. У лозі CubeOrange на PX4 1.13.1 значення P 1, I 2, D 0.029 і K 0.08 для roll та pitch дають ефективні коефіцієнти 0.08, 0.16 і 0.0023, тому порівнювати його «P = 1» із чиїмось 0.15 безглуздо. FF не масштабується множником K.

param show MC_ROLLRATE*
param show MC_PITCHRATE*

Порядок ручного налаштування за документацією PX4: ітеративно налаштуй P і D для roll та pitch, потім I. Для yaw зазвичай використовують D = 0. Документація також радить вимкнути MC_AIRMODE на час налаштування.

Автоналаштування. Вбудоване з версії 1.13: задай MC_AT_EN = 1, потім у QGroundControl (Vehicle Setup → PID Tuning) увімкни Autotune й натисни кнопку під час польоту в режимі Altitude, Hold або Position. Будь-який рух стиком перериває процедуру, тож тримай безпечну висоту. Параметр MC_AT_APPLY = 1 (типове значення) застосовує коефіцієнти після дизарму. Якщо з'являться швидкі коливання (частіше ніж раз на секунду), документація радить зменшувати MC_ROLLRATE_K і MC_PITCHRATE_K кроками по 0.02.

У PX4 немає TPA як у Betaflight. У жодному з наших логів 1.12–1.17 немає MC_TPA_*. Залежність підсилення від газу враховує модель тяги THR_MDL_FAC (0 = тяга лінійно залежить від сигналу, 1 = квадратична залежність); на більшості наших апаратів значення 0, на трьох — 0.3, на одному — 0.1. Документація вказує 0.3–0.5 як типові значення: почни з 0.3 і змінюй кроками по 0.1. Коливання на малому газу означають, що значення завелике, а на великому — замале. Після цього знову перевір налаштування регулятора швидкості обертання.

param set MC_AT_EN 1
param set THR_MDL_FAC 0.3

bbdoctor зчитує реакцію з vehicle_rates_setpoint навіть у режимі Stabilized, якщо гіроскоп і задане значення записані з частотою щонайменше 200 Гц, а придатними є не менш як 10 різких рухів стиком (і чверть усіх); якщо крива нестабільна — потрібно 30. У лозі 1.16.2 roll сягнув лише 84% заданого значення, тож bbdoctor запропонував підвищити P та I на 10%: MC_ROLLRATE_P 0.102 → 0.112, MC_ROLLRATE_I 0.1301 → 0.143. Як читати реакцію на стрибок: налаштування PID за blackbox.

Автоколивання чи резонанс рами

Для вузького піка є два протилежні способи усунення, і плутанина дорого коштує: якщо знизити фільтрацію при автоколиванні контуру, додаткова затримка лише погіршить ситуацію.

ОзнакаАвтоколивання контуруМеханічний резонанс
ЧастотаЗазвичай 10–80 Гц, нижче частоти моторівБудь-яка, часто вище 100 Гц; не залежить від газу
ОсіОдна вісь або roll+pitch без yawЧасто всі осі, включно з yaw
МоториКоливаються синхронно з гіроскопом (висока когерентність)Слабкий зв'язок із командами моторів
P −10%Пік зменшуєтьсяБез змін
РішенняЗменш P (або D, якщо коливання спричиняє D)Перевір кріплення, стек і промені; notch — тимчасовий захід

bbdoctor шукає такі піки на спокійних ділянках (задане значення менше 60 °/с, газ стабільний) у діапазоні 10–80 Гц або до 0.8 частоти моторів. Пік має бути вузьким, перевищувати локальний фон на 10 дБ і мати амплітуду щонайменше 1 °/с; його відкидають, якщо він збігається з гармоніками моторів, є на кожній осі, включно з yaw, або відповідає відомому резонансу рами. Перехресний спектр гіроскопа й крутного моменту показує, чи коливаються мотори синхронно (когерентність 0.5+), а фаза — чи спричиняють це P, D або затримка фільтрів.

Failsafe й акумулятор

bbdoctor виявляє спрацювання failsafe за vehicle_status; причину шукай у повідомленнях логу (Flight Review → Messages). У лозі CubeOrange на PX4 1.13.1 є повідомлення «Failsafe enabled: no offboard», «Position-Ctrl activation failed», а потім «Failsafe: blind descend». Зв'язок із Offboard втрачено, реакцією було COM_OBL_RC_ACT = 0 (Position), але режим Position не ввімкнувся. «Blind descend» означає, що контролер позиції не мав оцінки вертикальної швидкості, тож апарат опускався з тягою трохи нижче за потрібну для висіння. Виправ зв'язок із компаньйоном та оцінку висоти EKF2 і вибери реакцію, яку підтримують твої датчики (Altitude або Land без позиціонування); проблема не в RC-лінку. Час очікування задає COM_OF_LOSS_T; у 1.13 є також COM_OBL_ACT для випадку без RC, а у версіях 1.14+ — лише COM_OBL_RC_ACT.

У лозі 1.17 під час польоту з'явилося повідомлення «Battery 1: over voltage. Land now!» за середньої напруги 3.6–3.7 В на банку. Поточний код PX4 видає його, коли один невідфільтрований відлік напруги перевищує BAT1_N_CELLS × BAT1_V_CHARGED × 1.05; тут це 4 × 4.05 × 1.05 = 17.0 В. Записані з частотою 5 Гц відліки сягають максимуму 16.27 В, але сусідні відрізняються на 2–3.5 В (16.13 → 12.6 → 14.96 В). Стрибок струму 6–19 А пояснює максимум 1.2 В навіть за оціненого bbdoctor опору 22 мОм на банку, отже показання напруги самі по собі шумні, а перевірку спричинив незаписаний пік. Перевір проводку й землю модуля живлення та калібрування BAT1_V_DIV; значення BAT1_V_CHARGED 4.05 замість 4.2 (поточного типового значення) лише знижує поріг.

ПараметрЗначення
NAV_RCL_ACTВтрата RC: 1 — Hold, 2 — Return, 3 — Land
COM_RC_LOSS_TСекунди до визнання втрати RC: 0.5 у 11 наших логах, але траплялися також 10 і 35 с
BAT_LOW_THR, BAT_CRIT_THR, BAT_EMERGEN_THRПороги залишкового заряду: типово 0.15, 0.07, 0.05
COM_LOW_BAT_ACT0 — лише попередження, 2 — Land, 3 — Return за критичного рівня й Land за аварійного

У 12 із 18 наших логів COM_LOW_BAT_ACT = 0, тобто лише попередження. Для великого апарата з GPS:

param set COM_LOW_BAT_ACT 3
param set NAV_RCL_ACT 2

Return потребує справної оцінки позиції. Без GPS вибери посадку: COM_LOW_BAT_ACT 2 і NAV_RCL_ACT 3.

Зношений акумулятор видає внутрішній опір. bbdoctor оцінює його за нахилом залежності напруги від струму під час різких змін струму: менше 12 мОм на банку — нормально, 12–25 — попередження, більше — погано. У цьому лозі 1.17 вийшло приблизно 22 мОм проти 2–10 на інших апаратах, але через такий шум напруги оцінка ненадійна: виправ вимірювання й перевір акумулятор зарядним пристроєм. Політ почався з частково використаним акумулятором (3.94 В на банку), а мінімальна напруга (медіана за 0.5 с) становила 3.41 В на банку за пікового струму лише 18 А.

Типові пастки в логах PX4

Автоматичний аналіз

bbdoctor безкоштовно аналізує логи PX4 .ulg онлайн: шум до й після фільтрів, резонанси, автоколивання контуру, реакцію регулятора швидкості обертання, навантаження моторів і RPM, акумулятор, failsafe та розриви під час запису. Якщо частота запису логу замала, сервіс підкаже потрібний SDLOG_PROFILE. Порогові значення налаштовано на FPV-квадрокоптерах Betaflight, тож великі апарати порівнюй із їхніми попередніми логами. Дивись приклад звіту, а також інструкції з аналізу логів ArduPilot і blackbox INAV.

Часті запитання

Як записати дані про вібрації в PX4?

Додай до поточного SDLOG_PROFILE біти 4 High rate (+16) і 8 Raw FIFO high-rate IMU Gyro (+256): значення 1 стане 273. Перезавантаж контролер, щоб застосувати зміну. Сирий гіроскоп записуватиметься в sensor_gyro_fifo з частотою датчика. Логи стануть у кілька разів більшими, тож використовуй цей профіль для тестових польотів і перевір SD-карту командою sd_bench.

Які фільтри PX4 налаштовувати?

IMU_GYRO_CUTOFF (низькочастотний фільтр гіроскопа), IMU_DGYRO_CUTOFF (низькочастотний фільтр D-складової), статичні notch IMU_GYRO_NF0_FRQ/BW (у 1.12 — IMU_GYRO_NF_FREQ/BW) і динамічний notch IMU_GYRO_DNF_EN (у 1.12 — IMU_GYRO_DYN_NF). Спочатку усунь механічні проблеми: фільтри потрібні для того, що залишилося після пропелерів, моторів і кріплень. Після кожного підвищення частоти зрізу політай 20–30 секунд і перевір мотори на дотик.

Чим bbdoctor відрізняється від Flight Review?

Flight Review будує графіки, а висновки ти робиш сам. bbdoctor вимірює шум до й після фільтрів, шукає резонанси й автоколивання контуру, порівнює мотори й акумулятор та формує команди для набору параметрів. Вони добре доповнюють одне одного: графіки дивись у Flight Review, а діагностику й команди отримуй у bbdoctor.

Чому в логу з частотою 200 Гц не видно вібрації моторів?

Лог із частотою 200 Гц показує частоти лише до 100 Гц, а вібрації пропелерів і моторів зазвичай вищі. Типово PX4 записує sensor_combined, де дані гіроскопа усереднено у вікнах IMU_INTEG_RATE (200 Гц). Швидші коливання згладжуються або накладаються на хибну частоту. Потрібен профіль Raw FIFO.

Оновлено:

Інші гайди