Die Sensoren des Roboters erfassen den Verlauf der Wellen (b.z.w. die Höhe der Wellen), aber leider ist deren Ausgabe ungenau. <br><br>
Die Sensoren des Roboters erfassen den Verlauf der Wellen (b.z.w. die Höhe der Wellen), aber leider ist deren Ausgabe ungenau. <br><br>
Zusätzlich lässt sich der Verlauf der Wellen mathematisch durch eine Sinus-Funktion vorhersagen b.z.w. nähern. Eine <b> mathematische Näherung entspricht nicht immer ganz der Wirklichkeit </b> und so ist die uns unbekannte Wellenfunktion keine Sinus-Funktion, aber wir hoffen, dass unsere Näherung später gut genug ist, damit sie (zusammen mit der Ausgabe der Sensoren und dem Kalman-Filter) zufriedenstellende Ergebnisse liefert.
Zusätzlich lässt sich der Verlauf der Wellen mathematisch durch eine Sinus-Funktion vorhersagen b.z.w. nähern. Eine <b> mathematische Näherung entspricht nicht immer ganz der Wirklichkeit </b> und so ist die uns unbekannte Wellenfunktion keine Sinus-Funktion, aber wir hoffen, dass unsere Näherung später gut genug ist, damit sie (zusammen mit der Ausgabe der Sensoren und dem Kalman-Filter) zufriedenstellende Ergebnisse liefert.
Die mathematische Vorhersage/Näherung wird durch Matrizen und Vektoren ausgedrückt (in diesem Fall mit einer Drehmatrix).<br><br>
Die mathematische Vorhersage/Näherung wird durch Matrizen und Vektoren ausgedrückt (in diesem Fall mit einer Drehmatrix).<br><br>
Zustandsvorhersage: <code>x = F × x + G × u</code> mit <code>F</code> als Drehmatrix und <code>x</code> als Zustandsvektor.
Zustandsvorhersage: <code>x = F × x + G × u</code> mit <code>F</code> als Drehmatrix und <code>x</code> als Zustandsvektor.
<br><br>Dabei interessiert uns hier nur der erste Eintrag im x-Vektor <code>x[0]</code>, welcher als Messvorhersage dient und ungefähr die momentane Höhe der Welle angeben soll, also das was wir auch von den Sensoren als Messung erwarten.
<br><br>Dabei interessiert uns hier nur der erste Eintrag im x-Vektor <code>x[0]</code>, welcher als Messvorhersage dient und ungefähr die momentane Höhe der Welle angeben soll, also das was wir auch von den Sensoren als Messung erwarten.
%% Cell type:code id:radio-swing tags:
%% Cell type:code id:radio-swing tags:
``` python
``` python
om=0.1
om=0.1
F=np.array([[cos(om),sin(om)],
F=np.array([[cos(om),sin(om)],
[-sin(om),cos(om)]])
[-sin(om),cos(om)]])
x=np.array([0,0.5])
x=np.array([0,0.5])
C=np.array([1,0])
C=np.array([1,0])
y=[dot(C,x)]
y=[dot(C,x)]
# Zustandsvorhersage:
# Zustandsvorhersage:
# x^ = F*x + G*u
# x^ = F*x + G*u
# Hier mit G*u=0
# Hier mit G*u=0
# Messvorhersage:
# Messvorhersage:
# z = C*x^
# z = C*x^
foriinrange(0,119):
foriinrange(0,119):
x=(dot(F,x))# Zustandsvorhersage
x=(dot(F,x))# Zustandsvorhersage
z=dot(C,x)# Messvorhersage (hier z = dot(C,x) = x[0])
z=dot(C,x)# Messvorhersage (hier z = dot(C,x) = x[0])
Der Kalman-Filter hilft uns nun unsere mathematische Annäherung und die Ausgabe der Sensoren so zu kombinieren, dass der Verlauf der Wellen möglichst gut beschrieben werden kann, obwohl unser mathematisches Modell und die Sensoren des Roboters die Wirklichkeit nicht perfekt beschreiben. Wir übergeben unsere mathematische Vorhersage (die Matrix <code>F</code> und der Vektor <code>xo</code>) an den Kalman-Filter, welcher zusätzlich mit den Daten der Sensoren gefüttert wird.<br><br>
Der Kalman-Filter hilft uns nun unsere mathematische Annäherung und die Ausgabe der Sensoren so zu kombinieren, dass der Verlauf der Wellen möglichst gut beschrieben werden kann, obwohl unser mathematisches Modell und die Sensoren des Roboters die Wirklichkeit nicht perfekt beschreiben. Wir übergeben unsere mathematische Vorhersage (die Matrix <code>F</code> und der Vektor <code>xo</code>) an den Kalman-Filter, welcher zusätzlich mit den Daten der Sensoren gefüttert wird.<br><br>
Andere Matrizen, die an den Kalman-Filter übergeben werden (<code>Q</code>,<code>R</code>und<code>Pk</code>), beeinflussen wie stark sich die mathematische Vorhersage und die Messung auf die Ausgabe des Filters auswirken.
Andere Matrizen, die an den Kalman-Filter übergeben werden (<code>Q</code>,<code>R</code>und<code>Pk</code>), beeinflussen wie stark sich die mathematische Vorhersage und die Messung auf die Ausgabe des Filters auswirken.
%% Cell type:code id:chief-cemetery tags:
%% Cell type:code id:chief-cemetery tags:
``` python
``` python
tini=0# Start time
tini=0# Start time
tfinal=25# End time
tfinal=25# End time
dt=0.01# Time Step
dt=0.01# Time Step
nflows=7# Number of data flows in the schematic
nflows=7# Number of data flows in the schematic
Ts=0.1# Sampling time for discrete time
Ts=0.1# Sampling time for discrete time
sc=Schema(tini,tfinal,dt,nflows)# Instance of the simulation schematic
sc=Schema(tini,tfinal,dt,nflows)# Instance of the simulation schematic
om=Ts
om=Ts
F=np.array([[cos(om),sin(om)],
F=np.array([[cos(om),sin(om)],
[-sin(om),cos(om)]])
[-sin(om),cos(om)]])
G=np.array([[0,0],[0,0]])
G=np.array([[0,0],
C=np.array([[1,0],[0,0]])# hier 4-Dimensional, aber erfüllt die gleiche Aufgabe wie C im oberen Code-Block
[0,0]])
Q=np.array([[3.25e-06,6.50e-05],# höhere Werte => geringere Berücksichtigung der Messung
C=np.array([[1,0],
[6.50e-05,1.30e-03]])
[0,0]])# hier 2x2, aber erfüllt die gleiche Aufgabe wie C im oberen Code-Block
R=np.array([[0.01,0],[0,0.01]])# höhere Werte => geringere Berücksichtigung der Messung
Q=np.array([[3.25e-06,6.50e-05],
[6.50e-05,1.30e-03]])# höhere Werte => geringere Berücksichtigung der Messung
R=np.array([[0.01,0],
[0,0.01]])# höhere Werte => geringere Berücksichtigung der Messung
xo=np.array([0,0.5])
xo=np.array([0,0.5])
Pk=np.array([[100,0],[0,100]])# höhere Werte => geringere Berücksichtigung des Ausgangszustandes xo
Pk=np.array([[100,0],
[0,100]])# höhere Werte => geringere Berücksichtigung des Ausgangszustandes xo
Es ist zu sehen, dass der Kalman-Filter es schafft, aus unserer mathematischen Vorhersage und den Daten der Sensoren, eine Ausgabe zu erzeugen, welche den Verlauf der Wellen nahekommt. Dies kann nun genutzt werden, um den Roboter möglichst gut zu balancieren.
Es ist zu sehen, dass der Kalman-Filter es schafft, aus unserer mathematischen Vorhersage und den Daten der Sensoren, eine Ausgabe zu erzeugen, welche den Verlauf der Wellen nahekommt. Dies kann nun genutzt werden, um den Roboter möglichst gut zu balancieren.
%% Cell type:markdown id:anonymous-franklin tags:
%% Cell type:markdown id:anonymous-franklin tags:
## Nähere Erklärung zum verwendeten Kalman-Filter:
## Nähere Erklärung zum verwendeten Kalman-Filter:
%% Cell type:markdown id:posted-visitor tags:
%% Cell type:markdown id:posted-visitor tags:
<imgsrc="bilder/v10_kalmanfilter.png"/>
<imgsrc="bilder/v10_kalmanfilter.png"/>
%% Cell type:markdown id:colored-desert tags:
%% Cell type:markdown id:colored-desert tags:
### Ablauf in KalmanFilter([...],[...],N,M,F,G,C,Q,R,xo,Pk,Ts):
### Ablauf in KalmanFilter([...],[...],N,M,F,G,C,Q,R,xo,Pk,Ts):