ros2_control - galactic
Loading...
Searching...
No Matches
controller_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 CONTROLLER_MANAGER__CONTROLLER_MANAGER_HPP_
16#define CONTROLLER_MANAGER__CONTROLLER_MANAGER_HPP_
17
18#include <memory>
19#include <string>
20#include <tuple>
21#include <vector>
22
23#include "controller_interface/controller_interface.hpp"
24
25#include "controller_manager/controller_spec.hpp"
26#include "controller_manager/visibility_control.h"
27#include "controller_manager_msgs/srv/configure_controller.hpp"
28#include "controller_manager_msgs/srv/configure_start_controller.hpp"
29#include "controller_manager_msgs/srv/list_controller_types.hpp"
30#include "controller_manager_msgs/srv/list_controllers.hpp"
31#include "controller_manager_msgs/srv/list_hardware_interfaces.hpp"
32#include "controller_manager_msgs/srv/load_configure_controller.hpp"
33#include "controller_manager_msgs/srv/load_controller.hpp"
34#include "controller_manager_msgs/srv/load_start_controller.hpp"
35#include "controller_manager_msgs/srv/reload_controller_libraries.hpp"
36#include "controller_manager_msgs/srv/switch_controller.hpp"
37#include "controller_manager_msgs/srv/unload_controller.hpp"
38
39#include "hardware_interface/resource_manager.hpp"
40
41#include "pluginlib/class_loader.hpp"
42
43#include "rclcpp/executor.hpp"
44#include "rclcpp/node.hpp"
45
46namespace controller_manager
47{
48class ControllerManager : public rclcpp::Node
49{
50public:
51 static constexpr bool kWaitForAllResources = false;
52 static constexpr auto kInfiniteTimeout = 0;
53
54 CONTROLLER_MANAGER_PUBLIC
56 std::unique_ptr<hardware_interface::ResourceManager> resource_manager,
57 std::shared_ptr<rclcpp::Executor> executor,
58 const std::string & manager_node_name = "controller_manager",
59 const std::string & namespace_ = "");
60
61 CONTROLLER_MANAGER_PUBLIC
63 std::shared_ptr<rclcpp::Executor> executor,
64 const std::string & manager_node_name = "controller_manager",
65 const std::string & namespace_ = "");
66
67 CONTROLLER_MANAGER_PUBLIC
68 virtual ~ControllerManager() = default;
69
70 CONTROLLER_MANAGER_PUBLIC
71 controller_interface::ControllerInterfaceSharedPtr load_controller(
72 const std::string & controller_name, const std::string & controller_type);
73
75
80 CONTROLLER_MANAGER_PUBLIC
81 controller_interface::ControllerInterfaceSharedPtr load_controller(
82 const std::string & controller_name);
83
84 CONTROLLER_MANAGER_PUBLIC
85 controller_interface::return_type unload_controller(const std::string & controller_name);
86
87 CONTROLLER_MANAGER_PUBLIC
88 std::vector<ControllerSpec> get_loaded_controllers() const;
89
90 template <
91 typename T, typename std::enable_if<
92 std::is_convertible<T *, controller_interface::ControllerInterface *>::value,
93 T>::type * = nullptr>
94 controller_interface::ControllerInterfaceSharedPtr add_controller(
95 std::shared_ptr<T> controller, const std::string & controller_name,
96 const std::string & controller_type)
97 {
98 ControllerSpec controller_spec;
99 controller_spec.c = controller;
100 controller_spec.info.name = controller_name;
101 controller_spec.info.type = controller_type;
102 return add_controller_impl(controller_spec);
103 }
104
106
111 CONTROLLER_MANAGER_PUBLIC
112 controller_interface::return_type configure_controller(const std::string & controller_name);
113
115
121 CONTROLLER_MANAGER_PUBLIC
122 controller_interface::return_type switch_controller(
123 const std::vector<std::string> & start_controllers,
124 const std::vector<std::string> & stop_controllers, int strictness,
125 bool start_asap = kWaitForAllResources,
126 const rclcpp::Duration & timeout = rclcpp::Duration::from_nanoseconds(kInfiniteTimeout));
127
128 CONTROLLER_MANAGER_PUBLIC
129 void read();
130
131 CONTROLLER_MANAGER_PUBLIC
132 controller_interface::return_type update(
133 const rclcpp::Time & time, const rclcpp::Duration & period);
134
135 CONTROLLER_MANAGER_PUBLIC
136 void write();
137
139
143 // TODO(anyone): Due to issues with the MutliThreadedExecutor, this control loop does not rely on
144 // the executor (see issue #260).
145 // rclcpp::CallbackGroup::SharedPtr deterministic_callback_group_;
146
147 // Per controller update rate support
148 CONTROLLER_MANAGER_PUBLIC
149 unsigned int get_update_rate() const;
150
151protected:
152 CONTROLLER_MANAGER_PUBLIC
153 void init_services();
154
155 CONTROLLER_MANAGER_PUBLIC
156 controller_interface::ControllerInterfaceSharedPtr add_controller_impl(
157 const ControllerSpec & controller);
158
159 CONTROLLER_MANAGER_PUBLIC
160 void manage_switch();
161
162 CONTROLLER_MANAGER_PUBLIC
163 void stop_controllers();
164
165 CONTROLLER_MANAGER_PUBLIC
166 void start_controllers();
167
168 CONTROLLER_MANAGER_PUBLIC
169 void start_controllers_asap();
170
171 CONTROLLER_MANAGER_PUBLIC
172 void list_controllers_srv_cb(
173 const std::shared_ptr<controller_manager_msgs::srv::ListControllers::Request> request,
174 std::shared_ptr<controller_manager_msgs::srv::ListControllers::Response> response);
175
176 CONTROLLER_MANAGER_PUBLIC
177 void list_controller_types_srv_cb(
178 const std::shared_ptr<controller_manager_msgs::srv::ListControllerTypes::Request> request,
179 std::shared_ptr<controller_manager_msgs::srv::ListControllerTypes::Response> response);
180
181 CONTROLLER_MANAGER_PUBLIC
182 void list_hardware_interfaces_srv_cb(
183 const std::shared_ptr<controller_manager_msgs::srv::ListHardwareInterfaces::Request> request,
184 std::shared_ptr<controller_manager_msgs::srv::ListHardwareInterfaces::Response> response);
185
186 CONTROLLER_MANAGER_PUBLIC
187 void load_controller_service_cb(
188 const std::shared_ptr<controller_manager_msgs::srv::LoadController::Request> request,
189 std::shared_ptr<controller_manager_msgs::srv::LoadController::Response> response);
190
191 CONTROLLER_MANAGER_PUBLIC
192 void configure_controller_service_cb(
193 const std::shared_ptr<controller_manager_msgs::srv::ConfigureController::Request> request,
194 std::shared_ptr<controller_manager_msgs::srv::ConfigureController::Response> response);
195
196 CONTROLLER_MANAGER_PUBLIC
197 void load_and_configure_controller_service_cb(
198 const std::shared_ptr<controller_manager_msgs::srv::LoadConfigureController::Request> request,
199 std::shared_ptr<controller_manager_msgs::srv::LoadConfigureController::Response> response);
200
201 CONTROLLER_MANAGER_PUBLIC
202 void load_and_start_controller_service_cb(
203 const std::shared_ptr<controller_manager_msgs::srv::LoadStartController::Request> request,
204 std::shared_ptr<controller_manager_msgs::srv::LoadStartController::Response> response);
205
206 CONTROLLER_MANAGER_PUBLIC
207 void configure_and_start_controller_service_cb(
208 const std::shared_ptr<controller_manager_msgs::srv::ConfigureStartController::Request> request,
209 std::shared_ptr<controller_manager_msgs::srv::ConfigureStartController::Response> response);
210
211 CONTROLLER_MANAGER_PUBLIC
212 void reload_controller_libraries_service_cb(
213 const std::shared_ptr<controller_manager_msgs::srv::ReloadControllerLibraries::Request> request,
214 std::shared_ptr<controller_manager_msgs::srv::ReloadControllerLibraries::Response> response);
215
216 CONTROLLER_MANAGER_PUBLIC
217 void switch_controller_service_cb(
218 const std::shared_ptr<controller_manager_msgs::srv::SwitchController::Request> request,
219 std::shared_ptr<controller_manager_msgs::srv::SwitchController::Response> response);
220
221 CONTROLLER_MANAGER_PUBLIC
222 void unload_controller_service_cb(
223 const std::shared_ptr<controller_manager_msgs::srv::UnloadController::Request> request,
224 std::shared_ptr<controller_manager_msgs::srv::UnloadController::Response> response);
225
226 // Per controller update rate support
227 unsigned int update_loop_counter_ = 0;
228 unsigned int update_rate_ = 100;
229
230private:
231 std::vector<std::string> get_controller_names();
232
233 std::unique_ptr<hardware_interface::ResourceManager> resource_manager_;
234
235 std::shared_ptr<rclcpp::Executor> executor_;
236
237 std::shared_ptr<pluginlib::ClassLoader<controller_interface::ControllerInterface>> loader_;
238
240
244 rclcpp::CallbackGroup::SharedPtr best_effort_callback_group_;
245
257 class RTControllerListWrapper
258 {
259 // *INDENT-OFF*
260 public:
261 // *INDENT-ON*
263
268 std::vector<ControllerSpec> & update_and_get_used_by_rt_list();
269
277 std::vector<ControllerSpec> & get_unused_list(
278 const std::lock_guard<std::recursive_mutex> & guard);
279
281
285 const std::vector<ControllerSpec> & get_updated_list(
286 const std::lock_guard<std::recursive_mutex> & guard) const;
287
293 void switch_updated_list(const std::lock_guard<std::recursive_mutex> & guard);
294
295 // Mutex protecting the controllers list
296 // must be acquired before using any list other than the "used by rt"
297 mutable std::recursive_mutex controllers_lock_;
298
299 // *INDENT-OFF*
300 private:
301 // *INDENT-ON*
303
306 int get_other_list(int index) const;
307
308 void wait_until_rt_not_using(
309 int index, std::chrono::microseconds sleep_delay = std::chrono::microseconds(200)) const;
310
311 std::vector<ControllerSpec> controllers_lists_[2];
313 int updated_controllers_index_ = 0;
315 int used_by_realtime_controllers_index_ = -1;
316 };
317
318 RTControllerListWrapper rt_controllers_wrapper_;
321 std::mutex services_lock_;
322 rclcpp::Service<controller_manager_msgs::srv::ListControllers>::SharedPtr
323 list_controllers_service_;
324 rclcpp::Service<controller_manager_msgs::srv::ListControllerTypes>::SharedPtr
325 list_controller_types_service_;
326 rclcpp::Service<controller_manager_msgs::srv::ListHardwareInterfaces>::SharedPtr
327 list_hardware_interfaces_service_;
328 rclcpp::Service<controller_manager_msgs::srv::LoadController>::SharedPtr load_controller_service_;
329 rclcpp::Service<controller_manager_msgs::srv::ConfigureController>::SharedPtr
330 configure_controller_service_;
331 rclcpp::Service<controller_manager_msgs::srv::LoadConfigureController>::SharedPtr
332 load_and_configure_controller_service_;
333 rclcpp::Service<controller_manager_msgs::srv::LoadStartController>::SharedPtr
334 load_and_start_controller_service_;
335 rclcpp::Service<controller_manager_msgs::srv::ConfigureStartController>::SharedPtr
336 configure_and_start_controller_service_;
337 rclcpp::Service<controller_manager_msgs::srv::ReloadControllerLibraries>::SharedPtr
338 reload_controller_libraries_service_;
339 rclcpp::Service<controller_manager_msgs::srv::SwitchController>::SharedPtr
340 switch_controller_service_;
341 rclcpp::Service<controller_manager_msgs::srv::UnloadController>::SharedPtr
342 unload_controller_service_;
343
344 std::vector<std::string> start_request_, stop_request_;
345 std::vector<std::string> start_command_interface_request_, stop_command_interface_request_;
346
347 struct SwitchParams
348 {
349 bool do_switch = {false};
350 bool started = {false};
351 rclcpp::Time init_time = {rclcpp::Time::max()};
352
353 // Switch options
354 int strictness = {0};
355 bool start_asap = {false};
356 rclcpp::Duration timeout = rclcpp::Duration{0, 0};
357 };
358
359 SwitchParams switch_params_;
360};
361
362} // namespace controller_manager
363
364#endif // CONTROLLER_MANAGER__CONTROLLER_MANAGER_HPP_
Definition controller_manager.hpp:49
CONTROLLER_MANAGER_PUBLIC unsigned int get_update_rate() const
Deterministic (real-time safe) callback group, e.g., update function.
Definition controller_manager.cpp:1313
CONTROLLER_MANAGER_PUBLIC controller_interface::return_type switch_controller(const std::vector< std::string > &start_controllers, const std::vector< std::string > &stop_controllers, int strictness, bool start_asap=kWaitForAllResources, const rclcpp::Duration &timeout=rclcpp::Duration::from_nanoseconds(kInfiniteTimeout))
switch_controller Stops some controllers and start others.
Definition controller_manager.cpp:341
CONTROLLER_MANAGER_PUBLIC controller_interface::return_type configure_controller(const std::string &controller_name)
configure_controller Configure controller by name calling their "configure" method.
Definition controller_manager.cpp:282
Controller Specification.
Definition controller_spec.hpp:37
std::string type
Controller type.
Definition controller_info.hpp:33
std::string name
Controller name.
Definition controller_info.hpp:30