From 6a17099f487ed0f45427f75fcd71dc6cf82d982e Mon Sep 17 00:00:00 2001 From: Yannick de Hoop Date: Wed, 19 Mar 2025 12:00:51 +0100 Subject: [PATCH 1/9] feat: Add user callback --- .../jinja_templates/cpp/parameter_library_header | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/cpp/parameter_library_header b/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/cpp/parameter_library_header index 179d506..d150d62 100644 --- a/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/cpp/parameter_library_header +++ b/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/cpp/parameter_library_header @@ -182,6 +182,9 @@ struct StackParams { {%- endif %} updated_params.__stamp = clock_.now(); update_internal_params(updated_params); + if (user_callback_) { + user_callback_(updated_params); + } return rsl::to_parameter_result_msg({}); } @@ -208,6 +211,15 @@ struct StackParams { update_internal_params(updated_params); } + using UserCallbackType = std::function; + void setUserCallback(const UserCallbackType& callback){ + user_callback_ = callback; + } + + void clearUserCallback(){ + user_callback_ = {}; + } + private: void update_internal_params(Params updated_params) { std::lock_guard lock(mutex_); @@ -219,6 +231,7 @@ struct StackParams { rclcpp::Clock clock_; std::shared_ptr handle_; std::shared_ptr parameters_interface_; + UserCallbackType user_callback_; // rclcpp::Logger cannot be default-constructed // so we must provide a initialization here even though From 282a2d887e8bb007f808bf8f5d1747f6b846b01c Mon Sep 17 00:00:00 2001 From: Yannick de Hoop Date: Wed, 19 Mar 2025 13:43:25 +0100 Subject: [PATCH 2/9] Update READMR --- README.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/README.md b/README.md index b61a2a7..3b6c0e5 100644 --- a/README.md +++ b/README.md @@ -422,6 +422,11 @@ if (param_listener->is_old(params_)) { } ``` +Another option is to bind a callback function. This Callback will be fired whenever a parameter is updated. When the callback is fired the update params will be given as argument. +```c++ +parameter_listener.setUserCallback(std::bind(&reconfigureCallback, this, std::placeholders::_1)); +``` + ### Parameter documentation 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. From 2e9de1f00fe9d1b7e262c0ce89a557923fa5f58f Mon Sep 17 00:00:00 2001 From: Yannick de Hoop Date: Wed, 19 Mar 2025 13:46:54 +0100 Subject: [PATCH 3/9] Update --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 3b6c0e5..38e8503 100644 --- a/README.md +++ b/README.md @@ -422,7 +422,7 @@ if (param_listener->is_old(params_)) { } ``` -Another option is to bind a callback function. This Callback will be fired whenever a parameter is updated. When the callback is fired the update params will be given as argument. +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. ```c++ parameter_listener.setUserCallback(std::bind(&reconfigureCallback, this, std::placeholders::_1)); ``` From 8ea61ae4a4d58be0f08938dd03bf2fe58c3ef262 Mon Sep 17 00:00:00 2001 From: Yannick de Hoop Date: Wed, 19 Mar 2025 14:32:22 +0100 Subject: [PATCH 4/9] add example --- .../minimal_publisher.hpp | 1 + example/src/minimal_publisher.cpp | 7 +++++++ 2 files changed, 8 insertions(+) diff --git a/example/include/generate_parameter_library_example/minimal_publisher.hpp b/example/include/generate_parameter_library_example/minimal_publisher.hpp index 9a002b7..10fef02 100644 --- a/example/include/generate_parameter_library_example/minimal_publisher.hpp +++ b/example/include/generate_parameter_library_example/minimal_publisher.hpp @@ -41,6 +41,7 @@ class MinimalPublisher : public rclcpp::Node { private: void timer_callback(); + void reconfigure_callback(const admittance_controller::Params& params); rclcpp::TimerBase::SharedPtr timer_; std::shared_ptr param_listener_; diff --git a/example/src/minimal_publisher.cpp b/example/src/minimal_publisher.cpp index 62cdaa4..964b693 100644 --- a/example/src/minimal_publisher.cpp +++ b/example/src/minimal_publisher.cpp @@ -42,6 +42,8 @@ MinimalPublisher::MinimalPublisher(const rclcpp::NodeOptions& options) 500ms, std::bind(&MinimalPublisher::timer_callback, this)); param_listener_ = std::make_shared(get_node_parameters_interface()); + param_listener_->setUserCallback( + std::bind(&MinimalPublisher::reconfigure_callback, this, std::placeholders::_1)); params_ = param_listener_->get_params(); [[maybe_unused]] StackParams s_params = param_listener_->get_stack_params(); @@ -71,4 +73,9 @@ void MinimalPublisher::timer_callback() { } } +void MinimalPublisher::reconfigure_callback(const admittance_controller::Params& params) +{ + RCLCPP_INFO(get_logger(), "Reconfigure callback fired!"); +} + } // namespace admittance_controller From d45c13674ff1d2cbaabeb013919630e24aa575d3 Mon Sep 17 00:00:00 2001 From: Yannick de Hoop Date: Tue, 25 Mar 2025 08:28:57 +0100 Subject: [PATCH 5/9] format --- example/src/minimal_publisher.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/example/src/minimal_publisher.cpp b/example/src/minimal_publisher.cpp index 964b693..0085e6b 100644 --- a/example/src/minimal_publisher.cpp +++ b/example/src/minimal_publisher.cpp @@ -42,8 +42,8 @@ MinimalPublisher::MinimalPublisher(const rclcpp::NodeOptions& options) 500ms, std::bind(&MinimalPublisher::timer_callback, this)); param_listener_ = std::make_shared(get_node_parameters_interface()); - param_listener_->setUserCallback( - std::bind(&MinimalPublisher::reconfigure_callback, this, std::placeholders::_1)); + param_listener_->setUserCallback(std::bind( + &MinimalPublisher::reconfigure_callback, this, std::placeholders::_1)); params_ = param_listener_->get_params(); [[maybe_unused]] StackParams s_params = param_listener_->get_stack_params(); @@ -73,8 +73,8 @@ void MinimalPublisher::timer_callback() { } } -void MinimalPublisher::reconfigure_callback(const admittance_controller::Params& params) -{ +void MinimalPublisher::reconfigure_callback( + const admittance_controller::Params& params) { RCLCPP_INFO(get_logger(), "Reconfigure callback fired!"); } From d123cb25e998bd6343cad65fffe77917c93d52ab Mon Sep 17 00:00:00 2001 From: Yannick de Hoop Date: Tue, 25 Mar 2025 16:24:14 +0100 Subject: [PATCH 6/9] Use lambda instead of std::bind --- example/src/minimal_publisher.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/example/src/minimal_publisher.cpp b/example/src/minimal_publisher.cpp index 0085e6b..95b7862 100644 --- a/example/src/minimal_publisher.cpp +++ b/example/src/minimal_publisher.cpp @@ -42,8 +42,8 @@ MinimalPublisher::MinimalPublisher(const rclcpp::NodeOptions& options) 500ms, std::bind(&MinimalPublisher::timer_callback, this)); param_listener_ = std::make_shared(get_node_parameters_interface()); - param_listener_->setUserCallback(std::bind( - &MinimalPublisher::reconfigure_callback, this, std::placeholders::_1)); + param_listener_->setUserCallback( + [this](const auto& params) { reconfigure_callback(params); }); params_ = param_listener_->get_params(); [[maybe_unused]] StackParams s_params = param_listener_->get_stack_params(); From 3c09e1edd97e3a3a45f8b3bb4bbb44e248e2c7e3 Mon Sep 17 00:00:00 2001 From: Yannick de Hoop Date: Wed, 26 Mar 2025 10:53:41 +0100 Subject: [PATCH 7/9] fix readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 38e8503..6a2fc99 100644 --- a/README.md +++ b/README.md @@ -424,7 +424,7 @@ if (param_listener->is_old(params_)) { 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. ```c++ -parameter_listener.setUserCallback(std::bind(&reconfigureCallback, this, std::placeholders::_1)); +parameter_listener.setUserCallback([this](const auto& params) { reconfigure_callback(params); }); ``` ### Parameter documentation From cba0e6e90f4f58615ca541a23db9119716333d5b Mon Sep 17 00:00:00 2001 From: Yannick de Hoop Date: Tue, 3 Jun 2025 09:15:50 +0200 Subject: [PATCH 8/9] resolve comments --- example/src/minimal_publisher.cpp | 8 ++++++++ .../jinja_templates/cpp/parameter_library_header | 6 +++--- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/example/src/minimal_publisher.cpp b/example/src/minimal_publisher.cpp index 95b7862..acc63e1 100644 --- a/example/src/minimal_publisher.cpp +++ b/example/src/minimal_publisher.cpp @@ -76,6 +76,14 @@ void MinimalPublisher::timer_callback() { void MinimalPublisher::reconfigure_callback( const admittance_controller::Params& params) { RCLCPP_INFO(get_logger(), "Reconfigure callback fired!"); + RCLCPP_INFO(get_logger(), "New control frame parameter is: '%s'", + params.control.frame.id.c_str()); + RCLCPP_INFO(get_logger(), "fixed string is: '%s'", + std::string{params.fixed_string}.c_str()); + const auto fixed_array = params.fixed_array; + for (auto d : fixed_array) { + RCLCPP_INFO(get_logger(), "value: '%s'", std::to_string(d).c_str()); + } } } // namespace admittance_controller diff --git a/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/cpp/parameter_library_header b/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/cpp/parameter_library_header index d150d62..74509c6 100644 --- a/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/cpp/parameter_library_header +++ b/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/cpp/parameter_library_header @@ -211,8 +211,8 @@ struct StackParams { update_internal_params(updated_params); } - using UserCallbackType = std::function; - void setUserCallback(const UserCallbackType& callback){ + using userParameterUpdateCB = std::function; + void setUserCallback(const userParameterUpdateCB& callback){ user_callback_ = callback; } @@ -231,7 +231,7 @@ struct StackParams { rclcpp::Clock clock_; std::shared_ptr handle_; std::shared_ptr parameters_interface_; - UserCallbackType user_callback_; + userParameterUpdateCB user_callback_; // rclcpp::Logger cannot be default-constructed // so we must provide a initialization here even though From 9dfc47d159a142ffbfd714b2c77df0a8893edae7 Mon Sep 17 00:00:00 2001 From: Yannick de Hoop Date: Thu, 5 Jun 2025 13:06:20 +0200 Subject: [PATCH 9/9] Run pre-commit --- example/src/minimal_publisher.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/example/src/minimal_publisher.cpp b/example/src/minimal_publisher.cpp index acc63e1..be9f571 100644 --- a/example/src/minimal_publisher.cpp +++ b/example/src/minimal_publisher.cpp @@ -77,7 +77,7 @@ void MinimalPublisher::reconfigure_callback( const admittance_controller::Params& params) { RCLCPP_INFO(get_logger(), "Reconfigure callback fired!"); RCLCPP_INFO(get_logger(), "New control frame parameter is: '%s'", - params.control.frame.id.c_str()); + params.control.frame.id.c_str()); RCLCPP_INFO(get_logger(), "fixed string is: '%s'", std::string{params.fixed_string}.c_str()); const auto fixed_array = params.fixed_array;