ROS2中计算机视觉模块开发指南

时间:2025-09-17  作者:Diven  阅读:0

一、视觉模块架构设计

ROS2中计算机视觉模块开发指南

考虑的几个方面:

传感器主要使用话题(topIC)通信机制持续向外部发布图像信息;

图像接受与处理、以及发送处理结果节点有两种形式,是使用服务(servICe)通信机制,是使用话题机制,两者均可。本人在网上搜集了一些信息,并且参考了chatgpt的意见,得到了一个不错的结果:话题速度更快,并且实现更简单,开发中一般默认使用话题,如果随着开发的进行,话题不再满足我们的需求,可以转至service机制。由于工业机械臂中的传感器(camera)和AI模型(一般一个机械臂只会用到一个)并不复杂,所以我选择topic通信机制开发图像数据的接受处理、结果发送模块。

使用订阅者来接受CV model的处理结果。

[sensor publisher (camera_pub.py)] --> [subscriber and publisher node (cam_sub_and_detection_pub.py)] --> [subscriber (detection_results_sub.py)]

二、代码编写

一、新建工作空间

1. 创建src文件夹以存放源码;

2. 在src目录下新建cv_devel_pkg与interfaces_pkg,分别存放视觉开发模块的源码与topic数据接口(interface)文件;

818fbfd2-57ba-11ee-939d-92fbcf53809c.png

2.1 interfaces_pkg编写

需要注意的是,在新建interface pkg时,build type暂时只能选择c++(信息来源:ros官方文档),并且我们需要修改cmakelists.txt与package.xml:

cmakelists.txt:

新增:

# find_package( REQUIRED)find_package(geometry_msgs REQUIRED)find_package(rosidl_default_generators REQUIRED)rosidl_generate_interfaces(${PROJECT_NAME}"msg/DetectionResults.msg"s DEPENDENCIES geometry_msgs)

package.xml:

新增:

 geometry_msgsrosidl_default_generatorsrosidl_default_runtimerosidl_interface_packages 

其中,DetectionResults.msg中存放的信息是结果中心坐标的msg:

int32 position_x

int32 position_y

至此,interface pkg代码编写结束。

2.2 cv_devel_pkg编写

819e9b88-57ba-11ee-939d-92fbcf53809c.png

(1) camera_pub.py

import rclpyfrom rclpy.node import Nodefrom cv_bridge import CvBridgefrom sensor_msgs.msg import Imageimport cv2class CameraPubNode(Node):def __init__(self, name):super().__init__(name)self.pub = self.create_publisher(Image, 'image_raw', 10)self.timer = self.create_timer(0.5, self.timer_callback)self.cap = cv2.VideoCapture(0)self.cv_bridge = CvBridge()def timer_callback(self): ret = self.cap.grab()if ret: flag, frame = self.cap.retrieve()if flag:self.pub.publish(self.cv_bridge.cv2_to_imgmsg(frame, 'bgr8'))self.get_logger().info('Publish image successfully!')else:self.get_logger().info('Did not get image info!')def main(args=None): rclpy.init(args=args) node = CameraPubNode('CameraPubNode') rclpy.spin(node) node.destroy_node() rclpy.shutdown()

编写完成后,在pkg目录下的setup.py中注册节点,并分别执行colcon build、source install/local_setup.sh、ros2 run cv_devel_pkg camera_pub。

如图,正常运行:

81a7a3e0-57ba-11ee-939d-92fbcf53809c.png

(2) cam_sub_and_detection_pub.py

