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:
| Bit | Nombre | Valor | Para qué sirve | En la máscara predeterminada |
|---|---|---|---|---|
| 0 | ATTITUDE_FAST | 1 | ATT y RATE a la frecuencia del bucle (400 Hz), objetivo para analizar los PID | no |
| 7 | IMU | 128 | giroscopio, acelerómetro, VIBE; imprescindible | sí |
| 10 | RCOUT | 1024 | salidas de los motores; imprescindible | sí |
| 12 | PID | 4096 | términos P, I, D y FF en PIDR/PIDP/PIDY | desde 4.6 |
| 19 | IMU_RAW | 524288 | giroscopio sin filtrar (GYR) a la frecuencia del sensor | no |
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í:
- VIBE: percentil 95 por eje durante el tiempo en el aire. Menos de 30 m/s²: bien; 30–60: aviso; 60 o más: crítico (umbrales de la documentación de ArduPilot);
- Clip: aumento del contador desde el primer despegue hasta el último aterrizaje; más de 0 es un aviso y más de 100 es crítico. No cuentan los clips al armar ni después del último aterrizaje. La documentación de ArduPilot coincide: lo ideal es cero; se toleran algunos por aterrizajes bruscos, pero un aumento constante es grave.
Por qué necesitas ambas señales: un log real de ArduCopter 4.7.0, fmuv2, 4S, siete vuelos, 414 s en el aire.

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:
| Vuelo | Tiempo en el aire | VIBE p95 X / Y / Z | Aumento de Clip |
|---|---|---|---|
| 1 | 69 s | 16 / 19 / 24 | 22 |
| 2 | 69 s | 16 / 20 / 25 | 34 |
| 3 | 79 s | 20 / 23 / 26 | 47 |
| 4 | 73 s | 20 / 22 / 30 | 106 |
| 5 | 31 s | 22 / 22 / 28 | 35 |
| 6 | 15 s | 16 / 20 / 24 | 4 |
| 7 | 79 s | 22 / 20 / 32 | 176 |
- Puede haber clipping con VIBE «normal». VIBE es un promedio; el clipping detecta picos. Los golpes breves (una batería suelta, un cable que golpea la controladora, un rodamiento defectuoso) apenas cambian el promedio, pero saturan el sensor y el EKF recibe datos basura.
- El percentil del log completo oculta el peor vuelo: Z es 29 en total y 32 en el último vuelo. Clips por minuto: 19 en el primero y 134 en el último. Algo se está aflojando.
- No son punch-outs. El gas mediano durante el clipping fue del 23%, igual que en todo el vuelo; todo ocurrió en modos de autoestabilización. Es un problema mecánico.
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é observas | Causa probable | Qué hacer |
|---|---|---|
| Todos los ejes altos y suben con el gas | hélices o campanas desequilibradas | equilibra o cambia las hélices; revisa ejes y rodamientos |
| Z claramente por encima de X e Y | brazos flexibles, soportes de motor o aislamiento de la controladora demasiado rígido o blando | aprieta motores y brazos; revisa los soportes blandos de la controladora |
| Un eje duplica al otro | algo suelto en esa dirección: mástil GPS, tren de aterrizaje, gimbal | asegúralo y comprueba a mano si tiene holgura |
| VIBE está bien, pero Clip aumenta en cada vuelo | golpes: batería, cables o una hélice que toca algo | usa 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.

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.
- Sube
INS_GYRO_FILTERsolo cuando el notch ya elimine las frecuencias de los motores: habrá menos retraso y una respuesta más rápida. - Haz cambios del 10–20% y un vuelo corto después de cada uno; desarma, desconecta la batería y toca los motores. Que estén templados está bien; si están calientes, vuelve al valor anterior.
- VIBE está bien, el espectro filtrado está limpio y el dron vuela bien: deja los filtros como están. En el Tarot yo no los tocaría.
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:
- VIBE por debajo de 30, Clip sin aumentar y notch configurado.
- Asigna AUTOTUNE a un interruptor; define los ejes en
AUTOTUNE_AXES(1 roll, 2 pitch, 4 yaw; 7 los tres) y la agresividad enAUTOTUNE_AGGR(0.075 en los dos logs anteriores). - Usa AltHold, Loiter o PosHold con aire tranquilo; dedica varios minutos a cada eje y deja margen de batería.
- 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:
- La respuesta es más fuerte con mucho gas. Los copters no tienen TPA en ArduPilot, así que linealiza mejor el empuje: sube
MOT_THST_EXPOen 0.05 (por ejemplo, 0.65 → 0.7). ¿No ayuda? Baja P y D un 10% y vuelve a ejecutar AUTOTUNE. - Propwash al cortar gas con los motores al mínimo. Sube
MOT_SPIN_MINen 0.02 y mantenlo al menos 0.03 por encima deMOT_SPIN_ARM. El log 4.7 tiene 0.08 conMOT_SPIN_ARMen 0.04, así que la recomendación sería 0.08 → 0.1. Consulta la guía de propwash.
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:
- Un centro de gravedad descentrado. Se comparan las órdenes medias de un lado y del otro: 12% o más es un aviso; por encima de 30% es crítico. En otro log 4.7, los motores traseros funcionaron al 62.1% frente al 55.2% de los delanteros, un 13% más: un aviso. En el log con clipping, M1–M4 promediaron 44.4 / 46.9 / 40.2 / 46.0%, alrededor de un 10% de diferencia entre delante y detrás, por debajo del umbral.
- Un motor inclinado: los motores que giran en un sentido soportan un 12% más que el otro par.
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
FS_THR_ENABLE = 1significa RTL si se pierde la señal.FS_THR_VALUEdebe ser menor que el gas mínimo de tu emisora y mayor que lo que entrega el receptor en failsafe. Haz la prueba en la mesa, sin hélices.- 14.4 y 14.0 V son 3.6 y 3.5 V por celda; las acciones 2 (RTL) y 1 (LAND). El Tarot (6S, 30,000 mAh) usa 3.1 y 2.95 V por celda: valores adecuados para Li-ion, demasiado bajos para LiPo.
- El voltaje debe mantenerse bajo durante
BATT_LOW_TIMER(10 s de forma predeterminada), para que los punch-outs no lo activen. Si lo hacen las trepadas largas, configuraBATT_FS_VOLTSRCen 1 (compensado por caída de tensión).
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 anterior | Nombre nuevo |
|---|---|---|
| Aceleración máxima de roll/pitch/yaw | ATC_ACCEL_R_MAX, etc., en cdeg/s² | ATC_ACC_R_MAX, etc., en deg/s² (4.7) |
| Ángulo máximo de inclinación | ANGLE_MAX, en centigrados | ATC_ANGLE_MAX, en grados (4.7) |
| Velocidad de giro ACRO | ACRO_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: