ROS中使用srv需要一个服务器端和一个客户端。客户端向服务器端发出服务请求,服务器端根据客户端的请求给出回应。在本文前两节的基础上继续讲解ROS系统中的srv使用。
1. 创建srv文件
在~/catkin_ws/src/ROS_Test1路径中创建srv文件:
mkdir srv
cd srv
vim ROS_Test1_srv.srv
编辑内容如下所示:
2. 编辑功能包清单package.xml
rosed ROS_Test1 package.xml
找到如下模块并按图所示取消注释
3. 编辑文件CMakeLists.txt
分别找到如下模块取消注释并编辑:
执行命令行:
cd ~/catkin_ws
source /devel/setup.bash
rossrv show ROS_Test1/ROS_Test1_srv
若显示内容与ROS_Test1_srv.srv文件中的内容一致,说明服务创建成功。
4. 服务端创建
在src文件下编辑node_d1.cpp内容如下:
#include "ros/ros.h"
#include "ROS_Test1/ROS_Test1_srv"
bool add(ROS_Test1::ROS_Test1_srv::Request &req,
ROS_Test1::ROS_Test1_srv::Response &res)
{
res.result = req.i1 + req.i2 + req.i3;
ROS_INFO("sending service add");
return true;
}
int main(int argc, char **argv)
{
ros::init(argc, argv, "service_server");
ros::NodeHandle n;
ros::ServiceServer service = n.advertiseService("service1", add);
ROS_INFO("service Ready!");
ros::spin();
return 0;
}
5. 客户端创建
#include "ros/ros.h"
#include "ROS_Test1/ROS_Test1_srv.h"
#include <cstdlib>
int main(int argc, char **argv)
{
ros::init(argc, argv, "service_client");
ros::NodeHandle n;
ros::ServiceClient client = n.serviceClient<ROS_Test1::ROS_Test1_srv>("service1");
ROS_Test1::ROS_Test1_srv srv;
srv.request.i1 = 1;
srv.request.i2 = 2;
srv.request.i3 = 3;
if(client.call(srv))
{
ROS_INFO("service success. result : %d", srv.response.result);
}
else
{
ROS_INFO("service failed!");
return 1;
}
return 0;
}
6. 编辑ROS_Test1文件夹下的CMakeLists.txt文件
7. 编译节点与节点运行
cd ~/catkin_ws
catkin_make
roscore
另外打开两个终端分别运行一下命令行(先source):
rosrun ROS_Test1 Test1_node_d1
rosrun ROS_Test1 Test1_node_d2
运行结果如下所示: