编写简单的服务和客户端 C++
编写服务节点 server node
在beginner_tutorials包中创建src/add_two_ints_server.cpp文件
#include "ros/ros.h"
#include "beginner_tutorials/AddTwoInts.h" //之前创建的srv文件中生成的头文件
bool add(beginner_tutorials::AddTwoInts::Request &req,
beginner_tutorials::AddTwoInts::Response &res)//提供了AddTwoInts服务接受srv文件中定义的请求(request)和响应(response)类型,并返回一个布尔值
{
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;
//两个整数相加,存储在响应中。然后记录一些有关请求和响应的信息到日志中。完成后,服务返回true。
}
int main(int argc, char **argv)
{
ros::init(argc, argv, "add_two_ints_server");
ros::NodeHandle n;
ros::ServiceServer service = n.advertiseService("add_two_ints", add);//服务被创建
ROS_INFO("Ready to add two ints.");//在ROS中宣告
ros::spin();
return 0;
}
编写客户端节点 client node
在beginner_tutorials包中创建src/add_two_ints_client.cpp文件
#include "ros/ros.h"
#include "beginner_tutorials/AddTwoInts.h"
#include <cstdlib>
int main(int argc, char **argv)
{
ros::init(argc, argv, "add_two_ints_client");
if (argc != 3)
{
ROS_INFO("usage: add_two_ints_client X Y");
return 1;
}
ros::NodeHandle n;
ros::ServiceClient client = n.serviceClient<beginner_tutorials::AddTwoInts>("add_two_ints");//为add_two_ints服务创建一个客户端。ros::ServiceClient对象的作用是在稍后调用服务
beginner_tutorials::AddTwoInts srv;//实例化一个自动生成的服务类,为它的request成员赋值
srv.request.a = atoll(argv[1]);
srv.request.b = atoll(argv[2]);//一个服务类包括2个成员变量:request和response,以及2个类定义:Request和Response
if (client.call(srv))//上调用了服务。由于服务调用被阻塞,它将在调用完成后返回。如果服务调用成功,call()将返回true,并且srv.response中的值将是有效的。如果调用不成功,则call()将返回false且srv.response的值将不可用。
{
ROS_INFO("Sum: %ld", (long int)srv.response.sum);
}
else
{
ROS_ERROR("Failed to call service add_two_ints");
return 1;
}
return 0;
}
构建节点
编辑beginner_tutorials里面的CMakeLists.txt
文件末尾添加
add_executable(add_two_ints_server src/add_two_ints_server.cpp)
target_link_libraries(add_two_ints_server ${catkin_LIBRARIES})
add_dependencies(add_two_ints_server beginner_tutorials_gencpp)
add_executable(add_two_ints_client src/add_two_ints_client.cpp)
target_link_libraries(add_two_ints_client ${catkin_LIBRARIES})
add_dependencies(add_two_ints_client beginner_tutorials_gencpp)
将创建两个可执行文件add_two_ints_server和add_two_ints_client
在你的catkin工作空间下运行
cd ~/catkin_ws
catkin_make
运行测试
启动内核
$ roscore
新终端中启动服务
$ rosrun beginner_tutorials add_two_ints_server # (C++)
Ready to add two ints.
新终端中启动客户端
$ rosrun beginner_tutorials add_two_ints_client 1 3 # (C++)
Requesting 1+3
1 + 3 = 4