第1章 ROS入門
本書的主要目的是教你如何從頭開始構(gòu)建自主移動(dòng)機(jī)器人。我們將使用機(jī)器人操作系統(tǒng)( , ROS)對機(jī)器人進(jìn)行編程,它的操作將在名為的仿真器上進(jìn)行模擬。在接下來的章節(jié)中,還會(huì)介紹機(jī)器人的機(jī)械設(shè)計(jì)、電路設(shè)計(jì)、嵌入式編程并使用ROS進(jìn)行高級軟件編程。
本章將從ROS基礎(chǔ)知識(shí)開始學(xué)習(xí),包括如何安裝ROS,如何使用ROS和編寫基礎(chǔ)的應(yīng)用程序,以及的基礎(chǔ)知識(shí)。本章內(nèi)容是自主機(jī)器人項(xiàng)目的基礎(chǔ)。如果你已經(jīng)了解了ROS的基礎(chǔ)知識(shí),并且已經(jīng)在系統(tǒng)上安裝了ROS,那么可以跳過這一章。但是,你仍然可以在以后瀏覽這一章來增強(qiáng)對ROS基礎(chǔ)知識(shí)的記憶。
本章將涵蓋以下主題:
·對ROS的概述。
·在 16.04.3上安裝ROS 。
·介紹、安裝和測試。
我們開始使用和ROS來對機(jī)器人編程吧!
1.1 技術(shù)要求
可以從以下鏈接獲得本章中提到的完整代碼:。
1.2 ROS概述
ROS是用于創(chuàng)建機(jī)器人應(yīng)用程序的軟件框架,其主要目的是提供可以用于創(chuàng)建機(jī)器人應(yīng)用程序的功能,創(chuàng)建的應(yīng)用程序也可以被其他機(jī)器人再次使用。ROS由一系列可以簡化機(jī)器人軟件開發(fā)的軟件工具、軟件庫和軟件包組成。
ROS是BSD()許可的一個(gè)完整的開源項(xiàng)目,可用于研究和商業(yè)應(yīng)用。雖然ROS表示機(jī)器人操作系統(tǒng),但它并不是一個(gè)真正的操作系統(tǒng)。相反,它是一個(gè)提供了真實(shí)操作系統(tǒng)功能的元操作系統(tǒng)。以下是ROS提供的主要功能:
·消息傳遞接口:這是ROS的核心功能,它支持進(jìn)程間通信。使用這種消息傳遞功能,ROS程序可以與其鏈接的系統(tǒng)進(jìn)行通信并交換數(shù)據(jù)。下面的章節(jié)中,我們將學(xué)習(xí)更多關(guān)于在ROS程序/節(jié)點(diǎn)之間交換數(shù)據(jù)的技術(shù)術(shù)語。
·硬件抽象:ROS具有一定程度的抽象,使開發(fā)人員能夠創(chuàng)建與機(jī)器人無關(guān)的應(yīng)用程序。這類應(yīng)用程序可以用于任何機(jī)器人,因此開發(fā)人員只需要關(guān)心底層的機(jī)器人硬件。
·軟件包管理:把ROS節(jié)點(diǎn)以軟件包形式組織在一起,則稱為ROS軟件包。ROS軟件包由源代碼、配置文件、構(gòu)建文件等組成。我們可以創(chuàng)建包、構(gòu)建包和安裝包。ROS中有一個(gè)構(gòu)建系統(tǒng),可以幫助構(gòu)建這些軟件包。ROS的軟件包管理使ROS的開發(fā)更加系統(tǒng)化和組織化。
·第三方軟件庫集成:ROS框架可與許多第三方軟件庫集成,如、PCL、等。這有助于開發(fā)者在ROS中創(chuàng)建各種各樣的應(yīng)用程序。
·底層設(shè)備控制:使用機(jī)器人工作時(shí),也可能需要使用底層設(shè)備,例如控制I/O引腳、通過串口發(fā)送數(shù)據(jù)等設(shè)備。這也可以使用ROS完成。
·分布式計(jì)算:處理來自機(jī)器人傳感器的數(shù)據(jù)所需的計(jì)算量非常大。使用ROS可以輕松地將計(jì)算分配到計(jì)算節(jié)點(diǎn)集群中。分配計(jì)算能力使處理數(shù)據(jù)的速度比使用單個(gè)計(jì)算機(jī)更快。
·代碼復(fù)用:ROS的主要目標(biāo)是實(shí)現(xiàn)代碼復(fù)用。代碼復(fù)用促進(jìn)了全球研發(fā)團(tuán)隊(duì)的發(fā)展。ROS的可執(zhí)行文件叫作節(jié)點(diǎn)。這些可執(zhí)行文件被打包成一個(gè)實(shí)體,叫作ROS軟件包。一批軟件包集合叫作元軟件包,軟件包和元軟件包都可以共享和分發(fā)。
·語言獨(dú)立性:ROS框架可以使用當(dāng)前流行的編程語言(如、C++和Lisp)。節(jié)點(diǎn)可以用任何一種語言來編寫,并且可以通過ROS框架進(jìn)行無障礙通信。
·測試簡單:ROS有一個(gè)內(nèi)置的單元/集成測試框架,用于測試ROS軟件包。
·擴(kuò)展:ROS可以擴(kuò)展到機(jī)器人中執(zhí)行復(fù)雜的計(jì)算。
·免費(fèi)且開源:ROS的源代碼是開放的,并且是完全免費(fèi)的。ROS的核心部分,經(jīng)BSD( )協(xié)議許可,可以在商業(yè)領(lǐng)域和不開源的產(chǎn)品上復(fù)用。
ROS是管道(消息傳遞)、開發(fā)工具、應(yīng)用功能和生態(tài)系統(tǒng)的組合。ROS中有強(qiáng)大的開發(fā)工具,可以調(diào)試和可視化機(jī)器人數(shù)據(jù)。ROS具有內(nèi)置的機(jī)器人應(yīng)用功能,如機(jī)器人導(dǎo)航、定位、繪圖、操作等。它們有助于創(chuàng)建強(qiáng)大的機(jī)器人應(yīng)用程序。
圖1-1顯示了ROS的組成。
圖1-1 ROS的組成
更多有關(guān)ROS的信息,請參考。
1.2.1 ROS框架
ROS框架主要分成三個(gè)層級:
·ROS文件系統(tǒng)。
·ROS計(jì)算圖。
·ROS社區(qū)。
ROS文件系統(tǒng)
ROS的文件系統(tǒng)主要介紹了硬盤上ROS文件的組織形式。其中,我們必須了解的主要有以下幾個(gè)方面:
·軟件包():ROS軟件包是ROS軟件框架的獨(dú)立單元。ROS軟件包可能包含源代碼、第三方軟件庫、配置文件等。ROS軟件包可以復(fù)用和共享。
·軟件包清單( ):清單文件(.xml)列出了軟件包的所有詳細(xì)信息,包括名稱、描述、許可信息以及最重要的依賴關(guān)系。
·消息(msg)類型:消息的描述存儲(chǔ)在軟件包的msg文件夾下。ROS消息是一組通過ROS的消息傳遞系統(tǒng)進(jìn)行數(shù)據(jù)發(fā)送的數(shù)據(jù)結(jié)構(gòu)。消息的定義存儲(chǔ)在擴(kuò)展名為.msg的文件里。
·服務(wù)(srv)類型:服務(wù)的描述使用擴(kuò)展名.srv存儲(chǔ)在srv文件夾下。該文件定義了ROS內(nèi)服務(wù)請求和響應(yīng)的數(shù)據(jù)結(jié)構(gòu)。
ROS計(jì)算圖
ROS的計(jì)算圖是ROS處理數(shù)據(jù)的一種點(diǎn)對點(diǎn)的網(wǎng)絡(luò)形式。ROS計(jì)算圖中的基本功能包括節(jié)點(diǎn)、ROS控制器、參數(shù)服務(wù)器、消息和服務(wù):
·節(jié)點(diǎn)(Node):ROS節(jié)點(diǎn)是使用ROS功能處理數(shù)據(jù)的進(jìn)程。節(jié)點(diǎn)的基本功能是計(jì)算。例如,節(jié)點(diǎn)可以對激光掃描儀數(shù)據(jù)進(jìn)行處理,以檢查是否存在碰撞。ROS節(jié)點(diǎn)的編寫需要ROS客戶端庫文件(如和)的支持,這將在下一節(jié)中討論。
·ROS控制器():ROS節(jié)點(diǎn)可以通過名為ROS控制器的程序相互連接。此程序提供計(jì)算圖其他節(jié)點(diǎn)的名稱、注冊和查找信息。如果不運(yùn)行這個(gè)控制器,節(jié)點(diǎn)之間將無法相互連接和發(fā)送消息。
·參數(shù)服務(wù)器( ):ROS參數(shù)是靜態(tài)值,存儲(chǔ)在叫作參數(shù)服務(wù)器的全局位置。所有節(jié)點(diǎn)都可以從參數(shù)服務(wù)器訪問這些值。我們甚至可以將參數(shù)服務(wù)器的范圍設(shè)置為以訪問單個(gè)節(jié)點(diǎn),或者設(shè)置為以訪問所有節(jié)點(diǎn)。
·ROS主題():ROS節(jié)點(diǎn)使用命名總線(叫作ROS主題)彼此通信。數(shù)據(jù)以消息的形式流經(jīng)主題。通過主題發(fā)送消息稱為發(fā)布,通過主題接收數(shù)據(jù)稱為訂閱。
·消息():ROS消息是一種數(shù)據(jù)類型,可以由基本數(shù)據(jù)類型(如整型、浮點(diǎn)型、布爾類型等)組成。ROS消息流經(jīng)ROS主題。一個(gè)主題一次只能發(fā)送/接收一種類型的消息。我們可以創(chuàng)建自己的消息定義并通過主題發(fā)送它。
·服務(wù)():我們看到使用ROS主題的發(fā)布/訂閱模型是一種非常靈活的通信模式,這是一種一對多的通信模式,意味著一個(gè)主題可以被任意數(shù)量的節(jié)點(diǎn)訂閱。在某些情況下,可能還需要一種請求/應(yīng)答類型的交互方式,它可以用于分布式系統(tǒng)。這種交互方式可以使用ROS服務(wù)實(shí)現(xiàn)。ROS服務(wù)的工作方式與ROS主題類似,因?yàn)樗鼈兌加邢㈩愋投x。使用該消息定義可以將服務(wù)請求發(fā)送到另一個(gè)提供該服務(wù)的節(jié)點(diǎn)。服務(wù)的結(jié)果將作為應(yīng)答發(fā)送。該節(jié)點(diǎn)必須等待,直到從另一個(gè)節(jié)點(diǎn)接收到結(jié)果。
·ROS消息記錄包(Bag):這是一種用于保存和回放ROS主題的文件格式。ROS消息記錄包是記錄傳感器數(shù)據(jù)和處理數(shù)據(jù)的重要工具。這些包之后可以用于離線測試算法。
圖1-2顯示了在節(jié)點(diǎn)和控制器之間,ROS主題和ROS服務(wù)的工作流程。
圖1-2 ROS節(jié)點(diǎn)和ROS控制器之間的通信
從圖1-2可以看到,ROS控制器位于兩個(gè)ROS節(jié)點(diǎn)之間。我們必須記住的一件事是,在啟動(dòng)ROS中的任何節(jié)點(diǎn)之前,應(yīng)該先啟動(dòng)ROS控制器。ROS控制器充當(dāng)節(jié)點(diǎn)之間的中介,以交換關(guān)于其他ROS節(jié)點(diǎn)的信息,從而建立通信。假設(shè)節(jié)點(diǎn)1希望發(fā)布名為/xyz的主題,消息類型為abc。它將首先接近ROS控制器,說:“我將發(fā)布一個(gè)名為/xyz的主題,消息類型為abc,并共享其細(xì)節(jié)。”當(dāng)另一個(gè)節(jié)點(diǎn),比如節(jié)點(diǎn)2,希望訂閱消息類型為abc的相同主題/xyz時(shí),控制器將共享關(guān)于節(jié)點(diǎn)1的信息,并分配一個(gè)端口來直接在這兩個(gè)節(jié)點(diǎn)之間啟動(dòng)通信,而不需要與ROS控制器通信。
ROS服務(wù)的工作方式與之類似。ROS控制器類似DNS服務(wù)器,當(dāng)?shù)诙€(gè)節(jié)點(diǎn)向第一個(gè)節(jié)點(diǎn)請求主題或服務(wù)時(shí),它可以共享節(jié)點(diǎn)的詳細(xì)信息。ROS使用的通信協(xié)議是(),它使用的是標(biāo)準(zhǔn)TCP/IP套接字。
ROS社區(qū)
ROS社區(qū)由ROS開發(fā)人員和研究人員組成,他們可以創(chuàng)建和維護(hù)軟件包,并交換現(xiàn)有軟件包、新發(fā)布的軟件包和其他與ROS框架相關(guān)的新信息。ROS社區(qū)提供以下服務(wù):
·發(fā)行版本():ROS發(fā)行版有一組特定版本的軟件包。本書中使用的發(fā)行版是ROS 。還有其他可用的版本,比如ROS 和,它們有一個(gè)可以安裝的特定版本。在每個(gè)發(fā)行版中維護(hù)軟件包更容易。在大多數(shù)情況下,發(fā)行版中的軟件包相對穩(wěn)定。
·資源庫():在線資源庫是保存軟件包的地方。通常,開發(fā)人員在資源庫中保存一組類似的軟件包,稱為元軟件包。還可以將單個(gè)軟件包保存在獨(dú)立資源庫中。我們可以簡單地復(fù)制資源庫并構(gòu)建或復(fù)用軟件包。
·ROS wiki:從ROS wiki幾乎可以獲得所有ROS文檔。通過使用ROS wiki(),可以從最基本的概念到最高級的編程來了解ROS。
·郵件列表( List):如果想獲得有關(guān)ROS的更新消息,可以訂閱ROS郵件列表()。還可以從ROS ()獲得最新的ROS消息。
·ROS應(yīng)答:這與 網(wǎng)站非常相似。你可以在這個(gè)門戶中提出與ROS相關(guān)的問題,并且可能會(huì)得到來自世界各地開發(fā)人員的幫助()。
可以從ROS的官方網(wǎng)站上了解關(guān)于ROS的其他功能。現(xiàn)在,我們繼續(xù)介紹ROS的安裝過程。
1.2.2 在上安裝ROS
根據(jù)前面的討論,我們了解到ROS是元操作系統(tǒng),需要安裝在主機(jī)系統(tǒng)上。ROS完全支持和,但對于和OS X的支持還處于實(shí)驗(yàn)階段。表1-1列出了一些最新的ROS發(fā)行版本。
表1-1 ROS發(fā)行版本
下面我們將介紹在 16.04.3 LTS上安裝名為的ROS長期穩(wěn)定支持(Long-Term , LTS)的發(fā)行版的過程。ROS Kame主要針對的是 16.04 LTS。在查看了以下說明之后,還可以在 18.04 LTS上最新的LTS 中找到設(shè)置ROS的說明。如果你是或OS X用戶,那么可以先在虛擬機(jī)()上安裝,然后再安裝ROS。的下載鏈接為。
你可以在上找到完整的操作說明。
安裝說明如下:
(1)配置資源庫,允許、和下載權(quán)限。可以用中的 & 工具進(jìn)行配置。我們可以直接在 查找菜單下進(jìn)行簡單搜索,然后按圖1-3所示勾選選項(xiàng)。
圖1-3 的 & 工具
(2)將系統(tǒng)設(shè)置為從接收ROS軟件包。ROS 版本僅支持 15.10和16.04。使用下面的命令將存儲(chǔ)到的apt庫列表:
(3)接下來,添加apt-key。apt-key用于管理密鑰列表,apt通過密鑰對軟件包進(jìn)行認(rèn)證。經(jīng)過這些密鑰認(rèn)證的軟件包將被認(rèn)為是可信的。使用下面的命令可以將apt-key添加到ROS軟件包:
(4)添加了apt-key之后,必須更新軟件包列表。使用下面的命令添加并更新ROS軟件包和軟件包:
(5)更新了ROS軟件包之后,就可以開始安裝軟件包了。使用下面的命令安裝ROS必需的軟件包、開發(fā)工具和軟件庫:
(6)在桌面安裝完成之后,可能還需要安裝一些附加的軟件包。每個(gè)附加安裝的軟件包在書中后續(xù)對應(yīng)的部分都會(huì)提到。安裝桌面需要花費(fèi)一些時(shí)間。在ROS安裝完成之后,就已經(jīng)完成了大部分工作。下一步就是初始化,有了它就可以很容易地安裝ROS資源包的依賴項(xiàng):
(7)為了在當(dāng)前的bash 下使用ROS工具和命令,可以在.文件中添加ROS環(huán)境變量。這將會(huì)在每個(gè)bash會(huì)話開始時(shí)執(zhí)行。使用下面的命令添加ROS環(huán)境變量到.文件:
下面的命令將在當(dāng)前下運(yùn)行.腳本,并在當(dāng)前下產(chǎn)生變化:
(8)在安裝軟件包的依賴項(xiàng)時(shí)有一個(gè)很好用的工具,這個(gè)工具需要單獨(dú)安裝。它僅需要一個(gè)命令就可以幫助你下載到很多ROS軟件包的資源樹:
最新的LTS 的安裝過程類似于前面的過程。可以同時(shí)安裝 18.04 LTS和。你可以在上找到完整的說明。
在完成ROS的安裝之后,我們將討論如何在ROS中創(chuàng)建示例軟件包。在創(chuàng)建軟件包之前,先要建立ROS工作區(qū),然后在ROS工作區(qū)中創(chuàng)建軟件包。我們將采用構(gòu)建系統(tǒng),是一系列工具的集合,用于在ROS中創(chuàng)建軟件包。構(gòu)建系統(tǒng)能夠從源代碼生成可執(zhí)行文件或共享庫。ROS 使用構(gòu)建系統(tǒng)來創(chuàng)建軟件包。下面,我們先來看看是什么。
1.2.3 什么是
是ROS的官方編譯構(gòu)建系統(tǒng)。在之前,ROS用系統(tǒng)來構(gòu)建軟件包。在最新版本的ROS中,代替了。結(jié)合了宏命令和腳本來提供和同樣的通用工作流程。提供了比系統(tǒng)更好的軟件包發(fā)布功能、更好的交叉編譯功能以及更好的可移植性。有關(guān)的更多信息,可以參考/。
工作區(qū)是一個(gè)文件夾,可以在其中對軟件包進(jìn)行修改、構(gòu)建以及安裝。
現(xiàn)在,我們來看如何創(chuàng)建ROS的工作區(qū)。
使用下面的命令創(chuàng)建名為的父目錄和名為src的子文件夾:
使用下面的命令將目錄切換到src文件夾。我們將在src文件夾中創(chuàng)建軟件包:
使用下面的命令初始化工作區(qū):
在完成工作區(qū)初始化之后,使用下面的命令能夠直接(即使在沒有源文件的情況下)構(gòu)建軟件包:
命令用于在src目錄中構(gòu)建軟件包。構(gòu)建軟件包之后,在目錄下可以看到一個(gè)文件夾和一個(gè)文件夾。可執(zhí)行文件存儲(chǔ)在文件夾中。在文件夾中,有可以在ROS環(huán)境下添加工作區(qū)的腳本文件。
1.2.4 創(chuàng)建ROS軟件包
在本節(jié)中,我們將介紹如何創(chuàng)建包含兩個(gè)節(jié)點(diǎn)的示例軟件包。其中一個(gè)節(jié)點(diǎn)用于在名為/的主題上發(fā)布 字符串消息,另一個(gè)節(jié)點(diǎn)訂閱該主題。
在ROS中使用命令可以創(chuàng)建 ROS軟件包。
軟件包會(huì)在src文件夾中創(chuàng)建,這個(gè)文件夾是我們在創(chuàng)建工作區(qū)的過程中創(chuàng)建的。在創(chuàng)建軟件包之前,使用下面的命令先切換到src文件夾:
使用下面的命令創(chuàng)建包及依賴項(xiàng),該依賴項(xiàng)包含標(biāo)準(zhǔn)的消息定義。ROS的客戶端庫是:
在軟件包成功創(chuàng)建后,會(huì)返回以下信息:
在包成功創(chuàng)建之后,需要添加兩個(gè)節(jié)點(diǎn)或腳本,用于演示主題的訂閱和發(fā)布。
首先,使用下面的命令在包中創(chuàng)建名為的文件夾:
切換到文件夾,并創(chuàng)建名為r.py和er.py的腳本,用于發(fā)布和訂閱 消息。下面將介紹這些腳本或節(jié)點(diǎn)的代碼和函數(shù)。
r.py
節(jié)點(diǎn)r.py主要發(fā)布?xì)g迎信息 到主題/中,發(fā)布頻率為10Hz。
圖1-4顯示了兩個(gè)ROS節(jié)點(diǎn)之間的相互作用。
圖1-4 發(fā)布者和訂閱者節(jié)點(diǎn)之間的通信
本書的完整代碼還可在獲得。
此節(jié)點(diǎn)代碼的分步解釋如下:
(1)如果要編寫ROS 節(jié)點(diǎn),則需要導(dǎo)入。它包含的API,可以與ROS的主題、服務(wù)等相互作用。
(2)要從包中導(dǎo)入消息數(shù)據(jù)類型才能發(fā)送 消息。包對標(biāo)準(zhǔn)的數(shù)據(jù)類型有一個(gè)消息定義。使用下面的命令進(jìn)行導(dǎo)入:
(3)下面的代碼創(chuàng)建了主題的一個(gè)發(fā)布對象。消息類型是,的值為10。如果設(shè)置的訂閱頻率太低導(dǎo)致來不及接收數(shù)據(jù),可以調(diào)整選項(xiàng):
(4)下面這行代碼對所有ROS節(jié)點(diǎn)進(jìn)行初始化,并給每個(gè)節(jié)點(diǎn)命名。如果運(yùn)行過程中兩個(gè)節(jié)點(diǎn)有相同的節(jié)點(diǎn)名稱,那么其中一個(gè)將會(huì)關(guān)閉。如果想要同時(shí)運(yùn)行這兩個(gè)節(jié)點(diǎn),可以如下使用=True標(biāo)志:
(5)下面這行代碼創(chuàng)建速率對象r。在對象Rate中使用()方法,可以更新設(shè)定的循環(huán)速率。這里,我們設(shè)定速率為10:
(6)下面的循環(huán)將檢查是否構(gòu)建了.()標(biāo)志。接下來,執(zhí)行這個(gè)循環(huán)。按下<Ctrl+C>時(shí),循環(huán)退出。
在循環(huán)內(nèi)部,消息 會(huì)被打印在終端上,并同時(shí)以10Hz的速率發(fā)布在主題上:
(7)下面的代碼對的進(jìn)行檢查并調(diào)用()函數(shù)。代碼將持續(xù)執(zhí)行(),當(dāng)按下<Ctrl+C>時(shí),節(jié)點(diǎn)將關(guān)閉:
在發(fā)布主題之后智能系統(tǒng)與技術(shù)指導(dǎo)書,教你零基礎(chǔ)動(dòng)手創(chuàng)建自主移動(dòng)機(jī)器人,我們將介紹如何訂閱主題。接下來的部分介紹訂閱主題的相關(guān)代碼。
er.py
免責(zé)聲明:本文系轉(zhuǎn)載自其它媒體,版權(quán)歸原作者所有;旨在傳遞信息,不代表本站的觀點(diǎn)、立場和對其真實(shí)性負(fù)責(zé)。如需轉(zhuǎn)載,請聯(lián)系原作者。如果來源標(biāo)注有誤或侵犯了您的合法權(quán)益等其他原因不想在本站發(fā)布,來信即刪。




