陀螺仪在iPhone(Gyroscope on iPhone)

2019-07-18 17:55发布

我需要用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是在以下位置:

与测量重新开始。

读数是:偏航= 0,间距= 90,无障碍= 0

因为设备围绕该轴线旋转时,间距增大。

移动iPhone到这个位置:

读数是:偏航= 30,间距= 90,无障碍= 0

再次,由于设备周围的偏航轴线,该值的变化和其他不旋转。

移动绕侧倾轴的设备:

读数是:偏航= 0,间距= 90,无障碍= -20。

现在我无法理解。 移动iPhone周围半径R的圆(R> 0),如在该图中:

偏航变同时俯仰和横滚没有。

我本来期望偏航一直保持不变,轧辊发生了变化。

因为我有兴趣专门围绕偏航轴的旋转由用户做出如何弥补呢?

我有另外一个问题是漂流。 iPhone是在第二图中所描述的位置,在静止时间长(1分钟以上)的我的手作出。 偏航不断加大。 任何想法如何补偿漂移?

先感谢您

UPDATE我跟随凯建议,但没有任何变化。 在我的代码的一些更详细。 我想用偏航仅旋转的UIImage的当用户绕横摆轴旋转的装置。 这工作,但是当用户绕其自身的垂直轴的偏转改变。 我想,是不是因为当绕其垂直轴线用户移动,设备不围绕其自身的偏航轴旋转正确。 也许是我错了。 这是我原来的代码:

- (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);
}

这是凯建议后的代码:

- (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];
                                                           }];

Answer 1:

[完全修订]

(1)角奇异

乍一看,我误以为形势运行到相关的一些典型问题欧拉角 。 因为他们是接近这个问题的地区,真正重要的是要记住,我离开了原来的答案,这部分。 欧拉角度的问题是:

  • 歧义,如旋转状态和欧拉角表示之间的关系并不双射即一组角度描述了一个旋转,但旋转可以通过一组以上的欧拉角来表示。 。在你的问题的图3中可以通过任一实现相同的旋转1: Yaw=30°, 2: Pitch=90°或由1: Pitch=90°, 2: Roll=30°
  • 万向锁的问题:你可能会失去一个自由度和设备不能再绕轴之一。 的解决方案是使用四元数或旋转矩阵。

但是当你在您的评论指出真正的罪魁祸首似乎是参考帧。 与iOS 5.0开始苹果提高了传感器融合算法,并考虑磁场数据以及计算CMAttitude。 虽然还有旧方法startDeviceMotionUpdates ,它现在使用默认参考CMAttitudeReferenceFrameXArbitraryZVertical使得所有测量涉及“Z轴是垂直方向和在水平平面内的任意方向X轴点 ”。

为了获得关于在启动参考(或任何其他旋转)你的数据,你需要存储的CMAttitude要用作参考实例,然后使用CMAttitude的multiplyByInverseOfAttitude方法在你的开始改变每一个新的态度,即handleDeviceMotion方法。

(2)偏航漂移

我认为这是关系到像我所描述的在iOS 6中的错误沙僧偏航角快速移动后 ,因为它在使用以前版本的做工精细。 我申请的错误 - 让我们来看看,当他们要去解决它。


更新2

评论和聊天显示,目标是通过刚好倾斜设备来控制机器人。 在这种情况下知道该设备的完整的旋转状态改变行走方向时是搞乱控制。 因此,使用纯加速度计为基础的方法CMDeviceMotion.gravity是更为方便。



文章来源: Gyroscope on iPhone