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

Análisis de logs de ArduPilot: vibración, clipping, filtros y PID

Tu ArduCopter no mantiene la altitud, deriva en Loiter, muestra avisos de EKF o vibra después de un autotune. La causa suele ser la vibración: la estimación de posición se degrada y el piloto automático compensa algo que no existe. El orden no cambia: el log correcto → vibración y clipping → espectro y notch → filtros pasa bajos → PID. Aquí tienes los umbrales que aplica bbdoctor, con datos de logs reales de ArduCopter.

Cómo obtener el log correcto y activar el registro rápido

Necesitas el log DataFlash .bin de la controladora (Mission Planner → DataFlash Logs → Download, o APM/LOGS en la SD); un .tlog de telemetría no contiene suficientes datos. Lo que se registra depende de LOG_BITMASK. Aquí importan cinco bits:

BitNombreValorPara qué sirveEn la máscara predeterminada
0ATTITUDE_FAST1ATT y RATE a la frecuencia del bucle (400 Hz), objetivo para analizar los PIDno
7IMU128giroscopio, acelerómetro, VIBE; imprescindiblesí
10RCOUT1024salidas de los motores; imprescindiblesí
12PID4096términos P, I, D y FF en PIDR/PIDP/PIDYdesde 4.6
19IMU_RAW524288giroscopio sin filtrar (GYR) a la frecuencia del sensorno

La máscara predeterminada es 176126 hasta 4.5; en 4.6 se añadió el bit PID y pasó a 180222. En los diez logs de ArduCopter de nuestro conjunto de pruebas (de 4.1 a 4.8-dev, desde fmuv2 hasta Pixhawk 6X, además de dos ejecuciones SITL), IMU se registró a 25 Hz y RATE, RCOU y VIBE a 10 Hz: suficiente para VIBE y las cargas medias de los motores, pero no para el espectro, revisar filtros o analizar la respuesta de los PID.

En Mission Planner, marca ATTITUDE_FAST e IMU_RAW en LOG_BITMASK. Si el log no contiene el giroscopio sin filtrar, bbdoctor añade los bits que faltan a tu máscara actual. Para 176126:

LOG_BITMASK = 700415
INS_RAW_LOG_OPT = 9

Desde 180222, como en todos nuestros logs de 4.7, queda en 704511. INS_RAW_LOG_OPT = 9 (giroscopio principal antes y después del filtrado) llegó en 4.5; en los logs de 4.3.7 bbdoctor sugiere solo LOG_BITMASK = 700415, porque allí el bit 19 por sí solo activa el registro sin filtrar.

Los logs pueden crecer decenas de veces y las controladoras o tarjetas lentas pueden perder datos (bbdoctor muestra «Gaps in the recording»); ArduPilot documenta el registro IMU sin filtrar para controladoras H7, así que en una F4 como la fmuv2 de abajo espera encontrar huecos. Después, restaura tus valores anteriores de LOG_BITMASK e INS_RAW_LOG_OPT = 0.

Haz un vuelo de prueba de 3–5 minutos: estacionario, una pasada suave de gas bastante por encima del estacionario y de vuelta, y unas cuantas órdenes breves y rápidas con los sticks en cada eje, a una altura segura. Sin flips.

bbdoctor rechaza los logs que no sean de copter y los que no tengan IMU o RCOU (en un log real de un quad grande estaba activado el bit 7, pero no había mensajes IMU: sube el .bin completo, no una exportación recortada). Los logs SITL (parámetros SIM_*) omiten las comprobaciones de hardware. Para configurar el registro en cualquier firmware, consulta la guía de configuración del registro.

VIBE y clipping: dos señales distintas

VIBE.VibeX, VibeY y VibeZ son la desviación estándar del acelerómetro en m/s², es decir, la vibración media. VIBE.Clip (Clip0–Clip2 en versiones anteriores) cuenta las muestras que alcanzan el límite de rango del sensor; se acumula desde el arranque y no se reinicia entre vuelos. bbdoctor los evalúa así:

Por qué necesitas ambas señales: un log real de ArduCopter 4.7.0, fmuv2, 4S, siete vuelos, 414 s en el aire.

VIBE X, Y y Z durante siete vuelos de ArduCopter 4.7 se mantienen casi siempre por debajo de 30 m/s², mientras el contador Clip aumenta en cada vuelo hasta 424
ArduCopter 4.7.0, 4S, siete vuelos en un log (gris: en tierra; VIBE suavizado durante 0.5 s). Línea negra: aumento de Clip en vuelo, 424 eventos, 176 de ellos en el último vuelo.

VIBE está dentro del límite, 29 frente a 30, pero hubo clipping 424 veces (crítico para bbdoctor); y al mirar cada vuelo se confirma que no es casualidad:

VueloTiempo en el aireVIBE p95 X / Y / ZAumento de Clip
169 s16 / 19 / 2422
269 s16 / 20 / 2534
379 s20 / 23 / 2647
473 s20 / 22 / 30106
531 s22 / 22 / 2835
615 s16 / 20 / 244
779 s22 / 20 / 32176

Un octocopter (CubeOrangePlus, 4.5.7) tuvo clipping 64 veces en el log, pero solo 19 en vuelo, así que bbdoctor avisó por 19. Un Tarot X4 en buen estado con 4.5.5 (figura de abajo): X 3, Y 3, Z 7 m/s², Clip = 0.

Qué observasCausa probableQué hacer
Todos los ejes altos y suben con el gashélices o campanas desequilibradasequilibra o cambia las hélices; revisa ejes y rodamientos
Z claramente por encima de X e Ybrazos flexibles, soportes de motor o aislamiento de la controladora demasiado rígido o blandoaprieta motores y brazos; revisa los soportes blandos de la controladora
Un eje duplica al otroalgo suelto en esa dirección: mástil GPS, tren de aterrizaje, gimbalasegúralo y comprueba a mano si tiene holgura
VIBE está bien, pero Clip aumenta en cada vuelogolpes: batería, cables o una hélice que toca algousa correas y una almohadilla antideslizante bajo la batería; aparta los cables de la controladora

Hasta corregir VIBE y el clipping, deja los filtros y los PID como están. Para encontrar el motor defectuoso, consulta la guía de vibración de motores. El mensaje «Vibration compensation ON» significa que el failsafe de vibración (FS_VIBE_ENABLE, activado de forma predeterminada) ya cambió el mantenimiento de altitud a una estimación tolerante a las vibraciones.

Espectro del giroscopio y notch armónico

Con el giroscopio sin filtrar registrado (GYR), bbdoctor genera el espectro antes y después del filtrado y busca picos que no cambian con el gas: resonancias del frame. Recomienda ajustar el frame y, como solución provisional, sugiere el segundo notch, INS_HNTC2_*, en modo fijo, solo cuando la frecuencia es inequívoca; si el pico podría ser un alias, muestra las frecuencias posibles y pide un log breve del giroscopio sin filtrar. Para una resonancia de 140 Hz:

INS_HNTC2_ENABLE = 1
INS_HNTC2_MODE = 0
INS_HNTC2_FREQ = 140
INS_HNTC2_BW = 70
INS_HNTC2_ATT = 40

La otra fuente son las capturas por lotes (INS_LOG_BAT_MASK, INS_LOG_BAT_OPT, con el bit IMU_RAW desactivado): ráfagas de 1024 muestras (ISBH/ISBD) que apenas aumentan el tamaño del log. bbdoctor aún no las lee; usa la herramienta web Filter Review de ArduPilot o el FFT de Mission Planner. Aquí tienes el Tarot X4.

