一.理论

学习ROS 自定义服务消息 .srv
格式规范:— 上 = 请求 request,下 = 响应 response
完整实现案例:两数相加服务
编写 AddTwoInts.srv
在这里插入图片描述

编写服务端 server(advertiseService、服务回调函数、ros::spin ())

#include "ros/ros.h"
// 导入我们自定义的服务消息头文件
#include "srv_demo/AddTwoInts.h"

// 服务回调函数:收到请求后执行,计算结果并返回
bool addCallback(srv_demo::AddTwoInts::Request  &req,
                 srv_demo::AddTwoInts::Response &res)
{
    // 从请求中取出a和b,求和存入响应
    res.sum = req.a + req.b;
    // 打印日志
    ROS_INFO("收到请求:a=%d, b=%d,返回结果sum=%d", req.a, req.b, res.sum);
    return true;
}

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

    setlocale(LC_ALL,"zh_CN.UTF-8");
    // 注册服务:服务名add_two_ints,绑定回调函数
    ros::ServiceServer service = nh.advertiseService("add_two_ints", addCallback);
    ROS_INFO("加法服务端已启动,等待客户端请求...");

    // 循环等待请求,触发回调
    ros::spin();
    return 0;
}

编写客户端 client(waitForExistence ()、call () 同步阻塞调用)

#include "ros/ros.h"
#include "srv_demo/AddTwoInts.h"

int main(int argc, char **argv)
{
    ros::init(argc, argv, "add_two_ints_client");
    ros::NodeHandle nh;

    setlocale(LC_ALL,"zh_CN.UTF-8");
    // 创建客户端,指定服务名
    ros::ServiceClient client = nh.serviceClient<srv_demo::AddTwoInts>("add_two_ints");
    
    // 等待服务上线:解决启动顺序问题
    ROS_INFO("等待服务 /add_two_ints 上线...");
    client.waitForExistence();
    ROS_INFO("服务已找到,准备发起请求");

    // 构造请求数据
    srv_demo::AddTwoInts srv;
    srv.request.a = 3;
    srv.request.b = 5;

    // 发起调用,阻塞等待结果
    if (client.call(srv))
    {
        ROS_INFO("调用成功,求和结果:%d", srv.response.sum);
    }
    else
    {
        ROS_ERROR("调用服务失败!");
        return 1;
    }

    return 0;
}

掌握关键配置:
package.xml 添加 message_generation、message_runtime

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

在这里插入图片描述

CMakeLists.txt:add_service_files /generate_messages/add_dependencies
在这里插入图片描述
在这里插入图片描述

实操验证知识点

waitForExistence () 作用:解决客户端先启动导致调用失败
区分:waitForExistence() 等待服务存在;client.call() 发送请求

二、开源项目 semantic_patrol_ros

项目定位:自制 ROS 语义巡逻机器人
今日推进:创建功能包,定义 PatrolControl.srv 巡逻控制服务(暂停 / 继续 / 重置任务)
1.目录结构
在这里插入图片描述
2.srv

#控制指令: 0=暂停巡航 1=继续巡航 2=重置任务
int8 cmd
---
#执行结果
bool success
string message
Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