《鴻蒙機器人編程》課件-2-1-ROS基礎理論_第1頁
《鴻蒙機器人編程》課件-2-1-ROS基礎理論_第2頁
《鴻蒙機器人編程》課件-2-1-ROS基礎理論_第3頁
《鴻蒙機器人編程》課件-2-1-ROS基礎理論_第4頁
《鴻蒙機器人編程》課件-2-1-ROS基礎理論_第5頁
已閱讀5頁,還剩156頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

1.ROS起源及特色SmoothingTheROSLearningCurve本課目的:給出學習ROS的有效路徑,加快學習速度內(nèi)容:WhatisROS?WhyisROS?Whattolearn?HowtoLearn??NXROBO20182什么是ROS?RobotOperatingSystem(ROS)是一個適用于機器人的開源的元操作系統(tǒng)。它提供了操作系統(tǒng)應有的服務,包括硬件抽象,底層設備控制,常用函數(shù)的實現(xiàn),進程間消息傳遞,以及包管理。它也提供用于獲取、編譯、編寫、和跨計算機運行代碼所需的工具和庫函數(shù)。松耦合點對點進程網(wǎng)絡,一個分布式的通信框架,幫助程序進程之間更方便地通信。。支持的操作系統(tǒng)ROS主流在基于Unix的平臺上運行。ROS的軟件主要在Ubuntu和MacOSX系統(tǒng)上測試,同時ROS小區(qū)仍持續(xù)支持Fedora,Gentoo,ArchLinux和其它Linux平臺。MicrosoftWindows已開始支時ROS,功能尚待完善。?NXROBO20183什么是ROS??NXROBO20184從計算圖視角理解ROSROS中可執(zhí)行程序的基本單位叫節(jié)點(node)節(jié)點之間通過消息、服務、動作等機制進行通信這樣就組成了一張網(wǎng)狀圖,也叫計算圖什么是ROS??NXROBO20185從文件系統(tǒng)視角理解ROSROS程序的不同組件放在不同的文件夾中文件夾根據(jù)不同的功能對文件進行組織這就是ROS的文件系統(tǒng)結(jié)構(gòu)什么是ROS??NXROBO20186從開源社區(qū)視角理解ROSROS是開源軟件,全球機器人專家分享、貢獻自己的智慧在網(wǎng)絡社區(qū)分享和貢獻軟件及教程形成了強大的ROS開源社區(qū)ROS的起源?NXROBO20187脫胎于斯坦福的STAIR項目成長于PR2機器人項目,ROS是該項目的軟件部分遵循OS理念:為了提高機器人設計和開發(fā)的效率避免機器人領域工作者重復造輪子,統(tǒng)一了開發(fā)標準ROS的歷史?NXROBO20188為什么學習ROS?機器人開發(fā):軟件開發(fā)的比重越來越大軟件框架選擇:是軟件架構(gòu)設計中一個重要的決策ROSPlayerYARPOrocosCARMENOrcaMOOSMicrosoftRoboticsStudio?NXROBO20189ROS的優(yōu)勢1,松散耦合的機制方便機器人軟件框架的組織2,最豐富的機器人功能庫方便快速搭建原型3,便利的數(shù)據(jù)記錄、分析、仿真工具,方便調(diào)試4,學界和產(chǎn)業(yè)界的標準方便學習和交流?NXROBO201810對于開發(fā)者:快速搭建機器人原型?NXROBO201811對于企業(yè):License許可ROS的核心是BSD許可證。這是一個非常寬松的開放許可證。允許在商業(yè)和閉源產(chǎn)品使用。/licenses/BSD-3-Clause/wiki/BSD_licenses?NXROBO201812對于研究人員:豐富的資源,最新的成果目前學術領域大部分最新成果都會發(fā)布ROS的版本“ROS:anopensourceRobotOperatingSystem”(Quigleyetal.,2009):論文引用量9869Source:GoogleScholar2022-07-13

