服务通信接口的定义与使用

了解了通信接口的概念,接下来我们再从代码实现的角度,研究下如何定义以及使用一个接口。
在之前服务概念讲解的课程中,我们编写了这样一个例程,我们再来回顾下。
有三个节点:
第一个驱动相机发布图像话题;
第二个是机器视觉识别节点,封装了一个服务的服务端对象,提供目标识别位置的查询服务;
第三个节点在需要目标位置的时候,就可以发送请求,收到位置进行使用了。
接口定义
在这个例程中,我们使用getobjectposition.srv定义了服务通信的接口:
learning_interface/srv/getobjectposition.srv
bool get # 获取目标位置的指令---int32 x # 目标的x坐标int32 y # 目标的y坐标定义中有两个部分,上边是获取目标位置的指令,get为true的话,就表示我们需要一次位置,服务端就会反馈这个x、y坐标了。
完成定义后,还需要在功能包的cmakelists.txt中配置编译选项,让编译器在编译过程中,根据接口定义,自动生成不同语言的代码:
...find_package(rosidl_default_generators required)rosidl_generate_interfaces(${project_name} srv/getobjectposition.srv)...功能包的package.xml文件中也需要添加代码生成的功能依赖:
... rosidl_default_generators rosidl_default_runtime rosidl_interface_packages ...程序调用
我们在代码中再来重点看下接口的使用方法。
客户端接口调用
learning_service/service_object_client.py
#!/usr/bin/env python3# -*- coding: utf-8 -*-@作者: 古月居@说明: ros2服务示例-请求目标识别,等待目标位置应答import rclpy # ros2 python接口库from rclpy.node import node # ros2 节点类from learning_interface.srv import getobjectposition # 自定义的服务接口class objectclient(node): def __init__(self, name): super().__init__(name) # ros2节点父类初始化 self.client = self.create_client(getobjectposition, 'get_target_position') while not self.client.wait_for_service(timeout_sec=1.0): self.get_logger().info('service not available, waiting again...') self.request = getobjectposition.request() def send_request(self): self.request.get = true self.future = self.client.call_async(self.request)def main(args=none): rclpy.init(args=args) # ros2 python接口初始化 node = objectclient(service_object_client) # 创建ros2节点对象并进行初始化 node.send_request() while rclpy.ok(): rclpy.spin_once(node) if node.future.done(): try: response = node.future.result() except exception as e: node.get_logger().info( 'service call failed %r' % (e,)) else: node.get_logger().info( 'result of object position:n x: %d y: %d' % (response.x, response.y)) break node.destroy_node() # 销毁节点对象 rclpy.shutdown() # 关闭ros2 python接口服务端接口调用
learning_service/service_object_server.py
#!/usr/bin/env python3# -*- coding: utf-8 -*-@作者: 古月居(www.guyuehome.

日本打造陶瓷柔性电解质薄片新方法,使其能够在更大的温度范围工作
射频技术的简单介绍以及在公安和防伪领域中的应用
智能家居中无处不在的电声元件
保持性能长期一致对相对湿度传感器的重要性
俄罗斯研究人员开发出机器学习系统,可助世界的空间机构选择“正确”的植物
服务通信接口的定义与使用
四维图新旗下中寰卫星获吉利新能源商用车订单
TE Connectivity第二代充电插座助力装配升级
linux下的一些文件的简单操作
光纤连接器研磨机伺服控制系统设计
融合人脸面部“热图”识别的下一代人脸识别技术
解读Tegra K1:英伟达最强大的车载处理芯片
SG3525引脚功能和结构框图
基于CCP的汽车控制器的匹配标定的设计
人工智能时代 智能楼宇面临的机遇和挑战
铜集流体是否适用于硫化物全固态电池?
人脸识别门禁系统在写字楼有哪些应用
MOS场效应晶体管的特性与原理
自动减速器工作原理
钠离子电池与锂离子电池相比较