创建一个service节点(add_two_ints_server),该节点接收到两个整形数字,并返回它们的和。
在~/catkin_ws/src/ros_learning/src功能包里面创建add_two_ints_server.cpp和add_two_ints_client.cpp两个文件
1.编写server节点
#include "ros/ros.h"
#include "ros_learning/AddTwoInts.h"
//service回调函数,输入参数req,输出参数res
bool add(ros_learning::AddTwoInts::Request &req,ros_learning::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_server");
//创建节点句柄
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;
}
2.编写client节点
#include <cstdlib>
#include "ros/ros.h"
#include "ros_learning/AddTwoInts.h"
int main(int argc,char **argv)
{
//ros节点初始化
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;
//创建一个client,请求add_two_ints,service消息类型是ros_learning::AddTwoInts
ros::ServiceClient client = n.serviceClient<ros_learning::AddTwoInts>("add_two_ints");
//创建ros_learning::AddTwoInts类型的service消息
ros_learning::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_INFO("Failed to call service add_two_ints");
return 1;
}
return 0;
}
3.修改CMakeLists.txt文件
在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 ros_learning_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 ros_learning_gencpp)
4.编译文件
退出到~/catkin_ws执行:
catkin_make
到这已经编译成功!
5.运行节点
启动ros节点:
roscore
再打开一个终端运行server输入:
rosrun ros_learning add_two_ints_server
再打开一个终端运行client输入:
rosrun ros_learning add_two_ints_client 1234 4321
看到如下结果,执行成功!!!!!!