From b481dccaa468108c418a19cef2add47eee2fde61 Mon Sep 17 00:00:00 2001 From: Jonas Otto Date: Mon, 22 Jul 2024 16:37:54 +0200 Subject: [PATCH 01/16] initial commit --- battery_state_broadcaster/CMakeLists.txt | 47 ++++++++ battery_state_broadcaster/README.md | 47 ++++++++ .../battery_state_broadcaster.xml | 8 ++ .../BatterySensor.hpp | 36 +++++++ .../BatteryStateBroadcaster.hpp | 34 ++++++ battery_state_broadcaster/package.xml | 20 ++++ .../src/BatteryStateBroadcaster.cpp | 101 ++++++++++++++++++ 7 files changed, 293 insertions(+) create mode 100644 battery_state_broadcaster/CMakeLists.txt create mode 100644 battery_state_broadcaster/README.md create mode 100644 battery_state_broadcaster/battery_state_broadcaster.xml create mode 100644 battery_state_broadcaster/include/battery_state_broadcaster/BatterySensor.hpp create mode 100644 battery_state_broadcaster/include/battery_state_broadcaster/BatteryStateBroadcaster.hpp create mode 100644 battery_state_broadcaster/package.xml create mode 100644 battery_state_broadcaster/src/BatteryStateBroadcaster.cpp diff --git a/battery_state_broadcaster/CMakeLists.txt b/battery_state_broadcaster/CMakeLists.txt new file mode 100644 index 0000000000..90c8f1a880 --- /dev/null +++ b/battery_state_broadcaster/CMakeLists.txt @@ -0,0 +1,47 @@ +cmake_minimum_required(VERSION 3.8) +project(battery_state_broadcaster) + +if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang") + add_compile_options(-Wall -Wextra -Wpedantic) +endif() + +set(THIS_PACKAGE_INCLUDE_DEPENDS + controller_interface + pluginlib + realtime_tools + sensor_msgs +) + +# find dependencies +find_package(ament_cmake REQUIRED) +foreach(dependency IN ITEMS ${THIS_PACKAGE_INCLUDE_DEPENDS}) + find_package(${dependency} REQUIRED) +endforeach() + +add_library(battery_state_broadcaster SHARED src/BatteryStateBroadcaster.cpp) +target_include_directories(battery_state_broadcaster PUBLIC + $ + $ +) +ament_target_dependencies(battery_state_broadcaster PUBLIC ${THIS_PACKAGE_INCLUDE_DEPENDS}) + +pluginlib_export_plugin_description_file(controller_interface battery_state_broadcaster.xml) + +install( + DIRECTORY include/ + DESTINATION include/battery_state_broadcaster +) +install( + TARGETS + battery_state_broadcaster + EXPORT export_battery_state_broadcaster + RUNTIME DESTINATION bin + ARCHIVE DESTINATION lib + LIBRARY DESTINATION lib + INCLUDES DESTINATION include +) + +ament_export_targets(export_battery_state_broadcaster HAS_LIBRARY_TARGET) +ament_export_dependencies(${THIS_PACKAGE_INCLUDE_DEPENDS}) + +ament_package() diff --git a/battery_state_broadcaster/README.md b/battery_state_broadcaster/README.md new file mode 100644 index 0000000000..9ba4ba9d17 --- /dev/null +++ b/battery_state_broadcaster/README.md @@ -0,0 +1,47 @@ +# battery_state_broadcaster +This is a [ros2_control Broadcaster](https://control.ros.org/foxy/doc/ros2_controllers/doc/controllers_index.html#available-broadcasters) which publishes [sensor_msgs/BatteryState](https://github.com/ros2/common_interfaces/blob/rolling/sensor_msgs/msg/BatteryState.msg) messages from appropriage state interfaces. + +## Required State Interfaces +This broadcaster requires the robot to have a sensor component which contains the battery state interfaces: + +```xml + + + + + + + + +``` + +## Parameters +To use this broadcaster, declare it in the controller manager and set its parameters: + +```yaml +controller_manager: + ros__parameters: + battery_state_broadcaster: + type: battery_state_broadcaster/BatteryStateBroadcaster + +battery_state_broadcaster: + ros__parameters: + sensor_name: "battery_state" + design_capacity: 100.0 + # https://github.com/ros2/common_interfaces/blob/rolling/sensor_msgs/msg/BatteryState.msg + power_supply_technology: 2 +``` + +And spawn it in the launch file: + +```python +battery_state_broadcaster_spawner = Node( + package="controller_manager", + executable="spawner", + arguments=["battery_state_broadcaster"], +) +``` + +## Topics +The battery state is published on `~/battery_state`. +Since it's a plugin within the controller manager, add a remapping of the form `("~/battery_state", "/my_battery_state") to the *controller manager*, not the spawner, to change the topic name. diff --git a/battery_state_broadcaster/battery_state_broadcaster.xml b/battery_state_broadcaster/battery_state_broadcaster.xml new file mode 100644 index 0000000000..e4d371b578 --- /dev/null +++ b/battery_state_broadcaster/battery_state_broadcaster.xml @@ -0,0 +1,8 @@ + + + + This controller publishes the readings of a battery sensor as sensor_msgs/BatteryState message. + + + \ No newline at end of file diff --git a/battery_state_broadcaster/include/battery_state_broadcaster/BatterySensor.hpp b/battery_state_broadcaster/include/battery_state_broadcaster/BatterySensor.hpp new file mode 100644 index 0000000000..adb5ef746d --- /dev/null +++ b/battery_state_broadcaster/include/battery_state_broadcaster/BatterySensor.hpp @@ -0,0 +1,36 @@ + +#include +#include +#include +#include + +namespace battery_state_broadcaster +{ +class BatterySensor : public semantic_components::SemanticComponentInterface +{ +public: + explicit BatterySensor(const std::string& name) + : semantic_components::SemanticComponentInterface(name, 1) + { + interface_names_.emplace_back(name_ + "/" + "voltage"); + } + + virtual ~BatterySensor() = default; + + double get_voltage() + { + voltage_ = state_interfaces_[0].get().get_value(); + return voltage_; + } + + bool get_values_as_message(sensor_msgs::msg::BatteryState& message) + { + get_voltage(); + message.voltage = static_cast(voltage_); + return true; + } + +private: + double voltage_ = 0.0; +}; +} // namespace battery_state_broadcaster diff --git a/battery_state_broadcaster/include/battery_state_broadcaster/BatteryStateBroadcaster.hpp b/battery_state_broadcaster/include/battery_state_broadcaster/BatteryStateBroadcaster.hpp new file mode 100644 index 0000000000..e1206b946b --- /dev/null +++ b/battery_state_broadcaster/include/battery_state_broadcaster/BatteryStateBroadcaster.hpp @@ -0,0 +1,34 @@ +#pragma once + +#include +#include +#include +#include + +#include "BatterySensor.hpp" + +namespace battery_state_broadcaster +{ +class BatteryStateBroadcaster : public controller_interface::ControllerInterface +{ +public: + [[nodiscard]] controller_interface::InterfaceConfiguration command_interface_configuration() const override; + + [[nodiscard]] controller_interface::InterfaceConfiguration state_interface_configuration() const override; + + controller_interface::CallbackReturn on_init() override; + + controller_interface::CallbackReturn on_configure(const rclcpp_lifecycle::State& previous_state) override; + + controller_interface::CallbackReturn on_activate(const rclcpp_lifecycle::State& previous_state) override; + + controller_interface::CallbackReturn on_deactivate(const rclcpp_lifecycle::State& previous_state) override; + + controller_interface::return_type update(const rclcpp::Time& time, const rclcpp::Duration& period) override; + +private: + rclcpp::Publisher::SharedPtr battery_state_pub_; + std::unique_ptr battery_sensor_; + std::unique_ptr> realtime_publisher_; +}; +} // namespace battery_state_broadcaster diff --git a/battery_state_broadcaster/package.xml b/battery_state_broadcaster/package.xml new file mode 100644 index 0000000000..dfbeaa4586 --- /dev/null +++ b/battery_state_broadcaster/package.xml @@ -0,0 +1,20 @@ + + + + battery_state_broadcaster + 0.0.0 + ROS2 Control boradcaster for battery state sensors. + Jonas Otto + MIT + + ament_cmake + + controller_interface + pluginlib + realtime_tools + sensor_msgs + + + ament_cmake + + diff --git a/battery_state_broadcaster/src/BatteryStateBroadcaster.cpp b/battery_state_broadcaster/src/BatteryStateBroadcaster.cpp new file mode 100644 index 0000000000..dec9844de3 --- /dev/null +++ b/battery_state_broadcaster/src/BatteryStateBroadcaster.cpp @@ -0,0 +1,101 @@ +#include "battery_state_broadcaster/BatteryStateBroadcaster.hpp" +#include +#include +#include + +namespace battery_state_broadcaster +{ +controller_interface::CallbackReturn BatteryStateBroadcaster::on_init() +{ + get_node()->declare_parameter("sensor_name", "battery_state"); + get_node()->declare_parameter("power_supply_technology", -1); + get_node()->declare_parameter("design_capacity", 0.0); + return CallbackReturn::SUCCESS; +} + +controller_interface::CallbackReturn +BatteryStateBroadcaster::on_configure(const rclcpp_lifecycle::State& /*previous_state*/) +{ + std::string sensor_name = get_node()->get_parameter("sensor_name").as_string(); + + battery_sensor_ = std::make_unique(BatterySensor(sensor_name)); + + battery_state_pub_ = + get_node()->create_publisher("~/battery_state", rclcpp::SystemDefaultsQoS()); + realtime_publisher_ = + std::make_unique>(battery_state_pub_); + + realtime_publisher_->msg_.temperature = std::numeric_limits::quiet_NaN(); + realtime_publisher_->msg_.current = std::numeric_limits::quiet_NaN(); + realtime_publisher_->msg_.charge = std::numeric_limits::quiet_NaN(); + realtime_publisher_->msg_.capacity = std::numeric_limits::quiet_NaN(); + realtime_publisher_->msg_.design_capacity = std::numeric_limits::quiet_NaN(); + realtime_publisher_->msg_.percentage = std::numeric_limits::quiet_NaN(); + realtime_publisher_->msg_.power_supply_status = sensor_msgs::msg::BatteryState::POWER_SUPPLY_STATUS_UNKNOWN; + realtime_publisher_->msg_.power_supply_health = sensor_msgs::msg::BatteryState::POWER_SUPPLY_HEALTH_UNKNOWN; + realtime_publisher_->msg_.power_supply_technology = sensor_msgs::msg::BatteryState::POWER_SUPPLY_TECHNOLOGY_UNKNOWN; + realtime_publisher_->msg_.present = true; + + int64_t psu_tech = get_node()->get_parameter("power_supply_technology").as_int(); + if (psu_tech != -1) + { + realtime_publisher_->msg_.power_supply_technology = psu_tech; + } + + double design_capacity = get_node()->get_parameter("design_capacity").as_double(); + if (design_capacity != 0.0) + { + realtime_publisher_->msg_.design_capacity = static_cast(design_capacity); + } + + return CallbackReturn::SUCCESS; +} + +[[nodiscard]] controller_interface::InterfaceConfiguration +BatteryStateBroadcaster::command_interface_configuration() const +{ + controller_interface::InterfaceConfiguration command_interfaces_config; + command_interfaces_config.type = controller_interface::interface_configuration_type::NONE; + return command_interfaces_config; +} + +[[nodiscard]] controller_interface::InterfaceConfiguration BatteryStateBroadcaster::state_interface_configuration() const +{ + controller_interface::InterfaceConfiguration state_interfaces_config; + state_interfaces_config.type = controller_interface::interface_configuration_type::INDIVIDUAL; + state_interfaces_config.names = battery_sensor_->get_state_interface_names(); + return state_interfaces_config; +} + +controller_interface::CallbackReturn +BatteryStateBroadcaster::on_activate(const rclcpp_lifecycle::State& /*previous_state*/) +{ + battery_sensor_->assign_loaned_state_interfaces(state_interfaces_); + return CallbackReturn::SUCCESS; +} + +controller_interface::CallbackReturn +BatteryStateBroadcaster::on_deactivate(const rclcpp_lifecycle::State& /*previous_state*/) +{ + battery_sensor_->release_interfaces(); + return CallbackReturn::SUCCESS; +} + +controller_interface::return_type BatteryStateBroadcaster::update(const rclcpp::Time& time, + const rclcpp::Duration& /*period*/) +{ + if (realtime_publisher_ && realtime_publisher_->trylock()) + { + realtime_publisher_->msg_.header.stamp = time; + battery_sensor_->get_values_as_message(realtime_publisher_->msg_); + realtime_publisher_->unlockAndPublish(); + } + + return controller_interface::return_type::OK; +} + +} // namespace battery_state_broadcaster + +#include "pluginlib/class_list_macros.hpp" + +PLUGINLIB_EXPORT_CLASS(battery_state_broadcaster::BatteryStateBroadcaster, controller_interface::ControllerInterface) From 44ef76f9f334af2ae77229f72a24ca77ea55e581 Mon Sep 17 00:00:00 2001 From: Jonas Otto Date: Wed, 14 Aug 2024 09:32:11 +0200 Subject: [PATCH 02/16] update changelog --- battery_state_broadcaster/CHANGELOG.rst | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 battery_state_broadcaster/CHANGELOG.rst diff --git a/battery_state_broadcaster/CHANGELOG.rst b/battery_state_broadcaster/CHANGELOG.rst new file mode 100644 index 0000000000..8a25c8c21a --- /dev/null +++ b/battery_state_broadcaster/CHANGELOG.rst @@ -0,0 +1,8 @@ +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Changelog for package battery_state_broadcaster +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Forthcoming +----------- +* initial release +* Contributors: Jonas Otto From b9afbf5486ca4bef441d589cedee5e9bc913935f Mon Sep 17 00:00:00 2001 From: Jonas Otto Date: Wed, 14 Aug 2024 09:32:32 +0200 Subject: [PATCH 03/16] 1.0.0 --- battery_state_broadcaster/CHANGELOG.rst | 4 ++-- battery_state_broadcaster/package.xml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/battery_state_broadcaster/CHANGELOG.rst b/battery_state_broadcaster/CHANGELOG.rst index 8a25c8c21a..862dbdd3a2 100644 --- a/battery_state_broadcaster/CHANGELOG.rst +++ b/battery_state_broadcaster/CHANGELOG.rst @@ -2,7 +2,7 @@ Changelog for package battery_state_broadcaster ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Forthcoming ------------ +1.0.0 (2024-08-14) +------------------ * initial release * Contributors: Jonas Otto diff --git a/battery_state_broadcaster/package.xml b/battery_state_broadcaster/package.xml index dfbeaa4586..7f12c22e8a 100644 --- a/battery_state_broadcaster/package.xml +++ b/battery_state_broadcaster/package.xml @@ -2,7 +2,7 @@ battery_state_broadcaster - 0.0.0 + 1.0.0 ROS2 Control boradcaster for battery state sensors. Jonas Otto MIT From c6b8216241e8d9d0eb8bac74519cef9642537edb Mon Sep 17 00:00:00 2001 From: Jonas Otto Date: Mon, 3 Feb 2025 11:10:50 +0100 Subject: [PATCH 04/16] fix realtime_tools include --- .../battery_state_broadcaster/BatteryStateBroadcaster.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/battery_state_broadcaster/include/battery_state_broadcaster/BatteryStateBroadcaster.hpp b/battery_state_broadcaster/include/battery_state_broadcaster/BatteryStateBroadcaster.hpp index e1206b946b..2008cb81b5 100644 --- a/battery_state_broadcaster/include/battery_state_broadcaster/BatteryStateBroadcaster.hpp +++ b/battery_state_broadcaster/include/battery_state_broadcaster/BatteryStateBroadcaster.hpp @@ -2,7 +2,7 @@ #include #include -#include +#include #include #include "BatterySensor.hpp" From d8c933975e6c06de6639cbf13f671f6523568eb4 Mon Sep 17 00:00:00 2001 From: Jonas Otto Date: Thu, 6 Feb 2025 15:48:17 +0100 Subject: [PATCH 05/16] changelog --- battery_state_broadcaster/CHANGELOG.rst | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/battery_state_broadcaster/CHANGELOG.rst b/battery_state_broadcaster/CHANGELOG.rst index 862dbdd3a2..d166cfafe5 100644 --- a/battery_state_broadcaster/CHANGELOG.rst +++ b/battery_state_broadcaster/CHANGELOG.rst @@ -2,6 +2,11 @@ Changelog for package battery_state_broadcaster ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Forthcoming +----------- +* fix realtime_tools include +* Contributors: Jonas Otto + 1.0.0 (2024-08-14) ------------------ * initial release From d7068f377637756fc64f7a56f5df1affe5367344 Mon Sep 17 00:00:00 2001 From: Jonas Otto Date: Thu, 6 Feb 2025 15:48:49 +0100 Subject: [PATCH 06/16] 1.0.1 --- battery_state_broadcaster/CHANGELOG.rst | 4 ++-- battery_state_broadcaster/package.xml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/battery_state_broadcaster/CHANGELOG.rst b/battery_state_broadcaster/CHANGELOG.rst index d166cfafe5..c44cd2601f 100644 --- a/battery_state_broadcaster/CHANGELOG.rst +++ b/battery_state_broadcaster/CHANGELOG.rst @@ -2,8 +2,8 @@ Changelog for package battery_state_broadcaster ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Forthcoming ------------ +1.0.1 (2025-02-06) +------------------ * fix realtime_tools include * Contributors: Jonas Otto diff --git a/battery_state_broadcaster/package.xml b/battery_state_broadcaster/package.xml index 7f12c22e8a..b2f2a4fe50 100644 --- a/battery_state_broadcaster/package.xml +++ b/battery_state_broadcaster/package.xml @@ -2,7 +2,7 @@ battery_state_broadcaster - 1.0.0 + 1.0.1 ROS2 Control boradcaster for battery state sensors. Jonas Otto MIT From 6f49fe867b20d29a4c10c2309b1c7e5eae3cf51b Mon Sep 17 00:00:00 2001 From: Alejandro Hernandez Cordero Date: Fri, 23 May 2025 00:14:59 +0200 Subject: [PATCH 07/16] Replace ament_target_dependencies with target_link_libraries Signed-off-by: Alejandro Hernandez Cordero --- battery_state_broadcaster/CMakeLists.txt | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/battery_state_broadcaster/CMakeLists.txt b/battery_state_broadcaster/CMakeLists.txt index 90c8f1a880..3543845c70 100644 --- a/battery_state_broadcaster/CMakeLists.txt +++ b/battery_state_broadcaster/CMakeLists.txt @@ -14,16 +14,23 @@ set(THIS_PACKAGE_INCLUDE_DEPENDS # find dependencies find_package(ament_cmake REQUIRED) -foreach(dependency IN ITEMS ${THIS_PACKAGE_INCLUDE_DEPENDS}) - find_package(${dependency} REQUIRED) -endforeach() +find_package(controller_interface REQUIRED) +find_package(pluginlib REQUIRED) +find_package(realtime_tools REQUIRED) +find_package(sensor_msgs REQUIRED) add_library(battery_state_broadcaster SHARED src/BatteryStateBroadcaster.cpp) target_include_directories(battery_state_broadcaster PUBLIC $ $ ) -ament_target_dependencies(battery_state_broadcaster PUBLIC ${THIS_PACKAGE_INCLUDE_DEPENDS}) +target_link_libraries(battery_state_broadcaster + PUBLIC + controller_interface::controller_interface + pluginlib::pluginlib + realtime_tools::realtime_tools + ${sensor_msgs_TARGETS} +) pluginlib_export_plugin_description_file(controller_interface battery_state_broadcaster.xml) From c2415044938cef459d5c10061413d210d4eddcdf Mon Sep 17 00:00:00 2001 From: Jonas Otto Date: Sun, 1 Jun 2025 11:52:09 +0200 Subject: [PATCH 08/16] update changelog --- battery_state_broadcaster/CHANGELOG.rst | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/battery_state_broadcaster/CHANGELOG.rst b/battery_state_broadcaster/CHANGELOG.rst index c44cd2601f..156cf82f24 100644 --- a/battery_state_broadcaster/CHANGELOG.rst +++ b/battery_state_broadcaster/CHANGELOG.rst @@ -2,6 +2,11 @@ Changelog for package battery_state_broadcaster ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Forthcoming +----------- +* Replace ament_target_dependencies with target_link_libraries ([#6](https://github.com/ipa320/ros_battery_monitoring/issues/6)) +* Contributors: Alejandro Hernandez Cordero, Jonas Otto + 1.0.1 (2025-02-06) ------------------ * fix realtime_tools include From 1f7717f4047883ae0a0c85c3c90734c710fbe8ff Mon Sep 17 00:00:00 2001 From: Jonas Otto Date: Sun, 1 Jun 2025 11:52:21 +0200 Subject: [PATCH 09/16] 1.0.2 --- battery_state_broadcaster/CHANGELOG.rst | 4 ++-- battery_state_broadcaster/package.xml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/battery_state_broadcaster/CHANGELOG.rst b/battery_state_broadcaster/CHANGELOG.rst index 156cf82f24..b1eb4482be 100644 --- a/battery_state_broadcaster/CHANGELOG.rst +++ b/battery_state_broadcaster/CHANGELOG.rst @@ -2,8 +2,8 @@ Changelog for package battery_state_broadcaster ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Forthcoming ------------ +1.0.2 (2025-06-01) +------------------ * Replace ament_target_dependencies with target_link_libraries ([#6](https://github.com/ipa320/ros_battery_monitoring/issues/6)) * Contributors: Alejandro Hernandez Cordero, Jonas Otto diff --git a/battery_state_broadcaster/package.xml b/battery_state_broadcaster/package.xml index b2f2a4fe50..c5595fa82c 100644 --- a/battery_state_broadcaster/package.xml +++ b/battery_state_broadcaster/package.xml @@ -2,7 +2,7 @@ battery_state_broadcaster - 1.0.1 + 1.0.2 ROS2 Control boradcaster for battery state sensors. Jonas Otto MIT From fcd8c5b2b0c519ee3911e9c4e62580acadbb0a53 Mon Sep 17 00:00:00 2001 From: Christoph Froehlich Date: Fri, 26 Sep 2025 08:42:23 +0000 Subject: [PATCH 10/16] Don't make a temporary copy --- battery_state_broadcaster/src/BatteryStateBroadcaster.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/battery_state_broadcaster/src/BatteryStateBroadcaster.cpp b/battery_state_broadcaster/src/BatteryStateBroadcaster.cpp index dec9844de3..4301d56826 100644 --- a/battery_state_broadcaster/src/BatteryStateBroadcaster.cpp +++ b/battery_state_broadcaster/src/BatteryStateBroadcaster.cpp @@ -18,7 +18,7 @@ BatteryStateBroadcaster::on_configure(const rclcpp_lifecycle::State& /*previous_ { std::string sensor_name = get_node()->get_parameter("sensor_name").as_string(); - battery_sensor_ = std::make_unique(BatterySensor(sensor_name)); + battery_sensor_ = std::make_unique(sensor_name); battery_state_pub_ = get_node()->create_publisher("~/battery_state", rclcpp::SystemDefaultsQoS()); From fdacb10cdad5d1d8df45880c4c4a5f8179e04ac3 Mon Sep 17 00:00:00 2001 From: Jonas Otto Date: Fri, 26 Sep 2025 21:12:28 +0200 Subject: [PATCH 11/16] address deprecations in ros2_control for kilted --- .../include/battery_state_broadcaster/BatterySensor.hpp | 2 +- .../src/BatteryStateBroadcaster.cpp | 9 +++++---- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/battery_state_broadcaster/include/battery_state_broadcaster/BatterySensor.hpp b/battery_state_broadcaster/include/battery_state_broadcaster/BatterySensor.hpp index adb5ef746d..eb3330c172 100644 --- a/battery_state_broadcaster/include/battery_state_broadcaster/BatterySensor.hpp +++ b/battery_state_broadcaster/include/battery_state_broadcaster/BatterySensor.hpp @@ -19,7 +19,7 @@ class BatterySensor : public semantic_components::SemanticComponentInterfacetrylock()) + if (realtime_publisher_) { - realtime_publisher_->msg_.header.stamp = time; - battery_sensor_->get_values_as_message(realtime_publisher_->msg_); - realtime_publisher_->unlockAndPublish(); + sensor_msgs::msg::BatteryState msg_; + msg_.header.stamp = time; + battery_sensor_->get_values_as_message(msg_); + realtime_publisher_->try_publish(msg_); } return controller_interface::return_type::OK; From 08f289cf2055bf175a53f7ac8a05466d9149fe69 Mon Sep 17 00:00:00 2001 From: Jonas Otto Date: Fri, 26 Sep 2025 21:14:41 +0200 Subject: [PATCH 12/16] changelog --- battery_state_broadcaster/CHANGELOG.rst | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/battery_state_broadcaster/CHANGELOG.rst b/battery_state_broadcaster/CHANGELOG.rst index b1eb4482be..b73e8ba692 100644 --- a/battery_state_broadcaster/CHANGELOG.rst +++ b/battery_state_broadcaster/CHANGELOG.rst @@ -2,6 +2,12 @@ Changelog for package battery_state_broadcaster ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Forthcoming +----------- +* address deprecations in ros2_control for kilted +* Don't make a temporary copy of semantic component (https://github.com/ipa320/ros_battery_monitoring/pull/9) +* Contributors: Christoph Froehlich, Jonas Otto + 1.0.2 (2025-06-01) ------------------ * Replace ament_target_dependencies with target_link_libraries ([#6](https://github.com/ipa320/ros_battery_monitoring/issues/6)) From 629f2b062dc8bcd7965ac619dced65ec4612bc5e Mon Sep 17 00:00:00 2001 From: Jonas Otto Date: Fri, 26 Sep 2025 21:14:59 +0200 Subject: [PATCH 13/16] 1.1.0 --- battery_state_broadcaster/CHANGELOG.rst | 4 ++-- battery_state_broadcaster/package.xml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/battery_state_broadcaster/CHANGELOG.rst b/battery_state_broadcaster/CHANGELOG.rst index b73e8ba692..ffc7e8f7bf 100644 --- a/battery_state_broadcaster/CHANGELOG.rst +++ b/battery_state_broadcaster/CHANGELOG.rst @@ -2,8 +2,8 @@ Changelog for package battery_state_broadcaster ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Forthcoming ------------ +1.1.0 (2025-09-26) +------------------ * address deprecations in ros2_control for kilted * Don't make a temporary copy of semantic component (https://github.com/ipa320/ros_battery_monitoring/pull/9) * Contributors: Christoph Froehlich, Jonas Otto diff --git a/battery_state_broadcaster/package.xml b/battery_state_broadcaster/package.xml index c5595fa82c..fae83a820b 100644 --- a/battery_state_broadcaster/package.xml +++ b/battery_state_broadcaster/package.xml @@ -2,7 +2,7 @@ battery_state_broadcaster - 1.0.2 + 1.1.0 ROS2 Control boradcaster for battery state sensors. Jonas Otto MIT From ee5fd7405904b90a3189d329d6c560b2d53c3aeb Mon Sep 17 00:00:00 2001 From: Michal Sojka Date: Sun, 7 Dec 2025 23:08:42 +0100 Subject: [PATCH 14/16] Fix compile error with latest realtime_tools MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Recent commit in realtime_tools [1] causes the following compilation failure: battery_state_broadcaster/src/BatteryStateBroadcaster.cpp:28:24: error: ‘sensor_msgs::msg::BatteryState_ > realtime_tools::RealtimePublisher > >::msg_’ is private within this context This commit fixes that. [1]: https://github.com/ros-controls/realtime_tools/pull/423/commits/9e26e41bc49f9439cc9754bd5941c615a8599098 --- .../BatteryStateBroadcaster.hpp | 1 + .../src/BatteryStateBroadcaster.cpp | 25 +++++++++---------- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/battery_state_broadcaster/include/battery_state_broadcaster/BatteryStateBroadcaster.hpp b/battery_state_broadcaster/include/battery_state_broadcaster/BatteryStateBroadcaster.hpp index 2008cb81b5..16fb6a8022 100644 --- a/battery_state_broadcaster/include/battery_state_broadcaster/BatteryStateBroadcaster.hpp +++ b/battery_state_broadcaster/include/battery_state_broadcaster/BatteryStateBroadcaster.hpp @@ -30,5 +30,6 @@ class BatteryStateBroadcaster : public controller_interface::ControllerInterface rclcpp::Publisher::SharedPtr battery_state_pub_; std::unique_ptr battery_sensor_; std::unique_ptr> realtime_publisher_; + sensor_msgs::msg::BatteryState msg_; }; } // namespace battery_state_broadcaster diff --git a/battery_state_broadcaster/src/BatteryStateBroadcaster.cpp b/battery_state_broadcaster/src/BatteryStateBroadcaster.cpp index a7ef910aa7..f6432b3960 100644 --- a/battery_state_broadcaster/src/BatteryStateBroadcaster.cpp +++ b/battery_state_broadcaster/src/BatteryStateBroadcaster.cpp @@ -25,27 +25,27 @@ BatteryStateBroadcaster::on_configure(const rclcpp_lifecycle::State& /*previous_ realtime_publisher_ = std::make_unique>(battery_state_pub_); - realtime_publisher_->msg_.temperature = std::numeric_limits::quiet_NaN(); - realtime_publisher_->msg_.current = std::numeric_limits::quiet_NaN(); - realtime_publisher_->msg_.charge = std::numeric_limits::quiet_NaN(); - realtime_publisher_->msg_.capacity = std::numeric_limits::quiet_NaN(); - realtime_publisher_->msg_.design_capacity = std::numeric_limits::quiet_NaN(); - realtime_publisher_->msg_.percentage = std::numeric_limits::quiet_NaN(); - realtime_publisher_->msg_.power_supply_status = sensor_msgs::msg::BatteryState::POWER_SUPPLY_STATUS_UNKNOWN; - realtime_publisher_->msg_.power_supply_health = sensor_msgs::msg::BatteryState::POWER_SUPPLY_HEALTH_UNKNOWN; - realtime_publisher_->msg_.power_supply_technology = sensor_msgs::msg::BatteryState::POWER_SUPPLY_TECHNOLOGY_UNKNOWN; - realtime_publisher_->msg_.present = true; + msg_.temperature = std::numeric_limits::quiet_NaN(); + msg_.current = std::numeric_limits::quiet_NaN(); + msg_.charge = std::numeric_limits::quiet_NaN(); + msg_.capacity = std::numeric_limits::quiet_NaN(); + msg_.design_capacity = std::numeric_limits::quiet_NaN(); + msg_.percentage = std::numeric_limits::quiet_NaN(); + msg_.power_supply_status = sensor_msgs::msg::BatteryState::POWER_SUPPLY_STATUS_UNKNOWN; + msg_.power_supply_health = sensor_msgs::msg::BatteryState::POWER_SUPPLY_HEALTH_UNKNOWN; + msg_.power_supply_technology = sensor_msgs::msg::BatteryState::POWER_SUPPLY_TECHNOLOGY_UNKNOWN; + msg_.present = true; int64_t psu_tech = get_node()->get_parameter("power_supply_technology").as_int(); if (psu_tech != -1) { - realtime_publisher_->msg_.power_supply_technology = psu_tech; + msg_.power_supply_technology = psu_tech; } double design_capacity = get_node()->get_parameter("design_capacity").as_double(); if (design_capacity != 0.0) { - realtime_publisher_->msg_.design_capacity = static_cast(design_capacity); + msg_.design_capacity = static_cast(design_capacity); } return CallbackReturn::SUCCESS; @@ -86,7 +86,6 @@ controller_interface::return_type BatteryStateBroadcaster::update(const rclcpp:: { if (realtime_publisher_) { - sensor_msgs::msg::BatteryState msg_; msg_.header.stamp = time; battery_sensor_->get_values_as_message(msg_); realtime_publisher_->try_publish(msg_); From 7561656274ab904aeb5833099571b26ed1db910e Mon Sep 17 00:00:00 2001 From: Christoph Froehlich Date: Wed, 31 Dec 2025 10:14:11 +0000 Subject: [PATCH 15/16] Convert docs to rst --- battery_state_broadcaster/README.md | 47 ----------------------------- doc/controllers_index.rst | 1 + 2 files changed, 1 insertion(+), 47 deletions(-) delete mode 100644 battery_state_broadcaster/README.md diff --git a/battery_state_broadcaster/README.md b/battery_state_broadcaster/README.md deleted file mode 100644 index 9ba4ba9d17..0000000000 --- a/battery_state_broadcaster/README.md +++ /dev/null @@ -1,47 +0,0 @@ -# battery_state_broadcaster -This is a [ros2_control Broadcaster](https://control.ros.org/foxy/doc/ros2_controllers/doc/controllers_index.html#available-broadcasters) which publishes [sensor_msgs/BatteryState](https://github.com/ros2/common_interfaces/blob/rolling/sensor_msgs/msg/BatteryState.msg) messages from appropriage state interfaces. - -## Required State Interfaces -This broadcaster requires the robot to have a sensor component which contains the battery state interfaces: - -```xml - - - - - - - - -``` - -## Parameters -To use this broadcaster, declare it in the controller manager and set its parameters: - -```yaml -controller_manager: - ros__parameters: - battery_state_broadcaster: - type: battery_state_broadcaster/BatteryStateBroadcaster - -battery_state_broadcaster: - ros__parameters: - sensor_name: "battery_state" - design_capacity: 100.0 - # https://github.com/ros2/common_interfaces/blob/rolling/sensor_msgs/msg/BatteryState.msg - power_supply_technology: 2 -``` - -And spawn it in the launch file: - -```python -battery_state_broadcaster_spawner = Node( - package="controller_manager", - executable="spawner", - arguments=["battery_state_broadcaster"], -) -``` - -## Topics -The battery state is published on `~/battery_state`. -Since it's a plugin within the controller manager, add a remapping of the form `("~/battery_state", "/my_battery_state") to the *controller manager*, not the spawner, to change the topic name. diff --git a/doc/controllers_index.rst b/doc/controllers_index.rst index b8e9f8a8ca..f87f3dadb5 100644 --- a/doc/controllers_index.rst +++ b/doc/controllers_index.rst @@ -66,6 +66,7 @@ In the sense of ros2_control, broadcasters are still controllers using the same Pose Broadcaster <../pose_broadcaster/doc/userdoc.rst> GPS Sensor Broadcaster <../gps_sensor_broadcaster/doc/userdoc.rst> State Interfaces Broadcaster <../state_interfaces_broadcaster/doc/userdoc.rst> + Battery State Broadcaster <../battery_state_broadcaster/doc/userdoc.rst> Filters ********************** From 6d986a68e9d7b7e56314a48852d42541f5bc6850 Mon Sep 17 00:00:00 2001 From: Christoph Froehlich Date: Wed, 31 Dec 2025 10:36:08 +0000 Subject: [PATCH 16/16] Add doc folder --- battery_state_broadcaster/doc/userdoc.rst | 55 +++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 battery_state_broadcaster/doc/userdoc.rst diff --git a/battery_state_broadcaster/doc/userdoc.rst b/battery_state_broadcaster/doc/userdoc.rst new file mode 100644 index 0000000000..85c091c5d7 --- /dev/null +++ b/battery_state_broadcaster/doc/userdoc.rst @@ -0,0 +1,55 @@ +:github_url: https://github.com/ros-controls/ros2_controllers/blob/{REPOS_FILE_BRANCH}/battery_state_broadcaster/doc/userdoc.rst + +.. _battery_state_broadcaster_userdoc: + +Battery State Broadcaster +========================= +This broadcaster publishes `sensor_msgs/BatteryState `__ messages from appropriate state interfaces. + + +Required State Interfaces +--------------------------------- +This broadcaster requires the robot to have a sensor component which contains the battery state interfaces: + +.. code-block:: xml + + + + + + + + + + +Parameters +--------------------------------- +To use this broadcaster, declare it in the controller manager and set its parameters: + +.. code-block:: yaml + + controller_manager: + ros__parameters: + battery_state_broadcaster: + type: battery_state_broadcaster/BatteryStateBroadcaster + + battery_state_broadcaster: + ros__parameters: + sensor_name: "battery_state" + design_capacity: 100.0 + # https://github.com/ros2/common_interfaces/blob/rolling/sensor_msgs/msg/BatteryState.msg + power_supply_technology: 2 + +And spawn it in the launch file: + +.. code-block:: python + + battery_state_broadcaster_spawner = Node( + package="controller_manager", + executable="spawner", + arguments=["battery_state_broadcaster"] + +Topics +--------------------------------- +The battery state is published on ``~/battery_state``. +Since it's a plugin within the controller manager, add a remapping of the form ``("~/battery_state", "/my_battery_state")`` to the *controller manager*, not the spawner, to change the topic name.