bbdoctor
Diagnóstico de drones por el log: Betaflight, INAV, ArduPilot, PX4
RUENESPTUA

Análisis de ULog de PX4: vibraciones, filtros y ajuste del controlador de rates

Flight Review dibuja buenas gráficas, pero deja abiertas las preguntas importantes: qué pico importa, si el problema es mecánico o del controlador, qué filtro tocar y si el registro contiene suficientes datos. Todos los ejemplos de abajo provienen de registros reales de PX4 1.12–1.17 que se usaron para probar bbdoctor, y todas las cifras se midieron.

Cómo obtener un registro útil

El archivo .ulg está en log/ en la tarjeta SD; también puedes usar QGroundControl → Analyze Tools → Log Download. 11 de nuestros 18 registros de PX4 usan el valor predeterminado SDLOG_PROFILE = 1: el giroscopio solo aparece en sensor_combined a 200 Hz, promediado en ventanas de IMU_INTEG_RATE (200 Hz en 17 de 18 registros), y en los registros 1.12 vehicle_rates_setpoint llegaba apenas a 5–50 Hz. Un registro así no muestra vibraciones por encima de 100 Hz ni la respuesta del lazo de rates.

Bit de SDLOG_PROFILEValorQué añade
0 Default+1El conjunto estándar de tópicos
4 High rate+16Setpoint de rates, velocidad angular y comandos de motor a alta frecuencia
8 Raw FIFO high-rate IMU (Gyro)+256Giroscopio sin filtrar en sensor_gyro_fifo a la frecuencia del sensor
9 Raw FIFO high-rate IMU (Accel)+512Lo mismo para el acelerómetro; los registros ocupan aún más

Añade bits al valor actual en vez de reemplazarlo: 1 pasa a 273; 25 (Default + System identification + High rate) pasa a 281. Un registro 1.15.4 de una ARK FMU v6X con SDLOG_PROFILE = 1023 (bits 0–9) contiene sensor_gyro_fifo con 800 paquetes de 10 muestras por segundo (8 kHz), rates filtrados y actuator_motors a 800 Hz: 25 MB en 43 segundos, y el registrador aun así perdió 0,13 s en 4 interrupciones.

sd_bench -r 100
param set SDLOG_PROFILE 273
reboot

SDLOG_PROFILE requiere reiniciar. Los tópicos predeterminados transmiten unos 50 KB/s (documentación de PX4); High rate más Raw FIFO ocupan varias veces más. Los registros fallan por pausas de escritura de cientos de milisegundos, no por una velocidad media baja: ejecuta sd_bench en la consola MAVLink y usa una tarjeta de 32 GB o menos (límite de NuttX). Un registro 1.16.2 perdió 5,4 s con el perfil predeterminado: a esa tasa de datos, casi seguro fue la tarjeta.

RPM de los motores. Para atribuir una vibración a un motor necesitas esc_status con RPM: DShot bidireccional, telemetría DShot (DSHOT_TEL_CFG) o ESC DroneCAN. En 1.16–1.17, DShot bidireccional se activa con DSHOT_BIDIR_EN = 1 y el MOT_POLE_COUNT correcto; la documentación actual reemplaza ambos por un protocolo de salida BDShot y DSHOT_MOT_POL1…12. Nuestro registro 1.17 tiene esc_status a 167 Hz; uno 1.12, a 4 Hz.

Vuelo de prueba: 20–30 segundos en estacionario, cambios suaves de gas y luego 10–20 movimientos breves y secos de stick por eje. El modo estabilizado sirve: PX4 registra el setpoint de rates en todos los modos. No hacen falta flips. Para Betaflight, consulta la guía de configuración de blackbox.

Vibraciones: qué revisar

Ten cuidado con accel_vibration_metric y gyro_vibration_metric: a juzgar por nuestros registros, su escala cambia entre versiones. Un registro 1.12.3 con 68,5 deg/s de ruido de giroscopio sin filtrar tiene una mediana de 0,06 en la métrica del acelerómetro; una aeronave 1.15.4 con una décima parte de ese ruido marca 1,6, y una 1.17 marca 11,7. Compáralas solo dentro de la misma versión y aeronave.

