一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何在ROS2中開發(fā)一種計(jì)算機(jī)視覺模塊呢?

新機(jī)器視覺 ? 來源:新機(jī)器視覺 ? 2023-09-21 09:44 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

一、視覺模塊架構(gòu)設(shè)計(jì)

考慮的幾個(gè)方面:

傳感器主要使用話題(topic)通信機(jī)制持續(xù)向外部發(fā)布圖像信息;

圖像接受與處理、以及發(fā)送處理結(jié)果節(jié)點(diǎn)有兩種形式,一種是使用服務(wù)(service)通信機(jī)制,一種是使用話題機(jī)制,兩者均可。本人在網(wǎng)上搜集了一些信息,并且參考了chatgpt的意見,得到了一個(gè)不錯(cuò)的結(jié)果:話題速度更快,并且實(shí)現(xiàn)更簡(jiǎn)單,開發(fā)中一般默認(rèn)使用話題,如果隨著開發(fā)的進(jìn)行,話題不再滿足我們的需求,可以轉(zhuǎn)至service機(jī)制。由于工業(yè)機(jī)械臂中的傳感器(camera)和AI模型(一般一個(gè)機(jī)械臂只會(huì)用到一個(gè))并不復(fù)雜,所以我選擇topic通信機(jī)制開發(fā)圖像數(shù)據(jù)的接受處理、結(jié)果發(fā)送模塊。

使用訂閱者來接受CV model的處理結(jié)果。

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

二、代碼編寫

一、新建工作空間

1. 創(chuàng)建src文件夾以存放源碼;

2. 在src目錄下新建cv_devel_pkg與interfaces_pkg,分別存放視覺開發(fā)模塊的源碼與topic數(shù)據(jù)接口(interface)文件;

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

2.1 interfaces_pkg編寫

需要注意的是,在新建interface pkg時(shí),build type暫時(shí)只能選擇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中存放的信息是結(jié)果中心坐標(biāo)的msg:

int32 position_x

int32 position_y

至此,interface pkg代碼編寫結(jié)束。

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中注冊(cè)節(jié)點(diǎn),并分別執(zhí)行colcon build、source install/local_setup.sh、ros2 run cv_devel_pkg camera_pub。

如圖,正常運(yùn)行:

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#這里可以嵌入自己的機(jī)器視覺或者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中的節(jié)點(diǎn)代碼全部編寫完成后,在setup.py中注冊(cè),然后build & run。

檢測(cè)結(jié)果展示:

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

三個(gè)節(jié)點(diǎn)可正常運(yùn)行:

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







審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 傳感器
    +關(guān)注

    關(guān)注

    2566

    文章

    53008

    瀏覽量

    767635
  • 計(jì)算機(jī)視覺
    +關(guān)注

    關(guān)注

    9

    文章

    1709

    瀏覽量

    46784
  • C++語言
    +關(guān)注

    關(guān)注

    0

    文章

    147

    瀏覽量

    7303
  • SRC
    SRC
    +關(guān)注

    關(guān)注

    0

    文章

    62

    瀏覽量

    18405
  • ROS
    ROS
    +關(guān)注

    關(guān)注

    1

    文章

    288

    瀏覽量

    17757

原文標(biāo)題:在ROS2中開發(fā)計(jì)算機(jī)視覺模塊

