Skip to content

Commit 8c52010

Browse files
authored
Shift to Struct based Method and Constructors, with Executor passed from CM to on_init() (ros-controls#2323)
1 parent 4d3362d commit 8c52010

File tree

15 files changed

+566
-72
lines changed

15 files changed

+566
-72
lines changed

controller_manager/src/controller_manager.cpp

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -410,8 +410,14 @@ ControllerManager::ControllerManager(
410410
robot_description_(urdf)
411411
{
412412
initialize_parameters();
413-
resource_manager_ = std::make_unique<hardware_interface::ResourceManager>(
414-
urdf, trigger_clock_, this->get_logger(), activate_all_hw_components, params_->update_rate);
413+
hardware_interface::ResourceManagerParams params;
414+
params.robot_description = urdf;
415+
params.clock = trigger_clock_;
416+
params.logger = this->get_logger();
417+
params.activate_all = activate_all_hw_components;
418+
params.update_rate = static_cast<unsigned int>(params_->update_rate);
419+
params.executor = executor_;
420+
resource_manager_ = std::make_unique<hardware_interface::ResourceManager>(params, true);
415421
init_controller_manager();
416422
}
417423

hardware_interface/include/hardware_interface/actuator.hpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,9 @@ class Actuator final
5252
const rclcpp_lifecycle::State & initialize(
5353
const HardwareInfo & actuator_info, rclcpp::Logger logger, rclcpp::Clock::SharedPtr clock);
5454

55+
const rclcpp_lifecycle::State & initialize(
56+
const hardware_interface::HardwareComponentParams & params);
57+
5558
const rclcpp_lifecycle::State & configure();
5659

5760
const rclcpp_lifecycle::State & cleanup();

hardware_interface/include/hardware_interface/actuator_interface.hpp

Lines changed: 48 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@
2828
#include "hardware_interface/handle.hpp"
2929
#include "hardware_interface/hardware_info.hpp"
3030
#include "hardware_interface/introspection.hpp"
31+
#include "hardware_interface/types/hardware_component_interface_params.hpp"
32+
#include "hardware_interface/types/hardware_component_params.hpp"
3133
#include "hardware_interface/types/hardware_interface_return_values.hpp"
3234
#include "hardware_interface/types/lifecycle_state_names.hpp"
3335
#include "hardware_interface/types/trigger_type.hpp"
@@ -124,9 +126,32 @@ class ActuatorInterface : public rclcpp_lifecycle::node_interfaces::LifecycleNod
124126
CallbackReturn init(
125127
const HardwareInfo & hardware_info, rclcpp::Logger logger, rclcpp::Clock::SharedPtr clock)
126128
{
127-
actuator_clock_ = clock;
128-
actuator_logger_ = logger.get_child("hardware_component.actuator." + hardware_info.name);
129-
info_ = hardware_info;
129+
hardware_interface::HardwareComponentParams params;
130+
params.hardware_info = hardware_info;
131+
params.clock = clock;
132+
params.logger = logger;
133+
return init(params);
134+
};
135+
136+
/// Initialization of the hardware interface from data parsed from the robot's URDF and also the
137+
/// clock and logger interfaces.
138+
/**
139+
* \param[in] params A struct of type HardwareComponentParams containing all necessary
140+
* parameters for initializing this specific hardware component,
141+
* including its HardwareInfo, a dedicated logger, a clock, and a
142+
* weak_ptr to the executor.
143+
* \warning The parsed executor should not be used to call `cancel()` or use blocking callbacks
144+
* such as `spin()`.
145+
* \returns CallbackReturn::SUCCESS if required data are provided and can be parsed.
146+
* \returns CallbackReturn::ERROR if any error happens or data are missing.
147+
*/
148+
CallbackReturn init(const hardware_interface::HardwareComponentParams & params)
149+
{
150+
actuator_clock_ = params.clock;
151+
auto logger_copy = params.logger;
152+
actuator_logger_ =
153+
logger_copy.get_child("hardware_component.actuator." + params.hardware_info.name);
154+
info_ = params.hardware_info;
130155
if (info_.is_async)
131156
{
132157
RCLCPP_INFO_STREAM(
@@ -158,7 +183,10 @@ class ActuatorInterface : public rclcpp_lifecycle::node_interfaces::LifecycleNod
158183
info_.thread_priority);
159184
async_handler_->start_thread();
160185
}
161-
return on_init(hardware_info);
186+
hardware_interface::HardwareComponentInterfaceParams interface_params;
187+
interface_params.hardware_info = info_;
188+
interface_params.executor = params.executor;
189+
return on_init(interface_params);
162190
};
163191

164192
/// Initialization of the hardware interface from data parsed from the robot's URDF.
@@ -175,6 +203,22 @@ class ActuatorInterface : public rclcpp_lifecycle::node_interfaces::LifecycleNod
175203
return CallbackReturn::SUCCESS;
176204
};
177205

206+
/// Initialization of the hardware interface from data parsed from the robot's URDF.
207+
/**
208+
* \param[in] params A struct of type hardware_interface::HardwareComponentInterfaceParams
209+
* containing all necessary parameters for initializing this specific hardware component,
210+
* specifically its HardwareInfo, and a weak_ptr to the executor.
211+
* \warning The parsed executor should not be used to call `cancel()` or use blocking callbacks
212+
* such as `spin()`.
213+
* \returns CallbackReturn::SUCCESS if required data are provided and can be parsed.
214+
* \returns CallbackReturn::ERROR if any error happens or data are missing.
215+
*/
216+
virtual CallbackReturn on_init(
217+
const hardware_interface::HardwareComponentInterfaceParams & params)
218+
{
219+
return on_init(params.hardware_info);
220+
};
221+
178222
/// Exports all state interfaces for this hardware interface.
179223
/**
180224
* Old way of exporting the StateInterfaces. If a empty vector is returned then

hardware_interface/include/hardware_interface/resource_manager.hpp

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,9 @@
3232
#include "hardware_interface/system.hpp"
3333
#include "hardware_interface/system_interface.hpp"
3434
#include "hardware_interface/types/hardware_interface_return_values.hpp"
35+
#include "hardware_interface/types/resource_manager_params.hpp"
3536
#include "rclcpp/duration.hpp"
37+
#include "rclcpp/executor.hpp"
3638
#include "rclcpp/node_interfaces/node_logging_interface.hpp"
3739
#include "rclcpp/time.hpp"
3840

@@ -98,6 +100,19 @@ class ResourceManager
98100
const std::string & urdf, rclcpp::Clock::SharedPtr clock, rclcpp::Logger logger,
99101
bool activate_all = false, const unsigned int update_rate = 100);
100102

103+
/// Constructor for the Resource Manager.
104+
/**
105+
* The implementation uses the ResourceManagerParams to load the specified urdf and initializes
106+
* the hardware components listed within as well as populate their respective state and command
107+
* interfaces.
108+
*
109+
* \param[in] params ResourceManagerParams containing the parameters for the ResourceManager.
110+
* \param[in] load boolean argument indicating if the components should be loaded and
111+
* initialized. If false, the ResourceManager will not load any components and will only
112+
* initialize the ResourceManager with the given parameters.
113+
*/
114+
explicit ResourceManager(const hardware_interface::ResourceManagerParams & params, bool load);
115+
101116
ResourceManager(const ResourceManager &) = delete;
102117

103118
virtual ~ResourceManager();
@@ -122,6 +137,19 @@ class ResourceManager
122137
virtual bool load_and_initialize_components(
123138
const std::string & urdf, const unsigned int update_rate = 100);
124139

140+
/// Load resources from on a given URDF.
141+
/**
142+
* The resource manager can be post-initialized with a given URDF.
143+
* This is mainly used in conjunction with the default constructor
144+
* in which the URDF might not be present at first initialization.
145+
*
146+
* \param[in] urdf string containing the URDF.
147+
* \param[in] update_rate update rate of the main control loop, i.e., of the controller manager.
148+
* \returns false if URDF validation has failed.
149+
*/
150+
virtual bool load_and_initialize_components(
151+
const hardware_interface::ResourceManagerParams & params);
152+
125153
/**
126154
* @brief Import joint limiters from the URDF.
127155
* @param urdf string containing the URDF.
@@ -553,6 +581,13 @@ class ResourceManager
553581

554582
void release_command_interface(const std::string & key);
555583

584+
// Note this was added in #2323 and is a temporary addition to be backwards compatible with the
585+
// original constructors. This is planned to be removed in a future PR along with the
586+
// aforementioned constructors.
587+
hardware_interface::ResourceManagerParams constructParams(
588+
rclcpp::Clock::SharedPtr clock, rclcpp::Logger logger, const std::string & urdf = std::string(),
589+
bool activate_all = false, unsigned int update_rate = 100);
590+
556591
std::unordered_map<std::string, bool> claimed_command_interface_map_;
557592

558593
std::unique_ptr<ResourceStorage> resource_storage_;

hardware_interface/include/hardware_interface/sensor.hpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,9 @@ class Sensor final
5252
const rclcpp_lifecycle::State & initialize(
5353
const HardwareInfo & sensor_info, rclcpp::Logger logger, rclcpp::Clock::SharedPtr clock);
5454

55+
const rclcpp_lifecycle::State & initialize(
56+
const hardware_interface::HardwareComponentParams & params);
57+
5558
const rclcpp_lifecycle::State & configure();
5659

5760
const rclcpp_lifecycle::State & cleanup();

hardware_interface/include/hardware_interface/sensor_interface.hpp

Lines changed: 48 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@
2828
#include "hardware_interface/handle.hpp"
2929
#include "hardware_interface/hardware_info.hpp"
3030
#include "hardware_interface/introspection.hpp"
31+
#include "hardware_interface/types/hardware_component_interface_params.hpp"
32+
#include "hardware_interface/types/hardware_component_params.hpp"
3133
#include "hardware_interface/types/hardware_interface_return_values.hpp"
3234
#include "hardware_interface/types/lifecycle_state_names.hpp"
3335
#include "lifecycle_msgs/msg/state.hpp"
@@ -108,9 +110,32 @@ class SensorInterface : public rclcpp_lifecycle::node_interfaces::LifecycleNodeI
108110
CallbackReturn init(
109111
const HardwareInfo & hardware_info, rclcpp::Logger logger, rclcpp::Clock::SharedPtr clock)
110112
{
111-
sensor_clock_ = clock;
112-
sensor_logger_ = logger.get_child("hardware_component.sensor." + hardware_info.name);
113-
info_ = hardware_info;
113+
hardware_interface::HardwareComponentParams params;
114+
params.hardware_info = hardware_info;
115+
params.clock = clock;
116+
params.logger = logger;
117+
return init(params);
118+
};
119+
120+
/// Initialization of the hardware interface from data parsed from the robot's URDF and also the
121+
/// clock and logger interfaces.
122+
/**
123+
* \param[in] params A struct of type HardwareComponentParams containing all necessary
124+
* parameters for initializing this specific hardware component,
125+
* including its HardwareInfo, a dedicated logger, a clock, and a
126+
* weak_ptr to the executor.
127+
* \warning The parsed executor should not be used to call `cancel()` or use blocking callbacks
128+
* such as `spin()`.
129+
* \returns CallbackReturn::SUCCESS if required data are provided and can be parsed.
130+
* \returns CallbackReturn::ERROR if any error happens or data are missing.
131+
*/
132+
CallbackReturn init(const hardware_interface::HardwareComponentParams & params)
133+
{
134+
sensor_clock_ = params.clock;
135+
auto logger_copy = params.logger;
136+
sensor_logger_ =
137+
logger_copy.get_child("hardware_component.sensor." + params.hardware_info.name);
138+
info_ = params.hardware_info;
114139
if (info_.is_async)
115140
{
116141
RCLCPP_INFO_STREAM(
@@ -121,7 +146,10 @@ class SensorInterface : public rclcpp_lifecycle::node_interfaces::LifecycleNodeI
121146
info_.thread_priority);
122147
read_async_handler_->start_thread();
123148
}
124-
return on_init(hardware_info);
149+
hardware_interface::HardwareComponentInterfaceParams interface_params;
150+
interface_params.hardware_info = info_;
151+
interface_params.executor = params.executor;
152+
return on_init(interface_params);
125153
};
126154

127155
/// Initialization of the hardware interface from data parsed from the robot's URDF.
@@ -138,6 +166,22 @@ class SensorInterface : public rclcpp_lifecycle::node_interfaces::LifecycleNodeI
138166
return CallbackReturn::SUCCESS;
139167
};
140168

