如何让Android手机定位与人性化方向相匹配?

Alb*_*iir 27 android sensor

我正在创建一个地图应用程序,包括显示您面向哪个方向的位置箭头,如下所示:

用蓝色箭头映射

SensorManager.getOrientation()使用第一个返回值:azimuth 直接从中获取方向.当手机被按住以使屏幕指向地平线以上时,并且在纵向中,箭头正常工作.然而:

  • 当手机被按住使屏幕指向地平线以下时,箭头指向与用户面向的方向成180度.
  • 当手机被拿着使得屏幕的面对与地平线保持水平时,箭头不知道它指向哪个方向.Azimuth根本没有返回有意义的结果.
  • 当手机向左或向右倾斜(或以横向模式保持)时,箭头向左或向右倾斜.

下面精心构造和科学的图像显示了我的意思(蓝色是用户面对的,红色是箭头方向,屏幕大致面向用户的脸,Google地图完全符合我的要求):

关于我想要什么发生的图表

(请注意,使用谷歌地图,如果自动旋转关闭,它就无法成功执行列表中的最后两个操作.但我甚至还没有达到那个阶段.一次只做一件事.)

它似乎只是使用Y轴指向方向,如下所示:http://developer.android.com/reference/android/hardware/SensorEvent.html,当我希望它使用Z轴指向的反向,大部分时间,和手机平坦时的Y. 但是,考虑到getOrientation()返回的值,我必须编写复杂的案例来解决一些问题,而面向电话的用例是无法解决的.我确信有一种更简单的方法.

这是我的代码(其中lastAcceleration和lastMagneticField都来自内部传感器):

float[] rotationMatrix = new float[9];
if(SensorManager.getRotationMatrix(rotationMatrix, null, lastAcceleration, lastMagneticField)){
    float[] orientMatrix = new float[3];
    SensorManager.getOrientation(rotationMatrix, orientMatrix);

    orientation = orientMat[0]*180/(float)Math.PI;
}
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?有更简单的方法吗?

编辑:只是为了澄清,我假设用户正在将设备放在他们面前,屏幕指向他们.除此之外,我显然无法分辨是否只有其中一个旋转.此外,我正在使用用户移动时的动作,但这是在他们静止的时候.

Hoa*_*yen 6

你有没有调用remapCoordinateSystem?否则,只有在垂直握住手机时才能获得正确的值.对于这种情况当手机被按住,因此屏幕的面向水平与地平线,你无法让用户面对.因为要获得面,你必须将传感器读数的z值投影到世界坐标的xy平面中,当设备水平放置时它为零.

更准确地说,如果你想让手机朝向,那么手机必须与水平方向倾斜至少约25度,你必须调用remapCoordinateSystem.以下代码将为您提供上面最后2张图片的所需内容.

float[] rotationMatrix = new float[9];  

if(SensorManager.getRotationMatrix(rotationMatrix, null, lastAcceleration, lastMagneticField)){
    float[] orientMatrix = new float[3];
    float remapMatrix = new float[9];
    SensorManager.remapCoordinateSystem(rotationMatrix, SensorManager.AXIS_X, SensorManager.AXIS_Z, remapMatrix);
    SensorManager.getOrientation(remapMatrix, orientMatrix);

    orientation = orientMat[0]*180/(float)Math.PI;
}  
Run Code Online (Sandbox Code Playgroud)

假设手机平放,getOrientation会为您提供正确的值.因此,如果手机垂直握持,则必须重新映射坐标以获得平坦位置.在几何上,您将手机-z轴向下投影到世界xy平面,然后计算此投影向量与世界y轴之间的角度.


Pet*_*fin 0

这看起来很棘手。我正在为 Android 开发一个 PNS,并且面临着一个类似的问题,我仍然需要光线:如何获得加速度计轴和运动矢量之间的旋转?

\n\n

问题是,在我看来,如果用户不移动,绝对不可能找到用户面对的方向(而不是设备)。也就是说,人类身上没有传感器,那么如果设备保持在绝对相同的位置但用户旋转了 90\xc2\xb0 呢?我看不出有什么办法可以找到这个。

\n\n

我可以建议(这实际上适合我的问题)是你可以(我不知道你在代码中实际做了什么)使用用户的动作来确定他的标题。让我解释。假设您有一个第一个位置 A。用户前往 B。然后您可以构建 AB 向量并获取用户在 B 处停止时的航向。然后您必须将代码限制为方向到达目的地时他所面对的。

\n\n

我知道这不如谷歌地图那么好,但你知道谷歌为此使用了什么吗?我的意思是他们只使用加速器和磁场传感器吗?

\n