@@ -56,10 +56,16 @@ void check_set_parameters(
56
56
const double D = 3.0 ;
57
57
const double I_MAX = 10.0 ;
58
58
const double I_MIN = -10.0 ;
59
+ const double U_MAX = 10.0 ;
60
+ const double U_MIN = -10.0 ;
61
+ const double TRK_TC = 4.0 ;
62
+ const bool SATURATION = true ;
59
63
const bool ANTIWINDUP = true ;
64
+ const std::string ANTIWINDUP_STRAT = " none" ;
60
65
const bool SAVE_I_TERM = true ;
61
66
62
- ASSERT_NO_THROW (pid.initialize_from_args (P, I, D, I_MAX, I_MIN, ANTIWINDUP, SAVE_I_TERM));
67
+ ASSERT_NO_THROW (pid.initialize_from_args (P, I, D, I_MAX, I_MIN, U_MAX, U_MIN, TRK_TC, SATURATION,
68
+ ANTIWINDUP, ANTIWINDUP_STRAT, SAVE_I_TERM));
63
69
64
70
rclcpp::Parameter param;
65
71
@@ -79,9 +85,24 @@ void check_set_parameters(
79
85
ASSERT_TRUE (node->get_parameter (prefix + " i_clamp_min" , param));
80
86
ASSERT_EQ (param.get_value <double >(), I_MIN);
81
87
88
+ ASSERT_TRUE (node->get_parameter (prefix + " u_clamp_max" , param));
89
+ ASSERT_EQ (param.get_value <double >(), U_MAX);
90
+
91
+ ASSERT_TRUE (node->get_parameter (prefix + " u_clamp_min" , param));
92
+ ASSERT_EQ (param.get_value <double >(), U_MIN);
93
+
94
+ ASSERT_TRUE (node->get_parameter (prefix + " tracking_time_constant" , param));
95
+ ASSERT_EQ (param.get_value <double >(), TRK_TC);
96
+
97
+ ASSERT_TRUE (node->get_parameter (prefix + " saturation" , param));
98
+ ASSERT_EQ (param.get_value <bool >(), SATURATION);
99
+
82
100
ASSERT_TRUE (node->get_parameter (prefix + " antiwindup" , param));
83
101
ASSERT_EQ (param.get_value <bool >(), ANTIWINDUP);
84
102
103
+ ASSERT_TRUE (node->get_parameter (prefix + " antiwindup_strategy" , param));
104
+ ASSERT_EQ (param.get_value <std::string>(), ANTIWINDUP_STRAT);
105
+
85
106
ASSERT_TRUE (node->get_parameter (prefix + " save_i_term" , param));
86
107
ASSERT_EQ (param.get_value <bool >(), SAVE_I_TERM);
87
108
@@ -92,7 +113,12 @@ void check_set_parameters(
92
113
ASSERT_EQ (gains.d_gain_ , D);
93
114
ASSERT_EQ (gains.i_max_ , I_MAX);
94
115
ASSERT_EQ (gains.i_min_ , I_MIN);
116
+ ASSERT_EQ (gains.u_max_ , U_MAX);
117
+ ASSERT_EQ (gains.u_min_ , U_MIN);
118
+ ASSERT_EQ (gains.trk_tc_ , TRK_TC);
119
+ ASSERT_TRUE (gains.saturation_ );
95
120
ASSERT_TRUE (gains.antiwindup_ );
121
+ ASSERT_EQ (gains.antiwindup_strat_ , " none" );
96
122
}
97
123
98
124
TEST (PidParametersTest, InitPidTest)
@@ -118,8 +144,12 @@ TEST(PidParametersTest, InitPidTestBadParameter)
118
144
const double D = 3.0 ;
119
145
const double I_MAX_BAD = -10.0 ;
120
146
const double I_MIN_BAD = 10.0 ;
147
+ const double U_MAX_BAD = -10.0 ;
148
+ const double U_MIN_BAD = 10.0 ;
149
+ const double TRK_TC = 4.0 ;
121
150
122
- ASSERT_NO_THROW (pid.initialize_from_args (P, I, D, I_MAX_BAD, I_MIN_BAD, false ));
151
+ ASSERT_NO_THROW (pid.initialize_from_args (P, I, D, I_MAX_BAD, I_MIN_BAD, U_MAX_BAD, U_MIN_BAD,
152
+ TRK_TC, false , false , " none" , false ));
123
153
124
154
rclcpp::Parameter param;
125
155
@@ -129,7 +159,12 @@ TEST(PidParametersTest, InitPidTestBadParameter)
129
159
ASSERT_FALSE (node->get_parameter (" d" , param));
130
160
ASSERT_FALSE (node->get_parameter (" i_clamp_max" , param));
131
161
ASSERT_FALSE (node->get_parameter (" i_clamp_min" , param));
162
+ ASSERT_FALSE (node->get_parameter (" u_clamp_max" , param));
163
+ ASSERT_FALSE (node->get_parameter (" u_clamp_min" , param));
164
+ ASSERT_FALSE (node->get_parameter (" tracking_time_constant" , param));
165
+ ASSERT_FALSE (node->get_parameter (" saturation" , param));
132
166
ASSERT_FALSE (node->get_parameter (" antiwindup" , param));
167
+ ASSERT_FALSE (node->get_parameter (" antiwindup_strategy" , param));
133
168
134
169
// check gains were NOT set
135
170
control_toolbox::Pid::Gains gains = pid.get_gains ();
@@ -138,7 +173,12 @@ TEST(PidParametersTest, InitPidTestBadParameter)
138
173
ASSERT_EQ (gains.d_gain_ , 0.0 );
139
174
ASSERT_EQ (gains.i_max_ , 0.0 );
140
175
ASSERT_EQ (gains.i_min_ , 0.0 );
176
+ ASSERT_EQ (gains.u_max_ , 0.0 );
177
+ ASSERT_EQ (gains.u_min_ , 0.0 );
178
+ ASSERT_EQ (gains.trk_tc_ , 0.0 );
179
+ ASSERT_FALSE (gains.saturation_ );
141
180
ASSERT_FALSE (gains.antiwindup_ );
181
+ ASSERT_EQ (gains.antiwindup_strat_ , " none" );
142
182
}
143
183
144
184
TEST (PidParametersTest, InitPid_when_not_prefix_for_params_then_replace_slash_with_dot)
@@ -218,10 +258,16 @@ TEST(PidParametersTest, SetParametersTest)
218
258
const double D = 3.0 ;
219
259
const double I_MAX = 10.0 ;
220
260
const double I_MIN = -10.0 ;
261
+ const double U_MAX = 10.0 ;
262
+ const double U_MIN = -10.0 ;
263
+ const double TRK_TC = 4.0 ;
264
+ const bool SATURATION = true ;
221
265
const bool ANTIWINDUP = true ;
266
+ const std::string ANTIWINDUP_STRAT = " none" ;
222
267
const bool SAVE_I_TERM = false ;
223
268
224
- pid.initialize_from_args (P, I, D, I_MAX, I_MIN, ANTIWINDUP, SAVE_I_TERM);
269
+ pid.initialize_from_args (P, I, D, I_MAX, I_MIN, U_MAX, U_MIN, TRK_TC, SATURATION,
270
+ ANTIWINDUP, ANTIWINDUP_STRAT, SAVE_I_TERM);
225
271
226
272
rcl_interfaces::msg::SetParametersResult set_result;
227
273
@@ -240,8 +286,20 @@ TEST(PidParametersTest, SetParametersTest)
240
286
ASSERT_TRUE (set_result.successful );
241
287
ASSERT_NO_THROW (set_result = node->set_parameter (rclcpp::Parameter (" i_clamp_min" , I_MIN)));
242
288
ASSERT_TRUE (set_result.successful );
289
+ ASSERT_NO_THROW (set_result = node->set_parameter (rclcpp::Parameter (" u_clamp_max" , U_MAX)));
290
+ ASSERT_TRUE (set_result.successful );
291
+ ASSERT_NO_THROW (set_result = node->set_parameter (rclcpp::Parameter (" u_clamp_min" , U_MIN)));
292
+ ASSERT_TRUE (set_result.successful );
293
+ ASSERT_NO_THROW (set_result = node->set_parameter (rclcpp::Parameter (
294
+ " tracking_time_constant" , TRK_TC)));
295
+ ASSERT_TRUE (set_result.successful );
296
+ ASSERT_NO_THROW (set_result = node->set_parameter (rclcpp::Parameter (" saturation" , SATURATION)));
297
+ ASSERT_TRUE (set_result.successful );
243
298
ASSERT_NO_THROW (set_result = node->set_parameter (rclcpp::Parameter (" antiwindup" , ANTIWINDUP)));
244
299
ASSERT_TRUE (set_result.successful );
300
+ ASSERT_NO_THROW (set_result = node->set_parameter (rclcpp::Parameter (
301
+ " antiwindup_strategy" , ANTIWINDUP_STRAT)));
302
+ ASSERT_TRUE (set_result.successful );
245
303
ASSERT_NO_THROW (set_result = node->set_parameter (rclcpp::Parameter (" save_i_term" , SAVE_I_TERM)));
246
304
ASSERT_TRUE (set_result.successful );
247
305
@@ -255,7 +313,12 @@ TEST(PidParametersTest, SetParametersTest)
255
313
ASSERT_EQ (gains.d_gain_ , D);
256
314
ASSERT_EQ (gains.i_max_ , I_MAX);
257
315
ASSERT_EQ (gains.i_min_ , I_MIN);
316
+ ASSERT_EQ (gains.u_max_ , U_MAX);
317
+ ASSERT_EQ (gains.u_min_ , U_MIN);
318
+ ASSERT_EQ (gains.trk_tc_ , TRK_TC);
319
+ ASSERT_TRUE (gains.saturation_ );
258
320
ASSERT_EQ (gains.antiwindup_ , ANTIWINDUP);
321
+ ASSERT_EQ (gains.antiwindup_strat_ , " none" );
259
322
}
260
323
261
324
TEST (PidParametersTest, SetBadParametersTest)
@@ -271,9 +334,17 @@ TEST(PidParametersTest, SetBadParametersTest)
271
334
const double I_MIN = -10.0 ;
272
335
const double I_MAX_BAD = -20.0 ;
273
336
const double I_MIN_BAD = 20.0 ;
337
+ const double U_MAX = 10.0 ;
338
+ const double U_MIN = -10.0 ;
339
+ const double U_MAX_BAD = -20.0 ;
340
+ const double U_MIN_BAD = 20.0 ;
341
+ const double TRK_TC = 4.0 ;
342
+ const bool SATURATION = true ;
274
343
const bool ANTIWINDUP = true ;
344
+ const std::string ANTIWINDUP_STRAT = " none" ;
275
345
276
- pid.initialize_from_args (P, I, D, I_MAX, I_MIN, ANTIWINDUP);
346
+ pid.initialize_from_args (P, I, D, I_MAX, I_MIN, U_MAX, U_MIN, TRK_TC, SATURATION,
347
+ ANTIWINDUP, ANTIWINDUP_STRAT, false );
277
348
278
349
rcl_interfaces::msg::SetParametersResult set_result;
279
350
@@ -292,8 +363,20 @@ TEST(PidParametersTest, SetBadParametersTest)
292
363
ASSERT_TRUE (set_result.successful );
293
364
ASSERT_NO_THROW (set_result = node->set_parameter (rclcpp::Parameter (" i_clamp_min" , I_MIN_BAD)));
294
365
ASSERT_TRUE (set_result.successful );
366
+ ASSERT_NO_THROW (set_result = node->set_parameter (rclcpp::Parameter (" u_clamp_max" , U_MAX_BAD)));
367
+ ASSERT_TRUE (set_result.successful );
368
+ ASSERT_NO_THROW (set_result = node->set_parameter (rclcpp::Parameter (" u_clamp_min" , U_MIN_BAD)));
369
+ ASSERT_TRUE (set_result.successful );
370
+ ASSERT_NO_THROW (set_result = node->set_parameter (rclcpp::Parameter (
371
+ " tracking_time_constant" , TRK_TC)));
372
+ ASSERT_TRUE (set_result.successful );
373
+ ASSERT_NO_THROW (set_result = node->set_parameter (rclcpp::Parameter (" saturation" , SATURATION)));
374
+ ASSERT_TRUE (set_result.successful );
295
375
ASSERT_NO_THROW (set_result = node->set_parameter (rclcpp::Parameter (" antiwindup" , ANTIWINDUP)));
296
376
ASSERT_TRUE (set_result.successful );
377
+ ASSERT_NO_THROW (set_result = node->set_parameter (rclcpp::Parameter (
378
+ " antiwindup_strategy" , ANTIWINDUP_STRAT)));
379
+ ASSERT_TRUE (set_result.successful );
297
380
298
381
// process callbacks
299
382
rclcpp::spin_some (node->get_node_base_interface ());
@@ -305,7 +388,12 @@ TEST(PidParametersTest, SetBadParametersTest)
305
388
ASSERT_EQ (gains.d_gain_ , D);
306
389
ASSERT_EQ (gains.i_max_ , I_MAX);
307
390
ASSERT_EQ (gains.i_min_ , I_MIN);
391
+ ASSERT_EQ (gains.u_max_ , U_MAX);
392
+ ASSERT_EQ (gains.u_min_ , U_MIN);
393
+ ASSERT_EQ (gains.trk_tc_ , TRK_TC);
394
+ ASSERT_TRUE (gains.saturation_ );
308
395
ASSERT_EQ (gains.antiwindup_ , ANTIWINDUP);
396
+ ASSERT_EQ (gains.antiwindup_strat_ , " none" );
309
397
}
310
398
311
399
TEST (PidParametersTest, GetParametersTest)
@@ -319,10 +407,16 @@ TEST(PidParametersTest, GetParametersTest)
319
407
const double D = 3.0 ;
320
408
const double I_MAX = 10.0 ;
321
409
const double I_MIN = -10.0 ;
410
+ const double U_MAX = 10.0 ;
411
+ const double U_MIN = -10.0 ;
412
+ const double TRK_TC = 4.0 ;
413
+ const bool SATURATION = true ;
322
414
const bool ANTIWINDUP = true ;
415
+ const std::string ANTIWINDUP_STRAT = " none" ;
323
416
324
- pid.initialize_from_args (0.0 , 0.0 , 0.0 , 0.0 , 0.0 , false , false );
325
- pid.set_gains (P, I, D, I_MAX, I_MIN, ANTIWINDUP);
417
+ pid.initialize_from_args (0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , false , false , " none" , false );
418
+ pid.set_gains (P, I, D, I_MAX, I_MIN, U_MAX, U_MIN, TRK_TC, SATURATION,
419
+ ANTIWINDUP, ANTIWINDUP_STRAT);
326
420
327
421
rclcpp::Parameter param;
328
422
@@ -341,9 +435,24 @@ TEST(PidParametersTest, GetParametersTest)
341
435
ASSERT_TRUE (node->get_parameter (" i_clamp_min" , param));
342
436
ASSERT_EQ (param.get_value <double >(), I_MIN);
343
437
438
+ ASSERT_TRUE (node->get_parameter (" u_clamp_max" , param));
439
+ ASSERT_EQ (param.get_value <double >(), U_MAX);
440
+
441
+ ASSERT_TRUE (node->get_parameter (" u_clamp_min" , param));
442
+ ASSERT_EQ (param.get_value <double >(), U_MIN);
443
+
444
+ ASSERT_TRUE (node->get_parameter (" tracking_time_constant" , param));
445
+ ASSERT_EQ (param.get_value <double >(), TRK_TC);
446
+
447
+ ASSERT_TRUE (node->get_parameter (" saturation" , param));
448
+ ASSERT_EQ (param.get_value <bool >(), SATURATION);
449
+
344
450
ASSERT_TRUE (node->get_parameter (" antiwindup" , param));
345
451
ASSERT_EQ (param.get_value <bool >(), ANTIWINDUP);
346
452
453
+ ASSERT_TRUE (node->get_parameter (" antiwindup_strategy" , param));
454
+ ASSERT_EQ (param.get_value <std::string>(), ANTIWINDUP_STRAT);
455
+
347
456
ASSERT_TRUE (node->get_parameter (" save_i_term" , param));
348
457
ASSERT_EQ (param.get_value <bool >(), false );
349
458
}
@@ -375,6 +484,18 @@ TEST(PidParametersTest, GetParametersFromParams)
375
484
rclcpp::Parameter param_i_clamp_min;
376
485
ASSERT_TRUE (node->get_parameter (" i_clamp_min" , param_i_clamp_min));
377
486
ASSERT_TRUE (std::isnan (param_i_clamp_min.get_value <double >()));
487
+
488
+ rclcpp::Parameter param_u_clamp_max;
489
+ ASSERT_TRUE (node->get_parameter (" u_clamp_max" , param_u_clamp_max));
490
+ ASSERT_TRUE (std::isnan (param_u_clamp_max.get_value <double >()));
491
+
492
+ rclcpp::Parameter param_u_clamp_min;
493
+ ASSERT_TRUE (node->get_parameter (" u_clamp_min" , param_u_clamp_min));
494
+ ASSERT_TRUE (std::isnan (param_u_clamp_min.get_value <double >()));
495
+
496
+ rclcpp::Parameter param_tracking_time_constant;
497
+ ASSERT_TRUE (node->get_parameter (" tracking_time_constant" , param_tracking_time_constant));
498
+ ASSERT_TRUE (std::isnan (param_tracking_time_constant.get_value <double >()));
378
499
}
379
500
380
501
TEST (PidParametersTest, MultiplePidInstances)
@@ -389,9 +510,14 @@ TEST(PidParametersTest, MultiplePidInstances)
389
510
const double D = 3.0 ;
390
511
const double I_MAX = 10.0 ;
391
512
const double I_MIN = -10.0 ;
392
-
393
- ASSERT_NO_THROW (pid_1.initialize_from_args (P, I, D, I_MAX, I_MIN, false , false ));
394
- ASSERT_NO_THROW (pid_2.initialize_from_args (P, I, D, I_MAX, I_MIN, true , false ));
513
+ const double U_MAX = 10.0 ;
514
+ const double U_MIN = -10.0 ;
515
+ const double TRK_TC = 4.0 ;
516
+
517
+ ASSERT_NO_THROW (pid_1.initialize_from_args (P, I, D, I_MAX, I_MIN, U_MAX, U_MIN, TRK_TC, false ,
518
+ false , " none" , false ));
519
+ ASSERT_NO_THROW (pid_2.initialize_from_args (P, I, D, I_MAX, I_MIN, U_MAX, U_MIN, TRK_TC, true ,
520
+ true , " none" , false ));
395
521
396
522
rclcpp::Parameter param_1, param_2;
397
523
ASSERT_TRUE (node->get_parameter (" PID_1.p" , param_1));
0 commit comments