@@ -44,15 +44,33 @@ namespace control_toolbox
44
44
45
45
void PidROS::initialize (std::string topic_prefix)
46
46
{
47
- if (topic_prefix.back () != ' .' && !topic_prefix.empty ()) {
48
- topic_prefix_ = topic_prefix + " ." ;
49
- } else {
50
- topic_prefix_ = topic_prefix;
47
+ param_prefix_ = topic_prefix;
48
+ // If it starts with a "~", remove it
49
+ if (param_prefix_.compare (0 , 1 , " ~" ) == 0 ) {
50
+ param_prefix_.erase (0 , 1 );
51
+ }
52
+ // If it starts with a "/" or a "~/", remove those as well
53
+ if (param_prefix_.compare (0 , 1 , " /" ) == 0 ) {
54
+ param_prefix_.erase (0 , 1 );
55
+ }
56
+ // Replace namespacing separator from "/" to "." in parameters
57
+ std::replace (param_prefix_.begin (), param_prefix_.end (), ' /' , ' .' );
58
+ // Add a trailing "."
59
+ if (!param_prefix_.empty () && param_prefix_.back () != ' .' ) {
60
+ param_prefix_.append (" ." );
61
+ }
62
+
63
+ topic_prefix_ = topic_prefix;
64
+ // Replace parameter separator from "." to "/" in topics
65
+ std::replace (topic_prefix_.begin (), topic_prefix_.end (), ' .' , ' /' );
66
+ // Add a trailing "/"
67
+ if (!topic_prefix_.empty () && topic_prefix_.back () != ' /' ) {
68
+ topic_prefix_.append (" /" );
51
69
}
52
70
53
71
state_pub_ = rclcpp::create_publisher<control_msgs::msg::PidState>(
54
72
topics_interface_,
55
- topic_prefix + " / pid_state" ,
73
+ topic_prefix_ + " pid_state" ,
56
74
rclcpp::SensorDataQoS ());
57
75
rt_state_pub_.reset (
58
76
new realtime_tools::RealtimePublisher<control_msgs::msg::PidState>(state_pub_));
@@ -111,13 +129,13 @@ PidROS::initPid()
111
129
double p, i, d, i_min, i_max;
112
130
bool antiwindup = false ;
113
131
bool all_params_available = true ;
114
- all_params_available &= getDoubleParam (topic_prefix_ + " p" , p);
115
- all_params_available &= getDoubleParam (topic_prefix_ + " i" , i);
116
- all_params_available &= getDoubleParam (topic_prefix_ + " d" , d);
117
- all_params_available &= getDoubleParam (topic_prefix_ + " i_clamp_max" , i_max);
118
- all_params_available &= getDoubleParam (topic_prefix_ + " i_clamp_min" , i_min);
132
+ all_params_available &= getDoubleParam (param_prefix_ + " p" , p);
133
+ all_params_available &= getDoubleParam (param_prefix_ + " i" , i);
134
+ all_params_available &= getDoubleParam (param_prefix_ + " d" , d);
135
+ all_params_available &= getDoubleParam (param_prefix_ + " i_clamp_max" , i_max);
136
+ all_params_available &= getDoubleParam (param_prefix_ + " i_clamp_min" , i_min);
119
137
120
- getBooleanParam (topic_prefix_ + " antiwindup" , antiwindup);
138
+ getBooleanParam (param_prefix_ + " antiwindup" , antiwindup);
121
139
122
140
if (all_params_available) {
123
141
setParameterEventCallback ();
@@ -141,12 +159,12 @@ PidROS::initPid(double p, double i, double d, double i_max, double i_min, bool a
141
159
{
142
160
pid_.initPid (p, i, d, i_max, i_min, antiwindup);
143
161
144
- declareParam (topic_prefix_ + " p" , rclcpp::ParameterValue (p));
145
- declareParam (topic_prefix_ + " i" , rclcpp::ParameterValue (i));
146
- declareParam (topic_prefix_ + " d" , rclcpp::ParameterValue (d));
147
- declareParam (topic_prefix_ + " i_clamp_max" , rclcpp::ParameterValue (i_max));
148
- declareParam (topic_prefix_ + " i_clamp_min" , rclcpp::ParameterValue (i_min));
149
- declareParam (topic_prefix_ + " antiwindup" , rclcpp::ParameterValue (antiwindup));
162
+ declareParam (param_prefix_ + " p" , rclcpp::ParameterValue (p));
163
+ declareParam (param_prefix_ + " i" , rclcpp::ParameterValue (i));
164
+ declareParam (param_prefix_ + " d" , rclcpp::ParameterValue (d));
165
+ declareParam (param_prefix_ + " i_clamp_max" , rclcpp::ParameterValue (i_max));
166
+ declareParam (param_prefix_ + " i_clamp_min" , rclcpp::ParameterValue (i_min));
167
+ declareParam (param_prefix_ + " antiwindup" , rclcpp::ParameterValue (antiwindup));
150
168
151
169
setParameterEventCallback ();
152
170
}
@@ -192,12 +210,12 @@ PidROS::setGains(double p, double i, double d, double i_max, double i_min, bool
192
210
{
193
211
node_params_->set_parameters (
194
212
{
195
- rclcpp::Parameter (topic_prefix_ + " p" , p),
196
- rclcpp::Parameter (topic_prefix_ + " i" , i),
197
- rclcpp::Parameter (topic_prefix_ + " d" , d),
198
- rclcpp::Parameter (topic_prefix_ + " i_clamp_max" , i_max),
199
- rclcpp::Parameter (topic_prefix_ + " i_clamp_min" , i_min),
200
- rclcpp::Parameter (topic_prefix_ + " antiwindup" , antiwindup)
213
+ rclcpp::Parameter (param_prefix_ + " p" , p),
214
+ rclcpp::Parameter (param_prefix_ + " i" , i),
215
+ rclcpp::Parameter (param_prefix_ + " d" , d),
216
+ rclcpp::Parameter (param_prefix_ + " i_clamp_max" , i_max),
217
+ rclcpp::Parameter (param_prefix_ + " i_clamp_min" , i_min),
218
+ rclcpp::Parameter (param_prefix_ + " antiwindup" , antiwindup)
201
219
}
202
220
);
203
221
@@ -294,40 +312,45 @@ PidROS::setParameterEventCallback()
294
312
295
313
// / @note don't use getGains, it's rt
296
314
Pid::Gains gains = pid_.getGains ();
315
+ bool changed = false ;
297
316
298
317
for (auto & parameter : parameters) {
299
318
const std::string param_name = parameter.get_name ();
300
319
try {
301
- if (param_name == topic_prefix_ + " p" ) {
320
+ if (param_name == param_prefix_ + " p" ) {
302
321
gains.p_gain_ = parameter.get_value <double >();
303
- } else if (param_name == topic_prefix_ + " i" ) {
322
+ changed = true ;
323
+ } else if (param_name == param_prefix_ + " i" ) {
304
324
gains.i_gain_ = parameter.get_value <double >();
305
- } else if (param_name == topic_prefix_ + " d" ) {
325
+ changed = true ;
326
+ } else if (param_name == param_prefix_ + " d" ) {
306
327
gains.d_gain_ = parameter.get_value <double >();
307
- } else if (param_name == topic_prefix_ + " i_clamp_max" ) {
328
+ changed = true ;
329
+ } else if (param_name == param_prefix_ + " i_clamp_max" ) {
308
330
gains.i_max_ = parameter.get_value <double >();
309
- } else if (param_name == topic_prefix_ + " i_clamp_min" ) {
331
+ changed = true ;
332
+ } else if (param_name == param_prefix_ + " i_clamp_min" ) {
310
333
gains.i_min_ = parameter.get_value <double >();
311
- } else if (param_name == topic_prefix_ + " antiwindup" ) {
334
+ changed = true ;
335
+ } else if (param_name == param_prefix_ + " antiwindup" ) {
312
336
gains.antiwindup_ = parameter.get_value <bool >();
313
- } else {
314
- result.successful = false ;
315
- result.reason = " Invalid parameter" ;
337
+ changed = true ;
316
338
}
317
339
} catch (const rclcpp::exceptions::InvalidParameterTypeException & e) {
318
340
RCLCPP_INFO_STREAM (
319
341
node_logging_->get_logger (), " Please use the right type: " << e.what ());
320
342
}
321
343
}
322
344
323
- if (result. successful ) {
345
+ if (changed ) {
324
346
// / @note don't call setGains() from inside a callback
325
347
pid_.setGains (gains);
326
348
}
327
349
328
350
return result;
329
351
};
330
-
352
+ // / @note this gets called whenever a parameter changes.
353
+ // / Any parameter under that node. Not just PidROS.
331
354
parameter_callback_ =
332
355
node_params_->add_on_set_parameters_callback (
333
356
on_parameter_event_callback);
0 commit comments