17 double upTime, maxPowerTime, downTime;
18 double acc, maxSpeed, limitSpeed;
20 double nowPos, nowSpeed;
22 double startSpeed, endSpeed;
23 double nextNowPos, nextNowSpeed;
32 Trapezoidal(
double acc,
double maxSpeed,
double nowPos)
57 double operator()(
const double target,
bool isStop =
false,
const double endS = 0.0)
69 if (oldTarget != target || reCalculation)
74 reCalculation =
false;
77 startSpeed = nextNowSpeed;
78 endSpeed = endS * 0.001;
79 const double distance = target - nowPos;
80 dir = (distance > 0.0 ? 1 : 0);
82 endSpeed = abs(endSpeed) * (dir ? 1 : -1);
83 maxSpeed = abs(maxSpeed) * (dir ? 1 : -1);
84 acc = abs(acc) * (dir ? 1 : -1);
86 upTime = (maxSpeed - startSpeed) / acc;
87 downTime = (maxSpeed - endSpeed) / acc;
91 const double L1 = startSpeed * upTime + acc * sq(upTime) * 0.5;
92 const double L3 = endSpeed * downTime + acc * sq(downTime) * 0.5;
93 if (abs(L1) + abs(L3) > abs(distance))
95 limitSpeed = 2.00 * acc * distance * 0.5 + sq(startSpeed);
96 limitSpeed = sqrt(limitSpeed) * (dir ? 1 : -1);
97 if (abs(limitSpeed) < abs(startSpeed))
98 limitSpeed = startSpeed;
99 upTime = (limitSpeed - startSpeed) / acc;
100 downTime = (limitSpeed - endSpeed) / acc;
105 maxPowerTime = (distance - L1 - L3) / maxSpeed;
106 limitSpeed = maxSpeed;
113 double ut = constrain(Stopwatch.getTime(), 0.00, upTime);
114 double mt = constrain(Stopwatch.getTime() - upTime, 0.00, maxPowerTime);
115 double dt = constrain(Stopwatch.getTime() - (upTime + maxPowerTime), 0.00, downTime);
116 double targets = acc * sq(ut) * 0.50 + startSpeed * ut + maxSpeed * mt + (-acc * sq(dt) * 0.50) + limitSpeed * dt;
120 nextNowSpeed = startSpeed + acc * ut + -acc * dt;
121 nextNowPos = targets + nowPos;
123 if (upTime + downTime + maxPowerTime <= Stopwatch.getTime())
136 double getTime()
const
138 return Stopwatch.getTime();
149 reCalculation =
true;
153 double getNowPos()
const
159 double getTargetPos()
const
165 double getNowSpeed()
const
167 return nowSpeed * 1000;
169 void setAcc(
double acc)
171 this->acc = acc * 0.001;