bbdoctor mide el ruido RMS del giroscopio sin filtrar por encima de 80 Hz en roll y pitch: menos de 4 deg/s es limpio, 4–10 es ruidoso y más de 10 es malo. Una resonancia es un pico por encima de 60 Hz que sobresale más de 6 dB del nivel local en al menos el 60 % de las bandas de gas. Su frecuencia es inequívoca si el giroscopio se registra a la frecuencia completa del sensor (sensor_gyro_fifo) o a 2 kHz o más y el pico está por debajo de la mitad de Nyquist; de lo contrario, obtienes posibles candidatos. Para encontrar el motor concreto: vibración del dron: encuentra el motor defectuoso.

Casos reales de registros

PX4 1.15.4: resonancia de 469 Hz y notch estático

El registro 1.15.4 de la ARK FMU v6X mencionado arriba (6S, giroscopio sin filtrar a 8 kHz): bbdoctor encontró un pico de 469 Hz solo en pitch, 6 dB por encima del nivel de fondo con cualquier nivel de gas. Ruido sin filtrar: roll 6,4, pitch 1,6, yaw 2,1 deg/s; tras el filtrado quedan 0,11 deg/s. Por encima de 250 Hz, los sospechosos habituales son los soportes blandos y los tornillos de la stack, no los brazos.

Izquierda: espectro de pitch de PX4 1.15.4 antes y después del filtrado, con una joroba a 469 Hz; derecha: espectro de pitch sin filtrar con dos niveles de gas, donde la joroba de 469 Hz no se desplaza
PX4 1.15.4, 6S, giroscopio sin filtrar de sensor_gyro_fifo a 8 kHz. Izquierda: pitch antes (gris) y después de los filtros (azul); el rate filtrado se registra a 800 Hz, así que la línea azul termina en 400 Hz. Derecha: pitch sin filtrar con aproximadamente 34 % (A) y 37 % de gas (B): las jorobas de los motores entre 280–400 Hz se desplazan; la de alrededor de 469 Hz permanece fija.

Como solución provisional, un notch estático en esa frecuencia:

param set IMU_GYRO_NF0_FRQ 469
param set IMU_GYRO_NF0_BW 100

El ancho de banda suele ser aproximadamente el 30 % de la frecuencia, pero IMU_GYRO_NF0_BW tiene un máximo de 100 Hz (igual que IMU_GYRO_NF_BW en 1.12). Hay dos detalles. Primero, la FFT integrada está activada, pero por defecto solo busca entre IMU_GYRO_FFT_MIN y IMU_GYRO_FFT_MAX (30–150 Hz); todos los picos que registró estaban entre 31–146 Hz. Un notch dinámico basado en FFT nunca detectaría 469 Hz, y para un pico que no se mueve conviene un notch estático en vez de ampliar la ventana. Segundo, con IMU_GYRO_CUTOFF = 40, el pasa bajos de segundo orden ya atenúa 469 Hz unos 43 dB, así que el notch resulta útil cuando subes el cutoff para recuperar parte de los 5,6 ms de retardo. Veredicto de bbdoctor: hay margen, pero primero revisa la mecánica.

PX4 1.17: autooscilación de pitch a 42 Hz

Un quad 4S con FMU v6C, sin giroscopio sin filtrar, pero con esc_status registrado. Durante 63 s de vuelo tranquilo, el error de pitch (giroscopio − setpoint) tiene un pico estrecho a 41,7 Hz, 28 dB por encima del nivel de fondo y de 11,5 deg/s, por debajo de la frecuencia de los motores (61–87 Hz). Roll, con los mismos valores P 0,18, I 0,15 y D 0,003, está limpio. La coherencia entre el giroscopio y el comando de motor a esa frecuencia es 1,0, con fase de +13°: la P lo provoca.