?NXROBO201813最龐大的使用者群體,事實上的機器人標準2018年數(shù)據(jù):目前在使用操作系統(tǒng)做開發(fā)的人員用戶超過60萬。(個人用戶中國第二)?NXROBO201814官方支持ROS的機器人100+產(chǎn)品:目前已經(jīng)有很多機器人公司采用了ROS系統(tǒng)來開發(fā)一些應用于全新市場的產(chǎn)品,如ClearPath,Rethink,Unbounded,Neurala,BlueRiver,BIG-i,最典型的就是WillowGarage的PR2機器人。大公司的支持:Nvidia、博世、高通、英特爾、寶馬以及大疆等。投資機構(gòu)的熱捧:僅2015年,相關風險投資機構(gòu)就在基于ROS操作系統(tǒng)的機器人公司投資了超過1.5億美元。?NXROBO201815代碼統(tǒng)計Thetotallinecountisover14millionlinesofcodeTherehavebeen2477authorsAnd181509commitsAveraging73.3commitsperauthor?NXROBO201816代碼語言cpp:2608592(63.98%)python:553332(13.57%)ansic:297629(7.30%)xml:280615(6.88%)lisp:149439(3.67%)java:135343(3.32%)ruby:26484(0.65%)sh:21120(0.52%)ROS的不足目前基于Ubuntu系統(tǒng),移植嵌入式系統(tǒng)困難無實時性設計體積較大系統(tǒng)整體運行效率低總的來說,ROS不擅長開發(fā)對實時性及成本要求嚴苛的產(chǎn)品。?NXROBO201817一句話概括ROS幫助你快速制作機器人的眾多軟件庫和工具的集合規(guī)定了統(tǒng)一通信接口的松耦合分布式開源軟件框架。最大的好處:即插即用,提供統(tǒng)一軟件接口,事實上的機器人研究的統(tǒng)一平臺。有了統(tǒng)一的平臺,我們才有共同交流的可能,以上也是我們學習ROS的主要原因。?NXROBO201818ROS10YearMontage?NXROBO201819/245826128ROS應該學什么??NXROBO201820入門起步設計思想核心概念核心模塊核心工具?NXROBO201821設計思想:分布式架構(gòu)?NXROBO201822核心概念Nodes(節(jié)點)MessagesandTopics(消息與話題)Services(服務)ROSMaster(ROS管理器)Parameters(參數(shù))Stacksandpackages(功能包集與功能包)?NXROBO201823ROSNodes節(jié)點是各自獨立的可執(zhí)行文件,能夠通過話題、服務或參數(shù)服務器與其他進程(節(jié)點)通信。ROS通過使用節(jié)點將代碼和功能解耦,提高了系統(tǒng)容錯能力和可維護性,使系統(tǒng)簡化。同時,節(jié)點允許了ROS系統(tǒng)能夠布置在任意多個機器上并同時運行。節(jié)點在系統(tǒng)中必須有唯一的名稱。節(jié)點可以使用不同的庫進行編寫,如roscpp和rospy。roscpp基于C++rospy基于Python。?NXROBO201824ROSTopics話題是節(jié)點間用來傳輸數(shù)據(jù)的總線。N-to-NPublish/Subscribe模式:同一個話題也可以有很多個訂閱者。使用TCP/IP傳輸,稱為TCPROS,ROS默認。使用UDP傳輸,稱為UDPROS,適合于遠程操控任務。(低延遲高效率的傳輸方式,但可能產(chǎn)生數(shù)據(jù)丟失)。?NXROBO201825ROSMessages一個節(jié)點通過向特定話題發(fā)布消息。消息具有一定的類型和數(shù)據(jù)結(jié)構(gòu),包括ROS提供的標準類型和用戶自定義類型。消息的類型標準命名方式進行約定:功能包名稱/.msg文件名。最常用的有geometry_msgs/Twist包括線速度和角速度Vectors三維向量?NXROBO201826ROSServices1-to-1Service/Client模型:當你需要直接與節(jié)點通信并獲得應答時,將無法通過話題實現(xiàn),這時需要使用服務。服務需要由使用者開發(fā),節(jié)點并不提供標準服務。命令行工具:rossrv查看有關服務數(shù)據(jù)結(jié)構(gòu)的信息rosservice列出服務清單和查詢某個服務?NXROBO201827ROSMaster向ROS系統(tǒng)中其他節(jié)點提供命名和注冊服務跟蹤和記錄話題的發(fā)布者和訂閱者使ROS節(jié)點之間能夠相互查找。一旦節(jié)點找到了彼此,就能建立一種點對點的通信方式。提供參數(shù)服務器?NXROBO201828ParameterServer參數(shù)服務器是可通過網(wǎng)絡訪問的共享的多變量字典。節(jié)點使用此服務器來存儲和檢索運行時的參數(shù)。?NXROBO201829ROSPackages功能包(Package):ROS中軟件組織的基本形式,用于創(chuàng)建ROS程序。它包含源文件、腳本文件、配置文件、可執(zhí)行文件等。本質(zhì)就是一個特殊的文件夾,此文件夾中的文件和子文件夾按前面所說的文件系統(tǒng)的約定來編排,以方便管理、編譯、使用此功能包。功能包管理:package.xml和CMakelists.txt文件,

其中package.xml用來描述此功能包的基本信息,

包括包名、作者、包之間的依賴等。CMakelists.txt

主要描述如何構(gòu)建、編譯此功能包程序。?NXROBO201830ROSPackageSystem?NXROBO201831核心模塊?NXROBO201832ROS

