Filterung Fernbedienung

Aus HSHL Mechatronik
Version vom 12. Februar 2019, 16:01 Uhr von Michael Menke (Diskussion | Beiträge) (→‎Ausblick)
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)
Zur Navigation springen Zur Suche springen

Das Signal der Fernbedienung ist sehr stark von Störungen beeinflusst. Die Störungen führen dazu, dass das Signal außerhalb des Arbeitsbereichs liegt und somit die blaue LED angeschaltet wird, d.h. das der RC-Modus angezeigt wird. ( weitere Erläuterungen siehe Bibliothek Sensoren/Aktoren online Block SenFernb-Fernbedienung)

Störungen

Daher sollte das Signal so gefiltert werden, dass die Störungen vermieden werden. Um zu prüfen, welcher Filter der geeignetste ist, wurden für das Signal SenRti_PwmBreiteGas_f64 mehrere Filter getestet. Es wurden ein einfacher Kalman-Filter, ein rekursiver Mittelwertfilter, die Filterung über die Ableitung und die Filterung über eine if-Bedingung betrachtet. Alle Modelle befinden sich unter ...\SVN_Unterlagen\Software\Filterung_PWM-Signal_Fernbedienung

Um das Signal in den Modellen nachzubilden wird der Block Signal Builder verwendet. Das gestörte Signal wird in einer Excel-Datei gespeichert und dann im Signal Builder geladen.

Rekursiver Mittelwert und Simple Kalman

Simple Kalman und Rekursiver Mittwelwert

Beim gewichteten rekursiven Mittelwert-Filter, bzw. Tiefpassfilter, wird der Mittelwert des vorherigen Werts und der aktuelle Wert berücksichtigt. Beide Werte werden über einen Gewichtungsfaktor Alpha gewichtet, d.h. es wird ihnen eine Bedeutung zugewiesen (mehr Vertrauen in Messwert oder Mittelwert). Die Funktion stammt aus der Vorlesung Multisensorsysteme WS2013/14 von Herrn Prof. Dr. Ing. Ulrich Schneider:

function PWM_Breite_Gas_filt_RM = RekursiverMittelwert(x)
%
%
persistent fVorherigeMittelwert k 
persistent bErsterDurchlauf  

%% Initalisierung der Variablen bei ertsen Durchlauf
 if isempty(bErsterDurchlauf)
  k = 1;
  fVorherigeMittelwert = 0.0975;
  
  bErsterDurchlauf = 1;  
end


alpha = (k - 1) / k;
PWM_Breite_Gas_filt_RM   = alpha*fVorherigeMittelwert + (1 - alpha)*x;

fVorherigeMittelwert = PWM_Breite_Gas_filt_RM;
k       = k + 1;

Der Kalman-Filter ist deutlich komplexer als der gewichtete, rekursive Mittelwertfilter und kann mehrdimensionale und nicht lineare Systeme filtern. Für einfache eindimensionale Anwendungen ist der Filter dem gewichteten, rekursiven Mittelwertfilter sehr ähnlich. Wesentlicher Unterschied ist, dass beim Mittelwertfilter ein fester Gewichtungsfaktor angenommen wird und beim Kalman-Filter die Gewichtung zwischen Vorhersage und wahrem Wert dynamisch angepasst wird. Die Funktion stammt wiederum aus der Vorlesung Multisensorsysteme:

function PWM_Breite_Gas_filt = SimpleKalman(z)
%
%
persistent A C Q R 
persistent x P
persistent firstRun


if isempty(firstRun)
  %% einmalige Initialisierung
  A = 1; % Systemmatrix der linearen Zustandsraumdarstellung
  C = 1; % Ausgangsmatrix der linearen Zustandsraumdarstellung
  
  Q = 0.01; % Kovarianzmatrix des Systemrauschens
  R = 10; % Kovarianzmatrix des Messrauschens

  x = 0.0975; % in V aktueller Wert
  P = 5; % Kovarianzmatrix des Schätzfehlers
  
  firstRun = 1;  
end

%% Prädiktionsschritt  
% 1. Vorhersage des Zustandsvektors und der Kovarianz
xp = A*x;            % Prädiktion der Schätzung
Pp = A*P*A' + Q;     % Prädiktion der Fehlerkovarianz

%% 2. Berechnung der Kalman Verstärkung K
K = Pp*C'*inv(C*Pp*C' + R);

%% 3. Korrektur der Zustandsschätzung
x = xp + K*(z - C*xp);

%% 4. Korrektur der Kovarianzschätzung
P = Pp - K*C*Pp;

%% Ausgang ist die Zustandsschätzung
PWM_Breite_Gas_filt = x;

Die Ergebnisse der beiden Filter wurden in einem Scope dargestellt und sehen wie folgt aus:

Simple Kalman und Rekursiver Mittwelwert Scope

Im oberen Scope ist das Ergebnis des gewichteten rekursiven Mittelwertfilters, im mittleren Scope das Ergebnis des Simple Kalman, jeweils mit der oberen und unteren Grenze des Arbeitsbereichs und das gestörte Signal und in unteren Scope ist das gestörte Signal allein dargestellt.

Beide Filter liefern nicht das gewünschte Ergebnis.


Ableitung

Ableitung

Das Signal wird abgeleitet. Wenn die Ableitung eines Signals zu groß ist, d.h. das Signal eine zu große Steigung besitzt, wird das Signal nicht weitergeleitet. Die steile Flanke besitzen meisten nur Störungen.

function [PWM_BreiteGas_filt , Zeit, PWM_BreiteGas_Hilfswert] = fcn(PWM_BreiteGas,PWM_BreiteGas_Ableitung,obereGrenze, untereGrenze, Zeitfaktor,  Zeitzaehler, Zeitoffset, LetzterWert)
 
