我想archieve是一种位置的“磁指纹”。 我用MAGNETIC_FIELD传感器和在事件我得到的3个值的(不幸的是没有进一步解释)X,Y和Z轴。
问题是,该值的变化作为我旋转设备,所以我想的3轴是相对于该装置。 什么我需要的是让我得到同样的3个值,而无论该设备是如何旋转补偿装置的旋转。
我试图与旋转矩阵相乘(我知道如何获取),试图通过倾斜矩阵等繁殖,但没有任何工程。 不管我怎么努力,还是当我旋转设备值的变化。
因此,没有人知道该怎么做是正确的? Preferrably的代码,因为我读了很多的东西,像“那么,你就必须补偿,使用旋转矩阵”,但没有找到一个具体的,工作示例。
做这个
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","\nX :"+A_W[0]+"\nY :"+A_W[1]+"\nZ :"+A_W[2]);
}
}
解决方案:
可能性1:
MAGNETIC_FIELD是关于你不能上只是一些数学涉及到转换横向和纵向值旋转很不稳定,主要的原因是不同的轴系硬件使用不同的俘虏然后当旋转发生时,您使用不同的硬件捕手值将永远是相同的一些喜终端设备上这将是相同的,但不是在大多数设备。
如果你想要的东西,依靠和兼容许多设备上,你需要忘记计算与旋转MAGNETIC_FIELD,只是用力方向与您的应用程序。 强制“肖像”方向模式
可能性2:
你刚才谈到"magnetic fingerprint" of a location.
如果这只是有关识别的位置没有GPS,你有足够的其它信息的一起工作。 第一个“无线上网的SSID”,然后“移动网络细胞”,也“连接无线上网”等,如果这个利益你,我可以给你的代码吧。
可能性3:
如果你绝对需要计算MAGNETIC_FIELD您的位置,并且不希望强制旋转......你能抓住这两个值横向和纵向的,而不是计算他们的。 那么当你比较只比较这两个值。
此外,如果你正在寻找找到的地方,你有磁铁或磁HIGHT位置,你可以用一个喜允差百分比的工作只是检测一个磁铁存在左右,
注意 :
如果你坚持与数学不要忘记,功能将是几乎每一个设备上的不同......不要犹豫,给你的问题更多的相关信息,我会很高兴,以适应我的答案;)
得到的磁场的强度,你必须得到的X,Y,磁场(从Sensor.TYPE_MAGNETIC_FIELD)的z值,并应用以下公式:
double magnetic_field_strength = Math.sqrt( (Xvalue*Xvalue) + (Yvalue*Yvalue) + (Zvalue*Zvalue) );
magnetic_field_strength在微特斯拉表达(μT)
可以注意到,地球的平均磁场强度为50μT,根据这个网站 。
因此,一个可能的代码如下:
private SensorEventListener sensorEventListener = new SensorEventListener() {
@Override
public void onSensorChanged(SensorEvent event) {
switch (event.sensor.getType()) {
case Sensor.TYPE_MAGNETIC_FIELD:
magnetic_field_strength = Math.sqrt((event.values[0]*event.values[0])+(event.values[1]*event.values[1])+(event.values[2]*event.values[2]));
break;
default:
return;
}
}
}
磁场矢量的坐标给出了相对于移动电话,如在这样的画面:
得到以下图片的坐标系中的磁场矢量:
你必须乘以磁矢量m
与旋转矩阵R
从检索到的()getRotationMatrix像R * m
。 这个载体将穿过地球指向磁北极。
如果你也有倾斜度乘以I
的载体将绕X轴旋转,以完全在Y轴:
[0米0] = I * R *地磁(M =地磁场的大小)
该载体应该是在地球上的每个位置是恒定的。 但是,您的手机上的结果可能会略有偏差,因为你必须非常小心,不要旋转设备时改变传感器的位置。
文章来源: How can I get the magnetic field vector, independent of the device rotation?