feat(les2): Student service
This commit is contained in:
@@ -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
|
||||
|
||||
16
src/les_interface/srv/ServiceStudent.srv
Normal file
16
src/les_interface/srv/ServiceStudent.srv
Normal 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
|
||||
@@ -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}
|
||||
)
|
||||
|
||||
|
||||
62
src/les_pkg/src/les2/service_client.cpp
Normal file
62
src/les_pkg/src/les2/service_client.cpp
Normal 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;
|
||||
}
|
||||
58
src/les_pkg/src/les2/service_server.cpp
Normal file
58
src/les_pkg/src/les2/service_server.cpp
Normal 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;
|
||||
}
|
||||
Reference in New Issue
Block a user