Ik wil een trapezium vormig snelheidsprofiel voor steppers aanhouden.
Stel mijn max snelheid vmax mijn max versnelling is amax.
Als ik dan gedurende t tijd versnel beweeg ik in die tijd dx = 0.5 amax * t2. Als ik gedurende t tijd constante snelheid beweeg, dan beweeg ik dx = v * t.
Voor de trapezium vorm moet ik versnellen gedurende t = vmax/amax.
Als ik nu op positie N wil eindigen, reken ik de versnel/vertraag tijd uit: t = vmax/amax. Nu reken ik de afstand uit die daarmee gemoeid is: dxacc = 2 * 0.5 amax * t2 = vmax2/amax. Als dit groter is dan N dan is er geen horizontaal stukje in de trapezium vorm en moet ik opnieuw beginnen: N = 2 * 0.5 * amax * t2 => t2 = N/amax => t = sqrt (N/amax).
Anders gaan we verder en rekenen we uit hoeveel er nog met constante snelheid verplaatst moet worden: dxcs = N - dxacc.En daaruit volgt dan de tijd dat we met constante snelheid moeten bewegen. tcs = dxcs / vmax.
Eenvoudig, rechttoe, rechtan. Maar nu komt het.... Dit is helemaal precies als "t" een "real" is. Maar ik werk in tijdstappen.
dus even een concreet voorbeeld: Stel ik accellereer 10 tijdstappen van 100ms met 100stappen/sec/sec, dan leg ik in die tijd 10+20+... +100 = 550 stappen af. 1100 met het afremmen er bij en om 2000 stappen te doen moet ik nog negen tijdstappen met constante snelheid van 100stappen per tijdstap doorlopen.
Als ie het simuleer met tacc = 10, tcs = 10 en acc= 10, kom ik precies op 2000 stappen uit. Ik heb hierboven iets verkeerd gedaan. Randcondities en zo. Zal me aan me reet roesten.
Wil ik nu 2100 stappen doen, dan verleng ik gewoon de constante snelheid tijd met 1 stap en klaar. Maar wat nu als ik 50 stappen meer wil doen? Mijn gevoel zegt me dat dit ook redelijk makkelijk moet kunnen. Met de "drie fases" is er niet genoeg speelmogelijkheid om alle mogelijke waardes te bereiken, Maar wat nu als ik bijvoorbeeld tijdens het afremmen op snelheid 50 1 tijdstap extra blijf hangen? 1 tijdstap lang acc=0 ipv -10. Nu kan ik 2050 maken, maar nog niet 2045 stappen.
Mijn vraag: Weet iemand een algorithme waarmee ik precies op de gewenste positie kan uitkomen?
Bovenstaande "afronding" 9/10 ga ik zelf kunnen oplossen.
c code:
#include <stdio.h>
#include <stdlib.h>
int main (int argc, char **argv)
{
int a, v, x, t, t1, t2;
a = atoi (argv[1]);
t1 = atoi (argv[2]);
t2 = atoi (argv[3]);
x = v = 0;
for (t=0;t<t1;t++) {
v += a;
x += v;
printf ("t%d: x=%d, v=%d\n", t, x, v);
}
for (t=0;t<t2;t++) {
x += v;
printf ("t%d: x=%d, v=%d\n", t1+t, x, v);
}
for (t=0;t<t1;t++) {
v -= a;
x += v;
printf ("t%d: x=%d, v=%d\n", t1+t2+t, x, v);
}
exit (0);
}
code:
> ./a.out 10 10 10
t0: x=10, v=10
t1: x=30, v=20
t2: x=60, v=30
t3: x=100, v=40
t4: x=150, v=50
t5: x=210, v=60
t6: x=280, v=70
t7: x=360, v=80
t8: x=450, v=90
t9: x=550, v=100
t10: x=650, v=100
t11: x=750, v=100
t12: x=850, v=100
t13: x=950, v=100
t14: x=1050, v=100
t15: x=1150, v=100
t16: x=1250, v=100
t17: x=1350, v=100
t18: x=1450, v=100
t19: x=1550, v=100
t20: x=1640, v=90
t21: x=1720, v=80
t22: x=1790, v=70
t23: x=1850, v=60
t24: x=1900, v=50
t25: x=1940, v=40
t26: x=1970, v=30
t27: x=1990, v=20
t28: x=2000, v=10
t29: x=2000, v=0