Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Filtro complementario (Gyro + accel) con Android

Recientemente he hecho algunas investigaciones para utilizar tanto el acelerómetro + Giroscopio para utilizar los sensores para realizar un seguimiento de un teléfono inteligente sin la ayuda del GPS (ver este post) Sistema de Posicionamiento Interior basado en Giroscopio y Acelerómetro

Para ese propósito necesitaré mi orientación (ángulo (tono, rollo, etc.)) así que aquí lo que he hecho hasta ahora:

public void onSensorChanged(SensorEvent arg0) { if (arg0.sensor.getType() == Sensor.TYPE_ACCELEROMETER) { accel[0] = arg0.values[0]; accel[1] = arg0.values[1]; accel[2] = arg0.values[2]; pitch = Math.toDegrees(Math.atan2(accel[1], Math.sqrt(Math.pow(accel[2], 2) + Math.pow(accel[0], 2)))); tv2.setText("Pitch: " + pitch + "\n" + "Roll: " + roll); } else if (arg0.sensor.getType() == Sensor.TYPE_GYROSCOPE ) { if (timestamp != 0) { final float dT = (arg0.timestamp - timestamp) * NS2S; angle[0] += arg0.values[0] * dT; filtered_angle[0] = (0.98f) * (filtered_angle[0] + arg0.values[0] * dT) + (0.02f)* (pitch); } timestamp = arg0.timestamp; } } 

Aquí estoy tratando de ángulo (sólo para la prueba) de mi acelerómetro (tono), de la integración gyroscope_X a través del tiempo de filtrado con un filtro complementario

Filter_angle [0] = (0.98f) * (filter_angle [0] + gyro_x * dT) + (0.02f) * (tono)

Con dT comienzan más o menos 0,009 segundos

Pero no sé por qué, pero mi ángulo no es muy preciso … cuando el dispositivo está en posición plana sobre la mesa (la pantalla hacia arriba)

 Pitch (angle fromm accel) = 1.5 (average) Integrate gyro = 0 to growing (normal it's drifting) filtered gyro angle = 1.2 

Y cuando levanto el teléfono de 90 ° (ver la pantalla está frente a la pared frente a mí)

 Pitch (angle fromm accel) = 86 (MAXIMUM) Integrate gyro = he is out ok its normal filtered gyro angle = 83 (MAXIMUM) 

Así que los ángulos nunca alcanzan los 90 ??? Incluso si trato de levantar el teléfono un poco más … ¿Por qué no va hasta los 90 °? ¿Mi cálculo es incorrecto? O es la calidad de la mierda del sensor?

Otra cosa que me pregunto es que: con Android no "leer" el valor del sensor, pero me notifican cuando cambian. El problema es que como se ve en el código de Accel y Gyro compartir el mismo método …. por lo que cuando calculo el ángulo filtrado voy a tomar el tono de la medida accel 0,009 segundos antes, ¿no? ¿Es ésa quizás la fuente de mi problema?

Gracias !

    4 Solutions collect form web for “Filtro complementario (Gyro + accel) con Android”

    Sólo puedo repetirme.

    Usted obtiene la posición mediante la integración de la aceleración lineal dos veces, pero el error es horrible. Es inútil en la práctica. En otras palabras, usted está tratando de resolver lo imposible.

    Lo que realmente puede hacer es rastrear sólo la orientación.

    Roll, tono y guiñada son malos, no los usan. Compruebe el video que ya recomendé , a las 38:25.

    Aquí hay un excelente tutorial sobre cómo seguir la orientación con giroscopios y acelerómetros.

    Preguntas similares que podrían resultar útiles:

    Seguimiento de pequeños movimientos de iphone sin GPS
    ¿Cuál es la precisión del mundo real de los acelerómetros de teléfono cuando se utiliza para el posicionamiento?
    Cómo calcular el movimiento del teléfono en la dirección vertical del resto?
    IOS: Precisión del movimiento en el espacio 3D
    Cómo usar el Acelerómetro para medir la distancia para el desarrollo de aplicaciones para Android
    Distancia movida por el acelerómetro
    ¿Cómo puedo encontrar la distancia recorrida con un giroscopio y un acelerómetro?

    Escribí un tutorial sobre el uso del Filtro Complementario para el seguimiento de oriëntation con giroscopio y acelerómetro: http://www.pieter-jan.com/node/11 quizás te pueda ayudar.

    Pruebo su código y encontré que probablemente el factor de escala no es consistente. Convertir el tono a 0-pi da mejor resultado. En mi prueba, el resultado filtrado es ~ 90 grados.

     pitch = (float) Math.toDegrees(Math.atan2(accel[1], Math.sqrt(Math.pow(accel[2], 2) + Math.pow(accel[0], 2)))); pitch = pitch*PI/180.f; filtered_angle = weight * (filtered_angle + event.values[0] * dT) + (1.0f-weight)* (pitch); 

    He intentado y esto le dará ángulo 90 …

     filtered_angle = (filtered_angle / 83) * 90; 
      FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.