移動(dòng)機(jī)器人原理與技術(shù) 課件 第十章 移動(dòng)機(jī)器人ROS系統(tǒng)_第1頁(yè)
移動(dòng)機(jī)器人原理與技術(shù) 課件 第十章 移動(dòng)機(jī)器人ROS系統(tǒng)_第2頁(yè)
移動(dòng)機(jī)器人原理與技術(shù) 課件 第十章 移動(dòng)機(jī)器人ROS系統(tǒng)_第3頁(yè)
移動(dòng)機(jī)器人原理與技術(shù) 課件 第十章 移動(dòng)機(jī)器人ROS系統(tǒng)_第4頁(yè)
移動(dòng)機(jī)器人原理與技術(shù) 課件 第十章 移動(dòng)機(jī)器人ROS系統(tǒng)_第5頁(yè)
已閱讀5頁(yè),還剩136頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

移動(dòng)機(jī)器人技術(shù)原理與應(yīng)用第十章

移動(dòng)機(jī)器人ROS系統(tǒng)ROS總體框架ROS基本命令與功能包基于ROS的移動(dòng)機(jī)器人功能仿真10.1ROS系統(tǒng)安裝10.210.310.4ROS中移動(dòng)機(jī)器人技術(shù)相關(guān)應(yīng)用10.510.1

ROS系統(tǒng)安裝10.1.1Ubuntu系統(tǒng)簡(jiǎn)介及安裝ROS一般安裝在Linux系統(tǒng)下,Ubuntu是Linux中最為常用的系統(tǒng),絕大多數(shù)ROS系統(tǒng)安裝在Ubuntu系統(tǒng)中。Ubuntu是一個(gè)以桌面應(yīng)用為主的Linux操作系統(tǒng),提供了一個(gè)健壯、功能豐富的計(jì)算環(huán)境,既適合家庭使用又適用于商業(yè)環(huán)境。Ubuntu幾乎包含了所有常用的應(yīng)用軟件:文字處理、電子郵件、軟件開發(fā)工具和Web服務(wù)等。用戶下載、使用、分享Ubuntu系統(tǒng),以及獲得技術(shù)支持與服務(wù),無需支付任何許可費(fèi)用。10.1.1

Ubuntu系統(tǒng)簡(jiǎn)介及安裝Ubuntu系統(tǒng)的安裝對(duì)于電腦配置的要求并不嚴(yán)格,目前主流的PC都可以正常運(yùn)行。安裝系統(tǒng)的方式可以分為兩種,直接對(duì)硬盤分區(qū)后安裝和使用虛擬機(jī)安裝,對(duì)于對(duì)Ubuntu系統(tǒng)不是很了解的新手,推薦先使用虛擬機(jī)安裝Ubuntu,先進(jìn)行基礎(chǔ)的學(xué)習(xí),等對(duì)Ubuntu有足夠的認(rèn)識(shí)后進(jìn)行硬盤的安裝。接下來介紹如何通過虛擬機(jī)進(jìn)行Ubuntu系統(tǒng)的安裝:10.1.1

Ubuntu系統(tǒng)簡(jiǎn)介及安裝1.安裝虛擬機(jī),虛擬機(jī)推薦使用VMwareWorkstation,可以直接登錄VMware官方下載,逐步安裝即可。VMware打開界面10.1.1

Ubuntu系統(tǒng)簡(jiǎn)介及安裝2.Ubuntu系統(tǒng)鏡像可以直接在Ubuntu官網(wǎng)進(jìn)行系統(tǒng)鏡像的下載(/14.04/)。Ubuntu官網(wǎng)下載系統(tǒng)鏡像10.1.1

Ubuntu系統(tǒng)簡(jiǎn)介及安裝3.打開VMware軟件,點(diǎn)擊創(chuàng)建新的虛擬機(jī),選擇典型。新建虛擬機(jī)向?qū)?0.1.1

Ubuntu系統(tǒng)簡(jiǎn)介及安裝4.選擇稍后安裝系統(tǒng),創(chuàng)建一個(gè)空白硬盤。創(chuàng)建空白硬盤10.1.1

Ubuntu系統(tǒng)簡(jiǎn)介及安裝5.客戶機(jī)操作系統(tǒng)選擇Linux(L),版本為Ubuntu64位。選擇客戶機(jī)操作系統(tǒng)10.1.1

Ubuntu系統(tǒng)簡(jiǎn)介及安裝6.設(shè)置虛擬機(jī)名稱和安裝位置,然后點(diǎn)擊下一步。命名虛擬機(jī)10.1.1

Ubuntu系統(tǒng)簡(jiǎn)介及安裝7.設(shè)置虛擬機(jī)的磁盤大小,并設(shè)置為單個(gè)文件。設(shè)置虛擬機(jī)磁盤容量10.1.1

Ubuntu系統(tǒng)簡(jiǎn)介及安裝8.完成虛擬機(jī)創(chuàng)建。完成虛擬機(jī)的創(chuàng)建10.1.1

Ubuntu系統(tǒng)簡(jiǎn)介及安裝9.虛擬機(jī)設(shè)置。編輯虛擬機(jī)設(shè)置10.1.1

Ubuntu系統(tǒng)簡(jiǎn)介及安裝10.根據(jù)電腦配置,合理分配虛擬機(jī)的設(shè)置,內(nèi)存、處理器等。設(shè)置虛擬機(jī)的配置10.1.1

Ubuntu系統(tǒng)簡(jiǎn)介及安裝11.在CD/DVD中使用下載好的ISO鏡像文件。加載映像文件10.1.1

Ubuntu系統(tǒng)簡(jiǎn)介及安裝12.點(diǎn)擊開啟此虛擬機(jī),開始ubuntu的配置。開啟虛擬機(jī)10.1.1

Ubuntu系統(tǒng)簡(jiǎn)介及安裝13.選擇語(yǔ)言,點(diǎn)擊安裝ubuntu。選擇語(yǔ)言進(jìn)行安裝10.1.1

Ubuntu系統(tǒng)簡(jiǎn)介及安裝14.默認(rèn)進(jìn)行安裝。默認(rèn)進(jìn)行安裝10.1.1

Ubuntu系統(tǒng)簡(jiǎn)介及安裝15.選擇清除整個(gè)磁盤并安裝。清除磁盤進(jìn)行安裝10.1.1

Ubuntu系統(tǒng)簡(jiǎn)介及安裝16.按照默認(rèn)分配繼續(xù)安裝。按照默認(rèn)分盤進(jìn)行安裝10.1.1

Ubuntu系統(tǒng)簡(jiǎn)介及安裝17.選擇對(duì)應(yīng)的時(shí)區(qū)。選擇對(duì)應(yīng)的時(shí)區(qū)繼續(xù)安裝10.1.1

Ubuntu系統(tǒng)簡(jiǎn)介及安裝18.選擇漢語(yǔ)鍵盤布局。選擇漢語(yǔ)鍵盤布局10.1.1

