ros2_control - iron
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 <memory>
19#include <string>
20#include <unordered_map>
21#include <vector>
22
23#include "hardware_interface/actuator.hpp"
24#include "hardware_interface/hardware_component_info.hpp"
25#include "hardware_interface/hardware_info.hpp"
26#include "hardware_interface/loaned_command_interface.hpp"
27#include "hardware_interface/loaned_state_interface.hpp"
28#include "hardware_interface/sensor.hpp"
29#include "hardware_interface/system.hpp"
30#include "hardware_interface/types/hardware_interface_return_values.hpp"
31#include "hardware_interface/types/lifecycle_state_names.hpp"
32#include "lifecycle_msgs/msg/state.hpp"
33#include "rclcpp/duration.hpp"
34#include "rclcpp/node.hpp"
35#include "rclcpp/time.hpp"
36
37namespace hardware_interface
38{
39class ResourceStorage;
40class ControllerManager;
41
43{
44 bool ok;
45 std::vector<std::string> failed_hardware_names;
46};
47
48class HARDWARE_INTERFACE_PUBLIC ResourceManager
49{
50public:
53 unsigned int update_rate = 100,
54 rclcpp::node_interfaces::NodeClockInterface::SharedPtr clock_interface = nullptr);
55
57
71 explicit ResourceManager(
72 const std::string & urdf, bool validate_interfaces = true, bool activate_all = false,
73 unsigned int update_rate = 100,
74 rclcpp::node_interfaces::NodeClockInterface::SharedPtr clock_interface = nullptr);
75
76 ResourceManager(const ResourceManager &) = delete;
77
79
81
92 void load_urdf(
93 const std::string & urdf, bool validate_interfaces = true,
94 bool load_and_initialize_components = true);
95
104 bool is_urdf_already_loaded() const;
105
107
115 LoanedStateInterface claim_state_interface(const std::string & key);
116
118
122 std::vector<std::string> state_interface_keys() const;
123
125
129 std::vector<std::string> available_state_interfaces() const;
130
132
135 bool state_interface_is_available(const std::string & name) const;
136
138
147 void import_controller_reference_interfaces(
148 const std::string & controller_name, std::vector<CommandInterface> & interfaces);
149
151
157 std::vector<std::string> get_controller_reference_interface_names(
158 const std::string & controller_name);
159
161
168 void make_controller_reference_interfaces_available(const std::string & controller_name);
169
171
178 void make_controller_reference_interfaces_unavailable(const std::string & controller_name);
179
181
187 void remove_controller_reference_interfaces(const std::string & controller_name);
188
190
197 void cache_controller_to_hardware(
198 const std::string & controller_name, const std::vector<std::string> & interfaces);
199
201
208 std::vector<std::string> get_cached_controllers_to_hardware(const std::string & hardware_name);
209
211
219 bool command_interface_is_claimed(const std::string & key) const;
220
222
230 LoanedCommandInterface claim_command_interface(const std::string & key);
231
233
237 std::vector<std::string> command_interface_keys() const;
238
240
244 std::vector<std::string> available_command_interfaces() const;
245
247
251 bool command_interface_is_available(const std::string & interface) const;
252
254
257 size_t actuator_components_size() const;
258
260
263 size_t sensor_components_size() const;
264
266
269 size_t system_components_size() const;
270
272
284 void import_component(
285 std::unique_ptr<ActuatorInterface> actuator, const HardwareInfo & hardware_info);
286
288
300 void import_component(
301 std::unique_ptr<SensorInterface> sensor, const HardwareInfo & hardware_info);
302
304
316 void import_component(
317 std::unique_ptr<SystemInterface> system, const HardwareInfo & hardware_info);
318
320
323 std::unordered_map<std::string, HardwareComponentInfo> get_components_status();
324
326
342 bool prepare_command_mode_switch(
343 const std::vector<std::string> & start_interfaces,
344 const std::vector<std::string> & stop_interfaces);
345
347
359 bool perform_command_mode_switch(
360 const std::vector<std::string> & start_interfaces,
361 const std::vector<std::string> & stop_interfaces);
362
364
376 return_type set_component_state(
377 const std::string & component_name, rclcpp_lifecycle::State & target_state);
378
380
386 HardwareReadWriteStatus read(const rclcpp::Time & time, const rclcpp::Duration & period);
387
389
395 HardwareReadWriteStatus write(const rclcpp::Time & time, const rclcpp::Duration & period);
396
398
402 bool command_interface_exists(const std::string & key) const;
403
405
408 bool state_interface_exists(const std::string & key) const;
409
410private:
411 void validate_storage(const std::vector<hardware_interface::HardwareInfo> & hardware_info) const;
412
413 void release_command_interface(const std::string & key);
414
415 std::unordered_map<std::string, bool> claimed_command_interface_map_;
416
417 mutable std::recursive_mutex resource_interfaces_lock_;
418 mutable std::recursive_mutex claimed_command_interfaces_lock_;
419 mutable std::recursive_mutex resources_lock_;
420
421 std::unique_ptr<ResourceStorage> resource_storage_;
422
423 // Structure to store read and write status so it is not initialized in the real-time loop
424 HardwareReadWriteStatus read_write_status;
425
426 bool is_urdf_loaded__ = false;
427};
428
429} // namespace hardware_interface
430#endif // HARDWARE_INTERFACE__RESOURCE_MANAGER_HPP_
Definition loaned_command_interface.hpp:27
Definition loaned_state_interface.hpp:27
Definition resource_manager.hpp:49
Definition actuator.hpp:31
This structure stores information about hardware defined in a robot's URDF.
Definition hardware_info.hpp:107
Definition resource_manager.hpp:43