文章目录
服务通信
一、理论模型
二、服务通信自定义srv
1.定义srv文件
2.编辑配置文件
3.翻译
三(A)、服务通信自定义srv调用A(C++)
0.vscode配置
1.服务端
案例代码:
#include "ros/ros.h"
#include "plumbing_server_client/AddInts.h"
/*
服务端实现:解析客户端提交的数据,并运算再产生响应
1.包含头文件;
2.初始化ROS节点;
3.创建节点句柄;
4.创建一个服务对象;
5.处理请求并产生响应;
6.spin();
*/
bool doNums(plumbing_server_client::AddInts::Request &request,
plumbing_server_client::AddInts::Response &response)
{
//1.处理请求
int num1 = request.num1;
int num2 = request.num2;
ROS_INFO("收到的请求数据:num1 = %d , num2 = %d ",num1,num2);
//2.组织响应
int sum = num1 + num2;
response.sum = sum;
ROS_INFO("求和结果:sum= %d",sum);
return true;
}
int main(int argc, char *argv[])
{
setlocale(LC_ALL,"");
//2.初始化ROS节点;
ros::init(argc,argv,"heiShui");//节点名称需要保证唯一
//3.创建节点句柄;
ros::NodeHandle nh;
//4.创建一个服务对象;
ros::ServiceServer server = nh.advertiseService("addInts",doNums);
ROS_INFO("服务器端启动");
//5.处理请求并产生响应;
//6.spin();
ros::spin();
return 0;
}
2.客户端
案例代码:
#include "ros/ros.h"
#include "plumbing_server_client/AddInts.h"
/*
客户端实现:提交两个整数,共处理相应的结果
1.包含头文件;
2.初始化ROS节点;
3.创建节点句柄;
4.创建一个客户端对象;
5.提交请求并处理响应;
实现参数的动态提交:
1.格式:rosrun xxxxx xxxxx 12 34
2.节点执行时,需要获取命令中的参数,并组织进request
问题:
如果先启动客户端,那么会请求异常
需求:
如果先启动客户端,不会直接抛出异常,而是挂起,等服务器启动后,再正常请求
解决:
在ROS中内置了相关函数,这些函数可以让客户端启动后挂起,等待服务器启动
client.waitForExistence();
ros::service::waitForService("服务话题");
*/
int main(int argc, char *argv[])
{
setlocale(LC_ALL,"");
//优化实现,获取命令中参数
if(argc != 3)
{
ROS_INFO("提交的参数个数不对。");
return 1;
}
//2.初始化ROS节点;
ros::init(argc,argv,"daBao");
//3.创建节点句柄;
ros::NodeHandle nh;
//4.创建一个客户端对象;
ros::ServiceClient client = nh.serviceClient<plumbing_server_client::AddInts>("addInts");
//5.提交请求并处理响应;
plumbing_server_client::AddInts ai;
//5-1.组织请求
ai.request.num1 = atoi(argv[1]);
ai.request.num2 = atoi(argv[2]);
//5-2.处理响应
//调用判断服务器状态的函数
//函数1
client.waitForExistence();
//函数2
//ros::service::waitForService("addInts");
bool flag = client.call(ai);
if(flag)
{
ROS_INFO("响应成功");
//获取结果
ROS_INFO("响应结果 = %d",ai.response.sum);
}
else
{
ROS_INFO("处理失败……");
}
return 0;
}
3.配置CMakeList.txt
4.执行
三(B)、服务通信自定义srv调用B(python)
。。。。。。。。。。。。。。。。。。。