34#include <boost/circular_buffer.hpp>
40 template <class T, class = typename std::enable_if<std::is_floating_point<T>::value>::type>
44 float dist = periodHi - periodLo;
45 return std::fmod(value - periodLo + dist, dist) + periodLo;
48 template <class T, class = typename std::enable_if<std::is_floating_point<T>::value>::type>
53 T b = std::sqrt(std::pow(p / 2, 2) -
q);
54 return {a + b, a - b};
70 d.
dt = std::abs(d.
dv / acc);
75 std::array<deltas, 3>
trapeze(
float v0,
float acc,
float vMax,
float dec,
float vt,
float dx);
78 trapezeArea(
float v0,
float vmax,
float dt1,
float dt2,
float dt3)
80 return (v0 + vmax) / 2 * dt1 + dt2 * vmax + dt3 * vmax * 0.5;
101 dt1 += newDt - oldDt;
102 newV = (-dt0 * v0 + 2 * area) / (dt0 + 2 * dt1 + dt2);
103 newAcc = (newV - v0) / dt0;
106 if (newV < std::abs(v0))
148 std::array<deltas, 3>
149 trapezeWithDt(
float v0,
float acc,
float vMax,
float dec,
float vt,
float dx,
float dt);
165 return M_PI - std::fabs(std::fmod(std::fabs(angle1 - angle2),
M_PI * 2) -
M_PI);
211 typedef std::shared_ptr<class RampedAccelerationVelocityControllerConfiguration>
213 typedef std::shared_ptr<const RampedAccelerationVelocityControllerConfiguration>
244 const float currentV,
249 float directSetVLimit);
293 float directSetVLimit,
294 float currentPosition,
295 float positionLimitLoSoft,
296 float positionLimitHiSoft,
297 float positionLimitLoHard,
298 float positionLimitHiHard);
314 std::shared_ptr<PIDController>
pid;
322 mutable bool PIDModeActive =
false;
327 float targetVelocityPID;
328 float targetVelocityRAMP;
334 mutable boost::circular_buffer<HelpStruct> buffer;
335 mutable int eventHappeningCounter = -1;
342 mutable bool currentlyPIDActive =
false;
396 std::pair<State, Output>
calcState()
const;
398 mutable bool PIDModeActive =
false;
403 double targetVelocityPID;
404 double targetVelocityRAMP;
410 mutable boost::circular_buffer<HelpStruct> buffer;
411 mutable int eventHappeningCounter = -1;
421 float currentPosition,
422 float targetPosition,
441 float currentPosition,
442 float targetPosition,
444 float positionLimitLo,
445 float positionLimitHi);
463 float currentPosition,
464 float targetPosition,
465 float pControlPosErrorLimit,
468 float positionPeriodLo,
469 float positionPeriodHi);
double desiredDeceleration
double getTargetPosition() const
void setTargetPosition(double value)
std::unique_ptr< FixedMinJerkState > fixedMinJerkState
double phase2SwitchDistance
double phase2SwitchMaxRemainingTime
RampedAccelerationVelocityControllerConfiguration()=default
This file offers overloads of toIce() and fromIce() functions for STL container types.
float positionThroughVelocityControlWithAccelerationAndPositionBounds(float dt, float maxDt, float currentV, float maxV, float acceleration, float deceleration, float currentPosition, float targetPosition, float p, float positionLimitLo, float positionLimitHi)
float velocityControlWithAccelerationBounds(float dt, float maxDt, const float currentV, float targetV, float maxV, float acceleration, float deceleration, float directSetVLimit)
std::array< deltas, 3 > trapeze(float v0, float acc, float vMax, float dec, float vt, float dx)
std::array< deltas, 3 > trapezeWithDt(float v0, float acc, float vMax, float dec, float vt, float dx, float dt)
std::shared_ptr< const RampedAccelerationVelocityControllerConfiguration > RampedAccelerationVelocityControllerConfigurationCPtr
deltas accelerateToVelocity(float v0, float acc, float vt)
float positionThroughVelocityControlWithAccelerationBoundsAndPeriodicPosition(float dt, float maxDt, float currentV, float maxV, float acceleration, float deceleration, float currentPosition, float targetPosition, float pControlPosErrorLimit, float p, float &direction, float positionPeriodLo, float positionPeriodHi)
std::shared_ptr< class RampedAccelerationVelocityControllerConfiguration > RampedAccelerationVelocityControllerConfigurationPtr
std::pair< T, T > pq(T p, T q)
float trapezeArea(float v0, float vmax, float dt1, float dt2, float dt3)
T periodicClamp(T value, T periodLo, T periodHi)
float brakingDistance(float v0, float deceleration)
float velocityControlWithAccelerationAndPositionBounds(float dt, float maxDt, float currentV, float targetV, float maxV, float acceleration, float deceleration, float directSetVLimit, float currentPosition, float positionLimitLoSoft, float positionLimitHiSoft, float positionLimitLoHard, float positionLimitHiHard)
float angleDistance(float angle1, float angle2)
void findVelocityAndAccelerationForTimeAndDistance(float distance, float v0, float vmax, float dec, std::array< deltas, 3 > trapeze, float newDt, float &newV, float &newAcc, float &newDec)
float positionThroughVelocityControlWithAccelerationBounds(float dt, float maxDt, float currentV, float maxV, float acceleration, float deceleration, float currentPosition, float targetPosition, float p)
double distance(const Point &a, const Point &b)
bool validParameters() const
float estimateTime() const
float pControlPosErrorLimit
bool validParameters() const
bool getCurrentlyPIDActive() const
std::shared_ptr< PIDController > pid
float calculateProportionalGain() const
PositionThroughVelocityControllerWithAccelerationBounds()
double pControlPosErrorLimit
PositionThroughVelocityControllerWithAccelerationRamps()
double estimateTime() const
std::pair< State, Output > calcState() const
double getTargetPosition() const
void setTargetPosition(double value)
bool validParameters() const
double calculateProportionalGain() const
Performs velocity control while staying in positional bounds, obeying acceleration / deceleration and...
float positionLimitHiSoft
bool validParameters() const
float positionLimitLoSoft
float estimateTime() const
bool validParameters() const
double positionLimitLoSoft
bool validParameters() const
double positionLimitHiSoft
bool validParameters() const