Izquierda: trazas VIBE bajas y planas para un Tarot X4, alrededor de 3–7 m/s²; derecha: espectro del giroscopio antes y después del filtrado, con picos en 34, 67, 134 y 202 Hz, ventana de búsqueda FFT de 25–62 Hz y notch situado en 35 y 70 Hz
Tarot X4, ArduCopter 4.5.5, 6S. A: VIBE 3/3/7 m/s², Clip = 0. B: espectro del giroscopio de unas 50 ráfagas de captura por lotes (2025 Hz), gris antes de los filtros y azul después. Naranja: ventana de búsqueda FFT; línea discontinua: FTN1.PkAvg, lo que indicó el FFT; puntos: posición real del notch.

El notch funciona en modo FFT (INS_HNTCH_MODE = 4). La línea más intensa está en 67 Hz, seguida de 134 y 202. 34 Hz parece corresponder a la rotación (unas 2000 rpm) y 67 Hz a su segundo armónico, el paso de las palas de una hélice de dos palas. Pero la ventana FFT termina en 62 Hz y el FFT indicó 25 Hz durante todo el vuelo, justo FFT_MINHZ (la estimación FFT_FREQ_HOVER también es 25.0). Nunca encontró la frecuencia del motor.

En modo FFT, el notch nunca baja de INS_HNTCH_FREQ, aquí 35 Hz, así que se quedó ahí, junto con un segundo notch a 70 Hz debido a INS_HNTCH_HMNCS = 3. Por casualidad, eso cubre las líneas de 34 y 67 Hz: frente al filtro pasa bajos de 20 Hz por sí solo, el espectro filtrado queda unos 10 dB más bajo a 34 Hz y 17 dB a 67 Hz, sin reducción adicional a 134 y 202. El notch funciona, pero como notch fijo.

Y ese es el punto: no hace falta corregir ahora todo lo que podrías corregir. Después de los filtros, las líneas de 67, 134 y 202 Hz bajan 35–43 dB; VIBE está en 3/3/7 y no hay clipping. Pero una batería más pesada u otras hélices moverán las líneas y el FFT no las seguirá. Antes del próximo AUTOTUNE, cambiaría a un notch basado en el gas:

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 es el gas en estacionario (MOT_THST_HOVER = 0.20), FREQ la frecuencia en estacionario, BW la mitad, HMNCS = 7 los armónicos 1–3: 67, 134 y 201 Hz. Con el valor predeterminado INS_HNTCH_FM_RAT = 1, el notch nunca baja de FREQ. El notch de 34 Hz se elimina a propósito: esa línea apenas sobresale del ruido de fondo del giroscopio, y un notch tan bajo, cerca de la zona de trabajo del controlador de un copter grande, resta margen de fase. Para conservarlo: FREQ 34, BW 17, HMNCS 43 (armónicos 1, 2, 4 y 6: 34, 67, 134 y 202 Hz). También puedes quedarte en modo FFT y ampliar FFT_MINHZ/FFT_MAXHZ para incluir 67 Hz.

Para elegir INS_HNTCH_MODE (0 fijo, 1 gas, 2 sensor RPM, 3 telemetría ESC, 4 FFT): con telemetría RPM, elige 3. Sin telemetría, pero con F7/H7: FFT, cuando el log muestre que FTN1.PkAvg cambia con el gas en lugar de quedarse en FFT_MINHZ. Con una controladora de vuelo poco potente: gas. En los modos ESC, RPM y FFT, FREQ es el límite inferior y REF es 1; REF = 0 fija el notch en FREQ.

Filtros pasa bajos: INS_GYRO_FILTER y ATC_RAT_*_FLTD

INS_GYRO_FILTER es el filtro pasa bajos del giroscopio, 20 Hz de forma predeterminada (en el log 4.7 y el Tarot; el log 4.3.7 tiene 40). ATC_RAT_RLL_FLTD/_PIT_FLTD filtran el término D (20 en el log 4.7, 10 en el Tarot); FLTT filtra la consigna y FLTE el error (2–2.5 Hz en yaw). Initial Tune Parameters de Mission Planner establece valores iniciales según el tamaño de las hélices: hélices más pequeñas, frecuencias de corte más altas.

