Skip to content

Commit 727444e

Browse files
Remove deprecation of i_min/i_max PID parameters (#507)
1 parent e92fc15 commit 727444e

File tree

5 files changed

+38
-39
lines changed

5 files changed

+38
-39
lines changed

control_toolbox/include/control_toolbox/pid.hpp

Lines changed: 13 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -82,8 +82,8 @@ struct AntiWindupStrategy
8282

8383
AntiWindupStrategy()
8484
: type(UNDEFINED),
85-
i_min(std::numeric_limits<double>::quiet_NaN()),
86-
i_max(std::numeric_limits<double>::quiet_NaN()),
85+
i_min(-std::numeric_limits<double>::infinity()),
86+
i_max(std::numeric_limits<double>::infinity()),
8787
legacy_antiwindup(false),
8888
tracking_time_constant(0.0),
8989
error_deadband(std::numeric_limits<double>::epsilon())
@@ -135,20 +135,11 @@ struct AntiWindupStrategy
135135
"AntiWindupStrategy 'back_calculation' requires a valid positive tracking time constant "
136136
"(tracking_time_constant)");
137137
}
138-
if (type == LEGACY && ((i_min > i_max) || !std::isfinite(i_min) || !std::isfinite(i_max)))
138+
if (i_min > i_max)
139139
{
140140
throw std::invalid_argument(
141141
fmt::format(
142-
"AntiWindupStrategy 'legacy' requires i_min < i_max and to be finite (i_min: {}, i_max: "
143-
"{})",
144-
i_min, i_max));
145-
}
146-
if (type != LEGACY && (std::isfinite(i_min) || std::isfinite(i_max)))
147-
{
148-
std::cout << "Warning: The i_min and i_max are only valid for the deprecated LEGACY "
149-
"antiwindup strategy. Please use the AntiWindupStrategy::set_type() method to "
150-
"set the type of antiwindup strategy you want to use."
151-
<< std::endl;
142+
"PID requires i_min <= i_max if limits are finite (i_min: {}, i_max: {})", i_min, i_max));
152143
}
153144
if (
154145
type != NONE && type != UNDEFINED && type != LEGACY && type != BACK_CALCULATION &&
@@ -182,8 +173,8 @@ struct AntiWindupStrategy
182173
}
183174

184175
Value type = UNDEFINED;
185-
double i_min = std::numeric_limits<double>::quiet_NaN(); /**< Minimum allowable integral term. */
186-
double i_max = std::numeric_limits<double>::quiet_NaN(); /**< Maximum allowable integral term. */
176+
double i_min = -std::numeric_limits<double>::infinity(); /**< Minimum allowable integral term. */
177+
double i_max = std::numeric_limits<double>::infinity(); /**< Maximum allowable integral term. */
187178

188179
bool legacy_antiwindup = false; /**< Use legacy anti-windup strategy. */
189180

@@ -430,8 +421,10 @@ class Pid
430421
double p_gain_ = 0.0; /**< Proportional gain. */
431422
double i_gain_ = 0.0; /**< Integral gain. */
432423
double d_gain_ = 0.0; /**< Derivative gain. */
433-
double i_max_ = 0.0; /**< Maximum allowable integral term. */
434-
double i_min_ = 0.0; /**< Minimum allowable integral term. */
424+
double i_max_ =
425+
std::numeric_limits<double>::infinity(); /**< Maximum allowable integral term. */
426+
double i_min_ =
427+
-std::numeric_limits<double>::infinity(); /**< Minimum allowable integral term. */
435428
double u_max_ = std::numeric_limits<double>::infinity(); /**< Maximum allowable output. */
436429
double u_min_ = -std::numeric_limits<double>::infinity(); /**< Minimum allowable output. */
437430
bool antiwindup_ = false; /**< Anti-windup. */
@@ -456,8 +449,9 @@ class Pid
456449
*/
457450
[[deprecated("Use constructor with AntiWindupStrategy only.")]]
458451
Pid(
459-
double p = 0.0, double i = 0.0, double d = 0.0, double i_max = 0.0, double i_min = -0.0,
460-
bool antiwindup = false);
452+
double p = 0.0, double i = 0.0, double d = 0.0,
453+
double i_max = std::numeric_limits<double>::infinity(),
454+
double i_min = -std::numeric_limits<double>::infinity(), bool antiwindup = false);
461455

