如何从iPhone的X,Y,Z加速度计读数计算加速度/减速度

我正在写一个iPhone / iPad应用程序。 需要计算加速度和减速度不规则的接近水平线的行驶方向上的加速度和减速度。 我有来自X,Y,Z正交加速度计的3个读数的序列。 但iphone / ipad的方向是任意的,加速度计读数包括车辆运动和重力的影响。 结果应该是一系列单一的加速度值,根据车辆是减速还是加速,这些值是正值还是负值。 只要加速度与减速符号相反,正负方向是任意的。 重力应该被排除在结果之外。 结果的一些可变的平滑将是有用的。

解决scheme应该尽可能简单,并且必须具有计算效率。 答案应该是某种伪代码algorithm,C代码或一系列方程式,可以很容易地转换成C代码。 Objective C中的iPhone特定解决scheme也可以。

谢谢

分离引力和运动是非常困难的。 如果您可以使用陀螺仪和指南针信号分析数据,则更容易。

陀螺仪测量angular度旋转的速率。 它的积分在理论上是angular度方向(加上一个未知的常数),但是积分会受到漂移的影响,所以它本身是无用的。 加速度计测量angular度方向加上重力加线性加速度。 有了一些适度复杂的math,你可以从这两个传感器的数值中分离出所有这3个数量。 添加指南针将XY平面(其中Z是重力)固定到绝对坐标系。

看到这个伟大的演示。

跟踪加速度的平均值。 这会给你一个“下”的参考。 然后从个别读数中减去平均值。

你需要考虑平均值计算的灵敏度,因为例如在高速公路上长时间缓慢转弯会导致平均值缓慢地向外漂移。

如果你想弥补这一点,你可以使用GPS跟踪来计算粗粒度的全局加速度来校准加速度计。 事实上,您可能会发现,区分GPS速度读数本身就可以提供足够的绝对加速度(我还没有尝试过,所以我不能说)。

你将需要一些三angular函数,例如获得你所需要的大小

magn = sqrt(x*x+y*y+z*z); 

得到你需要atan的angular度,那么c函数atan2更好

 xyangel = atan2(y,x); xymagn = sqrt(x*x+y*y); vertangle = atan2(z,xymagn) 

没有如何得到负面和正面的幅度是任意的,你可以例如将π/ 2 <xyangle <3π/ 2解释为负值。 那将会用x的符号表示magn的符号,但从y取符号同样有效

使用userAcceleration 。

您不必了解如何从加速计读数中消除重力,以及如何考虑方向: 它已经在Core Motion Framework中实现