这是我的代码
- (voID)handleDeviceMotion:(CMDeviceMotion*)motion { NSLog(@"Yaw %f ",attitude.yaw * 180 / M_PI); NSLog(@"Pitch %f ",attitude.pitch * 180 / M_PI); NSLog(@"Roll %f ",attitude.roll * 180 / M_PI);}
让我们假设iPhone正躺在一架飞机上,如下图所示:
俯仰,滚转和偏转(几乎)为0度,并且绕轴的任何转动都返回可理解的读数。例如,向右转动设备,偏航减小,俯仰和摇摆保持为0。
现在iPhone处于以下位置:
并再次开始测量。
读数是:Yaw = 0,Pitch = 90,Roll = 0
由于设备围绕该轴旋转,间距增大。
将iPhone移动到此位置:
读数为:Yaw = 30,Pitch = 90,Roll = 0
再次,由于设备围绕偏航轴旋转,该值改变,而其他值不改变。
围绕滚动轴移动设备:
读数为:Yaw = 0,Pitch = 90,Roll = -20。
现在我不明白。围绕半径R(R> 0)的圆移动iPhone,如图中所示:
偏航变化同时俯仰和滚转不。
我本来希望Yaw保持不变,Roll改变了。
如何补偿这一点,因为我只专注于绕用户的Yaw轴旋转?
另一个问题是漂移。 iPhone处于第二张图所描述的位置,在我的手中静置很长时间(1分钟或更长时间)。偏航不断增加。任何想法如何补偿漂移?
先谢谢你
更新
我跟着凯的建议,但没有改变。关于我的代码的一些更多细节。我想使用Yaw旋转UIImage只有当用户围绕偏航轴旋转设备。
这个工作,但是当用户绕自己的垂直轴旋转时,Yaw改变。我想这是不正确的,因为当用户围绕其垂直轴移动时,设备不围绕其自身的偏航轴旋转。可能是我错了。这是我的原始代码:
- (voID)handleDeviceMotion:(CMDeviceMotion*)motion { CMAttitude *attitude = motion.attitude; NSLog(@"Yaw %f ",attitude.roll * 180 / M_PI); image.transform = CGAffinetransformMakeRotation(-attitude.yaw);}
这是Kay建议后的代码:
- (voID)handleDeviceMotion:(CMDeviceMotion*)motion { CMAttitude *attitude = motion.attitude; if (startAttitude == 0) { startAttitude = attitude; } [attitude multiplyByInverSEOfAttitude:startAttitude]; NSLog(@"Yaw %f ",attitude.roll * 180 / M_PI); image.transform = CGAffinetransformMakeRotation(-attitude.yaw);}
我用启动设备运动监控
[motionManager startDeviceMotionUpdatesUsingReferenceFrame:CMAttitudeReferenceFrameXArbitraryZVertical toQueue:[NSOperationQueue currentQueue] withHandler: ^(CMDeviceMotion *motion,NSError *error){ [self performSelectorOnMainThread:@selector(handleDeviceMotion:) withObject:motion waitUntilDone:YES]; }];解决方法 [全面修订]
(1)奇怪角度
乍一看,我把这种情况误认为是一个与Euler Angles有关的典型问题。因为他们接近这个问题领域,真的很重要,我离开这部分的原始答案。欧拉角问题有:
>模糊性,因为旋转状态和欧拉角表示之间的关系不是双射的,即一组角度描述一个旋转,但旋转可以由多于一组的欧拉角表示。在你的问题的图。 3,您可以通过1:Yaw = 30°,2:Pitch = 90°或1:Pitch = 90°,2:Roll = 30°
> Gimbal Lock问题:您可能失去一个自由度,设备不能再围绕其中一个轴旋转。解决方案是使用四元数或旋转矩阵。
但正如你在你的评论中所说,真正的罪魁祸首似乎是参考框架。从iOS 5.0开始苹果增强了传感器融合算法,并考虑磁场数据以及计算CMAitude。虽然仍然有旧方法startDeviceMotionUpdates,它现在使用默认参考CMAttitudeReferenceFrameXArbitraryZVertical,所有测量与“Z轴是垂直的,水平面中的任意方向上的X轴点”相关。
为了在开始时(或任何其他旋转)获得关于引用的数据,您需要存储要作为引用的CMAttitude实例,然后使用CMAttitude的multiplyByInverseOfAttitude方法来转换每个新的态度,即在handleDeviceMotion方法的开始。
(2)偏航漂移
我认为这是相关的iOS 6中的一个BUG,像我在Drifting yaw angle after moving fast中描述的一个BUG,因为它以前在以前的版本工作正常。我提出了一个错误 – 让我们看看他们什么时候修复它。
更新2
由于评论和聊天显示的目标是通过只倾斜设备来控制机器人。在这种情况下,知道装置的完全旋转状态是改变步行方向时的麻烦控制。因此,使用CMDeviceMotion.gravity的基于纯加速度计的方法更加方便。
总结以上是内存溢出为你收集整理的iPhone上的陀螺仪全部内容,希望文章能够帮你解决iPhone上的陀螺仪所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)