2017-10-04 7 views
0

目的は、ユーザーが携帯電話を横に動かす量を検出することです。最も単純なシナリオでは、ホームボタンが天井に面しているテーブルの上に電話機が平らであるとします。iOS:ユーザーの移動電話を左右に検出する(回転しないで、移動する)

ユーザがテーブルに沿って電話機を左右にスライドさせると、移動した量をどのように検出できますか?

以下のコードは、正しい値を登録していないよう:

let motionManager = CMMotionManager() 

override func update(_ currentTime: TimeInterval) { 
    processUserMotion(forUpdate: currentTime) 
}  

func processUserMotion(forUpdate currentTime: CFTimeInterval) { 
     // 2 
    if let data = motionManager.accelerometerData { 
     // 3 
     if fabs(data.acceleration.x) > 0.2 { 
      // 4 How do you move the ship? 
      print("X Acceleration: \(data.acceleration.x)") 
     } 

     if fabs(data.acceleration.y) > 0.2 { 
      // 4 How do you move the ship? 
      print("Y Acceleration: \(data.acceleration.y)") 
     } 

     if fabs(data.acceleration.z) > 0.2 { 
      // 4 How do you move the ship? 
      print("Z Acceleration: \(data.acceleration.y)") 
     } 
    } 
} 

答えて

2

加速度計は加速度を測定します。あなたは、携帯電話が左右に動いたときに、ある程度の加速を見ることができ、左/右の動きが止まるときの減速を見ることができます。

理論的には、位置を計算しようと試みるために加速度を数回積分することができます(基本物理/微積分では加速度を積分して速度を求め、速度を積分して位置を得ることができます)。

実際に、加速度計データはあまりにも不正確であり、それぞれの積分ステップで誤差が拡大されるため、適度な精度で動作するのは騒音です。

絶対的な位置に頼らないようにデザインを変更することをお勧めします。別の方法として、カメラと画像処理を使ってARKitを調べることができます(カメラに何も見えないので、テーブルに置いてある電話機の例では機能しませんが)。

あなたが疑問に思っているのは、ローテーションがはるかに簡単である理由は、加速度計が重力を加速度として測定するということです。それでジャイロ(回転を測定する)は見出し/方位角をかなり正確に確立するのに十分正確であり、蓄積された誤差から生じるドリフトを補正するために磁気コンパスと組み合わせることができる。

デバイスの回転を制御方法として置き換えることは、簡単なことに聞こえるが、実際は非常に難しい/非実用的なものの1つです。

+0

ありがとうございます!実際には、テーブルの例は、問題を単純化するために工夫されています。実際のユースケースでは、片手で携帯電話を持ち、画面上に親指を置いて、片手でゲームをプレイするための標準的な位置に似ています。あなたはこの位置から言っていますか?ARKitでは、ユーザーがデバイスを左/右にどれだけ移動させるかを簡単に測定できますが、ARKitでは実際には実用的ではありませんでした。 – Crashalot

+0

はい、私はかなりARKitがこれを行うことができると確信しています。私は自分自身でARKitを使用していないので、コードに組み込むのがどれほど簡単か、他の合併症があるかどうかについては話すことができません(例えば、遅れているか、あなたが忙しい街の風景などで使っていると混乱してしまいます)私はちょうど知らないです – Columbo

+0

十分に公正な、あなたがこれを行うことができるARKitについて正しいと願っています! – Crashalot

関連する問題