Part 2.2.2 服务通信的实践 (C++)

该博客介绍了如何在ROS中创建自定义服务类型,通过一个简单的加法运算示例展示了客户端如何调用服务端提供的加法服务。客户端订阅方接收两个数作为参数,服务端接收到请求后进行求和并返回结果。通过`ros::service::waitForService`确保服务端已启动,然后使用`service_client::Sumsrv`进行服务调用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

自定义消息类型
首先在功能包下新建srv文件夹,然后创建srv文件 。本次例子是来实现客户端提交两个数,服务端来进行求和。

在这里插入图片描述
配置文件如下:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

订阅方的实现:

#include"ros/ros.h"
#include "service_client/Sum.h" //自定义服务消息类型
#include <cstdlib>

int main(int argc,char *argv[])
{
 ros::init(argc,argv,"Sum_client");  //初始化节点
 if(argc!=3)  //外部输入参数
 {
     ROS_INFO("failed");
     return 1;
 }
 ros::NodeHandle nh;
 ros::ServiceClient sum_client=nh.serviceClient<service_client::Sum>("add_two_ints");//创建用于发布的节点句柄
 ros::service::waitForService("add_two_ints");//等待服务端启动
 service_client::Sum srv; //创建新的消息
 srv.request.a=atoll(argv[1]);
 srv.request.b=atoll(argv[2]); /* 把字符串转变成long long 类型*/
 /*argv[0] 存储的是节点的路径*/
 if(sum_client.call(srv)) //调用服务端,发布数据给服务端,返回值是bool类型
 {
     ROS_INFO("sun =%ld ",(long int )srv.response.sum);
 }
 else{
     ROS_INFO("failed ");
     return 1;
 }

    return 0;
}

服务方的实现:

#include "ros/ros.h"
#include "service_client/Sum.h"

bool add(service_client::Sum::Request &req,
        service_client::Sum::Response &res)//消息中的请求和服务参数指针
        {
           res.sum=req.a+req.b;    //sum是服务端的参数,a,b是客户端发送的消息。
           ROS_INFO("request : x=%ld y=%ld",(long int)req.a,(long int)req.b); /*在定义消息类型时用的是64位的longint型*/
           ROS_INFO("responce : sum= %ld",(long int)res.sum);

           return true;
        }

int main(int argc,char*argv[])
{ 
    ros::init(argc,argv,"SUM_server");
    ros::NodeHandle nh;
    ros::ServiceServer sum_service=nh.advertiseService("add_two_ints",add);//创建句柄函数,调用服务端的函数add
    ROS_INFO("ready to add two ints .");
    ros::spin();
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

一蓑烟雨荏平生

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

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

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

打赏作者

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

抵扣说明:

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

余额充值