Package種類?NXROBO201833ROS常用命令工具rostopic(Topics)rosservice(Services)rosnode(Nodes)rosparam(Parameters)rosmsg(Messages)rossrv(Services)roswtf(Generaldebugging)?NXROBO201834ROS常用可視化工具?NXROBO2018353D可視化工具Rviz|ROS常用可視化工具?NXROBO201836集成圖形交互界面rqt|怎樣學習ROS??NXROBO201837兩種教學模式InstructionismVs.Constructionism指導主義(Instructionism):傳統(tǒng)教學方式:老師講,學生聽。特點:開環(huán),或是死循環(huán)周期過長,等到期末考試或若干年工作后。建造主義(Constructionism):Learningbymaking,closetheloopofunderstandingAstepbystepguide?NXROBO201838學習步驟安裝:/ROS/Installation官網(wǎng)教程:/ROS/Tutorials建議初學者認真學完整個“初級”20個教程!?NXROBO201839學習步驟聽到最多的問題之一:問:老師,我tutorials做完了,接下來該干什么?答:運行真實的機器人、解決真實的問題!問:沒有機器人怎么辦?答:仿真環(huán)境?NXROBO201840仿真環(huán)境:由易至難Turtlesim一個QT開發(fā)的2D軌跡顯示接口只能顯示運動軌跡ArbotiX含有一個差速驅(qū)動機器人的rviz仿真器機器人運動及topic數(shù)據(jù)的3D顯示Gazebo功能齊全的3D物理仿真工具非常重,對內(nèi)存和顯卡要求高,慎入!?NXROBO201841進階部分結(jié)合硬件平臺和具體應用學習使用各種packageOpenCV、PCL、MoveIt!、Control、Navigation、SLAM在開發(fā)過程中學習使用調(diào)試仿真工具rqt、rviz、Gazebo開發(fā)測試新的機器人算法集成各類package構(gòu)建機器人原型?NXROBO201842ROS版本那么多,該用哪一個?下載使用統(tǒng)計Hydroandearlier:0.17%Indigo:14.50%(LongTermSupport)Jade:0.50%Kinetic:62.89%(LongTermSupport)Lunar:2.70%Melodic:6.49%(LongTermSupport)?NXROBO201843版本選擇建議初學者:KineticLinux程序設計能力比較強的:Melodic注意:Ubuntu版本要與ROS版本需匹配ROSIndigo+Ubuntu(14.04.1LTS)ROSKinetic+Ubuntu(16.04LTS)ROSDistributionReleases?NXROBO201844命令行不熟悉怎么辦?有IDE/IDEsEclipseCodeBlocksEmacsVimNetBeansQtCreatorQtCreatorPluginforROSPyCharm(communityedition)kDevelopRoboWareStudio?NXROBO201845不熟悉Linux怎么辦?邊用邊學+遇到問題要善用搜索教程:http://www.ee.surrey.ac.uk/Teaching/Unix/中文版:LinuxC/C++程序設計一站式學習/akabook/zh/index.html?NXROBO201846ROS和ROS2.0該學習哪個呢?對于大眾學習者、普通開發(fā)者、機器人算法開發(fā)者,在2018年仍推薦使用ROS。對于軟件架構(gòu)的學習者、強調(diào)實時性的開發(fā)者,建議關注ROS2.0。?NXROBO201847//ROS學習書籍?NXROBO2018482.ROS工作原理及通信機制課程內(nèi)容智能機器人工作流程ROS的工作原理及基本概念ROS消息通信機制ROS服務通信機制ROS動作通信機制ROS參數(shù)服務器通信機制?NXROBO201850智能機器人工作流程?NXROBO201851智能機器人的傳統(tǒng)實現(xiàn)方式?NXROBO201852mainfun_afun_bfun_cfun_cfun_dfun_efun_ffun_dfun_dROS的工作機制——ComputationalGraph(計算圖)?NXROBO201853計算圖:node為頂點,topic/service為邊ROS的工作機制——ComputationalGraph(計算圖)?NXROBO201854小烏龜機器人例子智能機器人基于ROS的實現(xiàn)方式?NXROBO201855智能機器人基于ROS的實現(xiàn)方式?NXROBO201856ROS通信層術語–Resource、NamespaceResource:構(gòu)成計算圖的一切東西都可以稱為資源,比如:node、topic、service、parameter等為了方便使用這些資源,需要對這些資源進行命名,而且要求在系統(tǒng)中具有唯一性Namespace:為了避免名字沖突,ROS提出了一種策略:給同一個功能模塊的資源名字加上一個“前綴”,這個前綴就叫做名字空間(Namespace)??梢詫Ρ菴++中的Namespace概念,或文件夾(文件目錄)的概念,Namespace對于避免名字沖突和提升代碼重用性具有很好的作用。57?NXROBO2022ROS通信層術語-NodeNode:是一個數(shù)據(jù)處理或執(zhí)行動作的進程,是計算圖中的獨立個體,系統(tǒng)中的獨立功能單元。怎樣設計node?密集的通信會導致系統(tǒng)性能的下降而過于緊密的聚合度會增加代碼的耦合度58?NXROBO2022ROS通信層術語–MasterNodeMasternode:計算圖中的管理通信節(jié)點所有信息的中心節(jié)點(超級節(jié)點)它跟蹤節(jié)點中的publisher與subscriber,service的server與client,記錄其他節(jié)點的位置(uri標明,host與port),并將這些信息通知給需要建立鏈接的節(jié)點ROS中無時間同步?。OStime為當前系統(tǒng)時間!多機需要同步系統(tǒng)時間的工具來實現(xiàn)RPS內(nèi)時鐘同步。59?NXROBO2022ROS通信層術語-TopicTopic:ROS中廣為使用的publish-subscribe異步的通信模式。這種方式將信息的產(chǎn)生和使用雙方解耦,首發(fā)雙方的信息都是由masternode進行管理。常用于不斷更新的,含有較少邏輯處理的數(shù)據(jù)通信60?NXROBO2022ROS通信層術語-ServiceService:用于處理ROS通信中的同步通信,采用server/client語義。每個servicetype擁有request與response兩部分,對于service中的Server,ROS不會檢查重名(nameconflict),只有最后注冊的server會生效,與client建立連接。常用于資料量較小,但有強邏輯處理的數(shù)據(jù)交換。61?NXROBO2022ROS通信層術語-ParameterParameter可以看作為ROS系統(tǒng)運行時中定義的全局變量,而Masternode中有Parameterserver來維護這些變量。這些變量的命名同樣遵循namespace的命名規(guī)則namespace的存在使得parameter擁有非常清晰的層次,有效避免重名而且對parameter訪問可以單獨訪問也可以樹狀訪問(層層解析namespace)62?NXROBO2022ROS通信層術語-URI作用:定位node在分布式系統(tǒng)中的位置格式為:protocol://host:portProtocol一般為http或者rosrpc,host為hostname或者IP地址,port則為端口號。比如,在多臺計算機上運行ROS的時候,通常需要指定ROSMaster的位置(整個系統(tǒng)只能有一個)63?NXROBO2022ROS_MASTER_URI=:11311ROS通信層術語-XML-RPCROS通過遠程過程調(diào)用來建立節(jié)點之間的連接以及數(shù)據(jù)傳輸,ROS中的遠程過程調(diào)用通過XML-RPC協(xié)議實現(xiàn)XML-RPC:ROS通信網(wǎng)路中的基礎,一種通用遠程調(diào)用協(xié)議用于masternode與其他節(jié)點之間的信息交換傳輸文本使用XML支持(支持語言類型多)調(diào)用時無狀態(tài)(邏輯較為簡單)ROS中topic/servicep2p傳輸時的nodename信息交換與parameterserver都是由XML-RPC進行支持64?NXROBO2022ROS通信層術語-XML-RPCParameterserver直接使用XML-RPC的數(shù)據(jù)類型:int