Ubuntu系統(tǒng)簡(jiǎn)介及安裝19.設(shè)置用戶名和密碼。設(shè)置用戶名和密碼10.1.1

Ubuntu系統(tǒng)簡(jiǎn)介及安裝20.安裝結(jié)束,重新啟動(dòng)。系統(tǒng)界面10.1.2

不同Ubuntu版本與ROS版本Ubuntu版本和ROS版本對(duì)應(yīng)關(guān)系10.1.3

Ubuntu14.04中安裝ROSindigo版本按照Ubuntu和ROS版本的對(duì)應(yīng)關(guān)系安裝Indigo版本ROS的具體步驟如下:1.首先配置系統(tǒng)的軟件源,這樣,在安裝軟件時(shí)就可以直接使用國(guó)內(nèi)的軟件源了,本書選擇的是清華的軟件源,在設(shè)置中的軟件與更新界面進(jìn)行更換。10.1.3

Ubuntu14.04中安裝ROSindigo版本設(shè)置軟件源10.1.3

Ubuntu14.04中安裝ROSindigo版本2.添加軟件源到sources.list中;$sudosh-c'echo"deb/ros/ubuntu$(lsb_release-sc)main">/etc/apt/sources.list.d/ros-latest.list'3.設(shè)置密鑰;$sudoapt-keyadv--keyserver

'hkp://:80'--recv-keyC1CF6E31E6BADE8868B172B4F42ED6FBAB17C65410.1.3

Ubuntu14.04中安裝ROSindigo版本4.$sudoapt-getupdate更新軟件源;5.$sudoapt-getinstallros-indigo-desktop-full安裝ROS的Indigo完整版;6.初始化rosdep;$sudorosdepinit,$rosdepupdate7.設(shè)置環(huán)境變量;$echo"source/opt/ros/indigo/setup.bash">>~/.bashrc$source~/.bashrc經(jīng)以上操作,完成了ROSIndigo版本安裝,在終端輸入幾條命令調(diào)用小烏龜例子可以驗(yàn)證ROS的安裝。命令如下:10.1.3

Ubuntu14.04中安裝ROSindigo版本(1)在Terminal中輸入$roscore命令,該命令是初始化ROS環(huán)境,全局參數(shù),以及每個(gè)節(jié)點(diǎn)注冊(cè)等工作。roscore命令啟動(dòng)后的日志信息10.1.3

Ubuntu14.04中安裝ROSindigo版本(2)再打開一個(gè)Terminal,輸入rosrunturtlesimturtlesim

_node命令,開啟一個(gè)小烏龜界面。輸入命令啟動(dòng)小烏龜10.1.3

Ubuntu14.04中安裝ROSindigo版本(3)再打開一個(gè)Terminal,輸入$rosrunturtlesimturtle

_teleop_key命令。接受鍵盤輸入,控制小烏龜移動(dòng)。鍵盤按下上下左右按鍵,可看到控制小烏龜移動(dòng)通過鍵盤控制小烏龜運(yùn)動(dòng)10.2

ROS總體框架ROS架構(gòu)有三個(gè)層次:首先是基于Linux系統(tǒng)的OS層,ROS并不是一個(gè)傳統(tǒng)意義上的操作系統(tǒng),無法直接運(yùn)行在硬件上,需要依賴Linux、Windows等系統(tǒng),來實(shí)現(xiàn)自身的功能;實(shí)現(xiàn)ROS核心通信機(jī)制以及眾多機(jī)器人開發(fā)庫(kù)的中間層,采用了基于TCPROS/UDPROS的通信系統(tǒng),使用發(fā)布/訂閱、客戶端/服務(wù)端等模型,實(shí)現(xiàn)多種通信機(jī)制的數(shù)據(jù)傳輸;在ROSMaster的管理下保證功能節(jié)點(diǎn)的正常運(yùn)行的應(yīng)用層,ROS社區(qū)內(nèi)共享了大量的機(jī)器人應(yīng)用功能包,可實(shí)現(xiàn)復(fù)用,極大地提高了開發(fā)效率。10.2

ROS總體框架從系統(tǒng)實(shí)現(xiàn)角度將ROS劃分三個(gè)層次:計(jì)算圖、文件系統(tǒng)和開源社區(qū),涵蓋ROS中關(guān)鍵概念,如節(jié)點(diǎn)、消息、話題、服務(wù)、功能包、元功能包等。ROS的三個(gè)層次10.2.1

文件系統(tǒng)級(jí)ROS的文件系統(tǒng)結(jié)構(gòu)10.2.1

文件系統(tǒng)級(jí)ROS文件系統(tǒng)中兩個(gè)最基本的概念是Package和Manifest,即包和清單文件。1.Package是組織ROS代碼的最基本單位,每一個(gè)Package都可以包括庫(kù)文件、可執(zhí)行文件、腳本及其它一些文件。2.Manifest文件是對(duì)Package的相關(guān)信息的一個(gè)描述。他提供了Package之間的依賴性,以及一個(gè)包的元信息,比如版本、維護(hù)著和許可證等信息。ROS類似于操作系統(tǒng),將所有文件按照一定的規(guī)則進(jìn)行組織,而不同功能的文件被放置在不同的文件夾下。10.2.1

文件系統(tǒng)級(jí)功能包(Package):功能包是ROS軟件中的基本單元,包含ROS節(jié)點(diǎn)、庫(kù)、配置文件等。功能包清單(PackageManifest):每個(gè)功能包都包含名為package.xml的功能包清單,用于記錄功能包的基本信息,包含作者信息、許可信息、依賴選項(xiàng)、編譯標(biāo)志等。元功能包(MetaPackage):在新版的ROS中,將原有功能包集(Stack)的概念升級(jí)為“元功能包”,主要作用都是組織多個(gè)用于同一目的的功能包。例如一個(gè)ROS導(dǎo)航的元功能包中會(huì)包含建模、定位、導(dǎo)航等多個(gè)功能包。10.2.1

文件系統(tǒng)級(jí)元功能包清單:元功能包清單中可能會(huì)包含運(yùn)行時(shí)需要依賴的功能包或者聲明一些引用的標(biāo)簽。消息(Message)類型:消息是ROS節(jié)點(diǎn)之間發(fā)布/訂閱的通信信息,可以使用ROS提供的消息類型,也可以使用.msg文件在功能包的msg文件夾下自定義所需要的消息類型。10.2.1

文件系統(tǒng)級(jí)服務(wù)(Service)類型:服務(wù)類型定義了ROS客戶端/服務(wù)器通信模型下的請(qǐng)求與應(yīng)答數(shù)據(jù)類型,可以使用ROS系統(tǒng)提供的服務(wù)類型,也可以使用.srv文件在功能包的srv文件夾中進(jìn)行定義。代碼(Code):用來放置功能包節(jié)點(diǎn)源代碼的文件夾。10.2.2

