【ROS實戰】02-ROS架構介紹

1. 簡介

你是否曾有過這樣的疑問:我按照文檔安裝了ROS,依照要求寫了一些示例節點(node)、消息(msg)和話題(topic),但覺得過程既麻煩又繁瑣。也許你開始懷疑:為什么需要ROS?它到底幫我解決了什么問題?

本文將通過一個簡單的例子,介紹ROS的架構,闡明它解決了哪些問題,以及它如何幫助我們簡化開發流程。

2. 移動案例

假設我們要編寫一個能夠控制機器人移動的程序。

  1. 隨著程序的增多,我們需要進行模塊化,方便分工合作和代碼復用;
  2. 還需要開放移動接口,使得其他模塊能夠調用移動控制功能;
  3. 對應,需要選型一個通信機制來傳遞移動指令;
  4. 移動指令的格式,返回消息的格式需要規范化管理;
  5. 指令可能需要同時傳給多個模塊,如果下游模塊沒有及時收到可能需要緩存;
  6. 此外,我們還需要確保各個模塊服務的持續運行,能夠有效管理;
  7. 模塊多了后,多對多的消息傳遞,日志,可能需要一種有效的監控和調試手段。

你會發現,一個簡單的移動控制功能,背后可能涉及了大量的框架設計、標準化工作和大量代碼量,如果全部手工實現,不同的人實現方案可能五花八門,也使得開發者很難專注于機器人的核心功能(如更好地移動、剎車、轉彎等)。

在這種情況下,ROS的出現就解決了這些問題。下面是ROS中的一些關鍵概念:

  • 節點(node):每個節點對應一個功能模塊,ROS會幫助你管理節點的生命周期,確保它們穩定運行并完成各自的任務,免去你手動管理進程或線程的麻煩。
  • 消息(message):消息定義了節點之間傳遞的數據結構,如運動指令、雷達數據、坐標數據等。ROS提供了許多常用的消息類型,你可以直接使用這些標準的消息類型,無需重復設計數據格式。如果你的團隊其他成員或外部開源項目遵循相同的消息標準,那么這些模塊可以無縫對接。
  • 話題(topic):話題是消息傳遞的方式之一。比如,假設你和其他模塊約定使用cmd_vel話題來傳遞運動指令。所有需要發送或接收運動指令的節點都可以訂閱或發布到cmd_vel話題。當遙控器節點發布指令時,移動控制節點只需訂閱cmd_vel話題,接收到指令后即可控制機器人移動。和消息隊列的概念很相似,這個機制有效的解決了分層解耦和模塊化的問題。

3. ROS框架

3.1 整體架構

根據上述案例,ROS的架構可以簡要概括為:編寫節點(node),節點程序中通過話題(topic)或服務(service)與其他節點進行通信,完成機器人相關的邏輯控制。整體架構圖如下,左側是ROS1,右側是ROS2,兩者的架構類似。

ROS的框架大致分為三層:

  • 應用層:即我們編寫的各個節點。
  • 中間層:ROS提供API以及內部通信機制,幫助開發者與ROS系統交互。
  • 操作系統層:ROS并不是獨立的操作系統,而是依賴于現有操作系統運行。ROS1僅支持Linux,ROS2支持更多操作系統。

圖中其他名詞解釋:

  • Master(主節點):負責管理系統中的節點,提供節點注冊、發現和信息轉發等服務。
  • Client Library(客戶端庫):提供開發者API,供節點編程、消息傳遞等操作。
  • TCPROS/UDPROS(TCP/UDP協議):ROS1中的通信協議,負責節點間數據傳輸。
  • Nodelet API(節點內API):允許多個節點在同一進程內運行,避免進程間通信的開銷。
  • Abstract DDS Layer(抽象DDS層):ROS2的核心通信機制,基于DDS標準提供分布式通信能力。
  • Intra-process API(進程內通信API):用于高效的內部通信,避免跨進程通信的開銷。
  • DDS(數據分發服務):ROS2的底層通信協議,負責實現節點間高效可靠的數據交換。

ROS1和2主要區別:

  • ROS1依賴Master節點來協調節點間的通信,而ROS2使用DDS協議實現去中心化的分布式通信。
  • ROS2引入了進程內通信(Intra-process API),減少了進程間通信的開銷,提高了效率。
  • ROS2的DDS通信層使得它更加靈活,可以支持不同的操作系統和硬件平臺。

3.2 通信機制

通信機制是ROS的核心,開發節點的主要目的是數據的流轉和處理。充分利用ROS的通信框架是標準化、簡化以及提升開發靈活性和健壯性的關鍵。

3.2.1 話題

話題通信是ROS中最常用的通信方式,類似于常見的消息隊列。

如下圖,假設有兩個節點,node2訂閱了/topic話題,它會監聽這個話題是否有新消息。當node1發布消息到/topic話題時,node2會立即觸發回調函數進行處理。

需要注意:

  1. 消息的格式由.msg文件定義,消息可以是簡單或嵌套的復合結構。
  2. 發布和訂閱節點是多對多的,多個節點可以同時發布到同一話題,也可以有多個節點同時訂閱一個話題的數據。

