Sunday 19 February 2017

Einfach Bewegend Durchschnittlich Arduino

Ich arbeite an einem mobilen Roboter, der über einen drahtlosen 2,4 GHz Link gesteuert wird. Der Empfänger ist mit dem Arduino Uno verbunden, der als Hauptregler an Bord dient. Der kritischste (und Haupt-) Eingangskanal des Empfängers erzeugt ein sehr verrauschtes Signal, was zu vielen kleinen Änderungen am Ausgang der Aktoren führt, obwohl diese nicht benötigt werden. Ich suche Bibliotheken, die effiziente Glättung durchführen können. Gibt es ein Signal Glättung Bibliotheken zur Verfügung für die Arduino (Uno) Ich glaube, ich sehe eine Menge von Single-Sample Rauschspitzen in Ihrem lauten Signal. Der Medianfilter ist besser bei der Beseitigung von Einzelprobenrauschspitzen als bei jedem linearen Filter. (Es ist besser als jedes Tiefpaßfilter, gleitender Durchschnitt, gewichteter gleitender Durchschnitt usw. in Bezug auf seine Ansprechzeit und seine Fähigkeit, solche Einzelproben-Rauschspitzen-Ausreißer zu ignorieren). Es gibt in der Tat viele Signalglättungsbibliotheken für das Arduino, von denen viele einen Medianfilter enthalten. Signalglättungsbibliotheken bei arduino. cc: Signalglättungsbibliotheken bei github: Würde sowas in Deinem Roboter so funktionieren (Der Median-of-3 erfordert sehr wenig CPU-Leistung und damit schnell): Du könntest diese digital mit einem Tief filtern Filter: Ändern Sie die 0,99, um die Grenzfrequenz zu ändern (näher an 1,0 ist die niedrigere Frequenz). Der tatsächliche Ausdruck für diesen Wert ist exp (-2piffs) wobei f die Grenzfrequenz ist, die gewünscht wird und fs die Frequenz ist, an der die Daten abgetastet werden. Ein anderer Typ eines digitalen Filters ist ein Ereignisfilter. Es funktioniert gut auf Daten, die Ausreißer, z. B. 9,9,8,10,9,25,9. Ein Ereignisfilter gibt den häufigsten Wert zurück. Statistisch ist dies der Modus. Statistische Mittelwerte wie Mean, Mode etc. können mit Hilfe der Arduino Average Library berechnet werden. Ein Beispiel aus der Arduino Library-Seite: Eine der Hauptanwendungen für das Arduino-Board ist das Lesen und Protokollieren von Sensordaten. Zum Beispiel überwacht man den Druck jede Sekunde des Tages. Da hohe Abtastraten oft Spikes in den Graphen erzeugen, möchte man auch einen Mittelwert der Messungen haben. Da die Messungen nicht statisch in der Zeit sind, was wir oft brauchen, ist ein laufender Durchschnitt. Dies ist der Durchschnitt einer bestimmten Periode und sehr wertvoll bei der Trendanalyse. Die einfachste Form eines laufenden Durchmessers kann durch einen Code ausgeführt werden, der auf dem vorherigen laufenden Durchschnitt basiert: Wenn man keine Gleitkomma-Mathematik verwenden möchte - da dies Speicherplatz einnimmt und Geschwindigkeit verringert - kann man dies in der Integer-Domäne vollständig durchführen. Die Teilung durch 256 in dem Beispielcode ist ein Schiebe-Recht 8, das schneller ist als eine Teilung durch z. B. 100. Dies gilt für jede Potenz von 2 als Teiler und man muss nur darauf achten, dass die Summe der Gewichte gleich der Potenz von 2 ist. Und natürlich sollte man darauf achten, dass es keinen Zwischenüberlauf gibt (erwägen Sie unsigned long) Eine genauere laufende Durchschnitt, in concreto aus den letzten 10 Messungen, benötigen Sie ein Array (oder verkettete Liste), um sie zu halten. Diese Anordnung wirkt wie ein kreisförmiger Puffer und bei jeder neuen Messung wird die älteste entfernt. Der laufende Durchschnitt wird als die Summe aller Elemente geteilt durch die Anzahl der Elemente in dem Array berechnet. Der Code für den laufenden Durchschnitt wird etwa so aussehen: Nachteil dieses Codes ist, dass das Array, um alle Werte zu halten, ziemlich groß werden kann. Wenn Sie eine Messung pro Sekunde haben und Sie wollen einen laufenden Durchschnitt pro Minute benötigen Sie ein Array von 60 ein durchschnittliches pro Stunde würde ein Array von 3600 benötigen. Das könnte nicht auf diese Weise auf einem Arduino getan werden, da es nur 2K RAM hat. Allerdings kann durch den Bau eines 2-stufigen Durchschnitts kann es ganz gut angegangen werden (Disclaimer: nicht für alle Messungen). Im psuedo-Code: Da für jede runningAverage-Funktion ein neues internes statisches Array benötigt wird, wird dieses als Klasse implementiert. RunningAverage-Bibliothek Die RunningAverage-Bibliothek bildet eine Klasse der oben genannten Funktion, so dass sie mehrfach in einer Skizze verwendet werden kann. Es entkoppelt die add () - und die avg () - Funktion, um ein wenig flexibler zu sein, z. B. Kann man den Durchschnitt mehrmals nennen, ohne eine Sache hinzuzufügen. Beachten Sie, dass jede Instanz der Klasse ein eigenes Array hinzufügt, um Messungen zu halten, und dass dies die Speicherauslastung addiert. Die Schnittstelle der Klasse wird so klein wie möglich gehalten. Anmerkung: Bei Version 0.2 werden die Namen der Methoden beschreibender. Eine kleine Skizze zeigt, wie sie verwendet werden kann. Ein Zufallsgenerator wird verwendet, um einen Sensor nachzuahmen. In setup () wird der myRA gelöscht, so dass wir mit dem Hinzufügen neuer Daten beginnen können. In Schleife () wird zuerst eine Zufallszahl erzeugt und in einen Float umgewandelt, der zu myRA hinzugefügt werden soll. Dann wird das runningAverage auf den seriellen Port gedruckt. Man könnte es auch auf einem LCD-Display oder über ethernet etc. Wenn 300 Elemente hinzugefügt myRA ist gelöscht, um neu zu beginnen. Um die Bibliothek zu verwenden, machen Sie einen Ordner in Ihrem SKETCHBOOKPATHlibaries mit dem Namen RunningAverage und legen Sie die. h und. cpp dort. Fügen Sie optional ein Beispielunterverzeichnis hinzu, um die Beispielanwendung zu platzieren. 2011-01-30: Anfangsversion 2011-02-28: fester fehlender Zerstörer in der. h Akte 2011-02-28: entfernter Standardkonstruktor 2012--. TrimValue () Yuval Naveh hinzugefügt trimValue (gefunden im Web) 2012-11-21: refactored 2012-12-30: hinzugefügt fillValue () refactored für die Veröffentlichung 2014-07-03: hinzugefügt Speicherschutz-Code - wenn internen Array nicht zugeordnet werden kann Größe Wird 0. Dies ist, um das hier beschriebene Problem zu lösen - forum. arduino. ccindex. phptopic50473.msg1790086msg1790086 - Test ausführlich. Template-Klasse RunningAverage. h RunningAverage. cppFiltering Accelerometer Daten mit Matlab und Arduino 15. April 2016 von Ryan Morrison Weiter mit meiner Erforschung der MATLABArduino-Schnittstelle untersucht dieser Beitrag zwei Methoden der Entfernung von Rauschen von Sensordaten: exponentiell gleitenden Durchschnitt und einfache gleitende durchschnittliche Filter. Als Vorstufe dazu finden Sie eine Einführung in die serielle Kommunikation und Datenplotten mit Arduino und MATLAB auf meinem vorherigen Post. Der ganze Code, der in diesen Pfosten benutzt wird, ist an meinem GitHub Repo vorhanden. Auch hier bin ich mit dem Tutorial Videos von Matlabarduino. org als Referenz, während das Hinzufügen meiner eigenen Featuresimprovements auf dem Weg. Exponential Moving Average (EMA) Der exponentielle gleitende Durchschnitt weist einen Gewichtungsfaktor zu, wobei die jüngsten Daten das größte Gewicht aufweisen. Es wird durch die folgende Gleichung berechnet: Der LSM303DLHC-Beschleunigungssensor ist mit einem Arduino Uno verbunden, es wird eine serielle Kommunikation zwischen Arduino und MATLAB hergestellt, und MATLAB zeichnet die Gravitationsbeschleunigungsvektoren auf. Der vorherige MATLAB-Code wird modifiziert, um die EMA zu berechnen und Seite-an-Seite-Diagramme von rohen und gefilterten Daten anzuzeigen. Das Ergebnis ist unten der Unterschied zwischen rohen und gefilterten Daten dargestellt, da der Schieberegler den Alphawert ändert. Vergleich von rohen (links) und EMA-gefilterten (rechts) Beschleunigungsvektoren. In der obigen Grafik wird der Beschleunigungsmesser im Raum mit dem senkrecht zur Erde senkrechten z-Vektor gehalten. Bewegung und Vibration werden auf den Beschleunigungsmesser angewendet, um das Ansprechen auf plötzliche Orientierungsänderungen zu zeigen. Beim Vergleich der Rohdaten auf der linken Seite mit den gefilterten Daten auf der rechten Seite werden die folgenden Beobachtungen gemacht: Der Alpha-Wert, der sich 1 nähert, führt zu einer hohen Filterung des gefilterten Plots bewegt sich sehr wenig in Reaktion auf die Bewegung. Alpha-Wert annähernd 0 Ergebnisse in Low-Filterung gibt es wenig Unterschied zwischen rohen und gefilterten Parzellen. Alpha-Wert um 0,5 bietet ein optimales Filterungsniveau. Der gefilterte Plot ist frei von unregelmäßigem Jitter und reagiert auf Bewegung. Einfacher gleitender Durchschnitt (sma) Wie der Name schon sagt, verwendet dieses Filter einen einfachen Mittelwert für eingehende Sensordaten. Bei jeder Iteration der Code-Schleife wird der älteste Wert im Datensatz gelöscht und durch den letzten Messwert ersetzt und ein neuer Durchschnitt berechnet. Die SMA wird durch die folgende Gleichung gegeben, wobei das Niveau der Geräuschverringerung durch n (die Anzahl der Abgriffe) bestimmt wird. Die Größen von xyz-Achsenbeschleunigungen werden in 2D-Diagrammen unter Verwendung von MATLAB visualisiert. Sowohl rohe als auch gefilterte Daten werden präsentiert, und ein Schieberegler wird verwendet, um die Filtermenge (Anzahl der Abgriffe) einzustellen. Vergleich von roher (oben) und SMA-gefilterter (unten) xyz Beschleunigungsgrößen. Der Beschleunigungsmesser wird auf die gleiche Weise wie das EMA-Filter manipuliert. Um die Effekte des SMA-Filters zusammenzufassen: Nullabzweigungen Keine Filterrohbeschleunigungsmesswerte zeigen eine hohe Empfindlichkeit gegenüber leichten Störungen. Zehn Hähne hohe Filterung kräftige Beschleunigungsmesser Bewegung ist nicht in gefilterten Ergebnissen. Fünf Hähne optimale Filterung Jitter ist beseitigt, aber gefilterte Ergebnisse spiegeln große Bewegungen. Fazit Ich bin jetzt mit dem Einsatz von MATLAB für die Sensorcharakterisierung ziemlich kompetent und werde das in zukünftigen Projekten nutzen. Was in den Sinn kommt, ist, dies in der Beobachtungsdefinition von Schwellen anzuwenden, wenn Beschleunigungsmesser in Robotikautomotorischen Anwendungen verwendet werden. Ein Beispiel ist die Verbesserung der Aufprall-Detektion durch Filtern von irrtümlichem Jitter, das durch Körperschwingungen eingeführt wird.


No comments:

Post a Comment