Interactieve simulatorGevorderd

Simulatie van bewegingsprofielen: trapezium en S-curve

Plan een beweging als trapezium- en jerkbegrensd S-curve naast elkaar en zie positie, snelheid, acceleratie en jerk veranderen terwijl je de grenzen versleept.

Categorie
Regeltechniek
Tijd
30–60 min
Platform
Browser · Arduino
Technisch schema: Simulatie van bewegingsprofielen: trapezium en S-curveVELOCITY OVER TIMETIME

01 / Begin hier

Inleiding

Elk motorcommando verbergt een schema. Vraag een as ergens heen te gaan en iets moet beslissen hoe snel hij op snelheid komt, hoe lang hij constant doorloopt en wanneer hij begint af te remmen. Dit lab maakt dat schema zichtbaar: stel een beweging in en wat de machine kan, en zie een trapezium- en een S-curveprofiel die beweging naast elkaar plannen — ook als je grenzen niet allemaal tegelijk haalbaar zijn.

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.

Bediening

Afstand en topsnelheid beschrijven de beweging die je wilt. Acceleratie en jerkgrens beschrijven wat de machine werkelijk kan. Het lab plant opnieuw bij elke sleepbeweging — je hoeft niets in te drukken voordat de grafieken reageren.

Tonen schakelt tussen beide profielen en elk profiel op zichzelf. Afspelen laat in real time een afspeelkop over de grafieken lopen, en dat is de snelste manier om te voelen dat de S-curve later eindigt.

De aantekening onder de grenzen vertelt wanneer een grens niet meer haalbaar is, en dat is precies waarom het de moeite waard is om met de schuifregelaars te slepen.

Theorie

Vier grafieken boven elkaar, elk de afgeleide van de grafiek erboven. Die stapeling is het hele betoog: een knik in de snelheid is een sprong in de acceleratie, en een sprong in de acceleratie is een impuls in de jerk. De discontinuïteit verdwijnt nooit terwijl je differentieert — hij schuift omlaag tot hij onbegrensd wordt.

Een trapeziumvormig profiel versnelt met constante snelheid van versnelling, vaart constant en vertraagt dan. De snelheid is een trapezium, de acceleratie is een blokgolf en de jerk is een reeks impulsen op de hoekpunten. Die impulsen zijn wat een machine als een klop hoort en waarop een soepele aandrijving met resonantie antwoordt.

Een S-curveprofiel begrenst ook de jerk. De acceleratie loopt op over t_j = a_max / j_max, blijft constant en loopt weer af, zodat de snelheid afgeronde hoeken krijgt. Het kost precies één jerksectijd en levert begrensde schokken op.

Geen van beide profielen kan altijd elke grens halen. Een beweging korter dan v²/a haalt nooit de topsnelheid. Een S-curve waarvan de topsnelheid onder a²/j ligt, haalt nooit de acceleratiegrens. Beide zijn alledaags en beide zijn hier zichtbaar.

Algoritme

Het lab lost het profiel op in plaats van het te integreren. Elk segment heeft een constante jerk, dus binnen één segment:

a(τ) = a₀ + j·τ
v(τ) = v₀ + a₀·τ + j·τ²/2
x(τ) = x₀ + v₀·τ + a₀·τ²/2 + j·τ³/6

Die formules zijn exact, en daarom komt de beweging op het doel terecht in plaats van er vlakbij, en daarom plant een verschuiving van een schuifregelaar direct opnieuw.

Voor het bepalen van de pieksnelheid geldt één identiteit: een snelheidshelling is antisymmetrisch rond haar midden en bestrijkt daarom altijd exact v_peak/2 × duration, ongeacht haar vorm. Daarmee wordt „is er een constante fase?“ een enkele vergelijking, en wordt de door afstand begrensde piek in gesloten vorm oplosbaar — een kwadratische vergelijking zolang de acceleratie nog verzadigd is, en een derdemachtswortel zodra dat niet meer zo is.

Broncode

Een trapeziumgenerator die klein genoeg is om in een sketch te plakken. Hij geeft de positie terug die je regelkring op tijdstip t moet nastreven:

// 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;
}

Roep hem eenmaal per regelperiode aan en geef het resultaat aan wat de kring ook sluit. AccelStepper doet dat intern ook voor stappenmotoren; er is geen S-curveoptie, dus een jerkbegrensd profiel moet je zelf genereren.

Aannames en hardwareverschillen

De profielen gaan uit van een starre, ongehinderde as: geen wrijving, geen speling, geen bandrek en geen stapverlies, en piekstroom die op aanvraag beschikbaar is. Een echte stappenmotoras of gelijkstroomas heeft koppel dat met de snelheid afneemt, soepelheid die jerk in resonantie verandert en een driver die verzadigt — en daarom helpt een S-curve een bandgestuurde arm maar is die verspilde tijd op een korte, stijve geleider. De bemonsteringsfrequentie is hier ook ideaal; op een microcontroller is de stabiliteit van je timer de nauwkeurigheidsvloer. Lees de beweging als het setpoint dat je bestaande regelaar moet nastreven en controleer het vervolgens tegen de mechaniek die hij werkelijk aandrijft.

