Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iPhone上的陀螺仪_Iphone_Ios_Ipad_Accelerometer_Gyroscope - Fatal编程技术网

iPhone上的陀螺仪

iPhone上的陀螺仪,iphone,ios,ipad,accelerometer,gyroscope,Iphone,Ios,Ipad,Accelerometer,Gyroscope,我需要一些在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

我需要一些在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分钟或更长时间)。偏航不断增加。你知道如何补偿漂移吗

先谢谢你

更新 我采纳了凯的建议,但没有任何改变。关于我的代码的更多细节。我希望仅当用户绕偏航轴旋转设备时,才使用偏航旋转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);
}
这是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) 奇怪的角度 乍一看,我把情况误认为是遇到了一些与经济有关的典型问题。因为他们离这个问题领域很近,而且需要记住这一点,所以我保留了原始答案的这一部分。欧拉角问题包括:

  • 模糊性,因为旋转状态和欧拉角表示之间的关系不是双射的,即一组角度描述一个旋转,但一个旋转可以由多组欧拉角表示。在您的问题的图3中,您可以通过
    1:偏航=30°,2:俯仰=90°
    1:俯仰=90°,2:滚转=30°
  • 问题:可能会失去一个自由度,设备无法再绕其中一个轴旋转。解决方案是使用四元数或旋转矩阵
但正如你在评论中所说,真正的罪魁祸首似乎是参照系。从iOS 5.0开始,苹果增强了传感器融合算法,并考虑磁场数据来计算Cmatitude。尽管仍然存在旧方法,但它现在使用默认参考,因此所有测量都与“Z轴垂直,X轴指向水平面上的任意方向”相关

为了在开始(或任何其他旋转)时获得与参考相关的数据,您需要存储所需的
CMAttitude
实例作为参考,然后使用
CMAttitude
的方法转换每个新的姿态,即在
handleDeviceMotion
方法开始时

(2) 偏航漂移 我认为这与iOS 6中的一个bug有关,就像我在中描述的一样,因为它在以前的版本中工作正常。我提出了一个错误-让我们看看他们什么时候能解决它


更新2


正如评论和聊天显示的那样,目标是通过倾斜设备来控制机器人。在这种情况下,当改变行走方向时,知道设备的完全旋转状态会扰乱控制。因此,使用纯加速度计的方法更加方便。

+1对于提出的问题!我会帮你处理所有的传感器陀螺仪磁强计和加速度计我不认为万向节锁是答案。我不认为万向节锁是答案。我把我的手机放在一个偏航,俯仰和滚动都不同于0的位置。我像上一张图片一样在圆圈内移动设备,并改变偏航。很可能,我误解了有关报告角度的框架参考。@Kay,谢谢你的完整解释。我已经更新了我的代码,但得到了相同的结果。请看我最新的问题。@Kay是的,这种情况发生了。。。当我看到90度角和欧拉角时,我不再阅读更多内容。我只是断定它是万向节锁。@Fabrizio
if(startAttitude==0){
我不确定,但我总是写
if(startAttitude==nil){