Ich arbeite zurzeit an einem Flightcontroller und habe es zum
Interessanten Teil geschaft, der Lageregelung.
Aus Beschleunigungssensor und Gyroskop Winkel ermitteln, mittels
komplementär Filter vereinigen und den PID-Regler eine Antwort berechnen
lassen.
Nur kann ich mir nicht erklären wie ich einen korrekten Winkel aus den
Daten des Beschleunigungssensors errechne, da die Erdbeschleunigung doch
jede Berechnung verfälscht.
Ein Nullen der Z-Achse dürfte das Problem nicht lösen, in Schräglage
zeigt die Erdanziehung auch auf den anderen Achsen Auswirkungen...
Berechnen würde ich den Winkel zunächst mit atan2().
Carlo schrieb:> wie ich einen korrekten Winkel aus den> Daten des Beschleunigungssensors errechne, da die Erdbeschleunigung doch> jede Berechnung verfälscht.
Minus 9,81m/s^2.
Carlo schrieb:> in Schräglage> zeigt die Erdanziehung auch auf den anderen Achsen Auswirkungen...
Genau DAS ist der Sinn!
Für eine Lage-/Beaschleunigungsregelung musst du natürlich die Daten der
Gyroskope mit verrechnen.
Erstmal ... Die Beschleunigungssensoren sind nicht genau genug, um per
integration die Geschwindigkeit zuverlaessig zu erhalten, noch weniger
taugen sie um durch Doppelintegration die Position zu erhalten. Sie
geben einen Hinweis.
Wenn man die Hoehe moechte, sollte man einen barometrischem Drucksensor
verbauen.
Es gibt die tatsaechliche Lage, mit dem tatsaechlichen Bewegungsvektor,
und dann gibt es den scheinbaren Bewegungsvektor, der sich vom
tatsaechlichen Bewegungsvektor durch die Bewegungsgleichungen
unterscheidet. Daraus gibt es dann auch eine scheinbare Position.
Falls man in der etwas besseren Lage ist, die Position per GPS zu
erhalten, kann man sich mehr Abweichung bei den Bewegungsgleichungen
erlauben. Falls man die Position nicht hat, sollte man per
barometrischem Druck die Hoehe haben. Per Energieerhaltung und
Flugeigenschaften kann man die Bewegungsgleichungen zurueckkalibrieren.
Diese Energieerhaltungs Gleichungen sind bei einem Flieger einfacher als
bei einer Drohne haette ich mal angenommen. Denn ein Flieger setzt Hoehe
sehr effizient in Geschwindigkeit um.
Der PID ist uebrigens das Einfachste, und funktioniert eigentlich nur
bei einer Drohne im stabilen Zustand.
Ohne die Erdbeschleunigung hättest du gar keine Information über die
absolute Lage. Den Winkel bekommst du ja genau deswegen weil sich die 1g
auf die 3 Achsen je nach Lage verteilen. Der Betrag des Vektors ist
immer 1g (sofern keine zusätzliche Beschleunigung im Spiel ist) und die
Lage ergibt sich aus der Aufteilung der 3 Achsen.
Das Gyroskop gibt dir die Winkelgeschwindigkeit und liefert dir durch
Integration der Winkelgeschwindigkeit ebenfalls den Absoluten winkel,
welcher allerdings driftet. Den Drift von Pitch und Roll gleichst du
über längere Zeit mit dem Beschleunigungssensor aus, den Yaw Drifst
kannst du hingegen nur mit einem Magnetfeldsensor ausgleichen.
Den Drift den Gyros sollte man vorher einmal über ein paar hundert
Samples auswerten und dann kontinuierlich vom Messwert abziehen (für
jede Achse separat natürlich).
Das ganze schmeisst man im einfachsten Fall einfach in ein
Komplementärfilter
Winkel = 0.99*(Winkel+Gyro*dt) + 0.01*WinkelausAcc;
Thread-Ersteller hier, durch das Verschieben zum Offtopic-Board musste
ich mich registrieren.
Demzufolge addiere ich die Beschleunigungen von X,Y,Z und prüfe sie auf
~1g, wenn das zu trifft berechne ich die Lage?
Aber wenn ich bspw. eine Beschleunigung gegen die Erdanziehung habe und
ganz zufällig auf ~1g komme ist die errechnete Lage doch unbrauchbar?
> Das ganze schmeisst man im einfachsten Fall einfach in ein> Komplementärfilter> Winkel = 0.99*(Winkel+Gyro*dt) + 0.01*WinkelausAcc;
Hier kommt mir die Frage auf was passiert wenn ich keine ~1g hab, also
keinen brauchbaren Winkel vom Beschleunigungssensor erhalte? Sollte ich
dann für diesen Durchlauf 100% auf das Gyro geben oder den zuletzt
gültigen Wert des Beschleunigungssensors benutzen?
PS: Danke für die rundum Infos, Magnetometer, Barometer, GPS-Modul,
alles liegt bereit doch dazu komme ich erst später. Zunächst ist das
Ziel Pitch und Roll von Gyroskop und dem Beschleunigungssensor zu
erhalten.
Benny S. schrieb:> Hier kommt mir die Frage auf was passiert wenn ich keine ~1g hab, also> keinen brauchbaren Winkel vom Beschleunigungssensor erhalte? Sollte ich> dann für diesen Durchlauf 100% auf das Gyro geben oder den zuletzt> gültigen Wert des Beschleunigungssensors benutzen?
Ja genau. Der Drift vom Gyro ist auch nicht so riesig, sodass man in der
Regel auch einige Sekunden ohne Acc leben kann. Ich mache es bei meinem
Copter so:
1
// accMagnitude = Betrag accVektor => prüfen auf max 1.2g, min 0.8g
>Hier kommt mir die Frage auf was passiert wenn ich keine ~1g hab, also
keinen brauchbaren Winkel vom Beschleunigungssensor erhalte? Sollte ich
dann für diesen Durchlauf 100% auf das Gyro geben oder den zuletzt
gültigen Wert des Beschleunigungssensors benutzen?
PS: Danke für die rundum Infos, Magnetometer, Barometer, GPS-Modul,
alles liegt bereit doch dazu komme ich erst später. Zunächst ist das
Ziel Pitch und Roll von Gyroskop und dem Beschleunigungssensor zu
erhalten.
....
Wenn der Absolutwert der Beschleunigung nicht 1g ist, gibt es
offensichtlich eine zusaetzliche Beschleunigung. Die kann sich ergeben
durch :
-eine Motorinduzierte Beschleunigung - ersichtlich an der Ansteuerung
-eine Kurvenbeschleunigung in 3D - ersichtlich am Gyro
-ein Luftloch, geht hinunter - ersichtlich am Barometer
-ein Auftriebsschlauch, geht hinauf - ersichtlich am Barometer
Das Fluggeraet befindet sich in einer Differentialgleichung, die
abgespult wird. Und da muss man mitrechnen. In der Mitte beginnen geht
nicht. Ein Sample aus der Mitte des Ablaufes ist wertlos.
Ich empfehl erst mal eine Simulation zu schreiben. Welche Fluglagen
ergeben welche Sensorwerte. Und dann das Ganze passiv, dh ohne Antrieb,
zB an einer Schnur aufgehaengt zu verifizieren.