@@ -4304,6 +4304,27 @@ void ControllerManager::build_controllers_topology_info(
4304
4304
std::for_each (
4305
4305
controller_chained_state_interfaces_cache_.begin (),
4306
4306
controller_chained_state_interfaces_cache_.end (), [](auto & pair) { pair.second .clear (); });
4307
+
4308
+ const auto get_controller_peer_info = [&](const ControllerSpec & controller) -> ControllerPeerInfo
4309
+ {
4310
+ const auto cmd_itfs = controller.c ->command_interface_configuration ().names ;
4311
+ const auto state_itfs = controller.c ->state_interface_configuration ().names ;
4312
+ ControllerPeerInfo controller_peer_info;
4313
+ controller_peer_info.name = controller.info .name ;
4314
+ controller_peer_info.command_interfaces =
4315
+ std::unordered_set<std::string>(cmd_itfs.begin (), cmd_itfs.end ());
4316
+ controller_peer_info.state_interfaces =
4317
+ std::unordered_set<std::string>(state_itfs.begin (), state_itfs.end ());
4318
+ controller_peer_info.controller = controller.c ;
4319
+ if (controller.c ->is_chainable ())
4320
+ {
4321
+ const auto ref_interface =
4322
+ resource_manager_->get_controller_reference_interface_names (controller.info .name );
4323
+ controller_peer_info.reference_interfaces =
4324
+ std::unordered_set<std::string>(ref_interface.begin (), ref_interface.end ());
4325
+ }
4326
+ return controller_peer_info;
4327
+ };
4307
4328
for (const auto & controller : controllers)
4308
4329
{
4309
4330
if (is_controller_unconfigured (*controller.c ))
@@ -4316,11 +4337,15 @@ void ControllerManager::build_controllers_topology_info(
4316
4337
const auto cmd_itfs = controller.c ->command_interface_configuration ().names ;
4317
4338
const auto state_itfs = controller.c ->state_interface_configuration ().names ;
4318
4339
4340
+ ControllerPeerInfo controller_peer_info = get_controller_peer_info (controller);
4319
4341
for (const auto & cmd_itf : cmd_itfs)
4320
4342
{
4321
4343
controller_manager::ControllersListIterator ctrl_it;
4322
4344
if (is_interface_a_chained_interface (cmd_itf, controllers, ctrl_it))
4323
4345
{
4346
+ ControllerPeerInfo succeeding_peer_info = get_controller_peer_info (*ctrl_it);
4347
+ controller_chain_dependency_graph_.add_dependency (
4348
+ controller_peer_info, succeeding_peer_info);
4324
4349
ros2_control::add_item (
4325
4350
controller_chain_spec_[controller.info .name ].following_controllers , ctrl_it->info .name );
4326
4351
ros2_control::add_item (
0 commit comments