一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲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)不再提示

話題通信接口的定義和運(yùn)行效果

麥辣雞腿堡 ? 來源:古月居 ? 作者:古月 ? 2023-12-01 15:32 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

話題接口的定義與使用

話題通信接口的定義也是類似的,繼續(xù)從之前的機(jī)器視覺案例中來衍生,我們想把服務(wù)換成話題,周期發(fā)布目標(biāo)識(shí)別的位置,不管有沒有人需要。

圖片

運(yùn)行效果

現(xiàn)在我們會(huì)運(yùn)行三個(gè)節(jié)點(diǎn):

第一個(gè)節(jié)點(diǎn),將驅(qū)動(dòng)相機(jī)并發(fā)布圖像話題,此時(shí)的話題數(shù)據(jù)使用的是ROS中標(biāo)準(zhǔn)定義的Image圖像消息;

第二個(gè)節(jié)點(diǎn),會(huì)運(yùn)行視覺識(shí)別功能,識(shí)別目標(biāo)的位置,這個(gè)位置我們希望封裝成話題消息,發(fā)布出去,誰需要使用誰就來訂閱;

第三個(gè)節(jié)點(diǎn),訂閱位置話題,打印到終端中。

啟動(dòng)三個(gè)終端,分別運(yùn)行以上節(jié)點(diǎn):

$ ros2 run usb_cam usb_cam_node_exe$ ros2 run learning_topic interface_object_pub$ ros2 run learning_topic interface_object_sub

圖片

接口定義

在這個(gè)例程中,我們使用ObjectPosition.msg定義了服務(wù)通信的接口:

learning_interface/msg/ObjectPosition.msg

int32 x      # 表示目標(biāo)的X坐標(biāo)int32 y      # 表示目標(biāo)的Y坐標(biāo)

話題消息的內(nèi)容是一個(gè)位置,我們使用x、y坐標(biāo)值進(jìn)行描述。

完成定義后,還需要在功能包的CMakeLists.txt中配置編譯選項(xiàng),讓編譯器在編譯過程中,根據(jù)接口定義,自動(dòng)生成不同語言的代碼:

...find_package(rosidl_default_generators REQUIRED)rosidl_generate_interfaces(${PROJECT_NAME}  "msg/ObjectPosition.msg")...

程序調(diào)用

我們?cè)诖a中再來重點(diǎn)看下接口的使用方法。

發(fā)布者接口調(diào)用

learning_topic/interface_object_pub.py

#!/usr/bin/env python3# -*- coding: utf-8 -*-"""@作者: 古月居@說明: ROS2接口示例-發(fā)布目標(biāo)位置"""import rclpy                                       # ROS2 Python接口庫from rclpy.node import Node                        # ROS2 節(jié)點(diǎn)類from sensor_msgs.msg import Image                  # 圖像消息類型from cv_bridge import CvBridge                     # ROS與OpenCV圖像轉(zhuǎn)換類import cv2                                         # Opencv圖像處理庫import numpy as np                                 # Python數(shù)值計(jì)算庫from learning_interface.msg import ObjectPosition  # 自定義的目標(biāo)位置消息lower_red = np.array([0, 90, 128])                 # 紅色的HSV閾值下限upper_red = np.array([180, 255, 255])              # 紅色的HSV閾值上限"""創(chuàng)建一個(gè)訂閱者節(jié)點(diǎn)"""class ImageSubscriber(Node):    def __init__(self, name):        super().__init__(name)                                  # ROS2節(jié)點(diǎn)父類初始化        self.sub = self.create_subscription(            Image, 'image_raw', self.listener_callback, 10)     # 創(chuàng)建訂閱者對(duì)象(消息類型、話題名、訂閱者回調(diào)函數(shù)、隊(duì)列長度)        self.pub = self.create_publisher(            ObjectPosition, "object_position", 10)              # 創(chuàng)建發(fā)布者對(duì)象(消息類型、話題名、隊(duì)列長度)        self.cv_bridge = CvBridge()                             # 創(chuàng)建一個(gè)圖像轉(zhuǎn)換對(duì)象,用于OpenCV圖像與ROS的圖像消息的互相轉(zhuǎn)換        self.objectX = 0        self.objectY = 0       def object_detect(self, image):              hsv_img = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)        # 圖像從BGR顏色模型轉(zhuǎn)換為HSV模型        mask_red = cv2.inRange(hsv_img, lower_red, upper_red)   # 圖像二值化        contours, hierarchy = cv2.findContours(            mask_red, cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE)     # 圖像中輪廓檢測(cè)        for cnt in contours:                                    # 去除一些輪廓面積太小的噪聲            if cnt.shape[0] < 150:                continue            (x, y, w, h) = cv2.boundingRect(cnt)                # 得到蘋果所在輪廓的左上角xy像素坐標(biāo)及輪廓范圍的寬和高            cv2.drawContours(image, [cnt], -1, (0, 255, 0), 2)  # 將蘋果的輪廓勾勒出來            cv2.circle(image, (int(x+w/2), int(y+h/2)), 5,      # 將蘋果的圖像中心點(diǎn)畫出來                       (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')         # 輸出日志信息,提示已進(jìn)入回調(diào)函數(shù)        image = self.cv_bridge.imgmsg_to_cv2(data, 'bgr8')      # 將ROS的圖像消息轉(zhuǎn)化成OpenCV圖像        position = ObjectPosition()        self.object_detect(image)                               # 蘋果檢測(cè)        position.x, position.y = int(self.objectX), int(self.objectY)        self.pub.publish(position)                              # 發(fā)布目標(biāo)位置def main(args=None):                                        # ROS2節(jié)點(diǎn)主入口main函數(shù)    rclpy.init(args=args)                                   # ROS2 Python接口初始化    node = ImageSubscriber("topic_webcam_sub")              # 創(chuàng)建ROS2節(jié)點(diǎn)對(duì)象并進(jìn)行初始化    rclpy.spin(node)                                        # 循環(huán)等待ROS2退出    node.destroy_node()                                     # 銷毀節(jié)點(diǎn)對(duì)象    rclpy.shutdown()                                        # 關(guān)閉ROS2 Python接口

