Die Verwendung eines Kalman-Filters erfordert einen Wahrheitswert?

Ich habe einige Beschleunigungsmesserdaten, die ich filtern und bereinigen muss. Basierend auf den Online-Beispielen, die ich sehe, erfordert der Filter jedoch einen sogenannten "Wahrheitswert". Der Code basiert darauf:

http://scottlobdell.me/2014/08/kalman-filtering-python-reading-sensor-input/

Geben Sie hier die Bildbeschreibung ein

Nun zum Wahrheitswert für meine Beschleunigungsdaten, ich habe mich gefragt, ob ich ihn generieren könnte, indem ich eine Glättungsfunktion auf meinen Datensatz anwende und diesen dann als Wahrheitswert verwende. Das Bild unten zeigt meine Beschleunigungsdaten, wobei der grüne Teil die geglätteten Daten zeigt. Es verwendet den „Blackman Tukey“ -Glättungsalgorithmus. Sie können jedoch sehen, dass es nicht gut darin ist , Hochfrequenzsignale zu verarbeiten. Trotzdem habe ich einen "groben Wahrheitswert".

Geben Sie hier die Bildbeschreibung ein

Meine Frage ist, kann ich diesen geglätteten Wert als meinen Wahrheitswert in meinem Kalman-Filter verwenden?

Ich sehe in keinem der von Ihnen verlinkten Beispiele, dass der Wahrheitswert irgendwo im eigentlichen Kalman-Filter verwendet wird. Es ist nur dazu da, Ihnen zu zeigen, was die ideale Ausgabe sein sollte .
Sie werden gelegentlich Begriffe wie „Referenz“ in Beschreibungen eines indirekten Kalman-Filters sehen, bei dem die Systemmechanisierung (z. B. doppelte Integration von Beschleunigungsmesserdaten, um die Position zu erhalten) unabhängig ausgeführt wird und der IKF-Zustand den Fehler in der „Referenz“ modelliert.

Antworten (1)

Ich bin mir nicht sicher, was Sie sehen, aber Sie müssen die von Ihnen verlinkten Beispiele verstehen .

Keiner von ihnen verwendet den Wahrheitswert innerhalb der eigentlichen Filterung. Es ist da, damit Sie in Bezug auf die Filterausgabe etwas vergleichen können.

Hier ist das einfache Skript:

import random

# intial parameters
iteration_count = 500
actual_values = [-0.37727 + j * j * 0.00001 for j in xrange(iteration_count)]
noisy_measurement = [random.random() * 0.6 - 0.3 + actual_val for actual_val in actual_values]

process_variance = 1e-5  # process variance

estimated_measurement_variance = 0.1 ** 2  # estimate of measurement variance, change to see effect

# allocate space for arrays
posteri_estimate_for_graphing = []

# intial guesses
posteri_estimate = 0.0
posteri_error_estimate = 1.0

for iteration in range(1, iteration_count):
    # time update
    priori_estimate = posteri_estimate
    priori_error_estimate = posteri_error_estimate + process_variance

    # measurement update
    blending_factor = priori_error_estimate / (priori_error_estimate + estimated_measurement_variance)
    posteri_estimate = priori_estimate + blending_factor * (noisy_measurement[iteration] - priori_estimate)
    posteri_error_estimate = (1 - blending_factor) * priori_error_estimate
    posteri_estimate_for_graphing.append(posteri_estimate)

import pylab
pylab.figure()
pylab.plot(noisy_measurement, color='r', label='noisy measurements')
pylab.plot(posteri_estimate_for_graphing, 'b-', label='a posteri estimate')
pylab.plot(actual_values, color='g', label='truth value')
pylab.legend()
pylab.xlabel('Iteration')
pylab.ylabel('Voltage')
pylab.show()

Lassen Sie es uns aufschlüsseln:

Erstellen Sie zuerst das Eingabearray und dann die simulierte „verrauschte“ Eingabe, indem Sie jedem Element im Eingabearray zufällige Werte hinzufügen.

import random

# intial parameters
iteration_count = 500
actual_values = [-0.37727 + j * j * 0.00001 for j in xrange(iteration_count)]
noisy_measurement = [random.random() * 0.6 - 0.3 + actual_val for actual_val in actual_values]

Als nächstes werden mehrere Parameter definiert, die die Eigenschaften der Systemabweichung beschreiben. Diese müssen von Ihrer Signalquelle abgeleitet werden.

process_variance = 1e-5  # process variance    
estimated_measurement_variance = 0.1 ** 2  # estimate of measurement variance, change to see effect

# allocate space for arrays
posteri_estimate_for_graphing = []

# intial guesses
posteri_estimate = 0.0
posteri_error_estimate = 1.0

Dies ist der eigentliche Filtercode:

for iteration in range(1, iteration_count):
    # time update
    priori_estimate = posteri_estimate
    priori_error_estimate = posteri_error_estimate + process_variance

    # measurement update
    blending_factor = priori_error_estimate / (priori_error_estimate + estimated_measurement_variance)
    posteri_estimate = priori_estimate + blending_factor * (noisy_measurement[iteration] - priori_estimate)
    posteri_error_estimate = (1 - blending_factor) * priori_error_estimate
    posteri_estimate_for_graphing.append(posteri_estimate)

Hinweis: wird im obigen Code nirgendwoactual_values referenziert . Der Kalman-Filter arbeitet vollständig nur mit den Daten innerhalb des Arrays.noisy_measurement

Zeichnen Sie schließlich die verschiedenen Arrays.

import pylab
pylab.figure()
pylab.plot(noisy_measurement, color='r', label='noisy measurements')
pylab.plot(posteri_estimate_for_graphing, 'b-', label='a posteri estimate')
pylab.plot(actual_values, color='g', label='truth value')
pylab.legend()
pylab.xlabel('Iteration')
pylab.ylabel('Voltage')
pylab.show()

Im Grunde brauchen Sie den Wahrheitswert also überhaupt nicht. Sie müssen Ihre Beispiele tatsächlich lesen. Es ist nur grafisch dargestellt, damit Sie die Wirksamkeit des Kalman-Filters bestimmen können.

Kritisch ist, insbesondere zu Testzwecken, dass Sie den von einem Kalman-Filter erzeugten Fehler nicht mit Konstanten von {n} charakterisieren können , ohne den tatsächlichen Wahrheitswert zu kennen. Der Filter filtert gut, aber es gibt keine Möglichkeit festzustellen, ob die Ausgabe korrekt ist. Um den Filter richtig einzurichten, muss nur das Rauschen innerhalb des Systems gemessen werden können.