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を持っているときでも、値は正しいです。ジャイロスコープで信頼できる方向データが必要で、遅れているコンパスを取り除きます。