Einen Quadrotor zu einem Ziel führen

9

Ich arbeite an einem Quadrotor. Ich kenne seine Position - , wohin ich gehen möchte - Zielposition b und berechne daraus einen Vektor c - einen Einheitsvektor, der mich zu meinem Ziel führt:abc

c = b - a
c = normalize(c)

Da sich ein Quadrotor ohne Drehung in jede Richtung bewegen kann, habe ich versucht, dies zu tun

  1. um den Gierwinkel des Roboters drehenc
  2. Teilen Sie es in seine Komponenten aufx,y
  3. Übergeben Sie sie als Roll- und Nickwinkel an den Roboter.

Das Problem ist, dass wenn das Gieren 0 ° ± 5 ist, dies funktioniert, aber wenn das Gieren nahe +90 oder -90 ist, versagt es und lenkt in falsche Richtungen. Meine Frage ist, vermisse ich hier etwas Offensichtliches?

Hamza
quelle
1
Wie berechnet man den Gierwinkel? Welchen Controller verwenden Sie und wie senden Sie ihm Daten?
DaemonMaker
Interessante Frage @Hamza, willkommen bei Robotics .
Mark Booth
@ Hamza, Welche Sprache und welches System verwenden Sie? Ich arbeite auch an einem Quadcopter mit Atmega328 und Ada Programmiersprache. Wenn Sie einen Blog über das Projekt haben, teilen Sie ihn bitte mit.
Sie haben Recht @MarkBooth, ich hatte zwei Registerkarten geöffnet und wollte den anderen Beitrag als Duplikat markieren. Ich habe diesen versehentlich markiert und keine Möglichkeit gesehen, ihn rückgängig zu machen. Da es mehr als eine Stimme braucht, um es zu schließen, dachte ich, dass dies kein Problem sein würde. Mir war jedoch nicht klar, dass es einen Kommentar in meinem Namen gab.
DaemonMaker
Kein Problem @DaemonMaker diese Dinge passieren. Schließen als doppelte Stimmen jetzt automatisch Kommentare posten, was meiner Meinung nach eine nützliche Funktion ist, da die Leute aufgefordert werden, die andere Frage zu überprüfen, bevor sie selbst eine enge Stimme abgeben.
Mark Booth

Antworten:

6

Wenn Sie Ihre Lösung erneut implementieren, erhalten Sie Folgendes:

Winkel zwischen Vektoren

ABWinkel zwischen 2 Punkten

θ=math.atan2(BxAx,ByAy)

Fahrzeuggierwinkel

ψθ

Überschrift gegen Gieren

y

Kompassrose

x

Polardiagramm

Die 90-Grad-Überlappung zwischen diesen Messungen in Kombination mit dem Addieren (anstatt Subtrahieren) des Fahrzeuggierens vom gewünschten Gieren kann der Grund dafür sein, dass Dinge funktionierten, wenn sich Ihr Ziel innerhalb von ± 5 ° befand und sich bei ± 90 ° schlecht verhielt.

Umstellung auf Komponente X und Y.

(θψ)xy

PID-Regelung

Sie können am besten mit PID-Regelkreisen für das Rollen und die Neigung des Fahrzeugs bedient werden. Das heißt, sobald Sie Ihren Code repariert haben und in der Lage sind, Ihr Ziel zu treffen, werden Sie wahrscheinlich anfangen, ihn zu überschießen - hin und her oszillieren. Eine korrekt eingestellte PID verhindert dies und ermöglicht es Ihnen, sich dem Ziel schnell zu nähern.

xy

Ian
quelle
Das ist etwas Bearbeitung dort, über 90% und ändert die Antwort total (von PID zu ATAN2). Aber Ihre auffälligen grafischen Formelfähigkeiten sind ein Biest!
Spiked3
Ich empfehle immer noch die PID (sie befindet sich unten). Ich habe gerade den Anfang der Frage durchgearbeitet, um sicherzustellen, dass meine Annahmen korrekt waren. Die grafischen Formeln sind Teil der Latex-Formatierung, die es wert ist, überprüft zu werden.
Ian
"Kompassrichtung beginnt von der positiven y-Achse und nimmt im Uhrzeigersinn zu, während Gieren von der positiven x-Achse ausgeht und gegen den Uhrzeigersinn zunimmt" Referenz? "Konvertieren der x-Komponente von (θ - ψ) in Rollen und der y-Komponente in Pitch" Ich verstehe das überhaupt nicht - bitte mehr Erklärung (mir fehlt etwas).
Spiked3
Die ursprüngliche Frage erwähnte "Übergeben [der x- und y-Komponenten] an den Roboter als Roll- und Nickwinkel", was für mich bedeutet, dass sich der Quadcopter durch Ändern des Rollwinkels hin und her und durch Ändern des Nickwinkels vorwärts und rückwärts bewegt. Ich werde etwas Klarheit hinzufügen.
Ian
ordentlich. Ich habe es noch nie so gesehen. Ich habe gesehen und mache es mir einfach, cos / sin umzudrehen, um die gleichen Ergebnisse zu erzielen. Ich muss noch etwas über die Rolle / das Spielfeld nachdenken. Ja, das würde Bewegung verursachen, aber ich bin mir nicht sicher, wie das etwas damit zu tun hat, wo Sie sind und wohin Sie gehen, außer der Geschwindigkeit, mit der Sie dort ankommen. Vielen Dank.
Spiked3
5

Ich gehe davon aus, dass Sie hier von einem 3D-Vektor sprechen. Können Sie das einfach so verallgemeinern normalize()? Ist es so üblich (ich habe es noch nie gesehen, wenn es so ist, dann Neuigkeiten für mich). Andernfalls treten bei jeder X- und Y-Komponente offensichtliche Probleme mit der Kompassumhüllung auf. Warum nennst du sie nicht Roll und / oder Pitch und / oder Yaw? (Das Mischen der 3D- und 2D-Nomenklatur verwirrt die Frage).

Meine 2D-Normalisierung sieht ungefähr so ​​aus.

int Pilot_QuickestTurnTo(int hdgNow, int hdgNew)
{
    hdgNow = Pilot_Hdg360(hdgNow);
    hdgNew = Pilot_Hdg360(hdgNew);
    if (hdgNow < hdgNew)
        hdgNow += 360;
    int left = hdgNow - hdgNew;
        return (left < 181 ? -left : 360 - left);
}

Wenn es sich tatsächlich um ein Quad handelt, gehe ich davon aus, dass Ihre X- und Y-Komponenten wirklich YAW, Altitude ((X, Y) & Z) sind. Sie müssen das YAW(X, Y)in 2D handhaben und einfach die Höhe für Z fallen lassen oder gewinnen (und aus diesem Grund vermute ich, dass Normalisieren mehr ist, als Sie es haben).

Spiked3
quelle