Forum: Mikrocontroller und Digitale Elektronik Quadrocopter | FlightControler | Das Kalmanfilter


von Marco (Gast)


Lesenswert?

Hallo,
seit ca. 4Monate baue ich einen Quadrocopter. Als Sensor nutze ich einen 
MPU 9250. Die ausgelesene Daten fusioniere und Filter ich mit ein 
Kalmanfilter. Habe probiert das Kalmanfilter zu verstehen, jedoch 
schaffe ich es nicht und deswegen habe ich einen OpenSource Code 
verwendet.

Nun macht der Filter schon recht geile Werte und ich bin wirklich 
erstaunt darüber was er kann. Würde Ihn nun aber gerne noch optimieren, 
da der Winkel noch um 4° schwankt. Im Code kann man Ihn optimieren über

Q_angle_pitch
Q_bias_pitch
R_measure_pitch

jedoch verstehe ich nicht genau, was dahinter steckt. Kann mir an dieser 
Stelle jemand weiter helfen und mir eventuell sagen, wie ich die 3 Werte 
einstellen kann, was ich berechnen muss bzw was sie bedeuten.



1
#include "Kalman.h"
2
#include "mbed.h"
3
4
/*PITCH*/
5
/*PITCH*/
6
/*PITCH*/
7
8
void Kalman_pitch(void) 
9
{
10
    /* We will set the varibles like so, these can also be tuned by the user */
11
    Q_angle_pitch = 0.001;
12
    Q_bias_pitch = 0.003;
13
    R_measure_pitch = 0.03;
14
    
15
    bias_pitch = 0; // Reset bias
16
    // Since we assume tha the bias is 0 and we know the starting angle (use setAngle), 
17
    // the error covariance matrix is set like so - see: http://en.wikipedia.org/wiki/Kalman_filter#Example_application.2C_technical
18
    P_pitch[0][0] = 0;
19
    P_pitch[0][1] = 0;
20
    P_pitch[1][0] = 0;
21
    P_pitch[1][1] = 0;
22
}
23
// The angle should be in degrees and the rate should be in degrees per second and the delta time in seconds
24
double getPitch(double *newAngle_pitch, double *newRate_pitch, double *dt) 
25
{
26
    // Discrete Kalman filter time update equations - Time Update ("Predict")
27
    // Update xhat - Project the state ahead
28
    /* Step 1 */
29
    rate_pitch = (*newRate_pitch) - bias_pitch;
30
    angle_pitch += (*dt) * rate_pitch;
31
    
32
    // Update estimation error covariance - Project the error covariance ahead
33
    /* Step 2 */
34
    P_pitch[0][0] += (*dt) * ((*dt) * P_pitch[1][1] - P_pitch[0][1] - P_pitch[1][0] + Q_angle_pitch);
35
    P_pitch[0][1] -= (*dt) * P_pitch[1][1];
36
    P_pitch[1][0] -= (*dt) * P_pitch[1][1];
37
    P_pitch[1][1] += Q_bias_pitch * (*dt);
38
    
39
    // Discrete Kalman filter measurement update equations - Measurement Update ("Correct")
40
    // Calculate Kalman gain - Compute the Kalman gain
41
    /* Step 4 */
42
    S_pitch = P_pitch[0][0] + R_measure_pitch;
43
    /* Step 5 */
44
    K_pitch[0] = P_pitch[0][0] / S_pitch;
45
    K_pitch[1] = P_pitch[1][0] / S_pitch;
46
    
47
    // Calculate angle and bias - Update estimate with measurement zk (newAngle)
48
    /* Step 3 */
49
    y_pitch = (*newAngle_pitch) - angle_pitch;
50
    /* Step 6 */
51
    angle_pitch += K_pitch[0] * y_pitch;
52
    bias_pitch += K_pitch[1] * y_pitch;
53
    
54
    // Calculate estimation error covariance - Update the error covariance
55
    /* Step 7 */
56
    P_pitch[0][0] -= K_pitch[0] * P_pitch[0][0];
57
    P_pitch[0][1] -= K_pitch[0] * P_pitch[0][1];
58
    P_pitch[1][0] -= K_pitch[1] * P_pitch[0][0];
59
    P_pitch[1][1] -= K_pitch[1] * P_pitch[0][1];
60
    
61
    return angle_pitch;
62
}

von Florian (Gast)