Espectro de giroscopio menos setpoint en PX4 1.17: pico estrecho de 42 Hz en pitch, sin pico en roll a esa frecuencia; la banda de frecuencia de los motores, 61–87 Hz, queda por encima
PX4 1.17.0, 4S, espectro del error (giroscopio − setpoint) durante 63 s de vuelo tranquilo. Pitch (azul) alcanza un pico a 42 Hz; roll (gris), con las mismas ganancias, está 31 dB más abajo a esa frecuencia. Naranja: frecuencia de rotación de los motores (percentiles 5–95, 61–87 Hz).
param set MC_PITCHRATE_P 0.162

Eso es reducir la P un 10 %. Vuelve a volar: si el pico disminuye, era el lazo; si aumenta, restaura la P; si no cambia, restáurala y revisa la mecánica. Ten en cuenta los filtros: a 42 Hz, IMU_GYRO_CUTOFF = 40 por sí solo añade unos 90° de desfase, e IMU_DGYRO_CUTOFF = 20 atenúa el término D varias veces y añade su propio retardo, así que D lo amortigua mal. Un cutoff del giroscopio más alto ayudaría, pero sin giroscopio sin filtrar no puedes comprobar el ruido: corrige la P ahora y deja los filtros para después, con el perfil 281.

PX4 1.12.3: 68,5 deg/s de ruido en un registro de 222 Hz

Una placa FMU v3 antigua, 4S, perfil 1. Ruido del giroscopio sin filtrar por encima de 80 Hz: roll 68,5, pitch 27,8, yaw 14,5 deg/s, en un registro que solo alcanza a ver 80–111 Hz. También hay un pico que permanece fijo con cualquier nivel de gas, pero al registrar a 222 Hz su frecuencia real podría ser 94, 129 o 316 Hz. Así que no pongas un notch a ciegas: revisa primero las hélices, los motores y los tornillos; luego haz un registro breve con Raw FIFO para obtener la frecuencia exacta.

PX4 1.12.3: motor 2 y el segundo armónico

Una aeronave 6S, con más de 15 minutos de vuelo y motores a 2500–3170 rpm (42–53 Hz) según esc_status. El análisis de órdenes (giroscopio demodulado con la fase de rotación de cada motor) encontró un componente 2× de 5,3 deg/s en M2 y casi nada en los demás: normalmente indica una pala dañada o un paso de pala desigual. Pero las RPM solo se registraban a 4 Hz y el componente 2× (unos 83 Hz) está cerca del límite de 100 Hz, así que es una pista, no una conclusión. En un Quad X estándar, el motor 2 está atrás a la izquierda; esta aeronave tiene un SYS_AUTOSTART no estándar, así que revisa el mixer antes de quitar una hélice.

Filtros de PX4

ParámetroVersionesQué haceCuándo tocarlo
IMU_GYRO_CUTOFFtodasPasa bajos del giroscopio (40 Hz por defecto, como en 10 de nuestros 18 registros)Súbelo para reducir el retardo si el giroscopio filtrado está limpio y los motores se mantienen fríos
IMU_DGYRO_CUTOFFtodasPasa bajos para D, que actúa sobre la derivada de la velocidad angular. 20 Hz por defecto (30 en 1.12)Bájalo: reduce el ruido de los motores, pero debilita la amortiguación de las oscilaciones rápidas
IMU_GYRO_NF0_FRQ, IMU_GYRO_NF0_BW, IMU_GYRO_NF1_*1.13+Notch estáticosSolo para una frecuencia de resonancia inequívoca
IMU_GYRO_NF_FREQ, IMU_GYRO_NF_BW1.12Notch estáticoLo mismo
IMU_GYRO_DNF_EN (bit 0 ESC RPM, bit 1 FFT), IMU_GYRO_DNF_HMC, IMU_GYRO_DNF_BW1.13+ (IMU_GYRO_DYN_NF en 1.12)Notch dinámico basado en RPM o la FFT integradaSi tienes telemetría de RPM, usa el bit 0
IMU_GYRO_FFT_EN, IMU_GYRO_FFT_MIN, IMU_GYRO_FFT_MAX1.12+FFT integrada; busca de 30–150 Hz por defecto (32–192 en 1.12)Por sí sola no filtra nada