169+
/// Initialization of the hardware interface from data parsed from the robot's URDF.
170+
/**
171+
* \param[in] params A struct of type hardware_interface::HardwareComponentInterfaceParams
172+
* containing all necessary parameters for initializing this specific hardware component,
173+
* specifically its HardwareInfo, and a weak_ptr to the executor.
174+
* \warning The parsed executor should not be used to call `cancel()` or use blocking callbacks
175+
* such as `spin()`.
176+
* \returns CallbackReturn::SUCCESS if required data are provided and can be parsed.
177+
* \returns CallbackReturn::ERROR if any error happens or data are missing.
178+
*/
179+
virtual CallbackReturn on_init(
180+
const hardware_interface::HardwareComponentInterfaceParams & params)
181+
{
182+
return on_init(params.hardware_info);
183+
};
184+
141185
/// Exports all state interfaces for this hardware interface.
142186
/**
143187
* Old way of exporting the StateInterfaces. If a empty vector is returned then

hardware_interface/include/hardware_interface/system.hpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,9 @@ class System final
5252
const rclcpp_lifecycle::State & initialize(
5353
const HardwareInfo & system_info, rclcpp::Logger logger, rclcpp::Clock::SharedPtr clock);
5454

55+
const rclcpp_lifecycle::State & initialize(
56+
const hardware_interface::HardwareComponentParams & params);
57+
5558
const rclcpp_lifecycle::State & configure();
5659

5760
const rclcpp_lifecycle::State & cleanup();

hardware_interface/include/hardware_interface/system_interface.hpp

Lines changed: 48 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@
2828
#include "hardware_interface/handle.hpp"
2929
#include "hardware_interface/hardware_info.hpp"
3030
#include "hardware_interface/introspection.hpp"
31+
#include "hardware_interface/types/hardware_component_interface_params.hpp"
32+
#include "hardware_interface/types/hardware_component_params.hpp"
3133
#include "hardware_interface/types/hardware_interface_return_values.hpp"
3234
#include "hardware_interface/types/hardware_interface_type_values.hpp"
3335
#include "hardware_interface/types/lifecycle_state_names.hpp"
@@ -128,9 +130,32 @@ class SystemInterface : public rclcpp_lifecycle::node_interfaces::LifecycleNodeI
128130
CallbackReturn init(
129131
const HardwareInfo & hardware_info, rclcpp::Logger logger, rclcpp::Clock::SharedPtr clock)
130132
{
131-
system_clock_ = clock;
132-
system_logger_ = logger.get_child("hardware_component.system." + hardware_info.name);
133-
info_ = hardware_info;
133+
hardware_interface::HardwareComponentParams params;
134+
params.hardware_info = hardware_info;
135+
params.clock = clock;
136+
params.logger = logger;
137+
return init(params);
138+
};
139+
140+
/// Initialization of the hardware interface from data parsed from the robot's URDF and also the
141+
/// clock and logger interfaces.
142+
/**
143+
* \param[in] params A struct of type HardwareComponentParams containing all necessary
144+
* parameters for initializing this specific hardware component,
145+
* including its HardwareInfo, a dedicated logger, a clock, and a
146+
* weak_ptr to the executor.
147+
* \warning The parsed executor should not be used to call `cancel()` or use blocking callbacks
148+
* such as `spin()`.
149+
* \returns CallbackReturn::SUCCESS if required data are provided and can be parsed.
150+
* \returns CallbackReturn::ERROR if any error happens or data are missing.
151+
*/
152+
CallbackReturn init(const hardware_interface::HardwareComponentParams & params)
153+
{
154+
system_clock_ = params.clock;
155+
auto logger_copy = params.logger;
156+
system_logger_ =
157+
logger_copy.get_child("hardware_component.system." + params.hardware_info.name);
158+
info_ = params.hardware_info;
134159
if (info_.is_async)
135160
{
136161
RCLCPP_INFO_STREAM(
@@ -162,7 +187,10 @@ class SystemInterface : public rclcpp_lifecycle::node_interfaces::LifecycleNodeI
162187
info_.thread_priority);
163188
async_handler_->start_thread();
164189
}
165-
return on_init(hardware_info);
190+
hardware_interface::HardwareComponentInterfaceParams interface_params;
191+
interface_params.hardware_info = info_;
192+
interface_params.executor = params.executor;
193+
return on_init(interface_params);
166194
};
167195

