FILTROS EN BETAFLIGHT

Betaflight 3.0.0 incorpora algunos filtros nuevos y vamos a explicar cómo ajustarlos a nuestro quad. Aquí podéis bajaros la última versión: https://github.com/betaflight/betaflight/releases

Primero vamos a repasar los filtros que ya se han ido incorporando en Cleanflight/Betaflight hasta 2.9.1, y cuál es su función.

En los defaults siempre ha habido algo de filtrado, y también existían recomendaciones generales según lo “ruidoso” que fuera el bicho. En cambio para el nuevo filtro Notch convendrá bastante echar un ojo a Blackbox para sacarle mejor partido.

Si tu quad te trolea, suena raro o los motores te bajan más calientes que una Dinogy a lo mejor deberías planterte configurarlo bien. Puedes saltarte la parte teórica infumable e ir al lio directamente, donde empieza Nuevo Notch Filter.

Para qué coj***** filtrar?

Un ejemplo de una señal antes y después de filtrarse:

 

filt1

PV (process variable) podría ser la señal de roll rate del gyro, por ejemplo. Vemos que nos quedamos con el promedio “limpio”, pero la curva filtrada está algo retrasada respecto a la que hubiéramos dibujado nosotros. Partimos de que filtrar es malo porque añade retraso a la señal, entonces, para qué? Bastante tenemos con todos los otros retrasos, y un poco de ruido no puede ser para tanto!

El problema está en que todas estas señales tienen ruido, y al final el término D acaba amplificándolo* y mandándolo a nuestros motores. Y por eso aun después de un vuelo tranquilo, con un valor promedio normal de throttle, los motores bajan ardiendo como perras por la señal ruidosa con la que se les ha alimentado.

*PID flashback: La controladora recibe por un lado nuestra señal de sticks con la orden de rates, y por otro la medición de rates del giróscopo. Según sea esta diferencia* el loop PID ordenará más o menos vueltas a cada motor.

P trabaja directamente con esa diferencia, I con la integral “el error acumulado” hasta ese momento, y D con la derivada, es decir la velocidad con la que aumenta o se reduce el error. Si el error es pequeño pero varía mucho, será D la afectada. Y eso es precisamente el ruido, una señal “pequeña” que oscila mucho y que se suma a la señal “buena”.

filt22

Comparativa de una controladora sólo PI (con D=0) vs PID. La curva de abajo CO (control output) sería como el % demandado a los motores. Vemos claramente el efecto al añadir D: podemos tunear mejor y conseguir una mejor respuesta, pero pagamos el precio de amplificación de ruido en la señal al motor.

filt3

Aquí vemos directamente el efecto de ruido creciente en el la señal del gyro para un ajuste PID fijado. No sólo el ruido tiene impacto en la señal al motor, sino que a este punto empieza a afectarnos a la respuesta global (maraca).

Parte del ruido se evita a base de buenas prácticas de montaje/uso: hélices y motores nuevos y equilibrados, frame rígido en perfecto estado, controladora sobre soporte antivibración, etc.

En resumen: Filtrando conseguimos eliminar parte del ruido, cuidamos más lo motores, y podemos permitirnos valores de D mayores que podrían solucionarnos algún otro problema como el propwash.

También conseguimos una respuesta más robusta, porque está muy bien tener un quad nuevo y sin ruido, pero acabarás volando hecho mierda y lo sabes.

Filtrar tampoco hace milagros y no esperes que te haga volar bien con motores jodidos o un brazo partido.

OK, me has convencido, voy a filtrar. Qué quiere Boris que haga ahora?

Tenemos unos cuantos tipos de filtros a nuestra disposición, algunos en los default de manera que salvo que los hayáis quitado ahí estarán de serie. En las últimas versiones del Betaflight Configurator podéis ver los mas importantes en la pestaña de filter settings, junto a los PIDs.

En el esquema general vemos donde actúan los filtros (1), (2) y (3) y a qué señales aplican.

filt4

