Аналіз логів ArduPilot: вібрація, кліпінг, фільтри та PID
Ваш ArduCopter не утримує висоту, дрейфує в Loiter, видає попередження EKF або дзижчить після autotune. Зазвичай причина — вібрація: оцінка положення погіршується, і автопілот бореться з тим, чого насправді немає. Порядок завжди однаковий: правильний лог → вібрація та кліпінг → спектр і notch-фільтр → фільтри низьких частот → PID. Нижче наведено пороги, які застосовує bbdoctor, і цифри з реальних логів ArduCopter.
Як отримати потрібний лог і ввімкнути швидкий запис
Потрібен бортовий лог DataFlash .bin (Mission Planner → DataFlash Logs → Download або папка APM/LOGS на SD-картці); у телеметрійному .tlog недостатньо даних. Які дані записуються, визначає LOG_BITMASK. Тут важливі п'ять бітів:
| Біт | Назва | Значення | Для чого | У стандартній масці |
|---|---|---|---|---|
| 0 | ATTITUDE_FAST | 1 | ATT і RATE з частотою циклу (400 Гц), потрібні для аналізу PID | ні |
| 7 | IMU | 128 | гіроскоп, акселерометр, VIBE; обов'язково | так |
| 10 | RCOUT | 1024 | виходи моторів; обов'язково | так |
| 12 | PID | 4096 | складові P, I, D, FF у PIDR/PIDP/PIDY | починаючи з 4.6 |
| 19 | IMU_RAW | 524288 | сирі дані гіроскопа (GYR) з частотою сенсора | ні |
До версії 4.5 стандартна маска — 176126; у 4.6 додали біт PID, тож вона стала 180222. У всіх десяти логах ArduCopter із нашої тестової вибірки (версії 4.1–4.8-dev, контролери від fmuv2 до Pixhawk 6X, а також два запуски SITL) IMU записувався з частотою 25 Гц, а RATE, RCOU і VIBE — 10 Гц. Цього достатньо для VIBE та середнього навантаження на мотори, але не для спектра, перевірки фільтрів чи реакції PID.
У Mission Planner просто поставте позначки ATTITUDE_FAST та IMU_RAW у LOG_BITMASK. Якщо в логові немає сирих даних гіроскопа, bbdoctor додає відсутні біти до поточної маски. Для 176126:
LOG_BITMASK = 700415 INS_RAW_LOG_OPT = 9
Для 180222, як і в усіх наших логах версії 4.7, потрібне значення — 704511. Параметр INS_RAW_LOG_OPT = 9 (основний гіроскоп до та після фільтрації) з'явився у версії 4.5; для логів 4.3.7 bbdoctor пропонує лише LOG_BITMASK = 700415, оскільки там сирий запис вмикає сам біт 19.
Логи збільшуються в десятки разів, а повільні контролери чи картки можуть пропускати дані (bbdoctor повідомляє «Пропуски в записі»). ArduPilot описує запис сирих даних IMU для контролерів H7, тому на F4 на кшталт fmuv2 очікуйте пропуски. Після тесту поверніть попередні значення LOG_BITMASK і INS_RAW_LOG_OPT = 0.
Тестовий політ, 3–5 хвилин: зависніть, плавно змініть газ значно вище рівня зависання й поверніть назад, зробіть кілька коротких різких рухів стіками по кожній осі на безпечній висоті. Без фліпів.
bbdoctor відхиляє логи не від коптерів і логи без IMU чи RCOU (в одному великому реальному логу квадрокоптера біт 7 був увімкнений, але повідомлень IMU не було: завантажте повний .bin, а не обрізаний експорт). Логи SITL (параметри SIM_*) проходять без перевірок апаратури. Налаштування запису для будь-якої прошивки описано в посібнику з налаштування логування.
VIBE і кліпінг: два різні сигнали
VIBE.VibeX, VibeY і VibeZ — стандартне відхилення показань акселерометра в м/с², тобто середня сила тряски. VIBE.Clip (у старіших версіях Clip0–Clip2) рахує відліки, що досягли межі діапазону сенсора; лічильник накопичується від увімкнення й не скидається між польотами. bbdoctor оцінює їх так:
- VIBE: 95-й перцентиль для кожної осі за час перебування в повітрі. Нижче 30 м/с² — нормально, 30–60 — попередження, 60 і вище — критичний рівень (пороги з документації ArduPilot);
- Clip: приріст лічильника від першого зльоту до останньої посадки; понад 0 — попередження, понад 100 — критичний рівень. Кліпінг під час армінгу або після останнього торкання землі не враховується. Документація ArduPilot погоджується: в ідеалі лічильник має бути нульовим, кілька спрацьовувань під час жорстких посадок допустимі, стабільне зростання — серйозна проблема.
Чому потрібні обидва показники: реальний лог ArduCopter 4.7.0, fmuv2, 4S, сім польотів, 414 с у повітрі.