文章出處:【微信號(hào):vision263com,微信公眾號(hào):新機(jī)器視覺】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    系統(tǒng)鏡像Ubuntu_ROS2ROS2是什么意思,帶有ROS2開發(fā)環(huán)境嗎?

    請(qǐng)問下,百度文庫資料里面,下圖所示的系統(tǒng)鏡像Ubuntu_ROS2ROS2是什么意思,帶有ROS2
    發(fā)表于 03-01 23:06

    【「# ROS 2智能機(jī)器人開發(fā)實(shí)踐」閱讀體驗(yàn)】+ROS2應(yīng)用案例

    地圖構(gòu)建,包括算法原理介紹、安裝與配置方法、仿真環(huán)境的SLAM以及真實(shí)機(jī)器人上的SLAM。 這過程不僅涉及到計(jì)算機(jī)視覺和機(jī)器人學(xué)的知識(shí),還需要對(duì)
    發(fā)表于 04-27 11:42

    【「# ROS 2智能機(jī)器人開發(fā)實(shí)踐」閱讀體驗(yàn)】視覺實(shí)現(xiàn)的基礎(chǔ)算法的應(yīng)用

    必須嚴(yán)謹(jǐn),并定期重新校準(zhǔn)。 OpenCV與ROS2的無縫結(jié)合 OpenCV是計(jì)算機(jī)視覺的核心工具,書中介紹了如何在ROS2
    發(fā)表于 05-03 19:41

    機(jī)器視覺計(jì)算機(jī)視覺的關(guān)系簡(jiǎn)述

    應(yīng)用提高產(chǎn)品質(zhì)量、生產(chǎn)效率以及操作安全性。計(jì)算機(jī)視覺主要有兩工作模式,一種是參照仿生學(xué)的方法,以人類視覺系統(tǒng)的結(jié)構(gòu)為主要工作原理,建立相應(yīng)
    發(fā)表于 05-13 14:57

    何在ROS2運(yùn)行小烏龜

    ros-dashing-turtlesim】注意:上條指令紅色標(biāo)識(shí)的dashing是我安裝的ROS2的dashing版本,個(gè)人需要根據(jù)自己安裝的版本去修改。輸入【
    發(fā)表于 11-05 06:08

    深度學(xué)習(xí)與傳統(tǒng)計(jì)算機(jī)視覺簡(jiǎn)介

    單板計(jì)算機(jī)(指所有的邏輯線路、定時(shí)線路、內(nèi)部存儲(chǔ)器和外部界面都包含在塊單獨(dú)的印制板上的一種算機(jī))上提供嵌入式視覺的各種選項(xiàng)。近年來,隨著
    發(fā)表于 12-23 06:17

    何在RK3288上去安裝Opencv開源計(jì)算機(jī)視覺

    Opencv是什么?如何在RK3288上去安裝Opencv開源計(jì)算機(jī)視覺?
    發(fā)表于 02-16 07:06

    【昉·星光 2 高性能RISC-V單板計(jì)算機(jī)體驗(yàn)】四:在 VisionFive2 上安裝 ROS2 humble

    在 VisionFive2 上安裝 ROS2 humble ROS(Robot Operating System)是一種用于編寫機(jī)器人軟件的靈活框架。它是
    發(fā)表于 09-04 03:33

    【昉·星光 2 高性能RISC-V單板計(jì)算機(jī)體驗(yàn)】五:在 VisionFive2 上體驗(yàn) ROS2 humble

    在 VisionFive2 上體驗(yàn) ROS2 humble 、系統(tǒng)準(zhǔn)備 參考 在 VisionFive2 上安裝 ROS2 humble
    發(fā)表于 09-04 04:59

    Linux嵌入式開發(fā)筆記(六)在ROS2運(yùn)行小烏龜實(shí)例

    ros-dashing-turtlesim】注意:上條指令紅色標(biāo)識(shí)的dashing是我安裝的ROS2的dashing版本,個(gè)人需要根據(jù)自己安裝的版本去修改。輸入【
    發(fā)表于 11-02 15:21 ?10次下載
    Linux嵌入式<b class='flag-5'>開發(fā)</b>筆記(六)在<b class='flag-5'>ROS2</b><b class='flag-5'>中</b>運(yùn)行小烏龜實(shí)例

    計(jì)算機(jī)視覺識(shí)別是如何工作的?

    計(jì)算機(jī)視覺識(shí)別是一種人工智能技術(shù),旨在使計(jì)算機(jī)系統(tǒng)從數(shù)字圖像、視頻等視覺信息識(shí)別和提取有意義信
    的頭像 發(fā)表于 02-09 13:41 ?5038次閱讀

    DDS在ROS2的應(yīng)用

    DDS在ROS2的應(yīng)用 DDS在ROS2系統(tǒng)的位置至關(guān)重要,所有上層建設(shè)都建立在DDS之上。在這個(gè)ROS2的架構(gòu)圖中,藍(lán)色和紅色部分就是
    的頭像 發(fā)表于 11-24 17:54 ?1479次閱讀
    DDS在<b class='flag-5'>ROS2</b><b class='flag-5'>中</b>的應(yīng)用

    ROS2自帶例程測(cè)試

    如果你是個(gè)ROS2開發(fā)者,可能對(duì)剛才我們使用的ROS2命令比較熟悉,這時(shí)你可能也會(huì)產(chǎn)生個(gè)問題:我們之前也安裝了
    的頭像 發(fā)表于 11-28 16:29 ?1405次閱讀
    <b class='flag-5'>ROS2</b><b class='flag-5'>中</b>自帶例程測(cè)試

    在TogetherROS如何安裝ROS2功能包

    安裝ROS2功能包 接下來,還有個(gè)很重要的配置,那就是安裝ROS2功能包,我們說TogetherROS是基于ROS2深度優(yōu)化的,很多模塊
    的頭像 發(fā)表于 12-01 16:02 ?1477次閱讀
    在TogetherROS<b class='flag-5'>中</b>如何安裝<b class='flag-5'>ROS2</b>功能包

    ros2教程

    電子發(fā)燒友網(wǎng)站提供《ros2教程.pdf》資料免費(fèi)下載
    發(fā)表于 05-23 09:12 ?1次下載