462456
/*!
463457
* \brief Constructor, initialize Pid-gains and term limits.

control_toolbox/src/pid.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -431,6 +431,8 @@ double Pid::compute_command(double error, double error_dot, const double & dt_s)
431431
}
432432
}
433433

434+
i_term_ = std::clamp(i_term_, gains_.i_min_, gains_.i_max_);
435+
434436
return cmd_;
435437
}
436438

control_toolbox/src/pid_ros.cpp

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@
4040

4141
namespace control_toolbox
4242
{
43-
constexpr double UMAX_INFINITY = std::numeric_limits<double>::infinity();
43+
constexpr double MAX_INFINITY = std::numeric_limits<double>::infinity();
4444
#pragma GCC diagnostic push
4545
#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
4646
PidROS::PidROS(
@@ -257,8 +257,8 @@ bool PidROS::initialize_from_ros_parameters()
257257
double p, i, d, i_max, i_min, u_max, u_min, tracking_time_constant, error_deadband;
258258
p = i = d = i_max = i_min = tracking_time_constant = std::numeric_limits<double>::quiet_NaN();
259259
error_deadband = std::numeric_limits<double>::epsilon();
260-
u_max = UMAX_INFINITY;
261-
u_min = -UMAX_INFINITY;
260+
u_max = i_max = MAX_INFINITY;
261+
u_min = i_min = -MAX_INFINITY;
262262
bool antiwindup = false;
263263
std::string antiwindup_strat_str = "legacy";
264264
bool all_params_available = true;
@@ -278,8 +278,8 @@ bool PidROS::initialize_from_ros_parameters()
278278
get_boolean_param(param_prefix_ + "saturation", saturation);
279279
if (!saturation)
280280
{
281-
u_max = UMAX_INFINITY;
282-
u_min = -UMAX_INFINITY;
281+
u_max = MAX_INFINITY;
282+
u_min = -MAX_INFINITY;
283283
}
284284
get_boolean_param(param_prefix_ + "antiwindup", antiwindup);
285285
get_string_param(param_prefix_ + "antiwindup_strategy", antiwindup_strat_str);
@@ -342,7 +342,7 @@ bool PidROS::initialize_from_args(
342342
antiwindup_strat.i_min = i_min;
343343
antiwindup_strat.legacy_antiwindup = antiwindup;
344344

345-
return initialize_from_args(p, i, d, UMAX_INFINITY, -UMAX_INFINITY, antiwindup_strat, false);
345+
return initialize_from_args(p, i, d, MAX_INFINITY, -MAX_INFINITY, antiwindup_strat, false);
346346
}
347347
#pragma GCC diagnostic pop
348348

@@ -355,8 +355,7 @@ bool PidROS::initialize_from_args(
355355
antiwindup_strat.i_min = i_min;
356356
antiwindup_strat.legacy_antiwindup = antiwindup;
357357

358-
return initialize_from_args(
359-
p, i, d, UMAX_INFINITY, -UMAX_INFINITY, antiwindup_strat, save_i_term);
358+
return initialize_from_args(p, i, d, MAX_INFINITY, -MAX_INFINITY, antiwindup_strat, save_i_term);
360359
}
361360

362361
bool PidROS::initialize_from_args(
@@ -454,7 +453,7 @@ bool PidROS::set_gains(double p, double i, double d, double i_max, double i_min,
454453
antiwindup_strat.i_max = i_max;
455454
antiwindup_strat.i_min = i_min;
456455
antiwindup_strat.legacy_antiwindup = antiwindup;
457-
return set_gains(p, i, d, UMAX_INFINITY, -UMAX_INFINITY, antiwindup_strat);
456+
return set_gains(p, i, d, MAX_INFINITY, -MAX_INFINITY, antiwindup_strat);
458457
}
459458

460459
bool PidROS::set_gains(
@@ -610,8 +609,8 @@ void PidROS::set_parameter_event_callback()
610609
RCLCPP_WARN(
611610
node_logging_->get_logger(),
612611
"Saturation is set to false, Changing the u_min and u_max to -inf and inf");
613-
gains.u_min_ = -UMAX_INFINITY;
614-
gains.u_max_ = UMAX_INFINITY;
612+
gains.u_min_ = -MAX_INFINITY;
613+
gains.u_max_ = MAX_INFINITY;
615614
}
616615
else
617616
{
@@ -659,15 +658,15 @@ void PidROS::set_parameter_event_callback()
659658
}
660659
else if (param_name == param_prefix_ + "u_clamp_max")
661660
{
662-
gains.u_max_ = saturation ? parameter.get_value<double>() : UMAX_INFINITY;
661+
gains.u_max_ = saturation ? parameter.get_value<double>() : MAX_INFINITY;
663662
RCLCPP_WARN_EXPRESSION(
664663
node_logging_->get_logger(), !saturation,
665664
"Saturation is set to false, Changing the u_clamp_max inf");
666665
changed = true;
667666
}
668667
else if (param_name == param_prefix_ + "u_clamp_min")
669668
{
670-
gains.u_min_ = saturation ? parameter.get_value<double>() : -UMAX_INFINITY;
669+
gains.u_min_ = saturation ? parameter.get_value<double>() : -MAX_INFINITY;
671670
RCLCPP_WARN_EXPRESSION(
672671
node_logging_->get_logger(), !saturation,
673672
"Saturation is set to false, Changing the u_clamp_min -inf");

control_toolbox/test/pid_ros_parameters_tests.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -178,8 +178,8 @@ TEST(PidParametersTest, InitPidTestBadParameter)
178178
ASSERT_EQ(gains.p_gain_, 0.0);
179179
ASSERT_EQ(gains.i_gain_, 0.0);
180180
ASSERT_EQ(gains.d_gain_, 0.0);
181-
ASSERT_EQ(gains.i_max_, 0.0);
182-
ASSERT_EQ(gains.i_min_, 0.0);
181+
ASSERT_EQ(gains.i_max_, std::numeric_limits<double>::infinity());
182+
ASSERT_EQ(gains.i_min_, -std::numeric_limits<double>::infinity());
183183
ASSERT_EQ(gains.u_max_, std::numeric_limits<double>::infinity());
184184
ASSERT_EQ(gains.u_min_, -std::numeric_limits<double>::infinity());
185185
ASSERT_EQ(gains.antiwindup_strat_.tracking_time_constant, 0.0);
@@ -608,7 +608,7 @@ TEST(PidParametersTest, GetParametersFromParams)
608608
const bool ACTIVATE_STATE_PUBLISHER = false;
609609
TestablePidROS pid(node, "", "", ACTIVATE_STATE_PUBLISHER);
610610

611-
ASSERT_FALSE(pid.initialize_from_ros_parameters());
611+
ASSERT_TRUE(pid.initialize_from_ros_parameters());
612612

613613
rclcpp::Parameter param_p;
614614
ASSERT_TRUE(node->get_parameter("p", param_p));
@@ -624,11 +624,11 @@ TEST(PidParametersTest, GetParametersFromParams)
624624

625625
rclcpp::Parameter param_i_clamp_max;
626626
ASSERT_TRUE(node->get_parameter("i_clamp_max", param_i_clamp_max));
627-
EXPECT_TRUE(std::isnan(param_i_clamp_max.get_value<double>()));
627+
EXPECT_FALSE(std::isfinite(param_i_clamp_max.get_value<double>()));
628628

629629
rclcpp::Parameter param_i_clamp_min;
630630
ASSERT_TRUE(node->get_parameter("i_clamp_min", param_i_clamp_min));
631-
EXPECT_TRUE(std::isnan(param_i_clamp_min.get_value<double>()));
631+
EXPECT_FALSE(std::isfinite(param_i_clamp_min.get_value<double>()));
632632

633633
rclcpp::Parameter param_u_clamp_max;
634634
ASSERT_TRUE(node->get_parameter("u_clamp_max", param_u_clamp_max));

control_toolbox/test/pid_tests.cpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -587,7 +587,9 @@ TEST(CommandTest, proportionalOnlyTest)
587587
"only.");
588588

589589
// Set only proportional gain
590-
Pid pid(1.0, 0.0, 0.0, 0.0, 0.0);
590+
Pid pid(
591+
1.0, 0.0, 0.0, std::numeric_limits<double>::infinity(),
592+
-std::numeric_limits<double>::infinity());
591593
double cmd = 0.0;
592594

593595
// If initial error = 0, p-gain = 1, dt = 1
@@ -685,7 +687,9 @@ TEST(CommandTest, derivativeOnlyTest)
685687
"with own differentiation (ATTENTION: this test depends on the differentiation scheme).");
686688

687689
// Set only derivative gain
688-
Pid pid(0.0, 0.0, 1.0, 0.0, 0.0);
690+
Pid pid(
691+
0.0, 0.0, 1.0, std::numeric_limits<double>::infinity(),
692+
-std::numeric_limits<double>::infinity());
689693
double cmd = 0.0;
690694

691695
// If initial error = 0, d-gain = 1, dt = 1

0 commit comments

Comments
 (0)