有人已经编写过iphone指南针标题倾斜补偿吗?
我有一些方法,但一些帮助或更好的解决方案会很酷!
FIRST 我定义了一个向量Ev,由Gv和Hv的叉积计算得出。 Gv是由加速度计值构建的重力矢量,Hv是构建磁力计值的标题矢量。 Ev与Gv和Hv垂直,因此它正朝着东方的方向前进。
SECOND 我定义了一个向量Rv,由交叉积Bv和Gv计算得出。 Bv是我的向量,它被定义为[0,0,-1]。 Rv垂直于Gv和Bv并始终显示在右侧。
THIRD 这两个向量之间的角度,Ev和Rv,应该是我的修正标题。计算角点i构建点积和arcos。
phi = arcos(Ev * Rv / | Ev | * | Rv |)
理论上它应该可以工作,但也许我必须将矢量标准化?!
有人为此得到了解决方案吗?
谢谢,m01d
答案 0 :(得分:3)
是的。你肯定必须规范化。 这是我用来提取设备方向的代码。 获得重力作为加速度计的x,y,z 和罗盘是从标题函数的x,y,z获得的
gravity.normalize();
compass.normalize();
compassEast = gravity.cross(罗盘);
compassEast.normalize();
compassNorth = compassEast.cross(重力);
compassNorth.normalize();
如果您需要完整的代码,请告诉我。 此外,对于那些仍然看到iphone 4s陀螺仪在行动的人:它太神奇了!我把上面的输入交换到重力和指南针,用于陀螺仪的等效物,结果稳定,平滑,真棒:)去苹果。
答案 1 :(得分:2)
我没有收到源代码,但我设置了自己的示例。您可以在此处查看项目和代码:http://www.sundh.com/blog/2011/09/stabalize-compass-of-iphone-with-gyroscope/
答案 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));
}
...
}