From 21e3ea4c3d9c0705d857f7dbcb600054f86fd39c Mon Sep 17 00:00:00 2001 From: Wessel Tip Date: Thu, 11 Sep 2025 10:47:35 +0200 Subject: [PATCH] feat(les2): Student service --- src/les_interface/CMakeLists.txt | 1 + src/les_interface/srv/ServiceStudent.srv | 16 ++++++ src/les_pkg/CMakeLists.txt | 8 +++ src/les_pkg/src/les2/service_client.cpp | 62 ++++++++++++++++++++++++ src/les_pkg/src/les2/service_server.cpp | 58 ++++++++++++++++++++++ 5 files changed, 145 insertions(+) create mode 100644 src/les_interface/srv/ServiceStudent.srv create mode 100644 src/les_pkg/src/les2/service_client.cpp create mode 100644 src/les_pkg/src/les2/service_server.cpp diff --git a/src/les_interface/CMakeLists.txt b/src/les_interface/CMakeLists.txt index 23f09b5..8379aad 100644 --- a/src/les_interface/CMakeLists.txt +++ b/src/les_interface/CMakeLists.txt @@ -10,6 +10,7 @@ find_package(ament_cmake REQUIRED) find_package(rosidl_default_generators REQUIRED) rosidl_generate_interfaces(${PROJECT_NAME} "msg/HardwareStatus.msg" + "srv/ServiceStudent.srv" ) ament_export_dependencies(rosidl_default_runtime) # uncomment the following section in order to fill in diff --git a/src/les_interface/srv/ServiceStudent.srv b/src/les_interface/srv/ServiceStudent.srv new file mode 100644 index 0000000..2741f9f --- /dev/null +++ b/src/les_interface/srv/ServiceStudent.srv @@ -0,0 +1,16 @@ +# Student info service message +string sname +--- +int32 snumber + +## format +##primitive message types +# bool +# byte +# char +# float32, float64 +# int8, uint8 +# int16, uint16 +# int32, uint32 +# int64, uint64 +# string diff --git a/src/les_pkg/CMakeLists.txt b/src/les_pkg/CMakeLists.txt index b8bec80..77a16b7 100644 --- a/src/les_pkg/CMakeLists.txt +++ b/src/les_pkg/CMakeLists.txt @@ -17,15 +17,23 @@ add_executable(les1_clock src/les1/clock.cpp) add_executable(les1_publisher src/les1/publisher.cpp) add_executable(les1_subscriber src/les1/subscriber.cpp) +add_executable(les2_service src/les2/service_server.cpp) +add_executable(les2_service_client src/les2/service_client.cpp) + ament_target_dependencies(les1_clock rclcpp) ament_target_dependencies(les1_publisher rclcpp std_msgs geometry_msgs les_interface) ament_target_dependencies(les1_subscriber rclcpp std_msgs geometry_msgs les_interface) +ament_target_dependencies(les2_service rclcpp les_interface) +ament_target_dependencies(les2_service_client rclcpp les_interface) + install ( TARGETS les1_clock les1_publisher les1_subscriber + les2_service + les2_service_client DESTINATION lib/${PROJECT_NAME} ) diff --git a/src/les_pkg/src/les2/service_client.cpp b/src/les_pkg/src/les2/service_client.cpp new file mode 100644 index 0000000..891142c --- /dev/null +++ b/src/les_pkg/src/les2/service_client.cpp @@ -0,0 +1,62 @@ +/* les2/service_client.cpp + * Basic example of a service client node. + * + * Reviewed by: + * Changelog: + * [04-09-2025] Wessel T: Implement template + * [11-09-2025] Wessel T: (BASE) Working service client + */ + +#include +#include "rclcpp/rclcpp.hpp" + +#include "les_interface/srv/service_student.hpp" + +using namespace std::chrono; +using les_interface::srv::ServiceStudent; + +class NodeLes2ServiceClient : public rclcpp::Node { +public: + NodeLes2ServiceClient() + : Node("node_les2_service_client") + { + client_ = this->create_client("student_service_server"); + timer_ = this->create_wall_timer( + seconds(3), + std::bind(&NodeLes2ServiceClient::send_request, this) + ); + } + +private: + void send_request() { + if (!client_->wait_for_service(seconds(1))) { + RCLCPP_WARN(this->get_logger(), "Service not available"); + return; + } + + auto request = std::make_shared(); + request->sname = "Wessel"; + + auto future = client_->async_send_request(request, + std::bind(&NodeLes2ServiceClient::handle_response, this, std::placeholders::_1) + ); + } + + void handle_response(rclcpp::Client::SharedFuture future) { + auto response = future.get(); + RCLCPP_INFO(this->get_logger(), "Received student id: %ld", response->snumber); + } + + rclcpp::Client::SharedPtr client_; + rclcpp::TimerBase::SharedPtr timer_; +}; + +int main(int argc, char **argv) { + rclcpp::init(argc, argv); + + auto node = std::make_shared(); + rclcpp::spin(node); + rclcpp::shutdown(); + + return 0; +} diff --git a/src/les_pkg/src/les2/service_server.cpp b/src/les_pkg/src/les2/service_server.cpp new file mode 100644 index 0000000..df12d79 --- /dev/null +++ b/src/les_pkg/src/les2/service_server.cpp @@ -0,0 +1,58 @@ +/* node_template.cpp + * Basic node template for ROS2 + * + * Reviewed by: + * Changelog: + * [04-09-2025] Wessel T: Implement template + */ + +#include +#include "rclcpp/rclcpp.hpp" + +#include "les_interface/srv/service_vector.hpp" + +using les_interface::srv::ServiceStudent; + +class NodeLes2ServiceServer : public rclcpp::Node { +public: + NodeLes2ServiceServer() + : Node("node_les2_service_server") + { + student_service_server_ = + this->create_service( + "student_service_server", + std::bind( + &NodeLes2ServiceServer::callback_student_service, + this, + std::placeholders::_1, + std::placeholders::_2 + ) + ); + + RCLCPP_INFO(this->get_logger(), "Service Server started"); + } + + void callback_student_service( + const ServiceStudent::Request::SharedPtr request, + ServiceStudent::Response::SharedPtr response + ) { + if (request->sname == "Tilmann") { + response->snumber = 666; + } else { + response->snumber = 42; + } + } + +private: + rclcpp::Service::SharedPtr student_service_server_; +}; + +int main(int argc, char *argv[]) { + rclcpp::init(argc, argv); + + auto node = std::make_shared(); + rclcpp::spin(node); + rclcpp::shutdown(); + + return 0; +}