或者i4是32位的有符號整型,十進制表示中,前綴-號則為負數(shù)。boolean

只有兩種取值,0和1,用于表示布爾類型。double

實數(shù)類型,前綴-號表示負數(shù)。dataTime.iso8601日期時間,用iso-8601格式表示。base64

用base64算法編碼的二進制字符串。arrayvalues組成的表,在data實體下一層Struct

又稱為map表示關系的集合,每一個struct實體是由一個name與value的鍵值對組成。65?NXROBO2022ROS消息通信機制?NXROBO202266cameraviewer/imagessensor_msgs::Imagepublishsensor_msgs::ImagesubscribeROS消息通信機制?NXROBO202267ROS消息通信過程——實例68?NXROBO2022ROS消息通信過程——實例69?NXROBO2022ROS消息的數(shù)據(jù)類型70std_msgs/Headerheaderfloat32angle_minfloat32angle_maxfloat32angle_incrementfloat32time_incrementfloat32scan_timefloat32range_minfloat32range_maxfloat32[]rangesfloat32[]intensities系統(tǒng)已有的標準消息類型?NXROBO2022生成自己的自定義類型:在package.xml中在CMakeLists.txt中catkin_make!71<build_depend>message_generation</build_depend><run_depend>message_runtime</run_depend>add_message_files(FILESpoint.msg)ROS消息的數(shù)據(jù)類型point.msg文件?NXROBO2022ROS消息通信機制——特點72異步“stream-like”通信異步的publish-subscribe通信模式可以有多個發(fā)布者,可以多個訂閱者TCP/IP或UDP傳輸協(xié)議強類型消息傳輸非阻塞方式,調(diào)用完馬上返回常用于不斷更新的,含有較少邏輯處理的數(shù)據(jù)通信?NXROBO2022ROS服務通信機制73?NXROBO2022ROS服務通信機制74?NXROBO2022ROS服務通信機制75two_num_addition.srv文件系統(tǒng)已有的標準服務類型自定義自己的服務類型?NXROBO2022ROS服務通信機制——特點76同步“function-call-like”通信CS-模式只能有一個服務器,可以有多個客戶端TCP/IP或UDP傳輸協(xié)議強類型消息傳輸阻塞方式,一旦調(diào)用,客戶端得等待服務器端執(zhí)行完才返回,繼續(xù)執(zhí)行下面語句常用于工作量較小的情形,但有強邏輯處理的數(shù)據(jù)交換。?NXROBO2022ROS動作通信機制77?NXROBO2022ROS動作通信機制——特點78形式上與service相同,屬于直接點對點通信調(diào)用形式與message方式類似,非阻塞方式,調(diào)用后立即返回,可以繼續(xù)執(zhí)行下面的語句提供了一種狀態(tài)查詢及反饋機制,讓客戶端了解服務器端的執(zhí)行情況常用于計算量較大的情形,且有強邏輯處理的數(shù)據(jù)交換。?NXROBO2022ROSParameterServer通信機制

Parameterserver就設置在masternode中。79?NXROBO2022DynamicReconfigure給出一種實時監(jiān)測masternode中參數(shù)變化,并對node中相應運行參數(shù)進行修改的機制:dynamicreconfigure。原理略過。我們來通過例子來看看這個機制的強大。打開ROS中的自主導航+2D仿真器Stage(需已先裝上navigation_stagepackage)80$roslaunchnavigation_stagemove_base_gmapping_5cm.launch?NXROBO2022DynamicReconfigure81?NXROBO2022小結(jié)我們詳細介紹了ROS的通信機制的工作原理簡要介紹通信層的核心概念較為詳細地講解消息、服務、動作、參數(shù)服務器四種重要的通信機制82?NXROBO20223.創(chuàng)建工作空間課程介紹課程目的:理解工作空間及功能包掌握工作空間創(chuàng)建方法掌握功能包創(chuàng)建方法所需基礎:具備UbuntuLinux基礎知識84?NXROBO2022課程內(nèi)容ROS的編譯構(gòu)建系統(tǒng)簡介ROS編程的一般流程工作空間的創(chuàng)建及其結(jié)構(gòu)介紹多個工作空間的覆蓋(overlay)功能包的創(chuàng)建及其結(jié)構(gòu)介紹package.xml和Cmakelists.txt文件規(guī)則85?NXROBO2022ROS的編譯構(gòu)建系統(tǒng)Catkin:官方推薦的ROS編譯構(gòu)建系統(tǒng),是原ROS編譯構(gòu)建系統(tǒng)rosbuild的繼承者。catkin通過綜合CMake宏和Python腳本在CMake正常工作流程之前實現(xiàn)一些功能操作。(Drypackages)Rosbuild:過時的編譯構(gòu)建系統(tǒng),不建議使用。但目前官方還在支持以保證早期功能包工作。(Wetpackages)86?NXROBO2022回顧:ROS的文件系統(tǒng)(catkin)87?NXROBO2022創(chuàng)建工程空間創(chuàng)建自己的ROS包在包目錄下創(chuàng)建***.cpp或.py源代碼文件若*.cpp,則修改CMakeLists.txt文件編譯ROS編程的一般流程√本課講解√本課講解88?NXROBO2022Catkin工作空間創(chuàng)建設置環(huán)境變量創(chuàng)建命令構(gòu)建$source/opt/ros/noetic/setup.bash$mkdir-p~/catkin_ws/src

