科研向(仿真验证) ROS 学习笔记二 B:ROS 通信机制 —— 服务通信

科研向(仿真验证) ROS 学习笔记二 B:ROS 通信机制 —— 服务通信,第1张

科研向(仿真验证) ROS 学习笔记二 B:ROS 通信机制 —— 服务通信

ROS 通信机制
ROS是进程(也称为 Nodes)的分布式框架。 这些进程甚至还可分布于不同主机协同工作,所以结点之间如何通信非常重要!

基本通信机制二:服务通信(请求响应模式)

用于偶然的、对时时性有要求、有一定逻辑处理需求的数据传输场景。

要素1: 消息的客户端(Client), 要素2: 消息的服务端(Server), 要素3: 话题名称(Service), 要素4: 数据载体(srv)

ROS Master 负责保管 Server 和 Client 注册的信息,并匹配话题相同的 Server 与 Client ,帮助 Server 与 Client 建立连接,连接建立后,Client 发送请求信息,Server 返回响应信息。

服务器实现 python 代码:

#! /usr/bin/env python
"""
    服务器端实现:
        1.导包
        2.初始化 ROS 节点
        3.创建服务对象
        4.回调函数处理请求并产生响应
        5.spin 函数

"""
import rospy
from srv_sum.srv import *


# 回调函数的参数是请求对象,返回值是响应对象
def doReq(req):
    sum = req.num1 + req.num2
    rospy.loginfo("num1 = %d, num2 = %d, sum = %d",req.num1, req.num2, sum)
    resp = addintsResponse(sum)  # 创建响应对象,赋值并返回
    return resp


if __name__ == "__main__":
    rospy.init_node("addints_server")  
    server = rospy.Service("AddInts",addints,doReq)  # 实例化服务对象
    rospy.spin()

客户端实现 python 代码:

#! /usr/bin/env python

"""
    客户端实现:
        1.导包
        2.初始化 ROS 节点
        3.创建请求对象
        4.发送请求
        5.接收并处理响应

    优化:
        加入数据的动态获取
"""

import rospy
from srv_sum.srv import *
import sys

if __name__ == "__main__":
    if len(sys.argv) != 3:  # 优化实现
        rospy.logerr("number error")
        sys.exit(1)

    rospy.init_node("addInts_client")
    client = rospy.ServiceProxy("AddInts",addints)
    client.wait_for_service()
    
    req = addintsRequest()
    req.num1 = int(sys.argv[1])  #优化
    req.num2 = int(sys.argv[2]) 

    resp = client.call(req)
    rospy.loginfo("响应结果:%d",resp.sum)
服务通信自定义 srv
  1. 服务消息的定义 xxx.srv: 请求部分 + 响应部分
    # 客户端请求时发送的两个数字
    int32 num1
    int32 num2
    ---  
    # 服务器响应发送的数据
    int32 sum
    
  2. 编辑配置文件
    package.xml 中添加编译依赖与执行依赖
    message_generation
    message_runtime
    
    修改 CMakeLists.txt
    find_package(catkin REQUIRED COMPonENTS
      roscpp
      rospy
      std_msgs  # 需要加入 message_generation,必须有 std_msgs
      message_generation  ##
    )
    
    add_service_files(
      FILES
      xxx.srv  ##
    )
    
    generate_messages(
      DEPENDENCIES
      std_msgs  ##
    )
    
  3. 编译会生成:Python 需要调用的中间文件(…/工作空间/devel/lib/python3/dist-packages/包名/srv).
  4. 配置 vsc: settings.json 即可正常 import.
    {
        "python.autoComplete.extraPaths": [
            "/opt/ros/noetic/lib/python3/dist-packages",
            "/xxx/yyy工作空间/devel/lib/python3/dist-packages"
        ]
    }
    
*服务相关命令
rosservice list  		# 列出所有活动的服务
rosservice info srv_xxx	# 打印有关服务的信息
rosservice args srv_xxx	# 打印服务参数
rosservice type srv_xxx	# 打印服务使用的数据类型
rosservice call srv_xxx	# 使用提供的参数调用服务
其他相关常用命令 rosnode:
rosnode ping /node  # 测试到节点的连接状态
rosnode list    	# 列出活动节点
rosnode info /node  # 打印节点信息
rosnode machine 	# 列出指定设备上节点
rosnode kill /node  # 杀死某个节点
rosnode cleanup 	# 清除不可连接的节点(已经死亡但是被当成活着的僵尸节点)

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5437338.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-11
下一篇 2022-12-11

发表评论

登录后才能评论

评论列表(0条)

保存