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
- 服务消息的定义 xxx.srv: 请求部分 + 响应部分
# 客户端请求时发送的两个数字 int32 num1 int32 num2 --- # 服务器响应发送的数据 int32 sum
- 编辑配置文件
package.xml 中添加编译依赖与执行依赖
修改 CMakeLists.txtmessage_generation message_runtime 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 ## )
- 编译会生成:Python 需要调用的中间文件(…/工作空间/devel/lib/python3/dist-packages/包名/srv).
- 配置 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 # 清除不可连接的节点(已经死亡但是被当成活着的僵尸节点)
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)