ros2_control - galactic
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_info.hpp"
25 #include "hardware_interface/loaned_command_interface.hpp"
26 #include "hardware_interface/loaned_state_interface.hpp"
27 #include "rclcpp_lifecycle/state.hpp"
28 
29 namespace hardware_interface
30 {
31 class ActuatorInterface;
32 class SensorInterface;
33 class SystemInterface;
34 class ResourceStorage;
35 
36 class HARDWARE_INTERFACE_PUBLIC ResourceManager
37 {
38 public:
41 
43 
55  explicit ResourceManager(const std::string & urdf, bool validate_interfaces = true);
56 
57  ResourceManager(const ResourceManager &) = delete;
58 
59  ~ResourceManager();
60 
62 
71  void load_urdf(const std::string & urdf, bool validate_interfaces = true);
72 
74 
82  LoanedStateInterface claim_state_interface(const std::string & key);
83 
85 
90  std::vector<std::string> state_interface_keys() const;
91 
93 
96  bool state_interface_exists(const std::string & key) const;
97 
99 
107  bool command_interface_is_claimed(const std::string & key) const;
108 
110 
118  LoanedCommandInterface claim_command_interface(const std::string & key);
119 
121 
126  std::vector<std::string> command_interface_keys() const;
127 
129 
133  bool command_interface_exists(const std::string & key) const;
134 
136 
139  size_t actuator_components_size() const;
140 
142 
151  void import_component(std::unique_ptr<ActuatorInterface> actuator);
152 
154 
157  size_t sensor_components_size() const;
158 
160 
169  void import_component(std::unique_ptr<SensorInterface> sensor);
170 
172 
175  size_t system_components_size() const;
176 
178 
187  void import_component(std::unique_ptr<SystemInterface> system);
188 
190 
202  void import_component(
203  std::unique_ptr<ActuatorInterface> actuator, const HardwareInfo & hardware_info);
204 
206 
218  void import_component(
219  std::unique_ptr<SensorInterface> sensor, const HardwareInfo & hardware_info);
220 
222 
234  void import_component(
235  std::unique_ptr<SystemInterface> system, const HardwareInfo & hardware_info);
236 
238 
241  std::unordered_map<std::string, rclcpp_lifecycle::State> get_components_states();
242 
244 
258  bool prepare_command_mode_switch(
259  const std::vector<std::string> & start_interfaces,
260  const std::vector<std::string> & stop_interfaces);
261 
263 
273  bool perform_command_mode_switch(
274  const std::vector<std::string> & start_interfaces,
275  const std::vector<std::string> & stop_interfaces);
276 
278  void start_components();
279 
281  void stop_components();
282 
284  void read();
285 
287  void write();
288 
289 private:
290  void validate_storage(const std::vector<hardware_interface::HardwareInfo> & hardware_info) const;
291 
292  void release_command_interface(const std::string & key);
293 
294  std::unordered_map<std::string, bool> claimed_command_interface_map_;
295 
296  mutable std::recursive_mutex resource_lock_;
297  std::unique_ptr<ResourceStorage> resource_storage_;
298 };
299 
300 } // namespace hardware_interface
301 #endif // HARDWARE_INTERFACE__RESOURCE_MANAGER_HPP_
Definition: loaned_command_interface.hpp:27
Definition: loaned_state_interface.hpp:27
Definition: resource_manager.hpp:37
Definition: actuator.hpp:29
This structure stores information about hardware defined in a robot's URDF.
Definition: hardware_info.hpp:101