19#ifndef CONTROL_TOOLBOX__RATE_LIMITER_HPP_
20#define CONTROL_TOOLBOX__RATE_LIMITER_HPP_
59 T
min_value = std::numeric_limits<T>::quiet_NaN(),
60 T
max_value = std::numeric_limits<T>::quiet_NaN(),
125 T
min_value = std::numeric_limits<T>::quiet_NaN(),
126 T
max_value = std::numeric_limits<T>::quiet_NaN(),
136 bool has_value_limits_ =
true;
137 bool has_first_derivative_limits_ =
true;
138 bool has_second_derivative_limits_ =
true;
141 T min_value_ = std::numeric_limits<T>::quiet_NaN();
142 T max_value_ = std::numeric_limits<T>::quiet_NaN();
145 T min_first_derivative_neg_ = std::numeric_limits<T>::quiet_NaN();
146 T max_first_derivative_pos_ = std::numeric_limits<T>::quiet_NaN();
147 T min_first_derivative_pos_ = std::numeric_limits<T>::quiet_NaN();
148 T max_first_derivative_neg_ = std::numeric_limits<T>::quiet_NaN();
151 T min_second_derivative_ = std::numeric_limits<T>::quiet_NaN();
152 T max_second_derivative_ = std::numeric_limits<T>::quiet_NaN();
188 throw std::invalid_argument(
"Invalid value limits");
201 throw std::invalid_argument(
"Invalid first derivative limits");
215 throw std::invalid_argument(
"Invalid first derivative limits");
229 throw std::invalid_argument(
"Invalid second derivative limits");
250 limit_second_derivative(
v, v0, v1,
dt);
251 limit_first_derivative(
v, v0,
dt);
254 return tmp !=
static_cast<T
>(0.0) ?
v /
tmp :
static_cast<T
>(1.0);
262 if (has_value_limits_)
264 v = std::clamp(
v, min_value_, max_value_);
267 return tmp !=
static_cast<T
>(0.0) ?
v /
tmp :
static_cast<T
>(1.0);
275 if (has_first_derivative_limits_)
278 if (v0 >
static_cast<T
>(0.0))
280 dv_max = max_first_derivative_pos_ *
dt;
281 dv_min = min_first_derivative_pos_ *
dt;
283 else if (v0 <
static_cast<T
>(0.0))
285 dv_min = min_first_derivative_neg_ *
dt;
286 dv_max = max_first_derivative_neg_ *
dt;
290 dv_min = min_first_derivative_neg_ *
dt;
291 dv_max = max_first_derivative_pos_ *
dt;
298 return tmp !=
static_cast<T
>(0.0) ?
v /
tmp :
static_cast<T
>(1.0);
306 if (has_second_derivative_limits_)
309 const T
dv0 = v0 - v1;
314 if ((
dv -
dv0) * (
v - v0) > 0)
318 const T
da_min = min_second_derivative_ *
dt2;
319 const T
da_max = max_second_derivative_ *
dt2;
327 return tmp !=
static_cast<T
>(0.0) ?
v /
tmp :
static_cast<T
>(1.0);