例如,在機器人移動的場景中,node1負責發送移動指令(例如通過遙控器接收指令),而node2負責根據指令控制機器人的硬件(如電機)。

這種基于話題的開發方式將功能分層解耦,靈活且可靠,ROS會確保每個節點穩定運行,消息可靠傳遞。

3.2.2 服務

雖然話題的發布/訂閱模型非常靈活,但在需要雙向同步傳輸的場景下,服務(Service)更加合適。服務采用客戶端/服務器模型,包含兩個數據類型:一個用于請求,另一個用于應答,類似于HTTP請求。

如下圖,node2作為服務方提供一個服務,調用地址為/service。當node1作為客戶端調用該服務時,會向/service發送請求數據,node2收到請求后進行處理,并將結果返回給node1,完成一次服務調用。

總結:

  • 話題適用于異步通信,解耦信息的生產者和消費者,常用于實時更新的數據交換。
  • 服務適用于同步通信,采用客戶端/服務器模式,常用于需要強邏輯處理的數據交換。

4. 開發文件結構

在ROS框架下,可以看到我們的主要任務是編寫節點代碼,并通過ROS命令啟動節點,形成完整的系統。ROS支持多種編程語言(C、Python、Java),但代碼必須遵循ROS的組織結構。

ROS文件結構:

  1. 工作空間(Workspace):頂級目錄(圖中的catkin workspace)為一個工作空間。
  2. 構建文件:二級目目錄中的builddevelinstall為構建過程生成的文件。
  3. 功能包(Package):在工作空間.src目錄下,是一系列的功能包,每個功能包可包含多個節點,具體取決于項目需求。

功能包是我們主要面向開發的內容,功能包內部目錄結構:

  • config:存放配置文件。
  • include:存放頭文件。
  • scripts:存放可直接運行的Python腳本。
  • src:存放C++源代碼。
  • launch:存放啟動文件。
  • msg:存放自定義消息類型。
  • srv:存放自定義服務類型。
  • CMakeLists.txt:編譯規則。
  • package.xml:功能包清單。

5. 小結

ROS為機器人開發提供了一個強大的框架,簡化了功能模塊化設計、數據交換和服務通信。通過標準化的消息、話題和服務,ROS幫助開發者高效構建分布式、可擴展的機器人系統,減少了低層次的通信和管理工作,使開發者能夠專注于機器人本身的核心功能。

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

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

相關文章

LeetCode算法題(Go語言實現)_07

題目 給你一個整數數組 nums,返回 數組 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘積 。 題目數據 保證 數組 nums之中任意元素的全部前綴元素和后綴的乘積都在 32 位 整數范圍內。 請 不要使用除法,且在 O(n) 時間復…

網絡華為HCIA+HCIP 網絡編程自動化

telnetlib介紹 telnetlib是Python標準庫中的模塊。它提供了實現Telnet功能的類telnetlib.Telnet。這里通過調用telnetlib.Telnet類里的不同方法實現不同功能。 配置云

查看GPU型號、大小;CPU型號、個數、核數、內存

GPU型號、大小 nvidia-smiCPU型號 cat /proc/cpuinfo | grep model name | uniqCPU個數 cat /proc/cpuinfo | grep "physical id" | uniq | wc -lCPU核數 cat /proc/cpuinfo | grep "cpu cores" | uniqCPU內存 cat /proc/meminfo | grep MemTotal參考…

Docker與K8S是什么該怎么選?

用了很久的容器化,最近突然看到一個問題問: docker和K8S究竟有什么區別,到底該怎么選?我認真思考了一會,發現一時間還真說不明白,于是就研究了一段時間發布今天的博文! Docker vs Kubernetes&a…

Android Handler 通過線程安全的 MessageQueue 和底層喚醒機制實現跨線程通信

