ros2_control - rolling
Loading...
Searching...
No Matches
resource_manager.hpp
1// Copyright 2020 Open Source Robotics Foundation, Inc.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15#ifndef HARDWARE_INTERFACE__RESOURCE_MANAGER_HPP_
16#define HARDWARE_INTERFACE__RESOURCE_MANAGER_HPP_
17
18#include <functional>
19#include <memory>
20#include <mutex>
21#include <string>
22#include <unordered_map>
23#include <vector>
24
25#include "hardware_interface/actuator.hpp"
26#include "hardware_interface/actuator_interface.hpp"
27#include "hardware_interface/hardware_component_info.hpp"
28#include "hardware_interface/hardware_info.hpp"
29#include "hardware_interface/loaned_command_interface.hpp"
30#include "hardware_interface/loaned_state_interface.hpp"
31#include "hardware_interface/sensor.hpp"
32#include "hardware_interface/sensor_interface.hpp"
33#include "hardware_interface/system.hpp"
34#include "hardware_interface/system_interface.hpp"
35#include "hardware_interface/types/hardware_component_params.hpp"
36#include "hardware_interface/types/hardware_interface_return_values.hpp"
37#include "hardware_interface/types/resource_manager_params.hpp"
38#include "rclcpp/clock.hpp"
39#include "rclcpp/duration.hpp"
40#include "rclcpp/executor.hpp"
41#include "rclcpp/logger.hpp"
42#include "rclcpp/node_interfaces/node_clock_interface.hpp"
43#include "rclcpp/node_interfaces/node_logging_interface.hpp"
44#include "rclcpp/time.hpp"
45#include "rclcpp_lifecycle/state.hpp"
46
47namespace hardware_interface
48{
49class ResourceStorage;
50class ControllerManager;
51
53{
54 return_type result;
55 std::vector<std::string> failed_hardware_names;
56};
57
59{
60public:
62 explicit ResourceManager(
63 rclcpp::node_interfaces::NodeClockInterface::SharedPtr clock_interface,
64 rclcpp::node_interfaces::NodeLoggingInterface::SharedPtr logger_interface);
65
67 explicit ResourceManager(rclcpp::Clock::SharedPtr clock, rclcpp::Logger logger);
68
70
84 explicit ResourceManager(
85 const std::string & urdf,
86 rclcpp::node_interfaces::NodeClockInterface::SharedPtr clock_interface,
87 rclcpp::node_interfaces::NodeLoggingInterface::SharedPtr logger_interface,
88 bool activate_all = false, const unsigned int update_rate = 100);
89
91
105 explicit ResourceManager(
106 const std::string & urdf, rclcpp::Clock::SharedPtr clock, rclcpp::Logger logger,
107 bool activate_all = false, const unsigned int update_rate = 100);
108
110
120 explicit ResourceManager(const hardware_interface::ResourceManagerParams & params, bool load);
121
122 ResourceManager(const ResourceManager &) = delete;
123
124 virtual ~ResourceManager();
125
127
131 bool shutdown_components();
132
134
145
150 void import_joint_limiters(const std::string & urdf);
151
160 bool are_components_initialized() const;
161
163
171 LoanedStateInterface claim_state_interface(const std::string & key);
172
174
178 std::vector<std::string> state_interface_keys() const;
179
181
185 std::vector<std::string> available_state_interfaces() const;
186
188
191 bool state_interface_is_available(const std::string & name) const;
192
194
199 std::string get_state_interface_data_type(const std::string & name) const;
200
202
212 const std::string & controller_name, std::vector<StateInterface::ConstSharedPtr> & interfaces);
213
215
221 std::vector<std::string> get_controller_exported_state_interface_names(
222 const std::string & controller_name);
223
225
233 void make_controller_exported_state_interfaces_available(const std::string & controller_name);
234
236
243 void make_controller_exported_state_interfaces_unavailable(const std::string & controller_name);
244
246
252 void remove_controller_exported_state_interfaces(const std::string & controller_name);
253
255
265 const std::string & controller_name,
266 const std::vector<hardware_interface::CommandInterface::SharedPtr> & interfaces);
267
269
275 std::vector<std::string> get_controller_reference_interface_names(
276 const std::string & controller_name);
277
279
286 void make_controller_reference_interfaces_available(const std::string & controller_name);
287
289
296 void make_controller_reference_interfaces_unavailable(const std::string & controller_name);
297
299
305 void remove_controller_reference_interfaces(const std::string & controller_name);
306
308
316 const std::string & controller_name, const std::vector<std::string> & interfaces);
317
319
326 std::vector<std::string> get_cached_controllers_to_hardware(const std::string & hardware_name);
327
329
337 bool command_interface_is_claimed(const std::string & key) const;
338
340
348 LoanedCommandInterface claim_command_interface(const std::string & key);
349
351
355 std::vector<std::string> command_interface_keys() const;
356
358
362 std::vector<std::string> available_command_interfaces() const;
363
365
369 bool command_interface_is_available(const std::string & interface) const;
370
372
377 std::string get_command_interface_data_type(const std::string & name) const;
378
380
383 size_t actuator_components_size() const;
384
386
389 size_t sensor_components_size() const;
390
392
395 size_t system_components_size() const;
396
398
410 void import_component(
411 std::unique_ptr<SystemInterface> system, const HardwareComponentParams & params);
412
414
427 void import_component(
428 std::unique_ptr<ActuatorInterface> actuator, const HardwareComponentParams & params);
429
431
444 void import_component(
445 std::unique_ptr<SensorInterface> sensor, const HardwareComponentParams & params);
446
448
451 const std::unordered_map<std::string, HardwareComponentInfo> & get_components_status();
452
454
457 const std::unordered_map<std::string, joint_limits::JointLimits> & get_hard_joint_limits() const;
458
460
463 const std::unordered_map<std::string, joint_limits::SoftJointLimits> & get_soft_joint_limits()
464 const;
465
467
484 const std::vector<std::string> & start_interfaces,
485 const std::vector<std::string> & stop_interfaces);
486
488
501 const std::vector<std::string> & start_interfaces,
502 const std::vector<std::string> & stop_interfaces);
503
505
517 return_type set_component_state(
518 const std::string & component_name, rclcpp_lifecycle::State & target_state);
519
526 bool enforce_command_limits(const rclcpp::Duration & period);
527
529
535 HardwareReadWriteStatus read(const rclcpp::Time & time, const rclcpp::Duration & period);
536
538
544 HardwareReadWriteStatus write(const rclcpp::Time & time, const rclcpp::Duration & period);
545
547
551 bool command_interface_exists(const std::string & key) const;
552
554
557 bool state_interface_exists(const std::string & key) const;
558
560
563 void set_on_component_state_switch_callback(std::function<void()> callback);
564
565 const std::string & get_robot_description() const;
566
567protected:
569
572 rclcpp::Logger get_logger() const;
573
575
578 rclcpp::Clock::SharedPtr get_clock() const;
579
580 bool components_are_loaded_and_initialized_ = false;
581 bool allow_controller_activation_with_inactive_hardware_ = false;
582 bool return_failed_hardware_names_on_return_deactivate_write_cycle_ = true;
583
584 mutable std::recursive_mutex resource_interfaces_lock_;
585 mutable std::recursive_mutex claimed_command_interfaces_lock_;
586 mutable std::recursive_mutex resources_lock_;
587 mutable std::recursive_mutex joint_limiters_lock_;
588
589private:
590 bool validate_storage(const std::vector<hardware_interface::HardwareInfo> & hardware_info) const;
591
592 void release_command_interface(const std::string & key);
593
594 // Note this was added in #2323 and is a temporary addition to be backwards compatible with the
595 // original constructors. This is planned to be removed in a future PR along with the
596 // aforementioned constructors.
598 rclcpp::Clock::SharedPtr clock, rclcpp::Logger logger, const std::string & urdf = std::string(),
599 bool activate_all = false, unsigned int update_rate = 100);
600
601 std::unordered_map<std::string, bool> claimed_command_interface_map_;
602
603 std::unique_ptr<ResourceStorage> resource_storage_;
605
606 // Structure to store read and write status so it is not initialized in the real-time loop
607 HardwareReadWriteStatus read_write_status;
608};
609
610} // namespace hardware_interface
611#endif // HARDWARE_INTERFACE__RESOURCE_MANAGER_HPP_
Definition loaned_command_interface.hpp:30
Definition loaned_state_interface.hpp:29
Definition resource_manager.hpp:59
void make_controller_reference_interfaces_available(const std::string &controller_name)
Add controller's reference interface to available list.
Definition resource_manager.cpp:1784
std::string get_state_interface_data_type(const std::string &name) const
Gets the data type of the state interface.
Definition resource_manager.cpp:1685
void import_controller_reference_interfaces(const std::string &controller_name, const std::vector< hardware_interface::CommandInterface::SharedPtr > &interfaces)
Add controllers' reference interfaces to resource manager.
Definition resource_manager.cpp:1767
std::vector< std::string > command_interface_keys() const
Returns all registered command interfaces keys.
Definition resource_manager.cpp:1922
bool command_interface_exists(const std::string &key) const
Checks whether a command interface is registered under the given key.
Definition resource_manager.cpp:2634
bool command_interface_is_claimed(const std::string &key) const
Checks whether a command interface is already claimed.
Definition resource_manager.cpp:1880
return_type set_component_state(const std::string &component_name, rclcpp_lifecycle::State &target_state)
Sets state of hardware component.
Definition resource_manager.cpp:2303
const std::unordered_map< std::string, joint_limits::JointLimits > & get_hard_joint_limits() const
Return the unordered map of hard joint limits.
Definition resource_manager.cpp:2013
bool are_components_initialized() const
if the resource manager load_and_initialize_components(...) function has been called this returns tru...
Definition resource_manager.cpp:1641
void set_on_component_state_switch_callback(std::function< void()> callback)
A method to register a callback to be called when the component state changes.
Definition resource_manager.cpp:2648
bool shutdown_components()
Shutdown all hardware components, irrespective of their state.
Definition resource_manager.cpp:1522
void remove_controller_exported_state_interfaces(const std::string &controller_name)
Remove controllers exported state interfaces from resource manager.
Definition resource_manager.cpp:1749
void make_controller_exported_state_interfaces_available(const std::string &controller_name)
Add controller's exported state interfaces to available list.
Definition resource_manager.cpp:1717
size_t sensor_components_size() const
Return the number of loaded sensor components.
Definition resource_manager.cpp:2624
std::vector< std::string > state_interface_keys() const
Returns all registered state interfaces keys.
Definition resource_manager.cpp:1660
size_t system_components_size() const
Return the number of loaded system components.
Definition resource_manager.cpp:2629
std::vector< std::string > get_controller_reference_interface_names(const std::string &controller_name)
Get list of reference interface of a controller.
Definition resource_manager.cpp:1777
bool command_interface_is_available(const std::string &interface) const
Checks whether a command interface is available under the given name.
Definition resource_manager.cpp:1941
void import_controller_exported_state_interfaces(const std::string &controller_name, std::vector< StateInterface::ConstSharedPtr > &interfaces)
Add controllers' exported state interfaces to resource manager.
Definition resource_manager.cpp:1701
void make_controller_exported_state_interfaces_unavailable(const std::string &controller_name)
Remove controller's exported state interface to available list.
Definition resource_manager.cpp:1727
std::vector< std::string > get_cached_controllers_to_hardware(const std::string &hardware_name)
Return cached controllers for a specific hardware.
Definition resource_manager.cpp:1873
std::string get_command_interface_data_type(const std::string &name) const
Gets the data type of the command interface.
Definition resource_manager.cpp:1947
bool state_interface_is_available(const std::string &name) const
Checks whether a state interface is available under the given key.
Definition resource_manager.cpp:1679
std::vector< std::string > get_controller_exported_state_interface_names(const std::string &controller_name)
Get list of exported tate interface of a controller.
Definition resource_manager.cpp:1710
void import_component(std::unique_ptr< SystemInterface > system, const HardwareComponentParams &params)
Import a hardware component which is not listed in the URDF.
Definition resource_manager.cpp:1982
bool state_interface_exists(const std::string &key) const
Checks whether a state interface is registered under the given key.
Definition resource_manager.cpp:2641
void make_controller_reference_interfaces_unavailable(const std::string &controller_name)
Remove controller's reference interface to available list.
Definition resource_manager.cpp:1794
size_t actuator_components_size() const
Return the number size_t of loaded actuator components.
Definition resource_manager.cpp:2619
rclcpp::Clock::SharedPtr get_clock() const
Gets the clock for the resource manager.
Definition resource_manager.cpp:2662
HardwareReadWriteStatus read(const rclcpp::Time &time, const rclcpp::Duration &period)
Reads all loaded hardware components.
Definition resource_manager.cpp:2409
std::vector< std::string > available_command_interfaces() const
Returns all available command interfaces keys.
Definition resource_manager.cpp:1934
void remove_controller_reference_interfaces(const std::string &controller_name)
Remove controllers reference interfaces from resource manager.
Definition resource_manager.cpp:1816
bool prepare_command_mode_switch(const std::vector< std::string > &start_interfaces, const std::vector< std::string > &stop_interfaces)
Prepare the hardware components for a new command interface mode.
Definition resource_manager.cpp:2025
void import_joint_limiters(const std::string &urdf)
Import joint limiters from the URDF.
Definition resource_manager.cpp:1634
virtual bool load_and_initialize_components(const hardware_interface::ResourceManagerParams &params)
Load resources from on a given URDF.
Definition resource_manager.cpp:1539
bool enforce_command_limits(const rclcpp::Duration &period)
Definition resource_manager.cpp:2388
bool perform_command_mode_switch(const std::vector< std::string > &start_interfaces, const std::vector< std::string > &stop_interfaces)
Notify the hardware components that realtime hardware mode switching should occur.
Definition resource_manager.cpp:2182
std::vector< std::string > available_state_interfaces() const
Returns all available state interfaces keys.
Definition resource_manager.cpp:1672
rclcpp::Logger get_logger() const
Gets the logger for the resource manager.
Definition resource_manager.cpp:2660
LoanedCommandInterface claim_command_interface(const std::string &key)
Claim a command interface given its key.
Definition resource_manager.cpp:1892
void cache_controller_to_hardware(const std::string &controller_name, const std::vector< std::string > &interfaces)
Cache mapping between hardware and controllers using it.
Definition resource_manager.cpp:1833
const std::unordered_map< std::string, joint_limits::SoftJointLimits > & get_soft_joint_limits() const
Return the unordered map of soft joint limits.
Definition resource_manager.cpp:2019
LoanedStateInterface claim_state_interface(const std::string &key)
Claim a state interface given its key.
Definition resource_manager.cpp:1647
HardwareReadWriteStatus write(const rclcpp::Time &time, const rclcpp::Duration &period)
Write all loaded hardware components.
Definition resource_manager.cpp:2510
const std::unordered_map< std::string, HardwareComponentInfo > & get_components_status()
Return status for all components.
Definition resource_manager.cpp:1994
Definition mujoco_system_interface.hpp:57
Parameters required for the initialization of a specific hardware component plugin....
Definition hardware_component_params.hpp:33
Definition resource_manager.hpp:53
Parameters required for the construction and initial setup of a ResourceManager. This struct is typic...
Definition resource_manager_params.hpp:30