Wie werden Delta-Bewegungen berechnet?


8

Auf einem kartesischen Drucker sind Bewegungen wirklich einfach. Wenn wir davon ausgehen, dass der Drucker auf jeder Achse 100 Schritte / mm hat, beträgt eine Bewegung von 10 mm auf einer Achse nur 1000 Schritte auf dieser Achse.

Bewegungen, die nicht an einer Achse ausgerichtet sind, sind ebenfalls einfach. Ein Wechsel von x, y = 0,0 zu 10,10 wäre 1000 Schritte auf x und y.

Bei Deltas muss sich auch bei einfachen Bewegungen mehr als ein Motor bewegen. Die Berechnung der Anzahl der Schritte auf jeder Achse, die zum Erreichen des Ziels erforderlich sind, ergibt wahrscheinlich eine gekrümmte Bewegung.

Was ist der Algorithmus, um die Schritte für eine bestimmte Bewegung für einen Delta-Drucker zu berechnen?


Dies scheint nur eine theoretische Frage zu sein, die für eine Site, die sich mit Programmierung und / oder Mathematik befasst, besser geeignet sein könnte, da die interne Funktionsweise der Firmware für die Verwendung eines 3D-Druckers irrelevant ist. Auf der anderen Seite ist die Frage spezifisch für den 3D-Druck und möglicherweise für jemanden relevant, der versucht, die Firmware seines Druckers zu ändern oder zu optimieren.
Tom van der Zanden

Antworten:


7

Es gibt zwei spezielle Hauptschritte für die Technik, die von den meisten Open-Source-3D-Druckercontrollern verwendet wird:

  1. Teilen Sie jedes lineare Gcode-Segment in viele sehr kleine Untersegmente ("Segmentierung").
  2. Verwenden Sie eine grundlegende Trigonometrie oder den pythagoreischen Satz, um die Extruderposition an die Wagenhöhe für jeden der drei Türme zu binden ("Inverse Kinematics"), um die Zielposition für jedes kleine Segment zu ermitteln

Die inverse Kinematik ist überraschend einfach. Ein virtuelles 90-Grad-Dreieck wird aus zwei bekannten Längen konstruiert, um die unbekannte dritte Länge zu lösen:

  • Die feste Delta-Armlänge ist die Hypotenuse des Dreiecks
  • Der horizontale Abstand zwischen den Säulenfugen und den Endeffektorfugen wird aus den XY-Koordinaten der Düse und der festen Position der Säule berechnet, um die Länge der Unterseite des Dreiecks zu bestimmen
  • Die Länge der Oberseite des Dreiecks wird aus den beiden vorhergehenden über den Satz des Pythagoras berechnet
  • Die Länge der Oberseite wird zur Höhe der Düse Z addiert, um die erforderliche Schlittenhöhe zu erhalten

Ich denke, die beste Open-Source-Referenz hier ist Steve Graves Rostock Kinematics-Dokument, rev3, das hier heruntergeladen werden kann: https://groups.google.com/d/msg/deltabot/V6ATBdT43eU/jEORG_l3dTEJ Einige relevante Bilder: Geben Sie hier die Bildbeschreibung ein Geben Sie hier die Bildbeschreibung ein

Diese inversen Kinematikberechnungen werden für jeden Wagen durchgeführt, um eine Zielposition "Wagenraum" zu erhalten, und dies wird für jedes Pfad-Teilsegment durchgeführt.

Die Ergebnisse dieser Schritte können dann wieder in die Standard-Linearpfad-Interpolationstechniken für den Drucker eingefügt werden, bei denen Schritte in den erforderlichen Verhältnissen und mit den erforderlichen Raten ausgelöst werden, um das gewünschte geradlinige Bewegungs- und Beschleunigungs- / Geschwindigkeitsprofil zu erzeugen. (Wie das gemacht wird, ist eine andere Frage.)

Der Nettoeffekt besteht darin, dass sich der Drucker durch eine Reihe kleiner "linearer" Wagenbewegungen bewegt (linear bedeutet konstante * Geschwindigkeit in Bezug auf die Zeit), die sich gemeinsam den erforderlichen gekrümmten (quadratische Position in Bezug auf die Zeit) Wagenbewegungen annähern, die zur Erzeugung von a erforderlich sind geradlinige Endeffektorbewegung.

* ( Konstante Geschwindigkeit vor Beschleunigungsverlangsamungen wird angewendet, um ohnehin dynamischen Einschränkungen zu entsprechen. Auch dies ist das Thema einer anderen Frage.)

Die Segmentierung ist dem Prozess der Verwendung eines Polygons zur Approximation eines Kreises sehr ähnlich. Wenn die Facetten klein genug sind, ist das Polygon eine gute Annäherung. Höhere Segmentierungsraten führen zu weniger Pfadverfolgungsfehlern. Der primäre konzeptionelle Unterschied zwischen dem Zeichnen von Kreisbögen und Delta-Bewegungspfaden besteht darin, dass der sogenannte "facettierte Bogen" mit Delta-Segmentierung in Höhen-Zeit-Koordinaten anstelle der X-gegen-Y-Koordinaten konstruiert wird, die Sie zum Zeichnen von a verwenden würden Kreis auf einem Computerbildschirm.