Lesenswert?

Hallo Marco,

ein Kalman-Filter ist alles andere als einfach zu verstehen und in 
Betrieb zu nehmen. Vor allem, weil Du Dir nie sicher sein kannst ob er 
sich nicht doch aufhängt. Das kannst Du nur über viele Simulationen 
sicher stellen.
Für Dein Projekt würde ich Dir dringend abraten diese Methode 
einzusetzen.
Man kann die Sensoren auch einfacher und vor allem nachvollziehbarer 
fusionieren

Ev. kannst Du mal im Projekt "autoquad.org" source code durchsehen, dort 
wird ebenfalls ein Kalman-Filter verwendet. Dies führt zu sehr sehr 
guten Flugeigenschafften. Leider ist das Projekt aber "verdampft".

Gruß
Florian

von Marco (Gast)


Lesenswert?

Hey Florian,
Das ich den Filter nicht verstehen werde, ist mir wie oben erwähnt 
völlig bewusst.

Meine Rohdaten schwanken um 40° und bis jetzt macht das Kalman Filter 
gute Arbeit und ich erhalte Schwankungen von 2°, denke aber das man es 
noch optimieren kann, mit den drei Werten  Q_angle_pitch, Q_bias_pitch 
und R_measure_pitch. Deswegen meine Frage, ob mir jmd sagen kann, was 
die Werte aussagen bzw wie ich den optimalen Wert finden kann.

autoquad.org nutzt einen fertigen FlightControler, da es mir um die 
Entwicklung eines eigenen geht, bringt mir die Seite nicht so viel. 
Zumindest was ich auf den ersten Blick dort sehe.

Danke Dir trotzdem für deine Antwort.

Gruß
Marco

von Marco (Gast)


Lesenswert?

Ist der Kalmanfilter echt so kompliziert, dass keiner hier Ahnung davon 
hat?

von flips (Gast)


Lesenswert?

Warum schwanken denn die Werte so extrem? Ich habe meinen Quadro damals 
komplett ohne Filter realisiert und lediglich ganz simple PID-Regler und 
einfachste Fusionierung realisiert und er steht wie eine 1 in der Luft.

Mein Fazit war damals sowas ist völlig unnötig. :-)

von Sinus T. (micha_micha)


Lesenswert?


von Vincent H. (vinci)


Lesenswert?

Marco schrieb:
> Ist der Kalmanfilter echt so kompliziert, dass keiner hier Ahnung davon
> hat?

Du hast 8! (in Worten: ACHT) Sätze Einleitung geschrieben und am Ende 
des ersten Absatzes selbst geschrieben, dass du das Filter nicht 
verstehst. Die Methoden um die Kovarianzmatrizen Q und R zu ermitteln 
sind (meist) derart komplex, dass man in Relation das Grundverständnis 
des Filters als lineare Algebra betrachten kann... Da reichen kaum 8 
Semester Uni...

Weißt du überhaupt was Q und R so grob aussagen? Die hängen stark 
vereinfacht ausgedrückt von der Güte deiner Sensoren ab. Bevor du nicht 
gewillt bist ein Gyroskop in der Preisklasse eines Mittelklasse-PKWs zu 
kaufen, brauchst du dir über die Optimierung von Q und R abseits von 
klassischem Ausprobieren nicht wirklich den Kopf zu zerbrechen.


flips schrieb:
> Mein Fazit war damals sowas ist völlig unnötig. :-)

Bei einem Hobby-Modell, dass mit einem 0.20€ 9-DOF Sensor ein bisserl 
herumfliegen soll... ja. Bei einem 320M$ U-Boot, dass ein halbes Jahr 
auf Tauchgang geht, nein.

von flips (Gast)


Lesenswert?

> Bei einem 320M$ U-Boot, dass ein halbes Jahr
> auf Tauchgang geht, nein.

ich hoffe doch, dass der Quadro nicht auf Tauchgang geht. Von 
nukleargetriebenen Ubooten mit Atomraketen-Bewaffnung war nie die Rede

Aber ansonsten hast du natürlich recht. Mein Hinweis an den TO war 
lediglich auf dem Verdacht gegründet, dass etwas anderes nicht stimmt. 
Ev. ein Hardwarefehler oder ein mechanisches Problem...

:-))

von Dieter F. (Gast)


Lesenswert?

Marco schrieb:
> Ist der Kalmanfilter echt so kompliziert, dass keiner hier Ahnung davon
> hat?

Wenn Du des englischen mächtig bist und etwas Zeit aufwenden möchtest

https://www.youtube.com/watch?v=CaCcOwJPytQ&list=PLX2gX-ftPVXU3oUFNATxGXY90AULiqnWT&index=1

Da ist er erschöpfend und wirklich gut erklärt.

von Chris J. (Gast)


Lesenswert?

Hallo,

falls Du gewillst bist dich in die Theorie der Sensor Verknüpfung 
einzuarbeiten kann ich Dir begleitend den Source Code des Ardupilot 
Flightstack empfehlen, den ich selbst für meinen Copter benutze. Er 
fliegt mit einer Pixhawk, die einen F429 ARM Cortex enthält, der auch 
jede Menge Kalman Filter als SW aufgespielt bekommt. Die verknüpfen 
Gyros, Luftdruck, GPS und Kompass miteinander.

Nur so als Tip: In solchen Flugsteuerungen stecken hunderte Mannjahre 
ganzer Entwicklerteams. Das kriegst du nicht mal eben allein hin.

Gruss,
Chris

von Wolfgang (Gast)


Lesenswert?

Chris J. schrieb:
> Die verknüpfen Gyros, Luftdruck, GPS und Kompass miteinander.

Gyros und Luftdruck verknüpfen die bestimmt nicht miteinander - was soll 
das bringen.

Der barometrische Luftdruck wird mit der GPS-Höhe zu einer sauberen 
Flughöhe fusioniert, damit bei örtlichen Luftdruckänderungen die Höhe 
nicht weg läuft, aber man trotzdem nicht an den aberwitzigen 
Höhenschwankungen des GPS dran hängt. Durch die Fusion von Kompass und 
Gyro wird die Gyrodrifterei eliminiert. So ein Hexenwerk ist das nun 
auch wieder nicht.

von Conny G. (conny_g)


Lesenswert?

Marco schrieb:
> Hey Florian,
> Das ich den Filter nicht verstehen werde, ist mir wie oben erwähnt
> völlig bewusst.
>
> Meine Rohdaten schwanken um 40° und bis jetzt macht das Kalman Filter
> gute Arbeit und ich erhalte Schwankungen von 2°, denke aber das man es
> noch optimieren kann, mit den drei Werten  Q_angle_pitch, Q_bias_pitch
> und R_measure_pitch. Deswegen meine Frage, ob mir jmd sagen kann, was
> die Werte aussagen bzw wie ich den optimalen Wert finden kann.
>
> autoquad.org nutzt einen fertigen FlightControler, da es mir um die
> Entwicklung eines eigenen geht, bringt mir die Seite nicht so viel.
> Zumindest was ich auf den ersten Blick dort sehe.
>
> Danke Dir trotzdem für deine Antwort.
>
> Gruß
> Marco

Hi Marco,

ich habe selbst noch nicht mit dem Kalman gearbeitet, mich aber kürzlich 
mal ein bisschen eingelesen.
Wenn ich das richtig verstehe, dann ist die P_Pitch Matrix der Kalman 
Gain und liegt als Vektorlänge zwischen 0 und 1. Wobei der Gain sagt 
wieviel von neuen Messwerten in die neue Schätzung eingeht, 1 heißt: die 
Werte werden als zuverlässig eingestuft, die neue Schätzung geht schnell 
/ sofort den neuen Messwerten nach. 0 oder sehr klein das Gegenteil, die 
neue Schätzung wird schwach von den neuen Messwerten beeinflusst.
Nun kann Deine Abweichung von 2 Dingen kommen: die Messwerte sind sehr 
ungenau oder der Kalman reagiert zu träge.
Da die Werte Q_angle_pitch und Q_bias_pitch sehr niedrig sind kannst Du 
einfach mal versuchen Sie um den Faktor 10 auf 0.01 zu erhöhen.
Dann reagiert der Filter sehr viel schneller.
Im Prinzip macht der Filter einen Kompromiss aus Genauigkeit und 
Trägheit - man kann Messfehler kompensieren, aber es kostet Zeit, weil 
ein niedriger Gain neue Werte nur zögerlich durchlässt.
Wenn wiederum der Gain zu hoch wird dann kommen die Messfehler durch.

Viele Grüße,
Conny

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.