Vemos que para que la entrada a los ESC sea limpia, podemos filtrar tres señales: SetPoint, Gyro y DTerm. Comentamos estos filtros.

1) Filtrar la entrada: Setpoint Filter / RC_interpolation

Éste es el más sencillo, simplemente nos quita mierda de nuestra señal de sticks. La señal sin filtrar está compuesta por escalones, lo que viene siendo un horror cuando lo derivas, se traduce directamente en una patada en D (Derivative kick).  No tiene nada que ver que el throttle de la Taranis suene como una carraca, pero la idea es esa: la señal que envían los sticks son escalones a los valores discretos que permite el transmisor/receptor.

Boris ha metido una interpolación en estos valores para que sea una curva suave; meterá algo de retraso pero es necesario si queremos tener una “derivada limpia” y no a base de patadas.

Viene activo por defecto (RC_interpolation = AUTO) y no tiene mucho sentido quitarlo de modo AUTO, dejad que fluya la magia.

Existe otro filtro adicional para los inputs: input_filtering_mode  (= OFF por defecto). No creo que nadie lo haya usado en la vida.

2) Filtrar la señal del gyro. Gyro lowpass

La señal que recoge nuestro giróscopo contiene más información de la que necesitamos para el control PID. Idealmente debería ser una señal limpia y suave que represente el movimiento real “como sólido rígido” de nuestro quad. Pero tener 4 cabrones girando en los extremos a 20000rpm tenía que tener alguna consecuencia*.

*Aunque los quads son muy rígidos también tienen su comportamiento chancletoide y vibran como cualquier estructura. El quad tiene sus modos propios de vibración, a determinadas frecuencias, que dependerán sobre todo de la forma del frame, espesor de los brazos, peso de los motores.

A estas frecuencias el frame “resonará”, si el ruido que meten las hélices/motores pasa por ahí, se amplificará y hará que vibre, de manera que el giróscopo acaba recibiendo esa señal. El número de palas es un factor muy importante, en general encontraremos problemas a frecuencias mayores según aumentemos.

Una curva suave se traduce en una señal con componentes de baja frecuencia; no necesitaremos más de unos pocos Hz para representar adecuadamente el movimiento (0-30Hz). Pedir mucho más a la señal del gyro es tontería.

 

El resto de señal a mayor frecuencia es vibración y no lo necesitamos, por lo que se introducen “low pass filters”, que hacen precisamente eso: dejan pasar la parte importante de la señal, y atenúan la parte de alta frecuencia, desde el valor que fijemos como  frecuencia de corte.

Es también importante remarcar que no toda esta vibración afectará siempre y por igual al giróscopo. Al colocarlo en el centro del quad minimizamos el efecto, y si además colocamos la controladora sobre soportes elásticos estaremos ayudando con un low pass filter mecánico gratis. También hay gyros más o menos ruidosos, como el famoso 6500 de las naze rev6.

Tenemos dos tipos de filtros para el gyro:

gyro_lpf (=OFF por defecto). Filtrado por hardware del propio gyro. Sólo se recomendaba para quads muy ruidosos. Valores permitidos: OFF, 188Hz, 98Hz, 42Hz, 20HZ, 10HZ, 5HZ, EXPERIMENTAL

gyro_lowpass (=90 por defecto, valor de la frecuencia de corte). Filtrado normal por software.

gyro_lowpass_level (= NORMAL por defecto). Nos permite elegir un tipo de lowpass más agresivo. Valores permitidos: NORMAL, HIGH. Conseguiremos atenuar más pasado el valor de la frecuencia de corte, pero a cambio meteremos más retraso en la señal filtrada.

3) Filtrar el output ruidoso. Dterm filtering

Este es el más higienico, porque actúa donde más falta hace. De hecho, que la señal del gyro esté hecha unos zorros no es preocupante en P o en I. El ruido siempre es pequeño comparado con la señal, por lo que P no tendrá mucho que amplificar. Y el promedio del ruido es cero, por lo que es totalmente transparente para I.

Si filtramos toda la mierda setpoint-gyro que sale de D, nos aseguramos de que la orden al motor sea limpia.

