iphone罗盘倾斜补偿

iphone罗盘倾斜补偿,iphone,accelerometer,compass-geolocation,tilt,Iphone,Accelerometer,Compass Geolocation,Tilt,有人已经为iphone罗盘方向倾斜补偿编程了吗 我有一些方法,但一些帮助或更好的解决方案会很酷 首先 我定义了一个向量Ev,由Gv和Hv的叉积计算得出。Gv是由加速度计值构成的重力矢量,Hv是由磁强计值构成的航向矢量。 电动汽车垂直于Gv和Hv,所以它正朝着水平向东行驶 第二 我定义了一个向量Rv,由叉积Bv和Gv计算得出。Bv是我的寻找向量,它被定义为[0,0,-1]。Rv垂直于Gv和Bv,并始终向右显示 第三 这两个矢量Ev和Rv之间的角度应为我的修正航向。为了计算角度,我建立了点积和arc

有人已经为iphone罗盘方向倾斜补偿编程了吗

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

首先 我定义了一个向量Ev,由Gv和Hv的叉积计算得出。Gv是由加速度计值构成的重力矢量,Hv是由磁强计值构成的航向矢量。 电动汽车垂直于Gv和Hv,所以它正朝着水平向东行驶

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

第三 这两个矢量Ev和Rv之间的角度应为我的修正航向。为了计算角度,我建立了点积和arcos

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

理论上它应该能工作,但也许我必须规范化向量

有人能解决这个问题吗


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

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

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

是的。你一定要正常化。 这是我用来提取设备方向的代码。 重力由加速度计的x、y、z获得 罗盘由航向函数的x,y,z得到

重力。归一化(); compass.normalize(); COMPASSEST=重力十字(指南针)
compassEast.normalize()
compassNorth=compassEast.cross(重力); compassNorth.normalize()

如果您需要完整的代码,请告诉我。
另外,对于那些还没有看到iPhone4S陀螺仪运行的人来说:这太神奇了!我将上面输入的重力和指南针与陀螺仪的等效物进行了交换,结果稳定、平滑且令人敬畏:)Go Apple。

我没有收到源代码,但我建立了自己的示例。您可以在此处查看项目和代码:

是否可以查看源代码?这让我好奇。你能把源代码发给我吗fyasar@gmail.com拜托?我对代码也很感兴趣。我的电子邮件:ellen.sundh[在]gmail.com谢谢!