-
Notifications
You must be signed in to change notification settings - Fork 4
Support multiple hardware interfaces in the coordinator #72
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 3 commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,5 +1,7 @@ | ||
| # Changelog for package auv_control_demos | ||
|
|
||
| ## 0.3.3 (2025-07-29) | ||
|
|
||
| ## 0.3.2 (2025-07-22) | ||
|
|
||
| ## 0.3.1 (2025-07-09) | ||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -3,7 +3,7 @@ | |
| <package format="3"> | ||
|
|
||
| <name>auv_control_demos</name> | ||
| <version>0.3.2</version> | ||
| <version>0.3.3</version> | ||
| <description>Example package that includes demos for using auv_controllers in individual and chained modes</description> | ||
|
|
||
| <maintainer email="[email protected]">Colin Mitchell</maintainer> | ||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,5 +1,7 @@ | ||
| # Changelog for package auv_control_msgs | ||
|
|
||
| ## 0.3.3 (2025-07-29) | ||
|
|
||
| ## 0.3.2 (2025-07-22) | ||
|
|
||
| ## 0.3.1 (2025-07-09) | ||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -3,7 +3,7 @@ | |
| <package format="3"> | ||
|
|
||
| <name>auv_control_msgs</name> | ||
| <version>0.3.2</version> | ||
| <version>0.3.3</version> | ||
| <description>Custom messages for AUV controllers</description> | ||
|
|
||
| <maintainer email="[email protected]">Rakesh Vivekanandan</maintainer> | ||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,5 +1,7 @@ | ||
| # Changelog for package auv_controllers | ||
|
|
||
| ## 0.3.3 (2025-07-29) | ||
|
|
||
| ## 0.3.2 (2025-07-22) | ||
|
|
||
| ## 0.3.1 (2025-07-09) | ||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -3,7 +3,7 @@ | |
| <package format="3"> | ||
|
|
||
| <name>auv_controllers</name> | ||
| <version>0.3.2</version> | ||
| <version>0.3.3</version> | ||
| <description>Meta package for auv_controllers</description> | ||
|
|
||
| <maintainer email="[email protected]">Evan Palmer</maintainer> | ||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,5 +1,7 @@ | ||
| # Changelog for package controller_common | ||
|
|
||
| ## 0.3.3 (2025-07-29) | ||
|
|
||
| ## 0.3.2 (2025-07-22) | ||
|
|
||
| ## 0.3.1 (2025-07-09) | ||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -3,7 +3,7 @@ | |
| <package format="3"> | ||
|
|
||
| <name>controller_common</name> | ||
| <version>0.3.2</version> | ||
| <version>0.3.3</version> | ||
| <description>Common interfaces for controllers used in this project</description> | ||
|
|
||
| <maintainer email="[email protected]">Evan Palmer</maintainer> | ||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -3,7 +3,7 @@ | |
| <package format="3"> | ||
|
|
||
| <name>controller_coordinator</name> | ||
| <version>0.3.2</version> | ||
| <version>0.3.3</version> | ||
| <description>A high-level node used to load and activate/deactivate control systems</description> | ||
|
|
||
| <maintainer email="[email protected]">Evan Palmer</maintainer> | ||
|
|
||
| Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
|
@@ -29,10 +29,8 @@ namespace coordinator | |||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||
| ControllerCoordinator::ControllerCoordinator() | ||||||||||||||||||||||||||
| : rclcpp::Node("controller_coordinator"), | ||||||||||||||||||||||||||
| activate_hardware_request_(std::make_shared<controller_manager_msgs::srv::SetHardwareComponentState::Request>()), | ||||||||||||||||||||||||||
| deactivate_hardware_request_(std::make_shared<controller_manager_msgs::srv::SetHardwareComponentState::Request>()), | ||||||||||||||||||||||||||
| activate_controllers_request_(std::make_shared<controller_manager_msgs::srv::SwitchController::Request>()), | ||||||||||||||||||||||||||
| deactivate_controllers_request_(std::make_shared<controller_manager_msgs::srv::SwitchController::Request>()) | ||||||||||||||||||||||||||
| activate_controllers_request_(std::make_shared<ControllerRequest>()), | ||||||||||||||||||||||||||
| deactivate_controllers_request_(std::make_shared<ControllerRequest>()) | ||||||||||||||||||||||||||
| { | ||||||||||||||||||||||||||
| param_listener_ = std::make_shared<controller_coordinator::ParamListener>(this->get_node_parameters_interface()); | ||||||||||||||||||||||||||
| params_ = param_listener_->get_params(); | ||||||||||||||||||||||||||
|
|
@@ -60,11 +58,23 @@ ControllerCoordinator::ControllerCoordinator() | |||||||||||||||||||||||||
| wait_for_service(switch_controller_client_, switch_controller_name); | ||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||
| // pre-configure the hardware activation/deactivation requests | ||||||||||||||||||||||||||
| activate_hardware_request_->name = params_.hardware_interface; | ||||||||||||||||||||||||||
| activate_hardware_request_->target_state.id = lifecycle_msgs::msg::State::PRIMARY_STATE_ACTIVE; | ||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||
| deactivate_hardware_request_->name = params_.hardware_interface; | ||||||||||||||||||||||||||
| deactivate_hardware_request_->target_state.id = lifecycle_msgs::msg::State::PRIMARY_STATE_INACTIVE; | ||||||||||||||||||||||||||
| activate_hardware_requests_.reserve(params_.hardware_sequence.size()); | ||||||||||||||||||||||||||
| std::ranges::transform( | ||||||||||||||||||||||||||
| params_.hardware_sequence, std::back_inserter(activate_hardware_requests_), [](const std::string & name) { | ||||||||||||||||||||||||||
| auto request = std::make_shared<HardwareRequest>(); | ||||||||||||||||||||||||||
| request->name = name; | ||||||||||||||||||||||||||
| request->target_state.id = lifecycle_msgs::msg::State::PRIMARY_STATE_ACTIVE; | ||||||||||||||||||||||||||
| return request; | ||||||||||||||||||||||||||
| }); | ||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||
| deactivate_hardware_requests_.reserve(params_.hardware_sequence.size()); | ||||||||||||||||||||||||||
| std::ranges::transform( | ||||||||||||||||||||||||||
| params_.hardware_sequence, std::back_inserter(deactivate_hardware_requests_), [](const std::string & name) { | ||||||||||||||||||||||||||
| auto request = std::make_shared<HardwareRequest>(); | ||||||||||||||||||||||||||
| request->name = name; | ||||||||||||||||||||||||||
| request->target_state.id = lifecycle_msgs::msg::State::PRIMARY_STATE_INACTIVE; | ||||||||||||||||||||||||||
| return request; | ||||||||||||||||||||||||||
| }); | ||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||
| // pre-configure the controller activation/deactivation requests | ||||||||||||||||||||||||||
| activate_controllers_request_->activate_controllers = params_.controller_sequence; | ||||||||||||||||||||||||||
|
|
@@ -87,22 +97,26 @@ ControllerCoordinator::ControllerCoordinator() | |||||||||||||||||||||||||
| const std::shared_ptr<std_srvs::srv::SetBool::Response> response) { // NOLINT | ||||||||||||||||||||||||||
| response->success = true; | ||||||||||||||||||||||||||
| if (request->data) { | ||||||||||||||||||||||||||
| RCLCPP_INFO(this->get_logger(), "Activating thruster hardware interface and controllers"); // NOLINT | ||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||
| // activate the hardware interface | ||||||||||||||||||||||||||
| hardware_client_->async_send_request( | ||||||||||||||||||||||||||
| activate_hardware_request_, | ||||||||||||||||||||||||||
| [this, response](rclcpp::Client<controller_manager_msgs::srv::SetHardwareComponentState>::SharedFuture | ||||||||||||||||||||||||||
| result_response) { // NOLINT | ||||||||||||||||||||||||||
| const auto & result = result_response.get(); | ||||||||||||||||||||||||||
| if (result->ok) { | ||||||||||||||||||||||||||
| RCLCPP_INFO(this->get_logger(), "Successfully activated thruster hardware interface"); // NOLINT | ||||||||||||||||||||||||||
| } else { | ||||||||||||||||||||||||||
| RCLCPP_ERROR(this->get_logger(), "Failed to activate thruster hardware interface"); // NOLINT | ||||||||||||||||||||||||||
| response->success = false; | ||||||||||||||||||||||||||
| response->message = "Failed to activate thruster hardware interface"; | ||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||
| }); | ||||||||||||||||||||||||||
| RCLCPP_INFO(this->get_logger(), "Activating hardware interfaces and controllers"); // NOLINT | ||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||
| // sequentially activate the hardware interfaces | ||||||||||||||||||||||||||
| for (const auto & activate_request : activate_hardware_requests_) { | ||||||||||||||||||||||||||
| auto hardware_future = hardware_client_->async_send_request( | ||||||||||||||||||||||||||
| activate_request, | ||||||||||||||||||||||||||
| [logger = this->get_logger(), response, activate_request]( | ||||||||||||||||||||||||||
| rclcpp::Client<controller_manager_msgs::srv::SetHardwareComponentState>::SharedFuture | ||||||||||||||||||||||||||
| result_response) { // NOLINT | ||||||||||||||||||||||||||
| const auto & result = result_response.get(); | ||||||||||||||||||||||||||
| if (result->ok) { | ||||||||||||||||||||||||||
| RCLCPP_INFO(logger, "Successfully activated %s", activate_request->name.c_str()); // NOLINT | ||||||||||||||||||||||||||
| } else { | ||||||||||||||||||||||||||
| RCLCPP_ERROR(logger, "Failed to activate %s", activate_request->name.c_str()); // NOLINT | ||||||||||||||||||||||||||
| response->success = false; | ||||||||||||||||||||||||||
| response->message = "Failed to activate " + activate_request->name; | ||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||
evan-palmer marked this conversation as resolved.
Show resolved
Hide resolved
|
||||||||||||||||||||||||||
| }); | ||||||||||||||||||||||||||
| rclcpp::spin_until_future_complete(this->get_node_base_interface(), hardware_future); | ||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||
|
||||||||||||||||||||||||||
| rclcpp::spin_until_future_complete(this->get_node_base_interface(), hardware_future); | |
| } | |
| futures.push_back(hardware_future.share()); | |
| } | |
| for (auto & future : futures) { | |
| if (future.wait_for(std::chrono::seconds(10)) != std::future_status::ready) { | |
| RCLCPP_ERROR(this->get_logger(), "Timeout while waiting for hardware activation"); | |
| response->success = false; | |
| response->message = "Timeout during hardware activation"; | |
| } | |
| } |
evan-palmer marked this conversation as resolved.
Show resolved
Hide resolved
Outdated
Copilot
AI
Jul 30, 2025
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Sequential blocking calls to spin_until_future_complete may cause performance issues if there are many hardware interfaces. Consider implementing parallel deactivation with proper synchronization or adding timeout handling to prevent indefinite blocking.
| rclcpp::spin_until_future_complete(this->get_node_base_interface(), hardware_future); | |
| } | |
| futures.push_back(hardware_future.share()); | |
| } | |
| for (auto & future : futures) { | |
| if (future.wait_for(std::chrono::seconds(10)) != std::future_status::ready) { | |
| RCLCPP_ERROR(this->get_logger(), "Timeout while deactivating hardware interface"); | |
| response->success = false; | |
| response->message = "Timeout while deactivating hardware interface"; | |
| } | |
| } |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -3,7 +3,7 @@ | |
| <package format="3"> | ||
|
|
||
| <name>end_effector_trajectory_controller</name> | ||
| <version>0.3.2</version> | ||
| <version>0.3.3</version> | ||
| <description>End effector trajectory tracking controller for UVMS control</description> | ||
|
|
||
| <maintainer email="[email protected]">Evan Palmer</maintainer> | ||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,5 +1,7 @@ | ||
| # Changelog for package ik_solvers | ||
|
|
||
| ## 0.3.3 (2025-07-29) | ||
|
|
||
| ## 0.3.2 (2025-07-22) | ||
|
|
||
| ## 0.3.1 (2025-07-09) | ||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -3,7 +3,7 @@ | |
| <package format="3"> | ||
|
|
||
| <name>ik_solvers</name> | ||
| <version>0.3.2</version> | ||
| <version>0.3.3</version> | ||
| <description>Inverse kinematics solvers used for whole-body control</description> | ||
|
|
||
| <maintainer email="[email protected]">Evan Palmer</maintainer> | ||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -3,7 +3,7 @@ | |
| <package format="3"> | ||
|
|
||
| <name>thruster_allocation_matrix_controller</name> | ||
| <version>0.3.2</version> | ||
| <version>0.3.3</version> | ||
| <description>Thruster allocation matrix controller used to convert wrench commands into thrust commands</description> | ||
|
|
||
| <maintainer email="[email protected]">Evan Palmer</maintainer> | ||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -3,7 +3,7 @@ | |
| <package format="3"> | ||
|
|
||
| <name>thruster_controllers</name> | ||
| <version>0.3.2</version> | ||
| <version>0.3.3</version> | ||
| <description>A collection of thruster controllers for AUV control</description> | ||
|
|
||
| <maintainer email="[email protected]">Evan Palmer</maintainer> | ||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,5 +1,7 @@ | ||
| # Changelog for package topic_sensors | ||
|
|
||
| ## 0.3.3 (2025-07-29) | ||
|
|
||
| ## 0.3.2 (2025-07-22) | ||
|
|
||
| ## 0.3.1 (2025-07-09) | ||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -3,7 +3,7 @@ | |
| <package format="3"> | ||
|
|
||
| <name>topic_sensors</name> | ||
| <version>0.3.2</version> | ||
| <version>0.3.3</version> | ||
| <description>Sensor plugins used to write ROS 2 messages to state interfaces</description> | ||
|
|
||
| <maintainer email="[email protected]">Evan Palmer</maintainer> | ||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -3,7 +3,7 @@ | |
| <package format="3"> | ||
|
|
||
| <name>velocity_controllers</name> | ||
| <version>0.3.2</version> | ||
| <version>0.3.3</version> | ||
| <description>A collection of velocity controllers for underwater vehicles</description> | ||
|
|
||
| <maintainer email="[email protected]">Evan Palmer</maintainer> | ||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -3,7 +3,7 @@ | |
| <package format="3"> | ||
|
|
||
| <name>whole_body_controllers</name> | ||
| <version>0.3.2</version> | ||
| <version>0.3.3</version> | ||
| <description>Whole-body controllers for underwater vehicle manipulator systems</description> | ||
|
|
||
| <maintainer email="[email protected]">Evan Palmer</maintainer> | ||
|
|
||
Uh oh!
There was an error while loading. Please reload this page.