#include “rclcpp/rclcpp.hpp”
#include “rclcpp/timer.hpp”
#include “services_quiz_srv/srv/spin.hpp”
#include
#include
#include
#include
using namespace std::chrono_literals;
class ServiceClient : public rclcpp::Node {
private:
rclcpp::Client<services_quiz_srv::srv::Spin>::SharedPtr client_;
rclcpp::TimerBase::SharedPtr timer_;
bool service_done_ = false;
void response_callback(
rclcpp::Client<services_quiz_srv::srv::Spin>::SharedFuture future) {
RCLCPP_INFO(this->get_logger(), “response callback”);
auto status = future.wait_for(1s);
if (status == std::future_status::ready) {
RCLCPP_INFO(this->get_logger(), “Result: success”);
service_done_ = true;
} else {
RCLCPP_INFO(this->get_logger(), “Service In-Progress…”);
}
RCLCPP_INFO(this->get_logger(), “end response callback”);
}
public:
ServiceClient() : Node(“rotate_client_node”) {
RCLCPP_INFO(this->get_logger(), “rotate_client launched”);
client_ = this->create_client<services_quiz_srv::srv::Spin>(“rotate”);
while (!client_->wait_for_service(1s)) {
if (!rclcpp::ok()) {
RCLCPP_ERROR(
this->get_logger(),
“Client interrupted while waiting for service. Terminating…”);
return;
}
RCLCPP_INFO(this->get_logger(),
“Service Unavailable. Waiting for Service…”);
}
RCLCPP_INFO(this->get_logger(), “service reached”);
}
void call_service(std::string direction, float angular_velocity, int time) {
RCLCPP_INFO(this->get_logger(), “calling service”);
auto request = std::make_shared<services_quiz_srv::srv::Spin::Request>();
request->direction = direction;
request->angular_velocity = angular_velocity;
request->time = time;
service_done_ = false;
auto result_future = client_->async_send_request(
request, std::bind(&ServiceClient::response_callback, this,
std::placeholders::_1));
}
bool is_service_done() const { return this->service_done_; }
};
int main(int argc, char *argv) {
rclcpp::init(argc, argv);
auto service_client = std::make_shared();
service_client->call_service(“right”, 0.2, 10);
while (!service_client->is_service_done()) {
rclcpp::spin_some(service_client);
}
rclcpp::shutdown();
return 0;
}