Interaktiver SimulatorMittelstufe

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
Technisches Schema: Bewegungsprofil-Simulator: Trapez und S-KurveVELOCITY OVER TIMETIME

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.

Browser native
This lab plots position, velocity, acceleration and jerk for the same move under a trapezoidal and an S-curve profile. Use the controls below to change the move, or read the full theory and algorithm after this lab.

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.

Playhead

Drag any limit — the plan updates as you drag. Press Play to run the move.

The move
Machine limits

Both profiles reach every limit you set.

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.