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