话题接口的定义与使用
话题通信接口的定义也是类似的,继续从之前的机器视觉案例中来衍生,我们想把服务换成话题,周期发布目标识别的位置,不管有没有人需要。
运行效果
现在我们会运行三个节点:
第一个节点,将驱动相机并发布图像话题,此时的话题数据使用的是ros中标准定义的image图像消息;
第二个节点,会运行视觉识别功能,识别目标的位置,这个位置我们希望封装成话题消息,发布出去,谁需要使用谁就来订阅;
第三个节点,订阅位置话题,打印到终端中。
启动三个终端,分别运行以上节点:
$ ros2 run usb_cam usb_cam_node_exe$ ros2 run learning_topic interface_object_pub$ ros2 run learning_topic interface_object_sub
接口定义
在这个例程中,我们使用objectposition.msg定义了服务通信的接口:
learning_interface/msg/objectposition.msg
int32 x # 表示目标的x坐标int32 y # 表示目标的y坐标话题消息的内容是一个位置,我们使用x、y坐标值进行描述。
完成定义后,还需要在功能包的cmakelists.txt中配置编译选项,让编译器在编译过程中,根据接口定义,自动生成不同语言的代码:
...find_package(rosidl_default_generators required)rosidl_generate_interfaces(${project_name} msg/objectposition.msg)...程序调用
我们在代码中再来重点看下接口的使用方法。
发布者接口调用
learning_topic/interface_object_pub.py
#!/usr/bin/env python3# -*- coding: utf-8 -*-@作者: 古月居@说明: ros2接口示例-发布目标位置import rclpy # ros2 python接口库from rclpy.node import node # ros2 节点类from sensor_msgs.msg import image # 图像消息类型from cv_bridge import cvbridge # ros与opencv图像转换类import cv2 # opencv图像处理库import numpy as np # python数值计算库from learning_interface.msg import objectposition # 自定义的目标位置消息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.pub = self.create_publisher( objectposition, object_position, 10) # 创建发布者对象(消息类型、话题名、队列长度) self.cv_bridge = cvbridge() # 创建一个图像转换对象,用于opencv图像与ros的图像消息的互相转换 self.objectx = 0 self.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(x+w/2), int(y+h/2)), 5, # 将苹果的图像中心点画出来 (0, 255, 0), -1) self.objectx = int(x+w/2) self.objecty = int(y+h/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图像 position = objectposition() self.object_detect(image) # 苹果检测 position.x, position.y = int(self.objectx), int(self.objecty) self.pub.publish(position) # 发布目标位置def main(args=none): # ros2节点主入口main函数 rclpy.init(args=args) # ros2 python接口初始化 node = imagesubscriber(topic_webcam_sub) # 创建ros2节点对象并进行初始化 rclpy.spin(node) # 循环等待ros2退出 node.destroy_node() # 销毁节点对象 rclpy.shutdown() # 关闭ros2 python接口订阅者接口调用
learning_topic/interface_object_sub.py
#!/usr/bin/env python3# -*- coding: utf-8 -*-@作者: 古月居@说明: ros2接口示例-订阅目标位置import rclpy # ros2 python接口库from rclpy.node import node # ros2 节点类from std_msgs.msg import string # 字符串消息类型from learning_interface.msg import objectposition # 自定义的目标位置消息创建一个订阅者节点class subscribernode(node): def __init__(self, name): super().__init__(name) # ros2节点父类初始化 self.sub = self.create_subscription( objectposition, /object_position, self.listener_callback, 10) # 创建订阅者对象(消息类型、话题名、订阅者回调函数、队列长度 def listener_callback(self, msg): # 创建回调函数,执行收到话题消息后对数据的处理 self.get_logger().info('target position: (%d, %d)' % (msg.x, msg.y))# 输出日志信息,提示订阅收到的话题消息def main(args=none): # ros2节点主入口main函数 rclpy.init(args=args) # ros2 python接口初始化 node = subscribernode(interface_position_sub) # 创建ros2节点对象并进行初始化 rclpy.spin(node) # 循环等待ros2退出 node.destroy_node() # 销毁节点对象 rclpy.shutdown() # 关闭ros2 python接口接口命令行操作
接口命令的常用操作如下:
$ ros2 interface list # 查看系统接口列表$ ros2 interface sh
T3M2-20W宽带自组网电台测试数据
浅谈层叠封装PoP锡膏移印工艺应用
半导体市场开始复苏了
电动汽车电池组管理系统原理分析
VxWorks移植方法在蓝牙无线耳机设计中的应用
话题通信接口的定义和运行效果
在未来智能医疗健康领域的发展拥有着巨大潜力
梅赛德斯-奔驰全球培训计划购入了100多台HoloLens设备
台电锋芒S700--评测简介
平行驾驶与平行交通:从智能出行到智慧城市
基于PLC和组态软件的带式输送机远程监控和程序上下载系统
预计2026年亚太地区智能燃气表市场规模将达37亿美元
浅析车用PCB现状及未来发展趋势
湿法蚀刻的GaAs表面研究报告
国内首个7兆瓦海上风电项目主体工程顺利完工 可满足113万个4口之家1个月的用电
什么是 一次锂亚电池(ER10150)?
工业互联网将成为未来最大趋势之一
如何用伏安法测小灯泡电阻?
无“标”变有“标”?自动驾驶标准法规走出重要一步
福禄克电能质量记录仪三步就可完成振动测试