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 。