Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
4931294
Add initial commit of generic state broadcaster
saikishor Nov 9, 2025
6875e65
Add first version of the tests
saikishor Nov 9, 2025
7e8e34a
change to new message types
saikishor Nov 16, 2025
d2a4b58
update tests
saikishor Nov 16, 2025
6e2980f
add state broadcaster params file
saikishor Nov 17, 2025
bfe9c80
rename the package to interfaces state broadcaster
saikishor Nov 17, 2025
a0b0b1c
Add release_notes
saikishor Nov 17, 2025
ce8f111
Merge branch 'master' into add/generic_state_broadcaster
saikishor Dec 10, 2025
dc9b673
Apply suggestions from code review
saikishor Dec 10, 2025
ec48562
Apply suggestions from code review
saikishor Dec 10, 2025
fdb6f6b
Apply suggestions from code review
saikishor Dec 10, 2025
b143897
Apply suggestions from code review
saikishor Dec 10, 2025
839dec3
pre-commit and minor fixes
saikishor Dec 10, 2025
69a46f8
remove wrong include
saikishor Dec 10, 2025
3e2b8ce
fix compilation
saikishor Dec 14, 2025
00c3fc3
Update interfaces_state_broadcaster/src/interfaces_state_broadcaster.cpp
saikishor Dec 14, 2025
7769bc6
Merge branch 'master' into add/generic_state_broadcaster
saikishor Dec 14, 2025
8b381ec
add pre-commit changes
saikishor Dec 14, 2025
a5bbdb1
update the documentation
saikishor Dec 14, 2025
6d07b97
Rename the package to state_interfaces_broadcaster
saikishor Dec 15, 2025
574ecab
add changes to support double data type
saikishor Dec 15, 2025
a8eb06a
Update state_interfaces_broadcaster/doc/userdoc.rst
saikishor Dec 15, 2025
a27c304
Apply suggestions from code review
christophfroehlich Dec 15, 2025
8b317e1
Update CMakeLists.txt
christophfroehlich Dec 15, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions doc/controllers_index.rst
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,7 @@ In the sense of ros2_control, broadcasters are still controllers using the same
Range Sensor Broadcaster <../range_sensor_broadcaster/doc/userdoc.rst>
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>

Filters
**********************
Expand Down
4 changes: 4 additions & 0 deletions doc/release_notes.rst
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,10 @@ Release Notes: Kilted Kaiju to Lyrical Luth

This list summarizes important changes between Kilted Kaiju (previous) and Lyrical Luth (current) releases.

state_interfaces_broadcaster
*********************************
* 🚀 The state_interfaces_broadcaster was added 🎉 (`#2006 <https://github.com/ros-controls/ros2_controllers/pull/2006>`_).

force_torque_sensor_broadcaster
*******************************
* Added support for transforming Wrench messages to a given list of target frames. This is useful when applications need force/torque data in their preferred coordinate frames. (`#2021 <https://github.com/ros-controls/ros2_controllers/pull/2021/files>`__).
Expand Down
4 changes: 4 additions & 0 deletions ros2_controllers/doc/index.rst
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,10 @@ For more information of the ros2_control framework see `control.ros.org <https:/
- `Documentation <https://control.ros.org/master/doc/ros2_controllers/range_sensor_broadcaster/doc/userdoc.html>`__
- `API <http://docs.ros.org/en/rolling/p/range_sensor_broadcaster/>`__
- `ROS Index <https://index.ros.org/p/range_sensor_broadcaster/>`__
* - state_interfaces_broadcaster
- `Documentation <https://control.ros.org/master/doc/ros2_controllers/state_interfaces_broadcaster/doc/userdoc.html>`__
- `API <http://docs.ros.org/en/rolling/p/state_interfaces_broadcaster/>`__
- `ROS Index <https://index.ros.org/p/state_interfaces_broadcaster/>`__
* - steering_controllers_library
- `Documentation <https://control.ros.org/master/doc/ros2_controllers/steering_controllers_library/doc/userdoc.html>`__
- `API <http://docs.ros.org/en/rolling/p/steering_controllers_library/>`__
Expand Down
1 change: 1 addition & 0 deletions ros2_controllers/package.xml
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@
<exec_depend>pose_broadcaster</exec_depend>
<exec_depend>position_controllers</exec_depend>
<exec_depend>range_sensor_broadcaster</exec_depend>
<exec_depend>state_interfaces_broadcaster</exec_depend>
<exec_depend>steering_controllers_library</exec_depend>
<exec_depend>tricycle_controller</exec_depend>
<exec_depend>tricycle_steering_controller</exec_depend>
Expand Down
92 changes: 92 additions & 0 deletions state_interfaces_broadcaster/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
cmake_minimum_required(VERSION 3.16)
project(state_interfaces_broadcaster)