計(jì)算圖級(jí)計(jì)算圖是ROS處理數(shù)據(jù)的一種點(diǎn)對(duì)點(diǎn)的網(wǎng)絡(luò)形式。程序運(yùn)行時(shí),所有進(jìn)程以及他們所進(jìn)行的數(shù)據(jù)處理,將會(huì)通過一種點(diǎn)對(duì)點(diǎn)的網(wǎng)絡(luò)形式表現(xiàn)出來。這一級(jí)主要包括幾個(gè)重要概念:節(jié)點(diǎn)(node)、消息(message)、主題(topic)、服務(wù)(service)。1.節(jié)點(diǎn)節(jié)點(diǎn)就是一些直行運(yùn)算任務(wù)的進(jìn)程。ROS利用規(guī)??稍鲩L(zhǎng)的方式是代碼模塊化:一個(gè)系統(tǒng)就是典型的由很多節(jié)點(diǎn)組成的。在這里,節(jié)點(diǎn)也可以被稱之為“軟件模塊”。我們使10.2.2

計(jì)算圖級(jí)用“節(jié)點(diǎn)”使得基于ROS的系統(tǒng)在運(yùn)行的時(shí)候更加形象化:當(dāng)許多節(jié)點(diǎn)同時(shí)運(yùn)行時(shí),可以很方便的將端對(duì)端的通訊繪制成一個(gè)圖表,在這個(gè)圖表中,進(jìn)程就是圖中的節(jié)點(diǎn),而端對(duì)端的連接關(guān)系就是其中弧線連接。2.消息節(jié)點(diǎn)之間通過傳送消息進(jìn)行通訊。每個(gè)消息都是一個(gè)嚴(yán)格的數(shù)據(jù)結(jié)構(gòu)。原來標(biāo)準(zhǔn)的數(shù)據(jù)類型(整型,浮點(diǎn)型,布爾型等等)都支持,也支持原始數(shù)組類型。消息可以包含任意的嵌套結(jié)構(gòu)和數(shù)組(很類似于C語(yǔ)言的結(jié)構(gòu)structs)。10.2.2

計(jì)算圖級(jí)3.話題消息以一種發(fā)布/訂閱的方式傳遞。一個(gè)節(jié)點(diǎn)可在一個(gè)給定的主題中發(fā)布消息。一個(gè)節(jié)點(diǎn)針對(duì)某個(gè)主題關(guān)注與訂閱特定類型的數(shù)據(jù)。可能同時(shí)有多個(gè)節(jié)點(diǎn)發(fā)布或者訂閱同一主題消息。總體上,發(fā)布者和訂閱者不了解彼此的存在。10.2.2

計(jì)算圖級(jí)話題通信示意圖3.話題10.2.2

計(jì)算圖級(jí)4.服務(wù)雖然基于話題的發(fā)布/訂閱模型是很靈活的通訊模式,但是它廣播式的路徑規(guī)劃對(duì)于可以簡(jiǎn)化節(jié)點(diǎn)設(shè)計(jì)的同步傳輸模式并不適合。在ROS中,稱這種同步傳輸為服務(wù),其基于客戶端/服務(wù)器模型。包含兩個(gè)部分的通信數(shù)據(jù)類型:一個(gè)用于請(qǐng)求,一個(gè)用于回應(yīng)。這類似于web服務(wù)器,web服務(wù)器是由URIs定義的,同時(shí)帶有完整定義類型的請(qǐng)求和回復(fù)文檔。需要注意的是,不像話題,ROS中只有一個(gè)節(jié)點(diǎn)可以以任意獨(dú)有的名字廣播一個(gè)服務(wù)。10.2.2

計(jì)算圖級(jí)4.服務(wù)服務(wù)通信示意圖10.2.2

計(jì)算圖級(jí)5.節(jié)點(diǎn)管理器需要有一個(gè)控制器可以使所有節(jié)點(diǎn)有條不紊的執(zhí)行,這就是一個(gè)ROS的控制器(ROSMaster)。ROSMaster通過RPC(RemoteProcedureCallProtocol,遠(yuǎn)程過程調(diào)用)提供了登記列表和對(duì)其他計(jì)算圖表的查找。幫助ROS節(jié)點(diǎn)之間互相查找、建立連接、提供參數(shù)服務(wù)器等功能。10.2.2

計(jì)算圖級(jí)5.節(jié)點(diǎn)管理器ROS的控制器給ROS的節(jié)點(diǎn)存儲(chǔ)了主題和服務(wù)的注冊(cè)信息。節(jié)點(diǎn)與控制器通信從而報(bào)告它們的注冊(cè)信息。當(dāng)這些節(jié)點(diǎn)與控制器通信的時(shí)候,它們可以接收關(guān)于其他以注冊(cè)及節(jié)點(diǎn)的信息并且建立與其它以注冊(cè)節(jié)點(diǎn)之間的聯(lián)系。當(dāng)這些注冊(cè)信息改變時(shí)控制器也會(huì)回饋這些節(jié)點(diǎn),同時(shí)允許節(jié)點(diǎn)動(dòng)態(tài)創(chuàng)建與新節(jié)點(diǎn)之間的連接。沒有控制器,節(jié)點(diǎn)將無法找到其他節(jié)點(diǎn),交換消息或調(diào)用服務(wù)。10.2.3

社區(qū)級(jí)發(fā)行版(Distribution):類似于Linux發(fā)行版,ROS發(fā)行版包括一系列帶有版本號(hào)、可以直接安裝的功能包,這使得ROS的軟件管理和安裝更加容易,而且可以通過軟件集合來維持統(tǒng)一的版本號(hào)。軟件源(Repository):ROS依賴于共享網(wǎng)絡(luò)上的開源代碼,不同組織結(jié)構(gòu)可以開發(fā)或者共享自己的機(jī)器人軟件。ROSwiki:記錄ROS信息文檔的主要論壇。所有人都可以注冊(cè)、登錄該論壇,并且上傳自己的開發(fā)文檔、進(jìn)行更新、編寫教程。10.2.3

社區(qū)級(jí)郵件列表(MailingList):ROS郵件列表是交流ROS更新的主要渠道,同時(shí)也可以交流ROS開發(fā)的各種疑問。ROSAnswers:ROSAnswers是一個(gè)咨詢ROS相關(guān)問題的網(wǎng)站,用戶可以在該網(wǎng)站提交自己的問題并得到其他開發(fā)者的問答。博客(Blog):發(fā)布ROS社區(qū)中的新聞、圖片、視頻(/news)。10.3

ROS基本命令與功能包10.3.1ROS文件系統(tǒng)命令1.rospack允許您獲取有關(guān)軟件包的信息用$rospackfind[package_name]命令返回包的絕對(duì)路徑2.roscd是rosbash套件中的一部分,利用它可以改變路徑到指定的功能包或功能包集中,命令形式為$roscd[locationname[/subdir]]。3.rosls也是rosbash套件的一部分,它可以通過功能包的名稱列出其下面包含的文件,而不必使用絕對(duì)路徑;10.3.1

