Skip to content

Commit 89a9a13

Browse files
Feat: add user callback (#250)
1 parent 7735ac9 commit 89a9a13

File tree

4 files changed

+34
-0
lines changed

4 files changed

+34
-0
lines changed

README.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -422,6 +422,11 @@ if (param_listener->is_old(params_)) {
422422
}
423423
```
424424

425+
Alternatively, you can bind a callback function that triggers whenever a parameter is updated. When activated, the callback receives the updated parameters as an argument.
426+
```c++
427+
parameter_listener.setUserCallback([this](const auto& params) { reconfigure_callback(params); });
428+
```
429+
425430
### Parameter documentation
426431

427432
In some cases, parameters might be unknown only at compile-time, and cannot be part of the generated C++ code. However, for documentation purpose of such parameters, the type `none` was introduced.

example/include/generate_parameter_library_example/minimal_publisher.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ class MinimalPublisher : public rclcpp::Node {
4141

4242
private:
4343
void timer_callback();
44+
void reconfigure_callback(const admittance_controller::Params& params);
4445

4546
rclcpp::TimerBase::SharedPtr timer_;
4647
std::shared_ptr<admittance_controller::ParamListener> param_listener_;

example/src/minimal_publisher.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,8 @@ MinimalPublisher::MinimalPublisher(const rclcpp::NodeOptions& options)
4242
500ms, std::bind(&MinimalPublisher::timer_callback, this));
4343
param_listener_ =
4444
std::make_shared<ParamListener>(get_node_parameters_interface());
45+
param_listener_->setUserCallback(
46+
[this](const auto& params) { reconfigure_callback(params); });
4547
params_ = param_listener_->get_params();
4648

4749
[[maybe_unused]] StackParams s_params = param_listener_->get_stack_params();
@@ -71,4 +73,17 @@ void MinimalPublisher::timer_callback() {
7173
}
7274
}
7375

76+
void MinimalPublisher::reconfigure_callback(
77+
const admittance_controller::Params& params) {
78+
RCLCPP_INFO(get_logger(), "Reconfigure callback fired!");
79+
RCLCPP_INFO(get_logger(), "New control frame parameter is: '%s'",
80+
params.control.frame.id.c_str());
81+
RCLCPP_INFO(get_logger(), "fixed string is: '%s'",
82+
std::string{params.fixed_string}.c_str());
83+
const auto fixed_array = params.fixed_array;
84+
for (auto d : fixed_array) {
85+
RCLCPP_INFO(get_logger(), "value: '%s'", std::to_string(d).c_str());
86+
}
87+
}
88+
7489
} // namespace admittance_controller

generate_parameter_library_py/generate_parameter_library_py/jinja_templates/cpp/parameter_library_header

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,9 @@ struct StackParams {
182182
{%- endif %}
183183
updated_params.__stamp = clock_.now();
184184
update_internal_params(updated_params);
185+
if (user_callback_) {
186+
user_callback_(updated_params);
187+
}
185188
return rsl::to_parameter_result_msg({});
186189
}
187190

@@ -208,6 +211,15 @@ struct StackParams {
208211
update_internal_params(updated_params);
209212
}
210213

214+
using userParameterUpdateCB = std::function<void(const Params&)>;
215+
void setUserCallback(const userParameterUpdateCB& callback){
216+
user_callback_ = callback;
217+
}
218+
219+
void clearUserCallback(){
220+
user_callback_ = {};
221+
}
222+
211223
private:
212224
void update_internal_params(Params updated_params) {
213225
std::lock_guard<std::mutex> lock(mutex_);
@@ -219,6 +231,7 @@ struct StackParams {
219231
rclcpp::Clock clock_;
220232
std::shared_ptr<rclcpp::node_interfaces::OnSetParametersCallbackHandle> handle_;
221233
std::shared_ptr<rclcpp::node_interfaces::NodeParametersInterface> parameters_interface_;
234+
userParameterUpdateCB user_callback_;
222235

223236
// rclcpp::Logger cannot be default-constructed
224237
// so we must provide a initialization here even though

0 commit comments

Comments
 (0)