Skip to content

Commit ef3167d

Browse files
authored
Add state_interfaces_broadcaster (#2006)
1 parent 73bad72 commit ef3167d

15 files changed

+847
-0
lines changed

doc/controllers_index.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ In the sense of ros2_control, broadcasters are still controllers using the same
6565
Range Sensor Broadcaster <../range_sensor_broadcaster/doc/userdoc.rst>
6666
Pose Broadcaster <../pose_broadcaster/doc/userdoc.rst>
6767
GPS Sensor Broadcaster <../gps_sensor_broadcaster/doc/userdoc.rst>
68+
State Interfaces Broadcaster <../state_interfaces_broadcaster/doc/userdoc.rst>
6869

6970
Filters
7071
**********************

doc/release_notes.rst

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,10 @@ Release Notes: Kilted Kaiju to Lyrical Luth
55

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

8+
state_interfaces_broadcaster
9+
*********************************
10+
* 🚀 The state_interfaces_broadcaster was added 🎉 (`#2006 <https://github.com/ros-controls/ros2_controllers/pull/2006>`_).
11+
812
force_torque_sensor_broadcaster
913
*******************************
1014
* 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>`__).

ros2_controllers/doc/index.rst

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,10 @@ For more information of the ros2_control framework see `control.ros.org <https:/
6666
- `Documentation <https://control.ros.org/master/doc/ros2_controllers/range_sensor_broadcaster/doc/userdoc.html>`__
6767
- `API <http://docs.ros.org/en/rolling/p/range_sensor_broadcaster/>`__
6868
- `ROS Index <https://index.ros.org/p/range_sensor_broadcaster/>`__
69+
* - state_interfaces_broadcaster
70+
- `Documentation <https://control.ros.org/master/doc/ros2_controllers/state_interfaces_broadcaster/doc/userdoc.html>`__
71+
- `API <http://docs.ros.org/en/rolling/p/state_interfaces_broadcaster/>`__
72+
- `ROS Index <https://index.ros.org/p/state_interfaces_broadcaster/>`__
6973
* - steering_controllers_library
7074
- `Documentation <https://control.ros.org/master/doc/ros2_controllers/steering_controllers_library/doc/userdoc.html>`__
7175
- `API <http://docs.ros.org/en/rolling/p/steering_controllers_library/>`__

ros2_controllers/package.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
<exec_depend>pose_broadcaster</exec_depend>
3939
<exec_depend>position_controllers</exec_depend>
4040
<exec_depend>range_sensor_broadcaster</exec_depend>
41+
<exec_depend>state_interfaces_broadcaster</exec_depend>
4142
<exec_depend>steering_controllers_library</exec_depend>
4243
<exec_depend>tricycle_controller</exec_depend>
4344
<exec_depend>tricycle_steering_controller</exec_depend>
Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
cmake_minimum_required(VERSION 3.16)
2+
project(state_interfaces_broadcaster)
3+
4+
find_package(ros2_control_cmake REQUIRED)
5+
set_compiler_options()
6+
export_windows_symbols()
7+
8+
set(THIS_PACKAGE_INCLUDE_DEPENDS
9+
control_msgs
10+
controller_interface
11+
generate_parameter_library
12+
pluginlib
13+
rclcpp_lifecycle
14+
realtime_tools
15+
)
16+
17+
find_package(ament_cmake REQUIRED)
18+
find_package(backward_ros REQUIRED)
19+
foreach(Dependency IN ITEMS ${THIS_PACKAGE_INCLUDE_DEPENDS})
20+
find_package(${Dependency} REQUIRED)
21+
endforeach()
22+
23+
generate_parameter_library(state_interfaces_broadcaster_parameters
24+
src/state_interfaces_broadcaster_parameters.yaml
25+
)
26+
27+
add_library(state_interfaces_broadcaster SHARED
28+
src/state_interfaces_broadcaster.cpp
29+
)
30+
target_compile_features(state_interfaces_broadcaster PUBLIC cxx_std_17)
31+
target_include_directories(state_interfaces_broadcaster PUBLIC
32+
$<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include>
33+
$<INSTALL_INTERFACE:include/state_interfaces_broadcaster>
34+
)
35+
target_link_libraries(state_interfaces_broadcaster PUBLIC
36+
state_interfaces_broadcaster_parameters
37+
controller_interface::controller_interface
38+
pluginlib::pluginlib
39+
rclcpp::rclcpp
40+
rclcpp_lifecycle::rclcpp_lifecycle
41+
realtime_tools::realtime_tools
42+
${control_msgs_TARGETS}
43+
)
44+
pluginlib_export_plugin_description_file(controller_interface state_interfaces_broadcaster_plugin.xml)
45+
46+
if(BUILD_TESTING)
47+
find_package(ament_cmake_gmock REQUIRED)
48+
find_package(controller_manager REQUIRED)
49+
find_package(hardware_interface REQUIRED)
50+
find_package(rclcpp REQUIRED)
51+
find_package(ros2_control_test_assets REQUIRED)
52+
53+
ament_add_gmock(test_load_state_interfaces_broadcaster
54+
test/test_load_state_interfaces_broadcaster.cpp
55+
)
56+
target_link_libraries(test_load_state_interfaces_broadcaster
57+
state_interfaces_broadcaster
58+
controller_manager::controller_manager
59+
hardware_interface::hardware_interface
60+
rclcpp::rclcpp
61+
ros2_control_test_assets::ros2_control_test_assets)
62+
target_compile_definitions(
63+
test_load_state_interfaces_broadcaster
64+
PRIVATE PARAMETERS_FILE_PATH="${CMAKE_CURRENT_LIST_DIR}/test/test_state_interfaces_broadcaster_params.yaml")
65+
66+
ament_add_gmock(test_state_interfaces_broadcaster
67+
test/test_state_interfaces_broadcaster.cpp
68+
)
69+
target_link_libraries(test_state_interfaces_broadcaster
70+
state_interfaces_broadcaster
71+
ros2_control_test_assets::ros2_control_test_assets
72+
rclcpp::rclcpp
73+
${control_msgs_TARGETS})
74+
endif()
75+
76+
install(
77+
DIRECTORY include/
78+
DESTINATION include/state_interfaces_broadcaster
79+
)
80+
install(
81+
TARGETS
82+
state_interfaces_broadcaster
83+
state_interfaces_broadcaster_parameters
84+
EXPORT export_state_interfaces_broadcaster
85+
RUNTIME DESTINATION bin
86+
ARCHIVE DESTINATION lib
87+
LIBRARY DESTINATION lib
88+
)
89+
90+
ament_export_targets(export_state_interfaces_broadcaster HAS_LIBRARY_TARGET)
91+
ament_export_dependencies(${THIS_PACKAGE_INCLUDE_DEPENDS})
92+
ament_package()
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
:github_url: https://github.com/ros-controls/ros2_controllers/blob/{REPOS_FILE_BRANCH}/state_interfaces_broadcaster/doc/userdoc.rst
2+
3+
.. _state_interfaces_broadcaster_userdoc:
4+
5+
State Interfaces Broadcaster
6+
--------------------------------
7+
The State Interfaces Broadcaster publishes the state of specified hardware interfaces of double data type.
8+
The broadcaster publishes two topics:
9+
10+
- ``/state_interfaces_broadcaster/names``: Publishes the names of the hardware interfaces being monitored with a message type of ``control_msgs/msg/Keys``.
11+
- ``/state_interfaces_broadcaster/values``: Publishes the current state values of the specified hardware interfaces with a message type of ``control_msgs/msg/Float64Values``.
12+
13+
Parameters
14+
^^^^^^^^^^^
15+
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.
16+
17+
List of parameters
18+
=========================
19+
.. generate_parameter_library_details:: ../src/state_interfaces_broadcaster_parameters.yaml
20+
21+
22+
An example parameter file
23+
=========================
24+
25+
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>`_:
26+
27+
.. literalinclude:: ../test/test_state_interfaces_broadcaster_params.yaml
28+
:language: yaml
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
// Copyright (c) 2025, PAL Robotics
2+
//
3+
// Licensed under the Apache License, Version 2.0 (the "License");
4+
// you may not use this file except in compliance with the License.
5+
// You may obtain a copy of the License at
6+
//
7+
// http://www.apache.org/licenses/LICENSE-2.0
8+
//
9+
// Unless required by applicable law or agreed to in writing, software
10+
// distributed under the License is distributed on an "AS IS" BASIS,
11+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
// See the License for the specific language governing permissions and
13+
// limitations under the License.
14+
15+
#ifndef STATE_INTERFACES_BROADCASTER__STATE_INTERFACES_BROADCASTER_HPP_
16+
#define STATE_INTERFACES_BROADCASTER__STATE_INTERFACES_BROADCASTER_HPP_
17+
18+
#include <memory>
19+
#include <string>
20+
#include <vector>
21+
22+
#include "control_msgs/msg/float64_values.hpp"
23+
#include "control_msgs/msg/keys.hpp"
24+
#include "controller_interface/controller_interface.hpp"
25+
#include "realtime_tools/realtime_publisher.hpp"
26+
27+
// auto-generated by generate_parameter_library
28+
#include "state_interfaces_broadcaster/state_interfaces_broadcaster_parameters.hpp"
29+
30+
namespace state_interfaces_broadcaster
31+
{
32+
/**
33+
* \brief State Interfaces Broadcaster for selected state interfaces in a ros2_control system.
34+
*
35+
* StateInterfacesBroadcaster publishes the selected state interfaces from ros2_control as ROS
36+
* messages.
37+
*
38+
* Publishes to:
39+
* - \b ~/names (control_msgs::msg::Keys): The list of the interface names that are selected
40+
* to be published by the interfaces state broadcaster. This is published with transient local
41+
* durability.
42+
* - \b ~/values (control_msgs::msg::Float64Values): The list of the values corresponding to the
43+
* interface names that are selected to be published by the interfaces state broadcaster.
44+
*
45+
* \note The values are published at the same rate as the controller update rate.
46+
*/
47+
class StateInterfacesBroadcaster : public controller_interface::ControllerInterface
48+
{
49+
public:
50+
StateInterfacesBroadcaster();
51+
52+
controller_interface::InterfaceConfiguration command_interface_configuration() const override;
53+
54+
controller_interface::InterfaceConfiguration state_interface_configuration() const override;
55+
56+
controller_interface::return_type update(
57+
const rclcpp::Time & time, const rclcpp::Duration & period) override;
58+
59+
controller_interface::CallbackReturn on_init() override;
60+
61+
controller_interface::CallbackReturn on_configure(
62+
const rclcpp_lifecycle::State & previous_state) override;
63+
64+
controller_interface::CallbackReturn on_activate(
65+
const rclcpp_lifecycle::State & previous_state) override;
66+
67+
protected:
68+
// Optional parameters
69+
std::shared_ptr<ParamListener> param_listener_;
70+
Params params_;
71+
72+
// publishers and messages
73+
std::shared_ptr<rclcpp::Publisher<control_msgs::msg::Keys>> names_publisher_;
74+
std::shared_ptr<rclcpp::Publisher<control_msgs::msg::Float64Values>> values_publisher_;
75+
std::shared_ptr<realtime_tools::RealtimePublisher<control_msgs::msg::Float64Values>>
76+
realtime_values_publisher_;
77+
control_msgs::msg::Keys names_msg_;
78+
control_msgs::msg::Float64Values values_msg_;
79+
};
80+
81+
} // namespace state_interfaces_broadcaster
82+
83+
#endif // STATE_INTERFACES_BROADCASTER__STATE_INTERFACES_BROADCASTER_HPP_
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
<?xml version="1.0"?>
2+
<package format="3">
3+
<name>state_interfaces_broadcaster</name>
4+
<version>6.1.0</version>
5+
<description>Broadcaster to publish the requested hardware interface states</description>
6+
7+
<maintainer email="[email protected]">Bence Magyar</maintainer>
8+
<maintainer email="[email protected]">Denis Štogl</maintainer>
9+
<maintainer email="[email protected]">Christoph Froehlich</maintainer>
10+
<maintainer email="[email protected]">Sai Kishor Kothakota</maintainer>
11+
12+
<author email="[email protected]">Sai Kishor Kothakota</author>
13+
14+
<license>Apache License 2.0</license>
15+
16+
<url type="website">https://control.ros.org</url>
17+
<url type="bugtracker">https://github.com/ros-controls/ros2_controllers/issues</url>
18+
<url type="repository">https://github.com/ros-controls/ros2_controllers/</url>
19+
20+
<buildtool_depend>ament_cmake</buildtool_depend>
21+
22+
<build_depend>ros2_control_cmake</build_depend>
23+
24+
<depend>backward_ros</depend>
25+
<depend>control_msgs</depend>
26+
<depend>controller_interface</depend>
27+
<depend>generate_parameter_library</depend>
28+
<depend>pluginlib</depend>
29+
<depend>rclcpp_lifecycle</depend>
30+
<depend>rclcpp</depend>
31+
<depend>realtime_tools</depend>
32+
33+
<test_depend>ament_cmake_gmock</test_depend>
34+
<test_depend>controller_manager</test_depend>
35+
<test_depend>hardware_interface</test_depend>
36+
<test_depend>ros2_control_test_assets</test_depend>
37+
38+
<export>
39+
<build_type>ament_cmake</build_type>
40+
</export>
41+
</package>

0 commit comments

Comments
 (0)