Datos sísmicos libmseed en tiempo real con raspberry pi de 512Mb de RAM y monoprocesador ARM
El aprovechamiento y optimización de sistemas sencillos permite usar hardware como una simple raspberry pi de 512Mb de ram y monoprocesador para múltiples tareas enormes e importantes
El secreto es la optimización del código para evitar hacer más de lo necesario. Haciendo lo correcto puede permitir exprimir al máximo el hardware antiguo con aplicaciones y software actual. En este caso el sistema, entre muchas otras utilidades, envía datos libseed utilizados en sistemas de monitoreo sísmico en tiempo real.
En la captura de ejemplo, esta raspberry pi ejecuta múltiples procesos para captar los datos sísmicos:
- Lee datos raw de los 3 ejes X, Y, Z en tiempo real a 1000Hz de un sensor ADXL355 acelerómetro.
- Aplica un downsample a 100Hz
- Aplica un filtro Notch a 50Hz para eliminar datos innecesarios de la señal.
- Aplica la correción de la gravedad al eje Z.
- Guarda los datos raw resultantes en memoria.
- Genera ficheros .mseed con los datos raw finales en memoria.
- Aplica una calibración periódica para compensar la desviación de cada eje individual y mantener los datos centros en el eje 0.
- Aplica 26 filtros IIR diferentes a cada eje para obtener la señal dividida y detectar diferentes tipos de eventos, como terremotos cercanos, golpes, terremotos lejanos, ....
- Aplica un filtro STA/LTA para cada uno de los ejes para cada uno de los filtros, lo que permite identificar el evento en un rango de Hz y eje.
- Detecta la energía RMS de los 3 ejes
- Detecta mediante el método Kurtosis el momento de la llegada del evento.
- Detecta mediante un algoritmo secundario AIC la llegada de la onda sísmica.
- Lanza alertas mediante ventanas de tiempo individuales de cada filtro si supera el Trigger Threshold adaptado a cada uno de los rangos de Hz y ejes.
- Dispone de un servidor web nginx para visualizar el panel de control
- Envía datos raw de todo lo anterior al panel de control por websockets
- Genera ficheros raw mseed de los 3 ejes en disco sd cada minuto para mantener los datos generados a salvo en la targeta de memoria.
- Aplica un filtro FIR a cada uno de los rangos de Hz para generar una gráfica de helicorder más 'amable' visualmente.
- Genera helicorders de 5 rangos diferentes, para poder visualizar eventos en caso de haberlos y ver cómo ha afectado a diferentes rangos.
- Envía los helicorders anteriores al servidor principal, para visualizarlos externamente en internet.
- Dispone de un servidor libseed, para poder conectar directamente y recoger los datos con otro tipo de software, como swarm.
- El mismo servidor envía los datos libseed a un servidor central, donde se redistribuirá públicamente y en tiempo real.
- El dashboard incorpora un sistema con el que cada 30 segundos se conecta a diferentes organismos oficiales para recibir los últimos eventos acontecidos. En caso de haber, incorpora un sistema de llegada de ondas para visualizar los momentos y cómo afecta a la señal cada tipo de onda en el momento preciso, calculando mediante el método AK135 el origen y la llegada a la estación por coordenadas geodésicas.
- El panel de control permite conectar a servidores mseed para contrastar la forma de onda de la estación con otras estaciones profesionales.
- También incorpora la generación de un espectrograma para poder visualizar la fuerza de la señal y cómo se distribuye la misma en una ventana de tiempo. Ésto permite ver en tiempo real la fuerza de un evento distribuido por todo el ancho de la señal.
Podríamos pensar que una raspberry pi tan limitada no podría generar tantos datos, de tantas formas y en tan poco tiempo, teniendo en cuenta la poca memoria disponible y sabiendo que únicamente disponemos de un solo procesador, por lo que tanto las conexiones de sockets, generación de datos y ficheros, servidor web, etc.... ocurre en la misma cpu sin posibilidad de usar multihilos por separado, pero lejos de colapsar, el sistema aguanta perfectamente. No hay cortes de datos. Los únicos cortes que existen han sido a causa de reinicios intencionados de los servicios, por recompilación del código fuente y/o cambios y actualizaciones. El sistema es estable.
Al poder disponer ya externamente de los datos, en el servidor principal he implementado otro servicio, que se encarga de recopilar en tiempo real los datos libseed y redistribuirlos, lo que permite desde javascript descifrarlos y mostrarlos en tiempo real.
Esto precisamente es lo que he preparado. Un sistema en tiempo real que permite monitorizar las 3 estaciones sísmicas a la vez, cada una con diferentes tipos de sensores, y es esto precisamente lo que nos ayudará a interpretar cómo se comporta y se ve la señal en cada uno de los sensores (acelerómetros y geófonos).
En este vídeo se aprecia contrastando la fecha/hora del sistema con los datos de las gráficas que están perfectamente sincronizados en el tiempo, con pocos milisegundos de retraso, lo que ratifica lo anteriormente hablado.
Un logro espectacular con un hardware muy limitado y 'viejo'. El reto es hacerlo funcionar con lo mínimo. Sabiendo que funciona, hacerlo funcionar en hardware actual y rápido no será ningún problema.