适用于X和Y的iOS四元数

时间:2013-12-29 22:10:34

标签: ios gyroscope

已经过了几天试图弄清楚没有运气,有时它有效,有些则没有,所以我认为我做错了什么,

我想做的是让iPhone充当演示屏幕的激光(使用appleTV)

因此,将设备指向屏幕的某个位置,它实际指向那里。

我正在尝试使用CMAttitude.yaw和Pitch来校准它,因此用户首先定义左上角和右下角,然后获取它们之间的比例值,以获得实际位置,

但是,我总是得到不同的值,我无法计算稳定的比例

enter image description here

我现在正在做的是:

  1. 启动动作管理器

        mMotionManager = [[CMMotionManager alloc] init];
    mMotionManager.deviceMotionUpdateInterval = .02;
    
    //[mMotionManager startDeviceMotionUpdates];
    [mMotionManager startDeviceMotionUpdatesUsingReferenceFrame:CMAttitudeReferenceFrameXArbitraryZVertical];
    
  2. 分两步进行校准

    if(mCalibrationStatus == 0){
    mMinX = [self getYaw];
    mMinY = [self getPitch];
    
    mCalibrationStatus++;
    
    NSLog(@"MinX %f -- MinY: %f", mMinX,mMinY);
    

    } 否则if(mCalibrationStatus == 1){     mMaxX = [self getYaw];     mMaxY = [self getPitch];     mCalibrationStatus ++;     NSLog(@“MaxX%f - MaxY:%f”,mMaxX,mMaxY); }

  3. 计算职位

    float rangeX = mMaxX + mMinX;     float sX = [self getYaw] / rangeX;

    float rangeY = mMaxY + mMinY;
    float sY     = [self getPitch]/rangeY;
    
    if(pShouldDebug){
        NSLog(@"RangeX [%f, %f, %f] ==> %f",mMinX, [self getYaw], mMaxX, rangeX);
        NSLog(@"ScaleX: %f",sX);
    
        NSLog(@"RangeY [%f, %f, %f] ==> %f",mMinY,[self getPitch], mMaxY, rangeY);
        NSLog(@"ScaleY: %f",sY);
    }
    
    return CGPointMake(sX*mScreenSize.width, mScreenSize.height - sY*mScreenSize.height);
    
  4. 得到偏航和滚动:

        -(float) getYaw{
        return mMotionManager.deviceMotion.attitude.yaw;
        //return mMotionManager.deviceMotion.attitude.quaternion.x;
    }
    
    -(float) getPitch{
        return mMotionManager.deviceMotion.attitude.pitch;
        //return mMotionManager.deviceMotion.attitude.quaternion.y;
    }
    

    它有时只能起作用......所以我认为这个想法是正确的,但获得角度的方法并不好..

    我非常感谢这里的任何帮助,非常感谢你!

0 个答案:

没有答案