Skip to content

Commit d1349e1

Browse files
authored
Add GPSBroadcaster (#1554)
1 parent 9ed7cbe commit d1349e1

File tree

13 files changed

+743
-1
lines changed

13 files changed

+743
-1
lines changed

doc/controllers_index.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ In the sense of ros2_control, broadcasters are still controllers using the same
7474
Joint State Broadcaster <../joint_state_broadcaster/doc/userdoc.rst>
7575
Range Sensor Broadcaster <../range_sensor_broadcaster/doc/userdoc.rst>
7676
Pose Broadcaster <../pose_broadcaster/doc/userdoc.rst>
77-
77+
GPS Sensor Broadcaster <../gps_sensor_broadcaster/doc/userdoc.rst>
7878

7979
Common Controller Parameters
8080
****************************
Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
cmake_minimum_required(VERSION 3.16)
2+
project(gps_sensor_broadcaster LANGUAGES CXX)
3+
4+
find_package(ros2_control_cmake REQUIRED)
5+
set_compiler_options()
6+
export_windows_symbols()
7+
8+
# using this instead of visibility macros
9+
# S1 from https://github.com/ros-controls/ros2_controllers/issues/1053
10+
set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON)
11+
12+
set(THIS_PACKAGE_INCLUDE_DEPENDS
13+
controller_interface
14+
generate_parameter_library
15+
hardware_interface
16+
pluginlib
17+
rclcpp
18+
rclcpp_lifecycle
19+
realtime_tools
20+
sensor_msgs
21+
)
22+
23+
find_package(ament_cmake REQUIRED)
24+
foreach(Dependency IN ITEMS ${THIS_PACKAGE_INCLUDE_DEPENDS})
25+
find_package(${Dependency} REQUIRED)
26+
endforeach()
27+
28+
29+
generate_parameter_library(gps_sensor_broadcaster_parameters
30+
src/gps_sensor_broadcaster_parameters.yaml
31+
)
32+
33+
add_library(gps_sensor_broadcaster SHARED
34+
src/gps_sensor_broadcaster.cpp
35+
)
36+
37+
target_compile_features(gps_sensor_broadcaster PUBLIC cxx_std_17)
38+
target_include_directories(gps_sensor_broadcaster PUBLIC
39+
$<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include>
40+
$<INSTALL_INTERFACE:include/gps_sensor_broadcaster>
41+
)
42+
43+
target_link_libraries(gps_sensor_broadcaster PUBLIC gps_sensor_broadcaster_parameters)
44+
ament_target_dependencies(gps_sensor_broadcaster PUBLIC ${THIS_PACKAGE_INCLUDE_DEPENDS})
45+
46+
pluginlib_export_plugin_description_file(
47+
controller_interface gps_sensor_broadcaster.xml)
48+
49+
if(BUILD_TESTING)
50+
find_package(ament_cmake_gmock REQUIRED)
51+
find_package(controller_manager REQUIRED)
52+
find_package(hardware_interface REQUIRED)
53+
find_package(ros2_control_test_assets REQUIRED)
54+
55+
add_definitions(-DTEST_FILES_DIRECTORY="${CMAKE_CURRENT_SOURCE_DIR}/test")
56+
ament_add_gmock(test_load_gps_sensor_broadcaster
57+
test/test_load_gps_sensor_broadcaster.cpp
58+
${CMAKE_CURRENT_SOURCE_DIR}/test/gps_sensor_broadcaster_params.yaml)
59+
target_include_directories(test_load_gps_sensor_broadcaster PRIVATE include)
60+
target_link_libraries(test_load_gps_sensor_broadcaster
61+
gps_sensor_broadcaster
62+
)
63+
ament_target_dependencies(test_load_gps_sensor_broadcaster
64+
controller_manager
65+
hardware_interface
66+
ros2_control_test_assets
67+
)
68+
69+
ament_add_gmock(test_gps_sensor_broadcaster
70+
test/test_gps_sensor_broadcaster.cpp
71+
${CMAKE_CURRENT_SOURCE_DIR}/test/gps_sensor_broadcaster_params.yaml)
72+
target_include_directories(test_gps_sensor_broadcaster PRIVATE include)
73+
target_link_libraries(test_gps_sensor_broadcaster
74+
gps_sensor_broadcaster
75+
)
76+
ament_target_dependencies(test_gps_sensor_broadcaster
77+
hardware_interface
78+
ros2_control_test_assets
79+
)
80+
endif()
81+
82+
install(
83+
DIRECTORY include/
84+
DESTINATION include/gps_sensor_broadcaster
85+
)
86+
install(
87+
TARGETS
88+
gps_sensor_broadcaster
89+
gps_sensor_broadcaster_parameters
90+
EXPORT export_gps_sensor_broadcaster
91+
RUNTIME DESTINATION bin
92+
ARCHIVE DESTINATION lib
93+
LIBRARY DESTINATION lib
94+
INCLUDES DESTINATION include
95+
)
96+
97+
ament_export_targets(export_gps_sensor_broadcaster HAS_LIBRARY_TARGET)
98+
ament_export_dependencies(${THIS_PACKAGE_INCLUDE_DEPENDS})
99+
ament_package()

