1. 你们用的是「同一份合同」—— .srv 文件你有一个文件AddTwoInts.srvplaintextint64 aint64 b---int64 sum这个文件就是 双方的约定- 客户端 必须发 a、b- 服务端 必须收 a、b- 服务端 必须回 sum- 客户端 必须收 sum谁都不能乱改。2. 系统根据合同自动生成两套“固定格式”编译后ROS 自动给你生成两个东西客户端用的格式cppstruct AddTwoInts {Request request; // 固定Response response; // 固定};服务端用的格式cppstruct Request {int64 a; // 固定int64 b; // 固定};struct Response {int64 sum; // 固定};注意- request、response、a、b、sum 全是固定名字- 你改不了系统强制认识3. 客户端只能往「规定位置」放数据你在客户端写cppsrv.request.a 10;srv.request.b 20;这句话的意思- srv 整个包裹- .request 系统规定的发送区只能放要发的数据- a 、 b 合同里写死的两个位置你没有别的地方可以放只能放这里。4. 服务端只能从「规定位置」拿数据服务端代码cppbool add(Request req, Response res){res.sum req.a req.b;}- Request 类型 系统规定的接收格式- 里面 只有 a 和 b- 服务端 只能读 a 和 b没有别的东西可读5. 服务名一样 → 系统只把你们俩配对客户端cppserviceClient(add_two_ints);服务端cppadvertiseService(add_two_ints);- 名字一样 → ROS 只把你们两个连起来- 别人收不到你也发不到别人那6. 最终保证四层锁死我给你总结成4 条铁律你马上通透1. 合同一样同一个 .srv2. 格式一样自动生成的结构体3. 位置固定只能放 request 里的 a、b4. 名字一样同一个服务名最直白的比喻客户端和服务端 两个人传纸条- .srv 提前约定好的纸条格式- request 纸条的正面写问题- response 纸条的反面写答案- a、b 正面必须写的两个空- sum 反面必须写的一个空
ros1服务通信如何保证消息对应
1. 你们用的是「同一份合同」—— .srv 文件你有一个文件AddTwoInts.srvplaintextint64 aint64 b---int64 sum这个文件就是 双方的约定- 客户端 必须发 a、b- 服务端 必须收 a、b- 服务端 必须回 sum- 客户端 必须收 sum谁都不能乱改。2. 系统根据合同自动生成两套“固定格式”编译后ROS 自动给你生成两个东西客户端用的格式cppstruct AddTwoInts {Request request; // 固定Response response; // 固定};服务端用的格式cppstruct Request {int64 a; // 固定int64 b; // 固定};struct Response {int64 sum; // 固定};注意- request、response、a、b、sum 全是固定名字- 你改不了系统强制认识3. 客户端只能往「规定位置」放数据你在客户端写cppsrv.request.a 10;srv.request.b 20;这句话的意思- srv 整个包裹- .request 系统规定的发送区只能放要发的数据- a 、 b 合同里写死的两个位置你没有别的地方可以放只能放这里。4. 服务端只能从「规定位置」拿数据服务端代码cppbool add(Request req, Response res){res.sum req.a req.b;}- Request 类型 系统规定的接收格式- 里面 只有 a 和 b- 服务端 只能读 a 和 b没有别的东西可读5. 服务名一样 → 系统只把你们俩配对客户端cppserviceClient(add_two_ints);服务端cppadvertiseService(add_two_ints);- 名字一样 → ROS 只把你们两个连起来- 别人收不到你也发不到别人那6. 最终保证四层锁死我给你总结成4 条铁律你马上通透1. 合同一样同一个 .srv2. 格式一样自动生成的结构体3. 位置固定只能放 request 里的 a、b4. 名字一样同一个服务名最直白的比喻客户端和服务端 两个人传纸条- .srv 提前约定好的纸条格式- request 纸条的正面写问题- response 纸条的反面写答案- a、b 正面必须写的两个空- sum 反面必须写的一个空