iPhone指南针倾斜补偿

6

有人已经编写了iPhone罗盘方向倾斜补偿程序吗?

我已经有一些方法,但是希望得到一些帮助或更好的解决方案!

第一步,我定义一个向量Ev,通过Gv和Hv的叉积计算而来。Gv是由加速度计值构建出的重力向量,Hv是由磁力计值构建出的方向向量。Ev垂直于Gv和Hv,因此指向水平东方。

第二步,我定义一个向量Rv,通过Bv和Gv的叉积计算而来。Bv是我的观察向量,定义为[0,0,-1]。Rv垂直于Gv和Bv,总是指向右侧。

第三步,这两个向量之间的夹角,即Ev和Rv,应该是我的校正方向。为了计算角度,我进行点积并计算其反余弦。

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

理论上应该有效,但也许我需要归一化向量?

有没有人对此有解决方案?

谢谢,m01d

3个回答

3

是的,您一定需要进行归一化处理。 这是我用来提取设备方向的代码。 通过加速计获取重力的x、y、z值, 通过heading函数获取罗盘的x、y、z值。

gravity.normalize(); compass.normalize(); compassEast=gravity.cross(compass);
compassEast.normalize();
compassNorth=compassEast.cross(gravity); compassNorth.normalize();

如果您需要完整的代码,请告诉我。 此外,对于那些还没有看到iPhone 4s陀螺仪效果的人们:它很棒!我将上述输入从重力和罗盘换成了陀螺仪的等效输入,结果稳定、平滑且非常棒 :) 去吧,苹果。


能否查看源代码?这让我很好奇。你能把源代码发送到fyasar@gmail.com吗? - fyasar
我也对代码感兴趣。我的邮箱是:ellen.sundh[at]gmail.com,谢谢! - Ellen S

2

0

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

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

- (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));
}
...
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接