Una trampa del análisis: un log de 25 Hz solo muestra el movimiento hasta 12.5 Hz; lo más rápido aparece plegado como una frecuencia baja falsa. Por eso bbdoctor no comprueba filtros ni PID en esos logs y lo indica. Más información en la guía de filtros.

PID: qué muestra el log y cuándo usar AUTOTUNE

El controlador de velocidad angular usa ATC_RAT_RLL_P, _I, _D, _FF, y lo mismo para PIT y YAW. bbdoctor compara la consigna RATE.RDes (y PDes, YDes) con el giroscopio: sobreimpulso, retraso u oscilación después de una orden brusca. RDes se calcula después del suavizado de la entrada: ATC_INPUT_TC la suaviza, pero no cambia qué tan bien la sigue el giroscopio, así que esto mide el propio lazo de velocidad angular. Necesita un registro a 200 Hz; de lo contrario, bbdoctor muestra «PIDs can't be assessed from this log: gyro logged at 25 Hz» y da los comandos de la primera sección.

En ArduCopter, AUTOTUNE, que viene integrado, suele ser más fiable, pero solo después de resolver las vibraciones y configurar el notch:

  1. VIBE por debajo de 30, Clip sin aumentar y notch configurado.
  2. Asigna AUTOTUNE a un interruptor; define los ejes en AUTOTUNE_AXES (1 roll, 2 pitch, 4 yaw; 7 los tres) y la agresividad en AUTOTUNE_AGGR (0.075 en los dos logs anteriores).
  3. Usa AltHold, Loiter o PosHold con aire tranquilo; dedica varios minutos a cada eje y deja margen de batería.
  4. Para guardar el resultado, aterriza y desarma con el interruptor todavía activado.

Otras recomendaciones de ArduPilot que bbdoctor da cuando el log tiene suficiente frecuencia:

Hay dos cosas que bbdoctor no comprueba. Compensación de voltaje: en el log 4.7, MOT_BAT_VOLT_MAX = 0 y MOTB.BatVolt se mantiene en 1.00, así que está desactivada y el lazo pierde fuerza a medida que se descarga la batería. Para 4S:

MOT_BAT_VOLT_MAX = 16.8
MOT_BAT_VOLT_MIN = 13.2

Son 4.2 y 3.3 V por celda; configúralo antes de AUTOTUNE, porque cambia la ganancia efectiva. Y PIDR.Dmod: si baja de 1 con frecuencia, el limitador de velocidad de cambio ATC_RAT_*_SMAX está amortiguando una oscilación y las ganancias están al límite. En el log 4.7 se mantiene en 1.00 (se muestrea a 10 Hz, así que podrían pasar inadvertidas caídas muy breves).

Salidas de motor a 10 Hz: cargas sí, ruido no

Los logs predeterminados registran RCOU a 10 Hz; bbdoctor indica: «Motor outputs are logged at 10 Hz — average loads are visible, but not motor noise». Aun así, puedes ver lo siguiente:

Ten en cuenta el orden: en un ArduCopter Quad X, M1 es delantero derecho, M2 trasero izquierdo, M3 delantero izquierdo y M4 trasero derecho, a diferencia de Betaflight.

Para detectar un motor que vibra necesitas RPM: DShot bidireccional (SERVO_BLH_BDMASK, DShot en MOT_PWM_TYPE y SERVO_BLH_POLES correcto) o telemetría ESC por cable. El Tarot tiene 28 polos configurados, pero usa PWM normal, así que no hay RPM. Con RPM, bbdoctor compara los motores y el notch puede usar el modo 3.

Failsafe y batería

