ROS服务通信是基于 C/S 模式的双向数据传输模式(有应答的通信机制),ROS话题通信是无应答的通信机制。根据 Master 是否参数也分为两部分:连接前的准备,连接和通信;通信流程如下:
服务通信与 话题通信的 连接和通信 步骤都是一样的。唯一不同的是服务通信是有应答的。
1、Listener 接收到 Talker 的确认消息后,使用 TCP 尝试与 Talker 建立网络连接;
2、成功连接之后,Talker 开始向 Listener 发布话题消息数据;
3、至此,服务通信完成连接和通信过程,可以进行有应答的信息交流了。
4、需要注意,有可能是一个 Talker 连接上多个 Listener。
# 服务端 import rospy from demo03_server_client.src import AddInts,AddIntsRequest,AddIntsResponsedef doReq(req):# 解析提交的数据sum = req.num1 + req.num2rospy.loginfo("提交的数据:num1 = %d, num2 = %d, sum = %d", req.num1, req.num2, sum)# 创建响应对象,赋值并返回resp = AddIntsResponse(sum)return respif __name__ == "__main__":# 初始化ROS节点rospy.init_node("addints_server_p")# 创建服务对象server = rospy.Service("AddInts", AddInts, doReq)# 回调函数处理请求并产生响应 rospy.spin()# 客户端 import rospy import sysif __name__ == "__main__":# 初始化ROS节点rospy.init_node("AddInts_Client_p")# 创建请求对象client = rospy.ServiceProxy("AddInts", AddInts)# 等待服务器就绪 client.wait_for_service()# 发送请求,接受并处理响应req = AddIntsRequest()