srv文件
std_msgs/Int64MultiArray arr_before
---
std_msgs/Int64MultiArray arr_after
server
//要求二:十数排序
#include "ros/ros.h"
#include "connect_vscode/service_sort.h"
#include <std_msgs/Int64MultiArray.h>
#include "stdlib.h"
using namespace std;
int len=10;
bool num_sort(connect_vscode::service_sort::Request &request,connect_vscode::service_sort::Response &response)
{
ROS_INFO("已收到数据请求");
for (int k=0;k<10;k++)
{
ROS_INFO("排序前结果为:[%ld \n]",request.arr_before.data[k]);
}
for (int i = 1; i < len; i++)//循环len-1次
{
for (int j = 0; j < len-i; j++)
if (request.arr_before.data[j] > request.arr_before.data[j+1])
{
int temp = request.arr_before.data[j];
request.arr_before.data[j] = request.arr_before.data[j+1];
request.arr_before.data[j+1] = temp;
}
}
response.arr_after=request.arr_before;//组织响应到response
return true;
}
int main(int argc, char *argv[])
{
setlocale(LC_ALL,"");
//修改srv文件 随机数rand()%99
// 1.包含头文件
// 2.初始化ROS节点
ros::init(argc,argv,"born_num");
// 3.创建节点句柄
ros::NodeHandle nh;
// 4.创建服务对象
ros::ServiceServer server_sort = nh.advertiseService("sort_ten_num",num_sort);
// 5.处理请求并产生响应
ROS_INFO("服务端启动");
// 6.spin()最好填上,循环就是spinOnce()
ros::spin();//以接受到请求触发回调函数
return 0; //此处因进行调试
}
client
#include "ros/ros.h"
#include "connect_vscode/service_sort.h"
#include <std_msgs/Int64MultiArray.h>
#include "stdlib.h"
#define random(x) (rand()%x)
/*
客户端:提交两个整数,并处理响应的结果
1.包含头文件
2.初始化ROS节点
3.创建节点句柄
4.创建客户端对象
5.提交请求并处理响应
6.spin()最好填上,循环就是spinOnce() 对客户端而言没有回调函数,所以可写可不写
7.实现参数的动态提交
格式:rosrun xxxxxx xxxx 21 26
节点执行时获取命令中的参数,并组织进request
结合argc和argv实现
8.先启动客户端会抛异常,但如果需求要求先启动客户端,不抛异常而是程序挂起,等服务器启动后再正常请求
解决:ros有内置相关函数,函数可以让客户端启动后挂起,等待服务器启动
*/
int main(int argc, char *argv[])
{
setlocale(LC_ALL,"");
// 1.包含头文件 考虑到随机数在回调函数中生成所以不需要动态输入
// 2.初始化ROS节点
ros::init(argc,argv,"receive_num");//节点名唯一
// 3.创建节点句柄
ros::NodeHandle nh;
// 4.创建客户端对象
ros::ServiceClient client_sort = nh.serviceClient<connect_vscode::service_sort>("sort_ten_num");
//泛型模板为消息载体
// 5.提交请求并处理响应
//提交请求
connect_vscode::service_sort ai;
ai.request.arr_before.data.resize(11);
for (int i=0;i<10;i++)
{
ai.request.arr_before.data[i]=int(random(100));
} //解析内容
bool flag=client_sort.call(ai);
if (flag)
{
ROS_INFO("响应成功");
//获取结果
for (int k=0;k<10;k++)
{
ROS_INFO("排序后结果为:[%ld ]",ai.response.arr_after.data[k]);
}
}
else {ROS_INFO("响应失败");}
// 6.spin()最好填上,循环就是spinOnce() 对客户端而言没有回调函数,所以可写可不写
return 0;
}
结果