2017-08-29 6 views
2

私はデバイスの傾きを取得したいので、私はこれを使用してデバイスの表面上にデバイスを置いて、いくつかの表面の傾きを測定することができます。xamarin形式でデバイスの傾きを取得するにはどうすればよいですか?

今私はここにhttps://github.com/rdelrosario/xamarin-plugins

、下のコードからxamarinフォームのデバイスモーションプラグインを使用しています:

CrossDeviceMotion.Current.Start(MotionSensorType.Accelerometer)。

CrossDeviceMotion.Current.SensorValueChanged += (s, a) => 
    { 

     switch (a.SensorType) 
     { 
      case MotionSensorType.Accelerometer: 
       { 
        Debug.WriteLine("A: {0},{1},{2}", ((MotionVector)a.Value).X, ((MotionVector)a.Value).Y, 
        ((MotionVector)a.Value).Z); 
        Exposicao.Inclinacao = ((MotionVector)a.Value).Z; 
        break; 
       } 
      case MotionSensorType.Compass: 
       { 
        // Debug.WriteLine("H: {0}", a.Value); 
        Exposicao.Bussola = (double)a.Value.Value; 
        break; 
       } 
     } 
    }; 

コンパスの部分は大丈夫ですが、加速度計の部分は機能していますが、いくつかがあります。

もし私が間違っていなければ、私はZ軸の傾きを得ます。だからz.Value.Value。

この値はandroidとiosで異なり、androidでのフォーカスが可能です。

zの値は、デバイスが平坦な面に置かれている場合は10、デバイスが起立している場合は0になり、1つの象限のみにフォーカスが移ります。

私は説明したことを達成するために何か間違っていますか?

これらの値を0と90の間の角度に変換するにはどうすればよいですか?それは線形ではないように見えるので、5は45度に見えません。

おかげ

答えて

2

私はおそらくあなたが探している機能のための私自身のプラットフォームの実装をロールアウトすると思います。 DeviceMotionライブラリは、以下の答えからわかるように、目的に合わせて少しシンプルに見えます。私はあなたが良い出発点としてそれを使うことができると確信していますが、それは少し拡張する必要があります。

Androidでは、あなたは、デバイスの回転の正確な測定を得るために(加速度計、磁力計とジャイロスコープで)カルマン・フィルタを使用していますRotation Vector Sensorを使用する必要がありますアンドロイド:

回転ベクトルをデバイスが、軸と軸との組み合わせとしてのデバイスの向きを表し、デバイスが軸(x、y、またはz)の周りに角度θだけ回転した。 enter image description here

Image from the official Android documentation

のiOS:iOS用

、あなたはもう少し自分で作業しなければなりません。キーは、最初の姿勢に対するデバイスの姿勢を表すCMAttitudeを利用することです。

public void CalculateLeanAngle() 
{   
    motionManager = new CMMotionManager(); 
    motionManager.DeviceMotionUpdateInterval = 0.02; 

    if (motionManager.DeviceMotionAvailable) { 
     motionManager.StartDeviceMotionUpdates(CMAttitudeReferenceFrame.XArbitraryZVertical, NSOperationQueue.CurrentQueue, (data, error) => { 
      CMQuaternion quat = motionManager.DeviceMotion.Attitude.Quaternion; 
      double x = quat.x; 
      double y = quat.y; 
      double w = quat.w; 
      double z = quat.z; 
      double degrees = 0.0; 

      //Roll 
      double roll = Math.Atan2 (2 * y * w - 2 * x * z, 1 - 2 * y * y - 2 * z * z);       
      degrees = Math.Round (-applyKalmanFiltering (roll) * 180.0/Constants.M_PI); 
    }); 
} 

public double applyKalmanFiltering (double yaw) 
{ 
    if (motionLastYaw == 0) 
     motionLastYaw = yaw; 

    float q = 0.1f; // process noise 
    float r = 0.1f; // sensor noise 
    float p = 0.1f; // estimated error 
    float k = 0.5f; // kalman filter gain 

    double x = motionLastYaw; 
    p = p + q; 
    k = p/(p + r); 
    x = x + k * (yaw - x); 
    p = (1 - k) * p; 
    motionLastYaw = x; 

    return motionLastYaw; 
} 

enter image description here

Image from the official Xamarin documentation

I'LL:私は、未知のソースからの私のコレクションに保存したスニペット(オリジナルの作者に入金することはできません)ここを見つけました私はもっ​​と時間があるときに元のソースを探してみてくださいが、これはあなたの目的のために箱の外で動作することをかなり確信しています。

+0

hankideさん、ありがとうございました。非常に正確ですが、精度は必須ではありません。なぜなら、私はプラグインを使い始めたからです。しかし、改善する時間があれば、試してみましょう。プラグイン番号(度) – gilberto

+0

@gilberto Ok、意味があります。うまくいけば誰かがもっと簡単な解決法を持っているといいでしょう – hankide

+0

@gilberto最後に問題を解決できましたか? – hankide

関連する問題