if (PWM_BreiteGas_Ableitung < untereGrenze || PWM_BreiteGas_Ableitung > obereGrenze) % Betrachtung, ob der aktuelle Messwert außerhalb der  Toleranzgrenze ist)
    Zeitzaehler = Zeitzaehler + Zeitfaktor;
    
    if (Zeitzaehler > Zeitoffset) % Wird die Aktivierungsdauer überschritten, so handelt es sich um keine Störung, sondern um die Betätigung der    Fernbedienung
        PWM_BreiteGas_filt = PWM_BreiteGas; % Der gefilterte Wert enspricht dem Eingangswert;
        PWM_BreiteGas_Hilfswert = LetzterWert; % Die Hilfsvariable wird nicht benötigt und behält den letzten Wert, der innerhalb der Toleranz lag
    else
        PWM_BreiteGas_filt = LetzterWert; % Ist die Aktivierungsdauer noch nicht überschritten, wird der letzte Wert, der innerhalb der Toleranz lag an den gefilterten Wert übergeben
        PWM_BreiteGas_Hilfswert = LetzterWert; % Die Hilfvariable muss den letzten Wert innerhalb der Toleranz behalten
    end 
else                        % PWM-Signal liegt innerhalb der Toleranzgrenzen
    PWM_BreiteGas_filt = PWM_BreiteGas; % für gefilterten Wert wird aktueller Messwert übernommen
    PWM_BreiteGas_Hilfswert = PWM_BreiteGas; % Hilfswert wird hier angelegt
    Zeitzaehler = 0;
end

Zeit = Zeitzaehler;

Das sich ergebende Signal sieht wie folgt aus:

Ableitung Scope

Der Filter erfüllt leider nur teilweise seinen Zweck. Er unterdrückt zwar die steigenden Flanken, wenn sich das Signal jedoch über mehrere Zeitschritte auf einer Stufe hält, wird die Steigung zu Null und das gefilterte Signal zieht dennoch der Störung nach.

if-Bedingung

if-Bedingng

Bei der if-Bedingung wird betrachtet, wann sie das Signal außerhalb des Arbeitsbereichs befindet und wie lange. Sobald der Arbeitsbereich verlassen wird, startet ein Zeitzähler. Für eine gewisse Zeit, in der typischerweise ein Störsignal liegt, wird das Signal unterdrückt. Sollte das Signal länger außerhalb des Arbeitsbereichs liegen, d.h. wenn ein Fernbedienungseingriff vorliegt, zieht das gefilterte Signal nach kurzer Zeit nach.

function [PWM_BreiteGas_filt , Zeit, PWM_BreiteGas_Hilfswert] = fcn(PWM_BreiteGas, obereGrenze, untereGrenze, Zeitfaktor, Zeitzaehler,  Aktivierungsdauer, LetzterWert)

if (PWM_BreiteGas < untereGrenze || PWM_BreiteGas> obereGrenze) % Betrachtung, ob der aktuelle Messwert außerhalb der Toleranzgrenze ist)
    Zeitzaehler = Zeitzaehler + Zeitfaktor; % Wenn ja, wird ein Zeitzaehler gestartet. Dieser wird bei jedem erneuten Durchgang um den Zeitfaktor  mit dem das Programm läuft hochgesetzt
    
    if (Zeitzaehler > Aktivierungsdauer) % Wird die Aktivierungsdauer überschritten, so handelt es sich um keine Störung, sondern um die Betätigung  der Fernbedienung
        PWM_BreiteGas_filt = PWM_BreiteGas; % Der gefilterte Wert enspricht dem Eingangswert;
        PWM_BreiteGas_Hilfswert = LetzterWert; % Die Hilfsvariable wird nicht benötigt und behält den letzten Wert, der innerhalb der Toleranz lag
    else
        PWM_BreiteGas_filt = LetzterWert; % Ist die Aktivierungsdauer noch nicht überschritten, wird der letzte Wert, der innerhalb der Toleranz  lag an den gefilterten Wert übergeben
        PWM_BreiteGas_Hilfswert = LetzterWert; % Die Hilfvariable muss den letzten Wert innerhalb der Toleranz behalten
    end
else                        % PWM-Signal liegt innerhalb der Toleranzgrenzen
    PWM_BreiteGas_filt = PWM_BreiteGas; % für gefilterten Wert wird aktueller Messwert übernommen
    PWM_BreiteGas_Hilfswert = PWM_BreiteGas; % Hilfswert wird hier angelegt
    Zeitzaehler = 0; % Hier wird der Zeitzähler wieder zurückgesetzt, sobald die Messwerte im Toleranzbereich liegen
end

Zeit = Zeitzaehler; 

Das Ergebnis der Filterung sieht wie folgt aus:

Scope der if-Bedingung

Der Filter erfüllt seine Vorgaben und unterdrückt die Störungen. Daher wurde die if-Bedingung als Filter für das Signal SenRti__PwmBreiteGas_f64 in den Block SenFernb-Fernbedienung in dem Sensorblock eingebunden.


Ausblick

Bei Tests mit der Fernbedienung ist aufgefallen, dass die Störungen davon abhängen, wie die Fernbedienung zum Fahrzeug steht oder gehalten wird. Der Filter ist zwar eine mögliche Lösung, jedoch sollte man nicht nur die Symptome, d.h. die Störungen, unterdrücken. Besser sollte man nach den Ursachen suchen, warum das Fernbedienungssignal so stark von der Position von Fernbedienung und Fahrzeug abhängt. Anschließend kann man ja dennoch einen Filter zur Signalverbesserung anwenden.

Autor: Julia Müller (Diskussion) 19:10, 6. Feb. 2014 (CET)


→ zurück zum Hauptartikel: Praktikum SDE