Kompas a akcelerometr přesnost

hlasů
1

Udělal jsem můj vlastní aplikace v Android, které používají kompas a akcelerometru senzory pro zobrazení stupňů rotace a sklonu mého zařízení. inicializuje I všechny posluchače a objekty i potřeba (i následovalo několik výukových programů), a teď můžu chytit stupňů, jak jsem si přál. Problém je v tom, že opatření, která senzory vrátit nejsou přesné. Mám na mysli, i když se snažím zaokrouhlit hodnoty stupňů chytím ze snímače, které oscilují mezi - / + 7 (nebo 8) stupňů každém zlomku sekundy, i když i pobyt v trávě pole v dostatečné vzdálenosti od rušivého zdroje. To, co chci mít, je přesným měřítkem stupňů, něco jako způsob zaokrouhlení hodnot i přijímat ze senzorů.

    float[] mags = null;
    float[] accels = null;
    float[] R = new float[matrix_size];
    float[] outR = new float[matrix_size];
    float[] I = new float[matrix_size];
    float[] values = null;

    private void startSensor() {
    sensorMan.registerListener(this, sensorMan.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD), SensorManager.SENSOR_DELAY_UI);
    sensorMan.registerListener(this, sensorMan.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_UI);

}

@Override
public void onSensorChanged(SensorEvent event) {
    if (event.accuracy == SensorManager.SENSOR_STATUS_UNRELIABLE) {
        return;
    }

    switch (event.sensor.getType()) {
    case Sensor.TYPE_MAGNETIC_FIELD:
        mags = event.values.clone();
        break;
    case Sensor.TYPE_ACCELEROMETER:
        accels = event.values.clone();
        break;
    }

    if (mags != null && accels != null) {
        SensorManager.getRotationMatrix(R, I, accels, mags);
        // Correct if screen is in Landscape
        SensorManager.remapCoordinateSystem(R, SensorManager.AXIS_X,
                SensorManager.AXIS_Z, outR);

        SensorManager.getOrientation(outR, values);
        azimuth = (float) Math.round((Math.toDegrees(values[0]))*7)/7;
        azimuth = ( azimuth + 360)%360; 
        //here is inclination. The problem is just the same with compass
        //inclination=-Math.round((float) (values[1]*(360/(2*Math.PI))));

        //other code to update my view
        //in azimuth i have the degree value. It changes continuously
        //even if i aim still the same direction
    }
}
Položena 22/10/2010 v 18:18
zdroj uživatelem
V jiných jazycích...                            


3 odpovědí

hlasů
1

Viz moje odpověď zde: Vyhlazování dat ze snímače

Vedu tento filtr na obou akcelerometru a událostí magetometer hodnotami před předáním jim SensorManager.getRotationMatrix(). Myslím, že tento algoritmus má tu výhodu, že nemají mít velkou řadu historických hodnot, jen předchozí low-pass výstupní pole.

Algoritmus byl odvozen od tohoto vstupu Wikipedia: http://en.wikipedia.org/wiki/Low-pass_filter#Algorithmic_implementation

Odpovězeno 24/08/2011 v 13:24
zdroj uživatelem

hlasů
0

Udělal jsem to s použitím Kalmanova filtru odsud: Greg Czerniak web

Posílám data na UDP portu a hlazení ji na PC pomocí python. Ale myslím, že si můžete najít realizaci Kalmanova filtru pro Javu / android venku.

Odpovězeno 22/10/2012 v 14:40
zdroj uživatelem

hlasů
0

To, co vidíte, je skutečná věc-je jen dost dobré, aby vám hrubý kompas záhlaví orientaci senzory na většině telefonů.

Chcete-li vyhladit zobrazenou hodnotu ven, takže to vám dává něco, co se nezdá měnit náhodně doporučuji provádění http://en.wikipedia.org/wiki/Moving_average nebo jiný vyhlazovací filtr v Javě na tomto výsledku orientace.

Pro nejvyšší výkon byste mohl napsat filtr pomocí NDK a využít podporu Akumulátory knihovnu: http://www.boost.org/doc/libs/1_46_1/doc/html/accumulators.html

Odpovězeno 28/06/2011 v 21:14
zdroj uživatelem

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