Brushless Motor per Arduino steuern

schnellmaleben

Erfahrener Benutzer
#21
Nen Kalmanfilter brauchst Du erst mal nicht. Der Gyro-Sensor liefert direkt die Führungsgröße.

Sobald Du aber auch die horizontale Lageregelung hinzu nimmst (mit dem Accelerometer) macht es (mit etwas mathematischem Talent) schon Sinn - MultiWii verwendet nur einen einfachen Komplementärfilter, mehr schafft die Platform eh nicht. Generell macht der Kalmanfilter Sinn, wenn Du abgeleitete Größen durch Integration etc. berechnen musst. Schöne Doku dazu ist hier, ist auch alles Quelloffen glaube ich.

Allerdings reicht für den ganzen Spaß dann kein Uno mehr, aber der Plan mit dem Galileo klingt gut, das is auf alle Fälle mal was Neues :)
 

das_copter_198

Erfahrener Benutzer
#22
Dann werde ich das mit dem Kalmanfilter erstmal verschieben. Wegen der PID, im Multiwii steht das ja so:

error = rc - imu.gyroData[axis];

Wem ich imu.gyroData[axis] dann als Grad zahl habe, dann sollte rc auch in Grad oder ist das egal, weil da bin ich mir nicht so sicher. Den ich glaube im Multiwii Sketch steht irgendwas von 500 bis -500 und das der Copter deshalb nicht schräger als 50 Grad stehen kann.
 

schnellmaleben

Erfahrener Benutzer
#23
Ne, ganz wichtig, regeln nach Gyro beachtet die absolute Ausrichtung des Copters nicht (das mit den 50° stimmt aber). Der Gyro liefert Drehraten in °/s, zur Bestimmung der absoluten Lage in ° brauchts das Accelerometer mit dazu. Du solltest also am Anfang das Ding mit Gyro/Acro/HeadingHold-Mode fliegen können, jedenfalls ist das zum Programmieren einfacher.

Genau in der Behandlung von Gyro und ACC unterscheiden sich auch die beiden PID-Implementierungen bei MultiWii, der erste PID-Controller berechnet Kp und Di für den ACC und Gyro erst mal getrennt und mischt die dann später, der ab Zeile 1281 macht es irgendwie 'logischer', finde ich jedenfalls (aber funktionieren tun beide). Wenn Du die Zeilen für ANGLE und HORIZON-Mode (gedanklich) wegnimmst & damit errorAngle ignorierst, wird es einfacher.

So, jetzt sind wir ganz schön weit vom Ausgangsthema weg ;)
 
Zuletzt bearbeitet:

das_copter_198

Erfahrener Benutzer
#24
Ein bisschen vom Ausgangsthema entfernt, aber leider kann man den Thread Titel nicht ändern ;)

Also wen ich nur mit dem Gyro regle ist das genau so wie wen ich bei Multiwii alle anderen Sensoren ausschalte. Das heißt ja dann er fliegt stabil aber er richtet sich nicht horizontal aus. Das würde dann heißen er berechnet den "error" aus den RC Werte zwischen -500 und 500 und den Gyrowerten, also °/s. Ich nehme an das die Gyrodaten, dann sowohl positiv als auch negativ sein können, je nachdem in welche Richtung der Gyro bewegt wird. Müssen die Gyrodaten dann einen bestimmen Wert haben damit die Berechnung des Errors stimmt oder kann ich einfach die Rohdaten des Gyros nehmen ohne Umrechnung?
 

das_copter_198

Erfahrener Benutzer
#25
Was mir heute noch eingefallen ist und was ich im Multiwii Sketch irgendwie nicht finde oder verstehe. Wen Throttle zum Beispiel bei 2000 ist und man dann steuert, dann kann der Wert eines Motors ja nicht mehr erhöht werden, was passiert dann? Wird dann gar nicht gesteuert oder was mach z.b. Multiwii in so einer Situation?
 

schnellmaleben

Erfahrener Benutzer
#26
Auch hier ist die Regelung immer aktiv. Immer :)

Das steht in Output.cpp Zeile 1580ff.

Geht ein Motor > 2000, wird das was zuviel ist von allen(!) Motorwerten abgezogen, sprich die anderen machen langsamer weil ja der eine nicht schneller kann. Somit kann immer noch die Drehrate korrigiert werden.
 

