63 static constexpr bool kWaitForAllResources =
false;
64 static constexpr auto kInfiniteTimeout = 0;
67 std::unique_ptr<hardware_interface::ResourceManager> resource_manager,
68 std::shared_ptr<rclcpp::Executor> executor,
69 const std::string & manager_node_name =
"controller_manager",
70 const std::string & node_namespace =
"",
71 const rclcpp::NodeOptions & options = get_cm_node_options());
74 std::shared_ptr<rclcpp::Executor> executor,
75 const std::string & manager_node_name =
"controller_manager",
76 const std::string & node_namespace =
"",
77 const rclcpp::NodeOptions & options = get_cm_node_options());
80 std::shared_ptr<rclcpp::Executor> executor,
const std::string & urdf,
81 bool activate_all_hw_components,
const std::string & manager_node_name =
"controller_manager",
82 const std::string & node_namespace =
"",
83 const rclcpp::NodeOptions & options = get_cm_node_options());
93 void robot_description_callback(
const std_msgs::msg::String & msg);
95 void init_resource_manager(
const std::string & robot_description);
97 controller_interface::ControllerInterfaceBaseSharedPtr load_controller(
98 const std::string & controller_name,
const std::string & controller_type);
106 controller_interface::ControllerInterfaceBaseSharedPtr load_controller(
107 const std::string & controller_name);
109 controller_interface::return_type unload_controller(
const std::string & controller_name);
111 std::vector<ControllerSpec> get_loaded_controllers()
const;
114 typename T,
typename std::enable_if<
115 std::is_convertible<T *, controller_interface::ControllerInterfaceBase *>::value,
116 T>::type * =
nullptr>
117 controller_interface::ControllerInterfaceBaseSharedPtr add_controller(
118 std::shared_ptr<T> controller,
const std::string & controller_name,
119 const std::string & controller_type)
122 controller_spec.c = controller;
123 controller_spec.info.
name = controller_name;
124 controller_spec.info.
type = controller_type;
125 controller_spec.last_update_cycle_time = std::make_shared<rclcpp::Time>(0);
126 return add_controller_impl(controller_spec);
129 controller_interface::ControllerInterfaceBaseSharedPtr add_controller(
132 return add_controller_impl(controller_spec);
155 bool activate_asap = kWaitForAllResources,
156 const rclcpp::Duration & timeout = rclcpp::Duration::from_nanoseconds(kInfiniteTimeout));
171 const rclcpp::Duration & timeout, std::string & message);
181 void read(
const rclcpp::Time & time,
const rclcpp::Duration & period);
191 controller_interface::return_type
update(
192 const rclcpp::Time & time,
const rclcpp::Duration & period);
202 void write(
const rclcpp::Time & time,
const rclcpp::Duration & period);
220 return resource_manager_ && resource_manager_->are_components_initialized();
246 void init_services();
248 controller_interface::ControllerInterfaceBaseSharedPtr add_controller_impl(
251 void manage_switch();
262 const std::vector<ControllerSpec> & rt_controller_list,
263 const std::vector<std::string> & controllers_to_deactivate);
274 const std::vector<std::string> & chained_mode_switch_list,
bool to_chained_mode);
286 const std::vector<ControllerSpec> & rt_controller_list,
287 const std::vector<std::string> & controllers_to_activate,
int strictness);
289 void list_controllers_srv_cb(
290 const std::shared_ptr<controller_manager_msgs::srv::ListControllers::Request> request,
291 std::shared_ptr<controller_manager_msgs::srv::ListControllers::Response> response);
293 void list_hardware_interfaces_srv_cb(
294 const std::shared_ptr<controller_manager_msgs::srv::ListHardwareInterfaces::Request> request,
295 std::shared_ptr<controller_manager_msgs::srv::ListHardwareInterfaces::Response> response);
297 void load_controller_service_cb(
298 const std::shared_ptr<controller_manager_msgs::srv::LoadController::Request> request,
299 std::shared_ptr<controller_manager_msgs::srv::LoadController::Response> response);
301 void configure_controller_service_cb(
302 const std::shared_ptr<controller_manager_msgs::srv::ConfigureController::Request> request,
303 std::shared_ptr<controller_manager_msgs::srv::ConfigureController::Response> response);
305 void reload_controller_libraries_service_cb(
306 const std::shared_ptr<controller_manager_msgs::srv::ReloadControllerLibraries::Request> request,
307 std::shared_ptr<controller_manager_msgs::srv::ReloadControllerLibraries::Response> response);
309 void switch_controller_service_cb(
310 const std::shared_ptr<controller_manager_msgs::srv::SwitchController::Request> request,
311 std::shared_ptr<controller_manager_msgs::srv::SwitchController::Response> response);
313 void unload_controller_service_cb(
314 const std::shared_ptr<controller_manager_msgs::srv::UnloadController::Request> request,
315 std::shared_ptr<controller_manager_msgs::srv::UnloadController::Response> response);
317 void list_controller_types_srv_cb(
318 const std::shared_ptr<controller_manager_msgs::srv::ListControllerTypes::Request> request,
319 std::shared_ptr<controller_manager_msgs::srv::ListControllerTypes::Response> response);
321 void list_hardware_components_srv_cb(
322 const std::shared_ptr<controller_manager_msgs::srv::ListHardwareComponents::Request> request,
323 std::shared_ptr<controller_manager_msgs::srv::ListHardwareComponents::Response> response);
325 void set_hardware_component_state_srv_cb(
326 const std::shared_ptr<controller_manager_msgs::srv::SetHardwareComponentState::Request> request,
327 std::shared_ptr<controller_manager_msgs::srv::SetHardwareComponentState::Response> response);
330 unsigned int update_loop_counter_ = 0;
331 unsigned int update_rate_;
332 std::vector<std::vector<std::string>> chained_controllers_configuration_;
334 std::unique_ptr<hardware_interface::ResourceManager> resource_manager_;
337 std::vector<std::string> get_controller_names();
338 std::pair<std::string, std::string> split_command_interface(
339 const std::string & command_interface);
340 void init_controller_manager();
342 void initialize_parameters();
349 controller_interface::return_type cleanup_controller(
363 void clear_requests();
375 void perform_hardware_command_mode_change(
376 const std::vector<ControllerSpec> & rt_controller_list,
377 const std::vector<std::string> & activate_controllers_list,
378 const std::vector<std::string> & deactivate_controllers_list,
379 const std::string & rt_cycle_name);
387 void propagate_deactivation_of_chained_mode(
const std::vector<ControllerSpec> & controllers);
415 controller_interface::return_type check_following_controllers_for_activate(
416 const std::vector<ControllerSpec> & controllers,
int strictness,
417 const ControllersListIterator controller_it, std::string & message);
439 controller_interface::return_type check_preceding_controllers_for_deactivate(
440 const std::vector<ControllerSpec> & controllers,
int strictness,
441 const ControllersListIterator controller_it, std::string & message);
452 controller_interface::return_type check_fallback_controllers_state_pre_activation(
453 const std::vector<ControllerSpec> & controllers,
const ControllersListIterator controller_it,
454 std::string & message);
465 controller_interface::return_type check_for_interfaces_availability_to_activate(
466 const std::vector<ControllerSpec> & controllers,
const std::vector<std::string> activation_list,
467 const std::vector<std::string> deactivation_list, std::string & message);
488 void update_list_with_controller_chain(
489 const std::string & ctrl_name, std::vector<std::string>::iterator controller_iterator,
490 bool append_to_controller);
498 void build_controllers_topology_info(
const std::vector<ControllerSpec> & controllers);
505 void publish_activity();
507 void controller_activity_diagnostic_callback(diagnostic_updater::DiagnosticStatusWrapper & stat);
509 void hardware_components_diagnostic_callback(diagnostic_updater::DiagnosticStatusWrapper & stat);
511 void controller_manager_diagnostic_callback(diagnostic_updater::DiagnosticStatusWrapper & stat);
520 rclcpp::NodeOptions determine_controller_node_options(
const ControllerSpec & controller)
const;
527 void cleanup_controller_exported_interfaces(
const ControllerSpec & controller);
529 std::shared_ptr<controller_manager::ParamListener> cm_param_listener_;
530 std::shared_ptr<controller_manager::Params> params_;
531 diagnostic_updater::Updater diagnostics_updater_;
533 std::shared_ptr<rclcpp::Executor> executor_;
535 std::shared_ptr<pluginlib::ClassLoader<controller_interface::ControllerInterface>> loader_;
536 std::shared_ptr<pluginlib::ClassLoader<controller_interface::ChainableControllerInterface>>
544 rclcpp::CallbackGroup::SharedPtr best_effort_callback_group_;
557 class RTControllerListWrapper
568 std::vector<ControllerSpec> & update_and_get_used_by_rt_list();
578 std::vector<ControllerSpec> & get_unused_list(
579 const std::lock_guard<std::recursive_mutex> & guard);
587 const std::vector<ControllerSpec> & get_updated_list(
588 const std::lock_guard<std::recursive_mutex> & guard)
const;
596 void switch_updated_list(
const std::lock_guard<std::recursive_mutex> & guard);
602 void set_on_switch_callback(std::function<
void()> callback);
606 mutable std::recursive_mutex controllers_lock_;
615 int get_other_list(
int index)
const;
617 void wait_until_rt_not_using(
618 int index, std::chrono::microseconds sleep_delay = std::chrono::microseconds(200))
const;
620 std::vector<ControllerSpec> controllers_lists_[2];
622 int updated_controllers_index_ = 0;
624 int used_by_realtime_controllers_index_ = -1;
626 std::function<void()> on_switch_callback_ =
nullptr;
630 rclcpp::Clock::SharedPtr trigger_clock_ =
nullptr;
631 std::unique_ptr<rclcpp::PreShutdownCallbackHandle> preshutdown_cb_handle_{
nullptr};
632 RTControllerListWrapper rt_controllers_wrapper_;
633 std::unordered_map<std::string, ControllerChainSpec> controller_chain_spec_;
634 std::vector<std::string> ordered_controllers_names_;
637 std::mutex services_lock_;
638 rclcpp::Publisher<controller_manager_msgs::msg::ControllerManagerActivity>::SharedPtr
639 controller_manager_activity_publisher_;
640 rclcpp::Service<controller_manager_msgs::srv::ListControllers>::SharedPtr
641 list_controllers_service_;
642 rclcpp::Service<controller_manager_msgs::srv::ListControllerTypes>::SharedPtr
643 list_controller_types_service_;
644 rclcpp::Service<controller_manager_msgs::srv::LoadController>::SharedPtr load_controller_service_;
645 rclcpp::Service<controller_manager_msgs::srv::ConfigureController>::SharedPtr
646 configure_controller_service_;
647 rclcpp::Service<controller_manager_msgs::srv::ReloadControllerLibraries>::SharedPtr
648 reload_controller_libraries_service_;
649 rclcpp::Service<controller_manager_msgs::srv::SwitchController>::SharedPtr
650 switch_controller_service_;
651 rclcpp::Service<controller_manager_msgs::srv::UnloadController>::SharedPtr
652 unload_controller_service_;
654 rclcpp::Service<controller_manager_msgs::srv::ListHardwareComponents>::SharedPtr
655 list_hardware_components_service_;
656 rclcpp::Service<controller_manager_msgs::srv::ListHardwareInterfaces>::SharedPtr
657 list_hardware_interfaces_service_;
658 rclcpp::Service<controller_manager_msgs::srv::SetHardwareComponentState>::SharedPtr
659 set_hardware_component_state_service_;
661 std::map<std::string, std::vector<std::string>> controller_chained_reference_interfaces_cache_;
662 std::map<std::string, std::vector<std::string>> controller_chained_state_interfaces_cache_;
664 rclcpp::NodeOptions cm_node_options_;
665 std::string robot_description_;
666 rclcpp::Subscription<std_msgs::msg::String>::SharedPtr robot_description_subscription_;
667 rclcpp::TimerBase::SharedPtr robot_description_notification_timer_;
669 struct ControllerManagerExecutionTime
671 double read_time = 0.0;
672 double update_time = 0.0;
673 double write_time = 0.0;
674 double switch_time = 0.0;
675 double total_time = 0.0;
676 double switch_chained_mode_time = 0.0;
677 double switch_perform_mode_time = 0.0;
678 double deactivation_time = 0.0;
679 double activation_time = 0.0;
682 ControllerManagerExecutionTime execution_time_;
693 activate_asap =
false;
696 std::atomic_bool do_switch;
701 std::atomic_bool activate_asap;
702 std::chrono::nanoseconds timeout;
705 std::condition_variable cv;
710 const std::string controller_name = spec.info.
name;
711 return ros2_control::has_item(activate_request, controller_name) ||
712 ros2_control::has_item(deactivate_request, controller_name) ||
713 ros2_control::has_item(to_chained_mode_request, controller_name) ||
714 ros2_control::has_item(from_chained_mode_request, controller_name);
718 std::vector<std::string> activate_request;
719 std::vector<std::string> deactivate_request;
720 std::vector<std::string> to_chained_mode_request;
721 std::vector<std::string> from_chained_mode_request;
722 std::vector<std::string> activate_command_interface_request;
723 std::vector<std::string> deactivate_command_interface_request;
726 SwitchParams switch_params_;
728 struct RTBufferVariables
732 deactivate_controllers_list.reserve(1000);
733 activate_controllers_using_interfaces_list.reserve(1000);
734 fallback_controllers_list.reserve(1000);
735 interfaces_to_start.reserve(1000);
736 interfaces_to_stop.reserve(1000);
737 concatenated_string.reserve(5000);
740 const std::string & get_concatenated_string(
741 const std::vector<std::string> & strings,
bool clear_string =
true)
745 concatenated_string.clear();
747 for (
const auto & str : strings)
749 concatenated_string.append(str);
750 concatenated_string.append(
" ");
752 return concatenated_string;
755 std::vector<std::string> deactivate_controllers_list;
756 std::vector<std::string> activate_controllers_using_interfaces_list;
757 std::vector<std::string> fallback_controllers_list;
758 std::vector<std::string> interfaces_to_start;
759 std::vector<std::string> interfaces_to_stop;
760 std::string concatenated_string;
762 RTBufferVariables rt_buffer_;