• ROS手动编写服务端和客户端service demo(C++)


    service demo

    原理和 topic 通信方式很像 点击打开链接,因此

    1.srv :

    进入 service_demo 创建 srv 文件夹,创建 Greeting.srv,将以下代码插入:

    string name
    int32 age
    ---
    string feedback
     

    这个意思是 client 将自己的名称和年龄发给 server,server 会返回一个字符串。

    2.server.cpp

    进入 src 文件夹,编写 server.cpp

    // 加载必要文件,注意Service_demo的加载方式
    # include "ros/ros.h"
    # include "service_demo/Greeting.h"
    # include "string"
    
    // 定义请求处理函数
    bool handle_function(service_demo::Greeting::Request &req,
                                            service_demo::Greeting::Response &res)
    {
            // 此处我们对请求直接输出
            ROS_INFO("Request from %s with age %d ", req.name.c_str(), req.age);
    
            // 返回一个反馈,将response设置为"..."
            res.feedback = "Hi " + req.name + ". I'm server!";
            return true;
    }
    
    int main(int argc, char **argv)
    {
            // 初始化节点,命名为"greetings_server"
            ros::init(argc, argv, "greetings_server");
    
            // 定义service的server端,service名称为“greetings”,收到request请求之后>传递给handle_function进行处理
            ros::NodeHandle nh;
            ros::ServiceServer service = nh.advertiseService("greetings", handle_function);
            
            ros::spin();
            return 0;
    }

    3.client.cpp

    # include "ros/ros.h"
    # include "service_demo/Greeting.h"
    
    int main(int argc, char **argv)
    {
            // 初始化,节点命名为"greetings_client"
            ros::init(argc, argv, "greetings_client");
    
            // 定义service客户端,service名字为“greetings”,service类型为Service_demo
            ros::NodeHandle nh;
            ros::ServiceClient client = nh.serviceClient<service_demo::Greeting>("greetings");
    
            // 实例化srv,设置其request消息的内容,这里request包含两个变量,name和age,见Greeting.srv
            service_demo::Greeting srv;
            srv.request.name = "HAN";
            srv.request.age = 20;
            if (client.call(srv))
            {
                    // 注意我们的response部分中的内容只包含一个变量response,另,注>意将其转变成字符串
                    ROS_INFO("Response from server: %s", srv.response.feedback.c_str());
            }
            else
            {
                    ROS_ERROR("Failed to call service Service_demo");
                    return 1;
            }
            return 0;
    }

    4.CMakeLists.txt & package.xml

    5.编译运行

    先运行 server ,再运行 client ,结果就不展示了。

  • 相关阅读:
    vue 使用 <iframe> 嵌入网页 地址实现动态配置
    vue 视频播放 vue-video-player
    vue 实现自定义序号, 并且翻页序号累加。
    关于 vue 使用 Handsontable 表格数据导出
    node.js Stream流的使用
    手把手教如何搭建node+egg项目 引入Sequelize
    实现 通过数据库里一个字段值相等 则把 他合为一条数据
    最近在项目中碰到把对象数组转为键值对,
    js 的数组怎么push一个对象. Js数组的操作push,pop,shift,unshift JavaScrip
    for循环
  • 原文地址:https://www.cnblogs.com/NikkiNikita/p/9450735.html
Copyright © 2020-2023  润新知