我从传感器管理器获取了设备的磁性XYZ值。
然而,这些是设备观点的XYZ值。
问题是,我希望那些坐标(磁铁值的三维矢量)向北旋转。我希望在我转动并按住设备时看到相同的XYZ 值。
使用时
SensorManager.getRotationMatrix(R, I, accel, m);
SensorManager.getOrientation(R, v);
我在向量v []中得到设备方向的XYZ。
现在我需要做什么来旋转原始矢量以适应北方?
这是我正在寻找的最终结果:
如图所示,我为设备的任何方向获得相同的xyz值
编辑:
我尝试添加此内容:
Location l=null;
GeomagneticField field = new GeomagneticField((float) l.getLatitude(),(float) l.getLongitude(),(float) l.getAltitude(),l.getTime());
我从field.getX()得到的数据是无效的(也许是因为我使用的是空位...?)。 任何想法,我可以找到一个示例代码来帮助我?
感谢, 佬
答案 0 :(得分:0)
而不是
SensorManager.getOrientation(R, v);
将为您提供设备的方向,请使用
GeomagneticField::getX();
GeomagneticField::getY();
GeomagneticField::getZ();
这些将为您提供磁场的分量,与设备的方向无关。
答案 1 :(得分:0)
OK!我终于能够转向载体了。
我使用了迈克的建议并尝试了旋转矩阵的东西..
重点是将当前旋转矩阵从SensorManager中取出,并将其与磁性值的xyz矢量相乘(取决于设备方向)。
A是旋转矩阵,xyz是我的磁力值矢量。
这是你在代码中写的方式
SensorManager.getRotationMatrix(R, I, accel, m);
m[0]=Math.round(m[0]);//X
m[1]=Math.round(m[1]);//Y
m[2]=Math.round(m[2]);//Z
v[0]=Math.round((m[0]*R[0] )+(m[1]*R[1])+(m[2]*R[2]));
v[1]=Math.round((m[0]*R[3] )+(m[1]*R[4])+(m[2]*R[5]));
v[2]=Math.round((m[0]*R[6] )+(m[1]*R[7])+(m[2]*R[8]));
其中'm'是从传感器接收的磁性值:
public void onSensorChanged(SensorEvent event) {
switch(event.sensor.getType()) {
case Sensor.TYPE_MAGNETIC_FIELD:
System.arraycopy(event.values, 0, m, 0, 3);
break;
}
}