6

有没有人已经编写了一个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

4

3 回答 3

3

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

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

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

于 2010-09-18T00:52:55.947 回答
2

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

于 2011-09-19T15:28:19.083 回答
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));
}
...
}
于 2010-05-19T11:35:40.567 回答