简介
客户端负责发布请求数据,等待服务端的处理;服务端负责处理相应的功能,并且返回应答数据。
一、自定义一个服务数据
ROS可以通过srv文件进行语言无关的据口定义,一般放置功能包目录下的srv文件下,文件有请求和应答两个数据域,数据域中的内容和话题消息的数据类型相同,只是在请求和应答的描述之间需要使用"—"进行分割。
创建一个简单的描述,
int64 a
int64 b
---
int64 sum
在工作空间下的功能包目录下创建一个srv文件,创建一个名为AddTwoInts.srv的文件
在完成服务数据类型的描述之后,和话题消息一样,还需要在功能包的package.xml和CMakeLists.txt文件中添加规则和依赖。
package.xml
<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend>
CMakeLists.txt
find_package(catkin REQUIRED COMPONENTS
roscpp
rospy
std_msgs
message_generation
)
add_service_files(FILES AddTwoInts.srv)
添加service时要根据前面备注顺序进行添加,不然最后编译的时候会报错。
提示:以下是本篇文章正文内容,下面案例可供参考
二、创建server和client
代码如下:
server.cpp
#include <iostream>
#include "learning_topic/AddTwoInts.h"
#include "ros/ros.h"
//service 回调函数,输入参数req,输出参数res
bool add(learning_topic::AddTwoInts::Request &req,learning_topic::AddTwoInts::Response &res)
{
res.sum = req.a + req.b;
ROS_INFO("request:x=%ld,y=%ld",(long int)req.a, (long int)req.b);
ROS_INFO("sending back response:【%ld】", (long int)res.sum);
return true;
}
int main(int argc ,char **argv)
{
//ROS节点初始化
ros::init(argc ,argv ,"add_two_ints_service");
//创建节点句柄
ros::NodeHandle n;
//创建一个名为add_two_ints的server,注册回调函数add()
ros::ServiceServer service=n.advertiseService("add_two_ints",add);
//循环等待回调函数
ROS_INFO("ready to add two ints:");
ros::spin();
return 0;
}
client.cpp
#include <cstdlib>
#include "ros/ros.h"
#include "learning_topic/AddTwoInts.h"
int main(int argc ,char **argv)
{
//初始化ros节点
ros::init(argc,argv,"add_two_ints_client");
//从终端获取2个加数
if (argc != 3)
{
ROS_INFO("usage: add_two_ints_client x y");
return 1;
}
//创建节点 句柄
ros::NodeHandle n;
//创建一个client,请求add——two_ints_service
ros::ServiceClient client = n.serviceClient<learning_topic::AddTwoInts>("add_two_ints");
//创建learning_topic::AddTwoInts类型的Service消息
learning_topic::AddTwoInts srv;
srv.request.a = atoll(argv[1]);
srv.request.b = atoll(argv[2]);
//发布service请求,等待加法运算的结果
if(client.call(srv))
{
ROS_INFO("sum:%ld",(long int)srv.response.sum);
}
else
{
ROS_ERROR("fail to call service add_two_ints");
return 1;
}
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
编译功能包了。
四、运行
1.启动roscore
roscore
2、启动server
rosrun <你的功能包名字> <前面设置编译的名字>
我的指令
rosrun learning_communication server
如果运行正常,屏幕上就会输出一个info的消息。
3、启动client
格式和之前一样,区别是需要需要在后面跟上两个参数。因为我们要进行 的是两个数字的加法。
rosrun <你的功能包名字> <前面设置编译的名字>
我的指令
rosrun learning_communication client 3 5
之后你就可以看到反馈结果了。
注意:运行之前需要添加环境变量,别忘了你的source!!!!
运行结果图片