目錄 一、MessageQueue 的線程安全實現 1. 消息隊列的同步鎖(synchronized) 2. 消息順序與延時處理 二、底層喚醒機制:從 Java 到 Linux 內核 1. 消息插入后的喚醒邏輯 2. Native 層實現(基于 Linux 的 eventfd 和 epoll&am…

關于 2>/dev/null 的作用以及機理

每個進程都有三個標準文件描述符:stdin(標準輸入)、stdout(標準輸出)和stderr(標準錯誤)。默認情況下,stderr會輸出到終端。使用2>可以將stderr重定向到其他地方,比如…

MySQL中的鎖機制:從全局鎖到行級鎖

目錄 1. 鎖的基本概念 2. 全局鎖 2.1 全局鎖的定義 2.2 全局鎖的類型 2.3 全局鎖的使用場景 2.4 全局鎖的實現方式 2.5 全局鎖的優缺點 2.6 全局鎖的優化 3. 表級鎖 3.1 表級鎖的類型 3.2 表級鎖的使用場景 3.3 表級鎖的優缺點 4. 意向鎖(Intention Lo…

編程語言選擇分析:C#、Rust、Go 與 TypeScript 編譯器優化

編程語言選擇分析:C#、Rust、Go 與 TypeScript 編譯器優化 在討論編程語言的選擇時,特別是針對微軟的 C# 和 Rust,以及谷歌的 Go 語言,以及微軟試圖通過 Go 來拯救 TypeScript 編譯器的問題,我們可以從多個角度來分析和…

基于WebRTC的嵌入式音視頻通話SDK:EasyRTC跨平臺兼容性技術架構實時通信的底層實現

EasyRTC的核心架構圍繞WebRTC技術構建,同時通過擴展信令服務、媒體服務器和NAT穿透機制,解決了WebRTC在實際部署中的痛點。其架構可以分為以下幾個核心模塊: 1)WebRTC基礎層 媒體捕獲與處理:通過getUserMediaAPI獲取…

【Rust】包和模塊管理,以及作用域等問題——Rust語言基礎15

文章目錄 1. 前言2. 包和 Crate3. 定義模塊以及模塊之間的關系4. 作用域問題4.1. 作用域問題初現4.2. 解決問題一4.3. 解決問題二4.4. super 關鍵字4.5. 將路徑引入作用域4.6. as 關鍵字4.7. pub use 重導出 5. 引入的問題5.1. 引入一個外部包5.2. 嵌套路徑來消除大量的 use 行…

微服務架構中的API網關:Spring Cloud與Kong/Traefik等方案對比

微服務架構中的API網關:Spring Cloud與Kong/Traefik等方案對比 一、API 網關的概念二、API 網關的主要功能2.1 統一入口與路由轉發2.2 安全與權限控制2.3 流量管理與容錯2.4 API 管理與聚合2.5 監控與日志2.5 協議轉換與適配2.6 控制平面與配置管理 三、API 網關選型…

NewStar CTF web wp

文章目錄 week1headach3會贏嗎智械危機謝謝皮蛋PangBai 過家家(1) week3include meblindsql1臭皮的計算機臭皮踩踩背這照片是你嗎 week4Pangbai過家家四blindsql2chocolateezcmsssezpollute隱藏的密碼 weeek5pangbai過家家(5)redissqlshell臭皮吹泡泡臭皮…

Linux驅動開發-①中斷②阻塞、非阻塞IO和異步通知

Linux驅動開發-①中斷②阻塞、非阻塞IO和異步通知 一,中斷1.中斷的流程2.上半部和下半部2.1上半部2.2下半部2.2.1 tasklet2.2.2 工作隊列 3.按鍵延時消抖中斷程序 二,阻塞和非阻塞IO和異步通知1.阻塞IO1.1 常見結構11.2 常見結構2 2.非阻塞IO2.1 驅動結構…

Docker和Dify學習筆記

文章目錄 1 docker學習1.1 基本命令使用1.1.1 docker ps查看當前正在運行的鏡像1.1.2 docker stop停止容器1.1.3 docker compose容器編排1.1.4 docker網絡[1] 進入到容器里面敲命令[2] docker network ls[3] brige網絡模式下容器訪問宿主機的方式 2 Dify的安裝和基礎使用2.1 下…

高并發庫存系統是否適合使用 ORM(Hibernate / MyBatis)

在設計高并發的庫存管理系統時,數據層的選擇至關重要。許多企業開發中習慣使用 ORM(如 Hibernate、MyBatis)來簡化數據庫訪問,但在高并發、高吞吐的場景下,ORM 的適用性往往成為爭議焦點。本文將探討高并發庫存系統是否…

Web爬蟲利器FireCrawl:全方位助力AI訓練與高效數據抓取。本地部署方式

開源地址:https://github.com/mendableai/firecrawl 01、FireCrawl 項目簡介 Firecrawl 是一款開源、優秀、尖端的 AI 爬蟲工具,專門從事 Web 數據提取,并將其轉換為 Markdown 格式或者其他結構化數據。 Firecrawl 還特別上線了一個新的功…

探秘Transformer系列之(16)--- 資源占用

探秘Transformer系列之(16)— 資源占用 文章目錄 探秘Transformer系列之(16)--- 資源占用0x00 概述0x01 背景知識1.1 數據類型1.2 進制&換算數字進制存儲度量換算 1.3 參數顯存占用有參數的層無參數的層所需資源 1.4 計算量 0…

jaeger安裝和簡單使用

文章目錄 jaeger安裝和使用什么是jaegerjaeger安裝 jaeger安裝和使用 什么是jaeger 官網:https://www.jaegertracing.io/ Jaeger 是一個分布式追蹤系統。Jaeger的靈感來自 Dapper 和 OpenZipkin,是一個由 Uber 創建并捐贈給 云原生計算基金會&#xf…

【Mybatis-plus】在mybatis-plus中 if test標簽如何判斷 list不為空

博主介紹:?全網粉絲22W,CSDN博客專家、Java領域優質創作者,掘金/華為云/阿里云/InfoQ等平臺優質作者、專注于Java技術領域? 技術范圍:SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大數據、物…

FRP在物聯網設備中的穿透方案

物聯網設備常位于NAT后,FRP為其提供穩定穿透鏈路。 配置要點 輕量化部署:使用ARM版本FRP客戶端,適配樹莓派等設備9。 自啟動腳本:通過systemd或crontab實現設備重啟后自動連接26。 低功耗優化:調整心跳間隔&#xf…