Android デバイスが移動したかどうかを確認するにはどうすればよいですか? 「動いた」とは、テーブルの上に置いてあるものを誰かが持ち上げると、動いたことを検出できることを意味します。ジャイロセンサーを使用することを考えていましたが、それが最善の解決策であるかどうかはわかりません。
1849 次
2 に答える
1
加速度計を使用してこれを解決できます。デバイスに外力がない場合、加速度センサーの値のベクトル和は重力のみになります。重力のベクトル和が変化すると、力が発生します。この力が大きい場合は、デバイスが動いていると見なすことができます。
ベクトルの合計が +/- しきい値の重力と等しい場合、安定してテーブルに横たわっています。
コードは次のようになります (注: 以下の MovingAverage は、加速度計の 50 サンプルの移動平均を意味します)
bool IsDeviceStill(const sensors_event_t& event)
{
if (event.type == SENSOR_TYPE_ACCELEROMETER) {
const vec3_t acc(event.data);
/*Avoiding square root for better performance*/
float vecsum = acc.x*acc.x + acc.y*acc.y + acc.z*acc.z;
vec3_t variance = mVariance->movingAverage(vecsum);
vec3_t var = mOffsetAvg->movingAverage(abs(variance.x - vecsum));
ALOGE("Current variance x:%f AvgVarianc:%f ",variance.x,var.x);
if(var.x < 2) /*Threshold is 2, Standard deviation should less than 2 */
mDeviceStill = true;
else
mDeviceStill = false;
}
ALOGE("%s Device is still:%d\n", __FUNCTION__, mDeviceStill);
return mDeviceStill;
}
于 2014-10-30T04:23:23.917 に答える
1
最小限の動きを検出したい場合、選択肢はあまりないと思います。ジャイロスコープ/加速度計センサーが最適です。加速度計には多少のゆらぎがあるため、そこでもフィルタリングを追加する必要があります。
GPS は、テーブルから手への移動を検出するのに使用できるほど正確ではありません。
近接センサーを監視することはある程度役立つかもしれませんが、それをトリガーするものは何でもブロックし、電話が動いているかどうかは実際にはわかりません.
バッテリーをたくさん消費したい場合は、カメラを使用してください。画像が動いているかどうかを判断するフィルターを介して一部の入力をストリーミングします。
于 2013-02-19T07:58:34.257 に答える