gps_sensor_broadcaster/README.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
gps_sensor_broadcaster
2+
==========================================
3+
4+
Controller to publish readings of GPS sensors.
5+
6+
Pluginlib-Library: gps_sensor_broadcaster
7+
8+
Plugin: gps_sensor_broadcaster/GPSSensorBroadcaster (controller_interface::ControllerInterface)
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
:github_url: https://github.com/ros-controls/ros2_controllers/blob/{REPOS_FILE_BRANCH}/gps_sensor_broadcaster/doc/userdoc.rst
2+
3+
.. _gps_sensor_broadcaster_userdoc:
4+
5+
GPS Sensor Broadcaster
6+
--------------------------------
7+
Broadcaster of messages from GPS sensor.
8+
The published message type is ``sensor_msgs/msg/NavSatFix``.
9+
10+
The controller is a wrapper around ``GPSSensor`` semantic component (see ``controller_interface`` package).
11+
12+
Parameters
13+
^^^^^^^^^^^
14+
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}/gps_sensor_broadcaster/src/gps_sensor_broadcaster_params.yaml>`_ contains descriptions for all the parameters used by the controller.
15+
16+
List of parameters
17+
=========================
18+
.. generate_parameter_library_details:: ../src/gps_sensor_broadcaster_parameters.yaml
19+
20+
21+
An example parameter file
22+
=========================
23+
24+
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}/gps_sensor_broadcaster/test/gps_sensor_broadcaster_params.yaml>`_:
25+
26+
.. literalinclude:: ../test/gps_sensor_broadcaster_params.yaml
27+
:language: yaml
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
<library path="gps_sensor_broadcaster">
2+
<class name="gps_sensor_broadcaster/GPSSensorBroadcaster"
3+
type="gps_sensor_broadcaster::GPSSensorBroadcaster" base_class_type="controller_interface::ControllerInterface">
4+
<description>
5+
This controller publishes the readings of an GPS sensor as sensor_msgs/NavSatFix message.
6+
</description>
7+
</class>
8+
</library>
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
// Copyright 2025 ros2_control development team
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+
/*
16+
* Authors: Wiktor Bajor, Jakub Delicat
17+
*/
18+
19+
#ifndef GPS_SENSOR_BROADCASTER__GPS_SENSOR_BROADCASTER_HPP_
20+
#define GPS_SENSOR_BROADCASTER__GPS_SENSOR_BROADCASTER_HPP_
21+
22+
#include <memory>
23+
#include <string>
24+
#include <variant>
25+
#include <vector>
26+
27+
#include "controller_interface/controller_interface.hpp"
28+
#include "gps_sensor_broadcaster/gps_sensor_broadcaster_parameters.hpp"
29+
#include "rclcpp_lifecycle/state.hpp"
30+
#include "realtime_tools/realtime_publisher.hpp"
31+
#include "semantic_components/gps_sensor.hpp"
32+
#include "sensor_msgs/msg/nav_sat_fix.hpp"
33+
34+
namespace gps_sensor_broadcaster
35+
{
36+
using callback_return_type =
37+
rclcpp_lifecycle::node_interfaces::LifecycleNodeInterface::CallbackReturn;
38+
class GPSSensorBroadcaster : public controller_interface::ControllerInterface
39+
{
40+
public:
41+
controller_interface::InterfaceConfiguration command_interface_configuration() const override;
42+
controller_interface::InterfaceConfiguration state_interface_configuration() const override;
43+
callback_return_type on_init() override;
44+
callback_return_type on_configure(const rclcpp_lifecycle::State & previous_state) override;
45+
callback_return_type on_activate(const rclcpp_lifecycle::State & previous_state) override;
46+
callback_return_type on_deactivate(const rclcpp_lifecycle::State & previous_state) override;
47+
controller_interface::return_type update(const rclcpp::Time &, const rclcpp::Duration &) override;
48+
49+
protected:
50+
using GPSSensorOption = semantic_components::GPSSensorOption;
51+
using GPSSensorVariant = std::variant<
52+
std::monostate, semantic_components::GPSSensor<GPSSensorOption::WithCovariance>,
53+
semantic_components::GPSSensor<GPSSensorOption::WithoutCovariance>>;
54+
using StatePublisher = realtime_tools::RealtimePublisher<sensor_msgs::msg::NavSatFix>;
55+
56+
void setup_covariance();
57+
callback_return_type setup_publisher();
58+
59+
GPSSensorVariant gps_sensor_;
60+
rclcpp::Publisher<sensor_msgs::msg::NavSatFix>::SharedPtr sensor_state_publisher_;
61+
std::unique_ptr<StatePublisher> realtime_publisher_;
62+
std::shared_ptr<gps_sensor_broadcaster::ParamListener> param_listener_{};
63+
gps_sensor_broadcaster::Params params_;
64+
std::vector<std::string> state_names_;
65+
};
66+
67+
} // namespace gps_sensor_broadcaster
68+
69+
#endif // GPS_SENSOR_BROADCASTER__GPS_SENSOR_BROADCASTER_HPP_

gps_sensor_broadcaster/package.xml

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
<?xml version="1.0"?>
2+
<?xml-model href="http://download.ros.org/schema/package_format3.xsd" schematypens="http://www.w3.org/2001/XMLSchema"?>
3+
<package format="3">
4+
<name>gps_sensor_broadcaster</name>
5+
<version>4.20.0</version>
6+
<description>Controller to publish readings of GPS sensors.</description>
7+
<license>Apache License 2.0</license>
8+
9+
<maintainer email="[email protected]">Bence Magyar</maintainer>
10+
<maintainer email="[email protected]">Denis Štogl</maintainer>
11+
<maintainer email="[email protected]">Christoph Froehlich</maintainer>
12+
<maintainer email="[email protected]">Sai Kishor Kothakota</maintainer>
13+
14+
<author email="[email protected]">Wiktor Bajor</author>
15+
<author email="[email protected]">Jakub Delicat</author>
16+
17+
<buildtool_depend>ament_cmake</buildtool_depend>
18+
<build_depend>ros2_control_cmake</build_depend>
19+
20+
<depend>controller_interface</depend>
21+
<depend>generate_parameter_library</depend>
22+
<depend>hardware_interface</depend>
23+
<depend>pluginlib</depend>
24+
<depend>rclcpp</depend>
25+
<depend>rclcpp_lifecycle</depend>
26+
<depend>realtime_tools</depend>
27+
<depend>sensor_msgs</depend>
28+
29+
<test_depend>ament_cmake_gmock</test_depend>
30+
<test_depend>ament_lint_auto</test_depend>
31+
<test_depend>ament_lint_common</test_depend>
32+
<test_depend>controller_manager</test_depend>
33+
<test_depend>ros2_control_test_assets</test_depend>
34+
35+
<export>
36+
<build_type>ament_cmake</build_type>
37+
</export>
38+
</package>

0 commit comments

Comments
 (0)