Skip to content

Commit c935d03

Browse files
committed
add first complete working version
1 parent 1b216bc commit c935d03

File tree

1 file changed

+45
-1
lines changed

1 file changed

+45
-1
lines changed

controller_manager/include/controller_manager/controller_spec.hpp

Lines changed: 45 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -445,6 +445,13 @@ struct ControllerPeerInfo
445445
// All predecessors of the controller should be deactivated except the state interface ones
446446
for (const auto & predecessor : predecessors)
447447
{
448+
if (ros2_control::has_item(controllers_to_deactivate, predecessor->name))
449+
{
450+
RCLCPP_ERROR_STREAM(
451+
rclcpp::get_logger("controller_manager"),
452+
"The predecessor: " << predecessor->name << " is already in the deactivation list.");
453+
continue;
454+
}
448455
ros2_control::add_item(controllers_to_deactivate, predecessor->name);
449456
std::for_each(
450457
state_interfaces.begin(), state_interfaces.end(),
@@ -461,11 +468,48 @@ struct ControllerPeerInfo
461468
// All successors of controller with no command interfaces should be deactivated
462469
for (const auto & successor : successors)
463470
{
471+
if (ros2_control::has_item(controllers_to_deactivate, successor->name))
472+
{
473+
RCLCPP_ERROR_STREAM(
474+
rclcpp::get_logger("controller_manager"),
475+
"The successor: " << successor->name << " is already in the deactivation list.");
476+
continue;
477+
}
478+
RCLCPP_INFO(
479+
rclcpp::get_logger("controller_manager"),
480+
fmt::format(
481+
"The controllers to deactivate list is {}", fmt::join(controllers_to_deactivate, ", "))
482+
.c_str());
483+
484+
// Check if the successor is an individual exclusive group, if so, then return
485+
if (std::any_of(
486+
mutually_exclusive_successor_groups.begin(), mutually_exclusive_successor_groups.end(),
487+
[&successor](const std::unordered_set<std::string> & group)
488+
{ return group.find(successor->name) != group.end() && group.size() == 1; }))
489+
{
490+
RCLCPP_INFO_STREAM(
491+
rclcpp::get_logger("controller_manager"),
492+
"The successor: " << successor->name
493+
<< " is in a mutually exclusive group, skipping further deactivation.");
494+
continue;
495+
}
496+
464497
if (successor->command_interfaces.empty())
465498
{
466499
ros2_control::add_item(controllers_to_deactivate, successor->name);
467-
successor->get_controllers_to_deactivate(controllers_to_deactivate);
500+
RCLCPP_INFO_STREAM(
501+
rclcpp::get_logger("controller_manager"),
502+
"Adding successor: " << successor->name
503+
<< " to the deactivation list, as it has no command interfaces.");
504+
}
505+
else
506+
{
507+
RCLCPP_ERROR(
508+
rclcpp::get_logger("controller_manager"),
509+
"Controller %s has a successor %s who has command interfaces. This is not supported now.",
510+
name.c_str(), successor->name.c_str());
468511
}
512+
successor->get_controllers_to_deactivate(controllers_to_deactivate);
469513
}
470514
}
471515
};

0 commit comments

Comments
 (0)