Skip to content

Algoritmos de detección de caídas

Tras el análisis del funcionamiento detallado del Memsic 2125, se analizan posibles algoritmos.

El modo de utilizar un acelerómetro lo podemos clasificar en las siguientes categorías:

  • Para detectar inclinación: el memsic no es capaz de diferenciar entre gravedad(utilizada para medir la inclinación) y aceleración dinámica, por lo que utilizar un acelerómetro para medir la inclinación sólo es útil si las condiciones de funcionamiento son conocidas, como por ejemplo un dispositivo que se ha de mantener en horizontal. La inclinación en sistemas con mucha aceleración
  • Detectar colisiones: simplemente se trata de detectar una aceleración muy grande. Puede realizarse midiendo el valor absoluto y considerando colisión al pasar de cierta cantidad de gs, o como valor relativo de diferencia de valores en un intervalo de tiempo. En ambos casos lo que se pretende es “detectar el golpe”. Esta detección es apta para sistemas que posean una aceleración limitada y distinguible de golpes.
  • Detectar caídas: la detección de caídas es algo especial. El detectar caídas con 2 ejes es posible si el acelerómetro está configurado de manera que la gravedad es conocida y no hay efecto de aceleración estática con la que se pueda confundir. En este caso, cuando la medida correspondiente a la gravedad disminuya a 0g significará que el dispositivo está en caída libre, durante todo el tiempo que dure dicha disminución. Es una simplificación muy concreta de un sistema de navegación inercial.
  • Ser un sistema de navegación inercial: para tener las capacidades de un sistema de navegación inercial se necesitarían 3 ejes y giróscopos para determinar la orientación y discriminar la gravedad. La aceleración se tomaría como el vector diferencia entre el vector medido y el vector gravedad deducido.

Tras este análisis, podemos determinar que las opciones, dado que sólo disponemos de un acelerómetro de 2 ejes, se limitan a detectar colisiones como tal (el golpe) y descartar el resto de posibilidades.

Aunque existen otras posibilidades dependientes del caso concreto, como por ejemplo monitorizar a una persona en silla de ruedas, vamos a proponer aquellas soluciones que parecen más genéricas. En el caso de la silla de ruedas, por no dejar con la duda, es posible que la solución más sencilla sea la de detectar inclinación para el caso de una caída.

Algoritmo 1:

Detección de caídas basándose en la colisión, midiendo el valor absoluto del golpe: cuando la aceleración detectada es mayor que un determinado valor, se considera caída. En el caso de que la aceleración deseada sea de 2G, el algoritmo sería:

boolean verificarCaida1 (ArrayCircular& a) {
  if (a.getLast()>TC2_TOP_VAL*6/8 || a.getLast()<TC2_TOP_VAL*2/8) {
    return true ;
  }
  return false ;
}

Como se puede ver en el código, TC2_TOP_VAL*4/8 es la mitad y corresponde a 0gs, y cada 1/8 es 1g. Símplemente se comprueba si el último valor de aceleración es mayor de 2g o menor de -2g.

  • Ventajas: sencillez del algoritmo.
  • Desventajas: bajo el efecto de la gravedad, una aceleración de 1G contraria a la gravedad haría que se considerase colisión. Es necesario determinar el valor óptimo para una caída desde cierta distancia y que no interfiera con un uso normal.

Algoritmo 2:

Detección de caídas basándose en la colisión, midiendo el valor relativo del incremento de aceleración. Si en un cierto intervalo de tiempo la aceleración aumenta más de una cantidad, se considera colisión. El algoritmo sería:

#define TIMESTEPS 20       // Número de puntos tomar en cuenta
#define COLISIONACC ACC_2G // Aceleración de colisión: 2G

boolean verificarCaida2 (ArrayCircular& a) {
  if (!a.isFull()) return false ; // Si el buffer de datos no está lleno, no hacer nada

  int max_val, min_val=max_val=a.getLast() ; // Valor máximo y mínimo: se toma el último medido
                                             // por tomar uno cualquiera perteneciente a este
                                             // intervalo temporal

  for (int i=a.numElements()-1 ; i>=a.numElements()-TIMESTEPS ; --i) {
    if (a.get(i)>max_val) max_val=a.get(i) ;
    if (a.get(i)<min_val) min_val=a.get(i) ;
  }
  if ((max_val-min_val) > COLISIONACC) {
    return true ;
  }
  return false ; 
}

El algoritmo lo que hace es: para los últimos valores (los 20 últimos en el ejemplo) comprueba si el incremento de aceleración es mayor que cierto valor (aceleración de colisión COLISIONACC).

  • Ventajas: es independiente de la gravedad. El único caso en el que la gravedad influye es en el caso de que el acelerómetro rote rápidamente, de manera que la gravedad pase a hacer efecto, al mismo tiempo que recibe un impacto, es posible que el efecto final se considere colisión.
  • Desventajas: es más complicado porque hay que determinar 2 variables: el número de timesteps y la aceleración de colisión, que si bien ambos definen una única derivada, el intervalo de tiempo sigue siendo necesario que esté definido.

Post a Comment

Your email is never published nor shared. Required fields are marked *