Aus Accelerometer daten Rauschen rausfiltern?

  • Antworten:12
  • OffenNicht stickyNicht beantwortet
  • Forum-Beiträge: 21

22.09.2018, 16:25:53 via Website

Wisst ihr, ob es eine möglichkeit gibt aus accelerometerdaten rauschen rauszufiltern, ohne an genauigkeit zu verlieren. Für meinen Zweck müssen immer noch feine Bewegungen erkannt werden. Gerade habe ich permanent ausschläge, auch, wenn das gerät bloß rumliegt.

Diskutiere mit!
  • Forum-Beiträge: 2.901

22.09.2018, 18:18:56 via Website

Die Peeks musst du selbst nach Wunsch abfangen und am Besten einstellbar , weil sie immer unterschiedlich sind.

Liebe Grüße - Stefan
[ App - Entwicklung ]

Hilfreich?
Diskutiere mit!
Pascal P.
  • Mod
  • Blogger
  • Forum-Beiträge: 10.165

22.09.2018, 18:34:50 via App

Hallo SlartiDev,
du kannst auch einen Kalman-Filter dafür implementieren.
Das dürfte auch helfen.

LG Pascal //It's not a bug, it's a feature. :) ;)

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 21

23.09.2018, 11:28:26 via Website

@Pascal
ja, den Begriff habe ich schon öfter gelesen. Ich habe auch schon versucht das ganze zu verstehen, doch da fehlt mir leider das Mathematische Werkzeug zu. Ist doch schon ein bisschen Kompliziert (bzw. wirkt es so auf mich :) )

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 811

24.09.2018, 00:19:27 via Website

Eine sehr simple Form der Tiefpassfilterung kann auch einfach in Mittelwertsbildung oder gleitender Mittelwertsbildung bestehen. Einige einfache Programmierbeispiele finden sich hier:

https://rc-maker.com/filter-in-arduino/

Quelle: rc-maker.com

— geändert am 24.09.2018, 00:20:21

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 21

24.09.2018, 11:09:28 via Website

Ich habe mich jetzt an fsensor gehalten.
Ich hab da ein wahrscheinlich simples problem:
Ich habe die repsitories in die build.gradle project wie folgt eingetragen:

allprojects {
repositories {
    google()
    jcenter()
    maven { url "https://jitpack.io" }
}

}

und in die build.gradle Method:

dependencies {
implementation fileTree(include: ['*.jar'], dir: 'libs')
implementation 'com.android.support:appcompat-v7:27.0.2'
implementation 'com.android.support.constraint:constraint-layout:1.1.2'
implementation 'com.github.KalebKE:FSensor:v1.2'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'

}

In meinem Code kann ich die klassen importieren, jedoch kennt er die Methoden der Klassen, die ich benutzten will, nicht.
z.B.

filter.filter(accelerator);

die einzige methode, die mir für mein BaseFilter Object vorgeschlagen wird ist reset().
was anderes wird nicht akkzeptiert...

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 2.901

24.09.2018, 11:16:59 via Website

Mit einer Zeile Code kann man natürlich nichts anfangen .

Hast du dir mal die API und deren Usages angesehen ?
Da sehe ich nichts so, wie du es verwendet hast

— geändert am 24.09.2018, 11:18:19

Liebe Grüße - Stefan
[ App - Entwicklung ]

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 21

24.09.2018, 12:30:44 via Website

Dit klingt für mich gerade nach Latein :) Was genau meinst du mit Api (also was eine API ist weis ich, aber nicht auf was ich in diesem zusammenhang achten soll) und Usages.
Das was ich gemacht habe ist einen BaseFilter filter = new LowPassFilter(); zu deklarieren und zu instantieren.
danach versuche ich wie in der Anleitung der Entwickler*innen die Methode filter.filter() anzuwenden, doch die gibt es nicht...

Hilfreich?
Diskutiere mit!
Pascal P.
  • Mod
  • Blogger
  • Forum-Beiträge: 10.165

24.09.2018, 12:40:49 via App

Du musst schon das Filter im passenden Typ deklarieren.
LowPassFilter filter = new LowPassFilter()

LG Pascal //It's not a bug, it's a feature. :) ;)

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 2.901

24.09.2018, 12:45:27 via Website

Also ich habe mir jetzt mal schnell die Library eingebunden.

In der Dokumentation steht drin , dass du auch den gewünschten Filter angeben musst.
NICHT den BaseFilter

Und wenn du es so anwendest wie folgt :

LinearAcceleration filter = new LinearAcceleration()
    {
        @Override
        public float[] getGravity() {
            return new float[0];
        }
    };
    filter.filter (averagingFilter);

Oh wunder :-)
Steht aber so auch in der Doku.

P.S ich nehme jetzt die Lib wieder bei mir raus ..... ich müsste auch fertig werden

— geändert am 24.09.2018, 12:47:48

Liebe Grüße - Stefan
[ App - Entwicklung ]

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 21

01.10.2018, 09:18:44 via Website

Schande auf mein haupt...
Hätte ich wissen müssen. Ich habe jetzt das ganze implementiert wie in der dokumentation beschrieben:

lowPassFilter = new LowPassFilter();
    linearAccelerationFilter = new LinearAcceleration(lowPassFilter) {
        @Override
        public float[] getGravity() {
            return new float[0];
        }
    };
    lowPassFilter.setTimeConstant(5);

und in onSensorChanged:

    Sensor mySensor = sensorEvent.sensor;
    //if Sensor is LinearAcceleration
    if (mySensor.getType() == Sensor.TYPE_ACCELEROMETER) {
        try{
            //filtering the acceleration
            System.arraycopy(sensorEvent.values, 0, acceleration, 0, sensorEvent.values.length);
            filteredAcceleration = lowPassFilter.filter(acceleration);
            filteredAcceleration = linearAccelerationFilter.filter(filteredAcceleration);

        }catch (Exception e){
            Log.e("Low Pass Filter", ""+e);
        }

Jedoch krige ich immer den gleichen Error:
E/Low Pass Filter: java.lang.ArrayIndexOutOfBoundsException: length=0; index=0
nach meinem Verständnis versucht der linearAccFilter an einer stelle des Arrays zu arbeiten, die es nicht gibt. Es sollte ja nur drei geben (x,y,z). Habt ihr ne Ahnung, was da falsch läuft?
Danke schon mal im vorraus... :)

Hilfreich?
Diskutiere mit!

Empfohlene Artikel