Cálculo de la velocidad a partir de la aceleración (acelerómetro)

Estoy usando el acelerómetro en un dispositivo Android para rastrear y detectar ciertos movimientos, usando solo un eje ya que los movimientos son lineales a lo largo de ese eje.

Estoy usando un filtro simple para eliminar el ruido de los datos del acelerómetro:

ouput = ouput + alpha * (input - output)

El resultado se parece a lo que esperaría y parece utilizable para mis propósitos:

Aceleración Eje X

Quiero calcular la velocidad a partir de los datos del acelerómetro que obtengo, pero aquí es donde me encuentro con problemas, como se puede ver aquí:

Eje X de velocidad calculada

Al igual que con la aceleración, la curva de velocidad parece plausible, pero no vuelve a cero después de cada repetición y cae a valores negativos.

Por ahora, solo estoy escribiendo los datos sin procesar del acelerómetro en un archivo y luego los modifico y analizo usando hojas de cálculo, por lo que estos cálculos se hacen todos a mano.

  • Son datos sin procesar, y por lo tanto incluyen el efecto de la gravedad, que solo resto (estoy usando el promedio de los valores del período corto al principio en el que no hay movimiento, en este caso fue 9.55)
  • Tengo la marca de tiempo de cada punto de datos, por lo que sé el intervalo entre lecturas
  • Estoy usando la fórmula simple V = V0 + A * dtpara calcular la velocidad.
    • V0es inicialmente cero, luego se establece en el valor anterior
    • Aes la aceleración ajustada (es decir accel - grav, )
    • dtes el intervalo, la diferencia entre la marca de tiempo actual y la anterior

Pensé que el problema tal vez es que la aceleración tampoco vuelve a cero y en cambio se mantiene ligeramente por debajo de cero (como se puede ver en la primera imagen de arriba), lo que agrega demasiados valores negativos que se propagan en el cálculo. Así que me puse grava ser un número más pequeño, y parece haber un punto óptimo. En este ejemplo, los valores grandes de gravconducen a que la velocidad caiga a valores negativos, los valores pequeños invierten el efecto, con la curva de velocidad aumentando hacia valores positivos más altos. A la vuelta grav = 9.3(9,32 en esta imagen), el gráfico parece ser más plausible. Este intervalo es muy pequeño, 9.28 y 9.35 ya muestran una importante tendencia a subir o bajar, respectivamente.

Eje X de velocidad calculada con grav = 9.32

¿Cuál podría ser la razón de ésto? ¿De dónde viene el ~9.32? ¿Por qué no es el ~9.55 que observo durante el período inmóvil inicial? ¿Hay alguna forma de modificar los cálculos para obtener valores más consistentes? Por ejemplo, entre cada repetición debe haber un período corto de V = 0.

Es bastante complicado depurar cosas como esta... solo debe intentar jugar probando su acelerómetro en algunas condiciones simples en las que esperaría una forma de onda muy simple. Fuera de mi cabeza, hay varias cosas que posiblemente sean fuentes del error: tal vez su frecuencia de muestreo ( d t ) es demasiado grande y los errores se perpetúan y magnifican. Tal vez esté olvidando restablecer algunas variables en su código antes de calcular valores futuros. Tal vez hay algunas fuerzas que estás descuidando. Puede que no sea física: podría ser solo el código o un acelerómetro defectuoso.
Estoy bastante seguro de que no es un problema con mi código, realmente solo estoy tomando el valor que me da la API de Android y lo escribo en un archivo. Probablemente sea solo el sensor que no es muy preciso. Ese es en realidad el propósito de esto, averiguar qué datos útiles puedo recopilar de un acelerómetro de reloj inteligente "barato". No busco obtener valores precisos, estoy más interesado en el cambio relativo. No estaba seguro de si este es el SE correcto, pero como no hay mucho en mi código que pueda afectar esto, no pensé que encajara bien en Stackoverflow. Gracias por la información.

Respuestas (2)

Calibrar y validar. Estas son dos palabras que necesita cada vez que realiza cálculos de parámetros físicos a partir de la medición. Necesita saber cómo responde el dispositivo a las aceleraciones conocidas para determinar si los números que obtiene son significativos en el nivel en que desea usarlos. Lo más fácil sería si el fabricante le proporcionara esos detalles. Lamentablemente, en estos días, los dispositivos de este tipo a menudo vienen sin ningún tipo de documentación.

El hecho de que obtenga 9.3 a 9.5 para la gravedad es sugerente. Sugiere que tiene un problema de compensación o de escala. Una forma de verificar esto sería leer los valores con el dispositivo sobre una mesa, luego darle la vuelta y leer de nuevo. Un desplazamiento se mostrará como una diferencia de arriba hacia abajo. Un problema de escala mostrará valores bajos en ambos sentidos.

Si tiene una forma de poner el dispositivo en una situación con una aceleración conocida, eso también ayudaría. ¿Quizás un tocadiscos o algo así? Aunque algunos de estos dispositivos pueden ser engañados al girar en un círculo demasiado cerrado.

La deriva constante sugiere que podría tener un problema de respuesta. Puede que no sea lineal con la aceleración. Por ejemplo, se puede recortar una espiga estrecha pero alta. Las pruebas para tales se vuelven bastante complicadas. Necesitaría perfiles de aceleración conocidos y luego ver cómo responde el dispositivo. Corregir agrega aún más complicaciones.

Gracias. Probaré sus sugerencias para ver si puedo determinar si se trata de un problema de escala o compensación.
Acabo de hacer una prueba rápida y parece haber una compensación. En una dirección es 9.685, en la otra 9.949. En conjunto, en realidad está bastante cerca de dos veces 9,81 (9,817).

Esto debería ser un comentario, pero quería incluir un gráfico.

Sería útil tener detalles del movimiento que está observando.

¿Has comprobado que las aceleraciones a lo largo de los otros dos ejes ortogonales son cero?

El área bajo un gráfico de aceleración contra el tiempo te da el cambio en la velocidad.

ingrese la descripción de la imagen aquí

Entonces, el área azul representa el cambio positivo en la velocidad y, solo por inspección, parece más pequeña que el área roja, que es el cambio negativo en la velocidad.
Entonces, el cambio general en la velocidad es negativo.

Si sospecha que el cambio general en la velocidad es cero, ¿el cero de aceleración está en el lugar equivocado, es decir, el eje de aceleración está desplazado?

Supongo que estoy tratando de simplificar demasiado. El movimiento es un simple movimiento de arriba hacia abajo, en línea con el eje, pero no en condiciones ideales, es decir, no es perfectamente recto y puede haber algún movimiento de izquierda a derecha y de adelante hacia atrás. Entonces, los otros dos ejes no son cero, pero los he estado ignorando porque serían cero en condiciones ideales. No necesito medidas precisas, estoy más interesado en el cambio relativo, por eso estoy tratando de simplificar.