服务通信主要运用于对偶然性、实时性有要求,且有一定逻辑处理需求的数据传输场景
服务通信理论模型:

流程步骤:
-
Server注册
-
Client注册
-
ROS Master实现信息匹配
-
Client发送请求
-
Server发送响应
注意:
- 客户端请求时要保证服务器已经启动
- 服务端和客户端可以存在多个
话题通信和服务通信的握手阶段基本一致,由ROS Master做中介,所有与ROS Master进行的通信都是RPC协议,最后Server和Client的通信则是切换到TCP协议。
服务通信自定义srv
srv文件内的可用数据类型与msg文件一致,且自定义实现流程类似。
流程步骤:
- 按照固定格式创建srv文件
- 编辑配置文件
- 编译生成中间文件
注意:
服务通信中,数据分成两部分,请求与响应,在 srv 文件中请求和响应使用
---
分割
# 客户端请求时发送的两个数字
int32 num1
int32 num2
---
# 服务器响应发送的数据
int32 sum
自定义srv文件中数据类型的顺序是固定的,上面是客户端请求的数据,下面是服务器响应的数据,中间用三个横杠“-”分割
编辑配置文件:
package.xml中添加编译依赖与执行依赖
<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend>
<!--
exce_depend 以前对应的是 run_depend 现在非法
-->
CMakeLists.txt编辑 srv 相关配置
find_package(catkin REQUIRED COMPONENTS
roscpp
rospy
std_msgs
message_generation
)
# 需要加入 message_generation,必须有 std_msgs
add_service_files(
FILES
AddInts.srv
)
generate_messages(
DEPENDENCIES
std_msgs
)
代码实现注意:
- 服务端的回调函数中要有对客户端的数据检测
//逻辑处理
if (num1 < 0 || num2 < 0)
{
ROS_ERROR("提交的数据异常:数据不可以为负数");
return false;
}
- 客户端中要有对系统参数的安全检测
// 调用时动态传值,如果通过 launch 的 args 传参,需要传递的参数个数 +3
if (argc != 3)
// if (argc != 5)//launch 传参(0-文件路径 1传入的参数 2传入的参数 3节点名称 4日志路径)
{
ROS_ERROR("请提交两个整数");
return 1;
}
- 客户端可以先于服务端启动
ros::service::waitForService("sum");