3D-Koordinaten umrechnen

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • 3D-Koordinaten umrechnen

    Ich will das Koordinatensystem drehen. Anders gesagt:
    Gegeben sind zwei Rotationen, bestehend aus je 3 Winkeln für x,y und z. Diese sollen addiert werden. (Der Radius ist dabei unerheblich, bzw. konstant.)
    Gesucht wird der resultierende Vektor.

    Klingt einfach? Ist es aber nicht. Oder ich stell mich einfach zu blöd an. Alle meine Versuche haben kompletten Mist ergeben. Dann habe ich gesucht und das hier gefunden, bin aber nicht imstande, es anzuwenden. Im Gegenteil: Seit ich mich mit sphärischer Trigonometrie beschäftige, ist mein Gehirn irgendwie Kollabiert und ich schaffe gar nichts mehr umzurechnen.
    Es geht um diesen Industrieroboter, aber die Details will ich Euch jetzt mal ersparen. Ist klar worum's geht, oder?

    Mir ist übrigens klar geworden, daß man zur Bestimmung eines Punktes (auf der Kugel) natürlich nur ZWEI Winkel benötigt. Aber wie gesagt: Ich bin unfähig, da irgendwas korrekt umzurechnen.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von Melancor ()

  • Um es kurz zu machen, dein Problem ist nicht eindeutig lösbar. winkel sind nicht kommutativ, dh. wen sie in der Reihenvolge vertauscht werden in der sie addiert werden kommen unterschiedliche Ergebnisse heraus (im 3D raum).
    Da hilft dir auch das Nautische Dreieck nicht weiter.
    :) Nobody is perfect (-:

    "Dummköpfe sind Denkerköpfen weit überlegen. Zahlenmäßig." Ernst Ferstl
  • Ok.

    Wenn man ENTER drückt, fängt das MistDing (der Werkzeugkopf) an, sich um den Punkt zu drehen. Drückt man mehrmals ENTER, dreht es sich um eine andere Achse. Später soll die Werkzeug-Spitze immer auf dem Zielpunkt liegen, also das MistDing wird zum Zielpunkt hin gedreht werden. Wichtig ist aber erstmal, daß wenn man mehrere Achsen verdreht (geht manuell mit NumPad-Zifferntasten) nicht völliges Chaos entsteht. Ach so, das relevante Skript ist im Roboter-Verzeichnis und heißt get_tip_position und der Code darin ist so gemacht, daß er wenigstens in dem speziellen Fall (ENTER gerdrückt) das richtige macht, aber auch nur dann. Die 3 Winkel heißen tip_rx, tip_ry und tip_rz und das Skript soll die Position von dem MistDing ausgeben, anhand eines Vektors eben.
    Und es geht wohl auch mit 2 Winkeln. Genaugenommen will ich ja auch zwei Winkel dann haben, um das MistDing zum Mittelpunkt hin zu drehen (mit seinen letzten zwei Gelenken).

    Dieser Beitrag wurde bereits 9 mal editiert, zuletzt von Melancor ()

  • Ich bin mir jetzt überhaupt nicht sicher ob ich das ganz genau verstanden hab.
    Nimm mal das Script für "vector_write":

    GML-Quellcode

    1. var xx, yy, zz, x1, y1, x2, y2, ax, ay;
    2. yy = -lengthdir_x(1,argument1);
    3. zz = lengthdir_y(1,argument1);
    4. xx = -lengthdir_y(zz,argument2);
    5. zz = lengthdir_x(zz,argument2);
    6. x1 = xx;
    7. y1 = yy;
    8. x2 = -yy;
    9. y2 = xx;
    10. ax = lengthdir_x(1,argument3);
    11. ay = lengthdir_y(1,argument3);
    12. xx = ax*x1-ay*x2;
    13. yy = ax*y1-ay*y2;
    14. variable_local_array_set(argument4,0,xx*argument0);
    15. variable_local_array_set(argument4,1,yy*argument0);
    16. variable_local_array_set(argument4,2,zz*argument0);
    Alles anzeigen


    Die Drehung müsste so stimmen.
    Allerdings ist die Position des Werkzeugkopfes noch leicht verschoben aber das kannst du denk ich noch selber richten.

    Wenn ich das jetzt total falsch verstanden hab bitte nochmal aufklären :)
  • Danke, daß Du Dich da reingefummelt hast.

    Ich hab's zwar mit Deinem Code auch noch nicht zum Laufen gekriegt, vielleicht hilft er mir jedoch beim Begreifen... zumindest scheint der Radius gleich zu bleiben - ein Erfolg.
    Ehrlich gesagt sitze ich immer noch genauso dumm da, aber meine Ausdauer ist immens. Unglaublich, wie solche quasi sinnlosen Aufgaben mich manchmal faszinieren können.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von Melancor ()

  • Wenn du mir sagst wie genau es am Ende aussehen soll, kann ich mich nochmal dahinter klemmen.
    Soll jetzt der Werkzeugkopf genau auf der Kugeloberfläche liegen die man drehen kann?
    Oder soll man ganz einfach am Ende nur den Kopf entsprechend drehen können und die 3 roten Scheiben dienen bis jetzt nur zur Orientierung? Beschreib nochmal bitte genau.
  • Da werde ich nicht helfen.
    Einfach den Artikel lesen und möglichst dabei auch verstehen.Wenn der Begriff"Vektor" dir nichtssagt, dann einfach im Wiki weiterschauen,oder bei Google.
    Transformationen per Matrizen ist ein Thema dass man wirklich selber verstehen muss.

  • Genau, der Werkzeugkopf soll einfach nur auf einer Kugeloberfläche liegen. UND die 3 Scheiben dienen nur zur Orientierung.

    Klar sind mir Vektoren ein Begriff, aber von den Drehmatritzen und Quaternions hatte ich vorher noch nie gehört. Allerdings überfordert mich das auch ein wenig.

    Ich hatte mir das einfacher vorgestellt - und ehrlich gesagt glaube ich immer noch, daß es einfacher ist. Ich bin nur scheinbar zu blöd, das Problem richtig zu formulieren.

    Übrigens ist diese Konstruktion ein alter Hut in der Robotik. Dabei bin ich auch auf den Begriff Denavit-Hartenberg-Transformation gestoßen. Dazu hier ein kleiner Artikel.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von Melancor ()

  • Schreib mal noch in get_tip_position() diesen Code:

    GML-Quellcode

    1. tip_tx = 0;
    2. tip_ty = 0;
    3. tip_tz = -1*tip_len;
    4. vector_write (tip_len,tip_rx,tip_ry,tip_rz,'vtip');


    Den code den ich weiter oben gepostet hab muss drin bleiben.
    Bei mir liegt damit der Kopf genau auf der Kugel.
    Ich versteh bloß nicht für was genau dur tip_tx usw. brauchst.
  • Habe einiges dazugelernt: Es gibt viele Möglichkeiten, Vektoren im Raum zu drehen. Normalerweise dreht man immer nur um zwei Achsen (nie um alle drei), was die Auswahl der Methoden schon eingrenzt.
    Bei diesem Roboter ist das schon etwas anders: Ohne die Möglichkeit der schnellen Manipulation und Visualisierung (also dem Game Maker) wäre ich niemals so weit gekommen. Die Mathematik bietet zwar diverse Wege, sowas anzugehen, aber ich tu mich noch schwer mit 3D...
    Bilder
    • Neu GIMP image.png

      57,34 kB, 381×377, 297 mal angesehen
    • Neu GIMP image (2).png

      43,52 kB, 311×297, 301 mal angesehen

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von Melancor ()

  • blöde Mathematik

    Ich bitte Euch ein letztes Mal in dieser Sache, versprochen... (ähem)

    Nach ewigem Rumprobieren fehlt mir nur noch ein einziger Winkel, nämlich der von Achse 5, im letzten Post (Bild rechts) sehr gut zu sehen: Das Drehgelenk am Ende des Armes. Ohne diesen Winkel ist es wirklich unmöglich, den Roboter vernünftig zu bewegen.. naja eigentlich sind es zwei, aber ich hoffe den zweiten wieder selbst herleiten zu können.

    Wir müssen uns zwei Vektoren ansehen: Die Richtung des Armes und die der Spitze. Beide sind bekannt und liegen jeweils auf einer Ebene (Bild links)
    Durch manuelles Verdrehen der Ebene bin ich darauf gekommen, daß die Schnittlinie dieser zwei Ebenen zum Armausgerichtet sein muß (Bild rechts). Das erreicht man durch drehen von Achse 5

    Mit diesem Wissen müßte man doch den Winkel berechnen können, oder?

    Im Augenblick werden die Rotationen für den Roboter-Kopf noch "manuell" eingestellt, also erschummelt. Damit habe ich das Anfangsproblem nur eingegrenzt. Erst wenn ich das letzte Winkelpaar habe, löst sich alles auf und übrig bleibt knapper, goiler Code. Ich habe in einem Matheforum von einer gewissen "reduce" - Funktion gelesen, die wohl die Schnittlinie zweier Ebenen liefert. Die müßte man umkehren, denn diese Linie ist ja gegeben. Gesucht ist die Rotation der Ebene "am Kopf" um ihre eigene.. äh, vielleicht häng ich doch lieber wieder 'ne Datei an... man kann jetzt schon eine Bowlingkugel signieren (grins).

    Mit SPACE werden die beiden Ebenen eingeblendet.
    Also: mit den Zifferntasten (nicht NumPad) 1-2 kann man die Ebene zurecht drehen, und 3-4 wird das 4.Gelenk ausgerichtet. Könnte auch noch mal ein Problem werden, aber ich glaub der letzte Winkel leitet sich direkt von dem anderen ab (drück mal 1 und 4 gleichzeitig...)
    Bilder
    • Neu Bitmap (2).jpg

      9,86 kB, 406×397, 272 mal angesehen
    • Neu Bitmap (1).jpg

      14,77 kB, 561×419, 260 mal angesehen
    Dateien
    • bowlingball.zip

      (15,39 kB, 119 mal heruntergeladen, zuletzt: )

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von Melancor ()

  • Die Antwort lautet : Du hast drei Punkte, die eine Ebene aufspannen. Finde den dazugehörigen Normalvektor, das ist Dein "Winkel"... Naja, jedenfalls kann man aus diesm Vektor den Winkel ablesen. Habe ich auch versucht, bin aber nur zum Teilerfolg gekommen. Aber seht selbst.

    Übrigens: Der ganze überflüssige Mist wurde aus dieser Version entfernt. Mit BildAuf und BildAb kann man den Radius verstellen. (den Radius? welchen Radius?)
    Dateien
    • robot.zip

      (6,64 kB, 118 mal heruntergeladen, zuletzt: )

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von Melancor ()

  • Was sollte der Post? Weißt du jetzt nicht genau wie du den Normalenvektor bestimmst?
    Falls das deine Frage ist:

    Du hast die 3 Punkte p1, p2, p3 und bildest daraus erstma 2 vektoren:

    v1 = p2 - p1;
    v2 = p3 - p1;

    normalenvektor = v2 % v1; (wobei % für das kreuzprodukt steht)