Android: Akcelerometr falešné detekce

hlasů
3

Mám fragmentu kódu pro detekci pohybu akcelerometru. Funguje nějaký čas řádně detekovat nepatrné pohyby, ale někdy zjistí pohyb, když jsem držel můj přístroj nečinný příliš. Jsou tam nějaké problémy s vestavěným-in detekci akcelerometr o Androidu?

Používám HTC G-1 zařízení. Můj fragment kódu je uveden níže. Jak mohu řešit to, abych mohl detekovat malé pohyby přístroje, ale nic rozpoznat, kdy je zařízení v nečinnosti?

private static final int SHAKE_THRESHOLD = 50;

public void onSensorChanged(int sensor, float[] values) {

    if (sensor == SensorManager.SENSOR_ACCELEROMETER) {
        long curTime = System.currentTimeMillis();
        // only allow one update every 100ms.
        if ((curTime - lastUpdate) > 100) {
            long diffTime = (curTime - lastUpdate);
            lastUpdate = curTime;

            x = values[SensorManager.DATA_X];
            y = values[SensorManager.DATA_Y];
            z = values[SensorManager.DATA_Z];

            float speed = Math.abs(x+y+z - last_x - last_y - last_z) / diffTime * 10000;

            if (speed > SHAKE_THRESHOLD) { 
                long curTime = System.currentTimeMillis();
                long diff = (curTime - shakeTime);              
                shakeTime = curTime;

                if (myFlagIgnoreShakeDetection==true)  //Caused unneccessary accelerometer   
                                                       //notification looping when device is idle
                   return;

                // Doing something...
            }
         last_x = x;
         last_y = y;
         last_z = z;
        }

    }

}
Položena 27/10/2009 v 14:31
zdroj uživatelem
V jiných jazycích...                            


2 odpovědí

hlasů
1

Zde je několik kód nesrovnalosti ...

  • Tam může být problém, pokud jde o aktualizaci last_x, last_ya last_z. Domnívám se, že by měly být zahrnuty uvnitř v if ((curTime - lastUpdate) > 100) {prohlášení. Jinými slovy, oni jsou aktualizovány pokaždé, když onSensorChangedse říká, ne každých 100 milisekund. Pravděpodobně byste měli přesunout aktualizaci těchto tří proměnných do složená závorka nad nimi.

  • Na řádku, kde si spočítat speed, vzorec končí ... / diffTime * 10000;Jste chtít vynásobit právě diffTimetím 10000, nebo celý výsledek? Vzhledem k tomu, /a *obvykle mají stejný operátor přednost ve většině jazyků vím (např Javě ), bude váš rovnice být vyhodnocovány zleva doprava, dělení nejprve diffTime pak vynásobením tohoto výsledku od 10000.

    Hádám, znamená vynásobit právě diffTimeod 10000, čímž se dělí konečný výsledek o příslušnou částku. To je rozdíl mezi dělením 10000 nebo vynásobením 10000, což znamená, že jste pravděpodobně stále hodnoty speed, které jsou 10 ^ 8 větší, než jste měl, tedy vypínací práh, i když je zařízení v klidovém stavu. Musíte dát závorek násobení, jako je ... / (diffTime * 10000);, aby se ujistil, že to provedl před rozdělení uskuteční.

    Navíc, pokud máte v úmyslu škálovat diffTimeod milisekund až sekund, vaše měřítko by mělo být 1000.

Odpovězeno 27/10/2009 v 15:12
zdroj uživatelem

hlasů
0

Já osobně podle mého rozšířené knihovně reality pomocí klouzavý průměr pro aktualizace:

float kFilteringFactor = (float)0.05;    
rollingZ = (float) ((rawZValue * kFilteringFactor) + (rollingZ * (1.0 - kFilteringFactor)));

To vede k vyhlazení dat docela dobře, a můžete vyladit filtrační faktor získat odezvu chcete.

rawZValue je syrové hodnota přichází z akcelerometru.

Odpovězeno 27/10/2009 v 22:51
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more