3

デバイスが上を向いているかどうかを検出したい。(角度はありませんが、地面に対して平らになります)。
上向きの一部のデバイスでは、z値は9〜10の値を返します。(ほとんどのデバイス)
ただし、Nexus 7では、上向きの場合、z値は6〜8の値を返します。

私のコードは:

if(z_value > 9.0) {
    // device facing up
}
else {
    // device is in angled
}

ただし、上記のコードは機能しなくなりました。Nexus7はz_valueの9に達しないため。

デバイスが(完全に)上を向いているかどうかを検出するにはどうすればよいですか。(z_value> 0を要求しない)

私の完全なコードは以下のとおりです。

@Override
protected void onStart() {
    super.onStart();
    try {
        sensorManager = (SensorManager)getSystemService(Context.SENSOR_SERVICE);
        List<Sensor> sensorList = sensorManager.getSensorList(Sensor.TYPE_ACCELEROMETER);
        if(sensorList.size() > 0){
            accelerometerPresent = true;
            accelerometerSensor = sensorList.get(0);  
        }
        else{
            accelerometerPresent = false;  
        }
        if(accelerometerPresent){
            sensorManager.registerListener(accelerometerListener, accelerometerSensor, SensorManager.SENSOR_DELAY_UI);
        }
    } catch(Exception e) {}
}

private SensorEventListener accelerometerListener = new SensorEventListener(){

            @Override
            public void onAccuracyChanged(Sensor arg0, int arg1) {}

            @Override
            public void onSensorChanged(SensorEvent arg0) {
                float z_value = arg0.values[2];
                Log.d("test", "z:" + z_value);
            }};

注#1
arg0.sensor.getMaximumRange()は、Nexus7に対して19.6133を返します。どのセンサーが戻ることはありません。

注#2
デバイスを振ると、z_valueは少し高くなる傾向があります(場合によっては8〜8.5)。デバイスを着実に傾けると、z_valueは8(最大)に達しません。

4

2 に答える 2

2

どうやら、デバイスのキャリブレーションが不十分です。適切に校正されたデバイスは、重力加速度である9.81m / s^2を返す必要があります。

代わりにできること:z値をxおよびy値と比較します。z値が、デバイスが上を向いているよりも支配的である場合。例えば:

if (z/sqrt(x^2+y^2+z^2+1.0e-6) > 0.9) { // Facing up

1.0e-6誤ってゼロで除算しないように、この用語を追加しました。

このヒューリスティックにはテストと調整が必要ですが、あなたはその考えを理解していると思います。幸運を!

于 2012-10-22T19:35:58.830 に答える
-1

この種のセンサーに関する一般的な考え方は、それらを回避するか、アプリケーションが本当に正確な測定に依存するような方法でそれらを悪用しないことです。

このセンサーの問題は、基本的に、値の範囲が非常に異なり、ノイズが多いため、コーダーであるユーザーが正規化する必要があり、精度の点でそれほど信頼できないことです。

この人前でのスピーチの正確な名前を忘れましたが、GoogleとAndroidチームでさえ、小数の点でこれにあまり依存しないか、高い精度を期待しないことを提案しています。また、このスマートフォンやタブレットのすべての小さな部分が本当に本当に安いことを覚えておいてください。私たちは通常1ドル以上の費用がかからないセンサーについて話しているのです。

コードが一般的な方向または軸のみを必要とする方法でコーディングしてみてください。値が必要な場合は、値が整数であることを確認し、常に大まかな計算を行い、精度や小数を期待しないでください。

また、Androidはこの値に対して正規化されたアプローチを提供していないため、コードでこれに対処する必要があることにも注意してください。

于 2012-10-22T19:28:00.030 に答える