INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Beschleunigungssensor Daten Filtern
29.09.2015, 12:33
Beitrag #1
Beschleunigungssensor Daten Filtern
Hallo alle zusammen!

Ich habe mich schon auf einigen Seiten eingelesen nur leider fehlt mir die Lösung für mein Problem. Ich möchte gerne meine gemessene lineare Beschleunigung zweimal integrieren um die Strecke bzw. die Position des Sensors zu erhalten.

Bei meiner Recherche bin ich auf den KalmanFilter gestoßen. Gibt es ein fertigen Code bzw eine Funktion die diesem Filter in Arduino realisiert?
Diese Seite habe ich gefunden:
https://github.com/TKJElectronics/KalmanFilter

Wie kann ich diesen in mein Arduino Programm einbauen?
Ist mein Ansatz überhaupt richtig? Werde ich bei der zweifachen Integration mit den gefilterten Bescheleunigungswerten (X,Y,Z) korrekte Werte für meine Geschwindigkeiten und Strecken erhalten?

Ohne Filter kommen nur fehlerhafte Werte raus.

Habt vielen Dank für Eure Hilfe! Smile

Gruß
Marduino_UNO
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
29.09.2015, 17:14
Beitrag #2
RE: Beschleunigungssensor Daten Filtern
Hi,
naja, wenn Du nur einen Sensor hast, dann dürfte ein Kalman-Filter nicht funktionieren. Du bräuchtest dazu z.B. noch ein GPS. Dann könntest Du die Daten vom GPS und vom Sensor kombinieren.
Wenn Du nur einen Beschleunigungssensor hast, dann addieren sich Fehler wahrscheinlich sehr schnell auf. Vielleicht hast Du aber auch einen Fehler im Coding. Wenn Du es mal zeigst, dann hätten wir eine Chance, was dazu zu sagen.
Gruß,
Thorsten

Falls ich mit einer Antwort helfen konnte, wuerde ich mich freuen, ein paar Fotos oder auch ein kleines Filmchen des zugehoerigen Projekts zu sehen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
29.09.2015, 18:44 (Dieser Beitrag wurde zuletzt bearbeitet: 29.09.2015 20:02 von HaWe.)
Beitrag #3
RE: Beschleunigungssensor Daten Filtern
Zitat:naja, wenn Du nur einen Sensor hast, dann dürfte ein Kalman-Filter nicht funktionieren.
Ein Kalmanfilter funktioniert schon mit 1 Sensor, aber dann ist es so ähnlich wie mit einem Lowpassfilter, nur ein wenig anpassungsfähiger.

Einen eigenen Kalman zu schreiben, um damit mehrere Sensoren zu fusionieren (und dann wschl sogar noch einen Extended Kalman verwenden zu müssen), ist aber mathematisch mit den ganzen Matrizen ( Determinanten, Dreiecksformen und Inversen, ganz zu schweigen davon, die ganzen Standardabweichungen aller verwendeten Sensoren exakt eingeben zu können), schon seeeehr anspruchsvoll.... Undecided

Andererseits ist fürs 2-fache Integrieren von Beschleunigung, um die Strecke zu kriegen, ein Kalman zunächst ja gar nicht nötig:

d s = v*d t = 1/2 *a*d

Der Knackpunkt ist die Erdbeschleunigung bei auch nur leichter Schieflage, die dann das Ergebnis verhagelt, plus extremes Sensorrauschen.
Ein GPS ist zu ungenau und zu träge, um das rauszurechnen. Eher dann schon Odometrie plus Gyro. Das ist auch schon mal gemacht worden

(im Englischen nennt man diese Koppel-Navigation "Dead Reckoning", vllt finde ich den passenden Artikel dazu....)

aber wie gesagt...
sääääähr schwääääre Kost.... Sad


ps...
aaahhh.... hier ist er !


Angehängte Datei(en)
.  Improvement of Dead Reckoning Accuracy of a Mobile Robot by Slip Detection and Compensation using Multiple Model Approac (Größe: 684,07 KB / Downloads: 59)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
01.10.2015, 08:02
Beitrag #4
RE: Beschleunigungssensor Daten Filtern
Hallo zusammen!

Vielen Dank für Eure Antworten.

Also mein Code zur zweifachen Integration ist folgender:
Die Deklarationen habe ich weggelassen

--------------------------------------------------------------------------------
#include<Wire.h>
#include "NAxisMotion.h"

NAxisMotion mySensor;
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
I2C.begin();
mySensor.initSensor();
mySensor.setOperationMode(OPERATION_MODE_NDOF);
mySensor.setUpdateMode(MANUAL);
mySensor.updateAccelConfig();
}
float LoopTime = 10.0;
float accY;
void loop() {
// put your main code here, to run repeatedly:
mySensor.updateLinearAccel();
accY = mySensor.readLinearAccelY();
Start = millis(); //Gibt den Zeitpunkt zu Begin in Millisekunden

// 1. Integration -> Geschwindigkeit
VSollY = (accY *LoopTime/1000) + VSollYold;
if (abs(accY)>0.0) //Nur Integrieren wenn Beschleunigung groesser Null
{
// 2. Integration -> Position / Strecke
PosSollY = kGain*(VSollY * LoopTime/1000) + PosSollY;
//Verstaerkungsfaktor kGain da Werte sehr klein
}
else
{
VSollY =0.0;
}

Stop = millis();
LoopTime = Stop - Start;
}
----------------------------------------------------------------------------------

Ich messe direkt die lineare Beschleunigung. Ist der Knackpunkt mit der Erdbeschleunigung nicht egal?

Ich kann die angehängte Datei leider nicht öffnen.

Gruß
Marduino_UNO
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
01.10.2015, 11:09
Beitrag #5
RE: Beschleunigungssensor Daten Filtern
Hi,
da kann natürlich einiges schief laufen, aber eins sieht man relativ schnell:
LoopTime ist wahrscheinlich meistens 0, da zwischen der Ermittlung von Start und Stop bestimmt keine ganze Millisekunde vergeht. Du musst das ganze anders herum machen: Überlege Dir die Abtastfrequenz und sorge dafür, dass die Ermittlung in dieser Frequenz stattfindet. Das kann man schon mit millis() machen, aber so, dass man am Anfang von loop abfragt, ob seit dem letzten mal z.B. 10ms vergangen sind.
Gruß,
Thorsten

Falls ich mit einer Antwort helfen konnte, wuerde ich mich freuen, ein paar Fotos oder auch ein kleines Filmchen des zugehoerigen Projekts zu sehen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
01.10.2015, 14:44
Beitrag #6
RE: Beschleunigungssensor Daten Filtern
Vielen Dank für die schnelle Antwort.

Ja das mit der LoopTime ist mir auch aufgefallen, daher habe ich versucht erst mal mit einer konstanten LoopTime von 10ms zu arbeiten. Ich habe gemerkt, dass ich nur durch einen Serial.println-Befehl schon 43ms länger für den Loop benötige.
Das mit der Abtastfrequenz verstehe ich nur bedingt. Ich habe mir mal das Beispiel "BlinkwithoutDelay" angesehen. Dort steht folgende Abfrage:
if(currentMillis - previousMillis >= interval) {......} Sprich im Intervall X die LED ein- bzw. ausschalten. Könnte ich dann nicht auch schreiben: im Intervall = 2ms führe die Integration aus?

Vielen Dank für Eure Unterstützung!

Gruß
Marduino_UNO
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Daten Visualisieren MeisterQ 12 535 01.12.2016 19:36
Letzter Beitrag: MeisterQ
  Data Logger Daten auf SD Card schreiben Crichton 12 267 22.11.2016 18:32
Letzter Beitrag: Crichton
  I2C Daten übertragen Gandalf 3 210 04.11.2016 13:20
Letzter Beitrag: hotsystems
  Daten über USB verarbeiten Felix91 10 318 12.10.2016 13:00
Letzter Beitrag: Tommy56
  Can-Bus Shield ok, aber keine Daten Clubsport 38 1.531 01.09.2016 14:17
Letzter Beitrag: Clubsport
  Daten an mysql diode1990 24 1.296 31.07.2016 10:29
Letzter Beitrag: Gandalf
  NRF24L01,Empfangene Daten auswerten Marc2014 9 515 30.07.2016 19:34
Letzter Beitrag: rkuehle
  Serielle Schnittstelle - Daten empfangen Datatom 8 772 22.05.2016 18:10
Letzter Beitrag: avoid
  Interrupt wenn softwareSerial Daten BennIY 3 440 01.05.2016 18:39
Letzter Beitrag: tiny85fan
  Daten per Ethernet Shield 2 senden Mark79 3 859 22.03.2016 19:29
Letzter Beitrag: Mark79

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste