2424#include " controller_interface/controller_interface_base.hpp"
2525#include " controller_manager_msgs/msg/hardware_component_state.hpp"
2626
27+ #include " hardware_interface/distributed_control_interface/command_forwarder.hpp"
28+ #include " hardware_interface/distributed_control_interface/state_publisher.hpp"
2729#include " hardware_interface/handle.hpp"
2830#include " hardware_interface/types/lifecycle_state_names.hpp"
2931
@@ -311,6 +313,7 @@ void ControllerManager::configure_controller_manager()
311313 if (distributed_sub_controller_manager)
312314 {
313315 add_hardware_state_publishers ();
316+ add_hardware_command_forwarders ();
314317 register_sub_controller_manager ();
315318 }
316319 // This means we are the central controller manager
@@ -353,13 +356,16 @@ void ControllerManager::register_sub_controller_manager_srv_cb(
353356
354357 auto sub_ctrl_mng_wrapper = std::make_shared<distributed_control::SubControllerManagerWrapper>(
355358 request->sub_controller_manager_namespace , request->sub_controller_manager_name ,
356- request->state_publishers );
359+ request->state_publishers , request-> command_state_publishers );
357360
358- std::vector<std::shared_ptr<hardware_interface::DistributedReadOnlyHandle>> state_interfaces;
359- state_interfaces.reserve (sub_ctrl_mng_wrapper->get_state_publisher_count ());
360- state_interfaces = resource_manager_->register_sub_controller_manager (sub_ctrl_mng_wrapper);
361+ resource_manager_->register_sub_controller_manager (sub_ctrl_mng_wrapper);
361362
362- for (const auto & state_interface : state_interfaces)
363+ std::vector<std::shared_ptr<hardware_interface::DistributedReadOnlyHandle>>
364+ distributed_state_interfaces;
365+ distributed_state_interfaces =
366+ resource_manager_->import_state_interfaces_of_sub_controller_manager (sub_ctrl_mng_wrapper);
367+
368+ for (const auto & state_interface : distributed_state_interfaces)
363369 {
364370 try
365371 {
@@ -376,6 +382,36 @@ void ControllerManager::register_sub_controller_manager_srv_cb(
376382 }
377383 }
378384
385+ std::vector<std::shared_ptr<hardware_interface::DistributedReadWriteHandle>>
386+ distributed_command_interfaces;
387+ distributed_command_interfaces =
388+ resource_manager_->import_command_interfaces_of_sub_controller_manager (sub_ctrl_mng_wrapper);
389+
390+ for (const auto & command_interface : distributed_command_interfaces)
391+ {
392+ try
393+ {
394+ executor_->add_node (command_interface->get_node ()->get_node_base_interface ());
395+ auto msg = controller_manager_msgs::msg::PublisherDescription ();
396+ msg.ns = get_namespace ();
397+ msg.name .prefix_name = command_interface->get_prefix_name ();
398+ msg.name .interface_name = command_interface->get_interface_name ();
399+ // want topic name relative to namespace
400+ msg.publisher_topic = std::string (get_namespace ()) + std::string (" /" ) +
401+ command_interface->forward_command_topic_name ();
402+ response->command_state_publishers .push_back (msg);
403+ }
404+ catch (const std::runtime_error & e)
405+ {
406+ response->ok = false ;
407+ RCLCPP_WARN_STREAM (
408+ get_logger (),
409+ " ControllerManager: Caught exception while trying to register sub controller manager. "
410+ " Exception:"
411+ << e.what ());
412+ }
413+ }
414+
379415 response->ok = true ;
380416 RCLCPP_INFO_STREAM (
381417 get_logger (), " ControllerManager: Registered sub controller manager <"
@@ -403,6 +439,27 @@ void ControllerManager::add_hardware_state_publishers()
403439 }
404440}
405441
442+ void ControllerManager::add_hardware_command_forwarders ()
443+ {
444+ std::vector<std::shared_ptr<distributed_control::CommandForwarder>> command_forwarder_vec;
445+ command_forwarder_vec.reserve (resource_manager_->available_command_interfaces ().size ());
446+ command_forwarder_vec = resource_manager_->create_hardware_command_forwarders (get_namespace ());
447+
448+ for (auto const & command_forwarder : command_forwarder_vec)
449+ {
450+ try
451+ {
452+ executor_->add_node (command_forwarder->get_node ()->get_node_base_interface ());
453+ }
454+ catch (const std::runtime_error & e)
455+ {
456+ RCLCPP_WARN_STREAM (
457+ get_logger (), " ControllerManager: Can't create StatePublishers<"
458+ << command_forwarder->command_interface_name () << " >." << e.what ());
459+ }
460+ }
461+ }
462+
406463void ControllerManager::register_sub_controller_manager ()
407464{
408465 RCLCPP_INFO (get_logger (), " SubControllerManager:Trying to register StatePublishers." );
@@ -421,7 +478,17 @@ void ControllerManager::register_sub_controller_manager()
421478 // create description of StatePublisher including: prefix_name, interface_name and topic.
422479 // So that receiver is able to create a DistributedStateInterface which subscribes to the
423480 // topics provided by this sub controller manager
424- request->state_publishers .push_back (state_publisher->create_description_msg ());
481+ request->state_publishers .push_back (state_publisher->create_publisher_description_msg ());
482+ }
483+
484+ // export the provided CommandForwarders
485+ for (auto const & command_forwarders : resource_manager_->get_command_forwarders ())
486+ {
487+ // create description of StatePublisher including: prefix_name, interface_name and topic.
488+ // So that receiver is able to create a DistributedStateInterface which subscribes to the
489+ // topics provided by this sub controller manager
490+ request->command_state_publishers .push_back (
491+ command_forwarders->create_publisher_description_msg ());
425492 }
426493
427494 using namespace std ::chrono_literals;
@@ -447,6 +514,15 @@ void ControllerManager::register_sub_controller_manager()
447514 rclcpp::FutureReturnCode::SUCCESS) &&
448515 result.get ()->ok )
449516 {
517+ // TODO(Manuel) we should probably make the keys explicit (add key_generation function to handles)
518+ // send keys with request
519+ for (auto command_state_publisher : result.get ()->command_state_publishers )
520+ {
521+ std::string key = command_state_publisher.name .prefix_name + " /" +
522+ command_state_publisher.name .interface_name ;
523+ // auto command_forwarder = resource_manager_->find_command_forwarder(key);
524+ // command_forwarder->subscribe_to_command(command_state_publisher);
525+ }
450526 RCLCPP_INFO (get_logger (), " SubControllerManager: Successfully registered StatePublishers." );
451527 }
452528 else
0 commit comments