使用CoreMotion / CoreLocation从电话背面计算北向标题

时间:2016-11-03 14:12:32

标签: ios augmented-reality heading azimuth

我希望从手机背面(-Z轴)获得增强现实应用的方位角。我的应用程序仅在Landscape Right中运行。在iPhone 5S上进行测试。

目前,我使用以下方法: CoreLocation heading base on back camera (Augmented reality)

这种方法有两个问题:

  1. 如果我将设备背面指向北方,使得我目前处于0度,则将其顺时针(偏航)旋转360度,我现在在-20度度。逆时针旋转增加20度。这种模式重复,使得从0开始旋转720度现在产生-40度,依此类推。而且,即使我不一定要做这些明确的旋转,而是混乱地移动手机(旋转,摇晃等),但最终在我最初的同一地点,我甚至无法预测它将显示什么价值。
  2. 另一个问题是我认为称为陀螺漂移。如果我根本不移动设备,我可以清楚地看到价值随着时间的推移缓慢变化,让我们说每隔几秒0.1度,有时在一个方向,有时在另一个方向,直到某个它决定停止的地方。
  3. 问题是,我没有数学背景知道如何解释这些变化。特别有问题的是,我无法通过deviceMotion.attitude从偏航/俯仰/滚动计算旋转矩阵。我试过了:

    float w = motion.attitude.yaw;
    float v = motion.attitude.pitch;
    float u = motion.attitude.roll;
    r.m11 = cos(v) * cos(w);
    r.m12 = sin(u) * sin(v) * cos(w) - cos(u) * sin(w);
    r.m13 = sin(u) * sin(w) + cos(u) * sin(v) * cos(w);
    r.m21 = cos(v) * sin(w);
    r.m22 = cos(u) * cos(w) + sin(u) * sin(v) * sin(w);
    r.m23 = cos(u) * sin(v) * sin(w) - sin(u) * cos(w);
    r.m31 = -sin(v);
    r.m32 = sin(u) * cos(v);
    r.m33 = cos(u) * cos(v);
    

    我已经尝试了所有Tait-Bryan组合(u-v-w,u-w-v,v-u-w,v-w-u,w-v-u,w-u-v),其中一些接近但仍然不够接近。

    根据我的观察,似乎来自CLLocationManager的磁性标题比来自CMMotionManager的计算标题更精确,但是,即使我得到了正确的角度,我也不知道我应该从哪里开始获得等效的不同坐标系参考系中的角度。任何帮助将不胜感激。

0 个答案:

没有答案