




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
目錄前言1.1第一章ROS簡(jiǎn)介1.2機(jī)器人時(shí)代的到來(lái)1.2.1ROS發(fā)展歷程1.2.2什么是ROS1.2.3安裝ROS1.2.4安裝ROS-Academy-for-Beginners教學(xué)包1.2.5二進(jìn)制與源碼包1.2.6安裝Studio1.2.7單元測(cè)試一1.2.8第二章ROS文件系統(tǒng)1.3Catkin編譯系統(tǒng)1.3.1Catkin工作空間1.3.2Package軟件包1.3.3CMakeLists.txt1.3.4package.xml1.3.5Metapacakge軟件元包1.3.6其他常見(jiàn)文件類(lèi)型1.3.7單元測(cè)試二1.3.8第三章ROS通信架構(gòu)(一)1.4Node&Master1.4.1Launch文件1.4.21.4.3Msg1.4.4常見(jiàn)msg類(lèi)型1.4.5單元測(cè)試三1.4.6第四章ROS通信架構(gòu)(二)1.5Service1.5.1Srv1.5.2Parameterserver1.5.31Action1.5.4常見(jiàn)srv類(lèi)型1.5.5常見(jiàn)action類(lèi)型1.5.6單元測(cè)試四1.5.7第五章常用工具1.6Gazebo1.6.11.6.2Rqt1.6.3Rosbag1.6.4Rosbridge1.6.5moveit!1.6.6單元測(cè)試五1.6.7第六章roscpp1.7ClientLibrary與roscpp1.7.1節(jié)點(diǎn)初始、關(guān)閉與NodeHandle1.7.2inroscpp1.7.3Serviceinroscpp1.7.4Paraminroscpp1.7.5時(shí)鐘1.7.6日志與異常1.7.7第七章rospy1.8Rospy與主要接口1.8.1inrospy1.8.2Serviceinrospy1.8.3Param與1.8.4第八章TF與URDF1.9認(rèn)識(shí)TF1.9.1TF消息1.9.2tfinc++1.9.3tfinpython統(tǒng)一機(jī)器人描述格式附錄:TF數(shù)學(xué)基礎(chǔ).51.9.6三維空間剛體運(yùn)動(dòng)---旋轉(zhuǎn)矩陣三維空間剛體運(yùn)動(dòng)---歐拉角2三維空間剛體運(yùn)動(dòng)---四元數(shù)第九章SLAM1.10地圖1.10.1Gmapping1.10.2Karto1.10.3Hector1.10.4第十章NavigationNavigationStackmove_basecostmapMap_server&Amcl附錄:Navigation工具包說(shuō)明1.12amcl1.12.1local_base_planner1.12.2carrot_planner1.12.3clear_costmap_recovery1.12.4costmap_2d1.12.5dwa_local_planner1.12.6fake_localization1.12.7global_planner1.12.8map_server1.12.9move_base_msg1.12.10move_basemove_slow_and_clear1.12.12navfn1.12.13nav_core1.12.14robot_pose_ekf1.12.15rotate_recovery1.12.163前言中國(guó)大學(xué)MOOC---《機(jī)器人操作系統(tǒng)入門(mén)》課程講義歡迎來(lái)到中國(guó)大學(xué)MOOC---《機(jī)器人操作系統(tǒng)入門(mén)》課程,本書(shū)是課程的配套講義,由中科院軟件所和重德智能公司共同推出,課程分為十個(gè)章節(jié),與視頻課程相對(duì)應(yīng),介紹ROS的基本原理和用法。歡迎各位朋友在中國(guó)大學(xué)MOOC平臺(tái)上選修這門(mén)課程。本講義希望帶給讀者最準(zhǔn)確、生動(dòng)、易懂的ROS入門(mén)指導(dǎo),為了方便讀者操作練習(xí),我們同時(shí)附有配套的教學(xué)代碼示例,歡迎各位下載、學(xué)習(xí)和分享。本講義將長(zhǎng)期維護(hù),永久公開(kāi)。如果你有任何問(wèn)題,可在Github的issues里提出,也可以直接聯(lián)系我們的郵箱。由于我們課程團(tuán)隊(duì)的精力實(shí)在有限,本書(shū)難免存在錯(cuò)誤和瑕疵,歡迎各位朋友拍磚,我們將不斷更新,一直努力。4前言柴長(zhǎng)坤chaichangkun@武延軍yanjun@常先明cxm@安傳旭韓昊旻hanhaomin008@126.com韓錦飛hanjf_robin@163.com5第一章ROS簡(jiǎn)介第一章ROS簡(jiǎn)介機(jī)器人操作系統(tǒng)(RobotOperatingSystem,ROS)是一個(gè)應(yīng)用于機(jī)器人上的操作系統(tǒng),它操作方便、功能強(qiáng)大,特別適用于機(jī)器人這種多節(jié)點(diǎn)多任務(wù)的復(fù)雜場(chǎng)景。因此自ROS誕生以來(lái),受到了學(xué)術(shù)界和工業(yè)界的歡迎,如今已經(jīng)廣泛應(yīng)用于機(jī)械臂、移動(dòng)底盤(pán)、無(wú)人機(jī)、無(wú)人車(chē)等許多種類(lèi)的機(jī)器人上。本章介紹ROS的產(chǎn)生、發(fā)展、特點(diǎn)和安裝方法,帶給你一個(gè)簡(jiǎn)單直觀的ROS介紹。6機(jī)器人時(shí)代的到來(lái)1.1機(jī)器人時(shí)代的到來(lái)他們速度很快,具有非凡智慧與致命力量;他們不受生命周期桎梏,是未來(lái)科技的希望。機(jī)器人和仿生機(jī)器,正要從實(shí)驗(yàn)室的襁褓中迸裂而出,投入市場(chǎng)的廣闊天地,運(yùn)算能力的大幅進(jìn)步加上最新的機(jī)器人腦部設(shè)計(jì),為機(jī)器人科技帶來(lái)前所未有的改革,毋庸置疑,機(jī)器人即將改變?nèi)祟?lèi)工作場(chǎng)所及生活狀態(tài)。神愛(ài)世人,人亦鐘情所造之物,如今有幸跟隨時(shí)代步伐,一起創(chuàng)造世界,借不滅之軀,走遍險(xiǎn)遠(yuǎn)之地,看盡世之奇?zhèn)ス骞?。曾?jīng),機(jī)器人創(chuàng)新的門(mén)檻非常高。如果你想在任何應(yīng)用領(lǐng)域開(kāi)發(fā)出有分量的產(chǎn)品,你需要建立一整套能夠?qū)崿F(xiàn)你想法的系統(tǒng):包括硬件設(shè)備,當(dāng)然還有控制系統(tǒng),界面接口,以及讓機(jī)器人運(yùn)行并作為測(cè)試平臺(tái)的檢測(cè)工具?!皼](méi)有什么是現(xiàn)成的設(shè)備,除了一些很差,閉源的東西外?!彪S著機(jī)器人領(lǐng)域的快速發(fā)展和復(fù)雜化,代碼復(fù)用和模塊化的需求日益強(qiáng)烈,已有的開(kāi)源系統(tǒng)已不能很好地適應(yīng)需求,2010年WillowGarage公司發(fā)布了開(kāi)源機(jī)器人操作系統(tǒng)ROS。7ROS發(fā)展歷程1.2ROS發(fā)展歷程本世紀(jì)開(kāi)始,關(guān)于人工智能的研究進(jìn)入了大發(fā)展階段,包括全方位的具體的AI,例如斯坦福大學(xué)人工智能實(shí)驗(yàn)室(StanfordArtificialIntelligenceRobot)項(xiàng)目,該項(xiàng)目組創(chuàng)建了靈活的、動(dòng)態(tài)的軟件系統(tǒng)的原型,用于機(jī)器人技術(shù)。在2007年,機(jī)器人公司W(wǎng)illowGarage和該項(xiàng)目組合作,他們十分具有前瞻性的,提供了大量資源進(jìn)一步擴(kuò)展了這些概念,經(jīng)過(guò)具體的研究測(cè)試實(shí)現(xiàn)之后,無(wú)數(shù)的研究人員將他們的專(zhuān)業(yè)性研究貢獻(xiàn)到ROS核心概念和其基礎(chǔ)軟件包,這期間積累了眾多的科學(xué)研究成果。ROS軟件的開(kāi)發(fā)自始至終采用開(kāi)放的BSD協(xié)議,在機(jī)器人技術(shù)研究領(lǐng)域逐漸成為一個(gè)被廣泛使用的平臺(tái)。WillowGarage公司和斯坦福大學(xué)人工智能實(shí)驗(yàn)室合作以后,在2009年初推出了ROS0.4,這是一個(gè)測(cè)試版的ROS,現(xiàn)在所用的系統(tǒng)框架在這個(gè)版本中已經(jīng)具有了初步的雛形。之后的版本才正式開(kāi)啟了ROS的發(fā)展成熟之路。ROS1.0版本發(fā)布于2010年,基于PR2機(jī)器人開(kāi)發(fā)了一系列機(jī)器人相關(guān)的基礎(chǔ)軟件包。隨后ROS版本迭代頻繁,目前已經(jīng)發(fā)布到了Lunar。目前使用人數(shù)最多的是Kinetic和Indigo這兩個(gè)LongSupport版本。ROS版本發(fā)布時(shí)間LunarLoggerhead2017.5KineticKame2016.5Jade2015.5Indigolgloo2014.7HydroMedusa2013.9GroovyGalapagos2012.12Fuerte2012.4ElectricEmysDiamondbackC2010.8Box2010.38ROS發(fā)展歷程ROS的發(fā)展逐漸的趨于成熟,近年來(lái)也逐步是面對(duì)著Ubuntu的更新而更新,這說(shuō)明ROS已經(jīng)初步進(jìn)入一種穩(wěn)定的發(fā)展?fàn)顟B(tài),每年進(jìn)行一次更新的頻率同時(shí)還保留著長(zhǎng)期支持的版本,這使得ROS在穩(wěn)步的前進(jìn)發(fā)展同時(shí),也有著開(kāi)拓創(chuàng)新的方向。目前越來(lái)越多的機(jī)器人、無(wú)人機(jī)甚至無(wú)人車(chē)都開(kāi)始采用ROS作為開(kāi)發(fā)平臺(tái),盡管ROS在實(shí)用方面目前還存在一些限制,但前途非常光明。2018年ROS21.0版將發(fā)布,未來(lái)ROS2將如何影響機(jī)器人領(lǐng)域,我們拭目以待。相信在人工智能的大發(fā)展、人機(jī)交互越來(lái)越密切、互聯(lián)網(wǎng)+的大時(shí)代,ROS會(huì)發(fā)揮出越來(lái)越重要的作用。9什么是ROS1.3什么是ROS機(jī)器人是一個(gè)系統(tǒng)工程,它涉及機(jī)械、電子、控制、通信、軟件等諸多學(xué)科。以前,開(kāi)發(fā)一個(gè)機(jī)器人需要花很大的功夫,你需要設(shè)計(jì)機(jī)械、畫(huà)電路板、寫(xiě)驅(qū)動(dòng)程序、設(shè)計(jì)通信架構(gòu)、組裝集成、調(diào)試、以及編寫(xiě)各種感知決策和控制算法,每一個(gè)任務(wù)都需要花費(fèi)大量的時(shí)間。因此像電影《鋼鐵寫(xiě)》中那樣,僅靠一個(gè)人的力量造出一個(gè)動(dòng)力超強(qiáng)的人形機(jī)器人機(jī)甲是不可能的。然而隨著技術(shù)進(jìn)步,機(jī)器人產(chǎn)業(yè)分工開(kāi)始走向細(xì)致化、多層次化,如今的電機(jī)、底盤(pán)、激光雷達(dá)、攝像頭、機(jī)械臂等等元器件都有不同廠家專(zhuān)門(mén)生產(chǎn)。社會(huì)分工加速了機(jī)器人行業(yè)的發(fā)展。而各個(gè)部件的集成就需要一個(gè)統(tǒng)一的軟件平臺(tái),在機(jī)器人領(lǐng)域,這個(gè)平臺(tái)就是機(jī)器人操作系統(tǒng)ROS。ROS是一個(gè)適用于機(jī)器人編程的框架,這個(gè)框架把原本松散的零部件耦合在了一起,為他們提供了通信架構(gòu)。ROS雖然叫做操作系統(tǒng),但并非Windows、Mac那樣通常意義的操作系統(tǒng),它只是連接了操作系統(tǒng)和你開(kāi)發(fā)的ROS應(yīng)用程序,所以它也算是一個(gè)中間件,基于ROS的應(yīng)用程序之間建立起了溝通的橋梁,所以也是運(yùn)行在Linux上的運(yùn)行時(shí)環(huán)境,在這個(gè)環(huán)境上,機(jī)器人的感知、決策、控制算法可以更好的組織和運(yùn)行。10什么是ROS以上幾個(gè)關(guān)鍵詞(框架、中間件、操作系統(tǒng)、運(yùn)行時(shí)環(huán)境)都可以用來(lái)描述ROS的特性,作為初學(xué)者我們不必深究這些概念,隨著你越來(lái)越多的使用ROS,就能夠體會(huì)到它的作用。ROS具有這些特點(diǎn):分布式點(diǎn)對(duì)點(diǎn)ROS采用了分布式的框架,通過(guò)點(diǎn)對(duì)點(diǎn)的設(shè)計(jì)讓機(jī)器人的進(jìn)程可以分別運(yùn)行,便于模塊化的修改和定制,提高了系統(tǒng)的容錯(cuò)能力。多種語(yǔ)言支持ROS支持多種編程語(yǔ)言。C++、Pyhton和已經(jīng)在ROS中實(shí)現(xiàn)編譯,是目前應(yīng)用最廣的ROS開(kāi)發(fā)語(yǔ)言,Lisp、C#、Java等語(yǔ)言的測(cè)試庫(kù)也已經(jīng)實(shí)現(xiàn)。為了支持多語(yǔ)言編程,ROS采用了一種語(yǔ)言中立的接口定義語(yǔ)言來(lái)實(shí)現(xiàn)各模塊之間消息傳送。通俗的理解就是,ROS的通信格式和用哪種編程語(yǔ)言來(lái)寫(xiě)無(wú)關(guān),它使用的是自身定義的一套通信接口。開(kāi)源社區(qū)ROS具有一個(gè)龐大的社區(qū)ROSWIKI(/),這個(gè)網(wǎng)站將會(huì)始終伴隨著你ROS開(kāi)發(fā),無(wú)論是查閱功能包的參數(shù)、搜索問(wèn)題還是。當(dāng)前使用ROS開(kāi)發(fā)的軟件包已經(jīng)達(dá)到數(shù)千萬(wàn)個(gè),相關(guān)的機(jī)器人已經(jīng)多達(dá)上千款。此外,ROS遵從BSD協(xié)議,對(duì)個(gè)人和商業(yè)應(yīng)用及修改完全免費(fèi)。這也促進(jìn)了ROS的流行。ROS為我們開(kāi)發(fā)機(jī)器人帶來(lái)了許多方便,然而它也確實(shí)存在一些問(wèn)題:優(yōu)點(diǎn)缺點(diǎn)提供框架、工具和功能通信實(shí)時(shí)性能有限方便移植系統(tǒng)穩(wěn)定性尚不滿(mǎn)足工業(yè)級(jí)要求龐大的用戶(hù)群體安全性上沒(méi)有防護(hù)措施免費(fèi)開(kāi)源僅支持Linux(Ubuntu)總體來(lái)說(shuō),ROS更適合科研和開(kāi)源用戶(hù)使用,如果在工業(yè)場(chǎng)景應(yīng)用(例如無(wú)人駕駛)還需要做優(yōu)化和定制。為了解決實(shí)際應(yīng)用的問(wèn)題,ROS2.0做了很大的改進(jìn),目前正在開(kāi)發(fā)之中,未來(lái)表現(xiàn)如何值得期待。什么是ROS12安裝ROS1.4安裝ROS的步驟ROS目前只支持在Linux系統(tǒng)上安裝部署,它的首選開(kāi)發(fā)平臺(tái)是Ubuntu。時(shí)至今日ROS已經(jīng)相繼更新推出了多種版本,供不同版本的Ubuntu開(kāi)發(fā)者使用。為了提供最穩(wěn)定的開(kāi)發(fā)環(huán)境,ROS的每個(gè)版本都有一個(gè)推薦運(yùn)行的Ubuntu版本。如下表所示:ROS版本首選Ubuntu版本LunarUbuntu17.04Kinetic(建議選用)Ubuntu16.04JadeUbuntu15.04IndigoUbuntu14.04......本教程使用的平臺(tái)是Ubuntu16.04,ROS版本是Kinetic。如果你還沒(méi)有安裝Ubuntu,建議選擇16.04版本(/download/desktop)。并且我們建議在本地安裝,不推薦用虛擬機(jī),這樣兼容性更好。如果你已經(jīng)安裝Ubuntu,請(qǐng)確定系統(tǒng)版本,在終端中輸入cat/etc/issue確定Ubuntu版本號(hào),然后選擇對(duì)應(yīng)的ROS版本。如果沒(méi)有安裝正確的ROS版本,就會(huì)出現(xiàn)各種各樣的依賴(lài)錯(cuò)誤,所以安裝時(shí)請(qǐng)謹(jǐn)慎。更多信息請(qǐng)參考ROS官方網(wǎng)站進(jìn)行下載和安裝。在正式的安裝前,先檢查下Ubuntu初始環(huán)境是否配置正確。打開(kāi)Ubuntu的設(shè)置->軟件與更新->Ubuntu軟件->勾選關(guān)鍵字universe,restricted,multiverse三項(xiàng)。如圖所示:13安裝ROS配置完成后,就可以開(kāi)始安裝ROS了,打開(kāi)終端。①添加sources.list$sudosh-c'./etc/lsb-release&&echo"deb/ros/ubuntu/$DISTRIB_CODENAMEmain">/etc/apt/sources.list.d/ros-latest.list'這一步配置將鏡像添加到Ubuntu系統(tǒng)源列表中,建議使用國(guó)內(nèi)或鏡像源,這樣能夠保證下載速度。本例使用的是中國(guó)科技大學(xué)的源。②添加keys$sudoapt-keyadv--keyserverhkp://:80--recv-key421C365BD9FF1F717815A3895523BAEEB01FA116公鑰是Ubuntu系統(tǒng)的一種安全機(jī)制,也是ROS安裝中不可缺的一部分。③系統(tǒng)更新$sudoapt-getupdate&&sudoapt-getupgrade14安裝ROS更新系統(tǒng),確保自己的Debian軟件包和索引是最新的。④安裝ROSROS中有很多函數(shù)庫(kù)和工具,官網(wǎng)提供了四種默認(rèn)的安裝方式,當(dāng)然也可以單獨(dú)安裝某個(gè)特定的軟件包。這四種方式包括桌面完整版安裝、桌面版安裝,基礎(chǔ)版安裝、單獨(dú)軟件包安裝。推薦安裝桌面完整版安裝(包含ROS、rqt、rviz、通用機(jī)器人函數(shù)庫(kù)、2D/3D仿真器、導(dǎo)航以及2D/3D感知功能),如下:Ubuntu16.04安裝Kinetic版本$sudoapt-getinstallros-kinetic-desktop-full#Ubuntu16.04Ubuntu14.04安裝Lndigo版本$sudoapt-getinstallros-indigo-desktop-full#Ubuntu14.04如果你不想安裝桌面完整版,你還可以嘗試以下三種方式安裝:桌面版安裝(包含ROS、rqt、rviz以及通用機(jī)器人函數(shù)庫(kù))sudoapt-getinstallros-kinetic-desktop基礎(chǔ)版安裝(包含ROS核心軟件包、構(gòu)建工具以及通信相關(guān)的程序庫(kù),無(wú)GUI工具)sudoapt-getinstallros-kinetic-ros-base單獨(dú)軟件包安裝(這種安裝方式在運(yùn)行ROS缺少某些package依賴(lài)時(shí)會(huì)經(jīng)常用到。你可以安裝某個(gè)指定的ROS軟件包,使用軟件包名稱(chēng)替換掉下面的)sudoapt-getinstallros-kinetic-PACKAGE例如系統(tǒng)提示找不到slam-gmapping,你就可以:sudoapt-getinstallros-kinetic-slam-gmapping要查找可用的軟件包,請(qǐng)運(yùn)行:apt-cachesearchros-kinetic15安裝ROS軟件包的依賴(lài)問(wèn)題還可能出現(xiàn)在重復(fù)安裝ROS、錯(cuò)誤安裝軟件包的過(guò)程中,出現(xiàn)有一些軟件包無(wú)法安裝,例如:下列軟件包有未滿(mǎn)足的依賴(lài)關(guān)系:ros-kinetic-desktop-full:依賴(lài):ros-kinetic-desktop但是它將不會(huì)被安裝;依賴(lài):ros-kinetic-perception但是它將不會(huì)被安裝;依賴(lài):ros-kinetic-simulators但是它將不會(huì)被安裝;E:無(wú)法修正錯(cuò)誤,因?yàn)槟竽承┸浖3脂F(xiàn)狀,就是它們破壞了軟件包間的依賴(lài)關(guān)系。出現(xiàn)上述問(wèn)題,有可能是自己的版本不合適不兼容造成,也可能是鏡像源沒(méi)有更新,具體的設(shè)置參考軟件和更新的截圖。當(dāng)然也有可能是其他原因,比如更新了忘記刷新環(huán)境source一下,重開(kāi)一個(gè)終端等等。具體的問(wèn)題原因可以去搜索引擎上嘗試求助解決,或者登陸ROSWiki(ROS的百科全書(shū))去查詢(xún)解決自己的具體問(wèn)題。配置ROS是安裝完ROS之后必須的工作。①初始化rosdep$sudorosdepinit&&rosdepupdate這一步初始化rosdep,是使用ROS之前的必要一步。rosdep可以方便在你需要編譯某些源碼的時(shí)候?yàn)槠浒惭b一些系統(tǒng)依賴(lài),同時(shí)也是某些ROS核心功能組件所必需用到的工具。②ROS環(huán)境配置#ForUbuntu16.04$echo"source/opt/ros/kinetic/setup.bash">>~/.bashrc#ForUbuntu14.04$echo"source/opt/ros/indigo/setup.bash">>~/.bashrc注意:ROS的環(huán)境配置,使得你每次打開(kāi)一個(gè)新的終端,ROS的環(huán)境變量都能夠自動(dòng)配置好,也就是添加到bash會(huì)話中,因?yàn)槊顂ource/opt/ros/kinetic/setup.bash只在當(dāng)前終端有作用,即具有單一時(shí)效性,要想每次新開(kāi)一個(gè)終端都不用重新配置環(huán)境,就用echo語(yǔ)句將命令添加到bash會(huì)話中。③安裝rosinstall16安裝ROSrosinstall是ROS中一個(gè)獨(dú)立分開(kāi)的常用命令行工具,它可以方便讓你通過(guò)一條命令就可以給某個(gè)ROS軟件包下載很多源碼樹(shù)。在ubuntu上安裝這個(gè)工具,請(qǐng)運(yùn)行:$sudoapt-getinstallpython-rosinstall至此,ROS的安裝就結(jié)束了,下面測(cè)試ROS能否正常運(yùn)行。首先啟動(dòng)ROS,輸入代碼運(yùn)行roscore:$roscore如果出現(xiàn)下圖所示,那么說(shuō)明ROS正常啟動(dòng)了!接著我們測(cè)試ROS的吉祥物--小海龜,來(lái)簡(jiǎn)單的測(cè)試ROS運(yùn)行是否正常,同時(shí)也來(lái)體驗(yàn)一下ROS的神奇與精彩!啟動(dòng)roscore后,重新打開(kāi)一個(gè)終端窗口,輸入:$rosrunturtlesimturtlesim_node17安裝ROS你還看到一只萌萌的海龜出現(xiàn)在屏幕上,那么該怎么樣來(lái)操縱這只小海龜呢?重新打開(kāi)新的一個(gè)終端,輸入:$rosrunturtlesimturtle_teleop_key將鼠標(biāo)聚焦在第三個(gè)終端窗口上,然后通過(guò)鍵盤(pán)上的方向鍵,進(jìn)行操作小海龜,如果小海龜正常移動(dòng),并且在屏幕上留下自己的移動(dòng)軌跡,如下圖。恭喜你,ROS已經(jīng)成功的安裝、配置并且運(yùn)行!至此,ROS的安裝、配置與測(cè)試就全部結(jié)束了,下面就正式開(kāi)啟ROS精彩的旅程!18安裝ROS-Academy-for-Beginners教學(xué)包1.5安裝ROS-Academy-for-Beginners教學(xué)包在1.4節(jié)我們已經(jīng)用apt工具安裝好了ROS,apt安裝的軟件包都是二進(jìn)制形式,可以在系統(tǒng)中直接運(yùn)行,它們是ROS官方提供給用戶(hù)的應(yīng)用程序。然而很多時(shí)候我們需要自己做一些定制改寫(xiě),或者運(yùn)行第三方開(kāi)發(fā)的軟件包,這個(gè)時(shí)候就需要下載源代碼進(jìn)行編譯。本節(jié)我們下載本書(shū)配套的ROS-Academy-for-Beginners軟件包,給讀者演示源碼包下載-編譯-運(yùn)行的完整流程。后續(xù)章節(jié)的主要代碼都基于這個(gè)軟件包,請(qǐng)讀者按照流程下載編譯。在Ubuntu系統(tǒng)上,確保git已經(jīng)安裝$sudoapt-getinstallgit然后在創(chuàng)建一個(gè)名為tutorial_ws的工作空間,在它的的src路徑下克隆ROS-Academy-for-Beginners軟件包$cd$mkdir-ptutorial_ws/src#創(chuàng)建catkin工作空間$cdtutorial_ws/src#進(jìn)入src路徑,克隆教學(xué)軟件包$gitclone/DroidAITech/ROS-Academy-for-Beginners.git并且安裝ROS-Academy-for-Beginners所需要的依賴(lài)$cd~/tutorial_ws$rosdepinstall--from-pathssrc--ignore-src--rosdistro=kinetic-y注意:以上命令非常重要,缺少依賴(lài)將導(dǎo)致軟件包無(wú)法正常編譯和運(yùn)行。在開(kāi)始編譯之前,需要確保Gazebo在7.0版本以上$gazebo-v#確認(rèn)7.0及以上19安裝ROS-Academy-for-Beginners教學(xué)包如果你的Gazebo版本低于7.0,則需要進(jìn)行升級(jí)$sudosh-c'echo"deb/gazebo/ubuntu-stable`lsb_release-cs`main">/etc/apt/sources.list.d/gazebo-stable.list'$wget/gazebo.key-O-|sudoapt-keyadd-$sudoapt-getupdate$sudoapt-getinstallgazebo7接著回到catkin_ws下編譯$cd~/tutorial_ws$catkin_make$source~/tutorial_ws/devel/setup.bash#刷新環(huán)境方法一$rospackprofile#刷新環(huán)境方法二注意:source命令,編譯完成后必須刷新一下工作空間的環(huán)境,否則可能找不到工作空間。許多時(shí)候我們?yōu)榱舜蜷_(kāi)終端就能夠運(yùn)行工作空間中編譯好的ROS程序,我們習(xí)慣把source~/tutorial_ws/devel/setup.bash命令追加到~/.bashrc文件中(rosacademy_ws替換為你的工作空間名稱(chēng)),這樣每次打開(kāi)終端,系統(tǒng)就會(huì)刷新工作空間環(huán)境。你可以通過(guò)echo"source~/tutorial_ws/devel/setup.bash">>~/.bashrc命令來(lái)追加。編譯完成后就可以運(yùn)行本教學(xué)配套的仿真了,輸入$rospackprofile$roslaunchrobot_sim_demorobot_spawn.launch你會(huì)看到仿真畫(huà)面啟動(dòng),仿真界面中包括了軟件博物館和Xbot機(jī)器人模型。20安裝ROS-Academy-for-Beginners教學(xué)包再打開(kāi)一個(gè)新的終端,輸入以下命令,用鍵盤(pán)控制機(jī)器人移動(dòng)$rosrunrobot_sim_demorobot_keyboard_teleop.py聚焦控制程序窗口,按下i、j、l等按鍵,這樣你就可以通過(guò)鍵盤(pán)來(lái)控制機(jī)器人的移動(dòng)了。當(dāng)你完成了這一步,首先恭喜你,你已經(jīng)完成了ROS最常見(jiàn)的源碼下載-安裝依賴(lài)-編譯-運(yùn)行的流程,在ROS社區(qū)有許許多多這樣的軟件包,基本都按照這樣的流程來(lái)運(yùn)行。相信你一定可以舉一反三。21安裝ROS-Academy-for-Beginners教學(xué)包鍵盤(pán)控制仿真機(jī)器人移動(dòng)這個(gè)demo展現(xiàn)了ROS分布式消息收發(fā)的特性。我們打開(kāi)的雖然是鍵盤(pán)控制程序,但它可以替換為手柄控制、手機(jī)平板控制、甚至是路徑規(guī)劃自動(dòng)控制。模擬器里的機(jī)器人并不關(guān)心是誰(shuí)發(fā)給它的消息,它只關(guān)心這個(gè)消息是什么(速度、角速度等指令)。所以,每一個(gè)進(jìn)程(節(jié)點(diǎn))都各司其職,負(fù)責(zé)不同的任務(wù),同時(shí)定義好消息收發(fā)的接口。如果我們現(xiàn)在要做路徑規(guī)劃任務(wù),那么我們只用單獨(dú)再開(kāi)發(fā)一個(gè)節(jié)點(diǎn),同樣向底盤(pán)發(fā)送我們解算出的速度/角速度指令就可以了。你現(xiàn)在可能對(duì)ROS工作方式還一無(wú)所知,不過(guò)不要緊。后續(xù)我們會(huì)對(duì)ROS涉及的這些概念進(jìn)行詳細(xì)介紹,等你看完了這本書(shū),你就能明白整個(gè)ROS框架運(yùn)行的原理,甚至自己能編程實(shí)現(xiàn)一些功能模塊了。22二進(jìn)制與源碼包1.6二進(jìn)制包vs.源代碼包在1.4節(jié)我們通過(guò)apt方式安裝了ROS系統(tǒng)以及相關(guān)的軟件包,而在1.5節(jié)我們通過(guò)下載源碼編譯的方式安裝了一個(gè)ROS教學(xué)軟件包。這是兩種常見(jiàn)的軟件包安裝方式,通常我們的軟件包(Package)就可以分為二進(jìn)制和源代碼。二進(jìn)制包里面包括了已經(jīng)編譯完成,可以直接運(yùn)行的程序。你通過(guò)sudoapt-getinstall來(lái)進(jìn)行下載和解包(安裝),執(zhí)行完該指令后就可以馬上使用了。因此這種方式簡(jiǎn)單快捷,適合比較固定、無(wú)需改動(dòng)的程序。而源代碼包里是程序的原始代碼,在你的計(jì)算機(jī)上必須經(jīng)過(guò)編譯,生成了可執(zhí)行的二進(jìn)制文件,方可運(yùn)行。一些個(gè)人開(kāi)發(fā)的程序、第三方修改或者你希望修改的程序都應(yīng)當(dāng)通過(guò)源代碼包的來(lái)編譯安裝。區(qū)別二進(jìn)制包源代碼包下載方式apt-getinstall/直接下載debgitclone/直接下載源代碼ROS包存放位置/opt/ros/kinetic/通常~/catkin_ws/src編譯方式無(wú)需編譯通過(guò)make/cmake/caktin來(lái)源官方apt軟件源開(kāi)源項(xiàng)目、第三方開(kāi)發(fā)者擴(kuò)展性無(wú)法修改通過(guò)源代碼修改可讀性無(wú)法查看源代碼方便閱讀源代碼優(yōu)點(diǎn)下載簡(jiǎn)單,安裝方便源碼可修改,便于定制功能缺點(diǎn)無(wú)法修改編譯工具、軟件包依賴(lài)、版本和參
數(shù)應(yīng)用場(chǎng)景基礎(chǔ)軟件需要查看、開(kāi)發(fā)和修改的程序在1.4中,我們用apt-get安裝了ROS及其組件,因此我們不需要編譯就可以運(yùn)行turtlesim程序。對(duì)于這些程序,除非我們做操作系統(tǒng)的設(shè)計(jì)開(kāi)發(fā)才會(huì)去下載源碼,否則直接用官方提供的ROS軟件包;而在1.5中,ROS-Academy-for-Beginners以源碼呈現(xiàn),你可以看到每個(gè)demo下面的C++代碼。對(duì)于這些源文件我們必須caktin_make編譯,然后才能運(yùn)行。23二進(jìn)制與源碼包在ROS中,我們可能經(jīng)常會(huì)遇到缺少相關(guān)的ROS依賴(lài)的問(wèn)題。有些時(shí)候你編譯或者運(yùn)行一些ROS程序,系統(tǒng)會(huì)提示找不到XXX功能包,如圖所示。遇到這樣的問(wèn)題,請(qǐng)先注意閱讀錯(cuò)誤原因,看看是否有解決方法,也可以Google一下。如果是缺少ROS的依賴(lài),通??梢杂靡韵旅顏?lái)安裝:$sudoapt-getinstallros-kinetic-PACAKGE將替換為系統(tǒng)提示缺啥少的軟件包,例如$sudoapt-getinstallros-kinetic-slam-gmapping#GMapping-SLAM算法包$sudoapt-getinstallros-kinetic-turtlebot-description#Turtlebot機(jī)器人模型包所有APT官方中的ROS功能包都是按照ros--的形式來(lái)命名。24安裝Studio1.7安裝Studio通常ROS的程序都是用C++和Python開(kāi)發(fā)的,為了提高開(kāi)發(fā)的效率,我們建議用IDE來(lái)寫(xiě)代碼。目前在Ubuntu上已經(jīng)有許多IDE支持ROS開(kāi)發(fā),比如Eclipse、QtCreator。不過(guò)這些IDE配置起來(lái)會(huì)比較麻煩,我們推薦一款適配ROS的Studio來(lái)開(kāi)發(fā)ROS。讀者可在http://cn.roboware.me/#/Download下載和使用。25單元測(cè)試一單元測(cè)試一1.[單選](2分)機(jī)器人操作系統(tǒng)的全稱(chēng)是?A.ReactOperatingSystemB.RouterOperatingSytstemC.RequestofServiceD.RobotOperatingSystemROS的全稱(chēng)就是:RobotOperatingSystem2.[單選](2分)ROSKinetic最佳適配的Linux版本是?A.CentOS7B.Ubuntu14.04C.Ubuntu16.04D.Ubuntu18.04官方推薦ROSKinetic最佳適配的平臺(tái)是Ubuntu16.043.[單選](2分)下列哪個(gè)不是ROS的特點(diǎn)?A.開(kāi)源B.分布式架構(gòu)C.強(qiáng)實(shí)時(shí)性D.模塊化ROS系統(tǒng)不具有強(qiáng)實(shí)時(shí)性,它不是一個(gè)OperatingSystem),因此ROS不適合去做對(duì)實(shí)時(shí)性有嚴(yán)格要求的任務(wù)(需要ms級(jí)響應(yīng)的任務(wù))4.[單選](2分)ROS官方二進(jìn)制包可以通過(guò)以下哪個(gè)命令安裝(假定Kinetic版本)?A.sudoapt-getinstallROS_kinetic_pacakgenameB.sudoapt-getinstallROS-Kinetic-pacakgenameC.sudoapt-getinstallros_kinetic_packagenameD.sudoapt-getinstallros-kinetic-packagenamepackagename為你需要安裝的ROS軟件包包名5.[單選](2分)ROS最早誕生于哪所學(xué)校的實(shí)驗(yàn)室?A.麻省理工學(xué)院(MIT)B.斯坦福大學(xué)(Stanford)C.加州大學(xué)伯克利分校(UC.Berkeley)D.卡內(nèi)基梅隆大學(xué)(CMU)ROS起源于斯坦福大學(xué)人工智能實(shí)驗(yàn)室6.[多選](5分)下列哪些是ROS的發(fā)行版本?A.IndigoB.JadeC.XenialD.KineticXenial是Ubuntu系統(tǒng)的一個(gè)版本號(hào),Oreo是Android8.0的代號(hào),ROS與Android版本號(hào)都是按照字母表順序命名,ROS目前版本更新到L(unar)7.[多選](5分)查看/頁(yè)面的機(jī)器人,下列哪些支持ROS?A.PioneerB.XBotD.PR2以上機(jī)器人全支持8.[單選](2分)在PC上安裝Ubuntu16.04和ROSKinetic,你完成了嗎?A.已完成B.未完成完成了才能拿到分?jǐn)?shù)26第二章ROS文件系統(tǒng)第二章ROS文件系統(tǒng)本章主要介紹了ROS的工程結(jié)構(gòu),也就是ROS的文件系統(tǒng)結(jié)構(gòu)。要學(xué)會(huì)建立一個(gè)ROS工程,首先要認(rèn)識(shí)一個(gè)ROS工程,了解它們的組織架構(gòu),從根本上熟悉ROS項(xiàng)目的組織形式,了解各個(gè)文件的功能和作用,才能正確的進(jìn)行開(kāi)發(fā)和編程。本章的主要內(nèi)容有,介紹catkin的編譯系統(tǒng),catkin工作空間的創(chuàng)建和結(jié)構(gòu),package軟件包的創(chuàng)建和結(jié)構(gòu),介紹CMakeLists.txt文件,package.xml以及其他常見(jiàn)文件。從而系統(tǒng)的梳理了ROS文件空間的結(jié)構(gòu),對(duì)于我們ROS學(xué)習(xí)和開(kāi)發(fā)有著重要的作用。27Catkin編譯系統(tǒng)2.1Catkin編譯系統(tǒng)對(duì)于源代碼包,我們只有編譯才能在系統(tǒng)上運(yùn)行。而Linux下的編譯器有g(shù)cc、g++,隨著源文件的增加,直接用gcc/g++命令的方式顯得效率低下,人們開(kāi)始用Makefile來(lái)進(jìn)行編譯。然而隨著工程體量的增大,Makefile也不能滿(mǎn)足需求,于是便出現(xiàn)了Cmake工具。CMake是對(duì)make工具的生成器,是更高層的工具,它簡(jiǎn)化了編譯構(gòu)建過(guò)程,能夠管理大型項(xiàng)目,具有良好的擴(kuò)展性。對(duì)于ROS這樣大體量的平臺(tái)來(lái)說(shuō),就采用的是CMake,并且ROS對(duì)CMake進(jìn)行了擴(kuò)展,于是便有了Catkin編譯系統(tǒng)。早期的ROS編譯系統(tǒng)是rosbuild,但隨著ROS的不斷發(fā)展,rosbuild逐漸暴露出許多缺點(diǎn),不能很好滿(mǎn)足系統(tǒng)需要。在Groovy版本面世后,Catkin作為rosbuild的替代品被正式投入使用。Catkin操作更加簡(jiǎn)化且工作效率更高,可移植性更好,而且支持交叉編譯和更加合理的功能包分配。目前的ROS同時(shí)支持著rosbuild和Catkin兩種編譯系統(tǒng),但ROS的核心軟件包也已經(jīng)全部轉(zhuǎn)換為Catkin。rosbuild已經(jīng)被逐步淘汰,所以建議初學(xué)者直接上手Catkin。本節(jié)我們主要來(lái)介紹catkin的編譯系統(tǒng)。Catkin是基于CMake的編譯構(gòu)建系統(tǒng),具有以下特點(diǎn):28Catkin編譯系統(tǒng)Catkin沿用了包管理的傳統(tǒng)像find_package()基礎(chǔ)結(jié)構(gòu),pkg-config擴(kuò)展了CMake,例如軟件包編譯后無(wú)需安裝就可使用自動(dòng)生成find_package()代碼,pkg-config文件解決了多個(gè)軟件包構(gòu)建順序問(wèn)題一個(gè)Catkin的軟件包(package)必須要包括兩個(gè)文件:package.xml:包括了package的描述信息name,description,version,maintainer(s),licenseopt.authors,url's,dependencies,plugins,etc...CMakeLists.txt:構(gòu)建package所需的CMake文件調(diào)用Catkin的函數(shù)/宏解析package.xml找到其他依賴(lài)的catkin軟件包將本軟件包添加到環(huán)境變量catkin編譯的工作流程如下:首先在工作空間catkin_ws/src/下遞歸的查找其中每一個(gè)ROS的package。package中會(huì)有package.xml和CMakeLists.txt文件,Catkin(CMake)編譯系統(tǒng)依據(jù)CMakeLists.txt文件,從而生成makefiles(放在catkin_ws/build/)。然后make剛剛生成的makefiles等文件,編譯鏈接生成可執(zhí)行文件(放在catkin_ws/devel)。也就是說(shuō),Catkin就是將cmake與make指令做了一個(gè)封裝從而完成整個(gè)編譯過(guò)程的工具。catkin有比較突出的優(yōu)點(diǎn),主要是:操作更加簡(jiǎn)單一次配置,多次使用跨依賴(lài)項(xiàng)目編譯catkin_make要用catkin編譯一個(gè)工程或軟件包,只需要用catkin_make指令。一般當(dāng)我們寫(xiě)完代碼,執(zhí)行一次catkin_make進(jìn)行編譯,調(diào)用系統(tǒng)自動(dòng)完成編譯和鏈接過(guò)程,構(gòu)建生成目標(biāo)文件。編譯的一般性流程如下,在1.5節(jié)我們編譯ROS-Academy-for-Beginners教學(xué)包就是這樣的流程。29Catkin編譯系統(tǒng)$cd~/catkin_ws#回到工作空間,catkin_make必須在工作空間下執(zhí)行$catkin_make#開(kāi)始編譯$source~/catkin_ws/devel/setup.bash#刷新壞境注意:catkin編譯之前需要回到工作空間目錄,catkin_make在其他路徑下編譯不會(huì)成功。編譯完成后,如果有新的目標(biāo)文件產(chǎn)生(原來(lái)沒(méi)有),那么一般緊跟著要source刷新環(huán)境,使得系統(tǒng)能夠找到剛才編譯生成的ROS可執(zhí)行文件。這個(gè)細(xì)節(jié)比較容易遺漏,致使后面出現(xiàn)可執(zhí)行文件無(wú)法打開(kāi)等錯(cuò)誤。catkin_make命令也有一些可選參數(shù),例如:catkin_make[args]-h,--help幫助信息-CDIRECTORY,--directoryDIRECTORY工作空間的路徑(默認(rèn)為'.')--sourceSOURCEsrc的路徑(默認(rèn)為'workspace_base/src')--buildBUILDbuild的路徑(默認(rèn)為'workspace_base/build')--use-ninja用ninja取代make--use-nmake用nmake取'make--force-cmake強(qiáng)制cmake,即使已經(jīng)cmake過(guò)--no-color禁止彩色輸出(只對(duì)catkin_make和CMake生效)--pkgPKG[PKG...]只對(duì)某個(gè)PKG進(jìn)行make--only-pkg-with-depsONLY_PKG_WITH_DEPS[ONLY_PKG_WITH_DEPS...]將指定的package列入白名單CATKIN_WHITELIST_PACKAGES,之編譯白名單里的package。該環(huán)境變量存在于CMakeCache.txt。--cmake-args[CMAKE_ARGS[CMAKE_ARGS...]]傳給CMake的參數(shù)--make-args[MAKE_ARGS[MAKE_ARGS...]]傳給Make的參數(shù)--override-build-tool-check用來(lái)覆蓋由于不同編譯工具產(chǎn)生的錯(cuò)誤30Catkin工作空間2.2Catkin工作空間Catkin工作空間是創(chuàng)建、修改、編譯catkin軟件包的目錄。catkin的工作空間,直觀的形容就是一個(gè)倉(cāng)庫(kù),里面裝載著ROS的各種項(xiàng)目工程,便于系統(tǒng)組織管理調(diào)用。在可視化圖形界面里是一個(gè)文件夾。我們自己寫(xiě)的ROS代碼通常就放在工作空間中,本節(jié)就來(lái)介紹catkin工作空間的結(jié)構(gòu)。介紹完catkin編譯系統(tǒng),我們來(lái)建立一個(gè)catkin的工作空間。首先我們要在計(jì)算機(jī)上創(chuàng)建一個(gè)初始的catkin_ws/路徑,這也是catkin工作空間結(jié)構(gòu)的最高層級(jí)。輸入下列指令,完成初始創(chuàng)建。$mkdir-p~/catkin_ws/src$cd~/catkin_ws/$catkin_make#初始化工作空間第一行代碼直接創(chuàng)建了第二層級(jí)的文件夾src,這也是我們放ROS軟件包的地方。第二行代碼使得進(jìn)程進(jìn)入工作空間,然后再是catkin_make。注意:1.catkin_make命令必須在工作空間這個(gè)路徑上執(zhí)行2.原先的初始化命令catkin_init_workspace仍然保留catkin的結(jié)構(gòu)十分清晰,具體的catkin工作空間結(jié)構(gòu)圖如下。初看起來(lái)catkin工作空間看起來(lái)極其復(fù)雜,其實(shí)不然,catkin工作空間的結(jié)構(gòu)其實(shí)非常清晰。在工作空間下用tree命令,顯示文件結(jié)構(gòu)。$cd~/catkin_ws$sudoaptinstalltree$tree結(jié)果為:31Catkin工作空間─build│├──catkin││└──catkin_generated││└──version││└──package.cmake│├──......│├──catkin_make.cache│├──CMakeCache.txt│├──CMakeFiles││├──......├──devel│├──env.sh│├──lib│├──setup.bash│├──setup.sh│├──_setup_util.py│└──setup.zsh└──src└──CMakeLists.txt->/opt/ros/kinetic/share/catkin/cmake/toplevel.cmake通過(guò)tree命令可以看到catkin工作空間的結(jié)構(gòu),它包括了src、build、devel三個(gè)路徑,在有些編譯選項(xiàng)下也可能包括其他。但這三個(gè)文件夾是catkin編譯系統(tǒng)默認(rèn)的。它們的具體作用如下:src/:ROS的catkin軟件包(源代碼包)build/:catkin(CMake)的緩存信息和中間文件devel/:生成的目標(biāo)文件(包括頭文件,動(dòng)態(tài)鏈接庫(kù),靜態(tài)鏈接庫(kù),可執(zhí)行文件等)、環(huán)境變量在編譯過(guò)程中,它們的工作流程如圖:32Catkin工作空間后兩個(gè)路徑由catkin系統(tǒng)自動(dòng)生成、管理,我們?nèi)粘5拈_(kāi)發(fā)一般不會(huì)去涉及,而主要用到的是src文件夾,我們寫(xiě)的ROS程序、網(wǎng)上下載的ROS源代碼包都存放在這里。在編譯時(shí),catkin編譯系統(tǒng)會(huì)遞歸的查找和編譯src/下的每一個(gè)源代碼包。因此你也可以把幾個(gè)源代碼包放到同一個(gè)文件夾下,如下圖所示:catkin工作空間基本就是以上的結(jié)構(gòu),package是catkin工作空間的基本單元,我們?cè)赗OS開(kāi)發(fā)時(shí),寫(xiě)好代碼,然后catkin_make,系統(tǒng)就會(huì)完成所有編譯構(gòu)建的工作。至于更詳細(xì)的package內(nèi)容,我們將在下節(jié)繼續(xù)介紹。33Package軟件包2.3Package軟件包在1.6節(jié)我們?cè)鴮?duì)package軟件包進(jìn)行了分類(lèi),分別介紹了二進(jìn)制包和源代碼包。而ROS中的package的定義更加具體,它不僅是Linux上的軟件包,更是catkin編譯的基本單元,我們調(diào)用catkin_make編譯的對(duì)象就是一個(gè)個(gè)ROS的package,也就是說(shuō)任何ROS程序只有組織成package才能編譯。所以package也是ROS源代碼存放的地方,任何ROS的代碼無(wú)論是C++還是Python都要放到package中,這樣才能正常的編譯和運(yùn)行。一個(gè)package可以編譯出來(lái)多個(gè)目標(biāo)文件(ROS可執(zhí)行程序、動(dòng)態(tài)靜態(tài)庫(kù)、頭文件等等)。一個(gè)package下常見(jiàn)的文件、路徑有:├──CMakeLists.txt#package的編譯規(guī)則(必須)├──package.xml#package的描述信息(必須)├──src/#源代碼文件├──include/#C++頭文件├──scripts/#可執(zhí)行腳本├──msg/#自定義消息├──srv/#自定義服務(wù)├──models/#3D模型文件├──urdf/#urdf文件├──launch/#launch文件其中定義package的是CMakeLists.txt和package.xml,這兩個(gè)文件是package中必不可少的。catkin編譯系統(tǒng)在編譯前,首先就要解析這兩個(gè)文件。這兩個(gè)文件就定義了一個(gè)package。CMakeLists.txt:定義package的包名、依賴(lài)、源文件、目標(biāo)文件等編譯規(guī)則,是package不可少的成分package.xml:描述package的包名、版本號(hào)、作者、依賴(lài)等信息,是package不可少的成分src/:存放ROS的源代碼,包括C++的源碼和(.cpp)以及Python的module(.py)include/:存放C++源碼對(duì)應(yīng)的頭文件scripts/:存放可執(zhí)行腳本,例如shell腳本(.sh)、Python腳本(.py)msg/:存放自定義格式的消息(.msg)srv/:存放自定義格式的服務(wù)(.srv)models/:存放機(jī)器人或仿真場(chǎng)景的3D模型(.sda,.stl,.dae等)urdf/:存放機(jī)器人的模型描述(.urdf或.xacro)launch/:存放launch文件(.launch或.xml)34Package軟件包通常ROS文件組織都是按照以上的形式,這是約定俗成的命名習(xí)慣,建議遵守。以上路徑中,只有CMakeLists.txt和package.xml是必須的,其余路徑根據(jù)軟件包是否需要來(lái)決定。創(chuàng)建一個(gè)package需要在catkin_ws/src下,用到catkin_create_pkg命令,用法是:catkin_create_pkgpackagedepends其中package是包名,depends是依賴(lài)的包名,可以依賴(lài)多個(gè)軟件包。例如,新建一個(gè)package叫做test_pkg,依賴(lài)roscpp、rospy、std_msgs(常用依賴(lài))。$catkin_create_pkgtest_pkgroscpprospystd_msgs這樣就會(huì)在當(dāng)前路徑下新建test_pkg軟件包,包括:├──CMakeLists.txt├──include│└──test_pkg├──package.xml└──srccatkin_create_pkg幫你完成了軟件包的初始化,填充好了CMakeLists.txt和package.xml,并且將依賴(lài)項(xiàng)填進(jìn)了這兩個(gè)文件中。rospackrospack是對(duì)package管理的工具,命令的用法如下:rostopic命令作用rospackhelp顯示rospack的用法rospacklist列出本機(jī)所有packagerospackdepends[package]顯示package的依賴(lài)包rospackfind[package]定位某個(gè)packagerospackprofile刷新所有package的位置記錄以上命令如果package缺省,則默認(rèn)為當(dāng)前目錄(如果當(dāng)前目錄包含package.xml)35Package軟件包roscdroscd命令類(lèi)似與Linux系統(tǒng)的cd,改進(jìn)之處在于roscd可以直接cd到ROS的軟件包。rostopic命令作用roscd[pacakge]cd到ROSpackage所在路徑roslsrosls也可以視為L(zhǎng)inux指令ls的改進(jìn)版,可以直接lsROS軟件包的內(nèi)容。rosls命令作用rosls[pacakge]列出pacakge下的文件rosdeprosdep是用于管理ROSpackage依賴(lài)項(xiàng)的命令行工具,用法如下:rosdep命令作用rosdepcheck[pacakge]檢查package的依賴(lài)是否滿(mǎn)足rosdepinstall[pacakge]安裝pacakge的依賴(lài)rosdepdb生成和顯示依賴(lài)數(shù)據(jù)庫(kù)rosdepinit初始化/etc/ros/rosdep中的源rosdepkeys檢查package的依賴(lài)是否滿(mǎn)足rosdepupdate更新本地的rosdep數(shù)據(jù)庫(kù)一個(gè)較常使用的命令是rosdepinstall--from-pathssrc--ignore-src--rosdistro=kinetic-y,用于安裝工作空間中src路徑下所有package的依賴(lài)項(xiàng)(由pacakge.xml文件指定)。36CMakeLists.txt2.4CMakeLists.txtCMakeLists.txt原本是Cmake編譯系統(tǒng)的規(guī)則文件,而Catkin編譯系統(tǒng)基本沿用了CMake的編譯風(fēng)格,只是針對(duì)ROS工程添加了一些宏定義。所以在寫(xiě)法上,catkin的CMakeLists.txt與CMake的基本一致。這個(gè)文件直接規(guī)定了這個(gè)package要依賴(lài)哪些package,要編譯生成哪些目標(biāo),如何編譯等等流程。所以CMakeLists.txt非常重要,它指定了由源碼到目標(biāo)文件的規(guī)則,catkin編譯系統(tǒng)在工作時(shí)首先會(huì)找到每個(gè)package下的CMakeLists.txt,然后按照規(guī)則來(lái)編譯構(gòu)建。CMakeLists.txt的基本語(yǔ)法都還是按照CMake,而Catkin在其中加入了少量的宏,總體的結(jié)構(gòu)如下:cmake_minimum_required()#CMake的版本號(hào)project()#項(xiàng)目名稱(chēng)find_package()#找到編譯需要的其他CMake/Catkinpackagecatkin_python_setup()#catkin新加宏,打開(kāi)catkin的PythonModule的支持add_message_files()#catkin新加宏,添加自定義Message/Service/Action文件add_service_files()add_action_files()generate_message()#catkin新加宏,生成不同語(yǔ)言版本的msg/srv/action接口catkin_package()#catkin新加宏,生成當(dāng)前package的cmake配置,供依賴(lài)本包的其他軟件包調(diào)用add_library()#生成庫(kù)add_executable()#生成可執(zhí)行二進(jìn)制文件add_dependencies()#定義目標(biāo)文件依賴(lài)于其他目標(biāo)文件,確保其他目標(biāo)已被構(gòu)建target_link_libraries()#鏈接catkin_add_gtest()#catkin新加宏,生成測(cè)試install()#安裝至本機(jī)如果你從未接觸過(guò)CMake的語(yǔ)法,請(qǐng)閱讀《CMake實(shí)踐》:/Akagi201/learning-cmake/blob/master/docs/cmake-practice.pdf。掌握CMake語(yǔ)法對(duì)于理解ROS工程很有幫助。37CMakeLists.txt為了詳細(xì)的解釋CMakeLists.txt的寫(xiě)法,我們以turtlesim小海龜這個(gè)pacakge為例,讀者可roscd到tuetlesim包下查看,在turtlesim/CMakeLists.txt的寫(xiě)法如下,:cmake_minimum_required(VERSION2.8.3)#CMake至少為2.8.3版project(turtlesim)#項(xiàng)目(package)名稱(chēng)為turtlesim,在后續(xù)文件中可使用變量${PROJECT_NAME}來(lái)引用項(xiàng)目名稱(chēng)turltesimfind_package(catkinREQUIREDCOMPONENTSgeometry_msgsmessage_generationrosconsoleroscpproscpp_serializationroslibrostimestd_msgsstd_srvs)#cmake宏,指定依賴(lài)的其他pacakge,實(shí)際是生成了一些環(huán)境變量,如<NAME>_FOUND,<NAME>_INCLUDE_DIRS,<NAME>_LIBRARYIS#此處catkin是必備依賴(lài)其余的geometry_msgs...為組件find_package(Qt5WidgetsREQUIRED)find_package(BoostREQUIREDCOMPONENTSthread)include_directories(include${catkin_INCLUDE_DIRS}${Boost_INCLUDE_DIRS})#指定C++的頭文件路徑link_directories(${catkin_LIBRARY_DIRS})#指定鏈接庫(kù)的路徑add_message_files(DIRECTORYmsgFILESColor.msgPose.msg)#自定義msg文件add_service_files(DIRECTORYsrvFILESKill.srvSetPen.srvSpawn.srvTeleportAbsolute.srvTeleportRelative.srv)#自定義srv文件generate_messages(DEPENDENCIESgeometry_msgsstd_msgsstd_srvs)#在add_message_files、add_service_files宏之后必須加上這句話,用于生成srvmsg頭文件/module,生成的文件位于devel/include中catkin_package(CATKIN_DEPENDSgeometry_msgsmessage_runtimestd_msgsstd_srvs)#catkin宏命令,用于配置ROS的package配置文件和CMake文件#這個(gè)命令必須在add_library()或者add_executable()之前調(diào)用,該函數(shù)有5個(gè)可選參數(shù):#(1)INCLUDE_DIRS-導(dǎo)出包的include路徑#(2)LIBRARIES-導(dǎo)出項(xiàng)目中的庫(kù)#(3)CATKIN_DEPENDS-該項(xiàng)目依賴(lài)的其他catkin項(xiàng)目#(4)DEPENDS-該項(xiàng)目所依賴(lài)的非catkinCMake項(xiàng)目。#(5)CFG_EXTRAS-其他配置選項(xiàng)set(turtlesim_node_SRCSsrc/turtlesim.cppsrc/turtle.cppsrc/turtle_frame.cpp38CMakeLists.txt)set(turtlesim_node_HDRSinclude/turtlesim/turtle_frame.h)#指定turtlesim_node_SRCS、turtlesim_node_HDRS變量qt5_wrap_cpp(turtlesim_node_MOCS${turtlesim_node_HDRS})add_executable(turtlesim_node${turtlesim_node_SRCS}${turtlesim_node_MOCS})#指定可執(zhí)行文件目標(biāo)turtlesim_nodetarget_link_libraries(turtlesim_nodeQt5::Widgets${catkin_LIBRARIES}${Boost_LIBRARIES})#指定鏈接可執(zhí)行文件add_dependencies(turtlesim_nodeturtlesim_gencpp)add_executable(turtle_teleop_keytutorials/teleop_turtle_key.cpp)target_link_libraries(turtle_teleop_key${catkin_LIBRARIES})add_dependencies(turtle_teleop_keyturtlesim_gencpp)add_executable(draw_squaretutorials/draw_square.cpp)target_link_libraries(draw_square${catkin_LIBRARIES}${Boost_LIBRARIES})add_dependencies(draw_squareturtlesim_gencpp)add_executable(mimictutorials/mimic.cpp)target_link_libraries(mimic${catkin_LIBRARIES})add_dependencies(mimicturtlesim_gencpp)#同樣指定可執(zhí)行目標(biāo)、鏈接、依賴(lài)install(TARGETSturtlesim_nodeturtle_teleop_keydraw_squaremimicRUNTIMEDESTINATION${CATKIN_PACKAGE_BIN_DESTINATION})#安裝目標(biāo)文件到本地系統(tǒng)install(DIRECTORYimagesDESTINATION${CATKIN_PACKAGE_SHARE_DESTINATION}FILES_MATCHINGPATTERN"*.png"PATTERN"*.svg")39package.xml2.5package.xmlpackage.xml也是一個(gè)catkin的package必備文件,它是這個(gè)軟件包的描述文件,在較早的ROS版本(rosbuild編譯系統(tǒng))中,這個(gè)文件叫做manifest.xml,用于描述pacakge的基本信息。如果你在網(wǎng)上看到一些ROS項(xiàng)目里包含著manifest.xml,那么它多半是hydro版本之前的項(xiàng)目了。pacakge.xml包含了package的名稱(chēng)、版本號(hào)、內(nèi)容描述、維護(hù)人員、軟件許可、編譯構(gòu)建工具、編譯依賴(lài)、運(yùn)行依賴(lài)等信息。實(shí)際上rospackfind、rosdep等命令之所以能快速定位和分析出package的依賴(lài)項(xiàng)信息,就是直接讀取了每一個(gè)pacakge中的package.xml文件。它為用戶(hù)提供了快速了解一個(gè)pacakge的渠道。pacakge.xml遵循xml標(biāo)簽文本的寫(xiě)法,由于版本更迭原因,現(xiàn)在有兩種格式并存(format1與format2),不過(guò)區(qū)別不大。老版本(format1)的pacakge.xml通常包含以下標(biāo)簽:<pacakge>根標(biāo)記文件<name>包名<version>版本號(hào)<description>內(nèi)容描述<maintainer>維護(hù)者<license>軟件許可證<buildtool_depend>編譯構(gòu)建工具,通常為catkin<build_depend>編譯依賴(lài)項(xiàng),與Catkin中的<run_depend>運(yùn)行依賴(lài)項(xiàng)說(shuō)明:其中1-6為必備標(biāo)簽,1是根標(biāo)簽,嵌套了其余的所有標(biāo)簽,2-6為包的各種屬性,7-9為編譯相關(guān)信息。在新版本(format2)中,包含的標(biāo)簽為:40package.xml<pacakge>根標(biāo)記文件<name>包名<version>版本號(hào)<description>內(nèi)容描述<maintainer>維護(hù)者<license>軟件許可證<buildtool_depend>編譯構(gòu)建工具,通常為catkin<depend>指定依賴(lài)項(xiàng)為編譯、導(dǎo)出、運(yùn)行需要的依賴(lài),最常用<build_depend>編譯依賴(lài)項(xiàng)<build_export_depend>導(dǎo)出依賴(lài)項(xiàng)<exec_depend>運(yùn)行依賴(lài)項(xiàng)<test_depend>測(cè)試用例依賴(lài)項(xiàng)<doc_depend>文檔依賴(lài)項(xiàng)由此看見(jiàn)新版本的pacakge.xml格式上增加了、、、,相當(dāng)于將之前的build和run依賴(lài)項(xiàng)描述進(jìn)行了細(xì)分。目前Indigo、Kinetic、Lunar等版本的ROS都同時(shí)支持兩種版本的package.xml,所以無(wú)論選哪種格式都可以。為了說(shuō)明pacakge.xml寫(xiě)法,還是以turtlesim軟件包為例,其pacakge.xml文件內(nèi)容如下,我們添加了相關(guān)的注釋?zhuān)?1package.xml<?xmlversion="1.0"?><!--本示例為老版本的pacakge.xml--><package><!--pacakge為根標(biāo)簽,寫(xiě)在最外面--><name>turtlesim</name><version>0.8.1</version><description>turtlesimisatoolmadeforteachingROSandROSpackages.</description><maintaineremail="dthomas@">DirkThomas</maintainer><license>BSD</license><urltype="website">/wiki/turtlesim</url><urltype="bugtracker">/ros/ros_tutorials/issues</url><urltype="repository">/ros/ros_tutorials</url><author>JoshFaust</author><!--編譯工具為catkin--><buildtool_depend>catkin</buildtool_depend><!--編譯時(shí)需要依賴(lài)以下包--><build_depend>geometry_msgs</build_depend><build_depend>qtbase5-dev</build_depend><build_depend>message_generation</build_depend><build_depend>qt5-qmake</build_depend><build_depend>rosconsole</build_depend><build_depend>roscpp</build_depend><build_depend>roscpp_serialization</build_depend><build_depend>roslib</build_depend><build_depend>rostime</build_depend><build_depend>std_msgs</build_depend><build_depend>std_srvs</build_depend><!--運(yùn)行時(shí)需要依賴(lài)以下包--><run_depend>geometry_msgs</run_depend><run_depend>libqt5-core</run_depend><run_depend>libqt5-gui</run_depend><run_depend>message_runtime</run_depend><run_depend>rosconsole</run_depend><run_depend>roscpp</run_depend><run_depend>roscpp_serialization</run_depend><run_depend>roslib</run_depend><run_depend>rostime</run_depend><run_depend>std_msgs</run_depend><run_depend>std_srvs</run_depend></package>以上內(nèi)容是老版本(format1)的寫(xiě)法,如果要寫(xiě)成新版本(format2)則可以改為:42package.xml<?xmlversion="1.0"?><packageformat="2"><!--在聲明pacakge時(shí)指定format2,為新版格式--><name>turtlesim</name><version>0.8.1</version><description>turtlesimisatoolmadeforteachingROSandROSpackages.</description><maintaineremail="dthomas@">DirkThomas</maintainer><license>BSD</license><urltype="website">/wiki/turtlesim</url><urltype="bugtracker">/ros/ros_tutorials/issues</url><urltype="repository">/ros/ros_tutorials</url><author>JoshFaust</author><!--編譯工具為catkin--><buildtool_depend>catkin</buildtool_depend><!--用depend來(lái)整合build_depend和run_depend--><depend>geometry_msgs</depend><depend>rosconsole</depend><depend>roscpp</depend><depend>roscpp_serialization</depend><depend>roslib</depend><depend>rostime</depend><depend>std_msgs</depend><depend>std_srvs</depend><!--build_depend標(biāo)簽未變--><build_depend>qtbase5-dev</build_depend><build_depend>message_generation</build_depend><build_depend>qt5-qmake</build_depend><!--run_depend要改為exec_depend--><exec_depend>libqt5-core</exec_depend><exec_depend>libqt5-gui</exec_depend><exec_depend>message_runtime</exec_depend></package>43Metapacakge軟件元包2.6Metapackage2.6.1Metapackage介紹在一些ROS的教學(xué)資料和博客里,你可能還會(huì)看到一個(gè)Stack(功能包集)的概念,它指的是將多個(gè)功能接近、甚至相互依賴(lài)的軟件包的放到一個(gè)集合中去。但Stack這個(gè)概念在Hydro之后就取消了,取而代之的就是Metapackage。盡管換了個(gè)馬甲,但它的作用沒(méi)變,都是把一些相近的功能模塊、軟件包放到一起。ROS里常見(jiàn)的Metapacakge有:Metapacakge名稱(chēng)描述鏈接navigation導(dǎo)航相關(guān)的功能包集/ros-planning/navigationmoveit運(yùn)動(dòng)規(guī)劃相關(guān)的(主要是機(jī)械臂)功能包集/ros-planning/moveitimage_pipeline圖像獲取、處理相關(guān)的功能包集/ros-perception/image_commonvision_opencvROS與OpenCV交互的功能包集/ros-perception/vision_opencvturtlebot機(jī)器人相關(guān)的功能包集/turtlebot/turtlebotpr2_robotpr2機(jī)器人驅(qū)動(dòng)功能包集/PR2/pr2_robot.........以上列舉了一些常見(jiàn)的功能包集,例如navigation、turtlebot,他們都是用于某一方面的功能,以navigationmetapackage(官方介紹里仍然沿用stack的叫法)為例,它包括了以下軟件包:44Metapacakge軟件元包包名功能navigationMetapacakge,依賴(lài)以下所有pacakgeamcl定位fake_localization定位map_server提供地圖move_base路徑規(guī)劃節(jié)點(diǎn)nav_core路徑規(guī)劃的接口類(lèi)base
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 倉(cāng)管雇傭合同樣本
- 少兒體適能合同
- 住宿用餐框架合同樣本
- 臨水臨電勞務(wù)合同
- 倉(cāng)庫(kù)裝修咨詢(xún)合同樣本
- 巧數(shù)圖形教案
- APP軟件項(xiàng)目開(kāi)發(fā)合同
- 信息保密協(xié)議合同樣本
- 人教版小學(xué)數(shù)學(xué)二年級(jí)上冊(cè)教學(xué)計(jì)劃
- 教學(xué)設(shè)計(jì)萬(wàn)能模板
- 爆破作業(yè)現(xiàn)場(chǎng)勘查記錄表(樣表)
- 臨床試驗(yàn)疑難問(wèn)題解答
- 物資編碼手冊(cè)
- 中國(guó)神經(jīng)外科重癥患者氣道管理
- 畢業(yè)論文建筑沉降觀測(cè)
- 國(guó)航因私免折票系統(tǒng)
- 機(jī)電安裝總進(jìn)計(jì)劃?rùn)M道圖
- 精美教案封面(共1頁(yè))
- 考試焦慮量表TAI(共2頁(yè))
- 初中趣味數(shù)學(xué)(課堂PPT)
- 劉也-酯交換法聚碳酸酯生產(chǎn)工藝設(shè)計(jì)和制備
評(píng)論
0/150
提交評(píng)論