Bewegungsprofil-Simulator: Trapez und S-Kurve
Plane eine Bewegung als Trapez- und ruckbegrenztes S-Kurven-Profil nebeneinander und beobachte Weg, Tempo, Beschleunigung und Ruck an den Grenzen.
- Kategorie
- Regelungstechnik
- Zeitaufwand
- 30–60 Min.
- Plattform
- Browser · Arduino
01 / Hier starten
Einführung
Jeder Motorbefehl versteckt einen Zeitplan. Soll eine Achse irgendwohin, muss etwas entscheiden, wie schnell sie hochfährt, wie lange sie cruist und wann sie bremst. Dieses Labor macht den Plan sichtbar: Setze Hub und Maschinenkönnen und sieh Trapez- und S-Kurven-Profil nebeneinander planen.
Live lab / Analytic profile planner
Motion profile simulator
Set a move and watch both profiles plan it. Drag the limits to push the move into a triangle, starve the jerk until acceleration never saturates, and read what the S-curve costs.
Four stacked plots share a time axis. Each is the derivative of the one above it, so a corner in velocity becomes a step in acceleration and an impulse in jerk. The trapezoidal profile is drawn in the accent colour, the S-curve alongside it.
- Trapezoidal
- 1.200 s
- S-curve
- 1.300 s
- Jerk cost
- +0.100 s
- Peak speed
- 100 mm/s
- Peak accel
- 500 mm/s²
- Cruise
- 0.700 s
Keyboard: focus the plots, then use Space to play/pause, B to rewind, R to reset, M to cycle which profiles are shown, and F for full screen.
Steuerung
Distanz und Spitze beschreiben den gewünschten Hub. Beschleunigung und Ruckgrenze beschreiben, was die Maschine wirklich kann. Das Labor plant bei jedem Ziehen neu — es gibt nichts zu drücken, bevor die Kurven antworten.
Anzeige schaltet zwischen beiden Profilen und je einem allein. Abspielen fährt einen Abspielkopf in Echtzeit über die Diagramme — der schnellste Weg zu fühlen, dass die S-Kurve später endet.
Der Hinweis unter den Grenzen sagt dir, wann eine Grenze unerreichbar wird — genau darum lohnt es, die Schieber zu ziehen.
Theorie
Vier Diagramme, gestapelt, jedes die Ableitung des darüber. Diese Stapelung ist das Argument: Eine Ecke in der Geschwindigkeit ist ein Sprung in der Beschleunigung, und ein Sprung in der Beschleunigung ist ein Impuls im Ruck. Die Unstetigkeit verschwindet beim Differenzieren nie — sie wandert nach unten, bis sie unbeschränkt wird.
Ein Trapez-Profil beschleunigt konstant, cruist, bremst dann. Geschwindigkeit ist ein Trapez, Beschleunigung eine Rechteckwelle, Ruck eine Impulsfolge an den Ecken. Diese Impulse hört eine Maschine als Schlag, und ein nachgiebiger Antrieb antwortet mit Nachschwingen.
Ein S-Kurven-Profil begrenzt zusätzlich den Ruck. Beschleunigung rampt über t_j = a_max / j_max hoch, hält und rampt herunter — Geschwindigkeit bekommt runde Ecken. Es kostet exakt eine Ruckzeit und kauft begrenzten Stoß.
Kein Profil kann immer jede Grenze ehren. Ein Hub kürzer als v²/a erreicht nie die Spitze. Eine S-Kurve, deren Spitze unter a²/j liegt, erreicht nie die Beschleunigungsgrenze. Beides ist normal und hier sichtbar.
Algorithmus
Das Labor löst das Profil statt es zu integrieren. Jedes Segment hat konstanten Ruck, innerhalb eines Segments gilt also:
a(τ) = a₀ + j·τ
v(τ) = v₀ + a₀·τ + j·τ²/2
x(τ) = x₀ + v₀·τ + a₀·τ²/2 + j·τ³/6
Die sind exakt — darum landet der Hub auf dem Ziel statt daneben, und darum plant Schieberziehen instantan neu.
Die Spitzenwahl nutzt eine Identität: Eine Geschwindigkeitsrampe ist punktsymmetrisch um ihre Mitte und deckt daher immer exakt v_peak/2 × Dauer, egal welche Form. Das macht „Gibt es eine Cruisephase?“ zu einem einzigen Vergleich und die distanzbegrenzte Spitze geschlossen lösbar — quadratisch, solange Beschleunigung noch sättigt, Kubikwurzel, sobald nicht.
Quellcode
Ein Trapezgenerator, klein genug zum Einkleben in einen Sketch. Er gibt die Position zurück, die deine Regelschleife zur Zeit t verfolgen sollte:
// Target position t seconds into a trapezoidal move of `d` mm.
float profilePosition(float t, float d, float vMax, float a) {
float tAcc = vMax / a;
float dAcc = vMax * vMax / (2 * a);
if (2 * dAcc > d) { // too short to reach vMax
float tPeak = sqrtf(d / a); // triangular profile
if (t >= 2 * tPeak) return d;
if (t < tPeak) return 0.5f * a * t * t;
float left = 2 * tPeak - t;
return d - 0.5f * a * left * left;
}
float tCruise = (d - 2 * dAcc) / vMax;
float tTotal = 2 * tAcc + tCruise;
if (t >= tTotal) return d;
if (t < tAcc) return 0.5f * a * t * t;
if (t < tAcc + tCruise) return dAcc + vMax * (t - tAcc);
float left = tTotal - t;
return d - 0.5f * a * left * left;
}
Rufe ihn einmal pro Regelperiode und füttere das Ergebnis an was auch immer den Kreis schließt. AccelStepper tut intern das Äquivalente für Schrittmotoren; S-Kurven-Option gibt es keine — ein ruckbegrenztes Profil erzeugst du selbst.
Annahmen und Unterschiede zur Hardware
Die Profile nehmen eine starre, freie Achse an: keine Reibung, kein Spiel, keine Riemendehnung und kein Schrittverlust, Spitzenstrom jederzeit verfügbar. Eine echte Schrittmotor- oder DC-Achse hat drehzahlfallendes Moment, Nachgiebigkeit, die aus Ruck Klingen macht, und einen sättigenden Treiber — darum hilft eine S-Kurve einem riemengetriebenen Arm, ist aber verschenkte Zeit auf kurzem, steifem Schlitten. Auch die Abtastrate ist hier ideal; auf dem Mikrocontroller ist deine Zeitgeberstabilität die Genauigkeitsuntergrenze. Lies den Hub als Sollwert, den dein vorhandener Regler verfolgen sollte, und verifiziere gegen die Mechanik, die er wirklich zieht.
Schaltplan
Es gibt keine Schaltung eigens für dieses Labor — das Profil ist eine Rechenschicht, kein Bauteil. Es sitzt zwischen Befehlsquelle und vorhandener Schleife:
target position → PROFILE → setpoint → controller → driver → motor
↑ │
└────── encoder ─────────┘
Die Verdrahtung ist, was dein Motor schon braucht: ein Treiber, bemessen für den Spitzenstrom, den die Rampe verlangt, und Encoder-Feedback, wenn du den Kreis schließen willst. Was sich ändert, ist nur, was der Regler verfolgen soll.
Volle Herleitung, die Marlin-„Jerk“-Verwirrung und warum Profilieren oft ein scheinbar verstimmtes PID repariert stehen in Bewegungsprofile: Trapez- und S-Kurven-Beschleunigung.
Hardware-Checkliste
Bauteile
- Schrittmotor oder DC-Motor mit Encoder
- Treiber, bemessen für den Spitzenstrom, den das Profil verlangt
- Controller mit Zeitgeber, stabil genug für die Abtastrate
- Starre Montage — Nachgiebigkeit macht aus Ruck Schwingen
Den Graphen erkunden
Wo dieser Simulator verwendet wird
Die Projekte, Lernpfade und Tutorials, die auf diesem Labor aufbauen.
Weiterbauen
Ressourcen herunterladen
Nutze diese Referenzen auf der Seite, während du das Projekt durcharbeitest. Herunterladbare Projektpakete kommen erst hinzu, wenn ihr Quellcode und ihre Version veröffentlicht sind.
Häufige Fragen
Häufig gestellte Fragen
Warum erreicht meine Achse nie die eingestellte Spitze?
Weil der Hub zu kurz ist. Spitze zu erreichen braucht Anlauf von v²/2a und nochmals dasselbe zum Stoppen — jeder Hub kürzer als v²/a ist vorbei, bevor die Rampe endet. Das Geschwindigkeitsprofil wird Dreieck statt Trapez, seine Spitze ist √(a·d), egal was du konfiguriert hast. Speed-Limit erhöhen hilft diesen Hüben nichts — nur Beschleunigung erhöhen. Ziehe den Distanz-Schieber unter die Schwelle, und das Labor sagt es.
Ist eine S-Kurve immer besser als ein Trapezprofil?
Nein. Sie ist immer langsamer, und die Maschine stört nicht immer das, was sie fixt. Eine S-Kurve begrenzt den Ruck — das zählt, wenn der Antrieb nachgibt: Riemen, lange Glieder, schweres Werkzeug am Armende — denn ein Beschleunigungssprung regt diese Nachgiebigkeit an, und sie klingt nach. Auf kurzer, steifer, direkt getriebener Achse kann das Klingen unmessbar sein und die Extrazeit reiner Verlust. Sieh im Labor die Kosten und entscheide dann, ob deine Maschine für etwas zahlt, das sie braucht.
Wie viel Zeit kostet Ruckbegrenzung wirklich?
Genau eine Ruckzeit, t_j = a_max / j_max, sofern beide Profile dieselbe Spitze und Beschleunigung erreichen. Nicht zwei — und, überraschend, unabhängig von der Hubweite. Das Beschleunigungssegment der S-Kurve ist länger, deckt also mehr Distanz vor dem Cruisen, die Cruisephase schrumpft und gibt die meiste Zeit zurück. Nur die Ruckzeit selbst ist uneinholbar. Ziehe den Distanz-Schieber und beobachte, wie die Ruckkosten stehen bleiben.
Warum erreicht die Beschleunigung nie meine Beschleunigungsgrenze?
Weil die Ruckgrenze dafür zu niedrig ist. Hoch auf a_max und wieder herunter zu rampen braucht eine Geschwindigkeitsänderung von a_max²/j_max — liegt deine Spitze darunter, wird die Beschleunigung selbst dreieckig und spitzt bei √(v·j). Dieselbe „Platz-aus“-Geschichte wie ein kurzer Hub, eine Ableitung höher. Das Labor meldet es, wann immer es passiert.
Wohin gehört das Profil in meinem Code?
Vor den Regler, nicht hinein. Das Profil erzeugt einen Sollwert — wo die Achse gerade sein sollte — und was du schon hattest, folgt ihm: Schrittplaner, PID-Kreis, Servo-Schrieb. Darum repariert Profilieren oft eine Achse, die verstimmt schien. Ein Sprungbefehl verlangt vom PID Unendliches, sein Fehler startet bei voller Hubdistanz, und das Integral läuft hoch, während der Ausgang sättigt. Gegen ein profiliertes Ziel bleibt der Fehler klein, und dieselben Verstärkungen benehmen sich.
Weiterführende Literatur
Quellen
Maßgebliche Quellen, um tiefer einzusteigen als das begrenzte Lernmodell dieses Simulators.