PX4 filtra cada muestra FIFO a la frecuencia completa del sensor y solo después la reduce a IMU_GYRO_RATEMAX (400 Hz por defecto; 800 en 16 de nuestros 18 registros). Por eso funciona un notch a 469 Hz con un controlador a 800 Hz.

Retardo. bbdoctor calcula el retardo del pasa bajos del giroscopio a partir del ajuste: √2/(2π·fc) para un filtro de segundo orden. El desfase temporal entre tópicos registrados no lo sustituye: en PX4 puede ser cero con un cutoff de 30–60 Hz.

IMU_GYRO_CUTOFF, Hz2530406080
Retardo, ms9.07.55.63.752.8

Subir el cutoff. Avanza en pasos de 10 Hz (40 → 50 → 60). Después de cada cambio, vuela 20–30 segundos, aterriza y toca los motores y los ESC: la documentación de PX4 advierte que pueden sobrecalentarse hasta dañarse. Detente cuando el ruido de Actuator Controls FFT aumente visiblemente y retrocede un paso. Si el ruido sin filtrar supera 4 deg/s, deja los filtros como están y corrige la mecánica. Por qué el ruido calienta los motores: ruido y ajuste de filtros.

param set IMU_GYRO_CUTOFF 50

Controlador de rates: P, I, D, FF y K

El controlador de rates de PX4 calcula K·(P·error + I·integral − D·aceleración angular) + FF·setpoint. D actúa sobre la aceleración medida, no sobre el error, así que los movimientos secos de stick no provocan un golpe. Parámetros: MC_ROLLRATE_P/I/D/FF/K y los equivalentes para PITCHRATE y YAWRATE, con límites del integrador MC_RR_INT_LIM, MC_PR_INT_LIM, MC_YR_INT_LIM.

El multiplicador K. K = 1 corresponde a la forma paralela; P = 1, a la forma estándar, donde K es la ganancia global. Un registro 1.13.1 de una CubeOrange tiene P 1, I 2, D 0,029 y K 0,08 en roll y pitch: las ganancias efectivas son 0,08, 0,16 y 0,0023, así que no tiene sentido comparar su «P = 1» con el 0,15 de otra persona. FF no se escala con K.

param show MC_ROLLRATE*
param show MC_PITCHRATE*

Orden del ajuste manual según la documentación de PX4: ajusta P y D en roll y pitch de forma iterativa y luego I. En yaw, normalmente D se deja en 0. La documentación también recomienda desactivar MC_AIRMODE durante el ajuste.

Autotune. Está integrado desde 1.13: establece MC_AT_EN = 1 y luego, en QGroundControl (Vehicle Setup → PID Tuning), activa Autotune y pulsa el botón mientras vuelas en modo Altitude, Hold o Position. Cualquier movimiento de stick lo cancela, así que mantén una altura segura. MC_AT_APPLY = 1 (valor predeterminado) aplica las ganancias después de desarmar. Si aparece una oscilación rápida (más de una vez por segundo), la documentación recomienda bajar MC_ROLLRATE_K y MC_PITCHRATE_K en pasos de 0,02.

PX4 no tiene TPA como Betaflight. Ninguno de nuestros registros 1.12–1.17 tiene MC_TPA_*. El modelo de empuje THR_MDL_FAC compensa la ganancia según el gas (0 = empuje lineal respecto a la señal; 1 = cuadrático); la mayoría de nuestras aeronaves usan 0, tres usan 0,3 y una usa 0,1. La documentación indica que 0,3–0,5 es habitual: empieza en 0,3 y avanza en pasos de 0,1. Una oscilación con poco gas significa que el valor es demasiado alto; con mucho gas, demasiado bajo. Después, vuelve a revisar el ajuste de rates.

param set MC_AT_EN 1
param set THR_MDL_FAC 0.3

