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