我在这里的工作正是我想要的。我的问题是它似乎过于复杂,是否有更快/更好的方法来进行下面显示的pitchAngleRadians计算?
显示代码......(连同两张图片)
第一张图片是atan2计算自然来自iPad的方式,“pitchAngleRadians = atan2(accel [0],accel 2);” (加速度计正常推出的内容)
我想要的是将“零”移动到新的角度,在第二张图像中,我将它移动了-135度作为示例。 (代码中的所有内容都是弧度)所以例如本例中的变量“pitchNeutralAngle”是相当于(-135)度的弧度
这段代码正好产生了我想要的变量“pitchAngleRadians”,这是第二张图片,但似乎太长了,而且这段代码处于一个紧密的运行循环中,所以如果我能得到这个更清洁/它会加速更快。
我经历了一个“测距”0到360度之间的中间步骤,这样穿过180度的边界并不会弄乱计算,但是我仍然要把它恢复到0到180的形式,这就是下一次计算的内容。
我已经对这段代码进行了一些测试,看起来确实有效。
//------------------------------------------------------------------------------------
- (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);
}
答案 0 :(得分:1)
您是否使用旧的3.x设备,还是可以依赖iOS 4.x?一般来说,“旧的”UIAccelerometerDelegate很快就会被弃用,因为它被新的Core Motion框架取代了。 Why is accelerometer:didAccelerate: deprecated in IOS5?)
接下来,你在谈论有IMO陀螺仪的iPad(或仅仅是iPad 2?)。如果您可以依赖具有一个的设备,那么您已经完成了Core Motion DeviceMotion,它可以提供准备使用的欧拉角度而没有任何问题(可以记住万向节锁定)。看到 Simple iPhone motion detect特别是:
您可以查看WWDC2010示例代码:WWDC 2010 Sample Code
如果没有,有没有机会说服你或你的商业伙伴?好吧,你还在那里:-)嗯,atan和atan2有一些不连续性,你确定它适用于小x和y值的所有组合,即如果设备躺在桌子上没有或只有很小的运动但是一些传感器噪音?
关于性能:是的atan非常昂贵所以你可以查看使用FastMath.h之类的替代品(它是法语的,但不用担心 C ++ en un simple fichier header FastMath.h contenant