bbdoctor lee la respuesta de vehicle_rates_setpoint incluso en modo Stabilized, siempre que el giroscopio y el setpoint se registren a 200 Hz o más y haya al menos 10 tramos de movimiento seco de stick utilizables (y una cuarta parte del total); si la curva es inestable, hacen falta 30. En un registro 1.16.2, roll alcanzó solo el 84 % del setpoint y bbdoctor sugirió subir P e I un 10 %: MC_ROLLRATE_P 0.102 → 0.112, MC_ROLLRATE_I 0.1301 → 0.143. Cómo leer una respuesta escalón: ajuste de PID a partir de blackbox.

Autooscilación o resonancia del frame

Un pico estrecho puede requerir dos correcciones opuestas, y confundirlas sale caro: bajar los filtros para corregir una autooscilación del lazo añade más retardo y la empeora.

SeñalAutooscilación del lazoResonancia mecánica
FrecuenciaNormalmente 10–80 Hz, por debajo de la frecuencia de los motoresCualquiera, a menudo por encima de 100 Hz, independiente del gas
EjesUn eje, o roll+pitch sin yawA menudo todos los ejes, incluido yaw
MotoresOscilan al ritmo del giroscopio (alta coherencia)Poca relación con los comandos de motor
P −10 %El pico disminuyeNo cambia
CorrecciónBaja la P (o la D si ella lo provoca)Tornillos, stack y brazos; notch como solución provisional

bbdoctor busca estos picos en tramos tranquilos (setpoint por debajo de 60 deg/s, gas estable) entre 10 Hz y 80 Hz o hasta 0,8 veces la frecuencia del motor. El pico debe ser estrecho, superar en 10 dB el nivel local y alcanzar al menos 1 deg/s; se descarta si coincide con armónicos del motor, aparece en todos los ejes incluido yaw o cae sobre una resonancia conocida del frame. El espectro cruzado de giroscopio a torque indica si los motores oscilan al mismo ritmo (coherencia 0,5 o más), y la fase permite saber si la P, la D o el retardo del filtro lo provoca.

Failsafe y batería

bbdoctor detecta un failsafe a partir de vehicle_status; la causa aparece en los mensajes del registro (Flight Review → Messages). Un registro 1.13.1 de una CubeOrange decía «Failsafe enabled: no offboard», «Position-Ctrl activation failed» y luego «Failsafe: blind descend». Se perdió el enlace Offboard, la reacción era COM_OBL_RC_ACT = 0 (Position) y Position no pudo activarse. «Blind descend» significa que el controlador de posición no tenía una estimación de velocidad vertical, así que la aeronave descendió con un empuje apenas inferior al necesario para estacionario. Corrige el enlace con el companion y la estimación de altura de EKF2, y elige una reacción compatible con tus sensores (Altitude o Land sin posición); el enlace RC no es el problema. El timeout es COM_OF_LOSS_T; 1.13 también tiene COM_OBL_ACT para el caso sin RC, mientras que 1.14+ solo tiene COM_OBL_RC_ACT.

En el registro 1.17, «Battery 1: over voltage. Land now!» apareció en pleno vuelo con un promedio de 3,6–3,7 V por celda. El código actual de PX4 lo activa cuando una muestra de voltaje sin filtrar supera BAT1_N_CELLS × BAT1_V_CHARGED × 1,05; en este caso, 4 × 4,05 × 1,05 = 17,0 V. Las muestras registradas a 5 Hz alcanzan un máximo de 16,27 V, pero las contiguas saltan 2–3,5 V (16,13 → 12,6 → 14,96 V). Una variación de corriente de 6–19 A explica como máximo 1,2 V, incluso con los 22 mΩ por celda que estimó bbdoctor; por tanto, la lectura de voltaje tiene ruido y un pico no registrado activó la comprobación. Revisa el cableado y la masa del módulo de alimentación, y la calibración de BAT1_V_DIV; ajustar BAT1_V_CHARGED a 4,05 en vez del valor predeterminado actual de 4,2 solo baja el umbral.

