feat(les2): Student service

This commit is contained in:
2025-09-11 10:47:35 +02:00
parent a8f0eb737e
commit 21e3ea4c3d
5 changed files with 145 additions and 0 deletions

View File

@@ -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

View File

@@ -0,0 +1,16 @@
# Student info service message
string sname
---
int32 snumber
## format <type> <name> <optional_default_value>
##primitive message types
# bool
# byte
# char
# float32, float64
# int8, uint8
# int16, uint16
# int32, uint32
# int64, uint64
# string

View File

@@ -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}
)

View File

@@ -0,0 +1,62 @@
/* les2/service_client.cpp
* Basic example of a service client node.
*
* Reviewed by: <x>
* Changelog:
* [04-09-2025] Wessel T: Implement template
* [11-09-2025] Wessel T: (BASE) Working service client
*/
#include <chrono>
#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<ServiceStudent>("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<ServiceStudent::Request>();
request->sname = "Wessel";
auto future = client_->async_send_request(request,
std::bind(&NodeLes2ServiceClient::handle_response, this, std::placeholders::_1)
);
}
void handle_response(rclcpp::Client<ServiceStudent>::SharedFuture future) {
auto response = future.get();
RCLCPP_INFO(this->get_logger(), "Received student id: %ld", response->snumber);
}
rclcpp::Client<ServiceStudent>::SharedPtr client_;
rclcpp::TimerBase::SharedPtr timer_;
};
int main(int argc, char **argv) {
rclcpp::init(argc, argv);
auto node = std::make_shared<NodeLes2ServiceClient>();
rclcpp::spin(node);
rclcpp::shutdown();
return 0;
}

View File

@@ -0,0 +1,58 @@
/* node_template.cpp
* Basic node template for ROS2
*
* Reviewed by: <x>
* Changelog:
* [04-09-2025] Wessel T: Implement template
*/
#include <cstdlib>
#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<ServiceStudent>(
"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<ServiceStudent>::SharedPtr student_service_server_;
};
int main(int argc, char *argv[]) {
rclcpp::init(argc, argv);
auto node = std::make_shared<NodeLes2ServiceServer>();
rclcpp::spin(node);
rclcpp::shutdown();
return 0;
}