$cd~/catkin_ws/src&catkin_init_workspace$cd~/catkin_ws/

$catkin_make89?NXROBO2022Catkin工作空間結(jié)構(gòu)90?NXROBO2022Catkin工作空間結(jié)構(gòu)源碼空間src存放功能包的所有源碼文件,編譯構(gòu)建時就從這個目錄尋找功能包。其CMakeLists.txt檔,鏈接到\opt\ros\distro\catkin\cmake\toplevel.cmake文件。構(gòu)建空間build存放編譯構(gòu)建過程中的中間檔。開發(fā)空間devel存構(gòu)建好的可執(zhí)行程序和運行庫,可由CATKIN_DEVEL_PREFIX變量重新設定,但目錄的選擇要求必須滿足子目錄沒有功能包。安裝空間install是功能包的安裝目錄,可由CATKIN_INSALL_PREFIX變量重新設定。因為新建工作空間,所以默認的install目錄并未創(chuàng)建,執(zhí)行以下命令創(chuàng)建。91$catkin_makeinstall?NXROBO2022環(huán)境變量設置通過setup.xxxshell腳本引入在~/.bashrc文件中添加source命令環(huán)境變量查看$source/opt/ros/noetic/setup.bash$env|grepros92?NXROBO2022工作空間的overlayROS環(huán)境變量93?NXROBO2022Catkin工作空間overlayOverlayROS系統(tǒng)目錄$source/opt/ros/noetic/setup.bash

$env|grepros

$mkdir-p~/catkin_ws/src

$cd~/catkin_ws/src;catkin_init_workspace

$cd~/catkin_ws;catkin_make

$source~/catkin_ws/devel/setup.bash

$env|grepros94?NXROBO2022Catkin工作空間overlay95?NXROBO2022Catkin工作空間overlayCatkin工作區(qū)之間overlay$mkdir-p~/catkin_ws_2/src

$cd~/catkin_ws_2/src;catkin_init_workspace

$cd~/catkin_ws_2;catkin_make

$source~/catkin_ws_2/devel/setup.bash

$env|grepros96?NXROBO2022Catkin工作空間overlay97?NXROBO2022創(chuàng)建ROS功能包catkin_create_pkg命令行工具創(chuàng)建新的功能包:此命令的格式包括功能包的名稱和依賴項;通常依賴項包括std_msgs、rospy和roscpp。功能包命名規(guī)則:只允許使用小寫字母、數(shù)字和底線;首字符必須是小寫字母示例:98$cd~/catkin_ws/src$catkin_create_pkg[package_name][depend1][depend2][depend3]?NXROBO2022$cd~/catkin_ws/src$catkin_create_pkgbeginner_tutorialsstd_msgsrospyroscpp創(chuàng)建Catkin功能包99?NXROBO2022Catkin功能包配置文件package.xml,范本文件:/usr/lib/python3/dist-packages/catkin_pkg/templates/package.xml.inCMakeLists.txt,范本文件:/usr/lib/python3/dist-packages/catkin_pkg/templates/CMakeLists.txt.in100?NXROBO2022package.xml主要內(nèi)容描述性數(shù)據(jù)(如功能包的簡介、維護者)功能包的元信息(如作者、網(wǎng)站)打包發(fā)行信息(如功能包版本)依賴的ROS功能包或系統(tǒng)軟件包101?NXROBO2022Package.xml規(guī)則——基本信息標簽必填標簽:<name>:功能包名;<version>:版本號,以d.d.d的格式,d表示整數(shù);<description>:功能包特性簡介;<maintainer>:功能包發(fā)布者信息;<license>遵循的版權協(xié)議名如下。可選標簽<url>:功能包的網(wǎng)址信息,主要有功能包相關主頁,開源項目地址等;<author>:功能包的作者信息,可以有多個。102?NXROBO2022Package.xml規(guī)則——依賴關系標簽編譯構(gòu)建依賴:<build_depend>,指定構(gòu)建此功能包需要的軟件包。構(gòu)建匯出依賴:<build_export_depend>,指定此功能包構(gòu)建庫文件需要的軟件包。執(zhí)行依賴:<exec_depend>,指定此功能包運行時需要的軟件包。測試依賴:<test_depend>,指定單元測試需要的附加依賴。構(gòu)建工具依賴:<buildtool_depend>,指定這個包需要構(gòu)建的工具。文檔工具依賴:<doc_depend>,指定了這個包生成文檔的需要文檔生成工具。103?NXROBO2022CMakelists樣例104?NXROBO2022Catkin功能包規(guī)則必須包含package.xml文件;必須包含CMakeLists.txt文件;功能包之間不允許嵌套105?NXROBO2022一個有用的包管理工具:rosdeprosdep安裝rosdep初始化及更新$sudoaptinstallpython3-rosdep$sudorosdepinit