Dieses System wird größtenteils verwendet, weil die Unterstützung für Delta-Drucker ursprünglich auf GRBL-basierte Bewegungsplaner geschraubt wurde, die ausschließlich für geradlinige Bewegungspfade in kartesischen Druckern geschrieben wurden. Es war eine relativ minimale Modifikation der vorhandenen Codebasis im Vergleich zur Implementierung einer vollständigen quadratischen Pfadinterpolation.

Die Techniken haben sich im Laufe der Jahre weiterentwickelt. Oft werden alternative Ansätze verwendet: Beispielsweise führt die dc42-Verzweigung von RepRapFirmware eine genaue Pfadverfolgung ohne Segmentierung durch, indem nach jedem Schritt die richtige Zeit für den nächsten Schritt neu berechnet wird . Dies entspricht funktional der Approximation eines Kreises mit einer Polygonfacettenanzahl, die so hoch ist, dass jedes Pixel auf dem Bildschirm eine eigene Facette erhält . Es ist also genau so genau, wie es die Positionierungsauflösung der Motoren zulässt. Der Nachteil ist, dass diese segmentierungsfreie Technik ziemlich prozessorintensiv ist, sodass sie nur auf relativ schnellen Controllern funktioniert, nicht auf dem älteren 8-Bit-Atmega-AVR, mit dem die meisten heute vorhandenen Consumer- / Hobby-Drucker betrieben werden.

Andere Techniken sind möglich. Die akademische Literatur zur parallelen Robotiksteuerung ist eine ganz andere Welt mathematischer Techniken und Komplexität, um verallgemeinerte Steuerungsalgorithmen zu erstellen, die für eine Vielzahl von Robotermechanismen funktionieren. Die Version, die wir in Open-Source-3D-Druckern verwenden, ist im Vergleich recht einfach und anwendungsspezifisch.


2

Ich beschreibe, wie dies in der Marlin-Firmware gemacht wird.

Der erste Schritt besteht darin, eine lineare Bewegung von (x, y, z) nach (x ', y', z ') in viele diskrete Segmente aufzuteilen. Zu diesem Zweck wird die Zeit berechnet, die die Bewegung bei einer bestimmten Geschwindigkeit dauern würde, und der Wert delta_segments_per_second wird verwendet, um die Anzahl der verwendeten Segmente zu berechnen.

Dies erfolgt in der Funktion prepare_move_delta in der Datei Marlin_main.cpp. Die Endpunkte jedes dieser Segmente werden dann an die Funktion berechne_delta übergeben :

void calculate_delta(float cartesian[3]) {
    //reverse kinematics.
    // Perform reversed kinematics, and place results in delta[3]
    // The maths and first version has been done by QHARLEY . Integrated into masterbranch 06/2014 and slightly restructured by Joachim Cerny in June 2014

    float SCARA_pos[2];
    static float SCARA_C2, SCARA_S2, SCARA_K1, SCARA_K2, SCARA_theta, SCARA_psi;

    SCARA_pos[X_AXIS] = cartesian[X_AXIS] * axis_scaling[X_AXIS] - SCARA_offset_x;  //Translate SCARA to standard X Y
    SCARA_pos[Y_AXIS] = cartesian[Y_AXIS] * axis_scaling[Y_AXIS] - SCARA_offset_y;  // With scaling factor.

    #if (Linkage_1 == Linkage_2)
      SCARA_C2 = ((sq(SCARA_pos[X_AXIS]) + sq(SCARA_pos[Y_AXIS])) / (2 * (float)L1_2)) - 1;
    #else
      SCARA_C2 = (sq(SCARA_pos[X_AXIS]) + sq(SCARA_pos[Y_AXIS]) - (float)L1_2 - (float)L2_2) / 45000;
    #endif

    SCARA_S2 = sqrt(1 - sq(SCARA_C2));

    SCARA_K1 = Linkage_1 + Linkage_2 * SCARA_C2;
    SCARA_K2 = Linkage_2 * SCARA_S2;

    SCARA_theta = (atan2(SCARA_pos[X_AXIS], SCARA_pos[Y_AXIS]) - atan2(SCARA_K1, SCARA_K2)) * -1;
    SCARA_psi = atan2(SCARA_S2, SCARA_C2);

    delta[X_AXIS] = SCARA_theta * SCARA_RAD2DEG;  // Multiply by 180/Pi  -  theta is support arm angle
    delta[Y_AXIS] = (SCARA_theta + SCARA_psi) * SCARA_RAD2DEG;  //       -  equal to sub arm angle (inverted motor)
    delta[Z_AXIS] = cartesian[Z_AXIS];
}

Diese Funktion kümmert sich um die Delta-Geometrie und die Berechnungen, die erforderlich sind, um die (x, y, z) -Koordinaten der Segmentendpunkte in entsprechende Positionen für die Wagen umzuwandeln. Die übersetzten Koordinaten werden dann an plan_buffer_line übergeben , das die für jeden Schrittmotor erforderlichen Schritte berechnet und diese Schritte tatsächlich ausführt .

Die genaue Kinematik, die in dieser Funktion verwendet wird, wird im Marlin-Github ausführlicher erläutert .

Es ist wichtig zu beachten, dass plan_buffer_line die Wagen linear bewegt und der Druckkopf somit einen Bogen und keine gerade Linie beschreibt. Eine gerade Bewegung wird somit durch viele kleine Bögen angenähert.


Der Code ist schwer zu lesen. Was ist SCARA? Können Sie die Schritte beschreiben, die der Code implementiert?
Lars Pötter
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.