> 文章列表 > 服务通讯c++和python实现---04

服务通讯c++和python实现---04

服务通讯c++和python实现---04

服务通讯c++和python实现---04

创建自定义服务的载体,

创建功能包
在src目录下点键生成功能包

服务通讯c++和python实现---04

服务通讯c++和python实现---04在进行创建srv和Addints.srv文件,请求部分是两个数字,相应部分是一个整形数字

服务通讯c++和python实现---04
添加

int32 num1
int32 num2
--
int32 sum

修改CMakeLists.txt配置

message_generation功能包是用于生成C++或Python能使用的代码。

message_runtime则是提供运行时的支持。
修改1:
服务通讯c++和python实现---04修改2:
服务通讯c++和python实现---04

修改3
服务通讯c++和python实现---04
修改4:
服务通讯c++和python实现---04
c++编译生成头文件:AddIntsRequest请求头文件,AddIntsResponse:相应头文件
服务通讯c++和python实现---04
python导入的相关文件
服务通讯c++和python实现---04
写入代码

/*需求: 编写两个节点实现服务通信,客户端节点需要提交两个整数到服务器服务器需要解析客户端提交的数据,相加后,将结果响应回客户端,客户端再解析服务器实现:1.包含头文件2.初始化 ROS 节点3.创建 ROS 句柄4.创建 服务 对象5.回调函数处理请求并产生响应6.由于请求有多个,需要调用 ros::spin()*/
#include "ros/ros.h"
#include "plumbing_server_client/AddInts.h"// bool 返回值由于标志是否处理成功
bool doReq(plumbing_server_client::AddInts::Request& req,plumbing_server_client::AddInts::Response& resp){int num1 = req.num1;int num2 = req.num2;ROS_INFO("服务器接收到的请求数据为:num1 = %d, num2 = %d",num1, num2);//逻辑处理if (num1 < 0 || num2 < 0){ROS_ERROR("提交的数据异常:数据不可以为负数");return false;}//如果没有异常,那么相加并将结果赋值给 respresp.sum = num1 + num2;return true;}int main(int argc, char *argv[])
{setlocale(LC_ALL,"");// 2.初始化 ROS 节点ros::init(argc,argv,"AddInts_Server");// 3.创建 ROS 句柄ros::NodeHandle nh;// 4.创建 服务 对象,doReq回调函数,处理数字ros::ServiceServer server = nh.advertiseService("AddInts",doReq);ROS_INFO("服务已经启动....");//     5.回调函数处理请求并产生响应//     6.由于请求有多个,需要调用 ros::spin()ros::spin();return 0;
}

修改CMakeLists.txt配置

服务通讯c++和python实现---04

/*需求: 编写两个节点实现服务通信,客户端节点需要提交两个整数到服务器服务器需要解析客户端提交的数据,相加后,将结果响应回客户端,客户端再解析服务器实现:1.包含头文件2.初始化 ROS 节点3.创建 ROS 句柄4.创建 客户端 对象5.请求服务,接收响应*/
// 1.包含头文件
#include "ros/ros.h"
#include "plumbing_server_client/AddInts.h"int main(int argc, char *argv[])
{setlocale(LC_ALL,"");// 调用时动态传值,如果通过 launch 的 args 传参,需要传递的参数个数 +3if (argc != 3)// if (argc != 5)//launch 传参(0-文件路径 1传入的参数 2传入的参数 3节点名称 4日志路径){ROS_ERROR("请提交两个整数");return 1;}// 2.初始化 ROS 节点ros::init(argc,argv,"AddInts_Client");// 3.创建 ROS 句柄ros::NodeHandle nh;// 4.创建 客户端 对象ros::ServiceClient client = nh.serviceClient<plumbing_server_client::AddInts>("AddInts");//等待服务启动成功//方式1ros::service::waitForService("AddInts");//方式2// client.waitForExistence();// 5.组织请求数据plumbing_server_client::AddInts ai;ai.request.num1 = atoi(argv[1]);ai.request.num2 = atoi(argv[2]);// 6.发送请求,返回 bool 值,标记是否成功bool flag = client.call(ai);// 7.处理响应if (flag){ROS_INFO("请求正常处理,响应结果:%d",ai.response.sum);}else{ROS_ERROR("请求处理失败....");return 1;}return 0;
}

python代码实现

#! /usr/bin/env python
"""需求: 编写两个节点实现服务通信,客户端节点需要提交两个整数到服务器服务器需要解析客户端提交的数据,相加后,将结果响应回客户端,客户端再解析服务器端实现:1.导包2.初始化 ROS 节点3.创建服务对象4.回调函数处理请求并产生响应5.spin 函数"""
# 1.导包
import rospy
from plumbing_server_client.srv import AddInts,AddIntsRequest,AddIntsResponse
# 回调函数的参数是请求对象,返回值是响应对象
def doReq(req):# 解析提交的数据sum = req.num1 + req.num2rospy.loginfo("提交的数据:num1 = %d, num2 = %d, sum = %d",req.num1, req.num2, sum)# 创建响应对象,赋值并返回# resp = AddIntsResponse()# resp.sum = sumresp = AddIntsResponse(sum)# rospy.loginfo("服务器数据num1=%d ,num2=%d,响应的结果:sum=%d",num1,num2,sum)return respif __name__ == "__main__":# 2.初始化 ROS 节点rospy.init_node("addints_server_p")# 3.创建服务对象,第二个消息对应的类型AddInts:这个是查看srv的名字是AddInts就是这个server = rospy.Service("AddInts",AddInts,doReq)rospy.loginfo("服务器已经启动")# 4.回调函数处理请求并产生响应# 5.spin 函数rospy.spin()

响应

#! /usr/bin/env python"""需求: 编写两个节点实现服务通信,客户端节点需要提交两个整数到服务器服务器需要解析客户端提交的数据,相加后,将结果响应回客户端,客户端再解析客户端实现:1.导包2.初始化 ROS 节点3.创建请求对象4.发送请求5.接收并处理响应优化:加入数据的动态获取"""
#1.导包
import rospy
from plumbing_server_client.srv import *
import sysif __name__ == "__main__":#优化实现if len(sys.argv) != 3:rospy.logerr("请正确提交参数")sys.exit(1)# 2.初始化 ROS 节点rospy.init_node("AddInts_Client_p")# 3.创建请求对象client = rospy.ServiceProxy("AddInts",AddInts)# 请求前,等待服务已经就绪# 方式1:# rospy.wait_for_service("AddInts")# 方式2client.wait_for_service()# 4.发送请求,接收并处理响应# 方式1# resp = client(3,4)# 方式2# resp = client(AddIntsRequest(1,5))# 方式3req = AddIntsRequest()# req.num1 = 100# req.num2 = 200 #优化req.num1 = int(sys.argv[1])req.num2 = int(sys.argv[2]) resp = client.call(req)rospy.loginfo("响应结果:%d",resp.sum)