import rclpyfrom rclpy.node import Nodefrom sensor_msgs.msg import Imagefrom interfaces_pkg.msg import DetectionResultsfrom cv_bridge import CvBridgeimport cv2import numpy as npclass CamSubAndDetectionPubNode(Node):def __init__(self, name): super().__init__(name) self.sub = self.create_subscription(Image, 'image_raw', self.listen_callback, 10) self.pub = self.create_publisher(DetectionResults, 'detection_results', 10) self.cv_bridge = CvBridge() self.position_x = 0 self.position_y = 0def listen_callback(self, data): self.get_logger().info('Get image! I will process it!') image = self.cv_bridge.imgmsg_to_cv2(data, 'bgr8') self.detect(image) position = DetectionResults() position.position_x = self.position_x position.position_y = self.position_y self.get_logger().info('Position is: ({}, {})'.format(self.position_x, self.position_y)) self.pub.publish(position)def detect(self, image):pass#这里可以嵌入自己的机器视觉或者AI视觉代码def main(args=None): rclpy.init(args=args) node = CamSubAndDetectionPubNode('CamSubAndDetectionPubNode') rclpy.spin(node) node.destroy_node() rclpy.shutdown()

(3)detection_results_sub.py

import rclpyfrom rclpy.node import Nodefrom interfaces_pkg.msg import DetectionResultsclass DetectionResultsSubNode(Node):def __init__(self, name):super().__init__(name)self.sub = self.create_subscription(DetectionResults, 'detection_results', self.listen_callback, 10)def listen_callback(self, data):self.get_logger().info('I get the position: ({},{})'.format(data.position_x, data.position_y))def main(args=None): rclpy.init(args=args) node = DetectionResultsSubNode('detection_results_sub_node') rclpy.spin(node) node.destroy_node() rclpy.shutdown()

三、完工

cv_devel_pkg中的节点代码全部编写完成后,在setup.py中注册,然后build & run。

检测结果展示:

81b74674-57ba-11ee-939d-92fbcf53809c.png

三个节点可正常运行:

81e25724-57ba-11ee-939d-92fbcf53809c.png


审核编辑:刘清

猜您喜欢

电子元件设计和开发中,贴片电阻是重要的基础元件。电子产品的不断更新换代,市场上出现了越来越多种类和规格的贴片电阻。准确查询和选择合适的贴片电阻阻值变得尤为重要。...
2025-04-15 03:00:38

同心度仪是高精度的测量工具,应用于机械制造、工程检测和设备维护等领域。主要用于检测轴承、齿轮和其旋转部件的同心度,以确保设备的正常运行和延长使用寿命。该仪器采用...
2011-12-23 00:00:00

现代电子设备中,封装技术的选择对整体性能、功耗以及空间利用率很重要。TSOT23-6作为小型表面贴装封装,因其独特的优势而受到广泛关注。本文将深入探讨TSOT2...
2025-02-21 10:42:02

镜子主要优势有哪些?镜子作为日常生活中不可少的物品,其主要优势体现在多个方面。镜子能够有效反射光线,帮助提升室内的亮度,使空间显得更加开阔和明亮。无论是家居装饰...
2011-01-05 00:00:00

0. 概述本文讨论四种常用FPGA/CPLD设计思想与技巧:乒乓操作串并转换流水线操作数据接口同步化都是FPGA/CPLD逻辑设计的内在规律的体现,...
2023-05-13 10:27:00

电解电容是电子设备中重要的元件。若电解电容坏了,设备可能出现各种问题。本文将介绍电解电容坏了的现象。设备无法启动当电解电容损坏,设备可能无法启动。这是因为电源无...
2025-03-27 17:31:40

现代电子设备的设计中,组件的选择至关重要。SON6_1.45X1MM是一种广泛应用于各种电子产品中的封装类型,以其独特的优势和性能而受到工程师和设计师的青睐。本...
2025-02-24 16:29:29

现代电子设备中,封装技术的发展对产品的性能和尺寸起着至关重要的作用。QFN(QuadFlatNo-lead)封装因其小型化、高性能和散热效率而受到广泛关注。本文...
2025-02-24 13:45:15

2R2是一种用于表示贴片电阻阻值的简写形式,实际上代表的是2.2欧姆。这种表示方法在电子领域非常常见,尤其是在电路图和元器件清单中。字母R在这里代表小数点,将数...
2024-11-29 10:26:25

随着科技的进步,碳化硅(SiC)材料在半导体行业中的应用越来越。碳化硅二极管作为高效能的电子元件,因其优异的性能和耐高温特性,受到越来越多企业的青睐。碳化硅二极...
2025-04-04 22:30:35