iOS 5/6陀螺仪北参考

时间:2012-11-09 12:27:36

标签: iphone ios rotation compass-geolocation gyroscope

我有一个问题是正确读出iphone的内部陀螺仪。

我开发了一种基于磁力计的增强现实引擎。由于陀螺仪提供的值比磁力计更可靠,我想改进发动机。

现在,问题是,如果iphone处于横向模式,陀螺仪的值(以北为参考)效果很好。但如果我在风景和肖像之间移动iphone,价值观是错误的。我试图根据加速度计计算偏移量,但它仍然无法正常工作。第二个问题是,如果iphone处于纵向模式并向后滚动,罗盘数据会跳跃180度。

_mmanager.deviceMotionUpdateInterval = 1/60.0;
_mmanager.accelerometerUpdateInterval = 1.0/90.0;
[_mmanager startDeviceMotionUpdatesUsingReferenceFrame:CMAttitudeReferenceFrameXTrueNorthZVertical];

// queue to get accelation data
NSOperationQueue *motionQueue = [[NSOperationQueue alloc] init];
[_mmanager startAccelerometerUpdatesToQueue: motionQueue withHandler:^(CMAccelerometerData *data, NSError *error) {
    _xacc = (data.acceleration.x * 0.1) + (_xacc * (1.0 - 0.1));
    _yacc = (data.acceleration.y * 0.1) + (_yacc * (1.0 - 0.1));
    _zacc = (data.acceleration.z * 0.1) + (_zacc * (1.0 - 0.1));
}];


// in my update method
double gyx = _mmanager.deviceMotion.attitude.yaw;
double gyy = _mmanager.deviceMotion.attitude.roll;
double gyz = _mmanager.deviceMotion.attitude.pitch;

// sidewise rotation of the iphone to calculate a offset
double rotation = fmod(((atan2(-_yacc, _xacc)+M_PI/2)*180/M_PI)+180, 360);
// heading with compass data and offset just work perfectly
double compassheding = fmod(_lmanager.heading.trueHeading+rotaion, 360);


double gyroheading = -gyx*180/M_PI-90;

if(gyroheading < 0){
    gyroheading = gyroheading+360;
}

// same offset as obove. but wont work correctly.
double ro2 = fmod(((atan2(-_yacc, _xacc)+M_PI/2)*180/M_PI)+180, 360);
head = fmod(head+ro2, 360);

现在我的问题是,如何正确地读出带有北向参考的陀螺仪并计算偏移量,因此当我将iphone放在眼前时,如同制作照片时,这些值仍然是正确的。我只想用陀螺仪获得可靠的航向数据并摆脱落后的罗盘。

1 个答案:

答案 0 :(得分:0)

它可以帮助你,这里有一篇文章,其中陀螺仪和指南针一起使用摆脱滞后指南针仍然有一些准确的东西: http://www.sundh.com/blog/2011/09/stabalize-compass-of-iphone-with-gyroscope/