iOS(和其他)的旋转加速度计输出到新的“中性”。

我在这里的工作正是我想要的。 我的问题是,它看起来过于复杂,是否有更快/更好的方式来做我在下面显示的pitchAngleRadians计算?

代码显示…(以及两个图像)

第一个图像是atan2计算自然是如何从iPad出来的,“pitchAngleRadians = atan2(accel [0],accel 2 );” (加速度计正常输出的是什么)

我想要的是将“零”移动到一个新的角度,在第二个图像中,我将它移动了一个-135度作为例子。 (代码中的所有内容都是弧度)所以例如本例中的变量“pitchNeutralAngle”是等于(-135)度的弧度

这段代码产生了我想要的变量“pitchAngleRadians”,这是第二个图像,但似乎太长了,而且这个代码处于一个紧密的运行循环中,所以如果我能够更清洁/更快,它会加速。

我经历了一个“范围”0到360度之间的中间步骤,所以穿过180度的边界不会搞砸计算,但是我仍然要把它恢复到0到180的forms,所以这是下一个计算是什么。

我已经对这段代码进行了一些测试,看起来确实有效。

//------------------------------------------------------------------------------------ - (void)accelerometer:(UIAccelerometer*)accelerometer didAccelerate:(UIAcceleration*)acceleration { accel[0] = (acceleration.x * kFilteringFactor) + accel[0] * (1.0 - kFilteringFactor); accel[1] = (acceleration.y * kFilteringFactor) + accel[1] * (1.0 - kFilteringFactor); accel[2] = (acceleration.z * kFilteringFactor) + accel[2] * (1.0 - kFilteringFactor); pitchAngleRadians = (atan2(accel[0], accel[2]) - pitchNeutralAngle); pitchAngleRadians = pitchAngleRadians - floorf(pitchAngleRadians/6.28318f)*6.28318f; if (pitchAngleRadians > 3.14159) pitchAngleRadians = -6.28318f + pitchAngleRadians; //float a = atan2(accel[0], accel[2]); //NSLog(@"a = %f", a); } 

自然来自加速度计

在重新“中和”零角度之后

您是否使用旧的3.x设备,还是可以依赖iOS 4.x? 一般来说,“旧的”UIAccelerometerDelegate很快就会被弃用,因为它被新的Core Motion框架取代(s。 为什么加速度计:didAccelerate:在IOS5中弃用? )

接下来,你在谈论有IMO陀螺仪的iPad(或者只是iPad 2?)。 如果您可以依赖具有一个的设备,那么您已经完成了Core Motion DeviceMotion,它可以提供准备好使用的欧拉角度而不会出现任何问题(可以记住万向节锁定)。 请参阅简单的iPhone动态检测 :

  • CMMotionManager startDeviceMotionUpdatesToQueue:withHandler:
  • CMDeviceMotionHandler
  • CMDeviceMotion的态度
  • CMAttitude球场
  • iOS事件处理指南/处理已处理设备 – 运动数据

您可以查看WWDC2010示例代码: WWDC 2010示例代码

如果没有,有没有机会说服你或你的商业伙伴? 好吧,你还在那里:-)嗯,atan和atan2有一些不连续性,你确定它适用于小x和y值的所有组合,即如果设备躺在桌子上没有或只有很小的运动但是一些传感器噪音?

关于性能:是的atan非常昂贵所以你可以使用FastMath.h之类的替代方案(它是法语的,但不用担心C ++的链接, 简单的fichier标题FastMath.h contenant