CMDeviceMotion の userAcceleration フィールドから予期しない読み取り値が表示されます。CMAccelerometerData から生の加速度計データを見ると、iPhone がテーブルの上に平らに置かれている場合、読み取り値は 1G 真っ直ぐ下 (-Z 軸で 1G) であり、iPhone を落とした場合 (もちろん柔らかい面に) あることがわかります。加速度計の読み取り値は、予想どおりゼロになります。それは大丈夫です。代わりに CMDeviceMotion クラスを使用すると、iPhone がテーブルに平らに置かれている場合、userAcceleration の読み取り値は予想どおりゼロになります。これまたいいですね。しかし、iPhone を落として CMDeviceManager の userAcceleration を読み取ると、userAcceleration の値は 1G であり、予想どおり下 (-Z) ではありません。userAcceleration の読み取り値は、実際にはデバイスが実際に経験している加速度とは正反対のようです。他の誰かがこれを観察しましたか?速度と位置を統合しようとする前に、すべての userAcceleration 値を反転 (-1 を掛ける) することはできますか、それとも userAcceleration が読み取っているものを誤解していますか?
2 に答える
CMAccelerometerData.accelerationとCMDeviceMotion.userAccelerationにはいくつかの概念上の違いがあります。
- 生の加速度計データは、測定されたすべての加速度の合計、つまりデバイスの重力と現在の加速度の組み合わせです。
- デバイスのモーション データは、加速度計、ジャイロスコープ、磁力計の 3 つのセンサーすべてのセンサー フュージョンの結果です。このように偏りやエラーは (理論的には) 排除され、残りの加速度データは便利に使用できるように重力と加速度に分離されます。
したがって、両方を比較したい場合は、同じものと同じものを比較するためにチェックする必要がありCMAccelerometerData.acceleration
ますCMDeviceMotion.userAcceleration + CMDeviceMotion.gravity
。
一般に、正確な値とハードウェアの独立性が必要な場合は、ほとんどの場合、CMDeviceMotion が最初の選択肢になります。
考慮すべきもう 1 つの点は、startDeviceMotionUpdatesUsingReferenceFrameを介してデバイス モーションの更新を開始するときに提供するCMAttitudeReferenceFrameです。基本バージョンのstartDeviceMotionUpdatesを使用するときのデフォルトが何であるかわかりません
値を統合して速度と位置を取得したいと述べました。これについてはいくつかの議論があり、結論として、合理的な結果を得ることは不可能であると言えます。見る:
アプリのコンセプトが 0.5 秒以上正確な結果に頼らざるを得ない場合は、それを変更してみてください。