2026.8.03-初入ros+slam+opencv第八天-学习ROS 自定义服务消息
·
一.理论
学习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
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐


所有评论(0)