45template <
class Distance>
71 if (!std::is_constant_evaluated()) {
86 if (!std::is_constant_evaluated()) {
113 : m_constraints(constraints) {}
131 m_direction = ShouldFlipAcceleration(current, goal) ? -1 : 1;
132 m_current = Direct(current);
141 units::second_t cutoffBegin =
155 units::second_t accelerationTime =
169 m_endAccel = accelerationTime - cutoffBegin;
170 m_endFullSpeed = m_endAccel + fullSpeedDist / m_constraints.
maxVelocity;
171 m_endDecel = m_endFullSpeed + accelerationTime - cutoffEnd;
172 State result = m_current;
174 if (t < m_endAccel) {
178 }
else if (t < m_endFullSpeed) {
180 result.position += (m_current.
velocity +
184 }
else if (t <= m_endDecel) {
187 units::second_t timeLeft = m_endDecel - t;
196 return Direct(result);
209 units::second_t endAccel = m_endAccel * m_direction;
210 units::second_t endFullSpeed = m_endFullSpeed * m_direction - endAccel;
212 if (target < position) {
214 endFullSpeed *= -1.0;
231 velocity * endAccel + 0.5 * acceleration * endAccel * endAccel;
234 if (endAccel > 0_s) {
238 decelVelocity = velocity;
244 if (accelDist > distToTarget) {
245 accelDist = distToTarget;
248 }
else if (accelDist + fullSpeedDist > distToTarget) {
249 fullSpeedDist = distToTarget - accelDist;
252 decelDist = distToTarget - fullSpeedDist - accelDist;
255 units::second_t accelTime =
257 velocity * velocity + 2 * acceleration * accelDist))) /
260 units::second_t decelTime =
263 2 * deceleration * decelDist))) /
266 units::second_t fullSpeedTime = fullSpeedDist / m_constraints.
maxVelocity;
268 return accelTime + fullSpeedTime + decelTime;
276 constexpr units::second_t
TotalTime()
const {
return m_endDecel; }
300 static constexpr bool ShouldFlipAcceleration(
const State& initial,
302 return initial.position > goal.position;
306 constexpr State Direct(
const State& in)
const {
308 result.position *= m_direction;
309 result.velocity *= m_direction;
316 Constraints m_constraints;
319 units::second_t m_endAccel;
320 units::second_t m_endFullSpeed;
321 units::second_t m_endDecel;
Profile constraints.
Definition TrapezoidProfile.h:59
constexpr Constraints(Velocity_t maxVelocity, Acceleration_t maxAcceleration)
Constructs constraints for a Trapezoid Profile.
Definition TrapezoidProfile.h:83
Velocity_t maxVelocity
Maximum velocity.
Definition TrapezoidProfile.h:62
constexpr Constraints()
Default constructor.
Definition TrapezoidProfile.h:70
Acceleration_t maxAcceleration
Maximum acceleration.
Definition TrapezoidProfile.h:65
Profile state.
Definition TrapezoidProfile.h:96
constexpr bool operator==(const State &) const =default
Velocity_t velocity
The velocity at this state.
Definition TrapezoidProfile.h:102
Distance_t position
The position at this state.
Definition TrapezoidProfile.h:99
A trapezoid-shaped velocity profile.
Definition TrapezoidProfile.h:46
constexpr TrapezoidProfile & operator=(const TrapezoidProfile &)=default
constexpr TrapezoidProfile(Constraints constraints)
Constructs a TrapezoidProfile.
Definition TrapezoidProfile.h:112
constexpr TrapezoidProfile & operator=(TrapezoidProfile &&)=default
constexpr TrapezoidProfile(const TrapezoidProfile &)=default
constexpr units::second_t TotalTime() const
Returns the total time the profile takes to reach the goal.
Definition TrapezoidProfile.h:276
units::compound_unit< Distance, units::inverse< units::seconds > > Velocity
Definition TrapezoidProfile.h:49
constexpr bool IsFinished(units::second_t t) const
Returns true if the profile has reached the goal.
Definition TrapezoidProfile.h:287
constexpr units::second_t TimeLeftUntil(Distance_t target) const
Returns the time left until a target distance in the profile is reached.
Definition TrapezoidProfile.h:205
constexpr TrapezoidProfile(TrapezoidProfile &&)=default
constexpr State Calculate(units::second_t t, State current, State goal)
Calculates the position and velocity for the profile at a time t where the current state is at time t...
Definition TrapezoidProfile.h:130
units::compound_unit< Velocity, units::inverse< units::seconds > > Acceleration
Definition TrapezoidProfile.h:52
static void ReportUsage(MathUsageId id, int count)
Definition MathShared.h:75
constexpr UnitType abs(const UnitType x) noexcept
Compute absolute value.
Definition math.h:726
constexpr auto sqrt(const UnitType &value) noexcept -> unit_t< square_root< typename units::traits::unit_t_traits< UnitType >::unit_type >, typename units::traits::unit_t_traits< UnitType >::underlying_type, linear_scale >
computes the square root of value
Definition math.h:485
typename units::detail::compound_impl< U, Us... >::type compound_unit
Represents a unit type made up from other units.
Definition base.h:1438
State
Possible state of a SysId routine.
Definition SysIdRoutineLog.h:25
constexpr UnitTypeLhs max(const UnitTypeLhs &lhs, const UnitTypeRhs &rhs)
Definition base.h:3422
@ kTrajectory_TrapezoidProfile