Аналіз 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.
Вібрації: на що дивитися
- FFT каналів виконавчих механізмів у Flight Review (потрібен профіль High rate). За документацією PX4, на справному графіку є один пік унизу (нижче приблизно 20 Гц), а далі рівень низький і рівномірний. Масштаб залежить від апарата, тож порівнюй його лише з ним самим.
- Спектр сирого гіроскопа (лише Raw FIFO). Піки, що зміщуються зі зміною газу, спричинені моторами й пропелерами. Пік, який не зміщується за будь-якого газу, вказує на резонанс рами, стека, щогли GPS або підвісу.
- Акселерометр. На графіку Raw Acceleration, якщо під час висіння вісь z сягає рівня x і y, це поганий знак. Лічильники обрізання є в
vehicle_imu_status(accel_clipping); обрізання означає, що спершу треба виправити механіку, і воно спотворює оцінку орієнтації.
Будь обережний із 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 Гц найімовірніше винні м'які кріплення стека й кріпильні елементи, а не промені.

Як тимчасове рішення можна встановити статичний 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.

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_BW | 1.12 | Статичний notch | Те саме |
IMU_GYRO_DNF_EN (біт 0 — RPM ESC, біт 1 — FFT), IMU_GYRO_DNF_HMC, IMU_GYRO_DNF_BW | 1.13+ (у 1.12 — IMU_GYRO_DYN_NF) | Динамічний notch за RPM або бортовим FFT | Якщо маєш телеметрію RPM, використовуй біт 0 |
IMU_GYRO_FFT_EN, IMU_GYRO_FFT_MIN, IMU_GYRO_FFT_MAX | 1.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, Гц | 25 | 30 | 40 | 60 | 80 |
|---|---|---|---|---|---|
| Затримка, мс | 9.0 | 7.5 | 5.6 | 3.75 | 2.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_ACT | 0 — лише попередження, 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
- Нумерація моторів. PX4 Quad X: 1 — спереду праворуч, 2 — ззаду ліворуч, 3 — спереду ліворуч, 4 — ззаду праворуч. У Betaflight порядок інший. У лозі 1.17 діагональна пара M3+M4 працювала на 29% інтенсивніше; це підтверджує
esc_status: у польоті приблизно 93 Гц проти 76–77 Гц на M1 і M2. Мікшер компенсує обертання по yaw: перевір, чи не нахилений мотор, не скручений промінь і чи збігаються пропелери. В іншому лозі передні мотори працювали на 23% інтенсивніше за задні: центр мас надто зміщений уперед. - FFT увімкнений, notch вимкнений. У шести наших логах 1.13+ встановлено
IMU_GYRO_FFT_EN = 1іIMU_GYRO_DNF_EN = 0, а в трьох логах 1.12 —IMU_GYRO_DYN_NF = 0. FFT знаходить піки (темаsensor_gyro_fft), але нічого не фільтрує. - Notch, роботу якого не перевіриш. У лозі 1.12.3 notch на 100 Гц за частоти запису 200 Гц стоїть просто на частоті Найквіста: за цим логом не визначити, чи він працює.
- Рідкі теми й пропуски. Задане значення швидкості обертання, записане з частотою 5 Гц, не дає змоги оцінити реакцію, хоч би якою високою була частота гіроскопа. Розриви також псують спектри: якщо реєстратор пропускає дані навіть із профілем 1, заміни карту.
Автоматичний аналіз
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.
Оновлено: