ROS入门:服务

服务端实现一个加法,将结果反馈给客户端

客户端将要计算的和的两个数发给服务的。

1.自定义服务数据

创建一个srv文件:AddTwoInts.srv

int64 a
int64 b
---
int64 sum

上面是request数据,下面是response数据,中间用---隔开

打开package.xml文件,加入

<build_depend>message_generation</build_depend>
<build_export_depend>message_generation</build_export_depend>
<exec_depend>message_runtime</exec_depend>

打开CMakeLists.txt文件加入

find_package(catkin REQUIRED COMPONENTS
  message_generation
  roscpp
)

add_service_files(FILES
  AddTwoInts.srv
)

2.服务端代码

#include "ros/ros.h"
#include "learning_server/AddTwoInts.h"
//service 回调函数  输入req  输出res
bool add(learning_server::AddTwoInts::Request &req,
         learning_server::AddTwoInts::Response &res)
{
    res.sum = req.a + req.b;
    return true;             
}

int main(int argc, char **argv)
{
    //ROS节点初始化
    ros::init(argc, argv, "add_server");

    //创建节点句柄
    ros::NodeHandle n;

    //创建一个名为add_two的server,注册回调函数add()
    ros::ServiceServer service = n.advertiseService("add_two",add);

    //等待回调函数,类似于轮询的方式
    ros::spin();

    return 0;

}

3.客户端代码

#include <cstdlib>
#include "ros/ros.h"
#include "learning_server/AddTwoInts.h"

int main(int argc, char *argv[])
{
    //ros节点初始化
    ros::init(argc, argv, "add_client");

    if(argc != 3)
    {
        return 1;
    }
    //创建节点句柄
    ros::NodeHandle n;

    //创建一个client,请求服务
    ros::ServiceClient client = n.serviceClient<learning_server::AddTwoInts>("add_two");

    //创建自定义的服务类型srv
    learning_server::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("faile");
        return 1;
    }

    return 0;
}

猜你喜欢

转载自www.cnblogs.com/penuel/p/11344258.html