如何获得独立于设备旋转的磁场矢量? [英] How can I get the magnetic field vector, independent of the device rotation?
问题描述
我想要存档的是一种位置的磁性指纹".我使用 MAGNETIC_FIELD 传感器,如果我得到 3 个值对于(不幸的是没有进一步解释)X、Y 和 Z 轴.
What I want to archieve is a sort of "magnetic fingerprint" of a location. I use the MAGNETIC_FIELD sensor and in the event I get the 3 values for the (unfortunately not further explained) X, Y and Z axis.
问题是,随着我旋转设备,这些值会发生变化,所以我猜 3 轴是相对于设备的.我需要的是补偿设备旋转,以便我获得相同的 3 个值,无论设备如何旋转.
Problem is, that the values change as I rotate the device, so I guess the 3 axis are relative to the device. What I'd need is to compensate the device rotation so that I get the same 3 values, regardless of how the device is rotated.
我尝试与旋转矩阵相乘(我知道如何得到它),尝试与倾角矩阵相乘等等,但没有任何效果.无论我尝试什么,当我旋转设备时,值仍然会发生变化.
I tried to multiply with the rotation matrix (I know how to get that), tried to multiply with the inclination matrix and so on, but nothing works. Regardless of what I try, still the values change when I rotate the device.
那么有人知道怎么做吗?最好使用代码,因为我读了很多东西,比如那么你必须使用旋转矩阵来补偿它",但没有找到一个具体的工作示例.
So does anyone know how to do it right? Preferrably with code, because I read a lot of stuff like 'well then you'll have to compensate that using rotation matrix' but did not find a single concrete, working example.
推荐答案
这样做
private static final int TEST_GRAV = Sensor.TYPE_ACCELEROMETER;
private static final int TEST_MAG = Sensor.TYPE_MAGNETIC_FIELD;
private final float alpha = (float) 0.8;
private float gravity[] = new float[3];
private float magnetic[] = new float[3];
public void onSensorChanged(SensorEvent event) {
Sensor sensor = event.sensor;
if (sensor.getType() == TEST_GRAV) {
// Isolate the force of gravity with the low-pass filter.
gravity[0] = alpha * gravity[0] + (1 - alpha) * event.values[0];
gravity[1] = alpha * gravity[1] + (1 - alpha) * event.values[1];
gravity[2] = alpha * gravity[2] + (1 - alpha) * event.values[2];
} else if (sensor.getType() == TEST_MAG) {
magnetic[0] = event.values[0];
magnetic[1] = event.values[1];
magnetic[2] = event.values[2];
float[] R = new float[9];
float[] I = new float[9];
SensorManager.getRotationMatrix(R, I, gravity, magnetic);
float [] A_D = event.values.clone();
float [] A_W = new float[3];
A_W[0] = R[0] * A_D[0] + R[1] * A_D[1] + R[2] * A_D[2];
A_W[1] = R[3] * A_D[0] + R[4] * A_D[1] + R[5] * A_D[2];
A_W[2] = R[6] * A_D[0] + R[7] * A_D[1] + R[8] * A_D[2];
Log.d("Field","
X :"+A_W[0]+"
Y :"+A_W[1]+"
Z :"+A_W[2]);
}
}
这篇关于如何获得独立于设备旋转的磁场矢量?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!