一、ROS的前世今生
近年來,機器人的智能化已經(jīng)成為現(xiàn)代機器人發(fā)展的終極目標。隨著人工智能技術發(fā)展,機器人發(fā)展的速度在不斷提升,應用范圍也在不斷拓展至自動駕駛、服務機器人、信息機器人、無人機、農業(yè)機器人、工業(yè)機器人諸多領域。機器人系統(tǒng)是很多復雜算法模塊的集合,如障礙物檢測、行為決策、智能控制、環(huán)境識別等,機器人技術是一門跨學科、跨領域、需要許多先驗知識的龐雜的學問,從零開始開發(fā)系統(tǒng)對技術人員要求非常高,而且工作量巨大。機器人不僅要實現(xiàn)基本的數(shù)據(jù)搜集與移動能力,還需要在對數(shù)據(jù)的有效分析、感知世界、實時通訊、智能思考并決策、協(xié)助或主導完成實際有效的工作等方面具備必要的技能。
筆者堅定的學習、推廣、布道ROS的動力是源于失敗的項目經(jīng)歷。筆者參與的第一個機器人項目并沒有使用ROS,完全是從0開始,在經(jīng)歷大量的編碼、測試、幾經(jīng)迭代后,初代機器人終究成了回憶。
1.1
什么是ROS
ROS - Robot Operating System機器人操作系統(tǒng)并非傳統(tǒng)意義的操作系統(tǒng),而是在操作系統(tǒng)之上的一整套幫助開發(fā)者構建機器人應用的開源軟件及工具集或者稱之為次操作系統(tǒng)。它提供類似操作系統(tǒng)所提供的功能,包含硬件抽象描述、底層驅動程序管理、共用功能的執(zhí)行、程序間的消息傳遞、程序發(fā)行包管理,它也提供一些工具程序和庫用于獲取、建立、編寫和運行多機整合的程序。從驅動程序到最先進的算法,以及強大的開發(fā)工具,ROS擁有您構建機器人項目所需的一切。作為運行于操作系統(tǒng)之上的框架,ROS的主要目標是為機器人研究和開發(fā)提供代碼復用的支持,只需要管理與機器人相關的資源,控制機器人相關的邏輯,至于其他部分則交由操作系統(tǒng)來處理。
從軟件架構的層面來說,ROS是一個基于消息傳遞的分布式的進程框架或者說是節(jié)點框架(Nodes)。這使可執(zhí)行文件能被單獨設計,并且在運行時松散耦合。這些過程可以封裝到數(shù)據(jù)包(Packages)和堆棧(Stacks)中,以便于共享和分發(fā)。ROS還支持代碼庫的聯(lián)合系統(tǒng)。使得協(xié)作亦能被分發(fā)。這種從文件系統(tǒng)級別到社區(qū)一級的設計讓獨立地決定發(fā)展和實施工作成為可能。
為了順利達成分發(fā)與協(xié)作目的,ROS框架有以下幾個顯著特性:
1
小型化:ROS盡可能設計的很小,不封裝main() 函數(shù),這樣的優(yōu)勢是ROS編寫的代碼可以輕松的在其它機器人軟件平臺上使用,可以輕松集成在其它機器人軟件平臺:ROS已經(jīng)可以與OpenRAVE,Orocos和Player集成。
2
點對點設計:ROS進程存在于多個不同的主機并且在運行過程中通過端對端的拓撲結構進行聯(lián)系。雖然基于中心服務器的那些軟件框架也可以實現(xiàn)多進程和多主機的優(yōu)勢,但是在這些框架中,當各電腦通過不同的網(wǎng)絡進行連接時,中心數(shù)據(jù)服務器就會發(fā)生問題。ROS的點對點設計以及服務和節(jié)點管理器等機制可以分散由計算機視覺和語音識別等功能帶來的實時計算壓力,能夠適應多機器人遇到的挑戰(zhàn)。
圖1-2 點對點設計
3
不敏感庫:首選開發(fā)模型都是用不依賴ROS的干凈的庫函數(shù)編寫而成??蓴U展:ROS可以適用于大型運行時系統(tǒng)和大型開發(fā)進程。
4
語言獨立:ROS框架可以簡單地使用任何的現(xiàn)代編程語言實現(xiàn),當下已經(jīng)支持已Python、C++、Lisp、Java和Lua語言
5
開源開放:吸引了大量的開發(fā)者參與其中,營造了極佳的生態(tài)環(huán)境。
6
工具豐富:為了管理復雜的軟件框架,ROS利用了大量的小工具去編譯和運行多種多樣的組件,而不是構建一個龐大的開發(fā)和運行環(huán)境。此外,ROS內建一個了叫做rostest的單元、集成測試框架,可以輕松安裝或卸載測試模塊。
圖1-3 豐富的工具集
1.2
ROS歷史與發(fā)展
ROS系統(tǒng)是起源于2007年斯坦福大學人工智能實驗室的項目與機器人技術公司W(wǎng)illow Garage的個人機器人項目(Personal Robots Program)之間的合作,最初的ROS版本主要解決了機器人各組件的通信問題。2008年之后就由Willow Garage來進行推動。2010年Willow Garage公司發(fā)布了開源機器人操作系統(tǒng)ROS(Robot Operating System),很快在機器人研究領域展開了學習和使用ROS的熱潮。現(xiàn)如今ROS操作系統(tǒng)由Open Robotics承擔主要的維護及推動工作。基于ROS標準且完善的通信機制,越來越多的機器人工具、算法集成到ROS中來,使其有了長足的發(fā)展。
圖1-4 ROS歷史
ROS的分支版本可以分為ROS、ROS-I以及ROS2。ROS的初衷是用于實驗室與科研,它定義的原型是面向于服務機器人。因此,它有一些先天限制。例如針對于工業(yè)機械臂來說,ROS的實時性與魯棒性并不能滿足工業(yè)上的需求,因此在2013年有那么幾家世界知名的機械臂廠家聯(lián)合起來,開始著力對ROS進行改造,用線程代替進程,用差一點的模塊化,換取系統(tǒng)的穩(wěn)定性能與實時性能。他們把他們的版本命名為ROS-I,并制定了他們的準入門檻。ROS-I面向的是機械臂的解決方案,期望解決的問題是對于傳統(tǒng)的焊接、塑型、噴涂等方面的現(xiàn)代化工藝改進,讓產品線的升級改造的成本降低。盡管如此,ROS-I并不能滿足大部分人的普遍性需求,解決不了落后技術帶來的弊端。因此,從2015起,OSRF開始著手第二代機器人操作系統(tǒng)。ROS2是更符合機器人技術的發(fā)展,并且它具備更大的容量、可擴展性來容納當下或者說未來對機器人的一些需求。
圖1-5 ROS版本演進
圖1-6 ROS2版本演進
1.3
ROS2的特點
盡管ROS的發(fā)展如火如荼,但其先天劣勢,如實時性差、過分依賴Master主節(jié)點、嚴重依賴Ubuntu導致系統(tǒng)較為臃腫。ROS2在繼承ROS優(yōu)良特性的基礎上解決了諸多關鍵問題:支持多機器人系統(tǒng);支持微控制器;支持實時控制;跨系統(tǒng)平臺支持以及填平原型與產品之間的鴻溝,縮短上市時間。
圖1-7 ROS2與ROS架構對比
1
ROS2引入了數(shù)據(jù)分發(fā)服務(DDS)通信協(xié)議,它可以零拷貝的方式傳遞消息,節(jié)省了CPU和內存資源,同時增加通信的實時性;ROS2為托管啟動,用戶可以指定節(jié)點啟動順序;ROS2去除了ros master這個中心節(jié)點管理器,改進了ROS對master節(jié)點的高度依賴的缺點;
2
ROS2為托管啟動,用戶可以指定節(jié)點啟動順序;
3
ROS2去除了ros master這個中心節(jié)點管理器,改進了ROS對master節(jié)點的高度依賴的缺點;
1.4
ROS2 通信框架
圖1-8 ROS2通信框架
1
參與者(Domain Participant):一個參與者Participant就是一個容器,對應于一個使用DDS的用戶,任何DDS的用戶都必須通過Participant來訪問全局數(shù)據(jù)空間;
2
發(fā)布者(Publisher):數(shù)據(jù)發(fā)布的執(zhí)行者,支持多種數(shù)據(jù)類型的發(fā)布,可以與多個數(shù)據(jù)寫入器(DataWriter)相聯(lián),發(fā)布一種或多種主題(Topic)的消息;
3
訂閱者(Subscriber):數(shù)據(jù)訂閱的執(zhí)行者,支持多種數(shù)據(jù)類型的訂閱,可以與多個數(shù)據(jù)讀取器(DataReader)相聯(lián),訂閱一種或多種主題(Topic)的消息;
4
數(shù)據(jù)寫入器(DataWriter):應用向發(fā)布者更新數(shù)據(jù)的對象,每個數(shù)據(jù)寫入器對應一個特定的Topic,類似于ROS1中的一個消息發(fā)布者;
5
數(shù)據(jù)讀取器(DataReader):應用從訂閱者讀取數(shù)據(jù)的對象,每個數(shù)據(jù)讀取器對應一個特定的Topic,類似于ROS1中的一個消息訂閱者;
6
主題(Topic):這個和ROS1中的Topic概念一致,一個Topic包含一個名稱和一種數(shù)據(jù)結構;
7
QoS Policy:Quality of Service,質量服務原則,這個模塊在ROS1中可從沒見過,看名稱就猜測應該是負責數(shù)據(jù)質量的。QoS是DDS中非常重要的一環(huán),控制了各方面與底層的通訊機制,主要從時間限制、可靠性、持續(xù)性、歷史記錄幾個方面,滿足用戶針對不同場景的數(shù)據(jù)應用需求。
ROS2相較ROS運行更可靠,持續(xù)性更好,更節(jié)省資源,消息傳遞實時性更佳,因此ROS2更適合應用在工業(yè)生產環(huán)境?;赗OS2的以上特點,該框架被廣泛應用與工廠AGV作業(yè)機器人、智能立體倉庫、送餐及快遞等服務機器人、自動駕駛、機械手智能控制等新興智能機器人領域.
ROS2與ROS完全是獨立的系統(tǒng),學習ROS2并不需要ROS的基礎,當然學習了ROS有了實戰(zhàn)經(jīng)驗對于學習ROS2會有幫助。了解完ROS的前世今生,在下一章節(jié)我們安裝ROS2系統(tǒng)并實現(xiàn)小烏龜模擬仿真。
二、ROS2環(huán)境搭建
2.1
版本選擇
從學習嘗鮮的角度出發(fā),選擇最新的版本一定是正確的。但從產品開發(fā)的角度出發(fā),選擇穩(wěn)定可靠且有較長生命周期的版本,才是不二之選。從ROS2的版本演進圖中我們可以看到,F(xiàn)oxy是第一個長期支持的版本,我們采用這個版本進行環(huán)境搭建。
2.2
系統(tǒng)平臺
本文是進行中機器人項目的開發(fā)記錄筆記,因此我們直接使用產品中的主控設備Intel NUC阿特拉斯峽谷作為硬件平臺搭載Ubuntu20.04作為操作系統(tǒng)。此款NUC性能功耗比好、接口豐富、加之體積小,完全勝任機器人控制工作。
盡管ROS2已實現(xiàn)跨平臺,能夠支持MacOS、Windows系統(tǒng),但在實際工作產品中還是以Linux為主要的部署系統(tǒng)。此外,從目前可用的工具出發(fā)、諸多工具、算法包在Windows上使用不便,因此Linux還是優(yōu)選系統(tǒng)。
圖2-2 硬件平臺
2.3
ROS2 安裝
1.配置系統(tǒng)源服務器
安裝ROS操作系統(tǒng)出現(xiàn)問題,99%是因為網(wǎng)絡,剩余1%是因為環(huán)境及版本。
在正式安裝前我們先來配置系統(tǒng)下載服務器。
打開軟件和更新應用-下載自-中國-選擇最佳服務器
圖2-3 配置下載服務器
若遇到不能正常下載,可以嘗試使用清華ROS2鏡像,配置參考如下網(wǎng)址: https://mirrors.tuna.tsinghua.edu.cn/help/ros2/
2.配置環(huán)境支持UTF-8編碼
sudo apt update && sudo apt install locales
sudo locale-gen en_US en_US.UTF-8
sudo update-locale LC_ALL=en_US.UTF-8.UTF-8
export.UTF-8
3.設置軟件源,添加apt倉庫
sudo apt update && sudo apt install curl gnupg2 lsb-release
curl -s https://raw.githubusercontent.com/ros/rosdistro/master/ros.asc | sudo apt-key add -
sudo sh -c 'echo "deb [arch=$(dpkg --print-architecture)] http://packages.ros.org/ros2/ubuntu $(lsb_release -cs) main" > /etc/apt/sources.list.d/ros2-latest.list
命令執(zhí)行成功后在系統(tǒng)/etc/apt/source.list.d文件夾中將出現(xiàn)ros2-lastest.list文件
圖2-4 配置源
4.安裝ROS2 foxy
sudo apt update
sudo apt install ros-foxy-desktop
圖2-5 安裝foxy
與ROS(需要安裝約2.5G的應用)相比,ROS2的應用體積要小很多,在網(wǎng)絡暢通的情況下,很快可以安裝完成。
5.安裝效率工具
sudo apt install python3-argcomplete
圖2-6 安裝自動補齊工具
6.配置環(huán)境變量
echo “source /opt/ros/foxy/setup.bash” >> ~/.bashrc
將環(huán)境變量寫入rc文件中,打開終端時可自動初始化環(huán)境變量。
圖2-7 配置環(huán)境變量
7.測試
ROS2終端指令格式如下,我們在后續(xù)的章節(jié)中會用各種命令實現(xiàn)不同應用的控制。
ros2run
打開兩個終端,在其中一個終端輸入如下命令,作為消息發(fā)送方;
ros2 run demo_nodes_cpp talker
另一個終端中,輸入如下命令,作為消息接收方;
ros2 run demo_nodes_cpp listener
一切運行正常,則消息發(fā)送與消息接收對等出現(xiàn)。
圖2-8 安裝測試
2.4
海龜仿真器
海龜仿真器(Turtlesim)是ROS2中一個非常重要的入門級案例,通過海龜仿真,我們可以了解到很多ROS2的底層原理,涉及節(jié)點、話題、服務等核心概念。我們在后續(xù)章節(jié)都會以海龜仿真器為模板進行介紹。
1.安裝
我們在安裝ROS2選擇了ros-foxy-desktop,turtlesim作為默認配套工具一并安裝到系統(tǒng)中,我們可以通過下面的命令,檢查安裝是否成功。
ros2 pkg executables turtlesim
命令執(zhí)行完成后,若出現(xiàn)如下內容,則說明安裝成功。
圖2-9 turtlesim安裝校驗
若系統(tǒng)中并未安裝海龜模擬器,我們則通過以下命令進行安裝。
sudo apt-get install ros-foxy-turtlesim
圖2-10 turtlesim安裝
2.啟動
ros2 run turtlesim turtlesim_node
終端中輸入如下命令啟動仿真器。
圖2-11 啟動turtlesim
程序運行后,我們會看到仿真界面一只在海里游泳的海龜,應用會隨機使用一個ROS2的logo作為顯示海龜?shù)奈恢?,已?jīng)開啟的系統(tǒng)終端中,也會顯示海龜?shù)拿Q及坐標。
圖2-12 turtlesim仿真界面
3.讓海龜動起來
我們再開啟一個新終端,輸入下面命令:
ros2 run turtlesim turtle_teleop_key
根據(jù)終端中提示,我們可以點擊物理鍵盤控制海龜運動。需要注意的是,我們要讓鍵盤控制節(jié)點一致處于激活狀態(tài)。
圖2-13 turtlesim運動控制
很好,我們已經(jīng)成功讓海龜運動起來,接下來使用如下命令查看仿真器后臺到底運行了哪些功能,這些概念也會在后續(xù)章節(jié)中詳細介紹。
ros2 node list
ros2 topic list
ros2 service list
ros2 action list
ros2 param list
圖2-14 turtlesim后臺服務
2.5
關鍵的通信概念及模型
上一節(jié)中我們提到了節(jié)點(Node)、話題(Topic)、服務(Service)、參數(shù)(Parameters)以及動作(Action),這些都是ROS2系統(tǒng)中通信的基礎概念及模型。每一個完成具體功能的模塊稱之為“節(jié)點”,例如控制車輪、獲取雷達數(shù)據(jù)、獲取視覺數(shù)據(jù)等,節(jié)點之間通過話題、服務、動作或者參數(shù)實現(xiàn)數(shù)據(jù)的收發(fā)。在本節(jié)中我們詳細展開。
1.節(jié)點Node
節(jié)點,從本質上來說是一個可執(zhí)行文件(C++或者Python)。它利用ROS2的通信網(wǎng)絡能與其他節(jié)點進行通信(數(shù)據(jù)交互)。ROS中每一個節(jié)點應該負責一個單一的、模塊化的功能。例如,一個節(jié)點用于控制電機,一個節(jié)點用于控制激光雷達。
ros2 run是啟動節(jié)點的命令。
關于查看節(jié)點的命令,列出節(jié)點,及查看節(jié)點詳細信息。
ros2 node list
ros2 node info <節(jié)點名稱>
圖2-16 ROS2節(jié)點信息
2.話題Topic
ROS2將復雜的系統(tǒng)分解成許多模塊化的節(jié)點,話題(Topic)是ROS2通信中的重要元素,充當節(jié)點交換信息的總線,是一種發(fā)布訂閱模型。如圖所示:
圖2-17 ROS2話題
話題通信模型有以下特點:
1
話題名字是關鍵,發(fā)布訂閱接口類型要相同,發(fā)布的是字符串,接受也要用字符串來接收;
2
同一節(jié)點可以訂閱多個話題,同時也可以發(fā)布多個話題;
3
同一個話題可以有多個發(fā)布者;
一個節(jié)點可以向任意數(shù)量的話題發(fā)布數(shù)據(jù)并同時訂閱任意數(shù)量的話題。因為在ROS2中,所有的節(jié)點都是同一個級別。即可以實現(xiàn)一對多、多對一、多對多的通信模式。如圖所示:
圖2-18 ROS2話題一對多
關于話題的命令:
ros2 topic list #查看話題列表
ros2 topic echo#查看話題內容
ros2 topic info#查看話題詳情
ros2 topic pub #發(fā)布指令
ros2 topic hz #查看話題發(fā)布周期
圖2-19 ROS2話題指令
3.服務Service
之上提到的話題通信是基于訂閱/發(fā)布機制的,無論有沒有訂閱者,發(fā)布者都會周期發(fā)布數(shù)據(jù),這種模式適合持續(xù)數(shù)據(jù)的收發(fā),比如傳感器數(shù)據(jù)。機器人系統(tǒng)中還有另外一些配置性質的數(shù)據(jù),并不需要周期處理,此時就可以用“服務”通信模型實現(xiàn)。服務是基于客戶端/服務器模型的通信機制,服務器端只有在接收到客戶端請求時才會提供反饋數(shù)據(jù)。
圖2-20 ROS2服務
值得注意的是,在服務通信模型中,可以有多個客戶端請求同一個服務器,但一個服務模型中,只可以存在一個服務器。
圖2-21 ROS2服務
關于服務的指令:
ros2 service list #查看服務列表
ros2 service info#查看服務詳情
ros2 service type#查看服務的類型
ros2 service find #查找特定類型的服務
ros2 service call #通過終端發(fā)送服務請求
4.動作Action
“動作”是ROS2中用于長時間運行任務的一種通信類型,例如我們要讓機械臂抓取一個物體,我們不僅要發(fā)出指令,還需要獲取機械臂的實時反饋,在這種場景下我們就需要“動作”類型?!皠幼鳌敝饕扇糠纸M成:目標(goal)、反饋(feedback)以及結果(result)。動作通信建立在話題和服務之上,類似與服務的C/S通信模型,但是不同之處在于,客戶端可以隨時取消動作。動作還提供穩(wěn)定的反饋,而不是返回單一響應的服務。
圖2-22 ROS2動作
關于服務的指令:
ros2 action list #查看動作列表
ros2 action info#查看動作詳情
ros2 action send_goal#發(fā)送動作請求
5.參數(shù)Parameter
參數(shù)也是ROS2中很重要的一個概念,其主要作用是對節(jié)點功能進行配置。在ROS2中,每個節(jié)點都有自己的參數(shù),這些參數(shù)可以用整型數(shù)、浮點數(shù)、布爾型數(shù)、字符串和列表來描述。
關于服務的指令:
ros2 param list #查看參數(shù)列表
ros2 param info#查看某節(jié)點的參數(shù)詳情
ros2 param set#參數(shù)設置
ros2 param get#參數(shù)設置
ros2 param dump#參數(shù)設置
例如我們查看海龜仿真器的參數(shù),并將背景顏色由海藍色改為天藍色。
圖2-23 ROS2設置參數(shù)
6.圖形化展示
上面的內容中我們采用命令行方式實現(xiàn)人機交互,終端命令行具有較高的調試效率,其缺點是節(jié)點間關系沒能直觀呈現(xiàn),rqt_graph圖形化工具剛好可以彌補這一缺陷。
終端命令行輸入:可以啟動圖形化工具,直觀顯示節(jié)點、話題、參數(shù)關系。
rqt_graph
圖2-24 ROS2動作
至此,我們已成功安裝ROS2環(huán)境,并且運行了海龜模擬器,成功讓小海龜運動起來,同時我們也了解了ROS2系統(tǒng)的核心通信概念,ROS2系統(tǒng)功能強大遠不止如此,我們僅完成了入門工作,也幫助我們更好的理解后續(xù)內容。
審核編輯 :李倩
-
機器人
+關注
關注
213文章
29748瀏覽量
212897 -
智能化
+關注
關注
15文章
5128瀏覽量
57282 -
模擬器
+關注
關注
2文章
894瀏覽量
44408
原文標題:ROS2+OpenVINO? 實踐教程 - 上篇 | 開發(fā)者實戰(zhàn)
文章出處:【微信號:英特爾物聯(lián)網(wǎng),微信公眾號:英特爾物聯(lián)網(wǎng)】歡迎添加關注!文章轉載請注明出處。
發(fā)布評論請先 登錄
Micro-ROS:把ROS2放在MCU上
系統(tǒng)鏡像Ubuntu_ROS2中ROS2是什么意思,帶有ROS2開發(fā)環(huán)境嗎?
名單公布!【書籍評測活動NO.58】ROS 2智能機器人開發(fā)實踐
【「# ROS 2智能機器人開發(fā)實踐」閱讀體驗】+內容初識
【「# ROS 2智能機器人開發(fā)實踐」閱讀體驗】+ROS2應用案例
【「# ROS 2智能機器人開發(fā)實踐」閱讀體驗】機器人入門的引路書
【「# ROS 2智能機器人開發(fā)實踐」閱讀體驗】視覺實現(xiàn)的基礎算法的應用
ROS2概述和實踐入門
ROS/ROS 2 介紹

ros的基本概念是什么
ROS2中自帶例程測試

在TogetherROS中如何安裝ROS2功能包

評論