ROS2 學習(三)話題

話題

節點之間的通信。

叫話題很形象。發布者發布一定數據類型的話題,訂閱者訂閱發布者。

  • 訂閱者發布者不唯一。

  • 異步通信,適用于周期發布的數據而不是邏輯性強的數據。

  • .msg 格式的消息結構,一種通信接口。

每個話題 topic 有話題名,數據類型和數據三個屬性。

Hello world

pub 按一定周期發布 helloworld 信息,sub 接收。

pub:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-"""
@作者: 古月居(www.guyuehome.com)
@說明: ROS2話題示例-發布“Hello World”話題
"""import rclpy                                     # ROS2 Python接口庫
from rclpy.node import Node                      # ROS2 節點類
from std_msgs.msg import String                  # 字符串消息類型"""
創建一個發布者節點
"""
class PublisherNode(Node):def __init__(self, name):super().__init__(name)                                    # ROS2節點父類初始化self.pub = self.create_publisher(String, "chatter", 10)   # 創建發布者對象(消息類型、話題名、隊列長度)self.timer = self.create_timer(0.5, self.timer_callback)  # 創建一個定時器(單位為秒的周期,定時執行的回調函數)def timer_callback(self):                                     # 創建定時器周期執行的回調函數msg = String()                                            # 創建一個String類型的消息對象msg.data = 'Hello World'                                  # 填充消息對象中的消息數據self.pub.publish(msg)                                     # 發布話題消息self.get_logger().info('Publishing: "%s"' % msg.data)     # 輸出日志信息,提示已經完成話題發布def main(args=None):                                 # ROS2節點主入口main函數rclpy.init(args=args)                            # ROS2 Python接口初始化node = PublisherNode("topic_helloworld_pub")     # 創建ROS2節點對象并進行初始化rclpy.spin(node)                                 # 循環等待ROS2退出node.destroy_node()                              # 銷毀節點對象rclpy.shutdown()                                 # 關閉ROS2 Python接口

sub:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-"""
@作者: 古月居(www.guyuehome.com)
@說明: ROS2話題示例-訂閱“Hello World”話題消息
"""import rclpy                                     # ROS2 Python接口庫
from rclpy.node   import Node                    # ROS2 節點類
from std_msgs.msg import String                  # ROS2標準定義的String消息"""
創建一個訂閱者節點
"""
class SubscriberNode(Node):def __init__(self, name):super().__init__(name)                                    # ROS2節點父類初始化self.sub = self.create_subscription(\String, "chatter", self.listener_callback, 10)        # 創建訂閱者對象(消息類型、話題名、訂閱者回調函數、隊列長度)def listener_callback(self, msg):                             # 創建回調函數,執行收到話題消息后對數據的處理self.get_logger().info('I heard: "%s"' % msg.data)        # 輸出日志信息,提示訂閱收到的話題消息def main(args=None):                                 # ROS2節點主入口main函數rclpy.init(args=args)                            # ROS2 Python接口初始化node = SubscriberNode("topic_helloworld_sub")    # 創建ROS2節點對象并進行初始化rclpy.spin(node)                                 # 循環等待ROS2退出node.destroy_node()                              # 銷毀節點對象rclpy.shutdown()                                 # 關閉ROS2 Python接口

物品識別

之前 webcam 最好是分開寫為兩個節點之間的通信,一個是攝像頭,一個是呈現的視頻。

主要是拿到識別的圖像數據之后不是第一時間就調用 opencv 算法處理,而是發給 sub,sub 進行處理。

這個發送的過程中的消息數據類型應當是 imgmsg 類型,所以需要一個 opencv -> imgmsg 類型的轉換方法。

#!/usr/bin/env python3
# -*- coding: utf-8 -*-"""
@作者: 古月居(www.guyuehome.com)
@說明: ROS2話題示例-發布圖像話題
"""import rclpy                        # ROS2 Python接口庫
from rclpy.node import Node         # ROS2 節點類
from sensor_msgs.msg import Image   # 圖像消息類型
from cv_bridge import CvBridge      # ROS與OpenCV圖像轉換類
import cv2                          # Opencv圖像處理庫"""
創建一個發布者節點
"""
class ImagePublisher(Node):def __init__(self, name):super().__init__(name)                                           # ROS2節點父類初始化self.publisher_ = self.create_publisher(Image, 'image_raw', 10)  # 創建發布者對象(消息類型、話題名、隊列長度)self.timer = self.create_timer(0.1, self.timer_callback)         # 創建一個定時器(單位為秒的周期,定時執行的回調函數)self.cap = cv2.VideoCapture(0)                                   # 創建一個視頻采集對象,驅動相機采集圖像(相機設備號)self.cv_bridge = CvBridge()                                      # 創建一個圖像轉換對象,用于稍后將OpenCV的圖像轉換成ROS的圖像消息def timer_callback(self):ret, frame = self.cap.read()                                     # 一幀一幀讀取圖像if ret == True:                                                  # 如果圖像讀取成功self.publisher_.publish(self.cv_bridge.cv2_to_imgmsg(frame, 'bgr8'))             # 發布圖像消息self.get_logger().info('Publishing video frame')                 # 輸出日志信息,提示已經完成圖像話題發布def main(args=None):                                 # ROS2節點主入口main函數rclpy.init(args=args)                            # ROS2 Python接口初始化node = ImagePublisher("topic_webcam_pub")        # 創建ROS2節點對象并進行初始化rclpy.spin(node)                                 # 循環等待ROS2退出node.destroy_node()                              # 銷毀節點對象rclpy.shutdown()                                 # 關閉ROS2 Python接口

sub 代碼:

class ImageSubscriber(Node):def __init__(self, name):super().__init__(name)                                  # ROS2節點父類初始化self.sub = self.create_subscription(Image, 'image_raw', self.listener_callback, 10)     # 創建訂閱者對象(消息類型、話題名、訂閱者回調函數、隊列長度)self.cv_bridge = CvBridge()                             # 創建一個圖像轉換對象,用于OpenCV圖像與ROS的圖像消息的互相轉換def object_detect(self, image):hsv_img = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)        # 圖像從BGR顏色模型轉換為HSV模型mask_red = cv2.inRange(hsv_img, lower_red, upper_red)   # 圖像二值化contours, hierarchy = cv2.findContours(mask_red, cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE)     # 圖像中輪廓檢測for cnt in contours:                                    # 去除一些輪廓面積太小的噪聲if cnt.shape[0] < 150:continue(x, y, w, h) = cv2.boundingRect(cnt)                # 得到蘋果所在輪廓的左上角xy像素坐標及輪廓范圍的寬和高cv2.drawContours(image, [cnt], -1, (0, 255, 0), 2)  # 將蘋果的輪廓勾勒出來cv2.circle(image, (int(x+w/2), int(y+h/2)), 5,(0, 255, 0), -1)                         # 將蘋果的圖像中心點畫出來cv2.imshow("object", image)                             # 使用OpenCV顯示處理后的圖像效果cv2.waitKey(10)def listener_callback(self, data):self.get_logger().info('Receiving video frame')         # 輸出日志信息,提示已進入回調函數image = self.cv_bridge.imgmsg_to_cv2(data, 'bgr8')      # 將ROS的圖像消息轉化成OpenCV圖像self.object_detect(image)                               # 蘋果檢測

流程是 opencv 圖像數據轉換成 ros2 可以傳輸的圖像數據,傳輸給 sub,sub 再轉回來再調用 opencv 庫。

其實常用 usb 相機驅動基本都是一致的,所以 pub 節點我們不需要自己手動寫。可以用下面的命令替代 pub,有一行 ERR 不影響。

$ sudo apt install ros-humble-usb-cam
$ ros2 run usb_cam usb_cam_node_exe 

ros2 topic bw 可以看帶寬數據量。

可以通過 /rqt_graph 查看節點關系圖。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/41460.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/41460.shtml
英文地址,請注明出處:http://en.pswp.cn/news/41460.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【Java高級開發高頻面試題】面試者角度的口述版

文章目錄 1.具備扎實的Java基礎集合HashMap底層工作原理HashMap版本問題HashMap并發修改異常HashMap影響HashMap性能的因素HashMap使用優化 SynchronizedThreadLocalAQS線程池JVM內存模型類加載機制與雙親委派垃圾回收算法、垃圾回收器、空間分配擔保策略引用計數器算法、可達性…

創建 Web 內容目錄

創建 Web 內容目錄 按照下方所述&#xff0c;創建一個名為 /home/curtis/ansible/webcontent.yml 的 playbook &#xff1a; 該 playbook 在 dev 主機組中的受管節點上運行 創建符合下列要求的目錄 /webdev &#xff1a; 所有者為 webdev 組 具有常規權限&#xff1a;ownerread…

Nginx反向代理

目錄 一.簡介1.反向代理 二.案例1.案例12.案例2 一.簡介 1.反向代理 1.1反向代理&#xff1a; 是指代理服務器來接收Internet上的客戶端請求&#xff0c;然后將請求轉發給內部網絡上的服務器&#xff0c;并將從服務器上得到的結果返回給客戶端。此時代理服務器對外就表現為一…

循環隊列的實現(c語言)

前言 循環隊列是隊列的一種特殊的結構&#xff0c;在生產者——消費者模型中常常使用它&#xff0c; 它在邏輯上是一個環形的連續的結構。在物理可以使用數組來實現。 目錄 1.循環隊列的邏輯結構 2.空的循環隊列和滿的循環隊列 3.循環隊列插入和刪除 4.代碼實現 …

淺談Redis的maxmemory設置以及淘汰策略

推薦閱讀 AI文本 OCR識別最佳實踐 AI Gamma一鍵生成PPT工具直達鏈接 玩轉cloud Studio 在線編碼神器 玩轉 GPU AI繪畫、AI講話、翻譯,GPU點亮AI想象空間 資源分享 「java、python面試題」來自UC網盤app分享&#xff0c;打開手機app&#xff0c;額外獲得1T空間 https://dr…

音視頻實時通話解決方案

1、問題提出 想要實現音視頻通話,對于大部分人可能會覺得很難,但是實際上,有些事情并沒有大家想的那樣困難,只要功夫深,鐵杵磨成針。 機緣巧合下,在業務中,我也遇到了一個業務場景需要實現音視頻通話,我們不可能自己從零開始干,我本次用到的核心是WebRTC。 2、WebRT…

治療偏頭痛等亞疼痛的遠程電神經調控(REN)設備

原文鏈接&#xff1a; NERIVIO CE標志適應癥擴展到青少年和成人偏頭痛的預防和急性治療 (prnewswire.com) 公司官網&#xff1a; Homepage - Theranica APP下載鏈接&#xff1a; Migraine Headache Treatment - Nerivio 使用過程問題&#xff1a; 常見問題 - 無藥物偏頭痛兩…

統計XML標注文件中各標注類別的標簽數量

目標檢測任務重&#xff0c;擔心數據集中各標簽類別不均衡&#xff0c;想統計XML標注文件中各標注類別的標簽數量&#xff0c;可以使用以下腳本&#xff1a; import os import glob import xml.etree.ElementTree as etdef count_labels(source_dir):file_list glob.glob(os.…

Flink狀態和狀態管理

1.什么是狀態 官方定義&#xff1a;當前計算流程需要依賴到之前計算的結果&#xff0c;那么之前計算的結果就是狀態。 這句話還是挺好理解的&#xff0c;狀態不只存在于Flink&#xff0c;也存在生活的方方面面&#xff0c;比如看到一個認識的人&#xff0c;如何識別認識呢&am…

神經網絡基礎-神經網絡補充概念-24-隨機初始化

由來 在神經網絡的訓練過程中&#xff0c;權重和偏差的初始值對模型的性能和訓練過程的收斂速度都有影響。隨機初始化是一種常用的權重和偏差初始值設置方法&#xff0c;它有助于打破對稱性&#xff0c;避免網絡陷入局部最優解。 概念 當所有權重和偏差都被設置為相同的初始…

Python Web框架:Django、Flask和FastAPI巔峰對決

今天&#xff0c;我們將深入探討Python Web框架的三巨頭&#xff1a;Django、Flask和FastAPI。無論你是Python小白還是老司機&#xff0c;本文都會為你解惑&#xff0c;帶你領略這三者的魅力。廢話不多說&#xff0c;讓我們開始這場終極對比&#xff01; Django&#xff1a;百…

web基礎入門和php語言基礎入門 二

web基礎入門和php語言基礎入門 二 MySQL入門-續MySQL之數據查詢操作MySQL其他知識點 php語言基礎入門認識PHPPHP的工作流程安裝PHP環境認識一個PHP程序PHP基礎知識點進入正題 PHP與WEB交互PHP與MySQL交互總結 MySQL入門-續 MySQL之數據查詢操作 WHERE 子句&#xff0c;條件限…

# 快速評估立功科技基于S32K324的TMS方案

文章目錄 1.前言2.立功科技的TMS方案介紹2.1 介紹資料2.2 簡要介紹 3.S32K3_TriMotor評估板測試3.1 環境搭建S32 Design Studio for S32 Platform 3.4安裝RTD 2.0.0安裝Freemaster 3.2 3.2 例程測試3.3 例程適配3.4 雙核燒錄3.5 測試 1.前言 最近和一些做汽車水泵/風機的客戶交…

算法概述-Java常用算法

算法概述-Java常用算法 1、算法概念2、算法相關概念3、算法的性能評價4、算法應用歸納 1、算法概念 廣泛算法定義&#xff1a;算法是模型分析的一組可行性的、確定的和有窮的規則。 經典算法特征&#xff1a;有窮性、確切性、輸入、輸出和可行性。 常用的算法包括遞推、遞歸、窮…

maven如何建立JavaWeb項目并連接數據庫,驗證登錄

這里是建立建立web項目&#xff1a;Maven如何創建Java web項目&#xff08;純干貨版&#xff09;&#xff01;&#xff01;&#xff01;_明天更新的博客-CSDN博客 我們主要演示如何連接數據庫驗證登錄。 1.在webapp目錄下創建我們的登錄頁面&#xff1a;index.jsp 還需要再…

Android漏洞之戰——整體加殼原理和脫殼技巧詳解

一、前言 為了幫助更加方便的進行漏洞挖掘工作&#xff0c;前面我們通過了幾篇文章詳解的給大家介紹了動態調試技術、過反調試技術、Hook技術、過反Hook技術、抓包技術等&#xff0c;掌握了這些可以很方便的開展App漏洞挖掘工作&#xff0c;而最后我們還需要掌握一定的脫殼技巧…

opencv基礎:幾個常用窗口方法

開始說了一些opencv中的一些常用方法。 namedWindow方法 在OpenCV中&#xff0c;namedWindow函數用于創建一個窗口&#xff0c;并給它指定一個名字。這個函數的基本語法如下&#xff1a; import cv2cv2.namedWindow(窗口名稱, 標識 )窗口名稱&#xff1a;其實窗口名稱&…

Azure創建自定義VM鏡像

創建一個虛擬機&#xff0c;參考 https://blog.csdn.net/m0_48468018/article/details/132267096&#xff0c;入站端口開啟80&#xff0c;22 進行遠程遠程連接 使用CLI命令部署NGINX,輸入如下命令 sudo su apt-get update -y apt-get install nginx git -y最后的效果 4. 關閉…

非結構化數據庫-MinIO基本集成

是什么 MinIO 是一個高性能的分布式對象存儲服務&#xff0c;適合存儲非結構化數據&#xff0c;如圖片&#xff0c;音頻&#xff0c;視頻&#xff0c;日志等。對象文件最大可以達到5TB。 安裝啟動 mkdir -p /usr/local/minio cd /usr/local/minio# 下載安裝包 wget https:/…

pandas.errors.ParserError: Error tokenizing data. C error: out of memory

目錄 用pandas讀入數據的時候發現數據讀入時出錯了&#xff0c;數據量感覺也不是很大 十萬多條數據。電腦內存是16個G。報錯信息為&#xff1a;“ pandas.errors.ParserError: Error tokenizing data. C error: out of memory” 想想不對啊 昨天都可以順利的讀入&#xff0c;現…