Proč mé zrychlení reaguje tak pomalu?

hlasů
1

Já jich ptát na 50Hz / 50 krát za sekundu pro data. Když jsem najednou otočit zařízení na ose x o 90 stupňů, když bylo zařízení bytu na stůl s displejem směrem nahoru bevore hodnoty pohybují docela pomalu na hodnotu „cílové“ pro tuto pozici.

Nyní je divná věc je: Mám-li zvýšit na měření rychlosti, bude hodnota pohybovat rychleji na tuto novou hodnotu při náhle obracející přístroj o 90 stupňů. Ale když jsem se zeptat jednou za sekundu pro nové hodnoty, trvá to velmi dlouho, dokud hodnota nedosáhne cíle. Co může být důvodem pro to?

Nechci dělat jakékoliv agregace dat, a nic se hromadí. Jen jsem udělat nějaké jednoduché filtrování, jak se zbavit hluku. Moje metoda vypadá takto:

- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration {
    // Use a basic low-pass filter to only keep the gravity in the accelerometer values for the X and Y axes
    // accelerationX is an instance variable
    accelerationX = acceleration.x * 0.05 + accelerationX * (1.0 - 0.05);

    // round
    int i = accelerationX * 100;
    float clippedAccelerationValue = i;
    clippedAccelerationValue /= 100;

    [self moveViews:clippedAccelerationValue];
}

Později, ve svých -moveViews: metody, já to následujícím způsobem:

-(IBAction)moveSceneForPseudo3D:(float)accelerationValue {
    if(fabs(lastAccelerationValue - accelerationValue) > 0.02) { // some little treshold to prevent flickering when it lays on a table
        float viewAccelerationOffset = accelerationValue * 19 * -1;

        newXPos = initialViewOrigin + viewAccelerationOffset;
        myView.frame = CGRectMake(newXPos, myView.frame.origin.y, myView.frame.size.width, myView.frame.size.height);

        lastAccelerationValue = accelerationValue;
    }
}

Výsledkem je, že zařízení je obrácen o 90 stupňů na x-achsis nebo 180 stupňů, pohled právě pohybuje poměrně pomalu, to je polohy cíle. Nevím, jestli je to kvůli fyzice akcelerometry, nebo jestli je to chyba v mém filtrování kódu. Já jen vím, že existuje rychlá hry, kde jsou použity akcelerometry pro řízení, takže jsem skoro nedovedu představit, že je to problém hardware.

Položena 11/05/2009 v 10:14
zdroj uživatelem
V jiných jazycích...                            


1 odpovědí

hlasů
8

Tento řádek:

accelerationX = acceleration.x * 0.05 + accelerationX * (1.0 - 0.05);

je nízká propust, který funguje tak, že výpočetní klouzavý průměr x zrychlení. Jinými slovy, pokaždé, když se nazývá zpětné volání, jste v pohybu pouze accelerationXo 5% na novou hodnotu akcelerometru. To je důvod, proč to trvá mnoho iterací před accelerationXreflektuje novou orientaci.

Co byste měli udělat, je zvýšit 0.05hodnotu, tj 0.2. Řekl bych, aby globální #definea pohrajte si s různými hodnotami spolu s různými obnovovací frekvence.

Odpovězeno 11/05/2009 v 20:03
zdroj uživatelem

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