Schakelschema

Er is geen schakeling die uniek is voor dit lab — het profiel is een laag rekenwerk, geen onderdeel. Het zit tussen je commandobron en de lus die je al hebt:

target position  →  PROFILE  →  setpoint  →  controller  →  driver  →  motor
                                                 ↑                        │
                                                 └────── encoder ─────────┘

De bedrading is wat je motor al nodig heeft: een driver die gedimensioneerd is op de piekstroom die de helling vraagt, en encoderterugkoppeling als je de lus wilt sluiten. Alleen verandert wat de regelaar moet volgen.

De volledige afleiding, de verwarring rond „jerk“ in Marlin en de reden waarom profileren vaak een PID regelt die slecht afgesteld leek, staan in bewegingsprofielen: trapezium- en S-curveversnelling.

Hardwarechecklist

Componenten

  • Een stappenmotor of een gelijkstroommotor met encoder
  • Een driver die gedimensioneerd is op de piekstroom die het profiel vraagt
  • Een regelaar met een timer die stabiel genoeg is om de bemonsteringsfrequentie vast te houden
  • Een starre montage — soepelheid is wat jerk in resonantie verandert

Verken de graaf

Waar deze simulator wordt gebruikt

De projecten, leerroutes en tutorials die op dit lab voortbouwen.

Verder bouwen

Hulpmiddelen downloaden

Gebruik deze naslag op de pagina terwijl je het project doorwerkt. Downloadbare projectpakketten komen er pas bij nadat hun broncode en versie zijn gepubliceerd.

Veelgestelde vragen

Veelgestelde vragen

Waarom bereikt mijn as nooit de topsnelheid die ik heb ingesteld?

Omdat de beweging te kort is. Om topsnelheid te bereiken is een aanloop van v²/2a nodig en nog eens evenveel om te stoppen, dus elke beweging die korter is dan v²/a is voorbij voordat de helling klaar is. Het snelheidsprofiel wordt een driehoek in plaats van een trapezium, en de piek is √(a·d), ongeacht wat je hebt ingesteld. De snelheidsgrens verhogen helpt zulke bewegingen niet — alleen de acceleratie verhogen helpt. Versleep de afstandsknop onder de drempel en het lab zegt het je.

Is een S-curve altijd beter dan een trapeziumprofiel?

Nee. Hij is altijd trager, en de machine heeft niet altijd last van het verschijnsel dat hij oplost. Een S-curve begrenst de jerk, wat telt wanneer de aandrijving soepel is — riemen, lange schakels, een zwaar gereedschap aan het eind van een arm — omdat een sprong in de acceleratie die soepelheid aanstoot en die daarna natrilt. Op een korte, stijve, rechtstreeks aangedreven as is dat natrillen misschien niet eens meetbaar en is de extra tijd puur verlies. Gebruik het lab om de kosten te zien en beslis dan of jouw machine betaalt voor iets dat ze nodig heeft.

Wat kost jerkbegrenzing nu werkelijk?

Precies één jerksectijd, t_j = a_max / j_max, mits beide profielen dezelfde topsnelheid en dezelfde acceleratie bereiken. Niet twee, en — het verrassende deel — onafhankelijk van hoe ver de beweging gaat. Het acceleratiesegment van de S-curve is langer, dus hij legt meer af voordat hij constant vaart, dus de constante fase wordt korter en geeft het meeste van de tijd terug. Alleen de jerksectijd zelf is onherstelbaar. Versleep de afstandsknop en zie dat de jerkkosten op dezelfde plek blijven.

Waarom bereikt de acceleratie nooit mijn acceleratiegrens?

Omdat de jerkgrens daarvoor te laag is. Oprampen naar a_max en weer uitrampen vraagt een snelheidsverandering van a_max²/j_max, dus als je topsnelheid daaronder ligt wordt de acceleratie zelf driehoekig met een piek op √(v·j). Dat is hetzelfde verhaal als bij een korte beweging — te weinig ruimte — één afgeleide hoger. Het lab wijst er telkens op als het gebeurt.

Waar hoort het profiel in mijn code?

Vóór de regelaar, niet erin. Het profiel levert een setpoint op — waar de as nu moet zijn — en wat je al had volgt dat: een stapplanner, een PID-lus, een servocomando. Daarom lost profileren vaak een as op die slecht afgesteld leek. Een stapcommando vraagt een PID om oneindige uitvoer, dus de fout begint op de volle bewegingsafstand en de integraal loopt op terwijl de uitvoer verzadigd is. Tegen een geprofileerd doel blijft de fout klein en gedragen dezelfde versterkingsfactoren zich.

Verder lezen

Bronnen

Gezaghebbende bronnen om dieper te gaan dan het afgebakende leermodel van deze simulator.