2

「向き」を計算する必要があります(真北に基づくか磁気に基づくかは関係ありません)。iOSデバイスで見られるように、CLHeadingによって返されるオブジェクトは、CLLocationManager対応するプロパティによって真の方位と磁気方位の両方を提供します。また、これらの値はデバイスの上部(デバイスの座標系の正のY軸)に関連していることが非常に簡単にわかりますが、これは私の目的には適していません。

私が実際に必要としているのは、コンパスは必要ないので、デバイスの画面(Z軸)に関連するフェーシングを計算することですが、AGアプリケーションの王様です。問題は、デバイスを横向きに回転させると、向きの方向から左または右に見出しの値が表示されることです。これは、最終的に必要なものです。私が知っているように、私は磁力計の「生」データ(各デバイス軸の値が128から-128のマイクロテスラ単位で私に与えられた)をジャイロスコープの「生」データ(3つのタイプで提供されます:オイラーエンジェル、回転行列またはクォータニオン)。私が必要としているのは、「進行方向」ではなく「向き」の方向を取得するために、どの計算を適用する必要があるかを知ることです。

4

1 に答える 1

4

少し前に作ったのですが、答えが見つからないので、同じ質問の答えを検索する人のために、ここに私の解決策を置くことにしました...

_motionManager = [[CMMotionManager alloc]init];

    if (_motionManager.gyroAvailable) {
        _motionManager.deviceMotionUpdateInterval = 1.0/20.0;
        [_motionManager startDeviceMotionUpdatesToQueue:[NSOperationQueue currentQueue] 
                                            withHandler:^(CMDeviceMotion *motion, NSError *error) 
         {
             CMAcceleration gravity = motion.gravity;
             CGPoint tiltVector = CGPointMake(-gravity.x, -gravity.y);
             _tiltAngle = [self angleYAxisToVector:tiltVector];

             CLLocationDirection heaqding = [[SVSession sharedSession] heading].trueHeading;
             double newHeading = fmod(heaqding + _tiltAngle, 360.0);
             self.azimuth = degreesToRadian(newHeading);

             [self updateLocations]; //this function updates my ui for the new heading
         }];
    } else {
        NSLog(@"No gyroscope on device.");
        [_motionManager release],_motionManager = nil;
    }

そして、この例を理解するのに役立つ可能性のある追加のスニペットを次に示します。

-(double)angleYAxisToVector:(CGPoint)vector{
    double dX = vector.x;
    double dY = vector.y;

    if(dY == 0){
        if(dX > 0){
            return 0.0;
        }else{
            if(dX < 0){
                return 180.0;
            }else{
                return -1;
            }
        }
    }

    double beta = radiansToDegrees(atan(dX/dY));
    double angle;
    if(dX > 0){
        if (dY < 0){
            angle = 180 + beta;
        }else{
            angle = beta;
        }
    }else{
        if (dY < 0){
            angle = 180 + beta;
        }else{
            angle = 360 + beta;
        }
    }
    //    NSLog(@"angle = %f, normalized = %f",beta,angle);
    return angle; 
}

#define degreesToRadian(x)              (M_PI * (x) / 180.0)
#define radiansToDegrees(x)             ((x) * 180.0 / M_PI)
#define degreesToRadians(x)             degreesToRadian(x)
#define radiansToDegree(x)              radiansToDegrees(x)

ハッピーコーディング...

于 2012-03-06T15:22:58.397 に答える