El valor ajustable en el configurador es dterm_lowpass (=100 por defecto).

Como en Gyro, también existe en CLI dterm_lowpass_level = (HIGH por defecto).

Después de darle muchas vueltas Boris y sus minions dejaron unos low pass filter por defecto relativamente suaves, para que el sacrificio en latencia no fuera demasiado caro. A cambio, el filtro reduce las componentes pasadas la frecuencia de corte, pero si el ruido es grande puede quedarnos todavía bastante a pesar de haber filtrado.

Éstas son las recomendaciones de Filter Settings de Boris, antes de inventarse el Notch:

Quad óptimo (Defaults beta 3.0.0):

gyro_lowpass = 110 (90)

dterm_lowpass =110 (100)

gyro_lpf = OFF

 

Quad algo ruidoso:

gyro_lowpass = 80

dterm_lowpass = 100

gyro_lpf = OFF

 

Quad muy ruidoso:

gyro_lowpass = 50

dterm_lowpass = 100

gyro_lpf = 188HZ

 

Por último, comentar que existe un filtro más: yaw_lowpass (=0 por defecto). Aplica sólo al término P de yaw, lo metieron porque algunos quads son más sensibles al ruido en guiñada. En general si tenemos problemas bastará con el de Gyro, que afecta por igual a roll pitch y yaw.

El nuevo Notch Filter

La solución a la que han llegado en Betaflight 3.0.0 para ser capaces de matar a gusto ruidos concretos a alta frecuencia como los de la figura es el Notch filter. Aquí un ejemplo (lisam 210, sunnysky 2204 2300Kv, DAL 3×5040 V2, Naze32 @1KHz):

NotchOFF_roll

Señal del roll rate sin Notch. Vemos cómo los low pass filters tal cual están no son capaces de cargarse el ruido entre 150-300Hz.

NotchON_roll

Mismo ensayo ahora con Notch. Ouuh yeah!

Básicamente el Notch es un pozo/vertedero que se carga completamente todo lo que tenga cerca de su frecuencia central, y menos a medida que nos alejamos.  Se puede utilizar tanto en el la señal del gyro como en Dterm.

Después de darle muchas vueltas decidieron que por defecto en 3.0.0 Notch en Gyro está desactivado, y en DTerm actúa centrado en 260Hz, entre 160-360Hz:filt7

Estos valores pueden venirnos bien de casualidad, pero el efecto es muy potente en la frecuencia central elegida y conviene elegirla adecuadamente.  Necesitamos Blackbox para:

  • Ver si realmente nos hace falta Notch filter. Si nuestro quad está perfecto un filtro más no nos aporta nada y podemos quitarlo con derecho. Si más adelante nos trolea ya si eso pensaremos en reactivarlo.
  • Si de verdad hay un problema, debemos detectar qué frecuencia y anchura nos vendría bien para matar el ruido. Los valores por defecto pueden andar cerca, pero estudiando nuestro quad podemos ver los valores exactos que necesitamos.
Pero joder, Blackbox?….soy piloto no científico!

