diff --git a/canopen_core/include/canopen_core/device_container.hpp b/canopen_core/include/canopen_core/device_container.hpp index 0047dd311..49909e059 100644 --- a/canopen_core/include/canopen_core/device_container.hpp +++ b/canopen_core/include/canopen_core/device_container.hpp @@ -137,7 +137,7 @@ class DeviceContainer : public rclcpp_components::ComponentManager virtual bool load_component( const std::string package_name, const std::string driver_name, const uint16_t node_id, const std::string node_name, std::vector & params, - const std::string node_namespace = ""); + std::map remappings, const std::string node_namespace = ""); /** * @brief Shutdown all devices. diff --git a/canopen_core/src/device_container.cpp b/canopen_core/src/device_container.cpp index edfb7a35a..5017956cc 100644 --- a/canopen_core/src/device_container.cpp +++ b/canopen_core/src/device_container.cpp @@ -34,7 +34,7 @@ bool DeviceContainer::init_driver(uint16_t node_id) bool DeviceContainer::load_component( const std::string package_name, const std::string driver_name, const uint16_t node_id, const std::string node_name, std::vector & params, - const std::string node_namespace) + std::map remappings, const std::string node_namespace) { ComponentResource component; std::string resource_index("rclcpp_components"); @@ -62,6 +62,13 @@ bool DeviceContainer::load_component( remap_rules.push_back("-r"); remap_rules.push_back("__ns:=" + canopen_ns); + // Remappings + for (auto it = remappings.begin(); it != remappings.end(); it++) + { + remap_rules.push_back("-r"); + remap_rules.push_back(it->first + ":=" + it->second); + } + if (node_namespace.empty()) { RCLCPP_WARN( @@ -230,6 +237,8 @@ bool DeviceContainer::load_master() auto driver_name = config_->get_entry(*it, "driver"); auto package_name = config_->get_entry(*it, "package"); auto node_namespace = config_->get_entry(*it, "namespace").value_or(""); + auto remappings = config_->get_entry> + (*it, "remappings").value_or(std::map()); if (!node_id.has_value() || !driver_name.has_value() || !package_name.has_value()) { RCLCPP_ERROR( @@ -247,7 +256,7 @@ bool DeviceContainer::load_master() if (!this->load_component( package_name.value(), driver_name.value(), node_id.value(), *it, params, - node_namespace)) + remappings, node_namespace)) { RCLCPP_ERROR(this->get_logger(), "Error: Loading master failed."); return false; @@ -287,6 +296,9 @@ bool DeviceContainer::load_drivers() auto driver_name = config_->get_entry(*it, "driver"); auto package_name = config_->get_entry(*it, "package"); auto node_namespace = config_->get_entry(*it, "namespace").value_or(""); + auto remappings = config_->get_entry> + (*it, "remappings").value_or(std::map()); + if (!node_id.has_value() || !driver_name.has_value() || !package_name.has_value()) { RCLCPP_ERROR( @@ -323,7 +335,7 @@ bool DeviceContainer::load_drivers() if (!this->load_component( package_name.value(), driver_name.value(), node_id.value(), *it, params, - node_namespace)) + remappings, node_namespace)) { RCLCPP_ERROR( this->get_logger(),