Glättung der Daten des Beschleunigungsmessers zur Filterung der Schlaglocherkennung

Ich wollte einen separaten Thread starten, der sich auf das Glätten von Filtern und das Erkennen von Unebenheiten und Schlaglöchern mit einem Arduino und meinem Beschleunigungsmesser konzentriert. Ich verwende einen analogen Beschleunigungsmesser, der auf 50 Hz Bandbreitenabtastung bei 100 Hz eingestellt ist. Ich zeichne Daten mit MegunoLink (GROSSES Tool BTW). Meine Delemma ist, dass die Messwerte des Beschleunigungsmessers höllisch laut sind, besonders in einem Auto mit laufendem Motor und Straßengeräuschen. Was wäre der beste Weg, um das Rauschen herauszufiltern? Ich nehme mit 100 Hz ab. Ich bin mir nicht sicher, wie ich einen Filter implementieren soll, der die Abtastrate nicht beeinflusst ... Ich bin mir auch nicht sicher, ob 100 Hz zum Abtasten ausreicht, es scheint jedoch die Bump-Ereignisse ziemlich gut zu erfassen (Grafiken gepostet).

Beschleunigungsmesser ist ein KXPS5-3157

Ich habe die Ausgabe des Beschleunigungsmessers in Gforce konvertiert, sollte ich Gforce verwenden oder sollte ich die Rohspannung verwenden, oder es spielt keine Rolle für die Schlaglochanwendung

Hier mein bisheriger Code:

    #include <GraphSeries.h>

GraphSeries g_aGraphs[] = {"Z"}; //Z acceleration graph label for Meguno

// GLOBALS

long previousMillis = 0;
long interval = 10; // interval in milliseconds (10ms => 100Hz)
int data = 0;

//CALIBRATION DATA FOR ACCELEROMETER
float one_G = 647.0; // OFFSET OF 1G Z axis
float neg_G = 372.0; // OFFSET OF -1G Z axis
// Our ZERO G Reference should be in the middle of these two readings
float mZ = (one_G + neg_G) / 2.0; // ZERO_G REFERENCE FOR Z AXIS
// Estimate Z axis specific sensitivity difference of 2G between readings
float senZ = (one_G - neg_G) / 2.0;
float sensitivity = 440.0; // FROM DATASHEET TYPICAL SENSIVITIY 440mV/G

void setup()
{
  // The data is sent via the serial port. Initialize it.
  Serial.begin(115200);
  analogReference(EXTERNAL); // ACCELEROMETER IS 3.3VOLT
}


void loop()
{

  ReadAccelerometer();

}

void ReadAccelerometer()
{
   unsigned long currentMillis = millis();
   if((currentMillis - previousMillis) > interval) {
      previousMillis = currentMillis;

      // Read values from the ADC converter and send them out the serial port.
      data = analogRead(2); // READ ANALOG PIN 2 100uS

      //float GForceG = ((float)data - mZ) / senZ; // Convert ADC value to G force with gravity
      float GForce = ((float)data - (one_G)) / senZ; // ZERO BASE WITHOUT GRAVITY




      g_aGraphs[0].SendData(GForce); // SEND Z AXIS G FORCE
    }
}

Schlagloch bei 25mph

Schlagloch bei 25mph gezoomt

Ich habe zwei Diagramme bei ungefähr 25 MPH, das Schlaglochereignis ist offensichtlich, dann gab es danach eine subtile Beule. Das andere Diagramm zeigt die gleichen Daten, aber leicht vergrößert

Ich bin mir nicht sicher, wie ich das tatsächliche Schlaglochereignis erkennen soll, wenn ich FFT, Standardabweichungsschwelle, laufenden Durchschnitt verwenden könnte?

Jeder Rat, Vorschlag, Input, Weisheit wird sehr geschätzt!

BEARBEITEN

Ich habe die Abtastrate angepasst und den LPF auf dem Beschleunigungsmesser auf 15 Hz gesenkt. Ich habe bessere Daten erhalten, ich sehe die negativen und positiven Spitzen in einem Schlagloch, es scheint mit der Zeit zu oszillieren und zu dämpfen, wodurch ein Muster vom Typ "Schlag" entsteht. Ich frage mich, wie das Muster programmatisch gefunden werden könnte?

Ich weiß, dass die Ableitung der Beschleunigung "Ruck" wäre. Ich frage mich, ob die Schlaglochdaten durch eine Reihe von dekrementierenden Rucklern erkannt werden könnten. Das Muster ist jedoch auch negativ, es muss eine Signatur vorhanden sein, nach der gesucht werden muss, um das Schlagloch zu finden und zu zählen. Das einzige Mal, dass es negative Gs in der Z-Achse eines Autos gibt, ist, wenn der Reifen in ein Loch geht oder das Auto für einen kurzen Moment in der Luft ist und auf den Boden trifft, also wäre ein negativer "Ruck" eine gute Signatur richtig ?

Bessere Daten

Hier sind die RAW DATA für 1 SEKUNDE Fenster zum Schlagen eines Schlaglochs

Scheint vielleicht meine Z-Achse auf dem Kopf zu stehen Oo? Lol

Die Daten wurden nur unter Verwendung des 25-Hz-RC-LPF am Ende des Z-Achsen-Ausgangs des Beschleunigungsmessers ohne Softwarefilterung gesammelt

ROHDATEN FÜR BILD UNTEN:

    ZACCEL,TIME,GFORCE

Z,0.01,-0.01
Z,0.02,0.02
Z,0.03,0.06
Z,0.04,0.02
Z,0.05,0.04
Z,0.06,0.09
Z,0.07,0.07
Z,0.08,0.00
Z,0.09,-0.10
Z,0.10,-0.04
Z,0.11,-0.03
Z,0.12,-0.05
Z,0.13,-0.13
Z,0.14,-0.12
Z,0.15,-0.19
Z,0.16,-0.16
Z,0.17,-0.09
Z,0.18,-0.17
Z,0.19,-0.18
Z,0.20,0.04
Z,0.21,0.20
Z,0.22,0.04
Z,0.23,-0.12
Z,0.24,-0.25
Z,0.25,-0.15
Z,0.26,-0.17
Z,0.27,0.03
Z,0.28,0.08
Z,0.29,-0.09
Z,0.30,-0.26
Z,0.31,-0.30
Z,0.32,-0.04
Z,0.33,0.20
Z,0.34,0.36
Z,0.35,0.04
Z,0.36,-0.20
Z,0.37,-0.38
Z,0.38,-0.40
Z,0.39,-0.25
Z,0.40,-0.17
Z,0.41,0.40
Z,0.42,0.93
Z,0.43,0.69
Z,0.44,0.01
Z,0.45,-0.17
Z,0.46,-0.42
Z,0.47,-0.54
Z,0.48,-0.21
Z,0.49,0.22
Z,0.50,0.83
Z,0.51,0.65
Z,0.52,0.18
Z,0.53,-0.15
Z,0.54,-0.12
Z,0.55,-0.25
Z,0.56,-0.49
Z,0.57,0.01
Z,0.58,-0.04
Z,0.59,0.37
Z,0.60,0.36
Z,0.61,-0.29
Z,0.62,-0.27
Z,0.63,0.04
Z,0.64,0.06
Z,0.65,-0.09
Z,0.66,-0.04
Z,0.67,0.01
Z,0.68,0.01
Z,0.69,0.28
Z,0.70,-0.08
Z,0.71,-0.18
Z,0.72,-0.11
Z,0.73,-0.10
Z,0.74,0.11
Z,0.75,0.15
Z,0.76,0.01
Z,0.77,-0.11
Z,0.78,-0.33
Z,0.79,-0.14
Z,0.80,0.12
Z,0.81,0.04
Z,0.82,0.01
Z,0.83,0.17
Z,0.84,0.09
Z,0.85,-0.02
Z,0.86,-0.07
Z,0.87,-0.04
Z,0.88,0.04
Z,0.89,0.04
Z,0.90,0.02
Z,0.91,0.09
Z,0.92,0.05
Z,0.93,-0.01
Z,0.94,0.01
Z,0.95,0.01
Z,0.96,-0.07
Z,0.97,0.07
Z,0.98,0.08
Z,0.99,0.12
Z,1.00,0.01

ROHBILD:

http://img24.imageshack.us/img24/2751/pothole25mphraw.png

EXCEL-Version:

Geben Sie hier die Bildbeschreibung ein

Die FFT scheint hier eine Spitzenenergie bei 12,5 Hz zu erreichen. Wäre dies eine gute Frequenz zum Filtern?:

Geben Sie hier die Bildbeschreibung ein

HIER SIND ROHDATEN FÜR das Fahren mit konstanter Geschwindigkeit, das Auftreffen auf etwa 6 bis 9 Schlaglöcher und einige unebene Stellen auf der Straße:

http://textuploader.com/?p=6&id=sQlb

Sie haben angegeben, welche Funktionen Sie aus Ihren Daten herausfiltern möchten. Ebenso wichtig, welche Funktionen möchten Sie beibehalten? Was werden Sie mit den Daten tun, nachdem Sie die Artefakte von Straßenlärm und Schlaglöchern entfernt haben?
@The Photon Ich möchte in der Lage sein, Schlagloch- und Unebenheitsereignisse anhand des Rauschens zu erkennen, während das System kontinuierlich läuft. Unebene Straßenereignisse aus glattem Straßenlärm im Grunde mache ich einen Schlaglochdetektor, der Schlaglöcher, Unebenheiten usw. erkennt und bewertet, wie schwerwiegend sie auf einer GPS-Straßenkarte sind, auf der Sie beispielsweise unterwegs sind. Ich denke, wie "schwer" sie sind, würde der Fahrer / Beifahrer in irgendeiner Weise davon betroffen sein
OK. Dann eine andere Frage: Welche anderen Merkmale in den Daten möchten Sie nicht als Schlaglöcher erkennen? Zum Beispiel in eine Einfahrt einbiegen und über einen Bordstein fahren? Abrupt an einer Ampel anhalten? Eisenbahnschienen? Über die Krone einer Querstraße gehen? Wie erscheinen diese Ereignisse in Ihren Daten und wie unterscheiden sie sich von Schlaglöchern? Ich kann Ihnen keine Antwort auf Ihre Frage geben, aber ich hoffe, dass diese Fragen Ihnen helfen, eine Antwort zu finden.
Wenn Sie ein Signal im Wert von 50 Hz abrufen möchten, benötigen Sie wirklich mehr als 100 Hz Abtastrate (wie ich bereits in Ihrer anderen Frage erklärt habe). Außerdem ist der ADC selbst normalerweise in den letzten ein oder zwei Bits laut, je nachdem, wie gut die Versorgung und die Leiterplatte sind. Durch Kurzschließen des ADC-Eingangs gegen Masse und Plotten wird angezeigt, wie viele Bits schwanken. Es lohnt sich, diese Bits entweder zu verwerfen oder zu überabtasten und zu mitteln, um das Umwandlungsrauschen zu reduzieren. Außerdem kann ein Tiefpassfilter bei etwa 1 kHz am ADC-Eingang dazu beitragen, hochfrequentes Rauschen zu verwerfen. Das wird oft als Anti-Aliasing-Filter bezeichnet.
Und wie sehen die anderen Achsen rund um das Schlaglochereignis aus? Gibt es eine merkliche Unebenheit in der Y-Achse, die dem Aufprall auf ein Objekt und der Verlangsamung der Beschleunigung für einen kurzen Moment entspricht? Ich denke, Sie konzentrieren sich zu sehr darauf, Ihr Z-Achsen-Diagramm wie die physikalische Darstellung dessen aussehen zu lassen, was mit einem Auto passiert, wenn es auf ein Schlagloch trifft (das Rad geht mit einer schnellen Anstiegszeit nach unten und oben). Daten, die damit korreliert werden könnten, um eine vollständigere Antwort zu erhalten.
Aktualisiertes Datendiagramm

Antworten (2)

Sie werden Schlaglöcher nicht klar von anderen kurzen Spitzenereignissen unterscheiden können, abgesehen davon, dass Sie zwischen einer aufsteigenden Bodenwelle und einem Loch (die anfängliche Richtung wird entgegengesetzt sein) unterscheiden können, aber Sie können sie sicherlich ziemlich leicht erfassen.
Bestimmen Sie eine Anfangsrichtung (z. B. negativ/positiv XYZ, je nachdem, wie Ihr Gerät montiert ist), einen Schwellenwert und eine maximale Zeit, in der der Messwert über diesem Wert liegen sollte (bestimmt durch die Breite des Schlaglochs). Messen Sie dann die Spitzenhöhe/-breite und sehen Sie nach wenn es zu deiner Schlaglochcharakteristik passt.
Das Gerät enthält bereits einen internen 1-kHz-LPF, sodass Sie für die Schlaglöcher einen HPF von beispielsweise 50-200 Hz hinzufügen könnten, da diese eine schnelle Anstiegszeit haben. Ich bin kein Experte für Autovibrationsfrequenzen, aber Sie werden wahrscheinlich Vibrationsgeräusche bekommen, wie auch immer Sie filtern. Dies ist jedoch kein Problem, solange das Schlaglochereignis im Vergleich zum Rauschen groß ist - es sieht so aus, als ob die Daten so in Ordnung sind, ich würde nur etwas schneller abtasten, um Aliasing zu verhindern (z. B.> 2 kHz) oder einen LPF hinzufügen an die bestehende interne wie im Datenblatt beschrieben . Da Sie versuchen, Ereignisse mit schneller Anstiegszeit zu erfassen, würde ich mich für ersteres entscheiden (schnellere Abtastung, möglicherweise mit HPF).

Um eine Neigungsänderung zu kompensieren, können Sie einen laufenden Durchschnittswert haben, der zum Nullen der Achse verwendet werden kann (einer für jede Achse). Beachten Sie auch, dass ein HPF den DC-Pegel ignoriert, sodass (solange er nicht über das Ende der Skala hinausgeht) ein langsamer Gradient keinen Unterschied macht.

Laut Datenblatt (unten auf Seite 7 im obigen Link) lautet die Formel für die externe Kapazität:

C 2 = C 3 = C 4 = 4,97 × 10 6 F B W

also deine rechnung von:

4,97 × 10 6 10 H z = 497 N F ist richtig.

Ich habe die Abtastrate jetzt auf 2 kHz eingestellt, ich habe einen 0,1-uF-Kondensator am Z-Eingang hinzugefügt, um 50 Hz auf dem Beschleunigungsmesser gemäß dem Datenblatt zu erhalten. Ist diese Bandbreite oder die Änderung des Rolloffs des internen LPF auf 50 Hz? Wenn der interne LPF 1000 Hz beträgt, werden Frequenzen über 1000 Hz reflektiert, oder? Ich verstehe nicht, wie ich den 50-200-Hz-HPF-Filter hinzufügen soll, müsste ich einen entwerfen und die Z-Achse einspeisen, bevor er zum Mikrocontroller kanga.gerbilator.org/Sensors/Accelerometers/… über die Sensorbandbreite geht, sollte ich Verwenden Sie 500 Hz oder die 50 Hz, die ich verwendet habe
Das Hinzufügen der externen Kappe reduziert den Abfall des LPF auf 50 Hz, das ist also Ihre Bandbreite. Entfernen Sie dies, wenn Sie Signale >50Hz sehen möchten. Wenn Sie die Kappe weglassen, werden Signale über 1 kHz gedämpft/unterdrückt, ja.
Um also die Flankensteilheit wie von Olin vorgeschlagen auf 10 Hz zu ändern, würde ich den Kondensator drin lassen und dann einen Filter mit 10 Hz Flankensteilheit entwerfen, in den der Z-Achsen-Ausgang dann in den Arduino eingespeist wird?
Ich denke, @Olin schlägt das Gegenteil vor, LPF bis auf 10 Hz, also würden Sie in diesem Fall den Kondensator verwenden oder es digital machen. Ich würde die Kappe vergessen und digital filtern. Mein Vorschlag ist, nach der großen/schnellen anfänglichen Anstiegszeit eines Schlaglochereignisses zu suchen, Olins scheint zu sein, nach dem gesamten Ereignis zu suchen, was den Vorteil hat, dass der größte Teil des Rauschens beseitigt wird, obwohl es möglicherweise schwieriger wird, Schlaglöcher zu unterscheiden von z. B. einer scharfen Kurve oder Senke in der Straße. Wenn Sie digital filtern, wäre es einfach, beide Möglichkeiten auszuprobieren und zu sehen, welche für Sie am besten funktioniert.
ah danke In meinem Setup arbeitet die Schwerkraft immer am Beschleunigungsmesser und ich habe seinen Wert mit einem Offset auf "Null" vom Beschleunigungsmesser subtrahiert, aber ich habe gerade festgestellt, dass die Schwerkraft zwischen zwei geteilt wird, wenn Sie an Hängen und in hügeligem Gelände fahren Achsen .... Gibt es eine Möglichkeit, das unebene Gelände auszugleichen, um den G-Versatz beim Bergauffahren zu korrigieren?
Ok, der Beschleunigungsmesser hat 32k Widerstände eingebaut, die ich vorher nicht gesehen habe, haha, das macht es einfach, also kann ich einen einpoligen RC-Filter entwerfen, wenn ich einen 10-Hz-Cutoff haben möchte C = 1 / [2πRf] C = 1 / (2π * 32000 * 10 Hz) = 497 nF Kondensator?
@ zacharoni16 - Ich habe meine Antwort in Bezug auf Ihre Kommentare bearbeitet.

Es sieht so aus, als ob Sie nur eine Tiefpassfilterung benötigen, um ein besseres Signal-Rausch-Verhältnis zu erzielen. Ich würde so schnell sampeln, wie ich sonst im Mikro durchkomme. 100 Hz (alle 10 ms) klingt ziemlich langsam, aber trotzdem scheinen Sie nützliche Daten zu erhalten.

Die Rohdaten haben viel Sample-to-Sample-Rauschen. Sie wissen jedoch, dass das Überfahren eines Schlaglochs ein Ereignis mit viel geringerer Häufigkeit ist. Wenden Sie eine 2-3-polige Tiefpassfilterung mit einem Rolloff von vielleicht 10 Hz an und sehen Sie, wie das aussieht. Leider sampeln Sie nur 5x schneller als das Minimum, um 10 Hz zu unterstützen, also würde ich das wieder schneller machen. Ich würde wahrscheinlich jede ms mit dem Sampling beginnen und dann die Tiefpassfilterung anwenden. Das gibt dem 10-Hz-Filter einen viel größeren Dynamikbereich, etwa 50x.

Für die besten Daten würde ich dies wahrscheinlich in einem Low-End-DSP wie einem dsPIC tun und eine Faltung anwenden. Ein 256-Punkte-Kernel bei einer Abtastrate von 1 kHz sollte gut funktionieren. Ein dsPIC 33F kann mit 40 MIPS laufen, was 40000 Anweisungen/ms entspricht. Eine 256-Punkte-Faltung alle 40000 Befehle benötigt nur einen kleinen Bruchteil der Prozessorzeit.

Mit dem Filter würde ich nicht zu viel anfangen. Eine Synchronisierung ist beispielsweise nicht erforderlich, und das hätte sowieso unerwünschte Auswirkungen. Etwas wie eine Gaußsche oder Cosinusquadrat sollte gut sein. Dies sollte ein etwas besseres Ergebnis liefern als ein paar Pole einfacher einpoliger LPFs, da die Faltung symmetrisch ist. Anders ausgedrückt, für jeden Ausgangspunkt berücksichtigt die Faltung Eingangspunkte zeitlich symmetrisch sowohl davor als auch danach, was die einpoligen IIR-Filter nicht tun.

Es könnte nützlich sein, vielleicht 5 Sekunden Daten rund um ein Schlaglochereignis zu erfassen und die Zahlen in einer CSV-Datei oder so zu posten. Eigentlich wären die Rohdaten für Ihren Top-Trace ein guter Anfang.