8007.服务

  • 服务提供者 service_provider.cpp
#include <inttypes.h>
#include <memory>
#include "example_interfaces/srv/add_two_ints.hpp"
#include "rclcpp/rclcpp.hpp"

using AddTwoInts = example_interfaces::srv::AddTwoInts;

rclcpp::Node::SharedPtr g_node= nullptr;

void handle_service(const std::shared_ptr<rmw_request_id_t> request_header,
        const std::shared_ptr<AddTwoInts::Request> request,
        const std::shared_ptr<AddTwoInts::Response> response)
{
    (void) request_header;
    RCLCPP_INFO(g_node->get_logger(), "request: %" PRId64, request->a, request->b);

    response->sum = request->a + request->b;
}


int main(int argc, char *argv[])
{

    rclcpp::init(argc, argv);

    g_node = rclcpp::Node::make_shared("minimal_services");

    auto server = g_node->create_service<AddTwoInts>("add_two_ints", handle_service);

    rclcpp::spin(g_node);
    rclcpp::shutdown();
    g_node = nullptr;

    return 0;
}

  • 服务请求者service_requester.cpp
#include <chrono>
#include <cinttypes>
#include <memory>
#include "example_interfaces/srv/add_two_ints.hpp"
#include "rclcpp/rclcpp.hpp"

using AddTwoInts = example_interfaces::srv::AddTwoInts;

int main(int argc, char * argv[])
{
    rclcpp::init(argc, argv);
    auto node = rclcpp::Node::make_shared("minimal_client");

    //1.创建客户端
    auto client = node->create_client<AddTwoInts>("add_two_ints");

    //2.申请服务
    while(!client->wait_for_service(std::chrono::seconds(1))){
        if (!rclcpp::ok()){
            RCLCPP_ERROR(node->get_logger(), "client interrupted while waiting for service to appear.");
            return 1;
        }
        RCLCPP_INFO(node->get_logger(), "waiting for service to appear...");
    }

    //3.创建request实体
    auto request = std::make_shared<AddTwoInts::Request >();
    request->a = 10;
    request->b = 20;

    //4.客户端发送请求.
    auto result_future = client->async_send_request(request);

    //5.自旋等待结束.
    if(rclcpp::spin_until_future_complete(node, result_future) != rclcpp::executor::FutureReturnCode::SUCCESS){
        RCLCPP_ERROR(node->get_logger(), "service call failed.");
        return 1;
    }

    auto result = result_future.get();


    RCLCPP_INFO(node->get_logger(), "result of %" PRId64 " + %" PRId64 " = %" PRId64,
                    request->a, request->b, result->sum);
    rclcpp::shutdown();

    return 0;
}
  • 编译与执行
# 编译
C:\dev\ros2_example_ws> colcon build
#执行服务
C:\dev\ros2_example_ws> ros2 run xhome_rcl_cpp xservice_provider
#执行请求服务
C:\dev\ros2_example_ws> ros2 run xhome_rcl_cpp xservice_requester
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

guangshui516

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值