From 2014c5763fe4ae8fc6e66a0a8eb2fba88e8ae075 Mon Sep 17 00:00:00 2001 From: nibanovic Date: Fri, 17 Jul 2026 14:30:51 +0200 Subject: [PATCH 1/2] add missing controller async parameter declarations --- controller_interface/src/controller_interface_base.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/controller_interface/src/controller_interface_base.cpp b/controller_interface/src/controller_interface_base.cpp index 43ee52ee32..722cbb61d5 100644 --- a/controller_interface/src/controller_interface_base.cpp +++ b/controller_interface/src/controller_interface_base.cpp @@ -100,6 +100,13 @@ return_type ControllerInterfaceBase::init( auto_declare("update_rate", static_cast(params.controller_manager_update_rate)); auto_declare("is_async", false); auto_declare("thread_priority", -100); + + auto_declare("async_parameters.thread_priority", 50); + auto_declare("async_parameters.scheduling_policy", "synchronized"); + auto_declare>("async_parameters.cpu_affinity", std::vector()); + auto_declare("async_parameters.execution_rate", impl_->ctrl_itf_params_.update_rate); + auto_declare("async_parameters.wait_until_initial_trigger", true); + auto_declare("async_parameters.print_warnings", true); } catch (const std::exception & e) { From 8b8b7df33ac23ac3abd1dd67988a64feb19b1d9e Mon Sep 17 00:00:00 2001 From: nibanovic Date: Fri, 17 Jul 2026 15:16:38 +0200 Subject: [PATCH 2/2] async thread name: By default component name, truncated to 15 chars --- controller_interface/src/controller_interface_base.cpp | 5 +++++ .../include/hardware_interface/hardware_info.hpp | 2 ++ hardware_interface/src/component_parser.cpp | 6 ++++++ hardware_interface/src/hardware_component_interface.cpp | 5 +++++ 4 files changed, 18 insertions(+) diff --git a/controller_interface/src/controller_interface_base.cpp b/controller_interface/src/controller_interface_base.cpp index 722cbb61d5..398738e642 100644 --- a/controller_interface/src/controller_interface_base.cpp +++ b/controller_interface/src/controller_interface_base.cpp @@ -107,6 +107,8 @@ return_type ControllerInterfaceBase::init( auto_declare("async_parameters.execution_rate", impl_->ctrl_itf_params_.update_rate); auto_declare("async_parameters.wait_until_initial_trigger", true); auto_declare("async_parameters.print_warnings", true); + auto_declare("async_parameters.thread_name", ""); + } catch (const std::exception & e) { @@ -265,6 +267,9 @@ const rclcpp_lifecycle::State & ControllerInterfaceBase::configure() "instead."); } async_params.initialize(impl_->node_, "async_parameters."); + if (async_params.thread_name.empty()) { + async_params.thread_name = get_node()->get_name(); + } if (async_params.scheduling_policy == realtime_tools::AsyncSchedulingPolicy::DETACHED) { RCLCPP_ERROR( diff --git a/hardware_interface/include/hardware_interface/hardware_info.hpp b/hardware_interface/include/hardware_interface/hardware_info.hpp index 8484754dca..414a1a5526 100644 --- a/hardware_interface/include/hardware_interface/hardware_info.hpp +++ b/hardware_interface/include/hardware_interface/hardware_info.hpp @@ -358,6 +358,8 @@ struct HardwareAsyncParams std::vector cpu_affinity_cores = {}; /// Whether to print warnings when the async thread doesn't meet its deadline bool print_warnings = true; + /// Custom name for the async worker thread + std::string thread_name = ""; }; /// This structure stores information about hardware defined in a robot's URDF. diff --git a/hardware_interface/src/component_parser.cpp b/hardware_interface/src/component_parser.cpp index 5a7d486905..0d408e0f25 100644 --- a/hardware_interface/src/component_parser.cpp +++ b/hardware_interface/src/component_parser.cpp @@ -76,6 +76,7 @@ constexpr const auto kThreadPriorityAttribute = "thread_priority"; constexpr const auto kAffinityCoresAttribute = "affinity"; constexpr const auto kSchedulingPolicyAttribute = "scheduling_policy"; constexpr const auto kPrintWarningsAttribute = "print_warnings"; +constexpr const auto kThreadNameAttribute = "thread_name"; } // namespace @@ -766,6 +767,11 @@ HardwareInfo parse_resource_from_xml( hardware.async_params.scheduling_policy = to_lower_case(get_attribute_value(async_it, kSchedulingPolicyAttribute, kAsyncTag)); } + if (async_it->FindAttribute(kThreadNameAttribute)) + { + hardware.async_params.thread_name = + get_attribute_value(async_it, kThreadNameAttribute, kAsyncTag); + } if (async_it->FindAttribute(kThreadPriorityAttribute)) { hardware.async_params.thread_priority = parse_thread_priority_attribute(async_it); diff --git a/hardware_interface/src/hardware_component_interface.cpp b/hardware_interface/src/hardware_component_interface.cpp index 26a845d6d8..3cbfa19c59 100644 --- a/hardware_interface/src/hardware_component_interface.cpp +++ b/hardware_interface/src/hardware_component_interface.cpp @@ -81,6 +81,11 @@ CallbackReturn HardwareComponentInterface::init( async_thread_params.logger = get_logger(); async_thread_params.exec_rate = params.hardware_info.rw_rate; async_thread_params.print_warnings = info_.async_params.print_warnings; + if (!info_.async_params.thread_name.empty()) { + async_thread_params.thread_name = info_.async_params.thread_name; + } else { + async_thread_params.thread_name = info_.name; + } RCLCPP_INFO( get_logger(), "Starting async handler with scheduler priority: %d and policy : %s", info_.async_params.thread_priority,