版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第1章機(jī)器人操作系統(tǒng)(ROS)概述目錄contentsUbuntu系統(tǒng)及常用指令ROS發(fā)展與現(xiàn)狀安裝ROS認(rèn)識ROSROS開發(fā)環(huán)境搭建Ubuntu系統(tǒng)及常用指令01CATALOGUEUbuntu系統(tǒng)安裝1.下載軟件安裝包(ubuntu-20.04.4)/ubuntu-releases/20.04/2.下載U盤系統(tǒng)制作軟件(UltraISO)/3.安裝方法/video/BV1WZ4y167me?p=7注意:分區(qū)(Swap、Logic、Main)Ubuntu系統(tǒng)界面Ubuntu系統(tǒng)使用介紹1.點擊圖標(biāo)進(jìn)行打開2.使用按鍵“Ctrl+Alt+T”進(jìn)行打開打開終端常用指令ls-顯示文件及文件夾cd-修改工作目錄pwd-打印當(dāng)前工作目錄cp-復(fù)制文件或文件夾mv-移動文件或文件夾rm-刪除文件或文件夾kill-強(qiáng)制關(guān)閉進(jìn)程mkdir-創(chuàng)建目錄/文件夾touch-創(chuàng)建文件gedit-創(chuàng)建文件(文件已存在,則打開)sudo-執(zhí)行指令ROS發(fā)展與現(xiàn)狀02CATALOGUEROS發(fā)展與現(xiàn)狀機(jī)器人開發(fā)不可或缺的工具,已經(jīng)應(yīng)用于各類機(jī)器人開發(fā)安裝ROS03CATALOGUEROS安裝步驟ROS官網(wǎng)安裝步驟:/noetic/Installation/Ubuntu一鍵安裝方式:/ROS安裝步驟安裝目錄:/opt/rosROS安裝步驟啟動rosmaster節(jié)點ROS安裝步驟啟動master啟動Turtlesim啟動鍵盤控制節(jié)點$roscore$rosrunturtlesimturtlesim_node$rosrunturtlesimturtle_teleop_key以下哪個指令可以查看當(dāng)前工作目錄(
)lspwdcdgeditABCD提交單選題1分認(rèn)識ROS04CATALOGUEROS的定義與核心概念
ROS-RobotOperatingSystem,機(jī)器人操作系統(tǒng)=+++通信機(jī)制開發(fā)工具應(yīng)用功能生態(tài)系統(tǒng)ROS的定義與核心概念ROS的定義與核心概念ROS通信機(jī)制介紹話題(Topic)——異步通信機(jī)制節(jié)點間用來傳輸數(shù)據(jù)的重要總線;使用發(fā)布/訂閱模型,數(shù)據(jù)由發(fā)布者傳輸?shù)接嗛喺撸粋€話題的訂閱者或發(fā)布者可以不唯一。消息(Message)——話題數(shù)據(jù)具有一定的類型和數(shù)據(jù)結(jié)構(gòu),包括ROS提供的標(biāo)準(zhǔn)類型和用戶自定義類型;使用編程語言無關(guān)的.msg文件定義,編譯過程中生成對應(yīng)的代碼文件。ROS通信機(jī)制介紹服務(wù)(Service)——同步通信機(jī)制使用客戶端/服務(wù)器(C/S)模型,客戶端發(fā)送請求數(shù)據(jù),服務(wù)器完成處理后返回應(yīng)答數(shù)據(jù);使用編程語言無關(guān)的.srv文件定義請求和應(yīng)答數(shù)據(jù)結(jié)構(gòu),編譯過程中生成對應(yīng)的代碼文件。ROS通信機(jī)制介紹話題與服務(wù)的區(qū)別ROS通信機(jī)制介紹參數(shù)(Parameter)——全局共享字典可通過網(wǎng)絡(luò)訪問的共享、多變量字典;節(jié)點使用此服務(wù)器來存儲和檢索運行時的參數(shù);適合存儲靜態(tài)、非二進(jìn)制的配置參數(shù),不適合存儲動態(tài)配置的數(shù)據(jù)。ROS通信機(jī)制介紹功能包(Package)ROS軟件中的基本單元,包含節(jié)點源碼、配置文件、數(shù)據(jù)定義等。功能包清單(Packagemanifest)
記錄功能包的基本信息,保護(hù)作者信息、許可信息、依賴選項、編譯標(biāo)志等。元功能包(MetaPackage)
組織多個用于同一目的的功能包。ROS開發(fā)環(huán)境搭建05CATALOGUE安裝終端
ROS中需要頻繁使用終端,經(jīng)常需要同時開啟多個窗口,推薦使用Terminator。在終端中,執(zhí)行如下指令,進(jìn)行Terminator的安裝。$sudoaptinstallterminator終端工具Terminator使用效果安裝VSCodeVSCode的全稱是VisualStudioCode,是微軟公司研發(fā)的一款輕量級代碼編輯器,免費,但功能強(qiáng)大。VSCode支持Windows、MacOS、Linux等多種平臺。(1)下載VSCode。下載地址:/docs?start=true(2)安裝VSCode。方式1:雙擊安裝即可(或右擊選擇安裝)。方式2:在所在文件夾下打開終端,輸入如下命令進(jìn)行安裝:打開VSCode后的界面$sudodpkg-ixxxx.debTHANKS感謝觀看第2章機(jī)器人操作系統(tǒng)(ROS)架構(gòu)目錄contentsROS架構(gòu)簡介ROS文件系統(tǒng)ROS計算圖ROS架構(gòu)簡介01CATALOGUEROS架構(gòu)簡介ROS的架構(gòu)可以分為三個層次:操作系統(tǒng)層、中間層和應(yīng)用層,如圖所示。ROS的架構(gòu)ROS架構(gòu)簡介1.操作系統(tǒng)層(OS層)ROS并不是一個傳統(tǒng)意義上的操作系統(tǒng),而只是一個元操作系統(tǒng),無法像Windows、Linux一樣直接運行在計算機(jī)硬件之上,而是需要依托真正意義的操作系統(tǒng)。所以在OS層,可以直接使用ROS官方支持度最好的Ubuntu操作系統(tǒng),也可以使用MacOS、Arch、Debian等操作系統(tǒng),Windows也支持ROS2.0的版本。2.中間層
Linux是一個通用系統(tǒng),并沒有針對機(jī)器人開發(fā)提供特殊的中間件,所以ROS在中間層做了大量的工作,其中最為重要的就是基于TCPROS/UDPROS的通信系統(tǒng)。ROS的通信系統(tǒng)基于TCP/UDP網(wǎng)絡(luò),在此基礎(chǔ)之上進(jìn)行了二次封裝,也就是TCPROS/UDPROS。通信系統(tǒng)使用發(fā)布/訂閱、客戶端/服務(wù)器等模式,實現(xiàn)多種通信機(jī)制的數(shù)據(jù)傳輸。
除了TCPROS/UDPROS的通信機(jī)制外,ROS還提供一種進(jìn)程內(nèi)的通信方法——Nodelet,它可以為多進(jìn)程通信提供一種更優(yōu)化的數(shù)據(jù)傳輸方式,為數(shù)據(jù)的實時性傳輸提供支持。ROS架構(gòu)簡介3.應(yīng)用層
在應(yīng)用層中,ROS需要運行一個管理者——Master,負(fù)責(zé)管理整個系統(tǒng)的正常運行。ROS社區(qū)內(nèi)共享了大量的機(jī)器人應(yīng)用功能包,這些功能包內(nèi)的模塊以節(jié)點為單位運行,以ROS標(biāo)準(zhǔn)的輸入輸出作為接口,開發(fā)者不需要關(guān)注模塊的內(nèi)部實現(xiàn)機(jī)制,只需要了解接口規(guī)則即可實現(xiàn)復(fù)用,極大地提高了代碼開發(fā)效率。作為一種“次級操作系統(tǒng)”,常見的ROS系統(tǒng)架構(gòu)一般有三個部分:ROS架構(gòu)簡介
作為一種“次級操作系統(tǒng)”,常見的ROS系統(tǒng)架構(gòu)一般有三個部分:(1)文件系統(tǒng)級——描述了程序文件在硬盤上是如何組織的,ROS的內(nèi)部結(jié)構(gòu)、文件結(jié)構(gòu)和核心文件都在這一層;(2)計算圖級——說明了程序的運行方式,即進(jìn)程與進(jìn)程,進(jìn)程與系統(tǒng)之間的通信;(3)開源社區(qū)級——描述了開發(fā)者之間是如何共享知識,算法和代碼的。從系統(tǒng)實現(xiàn)角度來劃分ROS的架構(gòu)ROS文件系統(tǒng)02CATALOGUEROS文件系統(tǒng)ROS文件系統(tǒng)主要包括了功能包集、功能包、功能包清單、消息類型、服務(wù)類型和代碼等。ROS文件系統(tǒng)示意圖ROS文件系統(tǒng)1)功能包集(Metapackage)2)功能包(Package)
功能包是ROS系統(tǒng)中軟件組織的主要形式,一個功能包包含了創(chuàng)建ROS程序的最小結(jié)構(gòu)和最小內(nèi)容,如ROS運行的進(jìn)程。3)功能包清單(PackageManifest)
功能包清單是一個package.xml文件,它提供了功能包的相關(guān)信息。4)消息類型(Messagetype)
ROS通過消息進(jìn)行信息傳遞,ROS中提供了大量的標(biāo)準(zhǔn)類型,.msg的文件存儲在功能包的msg文件夾下。5)服務(wù)類型(Serviectype)
在ROS中,擴(kuò)展名為.srv的服務(wù)描述文件定義了ROS中的請求和回應(yīng)的數(shù)據(jù)結(jié)構(gòu),存儲在功能包的srv文件夾下。6)代碼(Code)
功能包的源程序存儲在src文件夾。ROS文件系統(tǒng)一、工作空間
工作空間主要用于存儲ROS功能包工作空間典型結(jié)構(gòu)示意圖ROS文件系統(tǒng)1)源文件空間(默認(rèn)為src文件夾)2)編譯空間(默認(rèn)為build文件夾)3)開發(fā)空間(默認(rèn)為devel文件夾)常用的catkin命令如下:catkin_init_workspace:把指定的工作目錄初始化為ROS的工作空間。catkin_create_pkg:創(chuàng)建功能包。catkin_make:編譯功能包。catkin_find:搜索工作目錄。ROS文件系統(tǒng)二、功能包
功能包是ROS軟件的基本組織形式,一個功能包可以包含多個可執(zhí)行文件。功能包主要包含以下文件夾和文件:1)include:
此文件夾包含了所需庫的頭文件2)msg:
此文件夾存儲消息文件3)srv:
此文件夾存儲服務(wù)文件4)src:
此文件夾存儲程序源文件5)scripts:
此文件夾存儲Python可執(zhí)行腳本文件6)CMakeLists.txt:
規(guī)定了catkin編譯的規(guī)則,如catkin的最低版本,編譯時需要的依賴項和指定生成庫文件/可執(zhí)行文件等7)package.xml:
功能包清單,是package不可缺少的成分。主要記錄了該功能包的名稱、版本號、信息描述、作者信息和許可信息。ROS文件系統(tǒng)二、功能包
8)models:
存放機(jī)器人或仿真場景的3D模型(.sda,.stl,.dae等)9)urdf:
存放機(jī)器人的模型描述文件(.urdf或.xacro)10)launch:
存放launch文件(.launch或.xml)ROS文件系統(tǒng)三、功能包集(Metapackage)
功能包集是不含源代碼且只有一個package.xml文件的特定包,它用于引用其他功能特性類似的功能包。在ROS中有各種不同用途的功能包集,如導(dǎo)航包navigation,機(jī)器人功能包集turtlebot等。
與功能包的CMakeLists.txt不同,功能包集的CMakeLists.txt文件加入了catkin_metapackage()宏,用于指定本軟件包為一個功能包集。同時,功能包集的package.xml文件中也需添加標(biāo)簽聲明是一個功能包集。Metapackage名稱描述鏈接navigation導(dǎo)航相關(guān)的功能包集/ros-planning/navigationmoveit運動規(guī)劃相關(guān)的(主要是機(jī)械
臂)功能包集/ros-planning/moveitvision_opencvROS與OpenCV交互的功能包集/ros-perception/vision_opencvimage_pipeline圖像獲取、處理相關(guān)的功能包集/ros-perception/image_commonturtlebotTurtlebot機(jī)器人相關(guān)的功能包集/turtlebot/turtlebot..................ROS里常見的MetapackageROS計算圖03CATALOGUEROS計算圖
計算圖是由一些共同處理數(shù)據(jù)的ROS進(jìn)程形成的點對點網(wǎng)絡(luò),主要描述進(jìn)程和系統(tǒng)之間的通信。計算圖涉及以下幾個重要概念:節(jié)點(Node)、主題(Topic)、消息(Message)、服務(wù)(Service)、節(jié)點管理器(Master)、參數(shù)服務(wù)器(ParameterServer)和消息記錄包(Bag),這些概念都以各自的方式向計算圖提供數(shù)據(jù)。一、節(jié)點
節(jié)點可以通過主題、服務(wù)、參數(shù)服務(wù)器與其他節(jié)點通信,從而聯(lián)結(jié)成計算圖。ROS通過使用節(jié)點簡化了系統(tǒng),提高了系統(tǒng)容錯性和可維護(hù)性。同時,使用節(jié)點可以保證ROS系統(tǒng)能夠在多個機(jī)器上同時運行。節(jié)點可以使用不同的庫進(jìn)行編寫,如roscpp和rospy;其中roscpp基于C++,rospy基于Python。1)rosrun:
運行ROS節(jié)點2)rosnode:
顯示ROS節(jié)點的信息ROS計算圖二、消息
節(jié)點通過消息實現(xiàn)彼此之間的通信。消息從本質(zhì)上來說,是節(jié)點之間用于交換信息的數(shù)據(jù)結(jié)構(gòu)。ROS提高了多種標(biāo)準(zhǔn)數(shù)據(jù)類型(如整型,浮點型,布爾型等),用戶也可以基于標(biāo)準(zhǔn)消息自定義某種類型的消息。ROS提供了rosmsg命令行工具用于顯示消息信息。1)rosmsglist:
顯示所有消息2)rosmsgshow:
顯示消息3)rosmsgpackage:
顯示用于指定功能包的所有消息4)rosmsgpackages:
顯示使用消息的所有功能包ROS計算圖三、主題
主題是用于標(biāo)識消息內(nèi)容的名稱,消息可以通過一種發(fā)布/訂閱的方式傳遞,而節(jié)點可以向一個指定的主題發(fā)布消息。一個節(jié)點對特定類型的數(shù)據(jù)感興趣就訂閱相應(yīng)的主題。一個節(jié)點可以同時訂閱或者發(fā)布多個主題的消息,多個節(jié)點也發(fā)布或者訂閱同一個主題的消息。發(fā)布者和訂閱者彼此獨立,不互相影響。實際上,主題并不關(guān)注哪些節(jié)點發(fā)布或者訂閱消息,它只關(guān)注消息的類型是否匹配。需要主要的是:主題的名字必須具有唯一性。ROS提供了rostopic命令行工具用于對主題進(jìn)行操作:1)rostopiclist:
顯示當(dāng)前正在發(fā)送和接收的所有主題的列表2)rostopicecho:
實時顯示主題的消息內(nèi)容3)rostopicfind:
顯示使用指定類型的消息的主題4)rostopictype:
顯示指定主題的消息類型5)rostopicinfo:顯示指定主題的信息,包括類型、發(fā)布者,主題接收者等6)rostopicpub[主題名稱][消息類型][參數(shù)]:
向指定的主題發(fā)布消息ROS計算圖四、服務(wù)
當(dāng)節(jié)點之間需要請求/回應(yīng)交互時,主題無法滿足此需求,但可以通過服務(wù)來實現(xiàn)。ROS中的服務(wù)由一對消息來定義:一條消息用于請求(Request),一條消息用于回應(yīng)(Response)。當(dāng)某個ROS節(jié)點提供服務(wù)時,其他節(jié)點可以通過發(fā)送請求消息并等待回應(yīng)來調(diào)用服務(wù)。服務(wù)也必須有唯一的名字。自定義服務(wù)使用功能包中的.srv文件來定義。1)rosservice:
顯示活動的服務(wù)信息2)rossrv:
顯示靜態(tài)的服務(wù)信息ROS計算圖五、參數(shù)服務(wù)器
節(jié)點在運行時使用參數(shù)服務(wù)器存儲和檢索參數(shù),參數(shù)服務(wù)器是一個可通過網(wǎng)絡(luò)API訪問的共享多變量字典。參數(shù)服務(wù)器中的配置參數(shù)通常是全局可見的,這便于查看和更改系統(tǒng)的配置狀態(tài)。1)rosparamlist:
列出參數(shù)服務(wù)器中所有的參數(shù)2)rosparamget/[參數(shù)名稱]:
獲取參數(shù)值3)rosparamset[參數(shù)名稱][參數(shù)值]:
設(shè)置參數(shù)值4)rosparamload[文件名稱]:
從文件中加載參數(shù)到參數(shù)服務(wù)器5)rosparamdelete[參數(shù)名稱]:
刪除參數(shù)ROS提供了rosparam命令行工具用于對參數(shù)進(jìn)行操作ROS計算圖六、消息記錄包
消息記錄包用于保存和回放ROS消息數(shù)據(jù),文件拓展名為.bag。消息記錄包可以獲取并記錄各種傳感器數(shù)據(jù),在沒有實際傳感器的情況下,可以通過回放消息記錄包獲取實驗數(shù)據(jù),極大地方便了算法的開發(fā)和測試。1)rosbagrecord/[主題名稱]:
記錄指定主題的消息2)rosbaginfo[bag文件名]:
查看bag文件的信息3)rosbagplay[bag文件名]:
回放bag文件ROS提供了rosbag命令行工具,可以實現(xiàn)消息記錄包的記錄、播放和壓縮等,具體說明如下:ROS計算圖七、rqt_graphrqt_graph能夠創(chuàng)建一個顯示當(dāng)前系統(tǒng)運行情況的動態(tài)圖形。ROS分布式系統(tǒng)中不同進(jìn)程需要進(jìn)行數(shù)據(jù)交互,計算圖可以以點對點的網(wǎng)絡(luò)形式展現(xiàn)數(shù)據(jù)交互過程。。rqt_graph顯示節(jié)點間的關(guān)系以下哪個指令可以查看ROS中的參數(shù)(
)rostopicrosparamrosservicerosrunABCD提交單選題1分THANKS感謝觀看第3章 ROS通信機(jī)制目錄contentsROS通信機(jī)制介紹ROS項目開發(fā)流程話題通信機(jī)制服務(wù)通信機(jī)制參數(shù)服務(wù)器ROS通信機(jī)制介紹01CATALOGUEROS通信機(jī)制介紹話題(Topic)——異步通信機(jī)制節(jié)點間用來傳輸數(shù)據(jù)的重要總線;使用發(fā)布/訂閱模型,數(shù)據(jù)由發(fā)布者傳輸?shù)接嗛喺撸粋€話題的訂閱者或發(fā)布者可以不唯一。消息(Message)——話題數(shù)據(jù)具有一定的類型和數(shù)據(jù)結(jié)構(gòu),包括ROS提供的標(biāo)準(zhǔn)類型和用戶自定義類型;使用編程語言無關(guān)的.msg文件定義,編譯過程中生成對應(yīng)的代碼文件。ROS通信機(jī)制介紹服務(wù)(Service)——同步通信機(jī)制使用客戶端/服務(wù)器(C/S)模型,客戶端發(fā)送請求數(shù)據(jù),服務(wù)器完成處理后返回應(yīng)答數(shù)據(jù);使用編程語言無關(guān)的.srv文件定義請求和應(yīng)答數(shù)據(jù)結(jié)構(gòu),編譯過程中生成對應(yīng)的代碼文件。ROS通信機(jī)制介紹話題與服務(wù)的區(qū)別ROS通信機(jī)制介紹參數(shù)(Parameter)——全局共享字典可通過網(wǎng)絡(luò)訪問的共享、多變量字典;節(jié)點使用此服務(wù)器來存儲和檢索運行時的參數(shù);適合存儲靜態(tài)、非二進(jìn)制的配置參數(shù),不適合存儲動態(tài)配置的數(shù)據(jù)。ROS項目開發(fā)流程02CATALOGUEROS項目開發(fā)流程ROS項目開發(fā)過程,采用如下步驟:ROS項目開發(fā)流程工作空間(workspace)是一個存放工程開發(fā)相關(guān)文件的文件夾。src:代碼空間(SourceSpace)build:編譯空間(BuildSpace)devel:開發(fā)空間(DevelopmentSpace)install:安裝空間(InstallSpace)ROS項目開發(fā)流程創(chuàng)建工作空間編譯工作空間設(shè)置環(huán)境變量$mkdir-p~/catkin_ws/src$cd~/catkin_ws/src$catkin_init_workspace$cd~/catkin_ws/$catkin_make$sourcedevel/setup.bashROS項目開發(fā)流程創(chuàng)建功能包編譯功能包$cd~/catkin_ws/src$catkin_create_pkglearning_communicationrospyroscppstd_msgsstd_srvs$cd~/catkin_ws$catkin_make$source~/catkin_ws/devel/setup.bash$catkin_create_pkg<package_name>[depend1][depend2][depend3]同一個工作空間下,不允許存在同名功能包
不同工作空間下,允許存在同名功能包話題通信機(jī)制03CATALOGUEROSTopic通信編程話題模型(發(fā)布者/訂閱者)ROSTopic通信編程分別編寫發(fā)布者和訂閱者,實現(xiàn)發(fā)布方以10HZ(每秒10次)的頻率發(fā)布文本消息(“HelloWorld!”),訂閱方訂閱消息并將該消息內(nèi)容輸出至終端。1.編寫發(fā)布者程序首先在前面章節(jié)創(chuàng)建的catkin_ws工作空間下,使用如下命令創(chuàng)建功能包和新建文件:cd~/catkin_ws/srccatkin_create_pkglearning_communicationroscpprospystd_msgsstd_srvscdlearning_communication/srcgeditstring_publisher.cppROSTopic通信編程如何實現(xiàn)一個發(fā)布者:1)初始化ROS節(jié)點;2)向ROSMaster注冊節(jié)點信息,包括發(fā)布的話題名和話題中的消息類型;3)創(chuàng)建消息數(shù)據(jù);4)按照一定頻率循環(huán)發(fā)布消息。ROSTopic通信編程如何實現(xiàn)一個訂閱者:1)初始化ROS節(jié)點;2)訂閱需要的話題;3)循環(huán)等待話題消息,接收到消息后進(jìn)入回調(diào)函數(shù);4)在回調(diào)函數(shù)中完成消息處理。ROSTopic通信編程add_executable(string_publishersrc/string_publisher.cpp)target_link_libraries(string_publisher${catkin_LIBRARIES})add_executable(string_subscribersrc/string_subscriber.cpp)target_link_libraries(string_subscriber${catkin_LIBRARIES)ROSTopic通信編程cd~/catkin_wscatkin_makesourcedevel/setup.bashroscorerosrunlearning_communicationstring_publisherrosrunlearning_communicationstring_subscriber自定義msg話題通信示例下面通過創(chuàng)建自定義消息,要求該消息包含人的信息:姓名、身高、年齡等。自定義msg話題通信示例下面通過創(chuàng)建自定義消息,要求該消息包含人的信息:姓名、身高、年齡等。1.按照固定格式創(chuàng)建msg文件在功能包下新建msg文件夾,新建文件PersonMsg.msg,并在該文件中寫入如下信息:stringnameuint16agefloat64height注:這里使用的基礎(chǔ)數(shù)據(jù)類型string、uint16、float64都是與編程語言無關(guān)的,編譯階段會變成各種語言對應(yīng)的數(shù)據(jù)類型。自定義msg話題通信示例下面通過創(chuàng)建自定義消息,要求該消息包含人的信息:姓名、身高、年齡等。2.修改package.xml和CMakeLists.txt文件內(nèi)容在package.xml中添加功能包依賴<build_depend>message_generation</build_depend><exec_depend>message_runtime</exec_depend>在CMakeLists.txt添加編譯選項find_package(……message_generation)add_message_files(FILESPersonMsg.msg)generate_messages(DEPENDENCIESstd_msgs)catkin_package(……message_runtime)自定義msg話題通信示例下面通過創(chuàng)建自定義消息,要求該消息包含人的信息:姓名、身高、年齡等。如何實現(xiàn)一個發(fā)布者:1)初始化ROS節(jié)點;2)向ROSMaster注冊節(jié)點信息,包括發(fā)布的話題名和話題中的消息類型;3)創(chuàng)建消息數(shù)據(jù);4)按照一定頻率循環(huán)發(fā)布消息。自定義msg話題通信示例下面通過創(chuàng)建自定義消息,要求該消息包含人的信息:姓名、身高、年齡等。如何實現(xiàn)一個訂閱者:1)初始化ROS節(jié)點;2)訂閱需要的話題;3)循環(huán)等待話題消息,接收到消息后進(jìn)入回調(diào)函數(shù);4)在回調(diào)函數(shù)中完成消息處理。ROSTopic通信編程add_executable(person_publishersrc/person_publisher.cpp)target_link_libraries(person_publisher${catkin_LIBRARIES})add_dependencies(person_publisher${PROJECT_NAME}_gencpp)add_executable(person_subscribersrc/person_subscriber.cpp)target_link_libraries(person_subscriber${catkin_LIBRARIES})add_dependencies(person_subscriber${PROJECT_NAME}_gencpp)ROSTopic通信編程cd~/catkin_wscatkin_makesourcedevel/setup.bashroscorerosrunlearning_communicationperson_publisherrosrunlearning_communicationperson_subscriberROS中自定義msg時,字符串用哪個(
)定義。uint32stringfloat64uint16ABCD提交單選題1分服務(wù)通信機(jī)制04CATALOGUEROS服務(wù)通信編程服務(wù)模型(服務(wù)端/客戶端)ROS服務(wù)通信編程分別編寫服務(wù)端和客戶端,實現(xiàn)文本消息(“HelloROS!”)服務(wù)通信的過程。1.編寫服務(wù)端程序首先在前面章節(jié)創(chuàng)建的catkin_ws工作空間下,使用如下命令創(chuàng)建功能包和新建文件:cd~/catkin_ws/srccatkin_create_pkglearning_communicationroscpprospystd_msgsstd_srvscdlearning_communication/srcgeditstring_server.cppROS服務(wù)通信編程如何實現(xiàn)一個服務(wù)器:1)初始化ROS節(jié)點;2)創(chuàng)建Server實例;3)循環(huán)等待服務(wù)請求,進(jìn)入回調(diào)函數(shù);4)在回調(diào)函數(shù)中完成服務(wù)功能的處理,并反饋應(yīng)答數(shù)據(jù)。ROS服務(wù)通信編程如何實現(xiàn)一個客戶端:1)初始化ROS節(jié)點;2)創(chuàng)建一個Client實例;3)發(fā)布服務(wù)請求數(shù)據(jù);4)等待Server處理之后的應(yīng)答結(jié)果。ROS服務(wù)通信編程add_executable(string_serversrc/string_server.cpp)target_link_libraries(string_server${catkin_LIBRARIES})add_executable(string_clientsrc/string_client.cpp)target_link_libraries(string_client${catkin_LIBRARIES})ROS服務(wù)通信編程cd~/catkin_wscatkin_makesourcedevel/setup.bashroscorerosrunlearning_communicationstring_serverrosrunlearning_communicationstring_client1.按照固定格式創(chuàng)建srv文件在功能包下新建srv文件夾,新建文件AddTwoInts.srv,并在該文件中寫入如下信息:#客戶端請求時發(fā)送的兩個數(shù)字int32num1int32num2---#服務(wù)器響應(yīng)發(fā)送的數(shù)據(jù)int32sum自定義srv服務(wù)通信示例自定義srv服務(wù)通信示例本例中,客戶端提交兩個整數(shù)至服務(wù)端,服務(wù)端接收請求后完成求和運算,并返回結(jié)果到客戶端。自定義srv服務(wù)通信示例自定義srv服務(wù)通信示例2.修改package.xml和CMakeLists.txt文件內(nèi)容在package.xml中添加功能包依賴<build_depend>message_generation</build_depend><exec_depend>message_runtime</exec_depend>在CMakeLists.txt添加編譯選項find_package(catkinREQUIREDCOMPONENTSroscpprospystd_msgsstd_srvsmessage_generation)#需要加入message_generation,必須有std_msgsadd_service_files(FILESAddTwoInts.srv)generate_messages(DEPENDENCIESstd_msgs)3.編譯生成中間文件自定義srv服務(wù)通信示例自定義srv服務(wù)通信示例如何實現(xiàn)一個服務(wù)器(AddTwoInts_Server.cpp):1)初始化ROS節(jié)點;2)創(chuàng)建Server實例;3)循環(huán)等待服務(wù)請求,進(jìn)入回調(diào)函數(shù);4)在回調(diào)函數(shù)中完成服務(wù)功能的處理,并反饋應(yīng)答數(shù)據(jù)。自定義srv服務(wù)通信示例自定義srv服務(wù)通信示例如何實現(xiàn)一個客戶端(AddTwoInts_Client.cpp):1)初始化ROS節(jié)點;2)創(chuàng)建一個Client實例;3)發(fā)布服務(wù)請求數(shù)據(jù);4)等待Server處理之后的應(yīng)答結(jié)果。自定義srv服務(wù)通信示例add_executable(AddTwoInts_Serversrc/AddTwoInts_Server.cpp)target_link_libraries(AddTwoInts_Server${catkin_LIBRARIES})add_dependencies(AddTwoInts_Server${PROJECT_NAME}_gencpp)add_executable(AddTwoInts_Clientsrc/AddTwoInts_Client.cpp)target_link_libraries(AddTwoInts_Client${catkin_LIBRARIES})add_dependencies(AddTwoInts_Client${PROJECT_NAME}_gencpp)CMakeLists.txt配置文件自定義srv服務(wù)通信示例cd~/catkin_wscatkin_makesourcedevel/setup.bashroscorerosrunlearning_communicationAddTwoInts_Serverrosrunlearning_communicationAddTwoInts_Client12ROS中自定義服務(wù)的文件夾名稱為(
)msgsrvlaunchrossrvABCD提交單選題1分參數(shù)服務(wù)器05CATALOGUE參數(shù)服務(wù)器也可以說是特殊的“通信方式”。參數(shù)服務(wù)器在ROS中主要用于實現(xiàn)不同節(jié)點之間的數(shù)據(jù)共享。參數(shù)服務(wù)器的維護(hù)方式非常的簡單靈活,總的來講有三種方式:命令行參數(shù)設(shè)置、launch文件內(nèi)讀寫和node源碼。參數(shù)服務(wù)器參數(shù)服務(wù)器機(jī)制1.命令行參數(shù)設(shè)置使用命令行來設(shè)置參數(shù)服務(wù),主要通過rosparam命令來進(jìn)行各種操作設(shè)置。rosparam能夠存儲并操作ROS參數(shù)服務(wù)器(ParameterServer)上的數(shù)據(jù)。參數(shù)服務(wù)器能夠存儲整型、浮點、布爾、字符串、字典和列表等數(shù)據(jù)類型。參數(shù)服務(wù)器rosparam命令rosparam命令作用rosparamsetparam_keyparam_value設(shè)置參數(shù)rosparamgetparam_key顯示參數(shù)rosparamloadfile_name從文件加載參數(shù)rosparamdumpfile_name保存參數(shù)到文件rosparamdelete刪除參數(shù)rosparamlist列出參數(shù)名稱2.launch文件內(nèi)讀寫參數(shù)launch文件中有很多標(biāo)簽,而與參數(shù)服務(wù)器相關(guān)的標(biāo)簽只有兩個,一個是<param>,另一個是<rosparam>。示例如下:參數(shù)服務(wù)器<!--直接定義參數(shù)并賦值--><paramname="velodyne_frame_id"type="string"value="velodyne"/><!--定義參數(shù)并通過arg給參數(shù)賦值--><argname="velodyne_frame_id"default="velodyne"/><paramname="velodyne_frame_id"type="string"value="$(argvelodyne_frame_id)"/>3.節(jié)點源碼內(nèi)進(jìn)行讀寫參數(shù)除了上述最常用的兩種讀寫參數(shù)服務(wù)器的方法,還有一種就是修改ROS的源碼,也就是利用API來對參數(shù)服務(wù)器進(jìn)行操作。C++節(jié)點中實現(xiàn)參數(shù)服務(wù)器的讀寫有兩套API系統(tǒng)。參數(shù)服務(wù)器(1)ros::NodeHandle,該方式的示例如下:
//創(chuàng)建ros節(jié)點句柄ros::NodeHandlenh;stringnode_param;std::vector<std::string>param_names;
//新增參數(shù)到參數(shù)服務(wù)器中nh.setParam("param_1",1.0);nh.param<std::string>("param_2",node_param,"hahaha");參數(shù)服務(wù)器(2)ros::param,相關(guān)示例如下:
stringnode_param;std::vector<std::string>param_names;ros::param::set("param_1",1.0);node_param=ros::param::param("param_2","hahaha");//其他功能ros::param::getParamNames(param_names);ros::param::has("param_2");ros::param::search("param_2",node_param);課程作業(yè)使用海龜仿真器,完成以下編程作業(yè):1.創(chuàng)建一個節(jié)點,在其中實現(xiàn)一個訂閱者和一個發(fā)布者,完成以下功能:
發(fā)布者:發(fā)布海龜速度指令,讓海龜圓周運動
訂閱者:訂閱海龜?shù)奈恢眯畔?,并在終端中周期打印輸出2.創(chuàng)建另外一個節(jié)點,在其中實現(xiàn)一個客戶端,完成以下功能:
客戶端:請求海龜誕生的服務(wù),在仿真器中產(chǎn)生一只新的海龜THANKS感謝觀看第4章 ROS運行管理目錄contentsROS節(jié)點運行管理ROS工作空間覆蓋ROS節(jié)點重名ROS話題名稱設(shè)置ROS參數(shù)名稱設(shè)置Launch文件綜合案例ROS節(jié)點運行管理01CATALOGUEROS節(jié)點運行管理ROS使用多進(jìn)程(節(jié)點)的分布式框架,一個完整的ROS系統(tǒng)可能出現(xiàn)如下情形:
可能包含多臺主機(jī);每臺主機(jī)上有多個工作空間;每個工作空間中又包含多個功能包;每個功能包包含多個節(jié)點,不同的節(jié)點都有自己的節(jié)點名稱;每個節(jié)點可能還會設(shè)置一個或多個話題。ROS節(jié)點運行管理—launch文件launch文件是一個XML格式的文件,可以啟動本地和遠(yuǎn)程的多個節(jié)點,還可以在參數(shù)服務(wù)器中設(shè)置參數(shù)。其作用是簡化節(jié)點的配置與啟動,提高ROS程序的啟動效率。
<launch><nodepkg="learning_communication"type="person_subscriber"name="talker"/><nodepkg="learning_communication"type="person_publisher"name="listener"/></launch>調(diào)用launch文件新建launch文件roslaunchlearning_launchdemo.launch注意:roslaunch命令執(zhí)行l(wèi)aunch文件時,首先會判斷是否啟動了roscore。如果已經(jīng)啟動,則不再啟動,否則,會自動調(diào)用roscore。launch文件標(biāo)簽<launch>標(biāo)簽是所有l(wèi)aunch文件的根標(biāo)簽,充當(dāng)其他標(biāo)簽的容器,文件中的其他內(nèi)容都必須放在這個標(biāo)簽中。<node>標(biāo)簽用于指定ROS節(jié)點,是最常見的標(biāo)簽,需要注意的是roslaunch命令不能保證按照node的聲明順序來啟動節(jié)點(節(jié)點的啟動是多進(jìn)程的)。1.屬性pkg=“包名”:節(jié)點所在的功能包名稱type="nodeType":節(jié)點的可執(zhí)行文件名稱name="nodeName":節(jié)點運行時的名稱(在ROS網(wǎng)絡(luò)拓?fù)渲泄?jié)點的名稱)args="xxxxxxxxx"(可選):將參數(shù)傳遞給節(jié)點2.子級標(biāo)簽env環(huán)境變量設(shè)置remap重映射節(jié)點名稱rosparam參數(shù)設(shè)置param參數(shù)設(shè)置launch文件標(biāo)簽<include>標(biāo)簽用于將另一個xml格式的launch文件導(dǎo)入到當(dāng)前文件中,類似C語言中的頭文件包含。1.屬性file="$(find功能包名)/xxx/xxx.launch":要包含的文件路徑ns="xxx"(可選):在指定命名空間導(dǎo)入文件2.子級標(biāo)簽env環(huán)境變量設(shè)置arg將參數(shù)傳遞給被包含的文件launch文件標(biāo)簽<remap>標(biāo)簽用于重映射ROS計算圖資源的命名。用戶不需要修改已有功能包的接口,只需要將接口名稱重映射,取一個別名,這樣系統(tǒng)就能識別該接口。屬性from="xxx":原命名to="yyy":映射之后的命名比如turtlebot的鍵盤控制節(jié)點發(fā)布速度指令話題是/turtlebot/cmd_vel,但是如果當(dāng)前機(jī)器人訂閱的速度控制話題是/cmd_vel,這時使用<remap>就可以輕松解決問題,實現(xiàn)代碼如下:<remapfrom="/turtelbot/cmd_vel"to="/cmd_vel"/>launch文件標(biāo)簽<param>標(biāo)簽主要用來在參數(shù)服務(wù)器上設(shè)置參數(shù),參數(shù)源可以在標(biāo)簽中通過value指定,也可以通過外部文件加載,在<node>標(biāo)簽中時,相當(dāng)于私有命名空間。launch文件執(zhí)行后,參數(shù)值就加載到ROS的參數(shù)服務(wù)器上。屬性name="命名空間/參數(shù)名":參數(shù)名稱,可以包含命名空間value="xxx"(可選):定義參數(shù)值,如果此處省略,必須指定外部文件作為參數(shù)源type="str|int|double|bool|yaml"(可選):指定參數(shù)類型,如果未指定,roslaunch會嘗試確定參數(shù)類型launch文件標(biāo)簽<rosparam>標(biāo)簽可以將YAML格式文件中的參數(shù)全部導(dǎo)入到ROS參數(shù)服務(wù)器中,或?qū)?shù)導(dǎo)出到Y(jié)AML文件,也可以用來刪除參數(shù),<rosparam>標(biāo)簽在<node>標(biāo)簽中時被視為私有標(biāo)簽。屬性command="load|dump|delete"(可選,默認(rèn)load):加載、導(dǎo)出或刪除參數(shù)file="$(findxxxxx)/xxx/yyy....":加載或?qū)С龅降膟aml文件param="參數(shù)名稱"ns="命名空間"(可選)launch文件標(biāo)簽<arg>標(biāo)簽是用于動態(tài)傳參,類似于函數(shù)的參數(shù),僅限于launch文件使用,便于launch文件的重構(gòu),與ROS節(jié)點內(nèi)部的實現(xiàn)沒有關(guān)系。1.屬性name="參數(shù)名稱":default="默認(rèn)值"(可選)value="數(shù)值"(可選):不可以與default并存doc="描述":參數(shù)說明2.示例設(shè)置argument使用<arg>標(biāo)簽元素,語法如下:<argname="arg-name"default="arg-value"/>launch文件中需要使用argument時,可以使用如下方式調(diào)用:<paramname="foo"value="$(argarg-name)"/><nodename="node"pkg="package"type="type"args="$(argarg-name)"/>ROS工作空間覆蓋02CATALOGUEROS工作空間覆蓋所謂工作空間覆蓋,是指在不同工作空間中,存在同名功能包的情形。(1)新建工作空間A與工作空間B,兩個工作空間中都創(chuàng)建turtlesim功能包。(2)在~/.bashrc文件下追加當(dāng)前工作空間的bash格式如下:source/home/用戶/路徑/工作空間A/devel/setup.bashsource/home/用戶/路徑/工作空間B/devel/setup.bash(3)在終端中輸入命令source.bashrc,加載環(huán)境變量。(4)查看ROS環(huán)境環(huán)境變量echo$ROS_PACKAGE_PATH。結(jié)果:自定義工作空間B:自定義空間A:系統(tǒng)內(nèi)置空間(5)使用命令roscdturtlesim,則此時會進(jìn)入自定義工作空間B。出現(xiàn)上述結(jié)果的原因如下:設(shè)置時需要遵循一定的原則:ROS_PACKAGE_PATH中的值和.bashrc的配置順序相反--->后配置的優(yōu)先級更高。ROS節(jié)點重名03CATALOGUEROS節(jié)點重名場景:ROS中創(chuàng)建的節(jié)點是有名稱的,C++初始化節(jié)點時通過API:ros::init(argc,argv,"xxxx")來定義節(jié)點名稱,在Python中初始化節(jié)點則通過rospy.init_node("yyyy")來定義節(jié)點名稱。在ROS的網(wǎng)絡(luò)拓?fù)渲?,是不可以出現(xiàn)重名的節(jié)點的,在ROS中如果啟動重名節(jié)點的話,之前已經(jīng)存在的節(jié)點會被直接關(guān)閉。[WARN][1578812836.351049332]:Shutdownrequestreceived.[WARN][1578812836.351207362]:Reasongivenforshutdown:[newnoderegisteredwithsamename]rosrun設(shè)置命名空間與重映射1.rosrun設(shè)置命名空間語法:rosrun功能包名
節(jié)點名__ns:=新名稱rosrunturtlesimturtlesim_node__ns:=/xxxrosrunturtlesimturtlesim_node__ns:=/yyy這時會發(fā)現(xiàn)兩個節(jié)點都可以正常運行。再通過運行rosnodelist查看節(jié)點信息,顯示結(jié)果為:/xxx/turtlesim/yyy/turtlesimrosrun設(shè)置命名空間與重映射3.rosrun命名空間與名稱重映射疊加語法:rosrun功能包名
節(jié)點名__ns:=新名稱__name:=新名稱具體案例如下:rosrunturtlesimturtlesim_node__ns:=/xxx__name:=tn運行rosnodelist查看節(jié)點信息,其顯示結(jié)果為:/xxx/tn2.rosrun名稱重映射名稱重映射即為節(jié)點起別名,其語法格式為:rosrun功能包名
節(jié)點名__name:=新名稱具體案例:rosrunturtlesimturtlesim_node__name:=turtle1或rosrunturtlesimturtlesim_node/turtlesim:=turtle1rosrunturtlesimturtlesim_node__name:=turtle2或rosrunturtlesimturtlesim_node/turtlesim:=turtle2同樣兩個節(jié)點都可以運行,使用rosnodelist查看節(jié)點信息,結(jié)果如下:/turtle1/turtle2launch文件設(shè)置命名空間與重映射前面章節(jié)介紹launch文件的使用語法時,在<node>標(biāo)簽中有兩個屬性:name和ns,二者分別是用于實現(xiàn)名稱重映射與命名空間設(shè)置的。使用launch文件方式來設(shè)置命名空間與名稱重映射相對來說比較簡單。下面是launch文件設(shè)置命名空間與名稱重映射的示例。<launch><nodepkg="turtlesim"type="turtlesim_node"name="turtle1"/><nodepkg="turtlesim"type="turtlesim_node"name="turtle2"/><nodepkg="turtlesim"type="turtlesim_node"name="turtle1"ns="hello"/></launch>在<node>標(biāo)簽中,name屬性是必須要的,而ns可選。運行上述launch文件后,使用rosnodelist命令查看節(jié)點信息,則顯示結(jié)果為:/turtle1/turtle2/turtle1/hello編碼設(shè)置命名空間與重映射如果使用自定義節(jié)點實現(xiàn)方式,那么可以更靈活地設(shè)置命名空間與重映射。1.C++實現(xiàn)重映射核心代碼為:ros::init(argc,argv,"zhangsan",ros::init_options::AnonymousName);2.C++實現(xiàn)命名空間核心代碼如下:std::map<std::string,std::string>map;map["__ns"]="xxxx";ros::init(map,"wangqiang");3.Python實現(xiàn)重映射核心代碼:rospy.init_node("lisi",anonymous=True)ros話題名稱設(shè)置04CATALOGUEros話題名稱設(shè)置在ROS中節(jié)點名稱可能出現(xiàn)相同名字的情況,同理,話題名稱也可能重名。
解決策略與節(jié)點名稱重名類似,也是使用名稱重映射或為名稱添加前綴。根據(jù)前綴不同,話題名稱可以分為全局、相對、和私有三種類型。全局(參數(shù)名稱直接參考ROS系統(tǒng),與節(jié)點命名空間平級)相對(參數(shù)名稱參考的是節(jié)點的命名空間,與節(jié)點名稱平級)私有(參數(shù)名稱參考節(jié)點名稱,是節(jié)點名稱的子級)名稱重映射是為名稱起別名,為名稱添加前綴,實現(xiàn)起來比節(jié)點重名更復(fù)雜一點,不單是使用命名空間作為前綴、還可以使用節(jié)點名稱做為前綴。兩種策略的實現(xiàn)有以下三種途徑:1)rosrun命令;2)launch文件;3)編碼實現(xiàn)。rosrun設(shè)置話題重映射rosrun名稱重映射語法:rorun功能包名
節(jié)點名
話題名:=新話題名稱實現(xiàn)teleop_twist_keyboard命令與小海龜顯示節(jié)點通信方案有以下兩種。1.方案一將teleop_twist_keyboard節(jié)點的話題設(shè)置為/turtle1/cmd_vel啟動鍵盤控制節(jié)點:rosrunteleop_twist_keyboardteleop_twist_keyboard.py/cmd_vel:=/turtle1/cmd_vel啟動小海龜顯示節(jié)點:rosrunturtlesimturtlesim_node則二者可以實現(xiàn)正常通信。2.方案二將小海龜顯示節(jié)點的話題設(shè)置為/cmd_vel啟動鍵盤控制節(jié)點:rosrunteleop_twist_keyboardteleop_twist_keyboard.py啟動小海龜顯示節(jié)點:rosrunturtlesimturtlesim_node/turtle1/cmd_vel:=/cmd_vel則二者同樣可以實現(xiàn)正常通信。launch文件設(shè)置話題重映射launch文件設(shè)置話題重映射語法如下:<nodepkg="xxx"type="xxx"name="xxx"><remapfrom="原話題"to="新話題"/></node>實現(xiàn)teleop_twist_keyboard節(jié)點與小海龜顯示節(jié)點通信方案有以下兩種。1.方案一將teleop_twist_keyboard節(jié)點的話題設(shè)置為/turtle1/cmd_vel<launch><nodepkg="turtlesim"type="turtlesim_node"name="t1"/><nodepkg="teleop_twist_keyboard"type="teleop_twist_keyboard.py"name="key"><remapfrom="/cmd_vel"to="/turtle1/cmd_vel"/></node></launch>這樣可以實現(xiàn)二者的正常通信。launch文件設(shè)置話題重映射2.方案二將小海龜顯示節(jié)點的話題設(shè)置為/cmd_vel<launch><nodepkg="turtlesim"type="turtlesim_node"name="t1"><remapfrom="/turtle1/cmd_vel"to="/cmd_vel"/></node><nodepkg="teleop_twist_keyboard"type="teleop_twist_keyboard.py"name="key"/></launch>同樣可以實現(xiàn)二者的正常通信。編碼設(shè)置話題重映射演示準(zhǔn)備:(1)初始化節(jié)點,設(shè)置一個節(jié)點名稱;ros::init(argc,argv,"hello")(2)設(shè)置不同類型的話題。(3)啟動節(jié)點時,傳遞一個__ns:=xxx。(4)節(jié)點啟動后,使用rostopic查看話題信息。1)全局名稱格式:以“/”開頭的名稱,和節(jié)點名稱無關(guān)比如:/xxx/yyy/zzz示例1:ros::Publisherpub=nh.advertise<std_msgs::String>("/chatter",1000);結(jié)果1:/chatter示例2:ros::Publisherpub=nh.advertise<std_msgs::String>("/chatter/money",1000);結(jié)果2:/chatter/money編碼設(shè)置話題重映射2)相對名稱格式:非“/”開頭的名稱,參考命名空間(與節(jié)點名稱平級)來確定話題名稱示例1:ros::Publisherpub=nh.advertise<std_msgs::String>("chatter",1000);結(jié)果1:xxx/chatter示例2:ros::Publisherpub=nh.advertise<std_msgs::String>("chatter/money",1000);結(jié)果2:xxx/chatter/money編碼設(shè)置話題重映射3)私有名稱格式:以“~”開頭的名稱示例1:ros::NodeHandlenh("~");ros::Publisherpub=nh.advertise<std_msgs::String>("chatter",1000);結(jié)果1:/xxx/hello/chatter示例2:ros::NodeHandlenh("~");ros::Publisherpub=nh.advertise<std_msgs::String>("chatter/money",1000);結(jié)果2:/xxx/hello/chatter/money注:當(dāng)使用“~”,而話題名稱又以“/”開頭時,那么話題名稱是絕對的ros參數(shù)名稱設(shè)置05CATALOGUEros參數(shù)名稱設(shè)置
在ROS中的節(jié)點名稱、話題名稱可能出現(xiàn)同名的情況,同理,參數(shù)名稱也可能重名。
為了避免參數(shù)重名,通常都是采用為參數(shù)名添加前綴的方式,其實現(xiàn)方式類似于話題名稱,有全局、相對和私有三種類型。
全局(參數(shù)名稱直接參考ROS系統(tǒng),與節(jié)點命名空間平級);
相對(參數(shù)名稱參考的是節(jié)點的命名空間,與節(jié)點名稱平級);
私有(參數(shù)名稱參考節(jié)點名稱,是節(jié)點名稱的子級)。
設(shè)置參數(shù)的方式同樣有三種方式:rosrun命令、launch文件、編碼實現(xiàn)。rosrun設(shè)置參數(shù)rosrun在啟動節(jié)點時,也可以設(shè)置參數(shù)。語法:rosrun功能包名
節(jié)點名稱_參數(shù)名:=參數(shù)值啟動小海龜顯示節(jié)點,并設(shè)置參數(shù)A=100,語句為:rosrunturtlesimturtlesim_node_A:=100通過運行rosparamlist查看節(jié)點信息,結(jié)果顯示為:/turtlesim/A/turtlesim/background_b/turtlesim/background_g/turtlesim/background_r結(jié)果顯示參數(shù)A前綴節(jié)點名稱,也就是說rosrun執(zhí)行設(shè)置參數(shù),參數(shù)名使用的是
私有模式。launch文件設(shè)置參數(shù)
通過launch文件設(shè)置參數(shù)時,可以在<node>標(biāo)簽外,或<node>標(biāo)簽中通過<param>或<rosparam>來設(shè)置參數(shù)。在<node>標(biāo)簽外設(shè)置的參數(shù)是全局性質(zhì)的,參考的是“/”,在<node>標(biāo)簽中設(shè)置的參數(shù)是私有性質(zhì)的,參考的是/命名空間/節(jié)點名稱。以<param>標(biāo)簽為例設(shè)置參數(shù)如下:<launch><paramname="p1"value="100"/><nodepkg="turtlesim"type="turtlesim_node"name="turtle1"><paramname="p2"value="100"/></node></launch>通過運行rosparamlist命令查看節(jié)點信息,其結(jié)果為:/p1/turtle1/p2編碼設(shè)置參數(shù)使用C++方式時,可以使用ros::param或者ros::NodeHandle來設(shè)置參數(shù)。1)ros::param設(shè)置參數(shù)設(shè)置參數(shù)調(diào)用的API是ros::param::set,該函數(shù)中,參數(shù)1傳入?yún)?shù)名稱,參數(shù)2是傳入?yún)?shù)值,參數(shù)1中設(shè)置參數(shù)名稱時,如果以“/”開頭,那么就是全局參數(shù),如果以“~”開頭,那么就是私有參數(shù),既不以“/”也不以“~”開頭,那么就是相對參數(shù)。代碼示例如下:ros::param::set("/set_A",100);//全局參數(shù),和命名空間以及節(jié)點名稱無關(guān)ros::param::set("set_B",100);//相對參數(shù),參考命名空間ros::param::set("~set_C",100);//私有參數(shù),參考命名空間與節(jié)點名稱運行時,假設(shè)設(shè)置的命名空間為xxx,節(jié)點名稱為yyy,通過執(zhí)行rosparamlist命令查看結(jié)果為:/set_A/xxx/set_B/xxx/yyy/set_C編碼設(shè)置參數(shù)2)ros::NodeHandle設(shè)置參數(shù)使用ros::NodeHandle方式設(shè)置參數(shù)時,首先需要創(chuàng)建NodeHandle對象,然后調(diào)用該對象的setParam函數(shù),該函數(shù)參數(shù)1為參數(shù)名,參數(shù)2為要設(shè)置的參數(shù)值,如果參數(shù)名以“/”開頭,那么就是全局參數(shù),如果參數(shù)名不以“/”開頭,那么,該參數(shù)是相對參數(shù)還是私有參數(shù)與NodeHandle對象有關(guān),如果NodeHandle對象創(chuàng)建時是調(diào)用的默認(rèn)的無參構(gòu)造,那么該參數(shù)是相對參數(shù),如果NodeHandle對象創(chuàng)建時是使用ros::NodeHandlenh("~"),那么該參數(shù)就是私有參數(shù)。代碼示例如下:ros::NodeHandlenh;nh.setParam("/nh_A",100);//全局參數(shù),和命名空間以及節(jié)點名稱無關(guān)nh.setParam("nh_B",100);//相對參數(shù),參考命名空間ros::NodeHandlenh_private("~");nh_private.setParam("nh_C",100);//私有參數(shù),參考命名空間與節(jié)點名稱運行時,假設(shè)設(shè)置的命名空間為xxx,節(jié)點名稱為yyy,運行rosparamlist命令查看結(jié)果為:/nh_A/xxx/nh_B/xxx/yyy/nh_Claunch文件綜合案例06CATALOGUElaunch文件綜合案例
以小海龜為案例,綜合param標(biāo)簽、rosparam標(biāo)簽、arg標(biāo)簽、多節(jié)點啟動設(shè)置來看看如何在launch文件中使用這些標(biāo)簽。在launch文件夾中新建turtlesim_parameter_config.launch文件,并在該文件中輸入如下信息。<launch><paramname="/turtle_number"value="2"/><argname="TurtleName1"default="Turtle1"/><argname="TurtleName2"default="Turtle2"/><nodepkg="turtlesim"type="turtlesim_node"name="turtlesim_node"> <paramname="turtle_name1"value="$(argTurtleName1)"/> <paramname="turtle_name2"value="$(argTurtleName2)"/> <rosparamfile="$(findlearning_launch)/config/param.yaml"command="load"/></node><nodepkg="turtlesim"type="turtle_teleop_key"name="turtle_teleop_key"output="screen"/></launch>launch文件綜合案例
運行l(wèi)aunch文件后,再執(zhí)行rosparamlist查看參數(shù)加載情況及執(zhí)行rosparamget查看參數(shù)值,其結(jié)果如下圖所示。以下哪種方式不能設(shè)置參數(shù)(
)rosrun設(shè)置set設(shè)置launch文件設(shè)置編碼設(shè)置ABCD提交單選題1分以下哪個選項不屬于ros話題類型(
)全局局部相對私有ABCD提交單選題1分THANKS感謝觀看第5章ROS常用組件工具目錄contentsTF坐標(biāo)變換Gazebo工具RViz工具rosbag錄制和回放數(shù)據(jù)rqt工具rosbridgeTF坐標(biāo)變換01CATALOGUETF坐標(biāo)標(biāo)變換TF坐標(biāo)標(biāo)變換TF功能包能干什么?1)五秒鐘之前,機(jī)器人頭部坐標(biāo)系相對于全局坐標(biāo)系的關(guān)系是什么樣的?2)機(jī)器人夾取的物體相對于機(jī)器人中心坐標(biāo)系的位置在哪里?3)機(jī)器人中心坐標(biāo)系相對于全局坐標(biāo)系的位置在哪里?TF坐標(biāo)變換如何實現(xiàn)?1)廣播TF變換2)監(jiān)聽TF變換TF坐標(biāo)標(biāo)變換機(jī)器人機(jī)器人的本體坐標(biāo)系與雷達(dá)坐標(biāo)系坐標(biāo)系之間的數(shù)據(jù)變換TF坐標(biāo)標(biāo)變換—靜態(tài)坐標(biāo)變換
當(dāng)坐標(biāo)系之間的相對位置固定時,那么所需參數(shù)也是固定的:父系坐標(biāo)名稱、子級坐標(biāo)系名稱、x偏移量、y偏移量、z偏移量、x翻滾角度、y俯仰角度、z偏航角度,實現(xiàn)邏輯相同,參數(shù)不同,ROS系統(tǒng)已經(jīng)封裝好了專門的節(jié)點,使用方式如下:rosruntf2_rosstatic_transform_publisherx偏移量y偏移量z偏移量z偏航角度y俯仰角度x翻滾角度
父級坐標(biāo)系
子級坐標(biāo)系示例:rosruntf2_rosstatic_transform_publisher0.200.5000/baselink/laserTF坐標(biāo)標(biāo)變換—動態(tài)坐標(biāo)變換
動態(tài)坐標(biāo)變換,是指兩個坐標(biāo)系之間的相對位置是變化的。下面以小海龜跟隨實驗案例來演示動態(tài)坐標(biāo)變換過程。如何實現(xiàn)一個tf廣播器1)定義TF廣播器(TransformBroadcaster)2)創(chuàng)建坐標(biāo)變換值
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- GB/T 35922-2025不透性石墨浸漬耐蝕作業(yè)技術(shù)規(guī)范
- 2026春招:學(xué)習(xí)成長企劃顧問題目及答案
- 2026年橋梁設(shè)計中的地震動參數(shù)研究
- 2026年橋梁設(shè)計中的非線性分析與優(yōu)化
- 2026年未來電氣傳動控制的研究方向
- 2026春招:維修技術(shù)員筆試題及答案
- 販毒與吸毒的法律問題
- 住院部病患護(hù)理質(zhì)量評估
- 2026年邯鄲科技職業(yè)學(xué)院單招綜合素質(zhì)考試備考試題帶答案解析
- 2026年黑龍江旅游職業(yè)技術(shù)學(xué)院單招職業(yè)技能考試參考題庫帶答案解析
- 2025年青島衛(wèi)生局事業(yè)單位考試及答案
- 紀(jì)委檔案規(guī)范制度
- 杭州錢塘新區(qū)建設(shè)投資集團(tuán)有限公司2025年度第三次公開招聘工作人員備考題庫及完整答案詳解
- 眼科質(zhì)控課件
- 安徽信息會考題庫及答案
- 2025年中級消防監(jiān)控題庫及答案
- 隧道施工廢水處理人員培訓(xùn)方案
- 2025年射頻識別技術(shù)面試題庫及答案
- 揀貨主管年終總結(jié)
- 糖尿病重癥患者腸內(nèi)營養(yǎng)血糖調(diào)控方案
- CSR社會責(zé)任管理手冊
評論
0/150
提交評論