Hallo zusammen, ich möchte eine Regelung für einen Hexacopter realisieren. Ich habe allerdings ein grundsätzliches Problem, zudem mir noch keine Lösung eingefallen ist. Und zwar geht es konret darum, dass ich aus den vorgegebenen Momenten(Mx,My,Mz) und der Gesamtschubkraft(Fz) die sechs Rotorgeschwindigkeiten bestimmen möchte. Also nach dem Regelkreis wenn klar ist welches Manöver ausgeführt wird und dieses "nur noch" auf de Motoren übertragen werden muss. Mir ist diese Berechnung von einem Quadrocopter (mit 4 Motoren) bekannt und auch einleuchtend. Aber wie funktioniert das bei 6 Motoren? Folgendes Gleichungssystem habe ich aufgestellt und gilt es auszuwerten: -Fz = b*(w1^2+ w2^2+w3^2+w4^2+w5^2+w6^2) Mx = m*(w5^2+w6^2-w2^2-w3^2) My = b*(c*(w1^2-w4^2)+a*(w2^2+w6^2-w2^2-w3^2)) Mz = d*(-w1^2-w3^2-w5^2+w2^2+w4^2+w6^2) w1 -> w6 sind die Werte die ich berechnen möchte, allerdings ist dies lediglich aus diesen 4 Gleichungen nicht möglich. Ideal wäre eine Antwort von jemandem der weiß wie dies im allgemeinen bei Hexacoptern realisiert wird. Leider ist es sehr schwer ausführliche Theorie zu dieser Thematik zu finden. Im Anhang ist die Anordnung der Motoren gezeigt wobei Motor 1 in der positiven x-Achse liegt (Koordinatenursprung in der Mitte). P.S. Ich habe die Frage auch schon in einem Mikrocopter-forum gepostet.
Und der Grund einen Hexacopter zu bauen? Weil er bessere Eigenschaften hat? Mehr Schub, mehr Stabilitaet gegen Boen? Oder einfach mal ausm Bauch raus... was die koennen koennen wir schon lange - und noch eins obendrauf? Als erster Ansatz, ohne mir die Grundlagen erst reinzuziehen.. den Quadrokopter rechnen, und die Werte fuer den Hexa zusammen mischen, resp als linearkombination rechnen.
Ich möchte einen Hexacopter (vor allem deswegen) weil er mehr Last transportieren kann, und ich ungern mit einem Quadcopter anfange um dann festzustellen, hier und da an Grenzen zu stoßen und dann doch auf einen Hexa umsteigen "muss". Eigentlich sollte meine Motivation einen Hexacopter zu bauen aber kein Bestandteil der Frage sein. Diese Entscheidung steht für mich fest. Das heißt du würdest empfehlen, die Werte des Quadro zu berechnen und in Kombination mit der Wunsch-Bewegung, diese Werte auf die sechs Motoren des Hexas verteilen. was meinst du mit: T. roll schrieb: > resp > als linearkombination rechnen.
Hexa hat mit mehr Last eher weniger zu tun (dafür gibts stärkere Motoren/stärkere Akkus) als vielmehr mit Ausfallssicherheit: Ein Quadro fliegt bei Ausfall eines Motors mit Sicherheit in die "Humusphäre", ein Hexa (oder Okto) lässt sich noch stabilisieren / sicher landen.
Der Unterschied der Motivation koennte sich ja auch im mathematischen Wissen niederschlagen... Der Quadro hat die Stellglieder bei 0, 90, 180, 270 Grad. Weisen wir die Nick und Roll Momente so zu : Nick := + N @0 & -N @180 Roll := + R @90 & -R @270 Mit N & R den differentiellen Kraeften ueber den Diagonalen. Das Dreh-Moment um die vertikale Achse ist der Unterschied zwischen links und rechtslaufenden Motoren. Dreh : proportional N + R Dh wenn man nichts macht fuehren Nicken und Rollen auch zu einer Drehung um die Hochachse. Dh unser koordinatensystem ist nicht fest am Flieger, sondern bezueglich der Bewegungsrichtung. Der Hexa hat seine Stellgleider bei 0, 60, 120, 180, 240, 300 Grad. Und Nick und Roll werden so zusammngesetzt: Nick := + A @0 + Bcos60@60 + C cos120@120 -A@180 -... Roll := Mit A, B, C den differentiellen Kraeften ueber den Diagonalen. Dh man steuert fuer den Auftrieb diagonal entgegengesetzte Motoren mit einem Gleichsignal an, und fuer ein Moment um eine Achse mit einem Differenzsignal. Dh man hat schliesslich diese 4 virtuellen Stellgroessen F1 fuer den Auftrieb F2, F3, F4 fuer die Momente um die 3 um 60 Grad versetzten Achsen Setzen wir den Auftrieb gleich Konstant. Dann haben wir fuer die drei Momente Nick, Roll & Dreh, somit drei Stellgroessen F2, F3, F4. Die Stellgroessen sind zwar nicht unabhaengig. Das sollte doch fast passen.
Also beim MultiWii Projekt haben die das so gemacht
1 | #ifdef HEX6
|
2 | motor[0] = PIDMIX(-7/8,+1/2,+1); //REAR_R |
3 | motor[1] = PIDMIX(-7/8,-1/2,-1); //FRONT_R |
4 | motor[2] = PIDMIX(+7/8,+1/2,+1); //REAR_L |
5 | motor[3] = PIDMIX(+7/8,-1/2,-1); //FRONT_L |
6 | motor[4] = PIDMIX(+0 ,-1 ,+1); //FRONT |
7 | motor[5] = PIDMIX(+0 ,+1 ,-1); //REAR |
8 | #endif
|
Beim Quad siehts so aus (je nachdem ob + oder X)
1 | #ifdef QUADP
|
2 | motor[0] = PIDMIX( 0,+1,-1); //REAR |
3 | motor[1] = PIDMIX(-1, 0,+1); //RIGHT |
4 | motor[2] = PIDMIX(+1, 0,+1); //LEFT |
5 | motor[3] = PIDMIX( 0,-1,-1); //FRONT |
6 | #endif
|
7 | #ifdef QUADX
|
8 | motor[0] = PIDMIX(-1,+1,-1); //REAR_R |
9 | motor[1] = PIDMIX(-1,-1,+1); //FRONT_R |
10 | motor[2] = PIDMIX(+1,+1,+1); //REAR_L |
11 | motor[3] = PIDMIX(+1,-1,-1); //FRONT_L |
12 | #endif
|
mit
1 | #define PIDMIX(X,Y,Z) rcCommand[THROTTLE] + axisPID[ROLL]*X + axisPID[PITCH]*Y + YAW_DIRECTION * axisPID[YAW]*Z
|
Vielen vielen dank schon einmal für die ausführlichen Antworten! Entspricht folgende Aussage deiner(hacky) Überlegung: Vier Rotorgeschwindigkeiten aus den Gleichungen mit den Drehmomenten und der Gesamtschubkraft berechnen -> Diese auf die Motoren verteilen z.B.: Motor1 = Nick Motor2 = Nick * Faktor(da Motor nicht den "vollen" Abstand wie Motor1 zum Mittelpunkt hat) + Roll(da Motor auch zum Rollen benutzt wird) * Faktor ... Motor 5 = -(Motor2) Noch eine Frage, gibt es bei mikrocoptern nicht immer ein "vorne" und daher ergibt sich ein festes Koordinaten System, oder ist dieser Zusammenhang falsch?
Du meist sowas wie das Carefree. Hierbei orientiert sich das "Vorne" an der Kompassausrichtung: http://www.youtube.com/watch?feature=player_detailpage&v=a-qqvgJqfh0#t=457s Dort muss natürlich ständig das "Koordiantensystem" gedreht werden.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.