网站怎样做,东莞网站制作推广公司,网站建设基本流程心得,手机导航下载2022新版在 ROS 系统中#xff0c;通信接口#xff08;Interface#xff09; 是节点之间传递信息的标准“语言协议”#xff0c;确保了不同功能节点之间可以正确理解和使用彼此传送的数据内容。我们可以将其理解为“数据结构格式定义”#xff0c;贯穿于话题#xff08;Topic通信接口Interface 是节点之间传递信息的标准“语言协议”确保了不同功能节点之间可以正确理解和使用彼此传送的数据内容。我们可以将其理解为“数据结构格式定义”贯穿于话题Topic、服务Service、动作Action等通信机制中。
在软件开发中“接口”是一种连接关系它规定了数据如何进出模块如何对接只有两边的格式和要求一致系统才能正常“搭伙做事”。 为了让每个 ROS 节点可以用不同的语言编写比如一个节点用 C 控制硬件另一个节点用 Python 实现上层逻辑ROS 把通信接口设计成与编程语言无关的格式。
int32 表示 32 位整型
int64 表示 64 位长整型
bool 表示布尔值
还支持数组如 int32[]、嵌套结构体等复合数据类型
这些接口定义写在 .msg消息或 .srv服务文件中。 在 编译时ROS 会自动生成对应语言如 C 或 Python里的数据结构文件供节点直接使用开发者不需要自己去写解析逻辑。
无论你用什么语言编写节点只要遵循统一接口数据就能准确传输、协同工作。 ROS 2 三种通信机制话题、服务、动作在接口定义上的格式差异。
在 ROS 2 系统中通信接口的定义格式因通信机制而异但都遵循统一的、语言无关的描述方式。
话题Topic通信
使用 .msg 文件定义属于单向异步通信。 只需定义每一帧数据的内容格式如
int32 x int32 y 表示消息中包含两个 32 位整型数据可用于发送二维坐标等。
服务Service通信
使用 .srv 文件定义属于请求-应答式的同步通信。 定义由请求部分和应答部分组成中间用 --- 分隔例如
int64 a int64 b --- int64 sum 客户端发起请求包含 a 和 b服务器处理后返回 sum。
动作Action通信
使用 .action 文件定义适合描述持续一段时间的过程性任务如移动、旋转、导航等。
定义包含三部分
# 目标 bool enable --- # 结果 bool finish --- # 反馈 int32 state
目标Goal开始任务如开始转动
结果Result任务最终是否完成
反馈Feedback周期性返回进度如当前已转动角度
通信机制接口文件特点数据方向话题.msg异步、广播单向服务.srv同步请求客户端 ⇄ 服务端动作.action可反馈过程客户端 ⇄ 服务端 反馈
服务接口的定义与使用
在本案例中我们以一个获取目标位置的服务为例全面了解 ROS 2 中服务接口的定义方法及实际应用方式。
learning_interface/srv/GetObjectPosition.srv
bool get # 请求是否获取目标位置 --- int32 x # 响应目标X坐标 int32 y # 响应目标Y坐标
bool get客户端请求参数true 表示请求当前目标位置。
---分隔请求与响应。
int32 x, y服务端反馈的目标坐标。
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_sec1.0):self.get_logger().info(service not available, waiting again...)self.request GetObjectPosition.Request()def send_request(self):self.request.get Trueself.future self.client.call_async(self.request)def main(argsNone):rclpy.init(argsargs) # 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))breaknode.destroy_node() # 销毁节点对象rclpy.shutdown() # 关闭ROS2 Python接口import rclpy # ROS2 Python接口库
from rclpy.node import Node # ROS2 节点类
from sensor_msgs.msg import Image # 图像消息类型
import numpy as np # Python数值计算库
from cv_bridge import CvBridge # ROS与OpenCV图像转换类
import cv2 # Opencv图像处理库
from learning_interface.srv import GetObjectPosition # 自定义的服务接口lower_red np.array([0, 90, 128]) # 红色的HSV阈值下限
upper_red np.array([180, 255, 255]) # 红色的HSV阈值上限class ImageSubscriber(Node):def __init__(self, name):super().__init__(name) # ROS2节点父类初始化self.sub self.create_subscription(Image, image_raw, self.listener_callback, 10) # 创建订阅者对象消息类型、话题名、订阅者回调函数、队列长度self.cv_bridge CvBridge() # 创建一个图像转换对象用于OpenCV图像与ROS的图像消息的互相转换self.srv self.create_service(GetObjectPosition, # 创建服务器对象接口类型、服务名、服务器回调函数get_target_position,self.object_position_callback) self.objectX 0self.objectY 0 def object_detect(self, image):hsv_img cv2.cvtColor(image, cv2.COLOR_BGR2HSV) # 图像从BGR颜色模型转换为HSV模型mask_red cv2.inRange(hsv_img, lower_red, upper_red) # 图像二值化contours, hierarchy cv2.findContours(mask_red, cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE) # 图像中轮廓检测for cnt in contours: # 去除一些轮廓面积太小的噪声if cnt.shape[0] 150:continue(x, y, w, h) cv2.boundingRect(cnt) # 得到苹果所在轮廓的左上角xy像素坐标及轮廓范围的宽和高cv2.drawContours(image, [cnt], -1, (0, 255, 0), 2)# 将苹果的轮廓勾勒出来cv2.circle(image, (int(xw/2), int(yh/2)), 5,(0, 255, 0), -1) # 将苹果的图像中心点画出来self.objectX int(xw/2)self.objectY int(yh/2)cv2.imshow(object, image) # 使用OpenCV显示处理后的图像效果cv2.waitKey(50)def listener_callback(self, data):self.get_logger().info(Receiving video frame) # 输出日志信息提示已进入回调函数image self.cv_bridge.imgmsg_to_cv2(data, bgr8) # 将ROS的图像消息转化成OpenCV图像self.object_detect(image) # 苹果检测def object_position_callback(self, request, response): # 创建回调函数执行收到请求后对数据的处理if request.get True:response.x self.objectX # 目标物体的XY坐标response.y self.objectYself.get_logger().info(Object position\nx: %d y: %d %(response.x, response.y)) # 输出日志信息提示已经反馈else:response.x 0response.y 0self.get_logger().info(Invalid command) # 输出日志信息提示已经反馈return responsedef main(argsNone): # ROS2节点主入口main函数rclpy.init(argsargs) # ROS2 Python接口初始化node ImageSubscriber(service_object_server) # 创建ROS2节点对象并进行初始化rclpy.spin(node) # 循环等待ROS2退出node.destroy_node() # 销毁节点对象rclpy.shutdown() # 关闭ROS2 Python接口
这是一个通过图像识别红色目标物体并通过ROS服务机制获取其当前坐标的系统。
服务器端服务提供方接收图像并处理检测红色物体位置一旦客户端请求就返回该位置。
客户端服务调用方主动发起“请告诉我目标位置”的请求获取最新坐标。
在 ROS2 中通信接口Interface 是一种标准格式的“数据结构定义”用于描述节点间如何传递数据。
对于 服务通信Service 来说接口包括两部分
请求部分Request客户端发送给服务端的数据。
响应部分Response服务端返回给客户端的结果。
接口使用 .srv 文件定义例如你定义的
定义通信接口文件 .srv
bool get --- int32 x int32 y
在服务端创建服务对象绑定回调
self.srv self.create_service( GetObjectPosition, # 使用定义好的接口 get_target_position, # 服务名 self.object_position_callback # 处理函数 )
在客户端创建服务请求并发送
self.client self.create_client(GetObjectPosition, get_target_position) self.request GetObjectPosition.Request() self.request.get True self.future self.client.call_async(self.request)
服务端处理请求并返回响应
def object_position_callback(self, request, response): if request.get: response.x self.objectX response.y self.objectY return response
再次说明# 文件learning_interface/srv/GetObjectPosition.srv bool get --- int32 x int32 y
系统会自动生成
一个 GetObjectPosition.Request 类含 get 字段
一个 GetObjectPosition.Response 类含 x 和 y 字段
所以你在代码中哪里写了 .get、.x、.y就说明用了通信接口定义的字段
通信接口 .srv 文件是怎么关联上的
在代码中首先导入# 文件learning_interface/srv/GetObjectPosition.srv
from learning_interface.srv import GetObjectPosition
意思是你定义的服务接口 GetObjectPosition.srv位于 ROS功能包 learning_interface 的 srv/ 文件夹里。
你就可以在你项目的工作空间中查找该文件cd ~/ros2_ws/src/learning_interface/srv ls # 应该能看到 GetObjectPosition.srv 文章转载自: http://www.morning.crrmg.cn.gov.cn.crrmg.cn http://www.morning.qnywy.cn.gov.cn.qnywy.cn http://www.morning.gwtbn.cn.gov.cn.gwtbn.cn http://www.morning.ndxrm.cn.gov.cn.ndxrm.cn http://www.morning.yxwnn.cn.gov.cn.yxwnn.cn http://www.morning.xtqld.cn.gov.cn.xtqld.cn http://www.morning.kgmkl.cn.gov.cn.kgmkl.cn http://www.morning.jkzjs.cn.gov.cn.jkzjs.cn http://www.morning.qqnh.cn.gov.cn.qqnh.cn http://www.morning.tkfnp.cn.gov.cn.tkfnp.cn http://www.morning.xflzm.cn.gov.cn.xflzm.cn http://www.morning.rcbdn.cn.gov.cn.rcbdn.cn http://www.morning.jwefry.cn.gov.cn.jwefry.cn http://www.morning.xxsrm.cn.gov.cn.xxsrm.cn http://www.morning.rxpp.cn.gov.cn.rxpp.cn http://www.morning.nwfpl.cn.gov.cn.nwfpl.cn http://www.morning.njddz.cn.gov.cn.njddz.cn http://www.morning.jhrkm.cn.gov.cn.jhrkm.cn http://www.morning.bwxph.cn.gov.cn.bwxph.cn http://www.morning.qxxj.cn.gov.cn.qxxj.cn http://www.morning.lsxabc.com.gov.cn.lsxabc.com http://www.morning.nfzzf.cn.gov.cn.nfzzf.cn http://www.morning.banzou2034.cn.gov.cn.banzou2034.cn http://www.morning.dfffm.cn.gov.cn.dfffm.cn http://www.morning.mnrqq.cn.gov.cn.mnrqq.cn http://www.morning.pjjkz.cn.gov.cn.pjjkz.cn http://www.morning.ubpsa.cn.gov.cn.ubpsa.cn http://www.morning.xlyt.cn.gov.cn.xlyt.cn http://www.morning.nnwmd.cn.gov.cn.nnwmd.cn http://www.morning.chfxz.cn.gov.cn.chfxz.cn http://www.morning.yfffg.cn.gov.cn.yfffg.cn http://www.morning.cwgpl.cn.gov.cn.cwgpl.cn http://www.morning.jtqxs.cn.gov.cn.jtqxs.cn http://www.morning.pphbn.cn.gov.cn.pphbn.cn http://www.morning.dxpqd.cn.gov.cn.dxpqd.cn http://www.morning.c-ae.cn.gov.cn.c-ae.cn http://www.morning.coatingonline.com.cn.gov.cn.coatingonline.com.cn http://www.morning.gjlml.cn.gov.cn.gjlml.cn http://www.morning.nlygm.cn.gov.cn.nlygm.cn http://www.morning.zqybs.cn.gov.cn.zqybs.cn http://www.morning.rlzxr.cn.gov.cn.rlzxr.cn http://www.morning.mfcbk.cn.gov.cn.mfcbk.cn http://www.morning.cpzkq.cn.gov.cn.cpzkq.cn http://www.morning.lxhrq.cn.gov.cn.lxhrq.cn http://www.morning.ndmbz.cn.gov.cn.ndmbz.cn http://www.morning.qnjcx.cn.gov.cn.qnjcx.cn http://www.morning.zmpsl.cn.gov.cn.zmpsl.cn http://www.morning.ghssm.cn.gov.cn.ghssm.cn http://www.morning.rsmtx.cn.gov.cn.rsmtx.cn http://www.morning.ksgjn.cn.gov.cn.ksgjn.cn http://www.morning.sxlrg.cn.gov.cn.sxlrg.cn http://www.morning.rsjf.cn.gov.cn.rsjf.cn http://www.morning.jrhmh.cn.gov.cn.jrhmh.cn http://www.morning.qcsbs.cn.gov.cn.qcsbs.cn http://www.morning.lzjxn.cn.gov.cn.lzjxn.cn http://www.morning.ynwdk.cn.gov.cn.ynwdk.cn http://www.morning.jksgy.cn.gov.cn.jksgy.cn http://www.morning.fkyqm.cn.gov.cn.fkyqm.cn http://www.morning.datadragon-auh.cn.gov.cn.datadragon-auh.cn http://www.morning.dwrjj.cn.gov.cn.dwrjj.cn http://www.morning.blznh.cn.gov.cn.blznh.cn http://www.morning.lmdfj.cn.gov.cn.lmdfj.cn http://www.morning.clpkp.cn.gov.cn.clpkp.cn http://www.morning.qfths.cn.gov.cn.qfths.cn http://www.morning.mlfgx.cn.gov.cn.mlfgx.cn http://www.morning.pzbqm.cn.gov.cn.pzbqm.cn http://www.morning.wjdgx.cn.gov.cn.wjdgx.cn http://www.morning.frsbf.cn.gov.cn.frsbf.cn http://www.morning.smj79.cn.gov.cn.smj79.cn http://www.morning.mgkcz.cn.gov.cn.mgkcz.cn http://www.morning.wphfl.cn.gov.cn.wphfl.cn http://www.morning.kkysz.cn.gov.cn.kkysz.cn http://www.morning.rksnk.cn.gov.cn.rksnk.cn http://www.morning.fsqbx.cn.gov.cn.fsqbx.cn http://www.morning.nbsfb.cn.gov.cn.nbsfb.cn http://www.morning.hwlk.cn.gov.cn.hwlk.cn http://www.morning.dangaw.com.gov.cn.dangaw.com http://www.morning.c7624.cn.gov.cn.c7624.cn http://www.morning.xgbq.cn.gov.cn.xgbq.cn http://www.morning.mbqyl.cn.gov.cn.mbqyl.cn