$rosdepupdate106?NXROBO2022rosdep用法rosdepcheck檢查功能包的系統(tǒng)依賴是否安裝rosdepinstall如果系統(tǒng)依賴未安裝則生成bash腳本并執(zhí)行以安裝功能包的系統(tǒng)依賴rosdepkeys列出功能包的系統(tǒng)依賴的key值rosdepresolve根據(jù)key轉(zhuǎn)換出系統(tǒng)依賴rosdep的主要用途是安裝工作空間中ros包的依賴,首先切換到工作空間下,然后運行下述命令即可安裝該工作空間的所有依賴,具體命令如下:rosdepinstall--from-pathssrc--ignore-src-r-y107?NXROBO2022小結(jié)ROS的編譯構(gòu)建系統(tǒng)簡介ROS編程的一般流程工作空間的創(chuàng)建及其結(jié)構(gòu)介紹多個工作空間的覆蓋(overlay)功能包的創(chuàng)建及其結(jié)構(gòu)介紹package.xml和Cmakelists.txt文件規(guī)則ROS功能包的依賴管理工具rosdep108?NXROBO20224.編寫及編譯ROS程序本課程主要內(nèi)容用C++編寫ROSnodeC++代碼編寫CMakeLists.txt的編寫規(guī)則用python編寫ROSnode?NXROBO2022110主要掌握ROSnode的編程范式,理解ROS通信機制在程序中的體現(xiàn)。創(chuàng)建工程空間創(chuàng)建自己的ROS包在包目錄下創(chuàng)建***.cpp或.py源代碼文件若*.cpp,則修改CMakeLists.txt文件編譯ROS編程的一般流程111?NXROBO2022√本課講解√本課講解√本課講解編程語言的選擇C++作為編譯類語言,運行時執(zhí)行效率高,適合計算量較大的算法類程序;C++為ROS原生語言,基于roscpp,功能全面完整Python作為解釋性語言,執(zhí)行效率低,一般不適合大型算法類程序,但其編碼效率較高,修改程序方便,可快速成形和測試?;趓ospy,ROS有些功能沒有python接口112?NXROBO2022編輯工具選擇至于代碼編輯器或IDE的選擇,建議使用Vim或Eclipse。Vim可以讓你專注編碼,而且有很多插件,實現(xiàn)代碼補全、語法高亮、文件管理等功能,但如果沒用過,上手需要一段時間,命令掌握不熟反而效率更低。Eclipse交互界面更為友好,有支持C++版本,使用PyDev插件實現(xiàn)支持Python。113?NXROBO2022用C++編寫ROSnode實例代碼ros_tutorials:/ros/ros_tutorialsroscppapi文檔:/kinetic/api/roscpp/html/鼓勵大家多自己查看文檔,多編程實踐。ROSnode的基本結(jié)構(gòu)115?NXROBO2022#include<ros.h>voidcallback_func(msg){…...}intmain(){

//1.初始化,向rosmaster注冊登記

ros::init(...);

//2.啟動節(jié)點,并定義發(fā)布器、訂閱器、服務器、客戶端、…

ros::NodeHandlenh; ros::Publisherpub=nh.advertise<message_type>(topic_name,buff_len); ros::Subscribersub=nh.subscribe(topic_name,buff_len,callback_func);

//3.循環(huán)發(fā)布消息或響應訂閱到的消息

ros::Rateloop_rate(10); while(ros::ok()){

//3.1構(gòu)建所需要發(fā)布的消息

...

//3.2發(fā)布消息

pub.publish(....);

//3.3調(diào)控節(jié)奏

ros::spinOnce(); loop_rate.sleep(); } return0;}ROS核心函數(shù)和類ros::init()初始化函數(shù)ros::spin()事件循環(huán)函數(shù)ros::spinOnce()單次事件函數(shù)ros::start()啟動函數(shù)ros::shutdown()關閉函數(shù)ros::NodeHandle節(jié)點句柄類ros::Publisher發(fā)布器類ros::Subscriber訂閱器類ros::Rateloop_rate循環(huán)速率類116?NXROBO2022node初始化——ros::init()通過調(diào)用ros::init()函數(shù)來初始化node,目的是向節(jié)點管理器注冊node信息。此函數(shù)向ROS系統(tǒng)傳遞命令行參數(shù)、定義node名字及其它參數(shù)。

在調(diào)用roscpp其它函數(shù)前必須先調(diào)用ros::init(),其函數(shù)原型為:argc和argv:命令行參數(shù)信息,與普通C/C++語言main函數(shù)的命令行參數(shù)一樣,但ROS參數(shù)映像語法為name:=new_name,如:具體請查閱RemappingArguments/RemappingArguments117$rosrunbeginner_tutorialstestfoo:=/a/foo?NXROBO2022name:定義node的名字,不能帶命名空間,可通過映射參數(shù)覆蓋。在ROS系統(tǒng)中要保證Node名字唯一,如果運行同名的node,先運行的node會自動關閉。如果想一個node能同時多實例運行,可以通過參數(shù)映射同樣能實現(xiàn),也可通過設置option為init_options::AnonymousName實現(xiàn)。118?NXROBO2022node初始化——ros::init()options:這個參數(shù)是可選項,是一個位結(jié)構(gòu)體,所以可指定多個選項值,可設置的值有:ros::init_options::NoSigintHandler

指定此參數(shù)將不創(chuàng)建SIGINT信號處理器。如果設置了此參數(shù),為了使node能被正常關閉,需要自行創(chuàng)建SIGINT信號的處理器。SIGINT信號是UNIX系統(tǒng)用來結(jié)束進程的,一般由CTRL+C等方式觸發(fā)。ros::init_options::AnonymousName

指定此參數(shù)將在node名字后追加一個隨機數(shù),這樣同一個node被多次運行時,每個實例名是唯一的。ros::init_options::NoRosou

指定此參數(shù)將不把ros控制臺的輸出信息廣播到/rosout這個topic上。119?NXROBO2022node初始化——ros::init()ros::init()除了上面介紹的初始化函數(shù),還有兩種ros::init()的重載函數(shù):這兩個重載函數(shù)將argc和argv替換成直接指定映像參數(shù)。120?NXROBO2022node啟動——ros::NodeHandlenh通過創(chuàng)建ros::NodeHandle實例來啟動node。這是最通常的做法,此步驟也可通過其他方式完成。第一個ros::NodeHandle實例創(chuàng)建后就會調(diào)用ros::start(),最后一個ros::NodeHandle實例銷毀后就會調(diào)用ros::shutdown()。函數(shù)ros::start()才真正開始執(zhí)行node的內(nèi)部功能,包括運轉(zhuǎn)線程、開始網(wǎng)絡輪詢和xmlrpc循環(huán)、連接內(nèi)部訂閱、運行service服務端等。函數(shù)ros::shutdown()是關閉node的,主要過程有斷開一切網(wǎng)絡連接(用于TOPIC和SERVICE)、從節(jié)點管理器(master)注銷。ros::NodeHandle負責實例化與這個node有關的publisher/subscriber/server/parameterserver對象。121?NXROBO2022創(chuàng)建發(fā)布器發(fā)布器由ros::NodeHandle的實例化對象創(chuàng)建,將所發(fā)布主題的名稱和對應的消息類型告知節(jié)點管理器發(fā)布器創(chuàng)建方式:topic_name:話題名稱,指定往哪個話題上發(fā)消息message_type:消息類型,指定該話題(topic)上傳輸什么類型的消息。buff_len:發(fā)送緩沖區(qū)大小122?NXROBO2022ros::Publisherpub=nh.advertise<message_type>(topic_name,buff_len);創(chuàng)建訂閱器訂閱器由ros::NodeHandle的實例化對象創(chuàng)建,將所訂閱主題的名稱及對應的消息類型告知節(jié)點管理器訂閱器創(chuàng)建方式:topic_name:話題名稱,指定從哪個話題上獲取消息buff_len:接收緩沖區(qū)大小callback_func:回調(diào)函數(shù),即話題(topic)上有數(shù)據(jù)的時候,你要怎么處理這些數(shù)據(jù)。需要程序員明定義此函數(shù)。123?NXROBO2022ros::Subscribersub=nh.subscribe(topic_name,buff_len,callback_func);創(chuàng)建服務器服務器由ros::NodeHandle的實例化對象創(chuàng)建,將服務名稱和服務響應函數(shù)告知節(jié)點管理器,對外廣播所能提供的服務服務器創(chuàng)建方式:service_name:服務名稱,指定能提供哪個服務service_func:響應服務請求的處理函數(shù),即有客戶端請求服務時,你要怎么處理這些請求。需要程序員明定義此函數(shù)。124?NXROBO2022ros::ServiceServerserver=nh.advertiseService(service_name,service_func);創(chuàng)建服務客戶端服務客戶端由ros::NodeHandle的實例化對象創(chuàng)建,將請求服務的名稱和服務類型告知節(jié)點管理器客戶端創(chuàng)建方式:service_name:服務名稱,指定在哪個服務上請求服務service_type:服務類型,指定出請求和響應的類型。125?NXROBO2022ros::ServiceClientclient=nh.ServiceClient<service_type>(service_name);主循環(huán)循環(huán)條件ros::ok():當接受到ctrl+c信號或者ros::shutdown()調(diào)用時,為false,終止運行節(jié)點。主循環(huán)中,使用ros::rate實現(xiàn)將循環(huán)一次的時間控制在一個我們設置的一個周期內(nèi)。126?NXROBO2022或示例:發(fā)布節(jié)點127?NXROBO2022示例:訂閱節(jié)點128?NXROBO2022129?NXROBO2022示例:服務器節(jié)點130?NXROBO2022示例:客戶端節(jié)點ROSnode總結(jié)從api使用角度來看,通信方式的不同體現(xiàn)在程控流上。topic無同步service有同步publish非阻塞call阻塞。何時使用topic或service?實時更新的數(shù)據(jù)使用topic傳輸。特殊邏輯的小數(shù)據(jù)使用service。topic需要更多精力去處理異步數(shù)據(jù)獲得與主控制流的邏輯關系。實現(xiàn)難度上要更高。131?NXROBO2022修改CMakelist.txt文件Cmakelist.txt作用CMakeLists.txt文件CMake構(gòu)建系統(tǒng)的配置文件用于描述代碼如何編譯構(gòu)建以及安裝到何位置等參數(shù)CMake根據(jù)此檔生成makefiles文件,任何兼容CMake的軟件包至少包含一個CMakeLists.txt文件相比普通的CMake項目,catkin項目中的CMakeLists.txt只是額外多加了幾條約束。133?NXROBO2022Cmakelist.txt樣例134?NXROBO2022Cmakelist.txt規(guī)則CMake最低版本要求

(cmake_minimum_required)規(guī)定CMake的最低版本,catkin構(gòu)建必須以此行開頭,使用cmake_minimum_required宏命令。功能包名(project())通過CMake的project()宏命令定義功能包名稱,cmake腳本中通過${PROJECT_NAME}訪問。創(chuàng)建環(huán)境變量${PROJECT_NAME}_BINARY_DIR和${PROJECT_NAME}_SOURCE_DIR。cmake_minimum_required(VERSION2.8.3)project(beginner_tutorials)135?NXROBO2022Cmakelist.txt規(guī)則構(gòu)建時需要的其它CMake/Catkin軟件包

構(gòu)建此工程時需要的其它CMake/Catkin軟件包,而且是構(gòu)建依賴而非運行依賴,使用find_package()宏命令格式:catkin是必須要定義:find_package(<name>[[REQUIRED|COMPONENTS][componets...]])find_package(catkinREQUIRED)136?NXROBO2022Cmakelist.txt規(guī)則在CMake會話,工程依賴的其它包會自動作為catkin的組件(components)加入,如果將其加入到find_package()中則過程則簡單得多:find_package()宏命令會創(chuàng)建<NAME>_FOUND、<NAME>_INCLUDE_DIRS或<NAME>_INCLUDES、<NAME>_LIBRARIES或<NAME>_LIBS、<NAME>_DEFINITIONS這幾個環(huán)境變量,以供CMake腳本調(diào)用,具體情況可在構(gòu)建成功后查看工作空間build目錄下的CMakecache.txt文件137find_package(catkinREQUIREDCOMPONENTSstd_msgsrospyroscpp)?NXROBO2022Cmakelist.txt規(guī)則處理Message/Service/Action文件

