ROS入门:服务

Posted penuel

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;

 

以上是关于ROS入门:服务的主要内容,如果未能解决你的问题,请参考以下文章

ROS入门 文件结构篇

ROS入门之基础功能详解--编写消息和服务

ROS从入门到精通系列(二十九)-- linux封装ROS 自启动脚本及可执行程序App

机器人操作系统(ROS)入门与实践--1

蓝桥ROS机器人之古月居ROS入门21讲

ROS入门必了解的ROS文件系统和软件包