Skip to content

Commit 9ffcd1c

Browse files
Remove deprecation of i_min/i_max PID parameters
partial backport of #436
1 parent ae8d31b commit 9ffcd1c

File tree

5 files changed

+28
-28
lines changed

5 files changed

+28
-28
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: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -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 = UMAX_INFINITY;
261+
u_min = i_min = -UMAX_INFINITY;
262262
bool antiwindup = false;
263263
std::string antiwindup_strat_str = "legacy";
264264
bool all_params_available = true;

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)