自由落下中、iPhone は 3 つの軸すべてで加速度値を 0 として送信することになっています。では、iPhone が移動した距離を検出するにはどうすればよいでしょうか。
10 に答える
ニュートンの法則を信用しないでください。空気抵抗や iPhone の回転などは無視されます。代わりに経験的なアプローチを使用してください。デバイスを 1m、2m、5m、10m、30m のように複数の高さから落下させます。各高さで数回繰り返します。秋ごとに時間を測定します。スプラインによる近似結果。逆関数を計算します。
最も単純で単純な実装は、加速度計データをサンプリングし、次の式を使用することです。
v+=a*dt;
d+=v*dt;
しかし、これは時間の経過とともにドリフトを引き起こす可能性があります。理由とより良い解決策については、これを読んでください:http: //gafferongames.com/game-physics/integration-basics/
加速度計がゼロを報告している場合は、モーションがいつ完了したかを判断するのに問題があります。
したがって、衝突時の減速度を決定し、次に減速度の開始時の最高速度を決定し、これから逆方向に作業します。線形運動、終端速度と空気抵抗の欠如、線形減速(おそらく)、そしてあなたの電話がまだ機能していると仮定します!
スタンディングスタートから
距離=0.5x加速度x時間2
重力加速度=9.81m / s 2
終端速度に達するのに十分な距離まで電話を落としていないと仮定します。もしそうなら、私はあなたが電話を回復するときにあなたのアプリが大いに役立つだろうとは思わない:)
風の抵抗の問題を考慮に入れる1つの解決策は、重力による加速度と実際に読んでいる加速度のノルムとの差を使用できることです。
d 2 x / dt 2 = g-| a |
ここで、g=9.8および|a| = sqrt(a 1 2 + a 2 2 + a 3 2)ここで、 anは各軸の加速度計からの読み取り値です。
次に、オイラー法のようなものを使用して、微分方程式を数値的に解きます。
GPSを使用してgのローカル値を賢く検索することもできます。
空気抵抗を無視する:
float t; // time since drop
float distance = 9.81f * 0.5f * t * t;
より長い距離(飛行機からのドロップ)の場合は、位置情報サービスを使用することもできます。CLLocationには高度が含まれています。
距離=0.5*gravityAcceleration * timeOfFall 2
最も単純な形で。
iPhoneのフォームファクタと重量、およびハードウェアが落下するときに役立つ距離を考えると、空気の摩擦と風を安全に省くことができます。;)
ただし、パラシュートを開く前に携帯電話を自由落下させる場合は、加速度計自体に基づいて距離を確実に計算するには、数えるには要素が多すぎます。読み取り値は非常に不安定であり、その主な目的はデバイスの向きを判断したり、潜在的な自由落下を検出したりすることであるため、このようなアプリケーションにはおそらく適していません(同様の加速度計チップが使用されているノートブックの場合)。
空気摩擦を考慮する必要があるため、これは非常に単純です。空気摩擦により、デバイスは「a」終端速度に到達します。終端速度でのみ、加速度計は0を示します。
ここに示す式は、ボイド内での自由落下(摩擦なし)を想定しています。
言い換えれば、移動距離を計算するのはかなり複雑です(1つの問題は、終端速度が落下中の電話の向きに依存することです)。
また、電話はあらゆる種類の落下シナリオで転倒する可能性が非常に高いことに注意してください. 携帯電話のプロファイルが変化すると、抗力が変化し、加速度計の読み取り値がゼロになりません。