2017-08-25 4 views
2

私は加速度計に問題があります。IOS iphone加速度計の重力の影響を取り除く

デバイスがフラットになっている場合は、明らかに正しくない(0、0、-1)が表示されます。電話機を回転させると、この-1は電話機の位置に応じて他の軸に移動します。

私はこれまでのところ非常に簡単なコードを持っている:

override func viewDidAppear(_ animated: Bool) { 

    motionManager.accelerometerUpdateInterval = 0.1 
    motionManager.startAccelerometerUpdates(to: OperationQueue.current!){(data,error) 
     in 
     if let myData = data { 
      print(Double(myData.acceleration.y) ) 
    } 
+2

なぜ正しくないのですか?地球の重力のために一定の-1gがあります。 – Paulw11

答えて

2

あなたは重力が含まれる生の加速を、アクセスしています。これは、実際には(0、0、-1)がであることを意味していることが明らかです。です。

もう少し安定している(そして重力ベクトルを無効にしたい)場合は、デバイスの動きを使用してください。デバイスのモーションインターフェイスから得られるデータは、センサ融合フィルタリング方法を使用してフィルタリングされ、安定化されるため、加速度データはより正確になります。

import UIKit 
import CoreMotion 

class ViewController: UIViewController { 

    let motionManager = CMMotionManager() 

    override func viewDidAppear(_ animated: Bool) { 
     super.viewDidAppear(animated) 

     motionManager.deviceMotionUpdateInterval = 0.1 
     motionManager.startDeviceMotionUpdates(to: .main) { (motion, error) in 
      if let motion = motion { 
       var x = motion.userAcceleration.x 
       var y = motion.userAcceleration.y 
       var z = motion.userAcceleration.z 

       // Truncate to 2 significant digits 
       x = round(100 * x)/100 
       y = round(100 * y)/100 
       z = round(100 * z)/100 

       // Ditch the -0s because I don't like how they look being printed 
       if x.isZero && x.sign == .minus { 
        x = 0.0 
       } 

       if y.isZero && y.sign == .minus { 
        y = 0.0 
       } 

       if z.isZero && z.sign == .minus { 
        z = 0.0 
       } 

       print(String(format: "%.2f, %.2f, %.2f", x, y, z)) 
      } 
     } 
    } 
} 

ところで、これはすべてthe docsの最初の段落にあります。 rotation-生の加速度計データ、生のジャイロデータ、生の磁力計データ、および加速度計を含む処理デバイスモーションデータ(:

CMMotionManagerのインスタンスを作成したら、それを使用することができ、アプリケーションは、4つの動きのタイプを受信します速度、および姿勢の測定値)。 Core Motionのセンサ融合アルゴリズムによって提供される処理されたデバイス動作データは、デバイスの姿勢、回転速度、較正された磁場、重力の方向、およびユーザがデバイスに与える加速度を与える。

+0

親愛なるアレン、私はそれを設定するために新しいファイルにこのコードを追加...それは未解決の識別子ですmotionManagerを言う? –

+0

このエラーは、あなたが 'motionManager'を作成していないことを意味します。私が提供したコードは、あなたの質問に含まれているコードを置き換えることを意図していました。スタンドアロンの状況では不完全です。 –

+0

@DamianTalagaもっと明示的に私の例を更新しました。 –

関連する問題