0

iPhoneの内部ジャイロスコープを正しく読み取るのに問題があります。

私は、磁力計に基づいた拡張現実エンジンを開発しました。ジャイロスコープは磁力計よりも信頼性の高い値を提供するため、エンジンを改善したいと考えていました。

さて、問題は、iPhoneが横向きモードの場合、北を基準にしてジャイロスコープの値がうまく機能することです。しかし、横向きと縦向きの間で iPhone を移動すると、値が間違っています。加速度計に基づいてオフセットを計算しようとしましたが、まだ正しく機能しません。2 つ目の問題は、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を持っているときでも、値は正しいです。ジャイロスコープで信頼できる方向データが必要で、遅れているコンパスを取り除きます。

4

1 に答える 1

0

これは、ジャイロスコープとコンパスを一緒に使用して遅れているコンパスを取り除き、正確なものを保持する記事です: http://www.sundh.com/blog/2011/09/stabalize-compass- of-iphone-with-gyroscope/

于 2013-03-27T12:15:43.280 に答える