iPhone上的陀螺仪

iPhone上的陀螺仪,第1张

概述我需要一些帮助使用陀螺仪在iPhone。我不能理解CMAttitude关于俯仰,侧倾和偏航在特定情况下的读数。 这是我的代码 - (void)handleDeviceMotion:(CMDeviceMotion*)motion { NSLog(@"Yaw %f ",attitude.yaw * 180 / M_PI); NSLog(@"Pitch %f ",attitude.pi 我需要一些帮助使用陀螺仪在iPhone。我不能理解CMAttitude关于俯仰,侧倾和偏航在特定情况下的读数。

这是我的代码

- (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上的陀螺仪所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/web/1087493.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-27
下一篇 2022-05-27

发表评论

登录后才能评论

评论列表(0条)

保存