Almacene la orientación en una matriz y compare
Quiero lograr lo siguiente:
Quiero que el usuario pueda "grabar" el movimiento del iPhone usando el giroscopio. Y después de eso, el usuario debe ser capaz de replicar el mismo movimiento. Extraigo el tono, el balanceo y la guiñada usando:
- La mejor práctica para calcular la velocidad media de las coordenadas GPS
- Mover la mano Minuto en el reloj de Android
- Determine el ángulo de visión de la cámara del teléfono inteligente
- En C, tan (30) me da un valor negativo! ¿Por qué?
- Escala alrededor de un punto específico en el sistema de coordenadas 2d
[self.motionManager startDeviceMotionUpdatesToQueue:[NSOperationQueue currentQueue] withHandler: ^(CMDeviceMotion *motion, NSError *error) { CMAttitude *attitude = motion.attitude; NSLog(@"pitch: %f, roll: %f, yaw: %f]", attitude.pitch, attitude.roll, attitude.yaw); }];
Estoy pensando que podría almacenar estos valores en una matriz, si el usuario está en modo de grabación. Y cuando el usuario intenta replicar ese movimiento, puedo comparar la matriz de movimiento replicado con la registrada. La cosa es, ¿cómo puedo comparar las dos matrices de una manera inteligente? Nunca tendrán exactamente los mismos valores, pero pueden ser algo iguales.
¿Estoy en el camino correcto aquí?
ACTUALIZACIÓN: Creo que tal vez Alis respuesta sobre el uso de DTW podría ser el camino correcto para mí aquí. Pero no soy tan inteligente (aparentemente), así que si alguien me podría ayudar con los primeros pasos con la comparación de arrays sería un hombre feliz!
¡Gracias!
- Latitud / Longitud y metros
- Android Fourier Transform Realtime - Renderscript
- Android Dividir el círculo en N partes iguales y conocer las coordenadas de cada punto de división
- Android getOrientation Azimut se contamina cuando el teléfono está inclinado
- ¿Puede explicar (cálculos matemáticos) ejemplo de gesto (Levenshtein)?
- ¿Cuál es la mejor práctica para redondear un flotador a 2 decimales?
- ¿Qué es una buena biblioteca para analizar expresiones matemáticas en java?
- Calcular el ángulo del punto tocado y rotarlo en Android
Intente dinamizar el tiempo dinámico . A continuación se muestra un ejemplo ilustrativo con matrices 1D. En la base de datos ya tenemos los siguientes 2 arrays:
Array 1: [5, 3, 1]
Array 2: [1, 3, 5, 8, 8]
Medimos [2, 4, 6, 7]
. ¿Cuál matriz es la más similar a la medida reciente? Obviamente, la segunda matriz es similar a la recién medida y la primera no lo es.
Vamos a calcular las matrices de costos de acuerdo con este documento, la subsección 2.1 :
D(i,j)=Dist(i,j)+MIN(D(i-1,j),D(i,j-1),D(i-1,j-1))
Aquí D(i,j)
es el elemento (i,j)
de la matriz de coste, véase más adelante. Compruebe la figura 3 de ese papel para ver esta relación de recurrencia se aplica. En resumen: las columnas se calculan primero, partiendo de D(1,1)
; D(0,*)
y D(*,0)
se dejan en el MIN. Si comparamos las matrices A
y B
entonces Dist(i,j)
es la distancia entre A[i]
y B[j]
. Simplemente usé ABS(A[i]-B[j])
. Las matrices de coste para este ejemplo:
Para Array 1 tenemos 13 como puntuación, para Array 2 tenemos 5. La puntuación más baja gana, por lo que la matriz más similar es Array 2. El mejor camino de deformación está marcado en gris.
Esto es sólo un bosquejo de DTW. Hay una serie de problemas que tiene que abordar en una aplicación del mundo real. Por ejemplo, utilizando el desplazamiento en lugar de los puntos finales fijos o la definición de medidas de ajuste: véase este documento , página 363, 5. condiciones de contorno y página 364. El documento vinculado anterior tiene más detalles también.
Acabo de notar que está usando la guiñada, el tono y el rollo. En pocas palabras: no y otra razón para no hacerlo . ¿Puede usar los datos del acelerómetro en su lugar? "Un acelerómetro es una medida directa de la orientación" (del manuscrito de DCM ) y eso es lo que usted necesita. Y en cuanto a la pregunta de tc, ¿la orientación relativa a la materia Norte? Supongo que no.
Es mucho más fácil comparar los vectores de aceleración que las orientaciones (ángulos de Euler, matrices de rotación, cuaterniones) como tc lo señaló. Si está utilizando datos de aceleración, tiene 3 vectores dimensionales en cada punto de tiempo, las coordenadas (x, y, z). Simplemente calcularía
Dist(i,j)=SQRT((A[i][X]-B[j][X])^2+(A[i][Y]-B[j][Y])^2+(A[i][Z]-B[j][Z])^2)
,
Que es la distancia Euclediana entre los dos puntos.
Creo que el enfoque de Ali es en general un buen camino por recorrer, pero hay un problema general llamado bloqueo cardán (o discusiones de SO sobre este tema) cuando se usan los ángulos de Euler, es decir, tono, balanceo y guiñada. Usted se ejecutará en él cuando se graba un movimiento más complejo que dura más de unas cuantas garrapatas y por lo tanto conduce a grandes ángulos deltas en diferentes direcciones angulares.
En pocas palabras, significa que tendrás más de una representación matemática para la misma posición, dependiendo del orden de los movimientos que hayas hecho para llegar hasta allí, y una pérdida de información en el otro lado. Considere un avión volando en el aire de izquierda a derecha. El eje X es de izquierda a derecha, el eje Y apunta hacia el aire. Las dos secuencias de movimiento siguientes llevarán a la misma posición final, aunque llegarán de diferentes maneras:
Secuencia A:
- Rotación alrededor de guiñada + 90 °
- Rotación alrededor del paso + 90 °
Secuencia B:
- Rotación alrededor del paso + 90 °
- Rotación alrededor del rollo + 90 °
En ambos casos su avión apunta al suelo y puede ver el fondo desde su posición.
La única solución a esto es evitar los ángulos de Euler y así hacer las cosas más complicadas. Quaternions son la mejor manera de lidiar con esto, pero tomó un tiempo (para mí) para tener una idea de esta representación bastante abstracta. OK, esta respuesta no le da ningún paso más respecto a su problema original, pero puede ayudarle a evitar la pérdida de tiempo. Tal vez usted puede hacer algunos cambios conceptuales para configurar su idea.
Kay
- Android: cambia la vista de título personalizado en tiempo de ejecución
- Demostración de Android OpenGL "No config chosen"