VIBE проходить перевірку: 29 за порога 30. Але кліпінг стався 424 рази (критичний рівень у bbdoctor), і дані по кожному польоту підтверджують, що це не випадковість:
| Політ | Час у повітрі | VIBE p95 X / Y / Z | Приріст Clip |
|---|---|---|---|
| 1 | 69 с | 16 / 19 / 24 | 22 |
| 2 | 69 с | 16 / 20 / 25 | 34 |
| 3 | 79 с | 20 / 23 / 26 | 47 |
| 4 | 73 с | 20 / 22 / 30 | 106 |
| 5 | 31 с | 22 / 22 / 28 | 35 |
| 6 | 15 с | 16 / 20 / 24 | 4 |
| 7 | 79 с | 22 / 20 / 32 | 176 |
- Кліпінг буває і за «нормального» VIBE. VIBE показує середнє, а кліпінг виявляє піки. Короткі удари (незакріплений акумулятор, дріт, що б'є по FC, несправний підшипник) майже не змінюють середнє, але насичують сенсор, і EKF отримує нісенітні дані.
- Перцентиль за всім логом приховує найгірший політ: загалом Z дорівнює 29, а в останньому польоті — 32. Кліпів за хвилину: 19 у першому польоті, 134 в останньому. Щось розхитується.
- Причина не в різких наборах висоти. Медіанний газ під час кліпінгу становив 23% — стільки ж, як за весь політ; усе сталося в режимах самовирівнювання. Причина механічна.
Октокоптер (CubeOrangePlus, 4.5.7) мав 64 кліпи за весь лог, але лише 19 у польоті, тож bbdoctor попередив про 19. Зі справним Tarot X4 на 4.5.5 (на рисунку нижче): X — 3, Y — 3, Z — 7 м/с², Clip = 0.
| Що бачите | Ймовірна причина | Що робити |
|---|---|---|
| Високі значення по всіх осях, зростають із газом | незбалансовані пропелери або дзвони моторів | відбалансуйте або замініть пропелери, перевірте вали й підшипники |
| Z помітно вище за X і Y | гнучкі промені, кріплення моторів, надто жорстка або м'яка ізоляція FC | підтягніть мотори й промені, перевірте м'які кріплення FC |
| Одна вісь удвічі вища за іншу | щось розхитане в цьому напрямку: щогла GPS, шасі, підвіс | закріпіть, перевірте рукою, чи немає люфту |
| VIBE нормальний, Clip зростає в кожному польоті | удари: акумулятор, дроти, пропелер щось зачіпає | ремені, протиковзка прокладка під акумулятор, дроти подалі від FC |
Поки не усунете VIBE і кліпінг, не чіпайте фільтри та PID. Щоб знайти несправний мотор, дивіться посібник із вібрації моторів. Повідомлення «Vibration compensation ON» означає, що failsafe вібрації (FS_VIBE_ENABLE, за замовчуванням увімкнений) уже перемкнув утримання висоти на оцінку, стійку до вібрації.
Спектр гіроскопа й гармонічний notch-фільтр
Коли сирі дані гіроскопа записані (GYR), bbdoctor будує спектр до та після фільтрації й шукає піки, що не змінюються разом із газом: резонанси рами. Він радить підтягнути раму, а як тимчасове рішення пропонує другий notch-фільтр, INS_HNTC2_*, у фіксованому режимі — лише коли частота однозначна. Якщо пік може бути аліасом, він наводить можливі частоти й просить короткий лог із сирими даними гіроскопа. Для резонансу 140 Гц:
INS_HNTC2_ENABLE = 1 INS_HNTC2_MODE = 0 INS_HNTC2_FREQ = 140 INS_HNTC2_BW = 70 INS_HNTC2_ATT = 40
Інше джерело даних — пакетний семплер (INS_LOG_BAT_MASK, INS_LOG_BAT_OPT, біт IMU_RAW вимкнено): серії по 1024 відліки (ISBH/ISBD), які майже не збільшують лог. bbdoctor поки їх не читає; скористайтеся вебінструментом ArduPilot Filter Review або FFT у Mission Planner. Ось Tarot X4.

Notch-фільтр працює в режимі FFT (INS_HNTCH_MODE = 4). Найсильніша складова — 67 Гц, далі 134 і 202. Частота 34 Гц схожа на частоту обертання (близько 2000 об/хв), а 67 Гц — її друга гармоніка, проходження лопатей дволопатевого пропелера. Але вікно FFT закінчується на 62 Гц, а FFT протягом усього польоту показував 25 Гц — рівно FFT_MINHZ (навчений параметр FFT_FREQ_HOVER теж дорівнює 25.0). Частоту моторів так і не було знайдено.
У режимі FFT notch-фільтр не опускається нижче INS_HNTCH_FREQ, тут це 35 Гц, тож він залишався на цій частоті; другий notch-фільтр стояв на 70 Гц через INS_HNTCH_HMNCS = 3. Випадково це перекриває складові 34 і 67 Гц: порівняно лише з фільтром низьких частот 20 Гц, відфільтрований спектр нижчий приблизно на 10 дБ на 34 Гц і на 17 дБ на 67 Гц, без додаткового ефекту на 134 і 202 Гц. Фільтр працює, але фактично як фіксований.
Ось у чому суть: не все, що можна виправити, треба виправляти зараз. Після фільтрів складові 67, 134 і 202 Гц ослаблені на 35–43 дБ, VIBE — 3/3/7, кліпінгу немає. Але важчий акумулятор або інші пропелери змістять частоти, а FFT за ними не стежитиме. Перед наступним AUTOTUNE я перейшов би на notch-фільтр, прив'язаний до газу:
INS_HNTCH_ENABLE = 1 INS_HNTCH_MODE = 1 INS_HNTCH_REF = 0.2 INS_HNTCH_FREQ = 67 INS_HNTCH_BW = 33 INS_HNTCH_HMNCS = 7
REF — газ під час зависання (MOT_THST_HOVER = 0.20), FREQ — складова на зависанні, BW — її половина, HMNCS = 7 — гармоніки 1–3: 67, 134, 201 Гц. За стандартного INS_HNTCH_FM_RAT = 1 частота фільтра не опускається нижче FREQ. Від notch-фільтра на 34 Гц свідомо відмовляємося: ця складова ледве перевищує шумовий поріг гіроскопа, а фільтр на такій низькій частоті, близькій до робочої частоти регулятора великого коптера, погіршує фазовий запас. Щоб залишити цей фільтр: задайте FREQ 34, BW 17, HMNCS 43 (гармоніки 1, 2, 4, 6: 34, 67, 134, 202 Гц). Або залиште режим FFT і розширте FFT_MINHZ/FFT_MAXHZ, щоб охопити 67 Гц.
Як вибрати INS_HNTCH_MODE (0 — фіксований, 1 — газ, 2 — датчик RPM, 3 — телеметрія ESC, 4 — FFT): за наявності телеметрії RPM — 3. Без телеметрії, але з F7/H7 — FFT, якщо лог показує, що FTN1.PkAvg змінюється разом із газом, а не зависає на FFT_MINHZ. Для слабкого польотного контролера — газ. У режимах ESC, RPM і FFT параметр FREQ задає нижню межу, а REF дорівнює 1; значення REF = 0 фіксує notch-фільтр на FREQ.
Фільтри низьких частот: INS_GYRO_FILTER і ATC_RAT_*_FLTD
INS_GYRO_FILTER — фільтр низьких частот гіроскопа, за замовчуванням 20 Гц (у логові 4.7 і Tarot; у логові 4.3.7 — 40). ATC_RAT_RLL_FLTD/_PIT_FLTD фільтрують D-складову (20 у логові 4.7, 10 на Tarot), FLTT — задане значення, FLTE — похибку (2–2,5 Гц по yaw). Початкові значення в Mission Planner (Initial Tune Parameters) залежать від розміру пропелерів: що менші пропелери, то вища частота зрізу.
- Підвищуйте
INS_GYRO_FILTERлише після того, як notch-фільтр прибирає частоти моторів: затримка зменшиться, реакція стане чіткішою. - Змінюйте на 10–20% за раз і після кожної зміни робіть короткий політ; зніміть з апарата охорону, від'єднайте акумулятор і перевірте мотори на дотик. Теплі — нормально; гарячі — поверніть попередні значення.
- VIBE у нормі, відфільтрований спектр чистий, апарат літає добре — залиште фільтри як є. На Tarot я б їх не чіпав.
Пастка під час аналізу: лог із частотою 25 Гц показує рух лише до 12,5 Гц; усе швидше відображається як хибна нижча частота. Тому bbdoctor не перевіряє фільтри й PID за такими логами та повідомляє про це. Докладніше — у посібнику з фільтрів.
PID: що видно в логові й коли запускати AUTOTUNE
Регулятор швидкості обертання використовує ATC_RAT_RLL_P, _I, _D, _FF і відповідні параметри для PIT та YAW. bbdoctor порівнює задане значення RATE.RDes (а також PDes і YDes) із показаннями гіроскопа: перерегулювання, затримку, коливання після різкого руху. RDes формується після обробки вхідного сигналу: ATC_INPUT_TC згладжує його, але не змінює якість відстеження гіроскопом, тож так вимірюється саме регулятор швидкості обертання. Потрібен запис із частотою 200 Гц; інакше bbdoctor повідомляє: «Не можна оцінити PID за цим логом: гіроскоп записувався на частоті 25 Гц» і наводить команди з першого розділу.
Для ArduCopter вбудований AUTOTUNE зазвичай надійніший, але запускайте його лише після усунення вібрації та налаштування notch-фільтра:
- VIBE нижче 30, Clip не зростає, notch-фільтр налаштований.
- Призначте AUTOTUNE на перемикач; осі задаються в
AUTOTUNE_AXES(1 — roll, 2 — pitch, 4 — yaw; 7 — усі три), агресивність — уAUTOTUNE_AGGR(0.075 в обох логах вище). - Використовуйте AltHold, Loiter або PosHold у тиху погоду; на кожну вісь потрібно кілька хвилин, тож залиште достатній запас акумулятора.
- Щоб зберегти результат, сядьте й зніміть апарат з охорони, не вимикаючи перемикач.
Інші поради ArduPilot, які bbdoctor надає, коли лог записаний із достатньою частотою:
- На великому газі реакція сильніша. У ArduPilot для коптерів немає TPA, тому краще лінеаризуйте тягу: збільште
MOT_THST_EXPOна 0.05 (наприклад, 0.65 → 0.7). Не допомогло? Зменште P і D на 10% і повторно запустіть AUTOTUNE. - Пропвош під час різкого скидання газу, коли мотори на мінімумі. Підвищте
MOT_SPIN_MINна 0.02, залишивши його щонайменше на 0.03 вище заMOT_SPIN_ARM. У логові 4.7 значення дорівнює 0.08, аMOT_SPIN_ARM— 0.04, тож рекомендація була б змінити 0.08 → 0.1. Дивіться посібник із пропвошу.
Є дві речі, які bbdoctor не перевіряє. Компенсація напруги: у логові 4.7 MOT_BAT_VOLT_MAX = 0, а MOTB.BatVolt тримається на рівні 1.00, отже компенсацію вимкнено й регулятор слабшає в міру розряджання акумулятора. Для 4S:
MOT_BAT_VOLT_MAX = 16.8 MOT_BAT_VOLT_MIN = 13.2
Це 4.2 і 3.3 В на банку; задайте ці значення до AUTOTUNE, адже вони змінюють ефективне підсилення. А ще PIDR.Dmod: якщо він часто падає нижче 1, обмежувач швидкості зміни ATC_RAT_*_SMAX гасить коливання, а підсилення вже на межі. У логові 4.7 значення постійно дорівнює 1.00 (запис із частотою 10 Гц, тож дуже короткі падіння могли не потрапити в лог).
Виходи моторів із частотою 10 Гц: навантаження видно, шум — ні
Стандартні логи записують RCOU з частотою 10 Гц; bbdoctor зазначає: «Виходи моторів записуються з частотою 10 Гц — видно середнє навантаження, але не шум моторів». Ось що все ж можна побачити:
- Зміщений центр мас. Порівнюється середня команда для моторів по боках: різниця від 12% — попередження, понад 30% — критично. В іншому логові 4.7 задні мотори працювали на 62,1%, передні — на 55,2%, тобто на 13% більше — це попередження. У логові з кліпінгом середні значення M1–M4 становили 44,4 / 46,9 / 40,2 / 46,0%, різниця між передньою та задньою частинами — близько 10%, нижче порога.
- Нахилений мотор: мотори, що обертаються в одному напрямку, навантажені на 12% більше, ніж інша пара.
Зважайте на порядок моторів: у ArduCopter Quad X M1 — спереду праворуч, M2 — ззаду ліворуч, M3 — спереду ліворуч, M4 — ззаду праворуч; у Betaflight порядок інший.
Щоб знайти мотор із вібрацією, потрібні оберти: двонаправлений DShot (SERVO_BLH_BDMASK, DShot у MOT_PWM_TYPE, правильне значення SERVO_BLH_POLES) або дротова телеметрія ESC. У Tarot задано 28 полюсів, але використовується звичайний PWM, тож даних RPM немає. За наявності RPM bbdoctor порівнює мотори, а notch-фільтр можна налаштувати в режимі 3.
Failsafe й акумулятор
Після крашу спершу перевірте, чи взагалі налаштовано failsafe; коли підозрює проблему зі зв'язком або акумулятором, bbdoctor звертає увагу на такі параметри. Лог 4.7 (4S):
FS_THR_ENABLE = 1 FS_THR_VALUE = 950 BATT_LOW_VOLT = 14.4 BATT_CRT_VOLT = 14.0 BATT_FS_LOW_ACT = 2 BATT_FS_CRT_ACT = 1
FS_THR_ENABLE = 1означає RTL у разі втрати сигналу.FS_THR_VALUEмає бути нижче за мінімальний газ передавача й вище за значення, яке приймач видає в режимі failsafe. Перевірте на столі, зі знятими пропелерами.- 14,4 і 14,0 В — це 3,6 та 3,5 В на банку; дії 2 (RTL) і 1 (посадка). У Tarot (6S, 30 000 мА·год) задано 3,1 і 2,95 В на банку: нормально для Li-ion, надто низько для LiPo.
- Напруга має залишатися низькою протягом
BATT_LOW_TIMER(за замовчуванням 10 с), тож короткі різкі набори висоти не спричинять спрацювання. Якщо це відбувається під час тривалого набору висоти, задайтеBATT_FS_VOLTSRCрівним 1 (з компенсацією просідання напруги).
bbdoctor показує напругу на старті, мінімум під навантаженням і внутрішній опір. Лог 4.7: на старті 4,11 В на банку, мінімум під навантаженням — 3,76 В (трималося 0,5 с), наприкінці — 3,91 В, піковий струм 13 А, близько 1010 мА·год, приблизно 10 мОм на банку (оцінка, бо напруга та струм записуються окремо).
Назви параметрів змінюються між версіями
| Що | Стара назва | Нова назва |
|---|---|---|
| Максимальне прискорення по roll/pitch/yaw | ATC_ACCEL_R_MAX тощо, у срад/с² | ATC_ACC_R_MAX тощо, у град/с² (4.7) |
| Максимальний кут нахилу | ANGLE_MAX, у сотих частках градуса | ATC_ANGLE_MAX, у градусах (4.7) |
| Швидкість обертання в ACRO | ACRO_RP_P, коефіцієнт: ×45 = град/с (до 4.1) | ACRO_RP_RATE, у град/с (4.2+) |
ANGLE_MAX = 3000 у логові 4.5.5 і ATC_ANGLE_MAX = 30 у логові 4.7 — це однакові 30°. Під час оновлення прошивка сама перетворює значення; помилка виникає, коли вручну копіюють числа зі старого логу чи допису на форумі. Якщо перенести значення Tarot ATC_ACCEL_R_MAX = 48000 у ATC_ACC_R_MAX замість 480, ви задасте прискорення у сто разів вище.
Автоматична перевірка
Безкоштовно завантажте свій .bin у bbdoctor. Сервіс виконає наведені вище перевірки (логування, VIBE, кліпінг, навантаження на мотори, акумулятор, а також спектр і PID для швидких логів), повідомить, чого бракує, і запропонує параметри у форматі НАЗВА = значення. Пакетний семплер, дані FFT, компенсацію напруги й Dmod потрібно перевірити самостійно. Пороги налаштовані для FPV-квадрокоптерів, тож для великих апаратів порівнюйте з попередніми логами того самого планера. Перегляньте приклад звіту; для PX4 — посібник із ULog.
Часті запитання
Які рівні VIBE прийнятні в ArduPilot?
За документацією ArduPilot, нижче 30 м/с² — нормально, 30–60 можуть погіршити утримання позиції та висоти, а понад 60 майже завжди це роблять. Перевірте й Clip: лічильник кліпінгу в ідеалі взагалі не має зростати, а стабільне зростання протягом польоту — серйозна проблема, навіть коли VIBE виглядає нормально.
Як записати сирі дані гіроскопа в ArduPilot?
У версії 4.5 і новіших задайте INS_RAW_LOG_OPT = 9 (основний гіроскоп до та після фільтра) і ввімкніть біт 19, IMU_RAW, у LOG_BITMASK; у версіях 4.3–4.4 достатньо лише біта 19. Для аналізу PID додайте біт 0, ATTITUDE_FAST. Для стандартної маски 176126 у версії 4.5 це дає 700415, а для стандартної маски 180222 у версії 4.6+ — 704511. Логи значно збільшуються, тож використовуйте це для тестових польотів.
Чи можна аналізувати .tlog замість .bin?
Ні. Телеметрійний .tlog записується з низькою частотою й не містить потрібних полів. Використовуйте бортовий лог DataFlash .bin із SD-картки або завантажений у Mission Planner (DataFlash Logs → Download).
Чому bbdoctor пише, що PID не можна оцінити за моїм логом?
Тому що гіроскоп записувався з частотою нижче 200 Гц. Стандартний лог ArduCopter записує IMU з частотою 25 Гц, а RATE — 10 Гц: цього достатньо для оцінки вібрації та навантаження на мотори, але не для реакції регулятора швидкості обертання. Для тестового польоту ввімкніть біти 0 і 19 у LOG_BITMASK або налаштуйте апарат за допомогою AUTOTUNE.
Оновлено: