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