一、视觉模块架构设计
考虑的几个方面:
传感器主要使用话题(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)文件;
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.msgs 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编写
(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。
如图,正常运行:
(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。
检测结果展示:
三个节点可正常运行:
推动人工智能产业创新发展 2019中国人工智能创新创业大赛圆满成功
RIO技术之快速设计自定义硬件
DCDC电源的电感底部是否应该铺铜
射频和微波器件新品评析
4G和5G以后谁会更加被关注
如何在ROS2中开发一种计算机视觉模块呢?
科大讯飞加速布局新能源汽车赛道?SEMI:芯片短缺恐延续至2024年
人造光源有哪些
存储数据需“开源”更需“节流”
云服务器的热潮:为什么它如此受欢迎?
stm8和stc单片机比较 单片机的输出信号是什么电平 stm8s单片机采用那种电平
阿贡实验室Chem发文再谈Zn2+配位环境
摩尔型状态机与米利型状态机的区别是什么
电热毯温控器电路及工作原理
希捷酷狼14T氦气硬盘评测 大容量NAS必备之作
电动式全焊接球阀介绍
固态继电器的动态功耗和设计考量
小米新机入网 疑似红米首款旗舰手机采用4800万像素主摄像头
北斗导航智慧监测技术及应用产业化项目和高精度数字智能传感器项目落户山东
区块链匿名支付服务系统磐石uPlexa介绍