From 0828bd42e97d9135ce98cd7ae0e7acdeab703c2b Mon Sep 17 00:00:00 2001 From: leolol <leoja464@student.liu.se> Date: Mon, 27 Jan 2025 13:05:10 +0000 Subject: [PATCH] fun seg fault --- src/dyknow_echo/CMakeLists.txt | 20 +- src/dyknow_echo/src/echo.cpp | 3 +- src/dyknow_echo/src/echoComposition.cpp | 56 +++- src/dyknow_manager/CMakeLists.txt | 25 +- .../dyknow_manager/compunit_helper.hpp | 2 + .../dyknow_manager/configuration_manager.hpp | 13 +- src/dyknow_manager/src/change.cpp | 2 +- src/dyknow_manager/src/compunit_helper.cpp | 54 ++-- .../src/configuration_manager.cpp | 276 +++++++++--------- src/dyknow_manager/src/environment.cpp | 26 +- src/dyknow_manager/src/manager_componet.cpp | 8 +- .../src/transformation_spec.cpp | 4 +- .../include/dyknow_nodehandle/node.hpp | 3 - 13 files changed, 275 insertions(+), 217 deletions(-) diff --git a/src/dyknow_echo/CMakeLists.txt b/src/dyknow_echo/CMakeLists.txt index 9b2a3c0..25d31a6 100644 --- a/src/dyknow_echo/CMakeLists.txt +++ b/src/dyknow_echo/CMakeLists.txt @@ -11,6 +11,7 @@ find_package(rclcpp REQUIRED) find_package(rclcpp_components REQUIRED) find_package(dyknow_nodehandle REQUIRED) find_package(dyknow_analytics REQUIRED) +find_package(composition_interfaces REQUIRED) # include_directories( # include @@ -20,8 +21,8 @@ find_package(dyknow_analytics REQUIRED) # Declare a shared library add_library(dyknow_echo_component SHARED - src/echo.cpp - #src/echoComposition.cpp # Change to the composition version + #src/echo.cpp + src/echoComposition.cpp # Change to the composition version ) target_include_directories(dyknow_echo_component @@ -35,18 +36,19 @@ ament_target_dependencies(dyknow_echo_component rclcpp_components dyknow_nodehandle dyknow_analytics + composition_interfaces ) +# rclcpp_components_register_node(dyknow_echo_component +# PLUGIN "echo::Echo" +# EXECUTABLE dyknow_echo +# ) + rclcpp_components_register_node(dyknow_echo_component - PLUGIN "echo::Echo" - EXECUTABLE dyknow_echo + PLUGIN "echo::EchoComp" + EXECUTABLE dyknow_echo ) -#rclcpp_components_register_node(dyknow_echo_component -# PLUGIN "echo::EchoComp" -# EXECUTABLE dyknow_echo -#) - install(TARGETS dyknow_echo_component EXPORT export_dyknow_echo_component diff --git a/src/dyknow_echo/src/echo.cpp b/src/dyknow_echo/src/echo.cpp index 331d54f..e181239 100644 --- a/src/dyknow_echo/src/echo.cpp +++ b/src/dyknow_echo/src/echo.cpp @@ -21,8 +21,7 @@ namespace echo { //copy.header = sample->header; //copy.valid_time = sample->valid_time; copy.test = sample->test; - //RCLCPP_INFO(this->get_logger(), "I LIVE, AM I ALIVE, I AM MEEEEE "); - RCLCPP_INFO(this->get_logger(), this->getOutputs()[0].c_str()); + RCLCPP_INFO(this->get_logger(), "I LIVE, AM I ALIVE, I AM MEEEEE "); pub.publish(copy); } diff --git a/src/dyknow_echo/src/echoComposition.cpp b/src/dyknow_echo/src/echoComposition.cpp index 4bce894..5af9000 100644 --- a/src/dyknow_echo/src/echoComposition.cpp +++ b/src/dyknow_echo/src/echoComposition.cpp @@ -1,5 +1,6 @@ #include "dyknow_echo/echoComposition.hpp" #include <rclcpp_components/register_node_macro.hpp> +#include <composition_interfaces/srv/load_node.hpp> namespace echo { @@ -8,26 +9,63 @@ namespace echo { { int arity = 10; for(int i = 0; i < arity; i++) { - node->create_subscription<dyknow_nodehandle::msg::Sample, EchoComp>(1000, &EchoComp::callback, this); + node->create_subscription<dyknow_interfaces::msg::Sample, EchoComp>(1000, &EchoComp::callback, this); } node->connectInput("_1", "in"); - pub = node->create_publisher<dyknow_nodehandle::msg::Sample>(1000); + pub = node->create_publisher<dyknow_interfaces::msg::Sample>(1000); node->connectOutput("/1", "out"); } - rclcpp::node_interfaces::NodeBaseInterface::SharedPtr EchoComp::get_node_base_interface() const { return this->node->get_node_base_interface(); } - - void EchoComp::callback(std::shared_ptr<dyknow_nodehandle::msg::Sample>& sample) { - dyknow_nodehandle::msg::Sample copy; - copy.fields = sample->fields; - copy.header = sample->header; - copy.valid_time = sample->valid_time; + void EchoComp::callback(std::shared_ptr<dyknow_interfaces::msg::Sample>& sample) { + dyknow_interfaces::msg::Sample copy; + //copy.fields = sample->fields; + //copy.header = sample->header; + //copy.valid_time = sample->valid_time; + copy.test = sample->test; RCLCPP_INFO(node->get_logger(), "I LIVE, AM I ALIVE, I AM MEEEEE "); + + rclcpp::Client<composition_interfaces::srv::LoadNode>::SharedPtr client = node->create_client<composition_interfaces::srv::LoadNode>("load_node"); + + auto loadComponentService = std::make_shared<composition_interfaces::srv::LoadNode::Request>(); + + loadComponentService->plugin_name = "AAAAAAA"; + + // Wait for the service to be available + if (!client->wait_for_service(std::chrono::seconds(10))) // fun segmentation fault after this timer is up + { + RCLCPP_ERROR(node->get_logger(), "Service %s/load_nodelet not available"); + return; + } + RCLCPP_INFO(node->get_logger(), ""); + + + // Call the service + try + { + auto result = client->async_send_request(loadComponentService); + if (rclcpp::spin_until_future_complete(this->node, result) == + rclcpp::FutureReturnCode::SUCCESS) + { + RCLCPP_INFO(this->node->get_logger(), "Successfully spawned nodelet"); + return; + } + else + { + RCLCPP_ERROR(this->node->get_logger(), "Unable to call service for with source "); + return; + } + } + catch (const std::exception &e) + { + RCLCPP_ERROR(this->node->get_logger(), "Exception while calling service: %s", e.what()); + return; + } + pub.publish(copy); } diff --git a/src/dyknow_manager/CMakeLists.txt b/src/dyknow_manager/CMakeLists.txt index 57b94d2..91df589 100644 --- a/src/dyknow_manager/CMakeLists.txt +++ b/src/dyknow_manager/CMakeLists.txt @@ -14,27 +14,28 @@ find_package(dyknow_nodehandle REQUIRED) find_package(dyknow_analytics REQUIRED) find_package(rosidl_default_generators REQUIRED) -# include_directories( # Testing if this part is needed or not.... -# include -# ${rclcpp_INCLUDE_DIRS} -# ${dyknow_nodehandle_INCLUDE_DIRS} -# ${dyknow_analytics_INCLUDE_DIRS} -# ) - # Define our target, should this not be all of our cpp files? add_library(${PROJECT_NAME} SHARED src/manager_componet.cpp - #src/configuration_manager.cpp # if this is included the project fails to compile + src/configuration_manager.cpp + src/transformation_spec.cpp + src/environment.cpp + src/change.cpp + src/compunit_helper.cpp + + ) # this should be all the source files that are requierd for compiling the lib -target_include_directories(${PROJECT_NAME} PUBLIC +target_include_directories(${PROJECT_NAME} + PUBLIC "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>" "$<INSTALL_INTERFACE:include>" ) # Link dependencies to our target ,hmmm # For this we might instead conider using target_link_libraries, works the same but with namespaces -ament_target_dependencies(${PROJECT_NAME} +ament_target_dependencies( + ${PROJECT_NAME} rclcpp rclcpp_components dyknow_nodehandle @@ -45,6 +46,7 @@ rclcpp_components_register_node(${PROJECT_NAME} PLUGIN "manager::ManagerComponet" EXECUTABLE dyknow_manager_componet ) + install( TARGETS ${PROJECT_NAME} EXPORT export_${PROJECT_NAME} @@ -60,13 +62,10 @@ install( ) # This will tell any packages downstream what dependencies that this library has to we dont need to call add_packages for them too -#ament_export_dependencies(some_dependency) - ament_export_targets(export_${PROJECT_NAME} HAS_LIBRARY_TARGET) ament_export_dependencies(dyknow_nodehandle) ament_export_include_directories(include) - ament_package() diff --git a/src/dyknow_manager/include/dyknow_manager/compunit_helper.hpp b/src/dyknow_manager/include/dyknow_manager/compunit_helper.hpp index 9ca5182..7579bf0 100644 --- a/src/dyknow_manager/include/dyknow_manager/compunit_helper.hpp +++ b/src/dyknow_manager/include/dyknow_manager/compunit_helper.hpp @@ -13,6 +13,8 @@ #include "dyknow_nodehandle/node.hpp" #include "transformation_spec.hpp" +#include <composition_interfaces/srv/load_node.hpp> + namespace dyknow { diff --git a/src/dyknow_manager/include/dyknow_manager/configuration_manager.hpp b/src/dyknow_manager/include/dyknow_manager/configuration_manager.hpp index 2fd8fd6..3edfd37 100644 --- a/src/dyknow_manager/include/dyknow_manager/configuration_manager.hpp +++ b/src/dyknow_manager/include/dyknow_manager/configuration_manager.hpp @@ -23,7 +23,7 @@ #include "dyknow_interfaces/srv/exp_populate.hpp" #include "dyknow_interfaces/msg/unit.hpp" #include "dyknow_interfaces/msg/transformation.hpp" -#include "dyknow_interfaces/srv/configure.hpp" +#include "dyknow_interfaces/srv/manager_configure.hpp" #include "dyknow_interfaces/msg/connection.hpp" #include "dyknow_interfaces/msg/target.hpp" #include "dyknow_interfaces/srv/get_valid_inputs.hpp" @@ -45,7 +45,7 @@ public: , removeTransformationService(nh->create_service<dyknow_interfaces::srv::RemoveTransformation>("remove_transformation", std::bind(&ConfigurationManager::removeTransformationCallback, this, std::placeholders::_1, std::placeholders::_2))) , spawnService(nh->create_service<dyknow_interfaces::srv::Spawn>("spawn", std::bind(&ConfigurationManager::spawnCallback, this, std::placeholders::_1, std::placeholders::_2))) , destroyService(nh->create_service<dyknow_interfaces::srv::Destroy>("destroy", std::bind(&ConfigurationManager::destroyCallback, this, std::placeholders::_1, std::placeholders::_2))) - , configureService(nh->create_service<dyknow_interfaces::srv::Configure>("configure", std::bind(&ConfigurationManager::configureCallback, this, std::placeholders::_1, std::placeholders::_2))) + , configureService(nh->create_service<dyknow_interfaces::srv::ManagerConfigure>("configure", std::bind(&ConfigurationManager::configureCallback, this, std::placeholders::_1, std::placeholders::_2))) , addTargetService(nh->create_service<dyknow_interfaces::srv::AddTarget>("add_target", std::bind(&ConfigurationManager::addTargetCallback, this, std::placeholders::_1, std::placeholders::_2))) , removeTargetService(nh->create_service<dyknow_interfaces::srv::RemoveTarget>("remove_target", std::bind(&ConfigurationManager::removeTargetCallback, this, std::placeholders::_1, std::placeholders::_2))) , refreshService(nh->create_service<dyknow_interfaces::srv::Refresh>("refresh", std::bind(&ConfigurationManager::refreshCallback, this, std::placeholders::_1, std::placeholders::_2))) @@ -71,7 +71,7 @@ public: void removeTransformationCallback(const std::shared_ptr<dyknow_interfaces::srv::RemoveTransformation::Request> req, std::shared_ptr<dyknow_interfaces::srv::RemoveTransformation::Response> res); void spawnCallback(const std::shared_ptr<dyknow_interfaces::srv::Spawn::Request> req, std::shared_ptr<dyknow_interfaces::srv::Spawn::Response> res); void destroyCallback(const std::shared_ptr<dyknow_interfaces::srv::Destroy::Request> req, std::shared_ptr<dyknow_interfaces::srv::Destroy::Response> res); - void configureCallback(const std::shared_ptr<dyknow_interfaces::srv::Configure::Request> req, std::shared_ptr<dyknow_interfaces::srv::Configure::Response> res); + void configureCallback(const std::shared_ptr<dyknow_interfaces::srv::ManagerConfigure::Request> req, std::shared_ptr<dyknow_interfaces::srv::ManagerConfigure::Response> res); void addTargetCallback(const std::shared_ptr<dyknow_interfaces::srv::AddTarget::Request> req, std::shared_ptr<dyknow_interfaces::srv::AddTarget::Response> res); void removeTargetCallback(const std::shared_ptr<dyknow_interfaces::srv::RemoveTarget::Request> req, std::shared_ptr<dyknow_interfaces::srv::RemoveTarget::Response> res); void refreshCallback(const std::shared_ptr<dyknow_interfaces::srv::Refresh::Request> req, std::shared_ptr<dyknow_interfaces::srv::Refresh::Response> res); @@ -103,7 +103,7 @@ private: rclcpp::Service<dyknow_interfaces::srv::RemoveTransformation>::SharedPtr removeTransformationService; rclcpp::Service<dyknow_interfaces::srv::Spawn>::SharedPtr spawnService; rclcpp::Service<dyknow_interfaces::srv::Destroy>::SharedPtr destroyService; - rclcpp::Service<dyknow_interfaces::srv::Configure>::SharedPtr configureService; + rclcpp::Service<dyknow_interfaces::srv::ManagerConfigure>::SharedPtr configureService; rclcpp::Service<dyknow_interfaces::srv::AddTarget>::SharedPtr addTargetService; rclcpp::Service<dyknow_interfaces::srv::RemoveTarget>::SharedPtr removeTargetService; rclcpp::Service<dyknow_interfaces::srv::Refresh>::SharedPtr refreshService; @@ -114,9 +114,6 @@ private: std::mutex envAccess; }; - } //namespace - - -#endif /* INCLUDE_CONFIGURATION_MANAGER_HPP_ */ +#endif /* INCLUDE_CONFIGURATION_MANAGER_HPP_ */ \ No newline at end of file diff --git a/src/dyknow_manager/src/change.cpp b/src/dyknow_manager/src/change.cpp index 75c19ab..4b05fab 100644 --- a/src/dyknow_manager/src/change.cpp +++ b/src/dyknow_manager/src/change.cpp @@ -1,4 +1,4 @@ -#include "change.hpp" +#include "dyknow_manager/change.hpp" namespace dyknow { diff --git a/src/dyknow_manager/src/compunit_helper.cpp b/src/dyknow_manager/src/compunit_helper.cpp index faeeb9b..11bf653 100644 --- a/src/dyknow_manager/src/compunit_helper.cpp +++ b/src/dyknow_manager/src/compunit_helper.cpp @@ -1,66 +1,74 @@ -#include "compunit_helper.hpp" +#include "dyknow_manager/compunit_helper.hpp" namespace dyknow { -bool CompUnitHelper::spawn(dyknow::NodeHandle& nh, const std::string& manager, const std::string& name, const std::string& source, std::vector<std::string>& args) { +bool CompUnitHelper::spawn(std::shared_ptr<dyknow::Node> nh, const std::string& manager, const std::string& name, const std::string& source, std::vector<std::string>& args) { if(source == "") { - ROS_WARN("Failed to spawn: %s does not provide a source", name.c_str()); + RCLCPP_WARN(nh->get_logger(), "Failed to spawn: %s does not provide a source", name.c_str()); return false; } - ros::ServiceClient client = nh.serviceClient<nodelet::NodeletLoad>(manager + "/load_nodelet"); - nodelet::NodeletLoad loadNodeletService; - loadNodeletService.request.name = name; - loadNodeletService.request.type = source; - loadNodeletService.request.my_argv = args; + + // ros2 run rclcpp_components component_container + // ros2 service call /ComponentManager/_container/load_node composition_interfaces/srv/LoadNode "{ package_name: "nav2_planner", plugin_name: "nav2_planner::PlannerServer", parameters: [ {name: "global_costmap.global_costmap.resolution", value: { type: 3, double_value: "1.23"}}]}" + // above is the special sause that we will use to make this work, we need to at this point call a service from a component that we can use to lanuch another component + + rclcpp::Client<composition_interfaces::srv::LoadNode>::SharedPtr client = nh->create_client<composition_interfaces::srv::LoadNode>("load_node"); + + //composition_interfaces::srv::LoadNode loadComponentService; + auto loadComponentService = std::make_shared<composition_interfaces::srv::LoadNode::Request>(); + + loadComponentService->plugin_name = name; + //loadComponentService.request.type = source; + //loadComponentService.request.my_argv = args; if (client.call(loadNodeletService)) { - ROS_INFO("Successfully spawned nodelet %s", name.c_str()); + RCLCPP_INFO(nh->get_logger(), "Successfully spawned nodelet %s", name.c_str()); return true; } else { - ROS_ERROR("Unable to call service for %s with source %s", name.c_str(), source.c_str()); + RCLCPP_ERROR(nh->get_logger(), "Unable to call service for %s with source %s", name.c_str(), source.c_str()); return false; } } -bool CompUnitHelper::configure(dyknow::NodeHandle& nh, const std::string& manager, std::string name, std::map<std::string, std::string> inputMap, std::map<std::string, std::string> outputMap) { +bool CompUnitHelper::configure(std::shared_ptr<dyknow::Node> nh, const std::string& manager, std::string name, std::map<std::string, std::string> inputMap, std::map<std::string, std::string> outputMap) { ros::ServiceClient client = nh.serviceClient<dyknow_nodehandle::Configure>("/"+name+"/set_config"); dyknow_nodehandle::Configure configureService; - std::pair<std::string, std::string> elem; - BOOST_FOREACH(elem, outputMap) { + //std::pair<std::string, std::string> elem; + for_each(outputMap.begin(), outputMap.end(), [&configureService](std::pair<std::string, std::string> elem) { configureService.request.config.out_names.push_back(elem.second); configureService.request.config.out_channels.push_back(elem.first); - } + }); - BOOST_FOREACH(elem, inputMap) { + for_each(inputMap.begin(), inputMap.end(), [&configureService](std::pair<std::string, std::string> elem) { configureService.request.config.in_names.push_back(elem.second); configureService.request.config.in_channels.push_back(elem.first); - } + }); configureService.request.config.manager = manager; if (client.call(configureService)) { if(!configureService.response.success) { - ROS_ERROR("Failed to configure nodelet %s", name.c_str()); + RCLCPP_ERROR(nh->get_logger(), "Failed to configure nodelet %s", name.c_str()); } else { - ROS_INFO("Successfully configured nodelet %s", name.c_str()); + RCLCPP_INFO(nh->get_logger(), "Successfully configured nodelet %s", name.c_str()); } return true; } else { - ROS_ERROR("Unable to configure nodelet %s", name.c_str()); + RCLCPP_ERROR(nh->get_logger(), "Unable to configure nodelet %s", name.c_str()); return false; } } -bool CompUnitHelper::destroy(dyknow::NodeHandle& nh, const std::string& manager, const std::string& name) { +bool CompUnitHelper::destroy(std::shared_ptr<dyknow::Node> nh, const std::string& manager, const std::string& name) { ros::ServiceClient unloadClient = nh.serviceClient<nodelet::NodeletUnload>("/" + manager + "/unload_nodelet"); nodelet::NodeletUnload unloadService; @@ -70,17 +78,17 @@ bool CompUnitHelper::destroy(dyknow::NodeHandle& nh, const std::string& manager, if (unloadClient.call(unloadService)) { if(!unloadService.response.success) { - ROS_ERROR("Unable to unload nodelet %s: failure while unloading", name.c_str()); + RCLCPP_ERROR(nh->get_logger(), "Unable to unload nodelet %s: failure while unloading", name.c_str()); return false; } else { - ROS_INFO("Successfully unloaded nodelet %s", name.c_str()); + RCLCPP_INFO(nh->get_logger(), "Successfully unloaded nodelet %s", name.c_str()); return true; } } else { - ROS_ERROR("Unable to unload nodelet %s: service unavailable", name.c_str()); + RCLCPP_ERROR(nh->get_logger(), "Unable to unload nodelet %s: service unavailable", name.c_str()); return false; } } diff --git a/src/dyknow_manager/src/configuration_manager.cpp b/src/dyknow_manager/src/configuration_manager.cpp index 4b7add1..da816b3 100644 --- a/src/dyknow_manager/src/configuration_manager.cpp +++ b/src/dyknow_manager/src/configuration_manager.cpp @@ -1,4 +1,4 @@ -#include "configuration_manager.hpp" +#include "dyknow_manager/configuration_manager.hpp" namespace dyknow { @@ -8,19 +8,19 @@ void ConfigurationManager::createEnvironment(int id, std::string manager) { environments.push_back(env); } -void ConfigurationManager::getConfigurationCallback(const std::shared_ptr<dyknow_manager::GetConfiguration::Request> req, std::shared_ptr<dyknow_manager::GetConfiguration::Response> res) { +void ConfigurationManager::getConfigurationCallback(const std::shared_ptr<dyknow_interfaces::srv::GetConfiguration::Request> req, std::shared_ptr<dyknow_interfaces::srv::GetConfiguration::Response> res) { std::lock_guard<std::mutex> guard(envAccess); for (auto& env : environments) { std::vector<ComputationUnit> computationUnits = env.getComputationUnits(); for (auto& cu : computationUnits) { - dyknow_manager::Unit unit; + dyknow_interfaces::msg::Unit unit; unit.label = cu.name; unit.type = cu.type; unit.environment = env.getId(); std::map<std::string, Subscription> subscriptionMap = env.getSubscriptions(); for (auto& pair1 : subscriptionMap[cu.name]) { - dyknow_manager::Connection con; + dyknow_interfaces::msg::Connection con; con.port = pair1.first; con.topic = pair1.second; unit.incoming.push_back(con); @@ -28,18 +28,18 @@ void ConfigurationManager::getConfigurationCallback(const std::shared_ptr<dyknow std::map<std::string, Generator> generatorMap = env.getGenerators(); for (auto& pair2 : generatorMap[cu.name]) { - dyknow_manager::Connection con; + dyknow_interfaces::msg::Connection con; con.port = pair2.first; con.topic = pair2.second; unit.outgoing.push_back(con); } - res.units.push_back(unit); + res->units.push_back(unit); } std::vector<TransformationSpec> transformations = env.getTransformations(); for (auto& spec : transformations) { - dyknow_manager::Transformation tf; + dyknow_interfaces::msg::Transformation tf; tf.label = spec.label; tf.source = spec.source; tf.in_ports = spec.inPorts; @@ -48,231 +48,244 @@ void ConfigurationManager::getConfigurationCallback(const std::shared_ptr<dyknow //TODO: Type, tag and params tf.environment = env.getId(); - res.transformations.push_back(tf); + res->transformations.push_back(tf); } std::vector<TargetSpec> targets = env.getTargets(); for (auto& targetSpec : targets) { - dyknow_manager::Target tgt; + dyknow_interfaces::msg::Target tgt; tgt.label = targetSpec.label; tgt.port = targetSpec.port; tgt.topic = targetSpec.topic; tgt.environment = env.getId(); - res.targets.push_back(tgt); + res->targets.push_back(tgt); } } return; } -void ConfigurationManager::addTransformationCallback(const std::shared_ptr<dyknow_manager::AddTransformation::Request> req, std::shared_ptr<dyknow_manager::AddTransformation::Response> res) { +void ConfigurationManager::addTransformationCallback(const std::shared_ptr<dyknow_interfaces::srv::AddTransformation::Request> req, std::shared_ptr<dyknow_interfaces::srv::AddTransformation::Response> res) { Change delta; - for (auto& tfSpec : req.transformations) { + for (auto& tfSpec : req->transformations) { TransformationSpec spec = TransformationFactory::create(tfSpec); AddCommand* cmdPtr = new AddCommand(spec); delta.add(cmdPtr); } - enqueue(std::pair<int, Change>(req.envId, delta)); - res.success = true; + enqueue(std::pair<int, Change>(req->envid, delta)); + res->success = true; return; } -void ConfigurationManager::removeTransformationCallback(const std::shared_ptr<dyknow_manager::RemoveTransformation::Request> req, std::shared_ptr<dyknow_manager::RemoveTransformation::Response> res) { +void ConfigurationManager::removeTransformationCallback(const std::shared_ptr<dyknow_interfaces::srv::RemoveTransformation::Request> req, std::shared_ptr<dyknow_interfaces::srv::RemoveTransformation::Response> res) { Change delta; - for (auto& label : req.transformations) { + for (auto& label : req->transformations) { RemoveCommand* cmdPtr = new RemoveCommand(label); delta.add(cmdPtr); } - enqueue(std::pair<int, Change>(req.envId, delta)); - res.success = true; + enqueue(std::pair<int, Change>(req->envid, delta)); + res->success = true; return; } -void ConfigurationManager::spawnCallback(const std::shared_ptr<dyknow_manager::Spawn::Request> req, std::shared_ptr<dyknow_manager::Spawn::Response> res) { +void ConfigurationManager::spawnCallback(const std::shared_ptr<dyknow_interfaces::srv::Spawn::Request> req, std::shared_ptr<dyknow_interfaces::srv::Spawn::Response> res) { Change delta; - SpawnCommand* cmdPtr = new SpawnCommand(req.name, req.type, req.protect); + SpawnCommand* cmdPtr = new SpawnCommand(req->name, req->type, req->protect); delta.add(cmdPtr); - enqueue(std::pair<int, Change>(req.envId, delta)); - res.success = true; + enqueue(std::pair<int, Change>(req->envid, delta)); + res->success = true; return; } -void ConfigurationManager::destroyCallback(const std::shared_ptr<dyknow_manager::Destroy::Request> req, std::shared_ptr<dyknow_manager::Destroy::Response> res) { +void ConfigurationManager::destroyCallback(const std::shared_ptr<dyknow_interfaces::srv::Destroy::Request> req, std::shared_ptr<dyknow_interfaces::srv::Destroy::Response> res) { Change delta; - DestroyCommand* cmdPtr = new DestroyCommand(req.name); + DestroyCommand* cmdPtr = new DestroyCommand(req->name); delta.add(cmdPtr); - enqueue(std::pair<int, Change>(req.envId, delta)); - res.success = true; + enqueue(std::pair<int, Change>(req->envid, delta)); + res->success = true; return; } -void ConfigurationManager::configureCallback(const std::shared_ptr<dyknow_manager::Configure::Request> req, std::shared_ptr<dyknow_manager::Configure::Response> res) { +void ConfigurationManager::configureCallback(const std::shared_ptr<dyknow_interfaces::srv::ManagerConfigure::Request> req, std::shared_ptr<dyknow_interfaces::srv::ManagerConfigure::Response> res) { Change delta; - if(req.config.in_channels.size() != req.config.in_names.size() || req.config.out_channels.size() != req.config.out_names.size()) { - res.success = false; + if(req->config.in_channels.size() != req->config.in_names.size() || req->config.out_channels.size() != req->config.out_names.size()) { + res->success = false; return; } std::map<std::string, std::string> in; - for(size_t i = 0; i < req.config.in_channels.size(); ++i) { - if(req.config.in_channels[i].empty()) { continue; } - in.emplace(req.config.in_channels[i], req.config.in_names[i]); + for(size_t i = 0; i < req->config.in_channels.size(); ++i) { + if(req->config.in_channels[i].empty()) { continue; } + in.emplace(req->config.in_channels[i], req->config.in_names[i]); } std::map<std::string, std::string> out; - for(size_t i = 0; i < req.config.out_channels.size(); ++i) { - if(req.config.out_channels[i].empty()) { continue; } - out.emplace(req.config.out_channels[i], req.config.out_names[i]); + for(size_t i = 0; i < req->config.out_channels.size(); ++i) { + if(req->config.out_channels[i].empty()) { continue; } + out.emplace(req->config.out_channels[i], req->config.out_names[i]); } - ConfigureCommand* cmdPtr = new ConfigureCommand(req.name, in, out); + ConfigureCommand* cmdPtr = new ConfigureCommand(req->name, in, out); delta.add(cmdPtr); - enqueue(std::pair<int, Change>(req.envId, delta)); - res.success = true; + enqueue(std::pair<int, Change>(req->envid, delta)); + res->success = true; return; } -void ConfigurationManager::addTargetCallback(const std::shared_ptr<dyknow_manager::AddTarget::Request> req, std::shared_ptr<dyknow_manager::AddTarget::Response> res) { +void ConfigurationManager::addTargetCallback(const std::shared_ptr<dyknow_interfaces::srv::AddTarget::Request> req, std::shared_ptr<dyknow_interfaces::srv::AddTarget::Response> res) { Change delta; - for (auto& target : req.targets) { + for (auto& target : req->targets) { TargetSpec spec = TargetFactory::create(target); AddTargetCommand* cmdPtr = new AddTargetCommand(spec); delta.add(cmdPtr); } - enqueue(std::pair<int, Change>(req.envId, delta)); - res.success = true; + enqueue(std::pair<int, Change>(req->envid, delta)); + res->success = true; return; } -void ConfigurationManager::removeTargetCallback(const std::shared_ptr<dyknow_manager::RemoveTarget::Request> req, std::shared_ptr<dyknow_manager::RemoveTarget::Response> res) { +void ConfigurationManager::removeTargetCallback(const std::shared_ptr<dyknow_interfaces::srv::RemoveTarget::Request> req, std::shared_ptr<dyknow_interfaces::srv::RemoveTarget::Response> res) { Change delta; - for (auto& label : req.targets) { + for (auto& label : req->targets) { RemoveTargetCommand* cmdPtr = new RemoveTargetCommand(label); delta.add(cmdPtr); } - enqueue(std::pair<int, Change>(req.envId, delta)); - res.success = true; + enqueue(std::pair<int, Change>(req->envid, delta)); + res->success = true; return; } -void ConfigurationManager::refreshCallback(const std::shared_ptr<dyknow_manager::Refresh::Request> req, std::shared_ptr<dyknow_manager::Refresh::Response> res) { - ROS_INFO("Scheduling refresh"); +void ConfigurationManager::refreshCallback(const std::shared_ptr<dyknow_interfaces::srv::Refresh::Request> req, std::shared_ptr<dyknow_interfaces::srv::Refresh::Response> res) { + RCLCPP_INFO(this->nh->get_logger(), "Scheduling refresh"); Change delta; RefreshCommand* cmdPtr = new RefreshCommand(); delta.add(cmdPtr); - enqueue(std::pair<int, Change>(req.envId, delta)); - res.success = true; + enqueue(std::pair<int, Change>(req->envid, delta)); + res->success = true; return; } -void ConfigurationManager::repairCallback(const std::shared_ptr<dyknow_manager::Repair::Request> req, std::shared_ptr<dyknow_manager::Repair::Response> res) { +void ConfigurationManager::repairCallback(const std::shared_ptr<dyknow_interfaces::srv::Repair::Request> req, std::shared_ptr<dyknow_interfaces::srv::Repair::Response> res) { std::lock_guard<std::mutex> guard(envAccess); - auto iter = std::find_if(environments.begin(), environments.end(), [&req](const Environment& env) { - return req.envId == env.getId(); - }); - - if(iter != environments.end()) { - iter->repair = true; - res.success = true; - return; + // auto iter = std::find_if(environments.begin(), environments.end(), [&req](const Environment& env) { + // return req->envid == env.getId(); + // }); + + // if(iter != environments.end()) { + // iter->repair = true; + // res->success = true; + // return; + // } + + std::vector<Environment>::iterator iter; + for(iter = environments.begin(); iter != environments.end(); iter++) { + if(req->envid == iter->getId()) { + iter->repair = true; + bool result = true; + res->success = result; + return; + } } - ROS_WARN("Unable to find environment: %i", req.envId); - res.success = false; + RCLCPP_WARN(this->nh->get_logger(), "Unable to find environment: %i", req->envid); + res->success = false; return; } -void ConfigurationManager::getValidInputsCallback(const std::shared_ptr<dyknow_manager::GetValidInputs::Request> req, std::shared_ptr<dyknow_manager::GetValidInputs::Response> res) { +void ConfigurationManager::getValidInputsCallback(const std::shared_ptr<dyknow_interfaces::srv::GetValidInputs::Request> req, std::shared_ptr<dyknow_interfaces::srv::GetValidInputs::Response> res) { std::lock_guard<std::mutex> guard(envAccess); - auto iter = std::find_if(environments.begin(), environments.end(), [&req](const Environment& env) { - return req.env == env.getId(); - }); - - if(iter != environments.end()) { - int id = -1; - for(size_t i = 0; i < iter->getMatrix().library.size(); ++i) { - if(iter->getMatrix().library[i].label == req.transformation) { - id = iter->getMatrix().library[i].id; - break; - } - } + std::vector<Environment>::iterator iter; + for(iter = environments.begin(); iter != environments.end(); iter++) { + if(req->env == iter->getId()) { - if(id < 0) { - ROS_WARN("Unable to find transformation with label %s; skipping", req.transformation.c_str()); - res.success = false; - return; - } - - for (auto& port : iter->getValidInputs(Port(id, req.port-1))) { - ROS_INFO("getValidInputs"); - TransformationSpec spec = iter->getMatrix().decode(port); - - dyknow_manager::Transformation tf; - tf.cost = spec.cost; - tf.environment = req.env; - tf.in_ports = spec.inPorts; - tf.out_ports = spec.outPorts; - tf.label = spec.label; - tf.source = spec.source; - tf.type = spec.type == NODELET ? "nodelet" : "unknown"; - - for (auto& param : spec.parameters) { - dyknow_manager::Parameter elem; - elem.name = param.name; - elem.type = param.type; - elem.value = param.value; - tf.params.push_back(elem); + int id = -1; + for(int i = 0; i < iter->getMatrix().library.size(); i++) { + if(iter->getMatrix().library[i].label == req->transformation) { + id = iter->getMatrix().library[i].id; + break; + } } - for (auto& tag : spec.tags) { - dyknow_manager::Tag elem; - elem.port = tag.first; - elem.tag = tag.second; - tf.tags.push_back(elem); + if(id < 0) { + RCLCPP_WARN(this->nh->get_logger(),"Unable to find transformation with label %s; skipping", req->transformation.c_str()); + res->success = false; + return; } - res.transformations.push_back(tf); - res.ports.push_back(port.second); + //Port port; + for_each(iter->getValidInputs(Port(id, req->port-1)).begin(), iter->getValidInputs(Port(id, req->port-1)).end(), [this, iter, req, res](Port port) { + RCLCPP_INFO(this->nh->get_logger(),"getValidInputs"); + TransformationSpec spec = iter->getMatrix().decode(port); + + dyknow_interfaces::msg::Transformation tf; + tf.cost = spec.cost; + tf.environment = req->env; + tf.in_ports = spec.inPorts; + tf.out_ports = spec.outPorts; + tf.label = spec.label; + tf.source = spec.source; + tf.type = spec.type == NODELET ? "nodelet" : "unknown"; + + //TransformationParam param; + for_each(spec.parameters.begin(), spec.parameters.end(), [&tf](TransformationParam param) { + dyknow_interfaces::msg::Parameter elem; + elem.name = param.name; + elem.type = param.type; + elem.value = param.value; + tf.params.push_back(elem); + }); + + //TransformationTag tag; + for_each(spec.tags.begin(), spec.tags.end(), [&tf](TransformationTag tag) { + dyknow_interfaces::msg::Tag elem; + elem.port = tag.first; + elem.tag = tag.second; + tf.tags.push_back(elem); + }); + + res->transformations.push_back(tf); + res->ports.push_back(port.second); + }); + + res->success = true; + return; } - - res.success = true; - return; } - ROS_WARN("Unable to find environment: %i", req.env); + RCLCPP_WARN(this->nh->get_logger(), "Unable to find environment: %i", req->env); return; } -void ConfigurationManager::expPopulateCallback(const std::shared_ptr<dyknow_manager::ExpPopulate::Request> req, std::shared_ptr<dyknow_manager::ExpPopulate::Response> res) { +void ConfigurationManager::expPopulateCallback(const std::shared_ptr<dyknow_interfaces::srv::ExpPopulate::Request> req, std::shared_ptr<dyknow_interfaces::srv::ExpPopulate::Response> res) { std::lock_guard<std::mutex> guard(envAccess); - auto iter = std::find_if(environments.begin(), environments.end(), [&req](const Environment& env) { - return req.env == env.getId(); - }); - - if(iter != environments.end()) { - iter->expPopulate(req.seed, req.numTransform, req.density, req.lambda, req.numTarget); - res.success = true; - return; + std::vector<Environment>::iterator iter; + for(iter = environments.begin(); iter != environments.end(); iter++) { + if(req->env == iter->getId()) { + iter->expPopulate(req->seed, req->numtransform, req->density, req->lambdafunction, req->numtarget); + res->success = true; + return; + } } - ROS_WARN("Unable to find environment: %i", req.env); + RCLCPP_WARN(this->nh->get_logger(), "Unable to find environment: %i", req->env); return; } void ConfigurationManager::spin() { - while(ros::ok()) { + while(rclcpp::ok()) { processRepairs(); if(empty()) { - ros::Duration(1.0).sleep(); + rclcpp::sleep_for(std::chrono::seconds(1)); + //ros::Duration(1.0).sleep(); } else { std::pair<int, Change> changePair = dequeue(); apply(changePair.second, changePair.first); @@ -280,22 +293,21 @@ void ConfigurationManager::spin() { } } -void ConfigurationManager::apply(Change delta, int environment) { +bool ConfigurationManager::apply(Change delta, int environment) { std::lock_guard<std::mutex> guard(envAccess); - auto iter = std::find_if(environments.begin(), environments.end(), [environment](const Environment& env) { - return environment == env.getId(); - }); - - if(iter != environments.end()) { - return delta.execute(&*iter); + std::vector<Environment>::iterator iter; + for(iter = environments.begin(); iter != environments.end(); iter++) { + if(environment == iter->getId()) { + return delta.execute(&*iter); + } } - ROS_WARN("Unable to find environment: %i", environment); - return; + RCLCPP_WARN(this->nh->get_logger(), "Unable to find environment: %i", environment); + return false; } -void ConfigurationManager::empty() { +bool ConfigurationManager::empty() { std::lock_guard<std::mutex> guard(deltaAccess); return changeQueue.empty(); } diff --git a/src/dyknow_manager/src/environment.cpp b/src/dyknow_manager/src/environment.cpp index 6207730..826b7ec 100644 --- a/src/dyknow_manager/src/environment.cpp +++ b/src/dyknow_manager/src/environment.cpp @@ -1,9 +1,9 @@ -#include "environment.hpp" +#include "dyknow_manager/environment.hpp" namespace dyknow { bool Environment::addTransformation(TransformationSpec spec) { - ROS_INFO("Adding transformation %s (cost: %f)", spec.label.c_str(), spec.cost); + RCLCPP_INFO(this->nh->get_logger(),"Adding transformation %s (cost: %f)", spec.label.c_str(), spec.cost); //TODO: Set transformation ID if -1 if (spec.id < 0){ spec.id = next_transformaiton_id; @@ -14,7 +14,7 @@ bool Environment::addTransformation(TransformationSpec spec) { } bool Environment::removeTransformation(std::string label) { - ROS_INFO("Removing transformation %s", label.c_str()); + RCLCPP_INFO(this->nh->get_logger(),"Removing transformation %s", label.c_str()); std::string s; // Remove transformation from library and invalidate in matrix @@ -41,14 +41,14 @@ bool Environment::spawn(std::string name, std::string type, bool protect) { args.push_back(param.value); //FIXME: The interface currently ignores parameter names and types } - if (CompUnitHelper::spawn(h, nodeletManagerName, name, iter->source, args)) { + if (CompUnitHelper::spawn(nh, nodeletManagerName, name, iter->source, args)) { ComputationUnit cu(name, type); computationUnits.push_back(cu); subscriptionMap.emplace(name, Subscription()); generatorMap.emplace(name, Generator()); if (protect) { protections.push_back(name); - ROS_INFO("** %s is now protected **", name.c_str()); + RCLCPP_INFO(this->nh->get_logger(), "** %s is now protected **", name.c_str()); } return true; } @@ -69,7 +69,7 @@ bool Environment::destroy(std::string name) { return true; } } else { - ROS_WARN("Unrecognised CU registered for unloading: %s", name.c_str()); + RCLCPP_WARN(this->nh->get_logger(), "Unrecognised CU registered for unloading: %s", name.c_str()); } return false; @@ -87,7 +87,7 @@ bool Environment::configure(std::string name, std::map<std::string, std::string> return true; } } else { - ROS_WARN("Unrecognised CU registered for reconfiguration: %s", name.c_str()); + RCLCPP_WARN(this->nh->get_logger(), "Unrecognised CU registered for reconfiguration: %s", name.c_str()); } return false; @@ -103,22 +103,22 @@ bool Environment::addTarget(TargetSpec spec) { spec.id = iter->id; targets.push_back(spec); this->repair = true; - ROS_INFO("Adding target %i (%s)", spec.id, spec.label.c_str()); + RCLCPP_INFO(this->nh->get_logger(), "Adding target %i (%s)", spec.id, spec.label.c_str()); return true; } else { - ROS_WARN("Could not find identifier for target %s", spec.label.c_str()); + RCLCPP_WARN(this->nh->get_logger(), "Could not find identifier for target %s", spec.label.c_str()); return false; } } else { targets.push_back(spec); this->repair = true; - ROS_INFO("Adding target %i (%s)", spec.id, spec.label.c_str()); + RCLCPP_INFO(this->nh->get_logger(), "Adding target %i (%s)", spec.id, spec.label.c_str()); return true; } } bool Environment::removeTarget(std::string label) { - ROS_INFO("Removing target %s", label.c_str()); + RCLCPP_INFO(this->nh->get_logger(), "Removing target %s", label.c_str()); auto iter = std::remove_if(targets.begin(), targets.end(), [&label](const TargetSpec& ts) { return ts.label == label; @@ -127,14 +127,14 @@ bool Environment::removeTarget(std::string label) { if (iter != targets.end()) { targets.erase(iter, targets.end()); } else { - ROS_WARN("Unrecognised target registered for removal: %s", label.c_str()); + RCLCPP_WARN(this->nh->get_logger(), "Unrecognised target registered for removal: %s", label.c_str()); } return true; } bool Environment::refresh() { - ROS_INFO("Refreshing feasibility matrix"); + RCLCPP_INFO(this->nh->get_logger(), "Refreshing feasibility matrix"); this->matrix = FeasibilityMatrix(this->transformations, 0.01); return true; } diff --git a/src/dyknow_manager/src/manager_componet.cpp b/src/dyknow_manager/src/manager_componet.cpp index 503b6bd..297db62 100644 --- a/src/dyknow_manager/src/manager_componet.cpp +++ b/src/dyknow_manager/src/manager_componet.cpp @@ -7,9 +7,13 @@ namespace manager { node(std::make_shared<dyknow::Node>("manager_componet", options)) { std::shared_ptr<dyknow::ConfigurationManager> configManPtr = std::shared_ptr<dyknow::ConfigurationManager>(new dyknow::ConfigurationManager(node)); - } - + + rclcpp::node_interfaces::NodeBaseInterface::SharedPtr ManagerComponet::get_node_base_interface() const + { + return this->node->get_node_base_interface(); + } + } RCLCPP_COMPONENTS_REGISTER_NODE(manager::ManagerComponet) \ No newline at end of file diff --git a/src/dyknow_manager/src/transformation_spec.cpp b/src/dyknow_manager/src/transformation_spec.cpp index d548bfd..0d17d46 100644 --- a/src/dyknow_manager/src/transformation_spec.cpp +++ b/src/dyknow_manager/src/transformation_spec.cpp @@ -1,4 +1,4 @@ -#include "transformation_spec.hpp" +#include "dyknow_manager/transformation_spec.hpp" namespace dyknow { @@ -7,7 +7,7 @@ TransformationSpec TransformationFactory::create(std::string path) { return TransformationSpec(); } -TransformationSpec TransformationFactory::create(dyknow_manager::Transformation tfMsg) { +TransformationSpec TransformationFactory::create(dyknow_interfaces::msg::Transformation tfMsg) { TransformationSpec spec; spec.label = tfMsg.label; if (tfMsg.type.compare("nodelet") == 0) { diff --git a/src/dyknow_nodehandle/include/dyknow_nodehandle/node.hpp b/src/dyknow_nodehandle/include/dyknow_nodehandle/node.hpp index 0ea833c..be401cd 100644 --- a/src/dyknow_nodehandle/include/dyknow_nodehandle/node.hpp +++ b/src/dyknow_nodehandle/include/dyknow_nodehandle/node.hpp @@ -24,7 +24,6 @@ public: Node(const std::string & nodeName, const rclcpp::NodeOptions & options) : rclcpp::Node(nodeName, options) , subCount(0), pubCount(0), reconfigCount(0), reconfigCallbackFn(NULL) { - configureService = this->create_service<dyknow_interfaces::srv::Configure>( "set_config", std::bind(&Node::configureCallback, this, std::placeholders::_1, std::placeholders::_2)); getConfigService = this->create_service<dyknow_interfaces::srv::GetConfig>( @@ -38,8 +37,6 @@ public: std::function<void(std::map<std::string, std::string>, std::map<std::string, std::string>)> reconfigCallbackFn; - - template<class M, class T> dyknow::Subscriber create_subscription(uint32_t queueSize, void(T::*fp)(std::shared_ptr<M>&), T* obj) { std::stringstream ss; -- GitLab