Messages(.msg)、services(.srv)和actions(.action)三個文件需要進行預處理以便于功能包構(gòu)建使用,生成所支持的編程語言需要并識別的文件:其后加上宏:add_message_files()add_service_files()add_action_files()generate_messages()138?NXROBO2022處理Message/Service/Action文件還需在find_package()宏中添加功能包信息參數(shù),如:而且在package.xml文件中必須添加message_generation、actionlib和actionlib_msgs為構(gòu)建依賴;message_runtime、actionlib和actionlib_msgs為運行依賴,如果此功能包依賴的其它功能包中已包含此依賴則不必再次添加。提示:actionlib*在需處理.action檔情況下添加find_package(catkinREQUIREDCOMPONENTSmessage_generation)139?NXROBO2022處理Message/Service/Action文件比較完整的示例,(假設這些messages依賴std_msgs和sensor_msgs),如:140?NXROBO2022Cmakelist.txt規(guī)則定義功能包構(gòu)建的輸出信息

為構(gòu)建系統(tǒng)提供catkin特有的信息以供系統(tǒng)生成pkg-config和CMake文件,通過catkin構(gòu)建系統(tǒng)的catkin_package()宏實現(xiàn)。其有5個可選參數(shù):141INCLUDE_DIRS

此功能包輸出的包含路徑(如用于:cflags)LIBRARIES

功能包輸出的庫CATKIN_DEPENDS

依賴的其它catkin工程DEPENDS

依賴的非catkin的CMake工程CFG_EXTRAS

其它配置項?NXROBO2022Cmakelist.txt規(guī)則定義構(gòu)建目標

構(gòu)建目標包括可執(zhí)行程序和庫文件,主要定義內(nèi)容包括:142頭文件路徑庫路徑目標構(gòu)建規(guī)則?NXROBO2022定義構(gòu)建目標包含路徑

包含路徑通過include_directories()和link_directories()兩個宏實現(xiàn),分別表示要包含的頭文件路徑和庫路徑。頭文件路徑可以手動指定路徑也可以使用由find_package()宏生成的形如*_INCLUDE_DIRS這樣的CMake變量。庫路徑,無特殊情況,一般都由find_package()自動生成添加。143?NXROBO2022定義構(gòu)建目標目標規(guī)則

目標規(guī)則主要指定構(gòu)建的目標名稱及其源文件和鏈接需要的庫,由add_executable()和add_library()兩個宏分別實現(xiàn)可執(zhí)行程序和庫目標定義。語法如下:使用target_link_libraries()宏來定義可執(zhí)行程序鏈接需要的庫:144?NXROBO2022Cmakelist.txt規(guī)則單元測試

通過catkin的宏catkin_add_gtest()實現(xiàn):145?NXROBO2022Cmakelist.txt規(guī)則安裝規(guī)則

構(gòu)建完成后,所有構(gòu)建目標將會存放于catkin工作空間的devel目錄,如果想用makeinstall執(zhí)行安裝操作,就必須定義安裝規(guī)則。安裝對象一般有可執(zhí)行程序或腳本、庫、頭文件、roslaunch文件及其它資源類文件。規(guī)則定義通過install()宏實現(xiàn),有四種參數(shù):146TARGETS需安裝的對象ARCHIVEDESTINATION靜態(tài)庫和DLL的清單文件LIBRARYDESTINATION非DLL共享庫和模塊RUNTIMEDESTINATION可執(zhí)行對象和DLL形式的共享庫?NXROBO2022安裝規(guī)則形式如下:

Python綁定庫必須安裝到特殊的活頁夾以便于其它Python代碼import:147?NXROBO2022安裝規(guī)則頭文件安裝規(guī)則示例如下:148?NXROBO2022安裝規(guī)則roslaunch文件等資源文件的安裝規(guī)則示例如下:對于Python執(zhí)行代碼,catkin提供catkin_install_python()宏來解決Python代碼的安裝規(guī)則:對于Python模塊,通過添加*catkin_python_setup()*宏安裝。此宏調(diào)用setup.py,實現(xiàn)Python模塊的安裝。

其它細節(jié)問題請查閱catkin文檔和CMake文檔。149?NXROBO2022編譯構(gòu)建功能包編寫好package.xml、CMakelist.txt及功能代碼就可以進行編譯構(gòu)建了。編譯構(gòu)建工作在catkin工作空間頂層目錄下進行:編譯構(gòu)建部分指定的包:需要安裝的話,就執(zhí)行:$cd~/catkin_ws

$catkin_make$catkin_make-DCATKIN_WHITELIST_PACKAGES=”package1;package2”$catkin_makeinstall150?NXROBO2022用Python編寫ROSnode實例代碼ros_tutorials:/ros/ros_tutorialsroscppapi文檔:/kinetic/api/rospy/html/鼓勵大家多自己查看文檔,多編程實踐。創(chuàng)建工程空間創(chuàng)建自己的ROS包在包目錄下創(chuàng)建***.py源代碼文件無需編譯ROSPython編程基本步驟√本課講解152√本課講解?NXROBO2022ROSnode的基本結(jié)構(gòu)(python)153?NXROBO2022importrospydefcallback(msg):…….if__

溫馨提示

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

評論

0/150

提交評論