iPhone上的陀螺仪

我需要一些帮助使用陀螺仪在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.yaw * 180 / M_PI);
   NSLog(@"Pitch %f ",attitude.pitch * 180 / M_PI);
   NSLog(@"Roll  %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.yaw * 180 / M_PI);
   NSLog(@"Pitch %f ",attitude.pitch * 180 / M_PI);
   NSLog(@"Roll  %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的基于纯加速度计的方法更加方便。

http://stackoverflow.com/questions/14528156/gyroscope-on-iphone

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:iPhone上的陀螺仪