ROS 服务创建与调用指南
介绍 ROS 服务(Service)是一种请求-响应模式的通信机制,适合一次性查询或控制操作(区别于持续发布的 Topic)。 1 2 3 4 5 客户端 (Client) 服务端 (Server) | | |--- 请求 (Request) ------------->| | | 处理逻辑 |<-- 响应 (Response) -------------| 原理 通信模型 ROS 服务基于 TCP/IP 的同步 RPC(远程过程调用)机制: 服务端在 ROS Master 注册服务名和地址 客户端通过 ROS Master 查找服务端地址 客户端与服务端建立 TCP 直连 客户端发送请求,阻塞等待响应 服务端处理完成后返回响应,客户端解除阻塞 graph LR A[ROS Master<br>注册中心] -->|① 注册服务| B[Server<br>服务端] A -->|② 查找服务| C[Client<br>客户端] B <-->|③ TCP 直连| C 与 Topic 的对比 特性 Topic(话题) Service(服务) 通信模式 发布-订阅(异步) 请求-响应(同步) 是否阻塞 否,持续发布 是,等待响应 数据流向 单向(发布者→订阅者) 双向(请求+响应) 适用场景 持续数据流(传感器、位姿) 一次性操作(查询、控制) 典型例子 点云、里程计、地图 获取变换、保存文件、重置状态 底层实现 服务定义文件 .srv 编译后自动生成 C++/Python 的请求和响应类 通信协议:roscpp 使用 TCPROS,rospy 使用 XML-RPC + TCPROS 服务端回调函数在 ROS spinner 线程中执行,多个请求会排队处理 作用 适用场景 状态查询:获取某个变量的当前值(如本项目的变换矩阵查询) 配置修改:运行时修改参数(如切换模式、调整阈值) 触发动作:执行一次性操作(如保存地图、重置系统) 同步确认:需要确认操作结果(如配准是否成功) 本项目中的应用 sequenceDiagram participant Other as 其他节点 participant MRLO as MRLO 节点 Other->>MRLO: get_transform(robot_id=1) MRLO->>MRLO: 从 drone_gicp_poses_ 读取 MRLO-->>Other: transform (Pose) Other->>Other: 使用变换矩阵转换坐标系 外部节点(如导航、规划模块)需要知道各机器人相对于 robot0 的坐标变换,通过服务按需获取,避免不必要的持续订阅。 ...