訂閱者接口調(diào)用

learning_topic/interface_object_sub.py

#!/usr/bin/env python3# -*- coding: utf-8 -*-"""@作者: 古月居@說明: ROS2接口示例-訂閱目標(biāo)位置"""import rclpy                                       # ROS2 Python接口庫from rclpy.node   import Node                      # ROS2 節(jié)點(diǎn)類from std_msgs.msg import String                    # 字符串消息類型from learning_interface.msg import ObjectPosition  # 自定義的目標(biāo)位置消息"""創(chuàng)建一個(gè)訂閱者節(jié)點(diǎn)"""class SubscriberNode(Node):    def __init__(self, name):        super().__init__(name)                                                # ROS2節(jié)點(diǎn)父類初始化        self.sub = self.create_subscription(            ObjectPosition, "/object_position", self.listener_callback, 10)   # 創(chuàng)建訂閱者對(duì)象(消息類型、話題名、訂閱者回調(diào)函數(shù)、隊(duì)列長度    def listener_callback(self, msg):                                         # 創(chuàng)建回調(diào)函數(shù),執(zhí)行收到話題消息后對(duì)數(shù)據(jù)的處理        self.get_logger().info('Target Position: "(%d, %d)"' % (msg.x, msg.y))# 輸出日志信息,提示訂閱收到的話題消息def main(args=None):                                 # ROS2節(jié)點(diǎn)主入口main函數(shù)    rclpy.init(args=args)                            # ROS2 Python接口初始化    node = SubscriberNode("interface_position_sub")  # 創(chuàng)建ROS2節(jié)點(diǎn)對(duì)象并進(jìn)行初始化    rclpy.spin(node)                                 # 循環(huán)等待ROS2退出    node.destroy_node()                              # 銷毀節(jié)點(diǎn)對(duì)象    rclpy.shutdown()                                 # 關(guān)閉ROS2 Python接口

接口命令行操作

接口命令的常用操作如下:

