ros服务通信(vscode平台下编写)随机十数排序,帮助大家完成作业,有注释

阅读 11

2022-04-17

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;
}

结果

 

相关推荐

精彩评论(0)

0 0 举报