ROS文件系統(tǒng)命令$rosls[locationname[/subdir]]4.Tab鍵補(bǔ)全;輸入完整的軟件包名稱可能很麻煩。ROS工具支持在輸入功能包開頭后TAB鍵完成補(bǔ)全。10.3.2Topic相關(guān)操作命令rostopic工具允許獲取ROStopics的相關(guān)信息。鍵入rostopic-h,可以知道話題相關(guān)的如下命令:rostopicbw顯示話題使用的帶寬、rostopicdelay顯示話題的延遲、rostopicecho顯示話題的數(shù)據(jù)、rostopicfind查找指定話題10.3.2

Topic相關(guān)操作命令類型的話題、rostopichz顯示話題發(fā)布頻率、rostopicinfo顯示活動(dòng)話題信息、rostopiclist列出活動(dòng)話題、rostopicpub向話題發(fā)布數(shù)據(jù)、rostopictype顯示話題類型。1.rostopicecho顯示發(fā)布在一個(gè)話題上的數(shù)據(jù)??梢岳?rostopicecho[topic]命令看一下由turtle_teleop_key發(fā)布的command_velocity數(shù)據(jù)。$rostopicecho/turtle1/cmd_vel則是通過鍵盤操控小烏龜進(jìn)行移動(dòng),通過按下方向鍵來使turtle_teleop_key節(jié)點(diǎn)在此topic上發(fā)布數(shù)據(jù)。10.3.2

Topic相關(guān)操作命令1.rostopicecho顯示發(fā)布在一個(gè)話題上的數(shù)據(jù)。rostopicecho顯示話題數(shù)據(jù)10.3.2

Topic相關(guān)操作命令2.rostopiclist命令顯示當(dāng)前被訂閱和被發(fā)布主題列表?yè)?jù)。rostopiclist顯示話題10.3.2

Topic相關(guān)操作命令3.rostopictype返回正在使用的主題上的信息的類型。命令格式為$rostopictype[topic],使用$rostopictype/turtle1/cmd_vel命令查看小烏龜話題的信息類型。rostopictype返回的小烏龜話題信息類型10.3.2

Topic相關(guān)操作命令4.rostopicpub直接發(fā)布數(shù)據(jù)到一個(gè)話題通過$rostopicpub[topic][msg_type][args]命令向小烏龜話題發(fā)送一個(gè)運(yùn)動(dòng)指令,具體形式為$rostopicpub-1/turtle1/cmd_velgeometry_msgs/Twist--'[2.0,0.0,0.0]''[0.0,0.0,1.8]'。10.3.2

Topic相關(guān)操作命令4.rostopicpub直接發(fā)布數(shù)據(jù)到一個(gè)話題通過$rostopicpub[topic][msg_type][args]命令向小烏龜話題發(fā)送一個(gè)運(yùn)動(dòng)指令,$rostopicpub-1/turtle1/cmd_velgeometry_msgs/Twist--'[2.0,0.0,0.0]''[0.0,0.0,1.8]'。小烏龜按照rostopicpub發(fā)送的運(yùn)動(dòng)指令運(yùn)動(dòng)10.3.3

Service相關(guān)操作命令Service相關(guān)操作命令有rosservicelist顯示活動(dòng)的服務(wù)信息、rosserviceinfo顯示指定服務(wù)的信息、rosservicetype顯示服務(wù)類型、rosservicefind查找指定服務(wù)類型的服務(wù)、rosserviceuri顯示ROSRPCURI服務(wù)、rosserviceargs顯示服務(wù)參數(shù)、rosservicecall用輸入的參數(shù)請(qǐng)求服務(wù)。10.3.3

Service相關(guān)操作命令1.rosservicelist顯示活動(dòng)中的服務(wù)的信息rosservicelist會(huì)顯示在同一網(wǎng)絡(luò)中使用的所有服務(wù)。rosservicelist顯示活動(dòng)中的服務(wù)的信息10.3.3

Service相關(guān)操作命令2.rosserviceinfo顯示指定服務(wù)的信息命令形式Wie$rosserviceinfo[服務(wù)名稱],以下是使用rosservice的info選項(xiàng)查看/turtle1/set_pen服務(wù)的節(jié)點(diǎn)名稱、URI、類型和參數(shù)的示例。rosserviceinfo顯示指定服務(wù)的信息10.3.3

Service相關(guān)操作命令3.rosservicetype顯示服務(wù)類型命令形式$rosservicetype[服務(wù)名稱],可以看到/turtle1/set_pen服務(wù)是turtlesim/SetPen類型。rosservicetype顯示服務(wù)類型10.3.4

catkin程序包所有的ROS程序都被組織成功能包,存放在稱之為工作空間的目錄下。工作空間是一個(gè)存放工程開發(fā)相關(guān)文件的文件夾,典型的工作空間一般包括以下四個(gè)目錄空間:src:代碼空間,用來存儲(chǔ)所有的ROS功能包的源碼文件。build:編譯空間,用來存儲(chǔ)工作空間編譯過程中生成的緩存信息等;devel:開發(fā)空間,放置編譯生成的可執(zhí)行文件。install:安裝空間。在寫程序之前第一步是創(chuàng)建一個(gè)工作空間以容納功能包。10.3.4

catkin程序包1.創(chuàng)建工作空間目錄,然后運(yùn)行ROS工作空間初始化命令即可完成工作空間的創(chuàng)建。代碼如下:$mkdir-p~/catkin_ws/src$cd~/catkin_ws/src$catkin_init_workspace2.創(chuàng)建完成后,需要在工作空間根目錄下用catkin_make命令進(jìn)行編譯;代碼如下:$cd~/catkin_ws/$catkin_make10.3.4

catkin程序包3.設(shè)置環(huán)境變量用$sourcedevel/setup.bash設(shè)置環(huán)境變量。4.檢查環(huán)境變量用$echo$ROS_PACKAGE_PATH檢查環(huán)境變量。至此,工作空間就創(chuàng)建成功了,接下來就開始創(chuàng)建catkin功能包,一個(gè)catkin功能包的組成如下:該功能包必須包含catkincompliantpackage.xml文件,這個(gè)package.xml文件提供有關(guān)程序包的元信息。10.3.4

catkin程序包該功能包也必須包含一個(gè)catkin版本的CMakeLists.txt文件,而Catkinmetapackages中必須包含一個(gè)對(duì)CMakeList.txt文件的引用。每個(gè)目錄下只能有一個(gè)程序包,這意味著在同一個(gè)目錄下不能有嵌套的或者多個(gè)程序包存在。最簡(jiǎn)單的功能包的形式如下:my_package/CMakeLists.txtpackage.xml10.3.4

catkin程序包ROS提供直接創(chuàng)建功能包的命令catkin_creat_pkg,首先進(jìn)入代碼空間,使用catkin_creat_pkg命令創(chuàng)建功能包:$cd~/catkin_ws/src$catkin_create_pkg<package_name>[depend1][depend2][depend3]用戶需要輸入功能包的名稱(package_name)和所依賴的其他功能包的名稱[depend1][depend2][depend3]。10.3.4

catkin程序包創(chuàng)建完成后,再返回到工作空間根目錄下進(jìn)行編譯,并且設(shè)置環(huán)境變量,代碼如下:$cd~/catkin_ws/$catkin_make$source~/catkin_ws/devel/setup.bash這樣就成功創(chuàng)建了工作空間并在工作空間中創(chuàng)建了功能包。10.3.5

基于TurtleBot的移動(dòng)機(jī)器人ROS基本設(shè)置TurtleBot是給入門級(jí)的移動(dòng)機(jī)器人愛好者或從事移動(dòng)機(jī)器人編程開發(fā)者提供一個(gè)基礎(chǔ)移動(dòng)平臺(tái),是ROS中最為重要的機(jī)器人之一,可以在ROS社區(qū)中獲得大量關(guān)于TurtleBot的相關(guān)資源,很多功能包都能直接復(fù)用到個(gè)人自己開發(fā)的移動(dòng)機(jī)器人平臺(tái)上。TurtleBot移動(dòng)平臺(tái)主要包括kobuki移動(dòng)底座以及Kinect2視覺傳感器,kobuki移動(dòng)底座作為移動(dòng)機(jī)器人下位機(jī),使用者自己配置的PC機(jī)作為上位機(jī)。ROS系統(tǒng)安裝在上位機(jī)上。10.3.5

基于TurtleBot的移動(dòng)機(jī)器人ROS基本設(shè)置在ROS中使用Turtlebot,需要在安裝了ROS的上位機(jī)上安裝Turtlebot相關(guān)的所有功能包,打開終端,運(yùn)行如下命令進(jìn)行安裝:1.更新功能包列表運(yùn)行$sudoapt-getupdate命令。2.安裝所有功能包運(yùn)行$sudoapt-getinstallros-indigo-turtlebotros-indigo-turtlebot-appsros-indigo-turtlebot-interactionsros-indigo-turtlebot-simulatorros-indigo-kobuki-ftdiros-indigo-rocon10.3.5

基于TurtleBot的移動(dòng)機(jī)器人ROS基本設(shè)置-remoconros-indigo-rocon-qt-libraryros-indigo-ar-track-alvar-msgs命令。將TurtleBot本體通過USB串口與安裝了ROS以及TurtleBot功能包的上位機(jī)進(jìn)行連接,在上位機(jī)中通過ROS遙控TurtleBot進(jìn)行移動(dòng)。具體步驟如下:(1)打開一個(gè)新終端,鍵入$roscore,啟動(dòng)ROS;(2)按下Turtlebot啟動(dòng)開關(guān),狀態(tài)點(diǎn)亮;10.3.5

基于TurtleBot的移動(dòng)機(jī)器人ROS基本設(shè)置(3)建立Turtlebot與上位機(jī)的聯(lián)系,在上位機(jī)打開一個(gè)新終端,運(yùn)行如下命令:$roslaunchturtlebot_bringupminimal.launch;(4)啟動(dòng)鍵盤遙控節(jié)點(diǎn),在上位機(jī)打開另一個(gè)新終端,運(yùn)行如下命令:$roslaunchturtlebot_teleopkeyboard_teleop.launch;(5)按下鍵盤“i”前進(jìn),實(shí)現(xiàn)對(duì)移動(dòng)機(jī)器人的基本操控。10.4

基于ROS的移動(dòng)機(jī)器人功能仿真10.4.1建立仿真環(huán)境在上位機(jī)上,打開終端,輸入$gazebo打開gazebo;進(jìn)入gazebo后使用快捷鍵Ctrl+B或者菜單欄選擇Edit->buildingeditor,進(jìn)入創(chuàng)建建筑的界面10-36,可以選擇簡(jiǎn)單的墻和窗戶和門。點(diǎn)擊左上角菜單欄file->save然后點(diǎn)擊Exitbuildingeditor進(jìn)入gazebo主界面,然后繼續(xù)點(diǎn)擊file->saveworldas保存的.world文件后面要使用,到這里,gazebo的仿真環(huán)境搭建完成。10.4.1

建立仿真環(huán)境建立仿真環(huán)境10.4.2

地圖創(chuàng)建與自主導(dǎo)航ROS開源社區(qū)中匯集了多種SLAM算法,可以直接使用或者進(jìn)行二次開發(fā),其中最為常用和成熟的是gmapping功能包。gmapping功能包訂閱機(jī)器人采集的深度信息、IMU信息和里程計(jì)信息,同時(shí)完成一些必要的參數(shù)配置,即可創(chuàng)建并輸出基于概率的二維柵格地圖。在建立的仿真環(huán)境中通過gampping功能包進(jìn)行建圖,建圖部分的仿真流程如下:1.通過如下命令安裝gmapping功能包:$sudoapt-getinstallros-indigo-gmapping10.4.2

地圖創(chuàng)建與自主導(dǎo)航2.創(chuàng)建mrobot_gazebo功能包,里面包含world文件夾存放創(chuàng)建的仿真環(huán)境文件,urdf文件夾存放機(jī)器人模型文件,launch文件夾存放節(jié)點(diǎn)啟動(dòng)文件。3.搭建移動(dòng)機(jī)器人的仿真模型,首先搭建一個(gè)移動(dòng)機(jī)器人底盤模型,將該底盤模型文件命名為mrobot_body.urdf.xacro,它定義了該移動(dòng)機(jī)器人底盤的各個(gè)關(guān)節(jié)如輪子,電機(jī)等,同時(shí)也設(shè)定了它們的運(yùn)行轉(zhuǎn)速、轉(zhuǎn)角等參數(shù)。10.4.2

地圖創(chuàng)建與自主導(dǎo)航移動(dòng)機(jī)器人底盤模型10.4.2

地圖創(chuàng)建與自主導(dǎo)航4.為移動(dòng)機(jī)器人底盤安裝仿真的激光雷達(dá),用于gmapping建圖,激光雷達(dá)的模型文件為rplidar.xacro。5.將激光雷達(dá)模型與移動(dòng)機(jī)器人底盤模型搭建在一起,將安裝了激光雷達(dá)的移動(dòng)機(jī)器人模型文件命名為mrobot_with_rplidar.urdf.xacro。6.通過mbot_laser_nav_gazebo.launch文件啟動(dòng)仿真環(huán)境,實(shí)現(xiàn)在gazebo中加載搭建的仿真環(huán)境以及移動(dòng)機(jī)器人模型,mbot_laser_nav_gazebo.launch文件內(nèi)容如下:<launch>10.4.2

地圖創(chuàng)建與自主導(dǎo)航<!--設(shè)置launch文件的參數(shù)--><argname="world_name"value="$(findmrobot_gazebo)/worlds/cloister.world"/><argname="paused"default="false"/><argname="use_sim_time"default="true"/><argname="gui"default="true"/><argname="headless"default="false"/><argname="debug"default="false"/>10.4.2

地圖創(chuàng)建與自主導(dǎo)航<!--運(yùn)行g(shù)azebo仿真環(huán)境--><includefile="$(findgazebo_ros)/launch/empty_world.launch"><argname="world_name"value="$(argworld_name)"/><argname="debug"value="$(argdebug)"/><argname="gui"value="$(arggui)"/><argname="paused"value="$(argpaused)"/><argname="use_sim_time"value="$(arg10.4.2

地圖創(chuàng)建與自主導(dǎo)航use_sim_time)"/><argname="headless"value="$(argheadless)"/></include><!--加載機(jī)器人模型描述參數(shù)--><paramname="robot_description"command="$(findxacro)/xacro--inorder'$(findmrobot_gazebo)/urdf/mrobot_with_rplidar.urdf.xacro'"/><!--運(yùn)行joint_state_publisher節(jié)點(diǎn),發(fā)布機(jī)器人的關(guān)節(jié)10.4.2

地圖創(chuàng)建與自主導(dǎo)航狀態(tài)--><nodename="joint_state_publisher"pkg="joint_state_publisher"type="joint_state_publisher"></node><!--運(yùn)行robot_state_publisher節(jié)點(diǎn),發(fā)布tf--><nodename="robot_state_publisher"pkg="robot_state_publisher"type="robot_state_publisher"output="screen"><paramname="publish_frequency"type="double"10.4.2

地圖創(chuàng)建與自主導(dǎo)航value="50.0"/></node><!--在gazebo中加載機(jī)器人模型--><nodename="urdf_spawner"pkg="gazebo_ros"type="spawn_model"respawn="false"output="screen"args="-urdf-modelmrobot-paramrobot_description"/></launch>代碼中的cloister.world就是上一節(jié)創(chuàng)建的仿真環(huán)境。10.4.2

地圖創(chuàng)建與自主導(dǎo)航使用$roslaunchmbot_gazebombot_laser_nav_gazebo.launch命令運(yùn)行以上launch文件,啟動(dòng)gazebo仿真環(huán)境。gazebo中顯示移動(dòng)機(jī)器人模型10.4.2

地圖創(chuàng)建與自主導(dǎo)航8.調(diào)用gampping進(jìn)行建圖。首先編寫gmapping功能包的啟動(dòng)文件gmapping.launch,該launch文件中設(shè)置了功能包的節(jié)點(diǎn)以及gmapping建圖的配置參數(shù)。9.打開一個(gè)新的終端,通過運(yùn)行g(shù)mapping_demo.launch文件,啟動(dòng)上面創(chuàng)建的gampping節(jié)點(diǎn)并啟動(dòng)rviz查看傳感器和地圖構(gòu)建的實(shí)時(shí)信息。gmapping_demo.launch文件內(nèi)容如下:<launch>10.4.2

地圖創(chuàng)建與自主導(dǎo)航<includefile="$(findmbot_gazebo)/launch/gmapping.launch"/><!--啟動(dòng)rviz--><nodepkg="rviz"type="rviz"name="rviz"args="-d$(findmbot_gazebo)/rviz/gmapping.rviz"/></launch>通過命令$roslaunchmbot_gazebogmapping_demo.launch運(yùn)行以上的launch文件,啟動(dòng)gmapping節(jié)點(diǎn)和rviz界面。10.4.2

地圖創(chuàng)建與自主導(dǎo)航地圖構(gòu)建的實(shí)時(shí)信息10.4.2

地圖創(chuàng)建與自主導(dǎo)航運(yùn)行到這里后gazebo和rviz就都已經(jīng)啟動(dòng)了,移動(dòng)機(jī)器人模型在gazebo和rivz中同步顯示,rviz中實(shí)時(shí)顯示移動(dòng)機(jī)器人搭載的雷達(dá)在仿真環(huán)境中掃描建圖效果,其中紅色的點(diǎn)是激光雷達(dá)傳感器實(shí)時(shí)檢測(cè)到的仿真環(huán)境的深度信息,淺灰色區(qū)域?yàn)楦鶕?jù)當(dāng)前深度信息建立的部分環(huán)境地圖。10.4.2

地圖創(chuàng)建與自主導(dǎo)航

10.啟動(dòng)鍵盤控制節(jié)點(diǎn),打開一個(gè)新終端,運(yùn)行mbot_teleop.launch文件。mbot_teleop.launch文件內(nèi)容如下:<launch><nodename="mrobot_teleop"pkg="mrobot_teleop"type="mrobot_teleop.py"output="screen"><paramname="scale_linear"value="0.1"type="double"/><paramname="scale_angular"value="0.4"10.4.2

地圖創(chuàng)建與自主導(dǎo)航

type="double"/></node></launch>通過如下命令啟動(dòng)以上launch文件,打開鍵盤控制節(jié)點(diǎn):$roslaunchmbot_gazebombot_teleop.launch可以看到文件提示,通過鍵盤"u、i、o、j、k、l、m"這九個(gè)按鈕來控制移動(dòng)機(jī)器人的運(yùn)動(dòng),掃描出的完整地圖10.4.2

地圖創(chuàng)建與自主導(dǎo)航gmapping中通過鍵盤完整的掃描地圖10.4.2

地圖創(chuàng)建與自主導(dǎo)航

11.通過使用鍵盤控制移動(dòng)機(jī)器人運(yùn)動(dòng),繞房間模型一周??梢酝ㄟ^$rosrunmap_servermap_saver-fhouse_gmapping命令,保存地圖.pgm文件和.yaml文件。命令最后這里cloister_gmapping為自己命名的文件名。通過命令生成的地圖10.4.2

地圖創(chuàng)建與自主導(dǎo)航

在gazebo中實(shí)現(xiàn)自主導(dǎo)航仿真的整體思路:首先啟動(dòng)gazebo仿真環(huán)境,然后啟動(dòng)move_base導(dǎo)航功能節(jié)點(diǎn),仿真流程如下:(1)通過下列命令安裝導(dǎo)航功能包。$sudoapt-getinstallros-indigio-navigation(2)創(chuàng)建mrobot_navigation功能包,里面包含map文件夾存放上一節(jié)gmapping構(gòu)建的地圖,launch文件夾存放導(dǎo)航節(jié)點(diǎn)啟動(dòng)文件,config文件夾存放代價(jià)地圖配置文件;10.4.2

地圖創(chuàng)建與自主導(dǎo)航

(3)啟動(dòng)gazebo仿真環(huán)境和之前使用激光雷達(dá)建圖的仿真環(huán)境相同,所以依然使用mbot_laser_nav_gazebo.launch文件啟動(dòng)仿真環(huán)境:$roslaunchmbot_gazebombot_laser_nav_gazebo.launch(4)接下來通過代價(jià)地圖配置文件創(chuàng)建move_base導(dǎo)航節(jié)點(diǎn)啟動(dòng)文件move_base.launch,代價(jià)地圖配置文件內(nèi)容如下:10.4.2

地圖創(chuàng)建與自主導(dǎo)航

1)通用配置文件costmap_common_params.yamlobstacle_range:2.5raytrace_range:3.0#footprint:[[0.175,0.175],[0.175,-0.175],[-0.175,-0.175],[-0.175,0.175]]#footprint_inflation:0.01robot_radius:0.175inflation_radius:0.1max_obstacle_height:0.610.4.2

地圖創(chuàng)建與自主導(dǎo)航

min_obstacle_height:0.0observation_sources:scanscan:{data_type:LaserScan,topic:/scan,marking:true,clearing:true,expected_update_rate:0}2)全局規(guī)劃配置文件global_costmap_params.yamlglobal_costmap:global_frame:maprobot_base_frame:base_footprintupdate_frequency:1.010.4.2

地圖創(chuàng)建與自主導(dǎo)航

publish_frequency:1.0static_map:truerolling_window:falseresolution:0.01transform_tolerance:1.0map_type:costmap3)本地規(guī)劃配置文件local_costmap_params.yamllocal_costmap:global_frame:map10.4.2

地圖創(chuàng)建與自主導(dǎo)航

robot_base_frame:base_footprintupdate_frequency:3.0publish_frequency:1.0static_map:truerolling_window:falsewidth:6.0height:6.0resolution:0.01transform_tolerance:1.010.4.2

地圖創(chuàng)建與自主導(dǎo)航4)本地規(guī)劃期配置文件base_local_planner_params.yamlcontroller_frequency:3.0recovery_behavior_enabled:falseclearing_rotation_allowed:falseTrajectoryPlannerROS:max_vel_x:0.5min_vel_x:0.1max_vel_y:0.0#zeroforadifferentialdriverobotmin_vel_y:0.010.4.2

地圖創(chuàng)建與自主導(dǎo)航

max_vel_theta:1.0min_vel_theta:-1.0min_in_place_vel_theta:0.4escape_vel:-0.1acc_lim_x:1.5acc_lim_y:0.0#zeroforadifferentialdriverobotacc_lim_theta:1.2holonomic_robot:false10.4.2

地圖創(chuàng)建與自主導(dǎo)航

yaw_goal_tolerance:0.1#about6degreesxy_goal_tolerance:0.05#5cmlatch_xy_goal_tolerance:falsepdist_scale:0.4gdist_scale:0.8meter_scoring:trueheading_lookahead:0.325heading_scoring:false10.4.2

地圖創(chuàng)建與自主導(dǎo)航

heading_scoring_timestep:0.8occdist_scale:0.05oscillation_reset_dist:0.05publish_cost_grid_pc:falseprune_plan:truesim_time:1.0sim_granularity:0.05angular_sim_granularity:0.110.4.2

地圖創(chuàng)建與自主導(dǎo)航

vx_samples:8vy_samples:0#zeroforadifferentialdriverobotvtheta_samples:20dwa:truesimple_attractor:false接下來根據(jù)這四個(gè)代價(jià)地圖配置文件構(gòu)建move_base.launch文件內(nèi)容如下:<launch>10.4.2

地圖創(chuàng)建與自主導(dǎo)航<nodepkg="move_base"type="move_base"respawn="false"name="move_base"output="screen"clear_params="true"><rosparamfile="$(findmrobot_navigation)/config/mrobot/costmap_common_params.yaml"command="load"ns="global_costmap"/><rosparamfile="$(findmrobot_navigation)/config/mrobot/costmap_common_params.yaml"command="load"ns="local_costmap"/>10.4.2

地圖創(chuàng)建與自主導(dǎo)航<rosparamfile="$(findmrobot_navigation)/config/mrobot/local_costmap_params.yaml"command="load"/><rosparamfile="$(findmrobot_navigation)/config/mrobot/global_costmap_params.yaml"command="load"/><rosparamfile="$(findmrobot_navigation)/config/mrobot/base_local_planner_params.yaml"command="load"/>10.4.2

地圖創(chuàng)建與自主導(dǎo)航</node>

</launch>5)仿真環(huán)境和move_base導(dǎo)航節(jié)點(diǎn)都配置好后,創(chuàng)建一個(gè)啟動(dòng)move_base導(dǎo)航節(jié)點(diǎn)并加載環(huán)境地圖的的launch文件fake_nav_cloister_demo.launch,fake_nav_cloister_demo.launch文件內(nèi)容如下:<launch>10.4.2

地圖創(chuàng)建與自主導(dǎo)航

<!--設(shè)置地圖的配置文件--><argname="map"default="cloister_gmapping.yaml"/><!--運(yùn)行地圖服務(wù)器,并且加載設(shè)置的地圖--><nodename="map_server"pkg="map_server"type="map_server"args="$(findmrobot_navigation)/maps/$(argmap)"/>10.4.2

地圖創(chuàng)建與自主導(dǎo)航

<!--運(yùn)行move_base節(jié)點(diǎn)--><includefile="$(findmrobot_navigation)/launch/move_base.launch"/><!--運(yùn)行虛擬定位,兼容AMCL輸出--><nodepkg="fake_localization"type="fake_localization"name="fake_localization"output="screen"/>10.4.2

地圖創(chuàng)建與自主導(dǎo)航

<!--對(duì)于虛擬定位,需要設(shè)置一個(gè)/odom與/map之間的靜態(tài)坐標(biāo)變換--><nodepkg="tf"type="static_transform_publisher"name="map_odom_broadcaster"args="000000/map/odom100"/><!--運(yùn)行rviz--><nodepkg="rviz"type="rviz"name="rviz"args="-d$(findmrobot_navigation)/rviz/nav.rviz"/></launch>10.4.2

地圖創(chuàng)建與自主導(dǎo)航

通過命令$roslaunchmbot_navigationfake_nav_cloister_demo.launch啟動(dòng)launch文件,導(dǎo)航結(jié)果圖如圖:根據(jù)目標(biāo)點(diǎn)自動(dòng)導(dǎo)航10.5

ROS中移動(dòng)機(jī)器人技術(shù)相關(guān)應(yīng)用10.5.1開源機(jī)器視覺技術(shù)在ROS中的應(yīng)用OpenCV是一個(gè)基于許可(開源)發(fā)行的跨平臺(tái)計(jì)算機(jī)視覺和機(jī)器學(xué)習(xí)軟件庫(kù),可以運(yùn)行在Linux、Windows、Android和MacOS操作系統(tǒng)上。它由一系列C函數(shù)和少量C++類構(gòu)成,同時(shí)提供了Python、Ruby、MATLAB等語(yǔ)言的接口,實(shí)現(xiàn)了圖像處理和計(jì)算機(jī)視覺方面的很多通用算法,OpenCV主要傾向于實(shí)時(shí)視覺應(yīng)用,并在可用時(shí)利用MMX和SSE指令,也提供對(duì)于C#、Ch、Ruby、GO的支持。10.5.1

