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