1

我从传感器管理器获得了设备的磁性 XYZ 值。

但是,这些是设备视角的 XYZ 值。

设备的观点

问题是,我希望那些坐标(磁值的 3d 向量)向北旋转。当我转动并握住设备时,我想看到相同的 XYZ值。

使用时

SensorManager.getRotationMatrix(R, I, accel, m);
SensorManager.getOrientation(R, v);

我在向量 v[] 中得到设备方向的 XYZ。

现在我需要做什么来旋转原始矢量以适应北方?

这是我正在寻找的最终结果:

如所见,对于设备的任何方向,我都得到相同的 xyz 值

如所见,对于设备的任何方向,我都得到相同的 xyz 值

编辑:

我试过添加这个:

Location l=null;
GeomagneticField field = new GeomagneticField((float) l.getLatitude(),(float) l.getLongitude(),(float) l.getAltitude(),l.getTime());

并且我从 field.getX() 获得的数据无效(可能是因为我使用了空位置...?)。知道在哪里可以找到示例代码来帮助我吗?

谢谢, 哎呀

4

2 回答 2

0

代替

SensorManager.getOrientation(R, v);

这将为您提供设备的方向,使用

GeomagneticField::getX();
GeomagneticField::getY();
GeomagneticField::getZ();

这些将为您提供磁场的分量,而与设备的方向无关。

于 2013-01-07T21:07:39.480 回答
0

好的!我终于能够转动矢量了。

我使用了迈克的建议并尝试了旋转矩阵的东西..

关键是将当前旋转矩阵从 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;
    }
}
于 2013-01-08T13:03:01.957 回答