0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何在ROS2中开发一种计算机视觉模块呢?

新机器视觉 来源:新机器视觉 2023-09-21 09:44 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

一、视觉模块架构设计

考虑的几个方面:

传感器主要使用话题(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_msgs
rosidl_default_generators
rosidl_default_runtime
rosidl_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 rclpy
from rclpy.node import Node
from cv_bridge import CvBridge
from sensor_msgs.msg import Image


import cv2




class 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 rclpy
from rclpy.node import Node
from sensor_msgs.msg import Image
from interfaces_pkg.msg import DetectionResults
from cv_bridge import CvBridge


import cv2
import numpy as np




class 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 = 0


def 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 rclpy
from rclpy.node import Node
from interfaces_pkg.msg import DetectionResults




class 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







审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 传感器
    +关注

    关注

    2574

    文章

    54435

    浏览量

    786338
  • 计算机视觉
    +关注

    关注

    9

    文章

    1714

    浏览量

    47462
  • C++语言
    +关注

    关注

    0

    文章

    147

    浏览量

    7586
  • SRC
    SRC
    +关注

    关注

    0

    文章

    63

    浏览量

    18659
  • ROS
    ROS
    +关注

    关注

    1

    文章

    291

    浏览量

    18490

原文标题:在ROS2中开发计算机视觉模块

文章出处:【微信号:vision263com,微信公众号:新机器视觉】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    系统镜像Ubuntu_ROS2ROS2是什么意思,带有ROS2开发环境吗?

    请问下,百度文库资料里面,下图所示的系统镜像Ubuntu_ROS2ROS2是什么意思,带有ROS2
    发表于 03-01 23:06

    【「# ROS 2智能机器人开发实践」阅读体验】+ROS2应用案例

    地图构建,包括算法原理介绍、安装与配置方法、仿真环境的SLAM以及真实机器人上的SLAM。 这过程不仅涉及到计算机视觉和机器人学的知识,还需要对
    发表于 04-27 11:42

    【「# ROS 2智能机器人开发实践」阅读体验】视觉实现的基础算法的应用

    必须严谨,并定期重新校准。 OpenCV与ROS2的无缝结合 OpenCV是计算机视觉的核心工具,书中介绍了如何在ROS2
    发表于 05-03 19:41

    机器视觉计算机视觉的关系简述

    应用提高产品质量、生产效率以及操作安全性。计算机视觉主要有两工作模式,一种是参照仿生学的方法,以人类视觉系统的结构为主要工作原理,建立相应
    发表于 05-13 14:57

    何在ROS2运行小乌龟

    ros-dashing-turtlesim】注意:上条指令红色标识的dashing是我安装的ROS2的dashing版本,个人需要根据自己安装的版本去修改。输入【
    发表于 11-05 06:08

    深度学习与传统计算机视觉简介

    单板计算机(指所有的逻辑线路、定时线路、内部存储器和外部界面都包含在块单独的印制板上的一种算机)上提供嵌入式视觉的各种选项。近年来,随着
    发表于 12-23 06:17

    何在RK3288上去安装Opencv开源计算机视觉

    Opencv是什么?如何在RK3288上去安装Opencv开源计算机视觉
    发表于 02-16 07:06

    【昉·星光 2 高性能RISC-V单板计算机体验】四:在 VisionFive2 上安装 ROS2 humble

    在 VisionFive2 上安装 ROS2 humble ROS(Robot Operating System)是一种用于编写机器人软件的灵活框架。它是
    发表于 09-04 03:33

    【昉·星光 2 高性能RISC-V单板计算机体验】五:在 VisionFive2 上体验 ROS2 humble

    在 VisionFive2 上体验 ROS2 humble 、系统准备 参考 在 VisionFive2 上安装 ROS2 humble
    发表于 09-04 04:59

    Linux嵌入式开发笔记(六)在ROS2运行小乌龟实例

    ros-dashing-turtlesim】注意:上条指令红色标识的dashing是我安装的ROS2的dashing版本,个人需要根据自己安装的版本去修改。输入【
    发表于 11-02 15:21 10次下载
    Linux嵌入式<b class='flag-5'>开发</b>笔记(六)在<b class='flag-5'>ROS2</b><b class='flag-5'>中</b>运行小乌龟实例

    计算机视觉识别是如何工作的?

    计算机视觉识别是一种人工智能技术,旨在使计算机系统从数字图像、视频等视觉信息识别和提取有意义信
    的头像 发表于 02-09 13:41 5692次阅读

    DDS在ROS2的应用

    DDS在ROS2的应用 DDS在ROS2系统的位置至关重要,所有上层建设都建立在DDS之上。在这个ROS2的架构图中,蓝色和红色部分就是
    的头像 发表于 11-24 17:54 1943次阅读
    DDS在<b class='flag-5'>ROS2</b><b class='flag-5'>中</b>的应用

    ROS2自带例程测试

    如果你是ROS2开发者,可能对刚才我们使用的ROS2命令比较熟悉,这时你可能也会产生个问题:我们之前也安装了
    的头像 发表于 11-28 16:29 1906次阅读
    <b class='flag-5'>ROS2</b><b class='flag-5'>中</b>自带例程测试

    在TogetherROS如何安装ROS2功能包

    安装ROS2功能包 接下来,还有个很重要的配置,那就是安装ROS2功能包,我们说TogetherROS是基于ROS2深度优化的,很多模块
    的头像 发表于 12-01 16:02 2426次阅读
    在TogetherROS<b class='flag-5'>中</b>如何安装<b class='flag-5'>ROS2</b>功能包

    ros2教程

    电子发烧友网站提供《ros2教程.pdf》资料免费下载
    发表于 05-23 09:12 1次下载