ROS机器人005-ROS通信编程(服务编程)

一,基本步骤

和话题通讯的步骤基本一样:
在这里插入图片描述

二,服务端环境构造

这路我们实现客户端给服务端发送两个数字,服务端相加得结果发给客户端
1,定义srv文件
在功能包目录下创建srv目录
在这里插入图片描述
在目录下创建srv文件:
在这里插入图片描述
写文件内容:
其中三个横杠---前面的代表客户端请求的数据,后面的代表服务端要发送给客户端的应答数据

int64 a
int64 b
---
int64 sum

在这里插入图片描述
2,在package.xml中添加功能依赖

<build_depend>message_generation</build_depend>
 <exec_depend>message_runtime</exec_depend>

3,在CmakeList中添加编译选项

• find_package( ……  message_generation)
• catkin_package(CATKIN_DEPENDS geometry_msgs roscpp rospy std_msgs message_runtime)
• add_service_files(FILES AddTwoInts.srv)

4,编译,生成相关头文件
在工作空间根目录下编译:

ctkin_make

在这里插入图片描述

三,实现服务端的代码实现

**1,初始化ROS结点 **

ros::init(argc,argv,"add_two_ints_server");

2,创建结点句柄

 //创建结点字柄
  ros::NodeHandle n;

3,创建Server实例


  //创建一个名为add_two_ints的server,注册回调函数add()
  
  ros::ServiceServer service = n.advertiseService("add_two_ints",add);

4,在回调函数中处理信息

bool add(learing_communication::AddTwoints::Request &req,
           learing_communication::AddTwoints::Response &res

)
{
   //获取客户端的请求参数并相加
   res.sum=req.a+req.b;
   ROS_INFO("request:x=%d,y=%d",(long int)req.a,(long int)req.b);
   ROS_INFO("sum:%d",(long int)res.sum);
}

5,完整代码

#include "ros/ros.h"
//添加服务端文件 头文件
#include "learing_communication/AddTwoints"
 bool add(learing_communication::AddTwoints::Request &req,
           learing_communication::AddTwoints::Response &res

)
{
   //获取客户端的请求参数并相加
   res.sum=req.a+req.b;
   ROS_INFO("request:x=%d,y=%d",(long int)req.a,(long int)req.b);
   ROS_INFO("sum:%d",(long int)res.sum);
}

int main(int argc,char **argv)
{
  //初始化ros结点
  ros::init(argc,argv,"add_two_ints_server");
  
  //创建结点字柄
  ros::NodeHandle n;
  
  //创建一个名为add_two_ints的server,注册回调函数add()
  
  ros::ServiceServer service = n.advertiseService("add_two_ints",add);
  
  //打印日志信息
  ROS_INFO("Read_two_ints:");
  //循环等待回调函数
  ros::spin();
  return 0;
  
}

四,实现一个客户端

1,初始化Ros结点

 ros::init(argc,argv,"client");

2,创建ROS结点句柄

 ros::NodeHandel n;

3,创建client

//创建一个client,用于发生信息
 //server支持的消息类型是learning_communication::AddTwoints
 ros::ServiceClient client = n.serviceClient<learing_communication::AddTwoints

4,创建learing_communicationL::AddTwoints类型的数据

 learing_communication::AddTwoints data;
 data.request.a = atoll(argc[1]);
 data.request.b = atoll(argc[1]);

5,发布数据,并等待应答结果

if (client.call(data)){
  ROS_INFO("sum is:%d",(long int)srv.response.sum);
 }

6,完整代码

#include "ros/ros.h"
//添加服务端文件 头文件
#include "learing_communication/AddTwoints.h"
 bool add(learing_communication::AddTwoints::Request &req,
           learing_communication::AddTwoints::Response &res

)
{
   //获取客户端的请求参数并相加
   res.sum=req.a+req.b;
   ROS_INFO("request:x=%d,y=%d",(long int)req.a,(long int)req.b);
   ROS_INFO("sum:%d",(long int)res.sum);
}

int main(int argc,char **argv)
{
  //初始化ros结点
  ros::init(argc,argv,"add_two_ints_server");
  
  //创建结点字柄
  ros::NodeHandle n;
  
  //创建一个名为add_two_ints的server,注册回调函数add()
  
  ros::ServiceServer service = n.advertiseService("add_two_ints",add);
  
  //打印日志信息
  ROS_INFO("Read_two_ints:");
  //循环等待回调函数
  ros::spin();
  return 0;
  
}

五,编译工作空间

在这里插入图片描述

add_executable(server src/server.cpp) 
target_link_libraries(server ${catkin_LIBRARIES})
 add_dependencies(server ${PROJECT_NAME}_gencpp)
add_executable(client src/client.cpp) 
target_link_libraries(client ${catkin_LIBRARIES})
 add_dependencies(client ${PROJECT_NAME}_gencpp)

在这里插入图片描述
回到根目录开始编译:

catkin_make

在这里插入图片描述

六,测试

启动服务端

rosrun learing_communication server

在这里插入图片描述
启动客户端:

rosrun learing_communication  client 1 3

结果:
发现发给服务端的两个数被相加后返回
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值