$ ros2 interface list                    # 查看系統(tǒng)接口列表$ ros2 interface sh
聲明:本文內(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)注

    33

    文章

    9005

    瀏覽量

    153770
  • 相機(jī)
    +關(guān)注

    關(guān)注

    4

    文章

    1468

    瀏覽量

    54695
  • 通信接口
    +關(guān)注

    關(guān)注

    3

    文章

    251

    瀏覽量

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

    關(guān)注

    1

    文章

    288

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

    iphone接口定義

    本文提供詳細(xì)的iphone接口定義,有iphone接口定義英文版和iphone接口定義中文介紹說
    發(fā)表于 03-28 15:15 ?1.5w次閱讀

    USB接口定義

    USB接口定義 USB接口定義  更多盡在:USB產(chǎn)品網(wǎng)
    發(fā)表于 04-21 11:58 ?3.4w次閱讀

    MIDI接口定義和游戲桿接口定義

    MIDI 接口定義和游戲桿接口定義圖 MIDI 接口和 PC 游戲桿接口是共用的,外觀為 15
    發(fā)表于 11-27 20:13 ?4322次閱讀
    MIDI<b class='flag-5'>接口</b><b class='flag-5'>定義</b>和游戲桿<b class='flag-5'>接口</b><b class='flag-5'>定義</b>圖

    rs422接口定義 rs232接口定義 rs485接口定義

    rs422接口定義 rs232接口定義 rs485接口定義 Pin 信
    發(fā)表于 04-27 17:33 ?1.6w次閱讀

    手機(jī)usb接口定義

    手機(jī)8針的usb接口定義 手機(jī)12針的usb接口定義 K750c手機(jī)US
    發(fā)表于 06-10 11:19 ?1.5w次閱讀
    手機(jī)usb<b class='flag-5'>接口</b><b class='flag-5'>定義</b>

    MIDI接口定義,MIDI接口游戲桿接口引腳功能定義

    MIDI接口信號(hào)定義與游戲桿接口功能定義 MIDI接口和PC游戲桿接口是共用的,外觀見下圖:
    發(fā)表于 05-03 23:27 ?7074次閱讀
    MIDI<b class='flag-5'>接口</b><b class='flag-5'>定義</b>,MIDI<b class='flag-5'>接口</b>游戲桿<b class='flag-5'>接口</b>引腳功能<b class='flag-5'>定義</b>圖

    SCART接口功能定義

    SCART接口功能定義 附錄:SCART 接口功能定義A、傳輸復(fù)合視頻信號(hào)(Composite Video Only):
    發(fā)表于 08-21 22:40 ?7674次閱讀
    SCART<b class='flag-5'>接口</b>功能<b class='flag-5'>定義</b>

    USB接口與miniUSB接口定義

    USB接口與miniUSB接口定義 USB接口定義:
    發(fā)表于 12-21 10:54 ?2.6w次閱讀

    常用接口定義

    常用接口定義,常用接口定義,常用接口定義.
    發(fā)表于 04-29 17:57 ?20次下載

    SATA的接口定義及硬盤電源接口定義

    SATA接口的pin定義包括:信號(hào)電源和數(shù)據(jù)線接口定義
    發(fā)表于 06-16 18:21 ?23次下載

    接口定義 通信接口的作用

    通信接口 在ROS系統(tǒng)中,無論話題還是服務(wù),或者我們后續(xù)將要學(xué)習(xí)的動(dòng)作,都會(huì)用到一個(gè)重要的概念——通信接口。
    的頭像 發(fā)表于 12-01 14:59 ?1444次閱讀

    ROS通信接口機(jī)制介紹

    ROS通信接口 接口可以讓程序之間的依賴降低,便于我們使用別人的代碼,也方便別人使用我們的代碼,這就是ROS的核心目標(biāo),減少重復(fù)造輪子。 ROS有三種常用的通信機(jī)制,分別是
    的頭像 發(fā)表于 12-01 15:03 ?1315次閱讀
    ROS<b class='flag-5'>通信</b><b class='flag-5'>接口</b>機(jī)制介紹

    服務(wù)通信接口定義與使用

    了解了通信接口的概念,接下來我們?cè)購拇a實(shí)現(xiàn)的角度,研究下如何定義以及使用一個(gè)接口。 在之前服務(wù)概念講解的課程中,我們編寫了這樣一個(gè)例程,我們?cè)賮砘仡櫹隆?有三個(gè)節(jié)點(diǎn): 第一個(gè)驅(qū)動(dòng)相機(jī)
    的頭像 發(fā)表于 12-01 15:28 ?775次閱讀
    服務(wù)<b class='flag-5'>通信</b><b class='flag-5'>接口</b>的<b class='flag-5'>定義</b>與使用

    SIM卡座的接口定義

    SIM卡座連接器的接口定義是移動(dòng)通信設(shè)備中不可或缺的一部分,確保了SIM卡與設(shè)備之間的穩(wěn)定通信和數(shù)據(jù)傳輸。在本文中,連欣科技將詳細(xì)探討一下SIM卡座的
    的頭像 發(fā)表于 06-17 17:47 ?6694次閱讀
    SIM卡座的<b class='flag-5'>接口</b><b class='flag-5'>定義</b>

    DDR4接口引腳定義及功能

    DDR4(Double Data Rate 4)接口引腳的具體定義和功能是一個(gè)復(fù)雜且詳細(xì)的話題,涉及到電源、地、控制信號(hào)、時(shí)鐘信號(hào)、地址信號(hào)以及數(shù)據(jù)信號(hào)等多個(gè)方面。
    的頭像 發(fā)表于 09-04 12:39 ?1.7w次閱讀