das_copter_198

Erfahrener Benutzer
#27
Ok, ergibt Sinn, das werde ich den Code mit einbauen. Ich habe heute noch mal ein paar Code durch geschaut und die Geschwindigkeit wird da durch Throttle und den PID Werten berechnet. Wen ich da die PID Regelung einfach mal rauslasse(ich weiß die ist immer aktiv) und 500 Roll gebe und Throttle 1500 wäre, wären die Throttlewerte dann 1000 und 2000 oder werden die 500 durch 2 geteilt und die Werte wären dann 1250 und 1750?

Welche Output.cpp meinst du? Weil in der 2.3 gibt es keine Zeile 1580
 
Zuletzt bearbeitet:

schnellmaleben

Erfahrener Benutzer
#28
Richtig, meinte Zeile 1420ff.

500 Roll wären ja Vollausschlag zu einer Seite, wenn Du maximale Drehrate willst dann natürlich 1000 & 2000 auf die Motoren. Das ist aber ganz schön heftig, ich würde die erst mal durch wesentlich größere Zahlen als zwei teilen, probier mal aus...

Am besten Du bindest Dein Konstrukt mal so fest dass es sich auf einer Achse drehen kann, dann kannst Du Sensorwerte erfassen, PID berechnen und auch solche Sachen mit der RC-Eingabe=>Drehrate berechnen. Im ersten Schritt würde ich aber nur den PID programmieren, der ist ja das wichtigste. Es reicht ja wenn Du das Ding anschubst und guckst ob und wie es reagiert. Die Verarbeitung der Steuersticks und Throttle erst in weiteren Schritten...

Warum soll es eigentlich ein Bicopter werden? Wie erzeugt der eigentlich eine Drehung auf der Roll-Achse (und Yaw?)?
 

das_copter_198

Erfahrener Benutzer
#29
Ja das mit einer Axe hatte ich vor. Hab mir sogar schon ein Gestell gebaut. Heute sollte die MPU kommen und Ende der Woche Motoren. Esc, Servos und Arduino liegt noch rum. Ein Bicopter macht die Yaw Und die Pitch Axe mit Servos, als unter die Beiden Motoren einen Servo. Ich wollte mal ein bisschen Abwechslung von Quadrocopter :) Am Anfang werde ich mal eine PID Regelung nur mit Gyro machen. Dannach hattte ich vor die PID mit Acc und Gyro zumachen. Im Arduino Code steht ja das rx von 0 bis 500 geht damit der copter nicht mehr als 50 grad hat. Bedeutet das das 100 Rx = 10 Grad sind?
 

das_copter_198

Erfahrener Benutzer
#30
So Mpu ist da und ich hab die auch gleich mal ausprobiert. Die Werte schwanken zwar noch aber das ist erstmal nicht ganz so wichtig. Ich wollte jetzt vom Acc den Winkel berechnen für X und Y ging das auch aber ich weiß nicht wie ich das bei Z machen muss. Für X und Y rechnet man ja: atan2(accX, accZ) * RAD_TO_DEG damit funktioniert das auch ganz gut aber halt nur für X und Y. Gibt es eine allgemeine Formel um das umzurechnen für alle Axen oder wird die Z Achse anders berechnet?
 

schnellmaleben

Erfahrener Benutzer
#31
Für Z gehts nicht, das ist ja das "Heading", also die absolute Ausrichtung bezogen auf die horizontale Ebene. Das kann Dir nur der Kompass sagen. Außerdem Achtung wenn das ganze später in Bewegung ist: Du arbeitest da mit dem Vektor der Erdbeschleunigung der immer nach "unten" zeigt, später lässt der sich nicht von Beschleunigungen des Antriebs ,die auf allen Achsen auftreten können, auseinanderhalten. Siehe hier Zeile 211.

Die relative horizontale Ausrichtung (aber auch die der anderen Achsen) kriegt man durch Integrieren (diskret: aufsummieren) der Gyro-Werte hin.
 

das_copter_198

Erfahrener Benutzer
#32
Also kann ich mit dem Acc nur den Winkel der X und Y Axe errechen. Ich habe hier einen Link gefunden. Da wird der Winkel der X und Y Axe mit den Acc berechnet und die Gyrowerte werden auch in Grad/Sekunde umgerechnet. Diese Werte werden kann durch einen Kalmanfilter geschickt und dannach kommt ein Wert für X und Y raus. Kann ich das zum testen einer Axe so machen, also das ich zum Beispiel den entgültigen X Winkel nehme und den dann der PID Regelung der X Axe gebe. Evlt. würde ich auch einen Komplementärfilter nehmen. Wird die Z Achse dann nur mit dem Gyro geregelt oder auch teilweise mit dem Acc?
 

schnellmaleben

Erfahrener Benutzer
#33
Der Link sieht ganz gut aus. Auch das mit dem Kalman-Filter kannste erst so übernehmen, ist ja für die MPU6050 passend.

Also bei Coptern habe ich bisher nur gesehen dass primär auf dem Gyro geregelt wird und sekundär/mit reingerechnet der ACC :)

Offensichtlich geht es auch anders, siehe deren Folgeprojekt: https://github.com/TKJElectronics/Balanduino/blob/master/Firmware/Balanduino/Motor.ino (auch Balanduino.ino angucken)

Die PID-Berechnung da arbeitet rein auf dem absoluten Winkel. Wenn der Wert stabil ist und entsprechend gefiltert mag es gehen, ich halte es aber für ein ungewöhnliches und nicht sinnvolles Vorgehen das auf eine Copter-Lageregelung zu übertragen. Mit dem Gyro kannste halt alle Achsen etwa gleich regeln, hast aber evtl. Drift, das kann der ACC ausgleichen. Gleich auf absoluter Ausrichtung zu regeln verbaut evtl. Möglichkeiten, da muss ich aber erst mal drüber nachdenken.
 

das_copter_198

Erfahrener Benutzer
#34
So wie in dem Beispiel hatte ich es eigentlich auch vor. Ich wollte es eigentlich so realisieren, das ich die Acc Werte und die Gyro Werte mit einem Kalmanfilter berechne, damit ich exakte Werte haben, damit kein Drift entstehen kann und der Copter sich immer ganz gerade ausrichtete. Weil die Gyro und Acc Werte stimmen ja nicht zu 100% und beim Gyro haben die Werte ja nach einer Zeit eine größere Abweichung und das Acc alleine würde auch nicht 100%-tig richtig sein und wen man die Werte filtert hat man halt einen genauen Winkel ohne Abweichungen. Ich denke das sollte eigentlich funktionieren. Denn wen der Copter dann gerade ist, müsste der Winkel 180° sein. Zu diese 180° kommt dann noch die RX Eingabe, als Winkel dazu. Und von diesem Wert wird dann der gemessene Wert abgezogen. Und diese Differenz wird dann als "error" für die Regelung benutzt. Das sollte doch funktionieren? Wen die Motoren kommen werde ich das mal mit einer Axe testen ob das so geht. Wird das gut funktionieren oder eher gar nicht?
 

schnellmaleben

Erfahrener Benutzer
#35
Probier mal aus, weiß nicht :) Würde drauf tippen dass es prinzipiell auch so geht wie Du es vorhast, der Balancierrobot tut ja mit dem Ansatz.

Weißt Du schon wie es weitergeht mit der BiCopter-Sache & Servos, sprich ich habe jetzt verstanden dass man die Rotoren zueinander kippt es ein Gegen-Drehmoment auf Pitch gibt. Aber wie man Yaw steuert ist mir immer noch ein Rätsel. OK, mit zwei Servos pro Motor würds gehen?
 

das_copter_198

Erfahrener Benutzer
#36
Unter jedem Motor kommt ein Servo. Wen man beide Servos nach vorne neigt, neigen sich auch beide Motoren nach vorne und der Schub geht dann auch nach vorne, so wird Pitch gesteuert. Bei Yaw wird ein Servo/Motor nach vorne gekippt und einer nach hinten. So funktioniert ein BiCopter. Ich hoffe das sich der ganze Copter bei Pitch nach vorne neigt, wie bei nem Heli weil sonst weiß ich nicht wie ich Pitch regeln soll. Das mit dem Winkel werde ich ausprobieren wen die Motoren da sind.
 

das_copter_198

Erfahrener Benutzer
#37
Ich habe gerade einen Sketch geschrieben und die Kalman.h übernommen. Wen ich den seriellen Monitor öffne beginnt der Wert bei Null wird größer bis ca. 220 dann wird er wieder kleiner bis er bei 180° ist bei welcher Position er auch gestartet wurde. Dannach zeigt er die Werte genau an. Ist das normal das der ein paar Sekunden braucht bis der die richtige Position hat oder habe ich etwas falsch gemacht?
 

das_copter_198

Erfahrener Benutzer
#38
Hallo,

ich habe heute nochmal wegen dem Filter geschaut. Also die AccWerte und Gyrowerte hab ich Grad bzw. Grad/Selunde umgerechnet. Für den Kalmanfilter benutze ich folgenen Code:

float Q_angle = 0.001; //0.001
float Q_gyro = 0.003; //0.003
float R_angle = 0.03; //0.03

float x_angle = 0;
float x_bias = 0;
float P_00 = 0, P_01 = 0, P_10 = 0, P_11 = 0;
float dt, y, S;
float K_0, K_1;

float kalmanCalculate(float newAngle, float newRate,int looptime) {
dt = float(looptime)/1000;
x_angle += dt * (newRate - x_bias);
P_00 += - dt * (P_10 + P_01) + Q_angle * dt;
P_01 += - dt * P_11;
P_10 += - dt * P_11;
P_11 += + Q_gyro * dt;

y = newAngle - x_angle;
S = P_00 + R_angle;
K_0 = P_00 / S;
K_1 = P_10 / S;

x_angle += K_0 * y;
x_bias += K_1 * y;
P_00 -= K_0 * P_00;
P_01 -= K_0 * P_01;
P_10 -= K_1 * P_00;
P_11 -= K_1 * P_01;

return x_angle;
}

Wen ich dem Filter jetzt die passenden Werte übergebe sind diese erst nach ca. 10 Sekunden richtig. Das selbe passiert auch den ich dem Filter feste Werte gebe, also für AccAngle = 180, Gyro = 0 und looptime = 100. Ist das immer so bei einem Kalmanfilter oder sollte das anders sein?

LG Vincent
 

das_copter_198

Erfahrener Benutzer
#39
Hallo,

nachdem ich jetzt genug mit der MPU gespielt habe, wollte ich jetzt beginnen mal die PID Regelung zuschreiben. Am Anfang wollte ich eine reine Gyrosteuerung machen. Jetzt weiß ich aber nicht welche Werte ich für die Steuerung verwenden soll. Kann ich die Werte des Gyros direkt nehmen oder müssen die Werte erst noch in Deg/Sec umgerechnet werden. Oder irgendwie anders?
 

schnellmaleben

Erfahrener Benutzer
#40
Unter jedem Motor kommt ein Servo. Wen man beide Servos nach vorne neigt, neigen sich auch beide Motoren nach vorne und der Schub geht dann auch nach vorne, so wird Pitch gesteuert.
Ja, der Schub schon, d.h. er fliegt nach vorne, aber dadurch dreht sich ja der Copter nicht (um die Pitch-Achse)!? Würde sagen er dreht sich maximal nach hinten, aufgrund des Kreisel-Trägheitsmoment der Propeller. Also irgendwie beeinflussen sich da zwei Sachen.

Wegen dem konkreten Kalman-Verhalten - kein Plan - hab denselben Aufbau ja nicht hier ;)

... beginnen mal die PID Regelung zuschreiben. Am Anfang wollte ich eine reine Gyrosteuerung machen. Jetzt weiß ich aber nicht welche Werte ich für die Steuerung verwenden soll. Kann ich die Werte des Gyros direkt nehmen oder müssen die Werte erst noch in Deg/Sec umgerechnet werden. Oder irgendwie anders?
Wie Du willst. Zeichne mal paar Werte auf, such Dir Variablen aus in die alles reinpasst und prüfe ob nach den PID-Berechnungen was sinnvolles rauskommt ;) Meiner Meinung nach ist es in einer nachvollziehbaren Einheit einfacher, aber direkt geht auch ("direkt" ist ja auch in einer bestimmten Einheit, steht im Datenblatt der MPU6050). Du musst die Koeffizienten Kp, Ki, Kd ja eh passend bestimmen und sicher hier und da noch Wertebereiche beschränken und skalieren, damit am Ende sinnvolle Werte für die ESCs rauskommen.
 
FPV1

Banggood

Oben Unten