Combine el giroscopio con el acelerómetro para tomar rumbo

I'm using an Android device to get the heading(azimuth, or yaw angle).

Android API used the Accelerometer value + the mganetic field to compute a matrix rotation, the azimuth is then extracted form that matrix (aka SensorManager.getOrientation(...)) But the result is very inaccurate! especially if the phone is perturbed by some magnetic stuff.

And then I have the Gyroscope, If I integrate the value of the gyro trough time, I'm able to get an actual Angle, but like everybody knows :p, this is subject to drift... after 10 seconds even tough I'm not moving the angle drifted of 10°...

So here I have in one side the result of the accel + magneto, it's quite crap near magnetic field and on the other side I have the result of the gyro that are really good, but drift over time...

So my question is, is there an easy or smart way to combine the two results together to get a kind of "robust" heading estimation? I say easy because I know there is kalman filters.. but even tough i read the theory 50 times I can't get a damn thing :).

¡Gracias!

preguntado el 08 de noviembre de 11 a las 14:11

There's a reason that TYPE_ORIENTATION is deprecated, and that is that it is very inaccurate :) You should be using the Gyroscope to detect movement only, and not static positions. The accelerometer is more suited to this purpose, although you are going to have to do a bit of trig. Could you edit your question to be clear about exactly you want to do? You might also check the documentation - developer.android.com/reference/android/hardware/… -

I second that. As for " is there an easy or smart way to combine the two results together ?" this is already done by the sensor manager, check out the documentation Pheonixblade9 refers to. -

The Sensor Manager doesn't not combine the gyroscope and the accelerometer. It uses the accelerometer and the magnetic field to compute a rotation matrix and from that it get the heading (aka SensorManager.getOrientation(..)). So to refer at what Pheonix said, my question is How to combine the result of SensorManager.getOrientation with the integrated value of the gyro. -

Combine how??? It is completely unclear what you want to do. If you want to add them, try adding them together. That should "combine them" :P /sarcasm -

I guess I am not sure why the OP doesn't just use sensor manager - I have never had problems getting very accurate readings from the Android tutorials myself. I don't see what the problem or purpose is here -

3 Respuestas

Hasta donde yo sé, el filtro de Kalman o algo similar se implementa en el SensorManager. Verificar Fusión de sensores en dispositivos Android: una revolución en el procesamiento de movimiento.

Estás intentando resolver un problema que ya está resuelto.

respondido 09 nov., 11:12

Sorry Ali but the video you are linking show a guy working at MIT, and that have developped exactly what I would like to do (almost, because he did way much more stuff). This is not included in Android in anyway... Maybe in a couple years ? But I would like to understand How he did it.... - Alexis

@Alexis What does the SensorManager do then? What you wrote earlier: "The Sensor Manager doesn't not combine the gyroscope and the accelerometer. It uses the accelerometer and the magnetic field to compute a rotation matrix and from that it get the heading (aka SensorManager.getOrientation(..))." is not true. Where did you find this erroneous description? - Ali

developer.android.com/reference/android/hardware/…, float[]) So you do that SensorManager.getRotationMatrix(inR, I2,gravity2, geomag); // you pass the accel + magnetic and it computes the RotationMatrix and then you do SensorManager.getOrientation(inR,orientation) // you pass the rotationmatrix and return the orientation... No gyrosocpe involve - Alexis

Necesita developer.android.com/reference/android/hardware/… It gives you the orientation as a quaternion but you can convert that to a rotation matrix or to whatever you need. They API provides what you need. - Ali

This type if I understood correctly only use the accelerometer + compass (google.com/codesearch#uX1GffpyOZk/services/sensorservice/…) I don't understand why they don't include the use of gyro, it would be some much more accurate.... But thanks anyway, I'm gonna give a try with that type and try to extract the good angle from the returned matrix - Alexis

It seems to have a very generalized confusion about gyroscope sensor. I have recently answered a similar question aquí, so I recommend to anybody interested in these topics to have a look at that question and answer.

I have used the described technique in this solicitud (a compass which integrates gyroscope readings to improve results). The result is not perfect, but is much better in general than other compasses.

contestado el 23 de mayo de 17 a las 15:05

TO make it short:

It is not possible to combine Gyroscope + accelerometer TO GET THE AZIMUTH (I precise) Simply because the accelerometer can't sense acceleration on the XY axis..

A method would be to fuse the Gyroscope with the Compass but that won't work really good if there is magnetic pertubation

Respondido el 06 de diciembre de 11 a las 23:12

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.