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

Аналіз логів ArduPilot: вібрація, кліпінг, фільтри та PID

Ваш ArduCopter не утримує висоту, дрейфує в Loiter, видає попередження EKF або дзижчить після autotune. Зазвичай причина — вібрація: оцінка положення погіршується, і автопілот бореться з тим, чого насправді немає. Порядок завжди однаковий: правильний лог → вібрація та кліпінг → спектр і notch-фільтр → фільтри низьких частот → PID. Нижче наведено пороги, які застосовує bbdoctor, і цифри з реальних логів ArduCopter.

Як отримати потрібний лог і ввімкнути швидкий запис

Потрібен бортовий лог DataFlash .bin (Mission Planner → DataFlash Logs → Download або папка APM/LOGS на SD-картці); у телеметрійному .tlog недостатньо даних. Які дані записуються, визначає LOG_BITMASK. Тут важливі п'ять бітів:

БітНазваЗначенняДля чогоУ стандартній масці
0ATTITUDE_FAST1ATT і RATE з частотою циклу (400 Гц), потрібні для аналізу PIDні
7IMU128гіроскоп, акселерометр, VIBE; обов'язковотак
10RCOUT1024виходи моторів; обов'язковотак
12PID4096складові P, I, D, FF у PIDR/PIDP/PIDYпочинаючи з 4.6
19IMU_RAW524288сирі дані гіроскопа (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 оцінює їх так:

Чому потрібні обидва показники: реальний лог ArduCopter 4.7.0, fmuv2, 4S, сім польотів, 414 с у повітрі.

VIBE по осях X, Y і Z у семи польотах ArduCopter 4.7 переважно нижче лінії 30 м/с², тоді як лічильник Clip зростає під час кожного польоту й сягає 424
ArduCopter 4.7.0, 4S, сім польотів в одному логові (сіре: на землі; VIBE згладжено за 0,5 с). Чорна лінія: приріст Clip у польоті — 424 випадки, 176 із них під час останнього польоту.

VIBE проходить перевірку: 29 за порога 30. Але кліпінг стався 424 рази (критичний рівень у bbdoctor), і дані по кожному польоту підтверджують, що це не випадковість:

ПолітЧас у повітріVIBE p95 X / Y / ZПриріст Clip
169 с16 / 19 / 2422
269 с16 / 20 / 2534
379 с20 / 23 / 2647
473 с20 / 22 / 30106
531 с22 / 22 / 2835
615 с16 / 20 / 244
779 с22 / 20 / 32176

Октокоптер (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.

Ліворуч: низькі рівні VIBE Tarot X4, приблизно 3–7 м/с²; праворуч: спектр гіроскопа до і після фільтрації з піками на 34, 67, 134 і 202 Гц, вікно пошуку FFT 25–62 Гц і notch-фільтром на 35 та 70 Гц
Tarot X4, ArduCopter 4.5.5, 6S. A: VIBE 3/3/7 м/с², Clip = 0. B: спектр гіроскопа приблизно з 50 пакетів семплера (2025 Гц), сіре — до фільтрів, синє — після. Помаранчеве: вікно пошуку FFT; пунктир: FTN1.PkAvg, показання FFT; крапки: фактичне положення notch-фільтра.

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) залежать від розміру пропелерів: що менші пропелери, то вища частота зрізу.

Пастка під час аналізу: лог із частотою 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-фільтра:

  1. VIBE нижче 30, Clip не зростає, notch-фільтр налаштований.
  2. Призначте AUTOTUNE на перемикач; осі задаються в AUTOTUNE_AXES (1 — roll, 2 — pitch, 4 — yaw; 7 — усі три), агресивність — у AUTOTUNE_AGGR (0.075 в обох логах вище).
  3. Використовуйте AltHold, Loiter або PosHold у тиху погоду; на кожну вісь потрібно кілька хвилин, тож залиште достатній запас акумулятора.
  4. Щоб зберегти результат, сядьте й зніміть апарат з охорони, не вимикаючи перемикач.

Інші поради ArduPilot, які bbdoctor надає, коли лог записаний із достатньою частотою:

Є дві речі, які 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 Гц — видно середнє навантаження, але не шум моторів». Ось що все ж можна побачити:

Зважайте на порядок моторів: у 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

bbdoctor показує напругу на старті, мінімум під навантаженням і внутрішній опір. Лог 4.7: на старті 4,11 В на банку, мінімум під навантаженням — 3,76 В (трималося 0,5 с), наприкінці — 3,91 В, піковий струм 13 А, близько 1010 мА·год, приблизно 10 мОм на банку (оцінка, бо напруга та струм записуються окремо).

Назви параметрів змінюються між версіями

ЩоСтара назваНова назва
Максимальне прискорення по roll/pitch/yawATC_ACCEL_R_MAX тощо, у срад/с²ATC_ACC_R_MAX тощо, у град/с² (4.7)
Максимальний кут нахилуANGLE_MAX, у сотих частках градусаATC_ANGLE_MAX, у градусах (4.7)
Швидкість обертання в ACROACRO_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.

Оновлено:

Інші гайди