Después de un crash, comprueba primero si configuraste el failsafe; bbdoctor señala estos parámetros cuando sospecha un problema de enlace o batería. El log 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 informa del voltaje inicial, el mínimo bajo carga y la resistencia interna. El log 4.7: 4.11 V por celda al inicio, mínimo de 3.76 V bajo carga (sostenido durante 0.5 s), 3.91 V al final, pico de 13 A, unos 1010 mAh y aproximadamente 10 mΩ por celda (es una estimación, ya que el voltaje y la corriente se muestrean por separado).

Los nombres de parámetros cambian entre versiones

QuéNombre anteriorNombre nuevo
Aceleración máxima de roll/pitch/yawATC_ACCEL_R_MAX, etc., en cdeg/s²ATC_ACC_R_MAX, etc., en deg/s² (4.7)
Ángulo máximo de inclinaciónANGLE_MAX, en centigradosATC_ANGLE_MAX, en grados (4.7)
Velocidad de giro ACROACRO_RP_P, una ganancia: ×45 = deg/s (hasta 4.1)ACRO_RP_RATE, en deg/s (4.2+)

ANGLE_MAX = 3000 en el log 4.5.5 y ATC_ANGLE_MAX = 30 en el log 4.7 representan el mismo valor: 30°. El firmware convierte los valores al actualizar; el riesgo está en copiar a mano los números de un log antiguo o una publicación de un foro. Si copias el ATC_ACCEL_R_MAX = 48000 del Tarot en ATC_ACC_R_MAX en lugar de 480, estarás pidiendo cien veces más aceleración.

Comprobación automática

Sube tu .bin a bbdoctor, gratis. Ejecuta las comprobaciones anteriores (registro, VIBE, clipping, cargas de motor, batería y también espectro y PID en logs rápidos), indica qué falta y muestra parámetros como NAME = value. Las capturas por lotes, los datos FFT, la compensación de voltaje y Dmod quedan a tu cargo. Los umbrales se ajustaron con quads FPV, así que, en aeronaves grandes, compara con logs anteriores del mismo frame. Consulta un informe de ejemplo; para PX4, la guía de ULog.

Preguntas frecuentes

¿Qué niveles de VIBE son aceptables en ArduPilot?

Según la documentación de ArduPilot, menos de 30 m/s² está bien; entre 30 y 60 puede afectar al posicionamiento y al mantenimiento de altitud, y por encima de 60 casi siempre lo hace. Revisa también Clip: lo ideal es que el contador de clipping no aumente; un aumento constante durante el vuelo es un problema grave, aunque VIBE parezca normal.

¿Cómo registro el giroscopio sin filtrar en ArduPilot?

En la versión 4.5 y posteriores, configura INS_RAW_LOG_OPT = 9 (giroscopio principal, antes y después del filtro) y el bit 19, IMU_RAW, en LOG_BITMASK; en 4.3–4.4 basta con el bit 19. Para analizar los PID, añade el bit 0, ATTITUDE_FAST. Desde la máscara predeterminada 176126 de 4.5, queda en 700415; desde la 180222 predeterminada de 4.6 y posteriores, en 704511. Los logs crecen mucho, así que úsalo en vuelos de prueba.

¿Puedo analizar un .tlog en lugar de un .bin?

No. Un .tlog de telemetría se registra a baja frecuencia y no incluye los campos que necesitas. Usa el log DataFlash .bin de la SD o descárgalo en Mission Planner (DataFlash Logs → Download).

¿Por qué bbdoctor dice que no se pueden evaluar los PID de mi log?

Porque el giroscopio se registró por debajo de 200 Hz. Un log predeterminado de ArduCopter registra IMU a 25 Hz y RATE a 10 Hz: suficiente para vibraciones y cargas de los motores, pero no para la respuesta del controlador de velocidad angular. Activa los bits 0 y 19 en LOG_BITMASK para un vuelo de prueba o ajusta con AUTOTUNE.

Actualizado:

Más guías