Skip to content

Commit 7b65eaf

Browse files
authored
Add a method to perform the hardware command mode changes (#2203)
1 parent af0d776 commit 7b65eaf

File tree

2 files changed

+52
-20
lines changed

2 files changed

+52
-20
lines changed

controller_manager/include/controller_manager/controller_manager.hpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -375,6 +375,22 @@ class ControllerManager : public rclcpp::Node
375375
*/
376376
void clear_requests();
377377

378+
/**
379+
* Perform hardware command mode change for the given list of controllers to activate and
380+
* deactivate.
381+
* \param[in] rt_controller_list list of controllers in the real-time list.
382+
* \param[in] activate_controllers_list list of controllers to activate.
383+
* \param[in] deactivate_controllers_list list of controllers to deactivate.
384+
* \param[in] rt_cycle_name name of the real-time cycle.
385+
* \note This method is meant to be used only in the real-time control loops (`read`, `update` and
386+
* `write`).
387+
*/
388+
void perform_hardware_command_mode_change(
389+
const std::vector<ControllerSpec> & rt_controller_list,
390+
const std::vector<std::string> & activate_controllers_list,
391+
const std::vector<std::string> & deactivate_controllers_list,
392+
const std::string & rt_cycle_name);
393+
378394
/**
379395
* If a controller is deactivated all following controllers (if any exist) should be switched
380396
* 'from' the chained mode.

controller_manager/src/controller_manager.cpp

Lines changed: 36 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -2640,6 +2640,8 @@ void ControllerManager::read(const rclcpp::Time & time, const rclcpp::Duration &
26402640
rt_buffer_.get_concatenated_string(rt_buffer_.deactivate_controllers_list).c_str());
26412641
std::vector<ControllerSpec> & rt_controller_list =
26422642
rt_controllers_wrapper_.update_and_get_used_by_rt_list();
2643+
perform_hardware_command_mode_change(
2644+
rt_controller_list, {}, rt_buffer_.deactivate_controllers_list, "read");
26432645
deactivate_controllers(rt_controller_list, rt_buffer_.deactivate_controllers_list);
26442646
// TODO(destogl): do auto-start of broadcasters
26452647
}
@@ -2858,26 +2860,9 @@ controller_interface::return_type ControllerManager::update(
28582860
{ add_element_to_list(rt_buffer_.deactivate_controllers_list, controller); });
28592861

28602862
// Retrieve the interfaces to start and stop from the hardware end
2861-
rt_buffer_.interfaces_to_start.clear();
2862-
rt_buffer_.interfaces_to_stop.clear();
2863-
get_controller_list_command_interfaces(
2864-
rt_buffer_.deactivate_controllers_list, rt_controller_list, resource_manager_,
2865-
rt_buffer_.interfaces_to_stop);
2866-
get_controller_list_command_interfaces(
2867-
rt_buffer_.fallback_controllers_list, rt_controller_list, resource_manager_,
2868-
rt_buffer_.interfaces_to_start);
2869-
if (!rt_buffer_.interfaces_to_stop.empty() || !rt_buffer_.interfaces_to_start.empty())
2870-
{
2871-
if (!(resource_manager_->prepare_command_mode_switch(
2872-
rt_buffer_.interfaces_to_start, rt_buffer_.interfaces_to_stop) &&
2873-
resource_manager_->perform_command_mode_switch(
2874-
rt_buffer_.interfaces_to_start, rt_buffer_.interfaces_to_stop)))
2875-
{
2876-
RCLCPP_ERROR(
2877-
get_logger(),
2878-
"Error while attempting mode switch when deactivating controllers in update cycle!");
2879-
}
2880-
}
2863+
perform_hardware_command_mode_change(
2864+
rt_controller_list, rt_buffer_.fallback_controllers_list,
2865+
rt_buffer_.deactivate_controllers_list, "update");
28812866
deactivate_controllers(rt_controller_list, rt_buffer_.deactivate_controllers_list);
28822867
if (!rt_buffer_.fallback_controllers_list.empty())
28832868
{
@@ -2925,6 +2910,9 @@ void ControllerManager::write(const rclcpp::Time & time, const rclcpp::Duration
29252910
rt_buffer_.get_concatenated_string(rt_buffer_.deactivate_controllers_list).c_str());
29262911
std::vector<ControllerSpec> & rt_controller_list =
29272912
rt_controllers_wrapper_.update_and_get_used_by_rt_list();
2913+
2914+
perform_hardware_command_mode_change(
2915+
rt_controller_list, {}, rt_buffer_.deactivate_controllers_list, "write");
29282916
deactivate_controllers(rt_controller_list, rt_buffer_.deactivate_controllers_list);
29292917
// TODO(destogl): do auto-start of broadcasters
29302918
}
@@ -3019,6 +3007,34 @@ unsigned int ControllerManager::get_update_rate() const { return update_rate_; }
30193007

30203008
rclcpp::Clock::SharedPtr ControllerManager::get_trigger_clock() const { return trigger_clock_; }
30213009

3010+
void ControllerManager::perform_hardware_command_mode_change(
3011+
const std::vector<ControllerSpec> & rt_controller_list,
3012+
const std::vector<std::string> & activate_controllers_list,
3013+
const std::vector<std::string> & deactivate_controllers_list, const std::string & rt_cycle_name)
3014+
{
3015+
rt_buffer_.interfaces_to_start.clear();
3016+
rt_buffer_.interfaces_to_stop.clear();
3017+
get_controller_list_command_interfaces(
3018+
deactivate_controllers_list, rt_controller_list, resource_manager_,
3019+
rt_buffer_.interfaces_to_stop);
3020+
get_controller_list_command_interfaces(
3021+
activate_controllers_list, rt_controller_list, resource_manager_,
3022+
rt_buffer_.interfaces_to_start);
3023+
if (!rt_buffer_.interfaces_to_stop.empty() || !rt_buffer_.interfaces_to_start.empty())
3024+
{
3025+
if (!(resource_manager_->prepare_command_mode_switch(
3026+
rt_buffer_.interfaces_to_start, rt_buffer_.interfaces_to_stop) &&
3027+
resource_manager_->perform_command_mode_switch(
3028+
rt_buffer_.interfaces_to_start, rt_buffer_.interfaces_to_stop)))
3029+
{
3030+
RCLCPP_ERROR(
3031+
get_logger(),
3032+
"Error while attempting mode switch when deactivating controllers in %s cycle!",
3033+
rt_cycle_name.c_str());
3034+
}
3035+
}
3036+
}
3037+
30223038
void ControllerManager::propagate_deactivation_of_chained_mode(
30233039
const std::vector<ControllerSpec> & controllers)
30243040
{

0 commit comments

Comments
 (0)