diff --git a/.github/workflows/humble-abi-compatibility.yml b/.github/workflows/humble-abi-compatibility.yml index eed2a7589f..f4172ee3e6 100644 --- a/.github/workflows/humble-abi-compatibility.yml +++ b/.github/workflows/humble-abi-compatibility.yml @@ -21,12 +21,6 @@ concurrency: jobs: abi_check: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - uses: ros-industrial/industrial_ci@master - env: - ROS_DISTRO: humble - ROS_REPO: testing - ABICHECK_URL: github:${{ github.repository }}#${{ github.base_ref }} - NOT_TEST_BUILD: true + uses: ros-controls/ros2_control_ci/.github/workflows/reusable-abi-check.yml@master + with: + ros_distro: humble diff --git a/.github/workflows/jazzy-abi-compatibility.yml b/.github/workflows/jazzy-abi-compatibility.yml index aa0fe81e63..83a81fec44 100644 --- a/.github/workflows/jazzy-abi-compatibility.yml +++ b/.github/workflows/jazzy-abi-compatibility.yml @@ -21,12 +21,6 @@ concurrency: jobs: abi_check: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - uses: ros-industrial/industrial_ci@master - env: - ROS_DISTRO: jazzy - ROS_REPO: testing - ABICHECK_URL: github:${{ github.repository }}#${{ github.base_ref }} - NOT_TEST_BUILD: true + uses: ros-controls/ros2_control_ci/.github/workflows/reusable-abi-check.yml@master + with: + ros_distro: jazzy diff --git a/.github/workflows/rolling-abi-compatibility.yml b/.github/workflows/rolling-abi-compatibility.yml index 50f2a46154..02a38494b5 100644 --- a/.github/workflows/rolling-abi-compatibility.yml +++ b/.github/workflows/rolling-abi-compatibility.yml @@ -21,12 +21,6 @@ concurrency: jobs: abi_check: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - uses: ros-industrial/industrial_ci@master - env: - ROS_DISTRO: rolling - ROS_REPO: testing - ABICHECK_URL: github:${{ github.repository }}#${{ github.base_ref }} - NOT_TEST_BUILD: true + uses: ros-controls/ros2_control_ci/.github/workflows/reusable-abi-check.yml@master + with: + ros_distro: rolling diff --git a/controller_interface/CHANGELOG.rst b/controller_interface/CHANGELOG.rst index df7ae97d89..ce979b4fee 100644 --- a/controller_interface/CHANGELOG.rst +++ b/controller_interface/CHANGELOG.rst @@ -2,6 +2,12 @@ Changelog for package controller_interface ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +4.25.0 (2025-01-29) +------------------- +* Use `target_compile_definitions` instead of installing test files (`#2009 `_) +* Add GPS semantic component (`#2000 `_) +* Contributors: Sai Kishor Kothakota, Wiktor Bajor + 4.24.0 (2025-01-13) ------------------- * Trigger shutdown transition in destructor (`#1979 `_) diff --git a/controller_interface/package.xml b/controller_interface/package.xml index d8de9b7a19..34144dc71d 100644 --- a/controller_interface/package.xml +++ b/controller_interface/package.xml @@ -2,7 +2,7 @@ controller_interface - 4.24.0 + 4.25.0 Description of controller_interface Bence Magyar Denis Štogl diff --git a/controller_manager/CHANGELOG.rst b/controller_manager/CHANGELOG.rst index ef709431c7..c17f7981ec 100644 --- a/controller_manager/CHANGELOG.rst +++ b/controller_manager/CHANGELOG.rst @@ -2,6 +2,16 @@ Changelog for package controller_manager ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +4.25.0 (2025-01-29) +------------------- +* Handle SIGINT properly in the controller manager (`#2014 `_) +* Fix the initial wrong periodicity reported by controller_manager (`#2018 `_) +* Use `target_compile_definitions` instead of installing test files (`#2009 `_) +* Fix a heading level (`#2007 `_) +* Update path of GPL (`#1994 `_) +* Fix: on_shutdown callback of controllers never get executed (`#1995 `_) +* Contributors: Christoph Fröhlich, Sai Kishor Kothakota, Wiktor Bajor + 4.24.0 (2025-01-13) ------------------- * [CM] Remove obsolete ControllerMock from the tests (`#1990 `_) diff --git a/controller_manager/include/controller_manager/controller_manager.hpp b/controller_manager/include/controller_manager/controller_manager.hpp index ba4bd2acaa..49eed135be 100644 --- a/controller_manager/include/controller_manager/controller_manager.hpp +++ b/controller_manager/include/controller_manager/controller_manager.hpp @@ -80,7 +80,13 @@ class ControllerManager : public rclcpp::Node const std::string & node_namespace = "", const rclcpp::NodeOptions & options = get_cm_node_options()); - virtual ~ControllerManager() = default; + virtual ~ControllerManager(); + + /// Shutdown all controllers in the controller manager. + /** + * \return true if all controllers are successfully shutdown, false otherwise. + */ + bool shutdown_controllers(); void robot_description_callback(const std_msgs::msg::String & msg); @@ -531,6 +537,7 @@ class ControllerManager : public rclcpp::Node int used_by_realtime_controllers_index_ = -1; }; + std::unique_ptr preshutdown_cb_handle_{nullptr}; RTControllerListWrapper rt_controllers_wrapper_; std::unordered_map controller_chain_spec_; std::vector ordered_controllers_names_; diff --git a/controller_manager/package.xml b/controller_manager/package.xml index 61f9bceb55..cad0383937 100644 --- a/controller_manager/package.xml +++ b/controller_manager/package.xml @@ -2,7 +2,7 @@ controller_manager - 4.24.0 + 4.25.0 Description of controller_manager Bence Magyar Denis Štogl diff --git a/controller_manager/src/controller_manager.cpp b/controller_manager/src/controller_manager.cpp index 3c07ab265c..f0dc3a40d2 100644 --- a/controller_manager/src/controller_manager.cpp +++ b/controller_manager/src/controller_manager.cpp @@ -291,6 +291,46 @@ ControllerManager::ControllerManager( init_controller_manager(); } +ControllerManager::~ControllerManager() +{ + if (preshutdown_cb_handle_) + { + rclcpp::Context::SharedPtr context = this->get_node_base_interface()->get_context(); + context->remove_pre_shutdown_callback(*(preshutdown_cb_handle_.get())); + preshutdown_cb_handle_.reset(); + } +} + +bool ControllerManager::shutdown_controllers() +{ + RCLCPP_INFO(get_logger(), "Shutting down all controllers in the controller manager."); + // Shutdown all controllers + std::lock_guard guard(rt_controllers_wrapper_.controllers_lock_); + std::vector controllers_list = rt_controllers_wrapper_.get_updated_list(guard); + bool ctrls_shutdown_status = true; + for (auto & controller : controllers_list) + { + if (is_controller_active(controller.c)) + { + RCLCPP_INFO( + get_logger(), "Deactivating controller '%s'", controller.c->get_node()->get_name()); + controller.c->get_node()->deactivate(); + controller.c->release_interfaces(); + } + if (is_controller_inactive(*controller.c) || is_controller_unconfigured(*controller.c)) + { + RCLCPP_INFO( + get_logger(), "Shutting down controller '%s'", controller.c->get_node()->get_name()); + shutdown_controller(controller); + } + ctrls_shutdown_status &= + (controller.c->get_node()->get_current_state().id() == + lifecycle_msgs::msg::State::PRIMARY_STATE_FINALIZED); + executor_->remove_node(controller.c->get_node()->get_node_base_interface()); + } + return ctrls_shutdown_status; +} + void ControllerManager::init_controller_manager() { // Get parameters needed for RT "update" loop to work @@ -329,6 +369,29 @@ void ControllerManager::init_controller_manager() diagnostics_updater_.add( "Controller Manager Activity", this, &ControllerManager::controller_manager_diagnostic_callback); + + // Add on_shutdown callback to stop the controller manager + rclcpp::Context::SharedPtr context = this->get_node_base_interface()->get_context(); + preshutdown_cb_handle_ = + std::make_unique(context->add_pre_shutdown_callback( + [this]() + { + RCLCPP_INFO(get_logger(), "Shutdown request received...."); + if (this->get_node_base_interface()->get_associated_with_executor_atomic().load()) + { + executor_->remove_node(this->get_node_base_interface()); + } + executor_->cancel(); + if (!this->shutdown_controllers()) + { + RCLCPP_ERROR(get_logger(), "Failed shutting down the controllers."); + } + if (!resource_manager_->shutdown_components()) + { + RCLCPP_ERROR(get_logger(), "Failed shutting down hardware components."); + } + RCLCPP_INFO(get_logger(), "Shutting down the controller manager."); + })); } void ControllerManager::initialize_parameters() diff --git a/controller_manager/src/ros2_control_node.cpp b/controller_manager/src/ros2_control_node.cpp index 75a98d19dd..176c346b3f 100644 --- a/controller_manager/src/ros2_control_node.cpp +++ b/controller_manager/src/ros2_control_node.cpp @@ -93,6 +93,10 @@ int main(int argc, char ** argv) } } + // wait for the clock to be available + cm->get_clock()->wait_until_started(); + cm->get_clock()->sleep_for(rclcpp::Duration::from_seconds(1.0 / cm->get_update_rate())); + RCLCPP_INFO(cm->get_logger(), "update rate is %d Hz", cm->get_update_rate()); const int thread_priority = cm->get_parameter_or("thread_priority", kSchedPriority); RCLCPP_INFO( @@ -122,7 +126,7 @@ int main(int argc, char ** argv) auto const period = std::chrono::nanoseconds(1'000'000'000 / cm->get_update_rate()); auto const cm_now = std::chrono::nanoseconds(cm->now().nanoseconds()); std::chrono::time_point - next_iteration_time{cm_now}; + next_iteration_time{cm_now - period}; // for calculating the measured period of the loop rclcpp::Time previous_time = cm->now() - period; diff --git a/controller_manager_msgs/CHANGELOG.rst b/controller_manager_msgs/CHANGELOG.rst index 4bd5fa76c9..9304dfb813 100644 --- a/controller_manager_msgs/CHANGELOG.rst +++ b/controller_manager_msgs/CHANGELOG.rst @@ -2,6 +2,9 @@ Changelog for package controller_manager_msgs ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +4.25.0 (2025-01-29) +------------------- + 4.24.0 (2025-01-13) ------------------- diff --git a/controller_manager_msgs/package.xml b/controller_manager_msgs/package.xml index 6af8412634..bce5c0de46 100644 --- a/controller_manager_msgs/package.xml +++ b/controller_manager_msgs/package.xml @@ -2,7 +2,7 @@ controller_manager_msgs - 4.24.0 + 4.25.0 Messages and services for the controller manager. Bence Magyar Denis Štogl diff --git a/hardware_interface/CHANGELOG.rst b/hardware_interface/CHANGELOG.rst index f008335c1e..110e30ec12 100644 --- a/hardware_interface/CHANGELOG.rst +++ b/hardware_interface/CHANGELOG.rst @@ -2,6 +2,11 @@ Changelog for package hardware_interface ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +4.25.0 (2025-01-29) +------------------- +* Handle SIGINT properly in the controller manager (`#2014 `_) +* Contributors: Sai Kishor Kothakota + 4.24.0 (2025-01-13) ------------------- * Add missing link of mock_components to hardware_interface (`#1992 `_) diff --git a/hardware_interface/include/hardware_interface/resource_manager.hpp b/hardware_interface/include/hardware_interface/resource_manager.hpp index dc82122560..d5d25044dd 100644 --- a/hardware_interface/include/hardware_interface/resource_manager.hpp +++ b/hardware_interface/include/hardware_interface/resource_manager.hpp @@ -76,6 +76,13 @@ class ResourceManager virtual ~ResourceManager(); + /// Shutdown all hardware components, irrespective of their state. + /** + * The method is called when the controller manager is being shutdown. + * @return true if all hardware components are successfully shutdown, false otherwise. + */ + bool shutdown_components(); + /// Load resources from on a given URDF. /** * The resource manager can be post-initialized with a given URDF. diff --git a/hardware_interface/package.xml b/hardware_interface/package.xml index 45a7c6a2f4..af42890d98 100644 --- a/hardware_interface/package.xml +++ b/hardware_interface/package.xml @@ -1,7 +1,7 @@ hardware_interface - 4.24.0 + 4.25.0 ros2_control hardware interface Bence Magyar Denis Štogl diff --git a/hardware_interface/src/resource_manager.cpp b/hardware_interface/src/resource_manager.cpp index 1c391035e4..75d66908e3 100644 --- a/hardware_interface/src/resource_manager.cpp +++ b/hardware_interface/src/resource_manager.cpp @@ -580,7 +580,7 @@ class ResourceStorage result = shutdown_hardware(hardware); break; case State::PRIMARY_STATE_ACTIVE: - result = shutdown_hardware(hardware); + result = deactivate_hardware(hardware) && shutdown_hardware(hardware); break; case State::PRIMARY_STATE_FINALIZED: result = true; @@ -1047,6 +1047,22 @@ ResourceManager::ResourceManager( } } +bool ResourceManager::shutdown_components() +{ + std::unique_lock guard(resource_interfaces_lock_); + bool shutdown_status = true; + for (auto const & hw_info : resource_storage_->hardware_info_map_) + { + rclcpp_lifecycle::State finalized_state( + lifecycle_msgs::msg::State::PRIMARY_STATE_FINALIZED, lifecycle_state_names::FINALIZED); + if (set_component_state(hw_info.first, finalized_state) != return_type::OK) + { + shutdown_status = false; + } + } + return shutdown_status; +} + // CM API: Called in "callback/slow"-thread bool ResourceManager::load_and_initialize_components( const std::string & urdf, const unsigned int update_rate) diff --git a/hardware_interface_testing/CHANGELOG.rst b/hardware_interface_testing/CHANGELOG.rst index cc4c216dc5..4e3a608e09 100644 --- a/hardware_interface_testing/CHANGELOG.rst +++ b/hardware_interface_testing/CHANGELOG.rst @@ -2,6 +2,9 @@ Changelog for package hardware_interface_testing ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +4.25.0 (2025-01-29) +------------------- + 4.24.0 (2025-01-13) ------------------- diff --git a/hardware_interface_testing/package.xml b/hardware_interface_testing/package.xml index 35337fb87c..bc1e76d309 100644 --- a/hardware_interface_testing/package.xml +++ b/hardware_interface_testing/package.xml @@ -1,7 +1,7 @@ hardware_interface_testing - 4.24.0 + 4.25.0 ros2_control hardware interface testing Bence Magyar Denis Štogl diff --git a/joint_limits/CHANGELOG.rst b/joint_limits/CHANGELOG.rst index c78bf55a1c..1826e43211 100644 --- a/joint_limits/CHANGELOG.rst +++ b/joint_limits/CHANGELOG.rst @@ -2,6 +2,12 @@ Changelog for package joint_limits ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +4.25.0 (2025-01-29) +------------------- +* Define _USE_MATH_DEFINES in joint_soft_limiter.cpp to ensure that M_PI is defined (`#2001 `_) +* Use actual position when limiting desired position (`#1988 `_) +* Contributors: Sai Kishor Kothakota, Silvio Traversaro + 4.24.0 (2025-01-13) ------------------- * Return strong type for joint_limits helpers (`#1981 `_) diff --git a/joint_limits/package.xml b/joint_limits/package.xml index 38f81e87c3..479a2b5cba 100644 --- a/joint_limits/package.xml +++ b/joint_limits/package.xml @@ -1,6 +1,6 @@ joint_limits - 4.24.0 + 4.25.0 Package with interfaces for handling of joint limits in controllers or in hardware. The package also implements Saturation Joint Limiter for position-velocity-acceleration set and other individual interfaces. Bence Magyar diff --git a/ros2_control.jazzy.repos b/ros2_control.jazzy.repos index c93d8f4ef6..9e5e3db80e 100644 --- a/ros2_control.jazzy.repos +++ b/ros2_control.jazzy.repos @@ -2,7 +2,7 @@ repositories: ros-controls/realtime_tools: type: git url: https://github.com/ros-controls/realtime_tools.git - version: master + version: jazzy ros-controls/control_msgs: type: git url: https://github.com/ros-controls/control_msgs.git diff --git a/ros2_control/CHANGELOG.rst b/ros2_control/CHANGELOG.rst index f179fd300b..17996f13a1 100644 --- a/ros2_control/CHANGELOG.rst +++ b/ros2_control/CHANGELOG.rst @@ -2,6 +2,9 @@ Changelog for package ros2_control ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +4.25.0 (2025-01-29) +------------------- + 4.24.0 (2025-01-13) ------------------- diff --git a/ros2_control/package.xml b/ros2_control/package.xml index d917067328..7d8344db67 100644 --- a/ros2_control/package.xml +++ b/ros2_control/package.xml @@ -1,7 +1,7 @@ ros2_control - 4.24.0 + 4.25.0 Metapackage for ROS2 control related packages Bence Magyar Denis Štogl diff --git a/ros2_control_test_assets/CHANGELOG.rst b/ros2_control_test_assets/CHANGELOG.rst index affd8f51f4..c397d04da2 100644 --- a/ros2_control_test_assets/CHANGELOG.rst +++ b/ros2_control_test_assets/CHANGELOG.rst @@ -2,6 +2,9 @@ Changelog for package ros2_control_test_assets ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +4.25.0 (2025-01-29) +------------------- + 4.24.0 (2025-01-13) ------------------- diff --git a/ros2_control_test_assets/package.xml b/ros2_control_test_assets/package.xml index e58b60b41c..0565426847 100644 --- a/ros2_control_test_assets/package.xml +++ b/ros2_control_test_assets/package.xml @@ -2,7 +2,7 @@ ros2_control_test_assets - 4.24.0 + 4.25.0 The package provides shared test resources for ros2_control stack Bence Magyar diff --git a/ros2controlcli/CHANGELOG.rst b/ros2controlcli/CHANGELOG.rst index 989e563d40..fdc0d87ffb 100644 --- a/ros2controlcli/CHANGELOG.rst +++ b/ros2controlcli/CHANGELOG.rst @@ -2,6 +2,9 @@ Changelog for package ros2controlcli ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +4.25.0 (2025-01-29) +------------------- + 4.24.0 (2025-01-13) ------------------- diff --git a/ros2controlcli/package.xml b/ros2controlcli/package.xml index a2426f80a9..56e3501b71 100644 --- a/ros2controlcli/package.xml +++ b/ros2controlcli/package.xml @@ -2,7 +2,7 @@ ros2controlcli - 4.24.0 + 4.25.0 The ROS 2 command line tools for ROS2 Control. diff --git a/ros2controlcli/setup.py b/ros2controlcli/setup.py index f48bf95e15..568dcb4faa 100644 --- a/ros2controlcli/setup.py +++ b/ros2controlcli/setup.py @@ -19,7 +19,7 @@ setup( name=package_name, - version="4.24.0", + version="4.25.0", packages=find_packages(exclude=["test"]), data_files=[ ("share/" + package_name, ["package.xml"]), diff --git a/rqt_controller_manager/CHANGELOG.rst b/rqt_controller_manager/CHANGELOG.rst index 53b7cd0444..dbdf0fa4ce 100644 --- a/rqt_controller_manager/CHANGELOG.rst +++ b/rqt_controller_manager/CHANGELOG.rst @@ -2,6 +2,9 @@ Changelog for package rqt_controller_manager ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +4.25.0 (2025-01-29) +------------------- + 4.24.0 (2025-01-13) ------------------- diff --git a/rqt_controller_manager/package.xml b/rqt_controller_manager/package.xml index 26719000f4..2cc29f2b01 100644 --- a/rqt_controller_manager/package.xml +++ b/rqt_controller_manager/package.xml @@ -2,7 +2,7 @@ rqt_controller_manager - 4.24.0 + 4.25.0 Graphical frontend for interacting with the controller manager. Bence Magyar Denis Štogl diff --git a/rqt_controller_manager/setup.py b/rqt_controller_manager/setup.py index 6d221abc07..f8c6993bba 100644 --- a/rqt_controller_manager/setup.py +++ b/rqt_controller_manager/setup.py @@ -20,7 +20,7 @@ setup( name=package_name, - version="4.24.0", + version="4.25.0", packages=[package_name], data_files=[ ("share/ament_index/resource_index/packages", ["resource/" + package_name]), diff --git a/transmission_interface/CHANGELOG.rst b/transmission_interface/CHANGELOG.rst index 4150c6846b..850f5b91b6 100644 --- a/transmission_interface/CHANGELOG.rst +++ b/transmission_interface/CHANGELOG.rst @@ -2,6 +2,9 @@ Changelog for package transmission_interface ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +4.25.0 (2025-01-29) +------------------- + 4.24.0 (2025-01-13) ------------------- diff --git a/transmission_interface/package.xml b/transmission_interface/package.xml index d32c7f0655..c9a91f1a91 100644 --- a/transmission_interface/package.xml +++ b/transmission_interface/package.xml @@ -2,7 +2,7 @@ transmission_interface - 4.24.0 + 4.25.0 transmission_interface contains data structures for representing mechanical transmissions, methods for propagating values between actuator and joint spaces and tooling to support this. Bence Magyar Denis Štogl