find_package(ros2_control_cmake REQUIRED)
set_compiler_options()
export_windows_symbols()

set(THIS_PACKAGE_INCLUDE_DEPENDS
control_msgs
controller_interface
generate_parameter_library
pluginlib
rclcpp_lifecycle
realtime_tools
)

find_package(ament_cmake REQUIRED)
find_package(backward_ros REQUIRED)
foreach(Dependency IN ITEMS ${THIS_PACKAGE_INCLUDE_DEPENDS})
find_package(${Dependency} REQUIRED)
endforeach()

generate_parameter_library(state_interfaces_broadcaster_parameters
src/state_interfaces_broadcaster_parameters.yaml
)

add_library(state_interfaces_broadcaster SHARED
src/state_interfaces_broadcaster.cpp
)
target_compile_features(state_interfaces_broadcaster PUBLIC cxx_std_17)
target_include_directories(state_interfaces_broadcaster PUBLIC
$<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include>
$<INSTALL_INTERFACE:include/state_interfaces_broadcaster>
)
target_link_libraries(state_interfaces_broadcaster PUBLIC
state_interfaces_broadcaster_parameters
controller_interface::controller_interface
pluginlib::pluginlib
rclcpp::rclcpp
rclcpp_lifecycle::rclcpp_lifecycle
realtime_tools::realtime_tools
${control_msgs_TARGETS}
)
pluginlib_export_plugin_description_file(controller_interface state_interfaces_broadcaster_plugin.xml)

if(BUILD_TESTING)
find_package(ament_cmake_gmock REQUIRED)
find_package(controller_manager REQUIRED)
find_package(hardware_interface REQUIRED)
find_package(rclcpp REQUIRED)
find_package(ros2_control_test_assets REQUIRED)

ament_add_gmock(test_load_state_interfaces_broadcaster
test/test_load_state_interfaces_broadcaster.cpp
)
target_link_libraries(test_load_state_interfaces_broadcaster
state_interfaces_broadcaster
controller_manager::controller_manager
hardware_interface::hardware_interface
rclcpp::rclcpp
ros2_control_test_assets::ros2_control_test_assets)
target_compile_definitions(
test_load_state_interfaces_broadcaster
PRIVATE PARAMETERS_FILE_PATH="${CMAKE_CURRENT_LIST_DIR}/test/test_state_interfaces_broadcaster_params.yaml")

ament_add_gmock(test_state_interfaces_broadcaster
test/test_state_interfaces_broadcaster.cpp
)
target_link_libraries(test_state_interfaces_broadcaster
state_interfaces_broadcaster
ros2_control_test_assets::ros2_control_test_assets
rclcpp::rclcpp
${control_msgs_TARGETS})
endif()

install(
DIRECTORY include/
DESTINATION include/state_interfaces_broadcaster
)
install(
TARGETS
state_interfaces_broadcaster
state_interfaces_broadcaster_parameters
EXPORT export_state_interfaces_broadcaster
RUNTIME DESTINATION bin
ARCHIVE DESTINATION lib
LIBRARY DESTINATION lib
)

ament_export_targets(export_state_interfaces_broadcaster HAS_LIBRARY_TARGET)
ament_export_dependencies(${THIS_PACKAGE_INCLUDE_DEPENDS})
ament_package()
28 changes: 28 additions & 0 deletions state_interfaces_broadcaster/doc/userdoc.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
:github_url: https://github.com/ros-controls/ros2_controllers/blob/{REPOS_FILE_BRANCH}/state_interfaces_broadcaster/doc/userdoc.rst

.. _state_interfaces_broadcaster_userdoc:

State Interfaces Broadcaster
--------------------------------
The State Interfaces Broadcaster publishes the state of specified hardware interfaces of double data type.
The broadcaster publishes two topics:

- ``/state_interfaces_broadcaster/names``: Publishes the names of the hardware interfaces being monitored with a message type of ``control_msgs/msg/Keys``.
- ``/state_interfaces_broadcaster/values``: Publishes the current state values of the specified hardware interfaces with a message type of ``control_msgs/msg/Float64Values``.

Parameters
^^^^^^^^^^^
This controller uses the `generate_parameter_library <https://github.com/PickNikRobotics/generate_parameter_library>`_ to handle its parameters. The parameter `definition file located in the src folder <https://github.com/ros-controls/ros2_controllers/blob/{REPOS_FILE_BRANCH}/state_interfaces_broadcaster/src/state_interfaces_broadcaster_parameters.yaml>`_ contains descriptions for all the parameters used by the controller.