168196
/// Initialization of the hardware interface from data parsed from the robot's URDF.
@@ -182,6 +210,22 @@ class SystemInterface : public rclcpp_lifecycle::node_interfaces::LifecycleNodeI
182210
return CallbackReturn::SUCCESS;
183211
};
184212

213+
/// Initialization of the hardware interface from data parsed from the robot's URDF.
214+
/**
215+
* \param[in] params A struct of type hardware_interface::HardwareComponentInterfaceParams
216+
* containing all necessary parameters for initializing this specific hardware component,
217+
* specifically its HardwareInfo, and a weak_ptr to the executor.
218+
* \warning The parsed executor should not be used to call `cancel()` or use blocking callbacks
219+
* such as `spin()`.
220+
* \returns CallbackReturn::SUCCESS if required data are provided and can be parsed.
221+
* \returns CallbackReturn::ERROR if any error happens or data are missing.
222+
*/
223+
virtual CallbackReturn on_init(
224+
const hardware_interface::HardwareComponentInterfaceParams & params)
225+
{
226+
return on_init(params.hardware_info);
227+
};
228+
185229
/// Exports all state interfaces for this hardware interface.
186230
/**
187231
* Old way of exporting the StateInterfaces. If a empty vector is returned then

0 commit comments

Comments
 (0)