No hace falta que te toques viendo las gráficas. Con el nuevo Blackbox Explorer de Betaflight y la probabilidad alta de que tengas una F3 o naze con chip de memoria no se necesita prácticamente nada. Con 2mb de memoria puedes grabar 1min aprox (a 1kHz), que es más que suficiente. Paso a paso:

  • Activa Blackbox en la sección de Features, fácil:11-09-2016 15-29-39
  • En CLI escribe set debug_mode = NOTCH. Esto activará 3 campos de registro adicionales para ver la señal antes del filtro: gyro_preNotch[pitch], gyro_preNotch[roll], gyro_preNotch[yaw].
  • En la pestaña blackbox elige “on-board data flash chip”. filt8
    Si no tienes chip necesitarás un data logger externo que vuelque los datos a una tarjeta SD.Tutorial aquí: https://oscarliang.com/setup-blackbox-cleanflight/
  • Marca 1kHz como frecuencia de escritura. Necesitarás un looptime mínimo de 1kHz, que sería normal. De esta manera la información que obtengamos del registro llegará hasta 500Hz (la mitad). Si vamos a 2kHz o más podemos registrar más mayor frecuencia, pero no tiene mucho sentido mirar más allá de 500Hz, y nos fundiremos la memoria el doble de rápido.
  • Ponte un switch para activar Blackbox en la pestaña Modes.
  • Arma, activa Blackbox, y vuela un rato.
  • Reconecta el quad, ve a la pestaña Blackbox y guarda el fichero. La trasferencia desde el chip es bastante lenta, con una SD externa lo evitaríamos pero podríamos tener problemas en la escritura y ver el registro con huecos.
  • Bájate la app de Chrome Blackbox Betaflight Explorer y abre el fichero https://chrome.google.com/webstore/detail/cleanflight-blackbox-expl/cahpidddaimdojnddnahjpnefajpheep
  •  (Nota: El fichero puede contener varios registros, elige el más largo en la pestaña de la derecha junto a Legend).
  • Pulsamos Graph setup, quitamos los que vengan por defecto. Add graph / custom graph, elegimos “Debug Notch“.filt9
  • Esto nos pintará 3 señales, gyro_preNotch[pitch], gyro_preNotch[roll], gyro_preNotch[yaw]. Si no tuviésemos ningún filtro coincidirían exactamente con los valores gyro[pitch], gyro [roll], gyro [yaw].
  • En estas 3 señales pulsamos el icono de las barras junto a su nombre. filt10
  • Esto nos abre su espectro en frecuencias, y nos indica en la gráfica algunas frecuencias importantes. Podemos agrandarlo pulsando filt11
  • Las frecuencias de corte los filtros que tengamos, los lowpass filters Dterm y Gyro, y los valores de los notch, también en DTerm (azul) y Gyro (verde). También indica en rojo la frecuencia a la que el ruido de los motores es mayor (Podemos comprobar esto último si miramos el espectro de las señales motor[1-4])
  • Viendo los espectros preNotch nos fijamos en las zonas que vemos conveniente matar. Para definir el notch hace falta la frecuencia central, y la frecuencia de corte menor. P.ej., los valores por defecto 260Hz, 180Hz nos matan las componentes entre 180 y 340Hz, siendo el efecto mayor en la zona central en torno a 260Hz.
  • Si los filtros están haciendo su trabajo, deberemos ver unas señales de gyro[pitch], gyro [roll], gyro [yaw] con poco ruido, y lo mismo en PID_D[pitch], PID_D[roll]. Si decidimos ajustar el Notch, podemos modificar el que ya tenemos por defecto en DTerm o si la cosa está muy mal añadir otro en Gyro.
    También podemos modificar las frecuencias de los lowpass filters si lo vemos conveniente. Si el problema está muy localizado en un rango de frecuencias y el notch nos lo arregla, podremos aumentarlas y reducir así el retraso que nos meten.
  • Con los nuevos valores que hemos elegido, volvemos al Configurador de Betaflight para ponerlos en la pestaña filter settings.
  • Repetimos el proceso de registro en vuelo (sin olvidar formatear la memoria interna en la pestaña Blackbox), y observamos de nuevo los resultados. Comparamos gyro_preNotch[roll] vs gyro[roll]. Lo mismo para Pitch. Si no estamos satisfechos podemos re-centrar la frecuencia principal o aumentar la anchura.

 

Primer aviso: los resultados pueden variar mucho con el número y el estado de palas! El peso de la batería/Gopro también debería influir, pero menos.

 

Perdón por el tocho, buen vuelo!

 

 

Más info en inglés:

https://github.com/betaflight/betaflight/wiki/BetaFlight-3.0

https://github.com/betaflight/betaflight/wiki/BetaFlight-Deep-Dive#filtering-aliasing-and-gyro-sync-explained-

http://controlguru.com/using-signal-filters-in-our-pid-loop/

http://controlguru.com/measurement-noise-degrades-derivative-action/

 

 

2 comentarios

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *