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
}
}
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 ?
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:
EXCEL-Version:
Die FFT scheint hier eine Spitzenenergie bei 12,5 Hz zu erreichen. Wäre dies eine gute Frequenz zum Filtern?:
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:
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:
also deine rechnung von:
ist richtig.
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.
Das Photon
zacharoni16
Das Photon
Chintalagiri Shashank
Tobi Lawrence
zacharoni16