iPhone陀螺仪-为什么偏航和俯仰连接?

iPhone陀螺仪-为什么偏航和俯仰连接?,iphone,gyroscope,Iphone,Gyroscope,我有一个非常简单的应用,我试图使用陀螺仪通过核心运动 此时,出于测试目的,我只需要获取滚动、俯仰和偏航的值,并在屏幕上打印。根据下面的图片,据我所知,横滚、俯仰和偏航对应于红、绿和蓝轴,对吗 嗯。当我把iphone放在左侧的桌子上(主页按钮在右侧),与桌子平面成90度角时,这些是我读取的横摇、俯仰和偏航值:-90、0、0。然后我开始按照桌子的垂直轴以逆时针的方式旋转iPhone,即按照桌子的垂直轴以正方向旋转。在iPhone上,这意味着俯仰旋转,但当我旋转时,俯仰保持不变,偏航是变化的 如果iP

我有一个非常简单的应用,我试图使用陀螺仪通过核心运动

此时,出于测试目的,我只需要获取滚动、俯仰和偏航的值,并在屏幕上打印。根据下面的图片,据我所知,横滚、俯仰和偏航对应于红、绿和蓝轴,对吗

嗯。当我把iphone放在左侧的桌子上(主页按钮在右侧),与桌子平面成90度角时,这些是我读取的横摇、俯仰和偏航值:-90、0、0。然后我开始按照桌子的垂直轴以逆时针的方式旋转iPhone,即按照桌子的垂直轴以正方向旋转。在iPhone上,这意味着俯仰旋转,但当我旋转时,俯仰保持不变,偏航是变化的

如果iPhone放在桌子的左侧,绿色轴(节距)是垂直的。如果我在X轴上逆时针(正)旋转设备,我会看到俯仰角增加,而不是偏航

我对此的唯一解释是,旋转设备时陀螺仪轴不旋转。因此,如果我使用默认的姿态参考,iPhone会认为面朝上的静止位置是默认的,而蓝色轴(偏航)将始终是垂直的。这是正确的吗

这是我正在使用的代码

关于主代码

motionManager = [[CMMotionManager alloc] init];
motionManager.deviceMotionUpdateInterval = 1.0/60.0; //60 Hz
[motionManager startDeviceMotionUpdates];


timer = [[NSTimer scheduledTimerWithTimeInterval:(1.0/60.0) 
          target:self
    selector:@selector( readIt )
userInfo:nil
 repeats:YES]
 retain];
剩下的代码

#define degrees(x) (180.0 * x / M_PI)

- (void) readIt {

//  CMAttitude *referenceAttitude;
    CMAttitude *attitude;

    CMDeviceMotion *motion = motionManager.deviceMotion;        
    if (!motion) {
        return;
    }

    attitude = motion.attitude;

    NSLog(@"roll = %f... pitch = %f ... yaw = %f", degrees(attitude.roll), degrees(attitude.pitch), degrees(attitude.yaw));


}

有关这方面的更多信息,请查看my。我认为答案特别能告诉你为什么这两者是联系在一起的。

听起来像是万向节锁的问题,特别是在处理俯仰旋转时。你可以看看


或类似的文章描述了这一现象。解决方案取决于您在应用程序中需要什么。在大多数情况下,您应该避免使用Euler角度,而是采用旋转矩阵或四元数表示。好吧,我知道,有时候这是不可能的。一个很好的起点可能是WWDC 2010茶壶核心运动示例。

这还取决于陀螺仪在手机机身内的物理位置。如果它不完全在旋转的中心,它将得到所有值的混合。如果它位于示例图片上绿色应用程序图标的位置,但您正在轴箭头相交的灰色球处旋转手机…好的,谢谢,但音高变化为零。即使它创造了一个混合的变化,它应该改变一些东西,但它根本没有改变。改变的是偏航。换句话说,我沿着绿色轴旋转它,我看到蓝色轴上的变化,而不是预期的绿色轴上的变化…’所以你问为什么轴相对于地面而不是相对于手机?不,我问的是为什么偏航变化(而不是俯仰)当我改变音高,旋转设备时轴是否会改变,或者轴始终固定在地面参考上?+1对于漂亮的图片:-)如果你将iPhone平放在桌子上,而不是放在它的边缘上(如果这就是你所说的“尺寸”的意思),会发生什么?如果你把它翻过来会怎么样?等等