ParámetroValores
NAV_RCL_ACTPérdida de RC: 1 Hold, 2 Return, 3 Land
COM_RC_LOSS_TSegundos antes de considerar perdido el RC: 0,5 en 11 de nuestros registros, aunque también hemos visto 10 y 35 s
BAT_LOW_THR, BAT_CRIT_THR, BAT_EMERGEN_THRUmbrales de carga restante: 0,15, 0,07 y 0,05 por defecto
COM_LOW_BAT_ACT0 solo avisa; 2 Land; 3 Return en nivel crítico y Land en emergencia

12 de nuestros 18 registros tienen COM_LOW_BAT_ACT = 0, que solo avisa. Para una aeronave grande con GPS:

param set COM_LOW_BAT_ACT 3
param set NAV_RCL_ACT 2

Return requiere una estimación de posición válida. Sin GPS, elige aterrizar: COM_LOW_BAT_ACT 2 y NAV_RCL_ACT 3.

Una batería gastada se nota por su resistencia interna. bbdoctor la estima a partir de la pendiente de voltaje respecto a la corriente durante cambios bruscos de corriente: menos de 12 mΩ por celda está bien, 12–25 es una advertencia y más es malo. Este registro 1.17 dio unos 22 mΩ, frente a 2–10 en las otras aeronaves; pero, con el voltaje tan ruidoso, la cifra es poco fiable: corrige la medición y comprueba la batería con un cargador. El vuelo empezó con la batería parcialmente usada (3,94 V por celda), y el mínimo sostenido (mediana de 0,5 s) fue 3,41 V por celda con un pico de solo 18 A.

Errores frecuentes en registros de PX4

Comprobación automática

bbdoctor analiza gratis en línea registros .ulg de PX4: ruido antes y después de los filtros, resonancias, autooscilación del lazo, respuesta de rates, carga y RPM de los motores, batería, failsafes e interrupciones del registro. Si el registro es demasiado lento, indica qué SDLOG_PROFILE usar. Sus umbrales se ajustaron con quads FPV de Betaflight, así que compara las aeronaves grandes con sus propios registros anteriores. Consulta el informe de ejemplo o las guías de registros de ArduPilot y blackbox de INAV.

Preguntas frecuentes

¿Cómo registro datos de vibración en PX4?

Añade los bits 4 High rate (+16) y 8 Raw FIFO high-rate IMU Gyro (+256) al valor actual de SDLOG_PROFILE: 1 pasa a ser 273; reinicia para aplicar el cambio. El giroscopio sin filtrar se registra entonces en sensor_gyro_fifo a la frecuencia del sensor. Los registros ocupan varias veces más, así que úsalo en vuelos de prueba y comprueba la tarjeta SD con sd_bench.

¿Qué filtros de PX4 debo ajustar?

IMU_GYRO_CUTOFF (pasa bajos del giroscopio), IMU_DGYRO_CUTOFF (pasa bajos del término D), los notch estáticos IMU_GYRO_NF0_FRQ/BW (IMU_GYRO_NF_FREQ/BW en 1.12) y el notch dinámico IMU_GYRO_DNF_EN (IMU_GYRO_DYN_NF en 1.12). Primero corrige la mecánica: los filtros se ocupan de lo que queda después de revisar hélices, motores y soportes. Después de cada aumento del cutoff, vuela 20–30 segundos y toca los motores.

¿En qué se diferencia bbdoctor de Flight Review?

Flight Review dibuja gráficas y deja que tú saques las conclusiones. bbdoctor mide el ruido antes y después de los filtros, busca resonancias y autooscilación del lazo, compara los motores y la batería, y genera comandos param set. Se complementan bien: gráficas en Flight Review, diagnóstico y comandos en bbdoctor.

¿Por qué mi registro de 200 Hz no muestra la vibración de los motores?

Un registro de 200 Hz solo muestra frecuencias de hasta 100 Hz, y la vibración de hélices y motores suele ser más alta. Por defecto, PX4 registra sensor_combined, donde el giroscopio se promedia en ventanas IMU_INTEG_RATE (200 Hz). Todo lo más rápido se suaviza o se pliega en una frecuencia falsa. Necesitas el perfil Raw FIFO.

Actualizado:

Más guías