ros2_control - humble
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 <mutex>
20#include <string>
21#include <unordered_map>
22#include <vector>
23
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/types/hardware_interface_return_values.hpp"
29#include "rclcpp/duration.hpp"
30#include "rclcpp/time.hpp"
31
32namespace hardware_interface
33{
34class ActuatorInterface;
35class SensorInterface;
36class SystemInterface;
37class ResourceStorage;
38
40{
41 bool ok;
42 std::vector<std::string> failed_hardware_names;
43};
44
45class HARDWARE_INTERFACE_PUBLIC ResourceManager
46{
47public:
50
52
66 explicit ResourceManager(
67 const std::string & urdf, bool validate_interfaces = true, bool activate_all = false);
68
69 ResourceManager(const ResourceManager &) = delete;
70
72
74
78 bool shutdown_components();
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
403 [[deprecated(
404 "The method 'activate_all_components' is deprecated. "
405 "Use the new 'hardware_components_initial_state' parameter structure to setup the "
406 "components")]] void
407 activate_all_components();
408
410
414 bool command_interface_exists(const std::string & key) const;
415
417
420 bool state_interface_exists(const std::string & key) const;
421
422private:
423 void validate_storage(const std::vector<hardware_interface::HardwareInfo> & hardware_info) const;
424
425 void release_command_interface(const std::string & key);
426
427 std::unordered_map<std::string, bool> claimed_command_interface_map_;
428
429 mutable std::recursive_mutex resource_interfaces_lock_;
430 mutable std::recursive_mutex claimed_command_interfaces_lock_;
431 mutable std::recursive_mutex resources_lock_;
432
433 std::unique_ptr<ResourceStorage> resource_storage_;
434
435 // Structure to store read and write status so it is not initialized in the real-time loop
436 HardwareReadWriteStatus read_write_status;
437
438 bool is_urdf_loaded__ = false;
439};
440
441} // namespace hardware_interface
442#endif // HARDWARE_INTERFACE__RESOURCE_MANAGER_HPP_
Definition loaned_command_interface.hpp:27
Definition loaned_state_interface.hpp:27
Definition resource_manager.hpp:46
Definition actuator.hpp:31
This structure stores information about hardware defined in a robot's URDF.
Definition hardware_info.hpp:106
Definition resource_manager.hpp:40