创建服务并使用它:对三个整数求和。我们需要两个节点,一个服务器一个客户端。
在功能包chapter2_tutrorials中,src文件夹下新建两个节点并使用example2_a.cpp和example2_b.cpp为名称。
在example_a.cpp中:
#include "ros/ros.h"
#include "chapter2_tutorials/chapter2_srv1.h" //包含我们创建的srv文件
bool add(chapter2_tutorials::chapter2_srv1::Request &req,
chapter2_tutorials::chapter2_srv1::Response &res) //服务变量
{
res.sum = req.A + req.B + req.C;
ROS_INFO("request: A=%d, B=%d C=%d", (int)req.A, (int)req.B, (int)req.C);//请求输入
ROS_INFO("sending back response: [%d]", (int)res.sum); //输出
return true;
}
//这个函数会对3个变量求和,并将计算结果发送给其他节点
int main(int argc, char **argv)
{
ros::init(argc, argv, "add_3_ints_server");
ros::NodeHandle n;
ros::ServiceServer service = n.advertiseService("add_3_ints", add); //创建服务并发布广播
ROS_INFO("Ready to add 3 ints.");
ros::spin();
return 0;
}
在example_b.cpp中
#include "ros/ros.h"
#include "chapter2_tutorials/chapter2_srv1.h"
#include <cstdlib>
int main(int argc, char **argv)
{
ros::init(argc, argv, "add_3_ints_client");
if (argc != 4)
{
ROS_INFO("usage: add_3_ints_client A B C ");
return 1;
}
ros::NodeHandle n;
ros::ServiceClient client = n.serviceClient<chapter2_tutorials::chapter2_srv1>("add_3_ints");
//使用add_3_ints为名称创建一个服务的客户端
chapter2_tutorials::chapter2_srv1 srv;
srv.request.A = atoll(argv[1]);
srv.request.B = atoll(argv[2]);
srv.request.C = atoll(argv[3]);
//创建srv文件的一个实例,并加入需要发送的数据值。
if (client.call(srv))//调用服务并发送数据,如果调用成功,call()函数会返回true;否则false
{
ROS_INFO("Sum: %ld", (long int)srv.response.sum);
}
else
{
ROS_ERROR("Failed to call service add_two_ints");
return 1;
}
return 0;
}
编译节点,在CMakelist.txt文件中增加以下行:
现在执行以下命令:
$rosmake chapter2_tutorials
为了启动节点,需要执行以下命令行:
rosrun chapter2_tutorials example2_a
rosrun chapter2_tutorials example2_b 1 2 3
显示结果