List of parameters
=========================
.. generate_parameter_library_details:: ../src/state_interfaces_broadcaster_parameters.yaml


An example parameter file
=========================

An example parameter file for this controller can be found in `the test directory <https://github.com/ros-controls/ros2_controllers/blob/{REPOS_FILE_BRANCH}/state_interfaces_broadcaster/test/test_state_interfaces_broadcaster_params.yaml>`_:

.. literalinclude:: ../test/test_state_interfaces_broadcaster_params.yaml
:language: yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
// Copyright (c) 2025, PAL Robotics
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#ifndef STATE_INTERFACES_BROADCASTER__STATE_INTERFACES_BROADCASTER_HPP_
#define STATE_INTERFACES_BROADCASTER__STATE_INTERFACES_BROADCASTER_HPP_

#include <memory>
#include <string>
#include <vector>

#include "control_msgs/msg/float64_values.hpp"
#include "control_msgs/msg/keys.hpp"
#include "controller_interface/controller_interface.hpp"
#include "realtime_tools/realtime_publisher.hpp"

// auto-generated by generate_parameter_library
#include "state_interfaces_broadcaster/state_interfaces_broadcaster_parameters.hpp"

namespace state_interfaces_broadcaster
{
/**
* \brief State Interfaces Broadcaster for selected state interfaces in a ros2_control system.
*
* StateInterfacesBroadcaster publishes the selected state interfaces from ros2_control as ROS
* messages.
*
* Publishes to:
* - \b ~/names (control_msgs::msg::Keys): The list of the interface names that are selected
* to be published by the interfaces state broadcaster. This is published with transient local
* durability.
* - \b ~/values (control_msgs::msg::Float64Values): The list of the values corresponding to the
* interface names that are selected to be published by the interfaces state broadcaster.
*
* \note The values are published at the same rate as the controller update rate.
*/
class StateInterfacesBroadcaster : public controller_interface::ControllerInterface
{
public:
StateInterfacesBroadcaster();

controller_interface::InterfaceConfiguration command_interface_configuration() const override;

controller_interface::InterfaceConfiguration state_interface_configuration() const override;

controller_interface::return_type update(
const rclcpp::Time & time, const rclcpp::Duration & period) 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;

protected:
// Optional parameters
std::shared_ptr<ParamListener> param_listener_;
Params params_;

// publishers and messages
std::shared_ptr<rclcpp::Publisher<control_msgs::msg::Keys>> names_publisher_;
std::shared_ptr<rclcpp::Publisher<control_msgs::msg::Float64Values>> values_publisher_;
std::shared_ptr<realtime_tools::RealtimePublisher<control_msgs::msg::Float64Values>>
realtime_values_publisher_;
control_msgs::msg::Keys names_msg_;
control_msgs::msg::Float64Values values_msg_;
};

} // namespace state_interfaces_broadcaster

#endif // STATE_INTERFACES_BROADCASTER__STATE_INTERFACES_BROADCASTER_HPP_
41 changes: 41 additions & 0 deletions state_interfaces_broadcaster/package.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
<?xml version="1.0"?>
<package format="3">
<name>state_interfaces_broadcaster</name>
<version>6.1.0</version>
<description>Broadcaster to publish the requested hardware interface states</description>

<maintainer email="[email protected]">Bence Magyar</maintainer>
<maintainer email="[email protected]">Denis Štogl</maintainer>
<maintainer email="[email protected]">Christoph Froehlich</maintainer>
<maintainer email="[email protected]">Sai Kishor Kothakota</maintainer>

<author email="[email protected]">Sai Kishor Kothakota</author>

<license>Apache License 2.0</license>

<url type="website">https://control.ros.org</url>
<url type="bugtracker">https://github.com/ros-controls/ros2_controllers/issues</url>
<url type="repository">https://github.com/ros-controls/ros2_controllers/</url>

<buildtool_depend>ament_cmake</buildtool_depend>

<build_depend>ros2_control_cmake</build_depend>

<depend>backward_ros</depend>
<depend>control_msgs</depend>
<depend>controller_interface</depend>
<depend>generate_parameter_library</depend>
<depend>pluginlib</depend>
<depend>rclcpp_lifecycle</depend>
<depend>rclcpp</depend>
<depend>realtime_tools</depend>

<test_depend>ament_cmake_gmock</test_depend>
<test_depend>controller_manager</test_depend>
<test_depend>hardware_interface</test_depend>
<test_depend>ros2_control_test_assets</test_depend>

<export>
<build_type>ament_cmake</build_type>
</export>
</package>
Loading
Loading