開源機(jī)器視覺技術(shù)在ROS中的應(yīng)用OpenCV提供的視覺處理算法非常豐富,加上其開源的特性,處理得當(dāng),不需要添加新的外部支持也可以完整的編譯鏈接生成執(zhí)行程序,所以很多人用它來做算法的移植,OpenCV的代碼經(jīng)過適當(dāng)改寫可以正常的運(yùn)行在ARM嵌入式系統(tǒng)中。在ubuntu下安裝ubuntu版本的opencv,就可以在ROS中使用了。OpenCV已經(jīng)集成了人臉識(shí)別算法,只需要調(diào)用OpenCV相應(yīng)的接口就可以實(shí)現(xiàn)人臉識(shí)別的功能。下面運(yùn)行以下人臉識(shí)別的例程感受以下它的效果。10.5.1

開源機(jī)器視覺技術(shù)在ROS中的應(yīng)用1.創(chuàng)建robot_vision功能包,里面包含scripts文件夾存放圖像處理所需的python文件,launch文件夾存放節(jié)點(diǎn)啟動(dòng)文件;2.首先使用以下命令啟動(dòng)USB攝像頭或者是筆記本自帶的攝像頭:$roslaunchrobot_visionusb_cam.launch其中usb_cam.launch文件內(nèi)容如下:<launch>10.5.1

開源機(jī)器視覺技術(shù)在ROS中的應(yīng)用<nodename="usb_cam"pkg="usb_cam"type="usb_cam_node"output="screen"><paramname="video_device"value="/dev/video0"/><paramname="image_width"value="640"/><paramname="image_height"value="480"/><paramname="pixel_format"value="yuyv"/><paramname="camera_frame_id"value="usb_cam"/><paramname="io_method"value="mmap"/>10.5.1

開源機(jī)器視覺技術(shù)在ROS中的應(yīng)用</node></launch>3.啟動(dòng)好相機(jī)后,然后編寫源碼來實(shí)現(xiàn)人臉識(shí)別,該應(yīng)用的實(shí)現(xiàn)代碼只有一個(gè)python文件,即運(yùn)行face_detector.py,直接調(diào)用OpenCV提供的人臉識(shí)別接口,與數(shù)據(jù)庫(kù)中的人臉特征進(jìn)行匹配。(1)face_detector.py文件內(nèi)容如下:10.5.1

開源機(jī)器視覺技術(shù)在ROS中的應(yīng)用#!/usr/bin/envpython#-*-coding:utf-8-*-importrospyimportcv2importnumpyasnpfromsensor_msgs.msgimportImage,RegionOfInterestfromcv_bridgeimportCvBridge,CvBridgeErrorclassfaceDetector:10.5.1

開源機(jī)器視覺技術(shù)在ROS中的應(yīng)用def__init__(self):rospy.on_shutdown(self.cleanup);#創(chuàng)建cv_bridgeself.bridge=CvBridge()self.image_pub=rospy.Publisher("cv_bridge_image",Image,queue_size=1)#獲取haar特征的級(jí)聯(lián)表的XML文件,文件路徑在10.5.1

開源機(jī)器視覺技術(shù)在ROS中的應(yīng)用launch文件中傳入cascade_1=rospy.get_param("~cascade_1","")cascade_2=rospy.get_param("~cascade_2","")#使用級(jí)聯(lián)表初始化haar特征檢測(cè)器self.cascade_1=cv2.CascadeClassifier(cascade_1)self.cascade_2=cv2.CascadeClassifier(cascade_2)#設(shè)置級(jí)聯(lián)表的參數(shù),優(yōu)化人臉識(shí)別,可以在launch10.5.1

開源機(jī)器視覺技術(shù)在ROS中的應(yīng)用文件中重新配置self.haar_scaleFactor=rospy.get_param("~haar_scaleFactor",1.2)self.haar_minNeighbors=rospy.get_param("~haar_minNeighbors",2)self.haar_minSize=rospy.get_param("~haar_minSize",40)self.haar_maxSize=rospy.get_param("~haar_maxSize",60)10.5.1

開源機(jī)器視覺技術(shù)在ROS中的應(yīng)用self.color=(50,255,50)#初始化訂閱rgb格式圖像數(shù)據(jù)的訂閱者,此處圖像topic的話題名可以在launch文件中重映射self.image_sub=rospy.Subscriber("input_rgb_image",Image,self.image_callback,queue_size=1)defimage_callback(self,data):10.5.1

開源機(jī)器視覺技術(shù)在ROS中的應(yīng)用#使用cv_bridge將ROS的圖像數(shù)據(jù)轉(zhuǎn)換成OpenCV的圖像格式try:cv_image=self.bridge.imgmsg_to_cv2(data,"bgr8")frame=np.array(cv_image,dtype=np.uint8)exceptCvBridgeError,e:printe10.5.1

開源機(jī)器視覺技術(shù)在ROS中的應(yīng)用#創(chuàng)建灰度圖像grey_image=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)#創(chuàng)建平衡直方圖,減少光線影響grey_image=cv2.equalizeHist(grey_image)#嘗試檢測(cè)人臉faces_result=self.detect_face(grey_image)10.5.1

開源機(jī)器視覺技術(shù)在ROS中的應(yīng)用#在opencv的窗口中框出所有人臉區(qū)域iflen(faces_result)>0:forfaceinfaces_result:x,y,w,h=facecv2.rectangle(cv_image,(x,y),(x+w,y+h),self.color,2)#將識(shí)別后的圖像轉(zhuǎn)換成ROS消息并發(fā)布10.5.1

開源機(jī)器視覺技術(shù)在ROS中的應(yīng)用self.image_pub.publish(self.bridge.cv2_to_imgmsg(cv_image,"bgr8"))defdetect_face(self,input_image):#首先匹配正面人臉的模型ifself.cascade_1:faces=self.cascade_1.detectMultiScale(input_image,self.haar_scaleFactor,10.5.1

開源機(jī)器視覺技術(shù)在ROS中的應(yīng)用self.haar_minNeighbors,cv2.CASCADE_SCALE_IMAGE,(self.haar_minSize,self.haar_maxSize))

#如果正面人臉匹配失敗,那么就嘗試匹配側(cè)面人臉的模型iflen(faces)==0andself.cascade_2:faces=self.cascade_2.detectMultiScale(input_image,10.5.1

開源機(jī)器視覺技術(shù)在ROS中的應(yīng)用self.haar_scaleFactor,self.haar_minNeighbors,cv2.CASCADE_SCALE_IMAGE,(self.haar_minSize,self.haar_maxSize))

returnfacesdefcleanup(self):print"Shuttingdownvisionnode."10.5.1

開源機(jī)器視覺技術(shù)在ROS中的應(yīng)用cv2.destroyAllWindows()if__name__=='__main__':try:#初始化ros節(jié)點(diǎn)rospy.init_node("face_detector")faceDetector()rospy.loginfo("Facedetectorisstarted..")rospy.loginfo("PleasesubscribetheROSimage.")10.5.1

開源機(jī)器視覺技術(shù)在ROS中的應(yīng)用rospy.spin()exceptKeyboardInterrupt:print"Shuttingdownfacedetectornode."cv2.destroyAllWindows()(2)編寫啟動(dòng)文件face_d

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論