【问题标题】:iphone compass tilt compensationiphone指南针倾斜补偿
【发布时间】:2010-03-27 15:46:53
【问题描述】:

有人已经为 iPhone 罗盘航向倾斜补偿编程了吗?

我有一些方法,但一些帮助或更好的解决方案会很酷!

第一 我定义了一个向量 Ev,由 Gv 和 Hv 的叉积计算得出。 Gv 是我根据加速度计值构建的重力向量,Hv 是根据磁力计值构建的航向向量。 Ev 垂直于 Gv 和 Hv,因此它正在向水平东方向前进。

第二 我定义了一个向量 Rv,由 Bv 和 Gv 的叉积计算得出。 Bv 是我看起来的向量,它被定义为 [0,0,-1]。 Rv 垂直于 Gv 和 Bv 并始终显示在右侧。

第三 这两个向量 Ev 和 Rv 之间的角度应该是我更正的航向。计算我构建点积及其arcos的角度。

phi = arcos (Ev * Rv / |Ev| * |Rv|)

理论上它应该可以工作,但也许我必须对向量进行归一化?!

有没有人解决这个问题?

谢谢,m01d

【问题讨论】:

    标签: iphone accelerometer compass-geolocation tilt


    【解决方案1】:

    是的。你绝对必须正常化。 这是来自我用来提取设备方向的代码。 重力作为加速度计的 x,y,z 获得 而指南针是从航向函数的x,y,z得到的

    gravity.normalize(); 罗盘.normalize(); compassEast=gravity.cross(罗盘);
    compassEast.normalize();
    compassNorth=compassEast.cross(重力); compassNorth.normalize();

    如果您需要完整代码,请告诉我。 此外,对于那些还没有看过 iphone 4s 陀螺仪的人来说:太棒了!我将上面的重力和罗盘输入换成了陀螺仪的等效输入,结果稳定、流畅、棒极了:)去苹果吧。

    【讨论】:

    • 可以看源码吗?这让我很好奇。可以把源代码发到 fyasar@gmail.com 吗?
    • 我也对代码感兴趣。我的电子邮件:ellen.sundh[at]gmail.com 谢谢!
    【解决方案2】:

    我没有收到源代码,但我设置了自己的示例。你可以在这里看到项目和代码:http://www.sundh.com/blog/2011/09/stabalize-compass-of-iphone-with-gyroscope/

    【讨论】:

      【解决方案3】:

      是的,我按照上面的描述做了。但结果不是很准确。我认为如果加速度计值更平滑,它应该可以这样工作。因此,我选择通过在罗盘值中添加/减去相应轴的加速器值来进行倾斜补偿。

      这是我上面解决方案的代码,但它不是最终的工作解决方案:

      - (void)locationManager:(CLLocationManager *)manager didUpdateHeading:(CLHeading *)newHeading{
      if (newHeading != nil) {
      float Ax = accelerationValueX;
      float Ay = accelerationValueY;
      float Az = accelerationValueZ;
      float filterFactor = 0.2;
      Mx = [newHeading x] * filterFactor + (Mx * (1.0 - filterFactor));
      My = [newHeading y] * filterFactor + (My * (1.0 - filterFactor));
      Mz = [newHeading z] * filterFactor + (Mz * (1.0 - filterFactor));
      
      float counter = (  -pow(Ax, 2)*Mz + Ax*Az*Mx - pow(Ay, 2)*Mz + Ay*Az*My );
      float denominator = ( sqrt( pow((My*Az-Mz*Ay), 2) + pow((Mz*Ax-Mx*Az), 2) + pow((Mx*Ay-My*Ax), 2) ) * sqrt(pow(Ay, 2)+pow(-Ax, 2)) );
      headingCorrected = (acos(counter/denominator)* (180.0 / M_PI)) * filterFactor + (headingCorrected * (1.0 - filterFactor));
      }
      ...
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多