機(jī)器人操作系統(tǒng)ROS原理及應(yīng)用 課件匯 09 ROS文件系統(tǒng)與包管理工具 -30 可視化與仿真、31-32 復(fù)習(xí)與考試_第1頁(yè)
機(jī)器人操作系統(tǒng)ROS原理及應(yīng)用 課件匯 09 ROS文件系統(tǒng)與包管理工具 -30 可視化與仿真、31-32 復(fù)習(xí)與考試_第2頁(yè)
機(jī)器人操作系統(tǒng)ROS原理及應(yīng)用 課件匯 09 ROS文件系統(tǒng)與包管理工具 -30 可視化與仿真、31-32 復(fù)習(xí)與考試_第3頁(yè)
機(jī)器人操作系統(tǒng)ROS原理及應(yīng)用 課件匯 09 ROS文件系統(tǒng)與包管理工具 -30 可視化與仿真、31-32 復(fù)習(xí)與考試_第4頁(yè)
機(jī)器人操作系統(tǒng)ROS原理及應(yīng)用 課件匯 09 ROS文件系統(tǒng)與包管理工具 -30 可視化與仿真、31-32 復(fù)習(xí)與考試_第5頁(yè)
已閱讀5頁(yè),還剩250頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

ROS文件系統(tǒng)與包管理

一、ROS文件系統(tǒng)

二、ROS包管理

三、操作示例2024/11/292ROS文件系統(tǒng)一、ROS文件系統(tǒng)ROS的工程結(jié)構(gòu),也就是ROS的文件系統(tǒng)結(jié)構(gòu),是ROS軟件開發(fā)項(xiàng)目的組織形式2024/11/294ROS文件系統(tǒng)也叫catkin工作空間Catkin工作空間是創(chuàng)建、修改、編譯catkin軟件包的目錄。catkin的工作空間,里面存放著ROS的各種項(xiàng)目工程,便于系統(tǒng)組織管理調(diào)用。在可視化圖形界面里是一個(gè)文件夾。build和devel目錄由catkin系統(tǒng)自動(dòng)生成、管理,我們?nèi)粘5拈_發(fā)一般不會(huì)去涉及2024/11/295ROS工作區(qū)/工作區(qū)開發(fā)中主要用到的是src文件夾我們編寫的ROS程序、網(wǎng)上下載的ROS源代碼包都存放在這里。在編譯時(shí),catkin編譯系統(tǒng)會(huì)遞歸的查找和編譯src/下的每一個(gè)源代碼包因此也可以把幾個(gè)源代碼包放到同一個(gè)文件夾下2024/11/296ROS工作空間/工作區(qū)mkdir-p~/mycatkin_ws/srccd~/mycatkin_wscatkin_makesource~/mycatkin_ws/devel/setup.bash

第一行代碼直接創(chuàng)建了第二層級(jí)的文件夾src,這也是存放ROS軟件包的地方。第二行代碼進(jìn)入工作空間第三行代碼執(zhí)行catkin_make初始化(編譯軟件包)catkin_make必須在工作空間目錄執(zhí)行,在其他路徑下編譯不會(huì)成功

第四行代碼刷新環(huán)境,使得系統(tǒng)能夠找到剛才編譯生成的ROS可執(zhí)行文件一般緊跟著要source刷新環(huán)境,這個(gè)細(xì)節(jié)比較容易遺漏,致使后面出現(xiàn)可執(zhí)行文件無(wú)法打開等錯(cuò)誤

2024/11/297創(chuàng)建并初始化ROS工作空間一個(gè)軟件包(package)下常見的文件、路徑有:

├──CMakeLists.txt #package的編譯規(guī)則(必須)

├──package.xml #package的描述信息(必須)

├──src/ #源代碼文件

├──include/ #C++頭文件

├──scripts/ #可執(zhí)行腳本

├──msg/ #自定義消息

├──srv/ #自定義服務(wù)

├──models/ #3D模型文件

├──urdf/ #urdf文件

├──launch/ #launch文件2024/11/298軟件包(package)結(jié)構(gòu)一個(gè)軟件包(package)下常見的文件、路徑有:

├──CMakeLists.txt #軟件包的編譯規(guī)則(必須)

├──package.xml #軟件包的描述信息(必須)最簡(jiǎn)單的包只有這兩個(gè)文件

2024/11/299軟件包(package)結(jié)構(gòu)CMakeLists.txt文件規(guī)定了這個(gè)軟件包(package)要依賴哪些軟件包(package),要編譯生成哪些目標(biāo),如何編譯等等流程。

CMakeLists.txt非常重要?。?!它指定了由源碼到目標(biāo)文件的規(guī)則,catkin編譯系統(tǒng)在工作時(shí)首先會(huì)找到每個(gè)軟件包(package)下的CMakeLists.txt,然后按照規(guī)則來(lái)編譯構(gòu)建。必須掌握CMakeLists.txt基本修改方法?。?!通常的做法是在系統(tǒng)生成的模板文件上修改2024/11/2910CMakeLists.txt文件cmake_minimum_required() #CMake的版本號(hào)

project() #項(xiàng)目名稱

find_package() #找到編譯需要的其他package

catkin_python_setup() #打開catkin的PythonModule的支持

add_message_files() #添加自定義Message文件

add_service_files()

#添加自定義Service文件

add_action_files() #添加自定義Action文件

generate_message() #生成不同語(yǔ)言版本的msg/srv/action接口

catkin_package() #生成當(dāng)前package的cmake配置,供依賴本包的其他

軟件包調(diào)用

add_library() #生成庫(kù)

add_executable() #生成可執(zhí)行二進(jìn)制文件

add_dependencies()

#定義目標(biāo)文件依賴于其他目標(biāo)文件,確保其他目

標(biāo)已被構(gòu)建

target_link_libraries() #鏈接

catkin_add_gtest() #生成測(cè)試

install()

#安裝至本機(jī)

2024/11/2911CMakeLists.txt寫法package.xml也是一個(gè)catkin的package必備文件,它是這個(gè)軟件包的描述文件。2024/11/2912package.xmlpacakge.xml包含了package的名稱、版本號(hào)、內(nèi)容描述、維護(hù)人員、軟件許可、編譯構(gòu)建工具、編譯依賴、運(yùn)行依賴等信息。

實(shí)際上rospackfind、rosdep等命令之所以能快速定位和分析出package的依賴項(xiàng)信息,就是直接讀取了每一個(gè)pacakge中的package.xml文件。它為用戶提供了快速了解一個(gè)pacakge的渠道。

2024/11/2913package.xml的作用二、ROS包管理命令rospack獲取軟件包的有關(guān)信息。在本教程中,我們只涉及到rospack中find參數(shù)選項(xiàng),該選項(xiàng)可以turtlesim用法:#rospackfind[包名稱]示例:$rospackfindroscpp返回軟件包的路徑信息2024/11/2915使用rospackroscd進(jìn)入ros軟件包目錄用法:#roscd

cd[包名稱]示例:$roscdroscpp進(jìn)入軟件包的路徑2024/11/2916使用roscdrosls列出軟件包的文件信息用法:#rosls[包名稱]示例:$rosls

turtlesim返回軟件包的路徑信息2024/11/2917使用rosls三、操作示例2024/11/2919示例一創(chuàng)建ROS工作空間如果catkin_ws目錄已經(jīng)存在,先刪除mkdir-p~/mycatkin_ws/srccd~/mycatkin_wscatkin_makesource~/mycatkin_ws/devel/setup.bashecho“source~/mycatkin_ws/devel/setup.bash”>>~/.bashrc2024/11/2920示例二導(dǎo)入ros軟件包1、創(chuàng)建工作空間2、下載軟件包(http://www.yzyfine.top/download/turtlesim.zip)3、放入工作空間的src目錄并解壓4、在工作空間運(yùn)行catkin_make命令編譯工作空間下的軟件包5、刷新環(huán)境變量source~/mycatkin_ws/devel/setup.bash6、運(yùn)行()roscorerosrunturtlesimturtlesim_noderosrunturtlesimdraw_square2024/11/2921示例三VScode編寫python測(cè)試程序1、進(jìn)入前面已經(jīng)創(chuàng)建的工作空間mycatkin_wscd~/mycatkin_ws2、啟動(dòng)vscodecode.3.編寫測(cè)試程序操作演示(1)創(chuàng)建包指定包名test,指定依賴roscpprospystd_msgs(2)創(chuàng)建scripts文件夾(存放python文件)2024/11/2922示例三VScode編寫python測(cè)試程序3.編寫測(cè)試程序操作演示(3)創(chuàng)建python文件#!/usr/bin/envpythonimportrospyif__name__=="__main__":rospy.init_node("mynode")rospy.loginfo("helloworld")2024/11/2923示例三VScode編寫python測(cè)試程序3.編寫測(cè)試程序操作演示(4)設(shè)置python文件權(quán)限,設(shè)置CMakelists.txt2024/11/2924示例三VScode編寫python測(cè)試程序3.編寫測(cè)試程序操作演示(5)編譯(shift+ctrl+B)(6)運(yùn)行(先啟動(dòng)主節(jié)點(diǎn)master)刷新環(huán)境變量source~/XXX/devel/setup.bashrosrun包名python文件名

2024/11/2925示例三VScode編寫python測(cè)試程序ROS包管理1、創(chuàng)建名稱為mycatkin_ws工作空間2、進(jìn)入工作空間src目錄3、刷新工作空間路徑到ROS環(huán)境echo“source~/mycatkin_ws/devel/setup.bash”>>~/.bashrc4、關(guān)閉當(dāng)前終端窗口后再開一個(gè)新終端2024/11/2927任務(wù)一創(chuàng)建ROS工作空間1、下載軟件包(2:8080/file/turtlesim.zip)2、放入工作空間的src目錄并解壓3、在工作空間運(yùn)行catkin_make命令編譯工作空間下的軟件包4、運(yùn)行roscorerosrunturtlesimturtlesim_noderosrunturtlesimdraw_square2024/11/2928任務(wù)二導(dǎo)入ROS包1、使用rospacklist統(tǒng)計(jì)本機(jī)上的軟件包,把軟件包清單存入文件allpack2、統(tǒng)計(jì)軟件包數(shù)量追加到allpack3、把turtlesim軟件包的目錄路徑存入文件tj_turtle4、把turtlesim包所包含的文件和目錄列表追加到tj_turtle2024/11/2929任務(wù)三使用ROS包管理工具ROS節(jié)點(diǎn)與話題什么是節(jié)點(diǎn)node在ROS的世界里,最小的進(jìn)程單元就是節(jié)點(diǎn)(node)。一個(gè)軟件包里可以有多個(gè)可執(zhí)行文

件,可執(zhí)行文件在運(yùn)行之后就成了一個(gè)進(jìn)程(process),這個(gè)進(jìn)程在ROS中就叫做節(jié)點(diǎn)。2024/11/2931

ROS節(jié)點(diǎn)(node)什么是節(jié)點(diǎn)node從程序角度來(lái)說,node就是一個(gè)可執(zhí)行文件(通常為C++編譯生成的可執(zhí)行文件、Python腳本)被執(zhí)行,加載到了內(nèi)存之中;從功能角度來(lái)說,通常一個(gè)node負(fù)責(zé)機(jī)器人的某一個(gè)單獨(dú)的功能。2024/11/2932

ROS節(jié)點(diǎn)(node)什么是節(jié)點(diǎn)node由于機(jī)器人的功能模塊非常復(fù)雜,我們往往不會(huì)把所有功能都集中到一個(gè)node上。例如在輪式機(jī)器人中:一個(gè)node來(lái)控制底盤輪子的運(yùn)動(dòng),一個(gè)node驅(qū)動(dòng)攝像頭獲取圖像,一個(gè)node驅(qū)動(dòng)激光雷達(dá),一個(gè)node根據(jù)傳感器信息進(jìn)行路徑規(guī)劃……

2024/11/2933

ROS節(jié)點(diǎn)(node)什么是節(jié)點(diǎn)node一個(gè)節(jié)點(diǎn)只負(fù)責(zé)單一功能,這樣做可以降低程序發(fā)生崩潰的可能性,如果把所有功能都寫到一個(gè)程序中,模塊間的通信、異常處理將會(huì)很麻煩。

前面的例子中,小海龜畫面顯示程序(turtlesim_node)、小海龜鍵盤控制程序(turtle_teleop_key)、小海龜畫正方形程序(draw_square)都是節(jié)點(diǎn)2024/11/2934

ROS節(jié)點(diǎn)(node)節(jié)點(diǎn)(Node)執(zhí)行具體任務(wù)的進(jìn)程、獨(dú)立運(yùn)行的可執(zhí)行文件;不同節(jié)點(diǎn)可使用不同的編程語(yǔ)言,可分布式運(yùn)行在不同的主機(jī);節(jié)點(diǎn)在系統(tǒng)中的名稱必須是唯一的。2024/11/2935

ROS節(jié)點(diǎn)(node)節(jié)點(diǎn)管理器(master)機(jī)器人實(shí)際運(yùn)行時(shí)往往會(huì)運(yùn)行眾多的node。為了調(diào)配、管理這些node,ROS提供節(jié)點(diǎn)管理器

master,管理各個(gè)節(jié)點(diǎn)node。當(dāng)ROS程序啟動(dòng)時(shí),第一步首先啟動(dòng)master,由節(jié)點(diǎn)管理器處理依次啟動(dòng)node。

2024/11/2936

ROS節(jié)點(diǎn)(node)節(jié)點(diǎn)管理器ROS程序控制中心為節(jié)點(diǎn)node提供命名和注冊(cè)服務(wù);跟蹤和記錄話題/服務(wù)通信,輔助節(jié)點(diǎn)相互查找、建立連接;提供參數(shù)服務(wù)器,節(jié)點(diǎn)使用此服務(wù)器存儲(chǔ)和檢索運(yùn)行時(shí)的參數(shù)2024/11/2937

ROS節(jié)點(diǎn)(node)節(jié)點(diǎn)管理器ROS程序啟動(dòng)時(shí)必須先啟動(dòng)master使用下列ros命令roscore2024/11/2938

ROS節(jié)點(diǎn)(node)1節(jié)點(diǎn)運(yùn)行命令rosrun

$rosrunpkg_nameprog_name

包名程序名包名和程序名記不太清是可以使用tab鍵補(bǔ)全

2024/11/2939

ROS節(jié)點(diǎn)操作命令2節(jié)點(diǎn)管理命令rosnode

2024/11/2940

ROS節(jié)點(diǎn)操作命令rosnodelist列出當(dāng)前運(yùn)行的node信息rosnodeinfonode_name顯示node的詳細(xì)信息rosnodekillnode_name結(jié)束某個(gè)noderosnodeping測(cè)試連接節(jié)點(diǎn)

話題topictopic是ROS中的常用的通信方式。適用于實(shí)時(shí)性、周期性的消息傳輸。topic是一種點(diǎn)對(duì)點(diǎn)的單向通信方式,這里的“點(diǎn)”指的是node,也就是說node之間可以通過topic方式來(lái)傳遞信息。

2024/11/2941

ROS話題發(fā)布者與訂閱者話題topic通信中發(fā)送話題數(shù)據(jù)的節(jié)點(diǎn)稱為發(fā)布者(publisher)

接受話題數(shù)據(jù)的節(jié)點(diǎn)稱為訂閱者(

subscriber

2024/11/2942

ROS話題消息(message)話題topic通信的數(shù)據(jù)稱為消息(message)

2024/11/2943

ROS話題話題topic通信的過程topic要經(jīng)歷下面幾步的初始化過程:首先,publisher節(jié)點(diǎn)和subscriber節(jié)點(diǎn)都要到節(jié)點(diǎn)管理器進(jìn)行注冊(cè),然后publisher會(huì)發(fā)布topic,subscriber在master的指揮下會(huì)訂閱該主題topic,從而建立起發(fā)布-訂閱(pub-sub)之間的通信。整個(gè)過程是單向的,數(shù)據(jù)由發(fā)布者傳遞給訂閱者。2024/11/2944

ROS話題發(fā)布/訂閱模型發(fā)布者可以發(fā)布一個(gè)或多個(gè)話題發(fā)布者也可以是訂閱者一個(gè)發(fā)布者可以有多個(gè)訂閱者,一個(gè)訂閱者可以訂閱多個(gè)話題一個(gè)話題topic可以被多個(gè)節(jié)點(diǎn)同時(shí)發(fā)布,也可以同時(shí)被多個(gè)節(jié)點(diǎn)接收2024/11/2945

ROS話題理解“異步”概念在發(fā)布者node1每發(fā)布一次消息之后,就會(huì)繼續(xù)執(zhí)行下一個(gè)動(dòng)作,至于消息是什么狀態(tài)、被怎樣處理,它不需要了解;對(duì)于訂閱者node2,它只管接收和處理某個(gè)話題上的消息,至于是誰(shuí)發(fā)來(lái)的,它不會(huì)關(guān)心。所以node1、node2兩者都是各司其責(zé),不存在協(xié)同工作,稱這樣的通信方式是異步的

2024/11/2946

ROS話題命令作用rostopiclist

列出當(dāng)前所有的topicrostopicinfotopic_name顯示某個(gè)topic的屬性信息rostopicechotopic_name顯示某個(gè)topic的內(nèi)容rostopicpubtopic_name...向某個(gè)topic發(fā)布內(nèi)容rostopicbwtopic_name查看某個(gè)topic的帶寬rostopichztopic_name查看某個(gè)topic的頻率rostopicfindtopic_type查找某個(gè)類型的topicrostopictypetopic_name查看某個(gè)topic的類型(msg)2024/11/2947

ROS話題操作命令

2024/11/2948節(jié)點(diǎn)計(jì)算圖概念計(jì)算圖(ComputationGraph)是一個(gè)由ROS進(jìn)程組成的點(diǎn)對(duì)點(diǎn)網(wǎng)絡(luò),它們能夠共同處理數(shù)據(jù)。ROS的基本計(jì)算圖概念有節(jié)點(diǎn)(Nodes)、主節(jié)點(diǎn)(Master)、參數(shù)服務(wù)器(ParameterServer)、消息(Messages)、服務(wù)(Services)、話題(Topics)和包(Bags),它們都以不同的方式向圖(Graph)提供數(shù)據(jù)。節(jié)點(diǎn)(Nodes):節(jié)點(diǎn)是一個(gè)可執(zhí)行文件,可以與其他節(jié)點(diǎn)進(jìn)行通信。消息(Messages):訂閱或發(fā)布話題時(shí)所使用的ROS數(shù)據(jù)類型。話題(Topics):節(jié)點(diǎn)可以將消息發(fā)布到話題,或通過訂閱話題來(lái)接收消息。主節(jié)點(diǎn)(Master):ROS的命名服務(wù),例如幫助節(jié)點(diǎn)發(fā)現(xiàn)彼此。rosout:在ROS中相當(dāng)于stdout/stderr(標(biāo)準(zhǔn)輸出/標(biāo)準(zhǔn)錯(cuò)誤)。roscore:主節(jié)點(diǎn)+rosout+

參數(shù)服務(wù)器(會(huì)在以后介紹)。2024/11/2949使用rqt_grqph查看節(jié)點(diǎn)構(gòu)成的計(jì)算圖1、在ROS中啟動(dòng)小烏龜示例程序$roscore$rosrunturtlesimturtlesim_node$rosrunturtlesimturtle_teleop_key2、使用rosnodelist查看啟動(dòng)的節(jié)點(diǎn)列表3、使用rosnodeinfo查看具體節(jié)點(diǎn)信息4、使用rqt_graph

查看計(jì)算圖理解并掌握節(jié)點(diǎn)運(yùn)行和管理命令rosrun

、rosnode的基本用法2024/11/2950作業(yè):運(yùn)行和查看節(jié)點(diǎn)ROS話題與消息在之前建立的turtlesim例子中,鍵盤控制節(jié)點(diǎn)(turtle_teleop_key)和仿真節(jié)點(diǎn)(turtulesim_node)以某種方式進(jìn)行對(duì)話使海龜響應(yīng)按鍵操作。ROS節(jié)點(diǎn)之間進(jìn)行通信所利用的最重要的機(jī)制就是消息傳遞(發(fā)布/訂閱)。2024/11/2952ROS消息在ROS中,消息就是數(shù)據(jù),有組織地存放在話題里。消息傳遞的理念是:當(dāng)一個(gè)節(jié)點(diǎn)想要分享信息時(shí),它就會(huì)發(fā)布(publish)消息到對(duì)應(yīng)的一個(gè)或者多個(gè)話題;當(dāng)一個(gè)節(jié)點(diǎn)想要接收信息時(shí),它就會(huì)訂閱(subscribe)它所需要的一個(gè)或者多個(gè)話題。ROS節(jié)點(diǎn)管理器負(fù)責(zé)確保發(fā)布節(jié)點(diǎn)和訂閱節(jié)點(diǎn)能找到對(duì)方;而且消息是直接地從發(fā)布節(jié)點(diǎn)傳遞到訂閱節(jié)點(diǎn),中間并不經(jīng)過節(jié)點(diǎn)管理器轉(zhuǎn)交。2024/11/2953ROS消息話題的通信是通過節(jié)點(diǎn)間發(fā)送ROS消息實(shí)現(xiàn)的。為了使發(fā)布者(turtle_teleop_key)和訂閱者(turtulesim_node)進(jìn)行通信,發(fā)布者和訂閱者必須發(fā)送和接收相同類型的消息。這意味著話題的類型是由發(fā)布在它上面消息的類型決定的。2024/11/2954ROS消息使用rostopicecho查看話題數(shù)據(jù)(消息)內(nèi)容$rostopicecho/turtle1/cmd_vel

需要按鍵控制烏龜節(jié)點(diǎn)移動(dòng)才看得到數(shù)據(jù)變化2024/11/2955查看話題數(shù)據(jù)(消息)內(nèi)容使用rostopicecho查看話題數(shù)據(jù)(消息)內(nèi)容$rostopicecho/turtle1/cmd_vel每當(dāng)/teleop_turtle接收到按鍵信息時(shí),將會(huì)顯示類似右圖的結(jié)果。輸出中的每一個(gè)“---”線表示一個(gè)消息的結(jié)束以及另一個(gè)消息的起始linear:線速度angular:角速度2024/11/2956查看話題數(shù)據(jù)(消息)內(nèi)容$rostopichz/turtle1/cmd_vel$rostopicbw/turtle1/cmd_vel第一條命令輸出每秒發(fā)布的消息數(shù)量第二條命令輸出每秒發(fā)布消息所占的字節(jié)量這些命令主要用于調(diào)試,它們提供了一種簡(jiǎn)單的方法來(lái)驗(yàn)證這些消息確實(shí)有規(guī)律地在向這些特定的話題發(fā)布2024/11/2957查看話題發(fā)布頻率、帶寬rostopicinfo/turtle1/cmd_vel輸出了該話題的消息類型。Type在文本輸出中表示數(shù)據(jù)類型。理解消息的類型很重要,因?yàn)樗鼪Q定了消息的內(nèi)容。也就是說,一個(gè)話題的消息類型能告訴你該話題中每個(gè)消息攜帶了哪些信息,以及這些信息是如何組織的2024/11/2958查看消息類型要想查看某種消息類型的詳情,使用類似下面的命令:rosmsgshow#顯示消息的說明描述rosmsglist#列出所有消息

rosmsgmd5#顯示消息的md5碼rosmsgpackage#列出單個(gè)包中的消息rosmsgpackages#列出包含消息的軟件包2024/11/2959rosmsg消息管理命令rosmsgshow消息類型

例如:rosmsgshowturtlesim/Color

其輸出為:

uint8ruint8guint8brosmsgshow可以幫助理解通過話題傳輸?shù)臄?shù)據(jù)類型的具體構(gòu)成,即變量類型及變量名稱(結(jié)構(gòu)體)2024/11/2960使用rosmsgshow查看消息類型(詳情)rosmsgshowturtlesim/Color輸出的格式是域(field)的列表,每行一個(gè)元素。每一個(gè)域由基本數(shù)據(jù)類型(例如int8、bool、或者string)以及域名稱定義。turtlesim/Color包含三個(gè)無(wú)符號(hào)8位整型變量r,g和b。任何話題的消息只要是turtlesim/Color類型,都由上述三個(gè)域的值定義。2024/11/2961使用rosmsgshow查看消息類型(詳情)rosmsgshowgeometry_msgs/Twistgeometry_msgs/Twist

是ROS中常用消息類型。該消息類型對(duì)應(yīng)/turtle1/cmd_vel話題geometry_msgs/Twist

消息包含六個(gè)成員,并且以兩個(gè)向量的形式組織,分別為linear

angular(線速度和角速度)。其中每個(gè)數(shù)值都是基本數(shù)據(jù)類型float64,即每個(gè)數(shù)值都是64位浮點(diǎn)型數(shù)據(jù)2024/11/2962使用rosmsgshow查看消息類型(詳情)線速度值為正時(shí)沿相應(yīng)的軸正向移動(dòng),值為負(fù)時(shí)反向移動(dòng)角速度值為正時(shí)沿相應(yīng)的軸逆時(shí)針轉(zhuǎn)動(dòng),值為負(fù)時(shí)順時(shí)針轉(zhuǎn)動(dòng)2024/11/2963linear和angular(線速度和角速度)ROS復(fù)合域是由簡(jiǎn)單的一個(gè)或者多個(gè)子域組合而成,其中的每一個(gè)子域可能是另一個(gè)復(fù)合域或者獨(dú)立的域,而且它們一般也都由基本數(shù)據(jù)類型組成常見的例子:

geometry_msgs/Twist表示線速度和角速度std_msgs/Header序列號(hào),時(shí)間戳以及坐標(biāo)系等信息sensor_msgs/NavSatFix表示單個(gè)GPS的定位數(shù)據(jù)sensor_msgs/LaserScan表示激光雷達(dá)數(shù)據(jù)2024/11/2964使用rosmsgshow查看消息類型(詳情)和ROS里其他的程序一樣,每個(gè)消息類型都屬于一個(gè)特定的包。消息類型名總會(huì)包含一個(gè)斜杠,斜杠前面的名字是包含它的包turtlesim/Color消息類型按如下方式分解:turtlesim+Color?turtlesim/Color

功能包名類型名稱消息類型2024/11/2965理解消息類型的命名rostopicpub可以把數(shù)據(jù)發(fā)布到當(dāng)前某個(gè)正在廣播的話題上$rostopicpub-1

/turtle1/cmd_velgeometry_msgs/Twist--'[2.0,0.0,0.0]''[0.0,0.0,1.8]‘

rostopicpub

參數(shù)

話題消息類型消息值以上命令會(huì)發(fā)送一條消息給turtlesim,告訴它以2.0大小的線速度沿x軸正向移動(dòng)和1.8大小的角速度繞z軸逆時(shí)針轉(zhuǎn)動(dòng)。

該命令執(zhí)行一次,畫一段圓弧2024/11/2966使用rostopicpub發(fā)布消息空格$rostopicpub-r1/turtle1/cmd_velgeometry_msgs/Twist--'[2.0,0.0,0.0]''[0.0,0.0,1.8]'

r表示重復(fù)執(zhí)行消息發(fā)布1次(只能是1)

以上命令會(huì)發(fā)送消息給turtlesim,告訴它以2.0大小的線速度沿x軸正向移動(dòng)和1.8大小的角速度繞z軸逆時(shí)針轉(zhuǎn)動(dòng)。該命令重復(fù)執(zhí)行,每秒執(zhí)行一次,畫一個(gè)圓平面圖形中,geometry_msgs/Twist類型的數(shù)據(jù)線速度只有x,y軸有效,角速度只有z軸有效2024/11/2967使用rostopicpub發(fā)布消息rostopicpub另一種用法:輸入

rostopicpub-r1/turtle1/cmd_vel后按tab補(bǔ)全消息類型然后再按一次tab補(bǔ)全消息格式然后移動(dòng)光標(biāo)修改線速度的x分量、角速度的z分量2024/11/2968使用rostopicpub發(fā)布消息重復(fù)執(zhí)行,頻率為1赫茲執(zhí)行一次2024/11/2969使用rostopicpub發(fā)布消息2024/11/2970rostopicpub常用的角速度值弧度角度值

180°3.14159263/4135°2.356194492/3120°2.0943951/290°1.570796326/360°1.04719755/445°0.78539816/630°0.5235987/1215°0.2617993873/2270°4.71238898畫半圓rostopicpub-1/turtle1/cmd_velgeometry_msgs/Twist--'[3,0,0]''[0,0,-3.1415926]'逆時(shí)針旋轉(zhuǎn)90°

rostopicpub-1/turtle1/cmd_velgeometry_msgs/Twist--'[0,0,0]''[0,0,1.5707963]'畫圓弧rostopicpub-1/turtle1/cmd_velgeometry_msgs/Twist--'[3,0,0]''[0,0,-3.1415926]'走直線rostopicpub-1/turtle1/cmd_velgeometry_msgs/Twist--'[1,0,0]''[0,0,0]'2024/11/2971使用rostopicpub發(fā)布消息示例重置:rosservicecall/reset2024/11/2972作業(yè):用rostopicpub繪制幾何圖形rostopic發(fā)布消息示例控制turtle繪制圖形1如何繪制心型75

vωr1如何繪制心型分析:繪制心型步驟如下:1、①

繪制半圓2、②

繪制圓弧3、在③號(hào)點(diǎn)旋轉(zhuǎn)偏轉(zhuǎn)角q4、③

繪制圓弧5、④

繪制半圓兩個(gè)半圓的線速度和角速度容易確定,兩段圓弧的線速度和角速度以及兩段圓弧之間的偏轉(zhuǎn)角需要計(jì)算,為了簡(jiǎn)化問題,只考慮大圓弧的圓心位于兩個(gè)小圓弧的圓心所在直線上2024/11/29761如何繪制心型br2r1v1v2aqh

qr2o

2024/11/2977br2r1v1v2aqhqr2o1如何繪制心型

2024/11/2978br2r1v1v2aqhqor21如何繪制心型2024/11/2979br2r1hv1v2aqqr2o1如何繪制心型2024/11/2980br2r1hv1v2a

qr2o1如何繪制心型控制turtle繪制圖形2如何繪制月型

2024/11/2982br2r1sv1Tav2Tw2如何繪制月型

2024/11/2983br2r1sv1Tav2Tw2

如何繪制月型控制turtle繪制圖形3如何繪制環(huán)型

2024/11/2985r1r2v1Tv2Tv3T3如何繪制環(huán)型1、在ROS中啟動(dòng)小烏龜示例程序$roscore$rosrunturtlesimturtlesim_node2、創(chuàng)建命令腳本文件,運(yùn)行后繪制以下圖形2024/11/2986作業(yè)4使用rostopicpub發(fā)布消息abcdefghkmn習(xí)題課1、建立以“班級(jí)號(hào)+學(xué)生序號(hào)”命名的文件夾,并設(shè)置文件夾的權(quán)限為:宿主用戶:rwx組用戶:r-x其它用戶:---然后通過使用重定向命令把設(shè)置好權(quán)限后“l(fā)s-l”命令顯示的結(jié)果放到文件A01中。2、下載science.txt文件,把其中含有單詞“and”的行放到文件A02中,然后用wc統(tǒng)計(jì)A02文件并把統(tǒng)計(jì)結(jié)果追加到A02文件。(wgethttp://www.ee.surrey.ac.uk/Teaching/Unix/science.txt)3、把本機(jī)歷史命令放到A03文件中,篩選其中使用了ls命令的內(nèi)容存放到ls.txt文件中、使用了cd命令的內(nèi)容存放到cd.txt文件。4、確定上述的三個(gè)文件都放在已建立的文件夾中,然后把文件夾壓縮為zip格式的壓縮文件。2024/11/2988作業(yè)1安裝ROS集成開發(fā)環(huán)境主要包括以下部分:1、使用vmware虛擬機(jī)軟件安裝ubuntu20.042、在ubuntu20.04虛擬機(jī)中安裝ROS(noetic)3、在已安裝好ROS的ubuntu虛擬機(jī)中安裝vscode(包括必要插件)把安裝過程的截圖存放到word文檔中上傳,截圖必須是電腦屏幕的全屏截圖。2024/11/2989作業(yè)21、創(chuàng)建名稱為mycatkin_ws工作空間2、進(jìn)入工作空間src目錄3、刷新工作空間路徑到ROS環(huán)境echo“source~/mycatkin_ws/devel/setup.bash”>>~/.bashrc4、關(guān)閉當(dāng)前終端窗口后再開一個(gè)新終端2024/11/2990作業(yè)3.1創(chuàng)建ROS工作空間1、下載軟件包(2:8080/file/turtlesim.zip)2、放入工作空間的src目錄并解壓3、在工作空間運(yùn)行catkin_make命令編譯工作空間下的軟件包4、運(yùn)行roscorerosrunturtlesimturtlesim_noderosrunturtlesimdraw_square2024/11/2991作業(yè)3.2導(dǎo)入ROS包1、使用rospacklist統(tǒng)計(jì)本機(jī)上的軟件包,把軟件包清單存入文件allpack2、統(tǒng)計(jì)軟件包數(shù)量追加到allpack3、把turtlesim軟件包的目錄路徑存入文件tj_turtle4、把turtlesim包所包含的文件和目錄列表追加到tj_turtle2024/11/2992作業(yè)3.3使用ROS包管理工具重置:rosservicecall/reset1、在ROS中啟動(dòng)小烏龜示例程序$roscore$rosrunturtlesimturtlesim_node2、創(chuàng)建命令腳本文件,運(yùn)行后繪制以下圖形2024/11/2993作業(yè)4使用rostopicpub發(fā)布消息繪制圖形abcdefghkmn編寫簡(jiǎn)單ROS程序1.建立ROS工作區(qū)(可選)2.創(chuàng)建ROS軟件包package(常用依賴roscpprospystd_msgs)catkin_create_pkg包名依賴3.創(chuàng)建存放python文件的文件夾(目錄一般為scripts)4.創(chuàng)建python文件,輸入代碼(導(dǎo)入需要的包

)5.修改CMakeLists.txt6.修改python文件權(quán)限(文件所在目錄下運(yùn)行chmod+x*.py)7.編譯(在工作區(qū)目錄下運(yùn)行catkin_make命令vscode快捷鍵ctrl+shift+B)8.運(yùn)行(刷新環(huán)境變量source~/catkin_ws/devel/setup.bash)

編寫簡(jiǎn)單ROS程序的步驟

常規(guī)python程序ROS程序(python)ROS程序的結(jié)構(gòu)

編寫python程序常用技巧

1.輸入使用input()函數(shù)輸入的是字符串,可根據(jù)需要轉(zhuǎn)換x=int(input('請(qǐng)輸入一個(gè)整數(shù)'))y=float(input('請(qǐng)輸入一個(gè)浮點(diǎn)數(shù)'))s=str(input('請(qǐng)輸入一個(gè)字符串'))2.輸出常規(guī)輸出(1)輸出數(shù)值型變量num=100print(num)(2)輸出字符串str='helloworld'print(str)(3)輸出列表list=[1,2,3]print(list)(4)輸出元組tuple=(1,2,'a')print(tuple)(5)輸出字典dict={'a':1,'b':2}print(dict)編寫python程序常用技巧

例1:(使用格式控制符%s%d)s='HelloWorld'x=len(s)print('字符串:%s的長(zhǎng)度是%d'%(s,x))例2:(指定寬度和精度)PI=3.1415926print('%8.3f'%PI)%s字符串采用str()的顯示%x十六進(jìn)制整數(shù)%c單個(gè)字符%b二進(jìn)制整數(shù)%f,%F浮點(diǎn)數(shù)%d十進(jìn)制整數(shù)%o八進(jìn)制整數(shù)編寫python程序常用技巧

2.輸出換行與防止換行例1:(默認(rèn)換行,輸出5行

)forxinrange(0,5):print(x)例2:(在一行上輸出,用空格分開

)forxinrange(0,5):print(x,

end='')例3:(在一行上輸出,用逗號(hào),分開

)forxinrange(0,5):print(x,

end=',')編寫python程序常用技巧

3.分支結(jié)構(gòu)例:a=2ifa>3:print('大于3')elifa<3:

print('a小于3')else:

print('a等于3')編寫python程序常用技巧

4.循環(huán)結(jié)構(gòu)for循環(huán)例1:forxinrange(0,5):print(x)range函數(shù)range(5)默認(rèn)從0開始,0-5,前閉后開例2:輸出斐波那契數(shù)列a,b=0,1forindexinrange(10):print(b)(a,b)=(b,a+b)編寫python程序常用技巧

4.循環(huán)結(jié)構(gòu)while循環(huán)例3:a=Trueindex=0whilea:index=index+1print(index)ifindexis10:break編寫python程序常用技巧

1.編寫小海龜繪制心型、月型、環(huán)型的參數(shù)計(jì)算程序2.輸出1-100的累計(jì)求和值3.輸出n的階乘(n<10)4.輸出1-100間的素?cái)?shù)

作業(yè)5 編寫ROS消息發(fā)布程序

畫圓

rostopicpub-1/turtle1/cmd_velgeometry_msgs/Twist--'[4,0,0]''[0,0,6.28]'

發(fā)送消息控制仿真烏龜繪圖

畫三角形

①直線行走③直線行走④逆時(shí)針旋轉(zhuǎn)⑤直線行走②逆時(shí)針旋轉(zhuǎn)120度①直線行走②逆時(shí)針旋轉(zhuǎn)③直線行走⑤直線行走④逆時(shí)針旋轉(zhuǎn)120度發(fā)送消息控制仿真烏龜繪圖

ROS程序必須導(dǎo)入此包指定python解釋器定義并初始化“發(fā)布者”變量初始化節(jié)點(diǎn),節(jié)點(diǎn)名為“circle”導(dǎo)入Twist消息定義Twist消息變量填充Twist消息變量定義并設(shè)定消息發(fā)布頻率發(fā)表消息延時(shí)(避免消息發(fā)太快)了解ROS程序基本結(jié)構(gòu)—畫圓

ROS程序必須導(dǎo)入此包指定python解釋器定義并初始化“發(fā)布者”變量初始化節(jié)點(diǎn),節(jié)點(diǎn)名為“triangel”導(dǎo)入Twist消息定義Twist消息變量填充消息(畫一條邊)發(fā)布消息填充消息(旋轉(zhuǎn)120°)定義并設(shè)定消息發(fā)布頻率發(fā)布消息延時(shí)(避免消息發(fā)太快)了解ROS程序基本結(jié)構(gòu)—畫三角形

ROS程序必須導(dǎo)入此包指定python解釋器定義并初始化“發(fā)布者”變量初始化節(jié)點(diǎn),節(jié)點(diǎn)名為“triangel”導(dǎo)入Twist消息定義Twist消息變量節(jié)點(diǎn)未關(guān)閉時(shí)運(yùn)行循環(huán)填充消息(畫一條邊)發(fā)布消息睡眠,等待下一次發(fā)布消息定義并設(shè)定消息發(fā)布頻率了解ROS程序基本結(jié)構(gòu)—畫三角形-循環(huán)

1.導(dǎo)入包rospy2.導(dǎo)入相應(yīng)消息fromgeometry_msgs.msgimportTwist3.在主入口中初始化節(jié)點(diǎn),指定節(jié)點(diǎn)4.定義發(fā)布ros消息的對(duì)象,并實(shí)例化(明確話題名、消息類型,消息隊(duì)列長(zhǎng)度)5.定義ros消息變量(用于發(fā)布消息)6.設(shè)置消息發(fā)送的頻率7.封裝消息(填充數(shù)據(jù))8.發(fā)送消息(調(diào)用第4步定義的對(duì)象的方法)9.睡眠,等待下一次發(fā)送消息

編寫ROS消息發(fā)布程序步驟

了解要發(fā)布的消息的類型

在vscode中編寫ROS程序繪制下列幾何圖形(python)

作業(yè)6

編寫ROS消息發(fā)布程序編寫ROS訂閱者程序步驟

1.導(dǎo)入必要的包(rospy

)2.從消息文件中導(dǎo)入要接收的消息類型(本例為turtlesim/Pose)

3.初始化節(jié)點(diǎn)4.初始化接收消息的變量(調(diào)用消息接收函數(shù)初始化該變量,指定消息的話題,消息類型,回調(diào)函數(shù))5.定義回調(diào)函數(shù)

(當(dāng)收到消息時(shí)要做的操作)6.啟動(dòng)自循環(huán)

示例1:訂閱海龜位姿信息程序功能:接收消息,顯示烏龜x,y坐標(biāo)、朝向、線速度、角速度準(zhǔn)備工作:訂閱話題:/turtle1/pose話題/turtle1/pose對(duì)應(yīng)的數(shù)據(jù)類型:turtlesim/Pose使用rostopiclist查看話題列表使用rostopicinfo查看話題/turtle1/pose的數(shù)據(jù)類型turtlesim/Pose使用rosmsgshow查看turtlesim/Pose類型的具體定義示例1:訂閱者程序get_pose.py定義回調(diào)函數(shù),用于收到消息時(shí)執(zhí)行。當(dāng)收到消息時(shí),消息存到data變量中啟動(dòng)自循環(huán),盡快調(diào)用回調(diào)函數(shù)調(diào)用接收話題消息的函數(shù)初始sub變量話題名稱,必須與發(fā)布者程序中的話題相同回調(diào)函數(shù)名,接收到消息就會(huì)調(diào)用該函數(shù)初始化節(jié)點(diǎn)接收的消息類型示例1:訂閱者程序get_pose.py訂閱者程序要點(diǎn):1.創(chuàng)建訂閱者對(duì)象當(dāng)新的消息到達(dá)時(shí),它們會(huì)被保存在一個(gè)隊(duì)列中,然后自動(dòng)執(zhí)行回調(diào)函數(shù),對(duì)消息的處理都是在回調(diào)函數(shù)中進(jìn)行的。注意:不要在函數(shù)名后面添加括號(hào)()

回調(diào)函數(shù)接收的消息類型話題名創(chuàng)建訂閱者函數(shù)示例1:訂閱者程序get_pose.py訂閱者程序要點(diǎn):2.編寫回調(diào)函數(shù)

訂閱消息時(shí),訂閱者節(jié)點(diǎn)無(wú)法知道消息什么時(shí)候到達(dá)。為了應(yīng)對(duì)這一情況,必須把響應(yīng)收到消息事件的代碼放到回調(diào)函數(shù)里,ROS每接收到一個(gè)新的消息將調(diào)用一次這個(gè)函數(shù)。訂閱者的回調(diào)函數(shù)類似于:

本例程中,回調(diào)函數(shù)接收類型為turtlesim/Pose的消息,所以必須從定義該消息的文件導(dǎo)入Pose類型

回調(diào)函數(shù)中簡(jiǎn)單輸出消息數(shù)據(jù),包括x、y和theta數(shù)據(jù)成員。

回調(diào)函數(shù)名收到的消息位于data變量中消息處理:把坐標(biāo)轉(zhuǎn)換為字符串示例1:訂閱者程序get_pose.py訂閱者程序要點(diǎn):3.給ROS控制權(quán)

這行代碼不會(huì)讓當(dāng)前節(jié)點(diǎn)退出,除非當(dāng)前節(jié)點(diǎn)被明確的關(guān)閉。有的資料中稱為“阻塞”,或“自循環(huán)”示例1:訂閱者程序get_pose.pyROS中的spin和spinOnce的區(qū)別spin函數(shù)spin函數(shù)會(huì)持續(xù)地檢查并處理訂閱緩沖區(qū)中的回調(diào)函數(shù),直到隊(duì)列為空。一旦進(jìn)入spin函數(shù),它就會(huì)進(jìn)入一個(gè)循環(huán),不斷地檢查回調(diào)函數(shù)隊(duì)列。如果隊(duì)列中有回調(diào)函數(shù),spin會(huì)立即執(zhí)行它。如果隊(duì)列為空,spin會(huì)等待,直到有新的回調(diào)函數(shù)被放入隊(duì)列。在這個(gè)過程中,spin會(huì)阻塞,不會(huì)占用CPU資源。因此,當(dāng)使用spin時(shí),節(jié)點(diǎn)會(huì)一直等待并處理回調(diào)函數(shù),不會(huì)執(zhí)行spin之后的代碼。示例1:訂閱者程序get_pose.pyROS中的spin和spinOnce的區(qū)別spinOnce函數(shù)與spin不同,spinOnce函數(shù)只處理一次回調(diào)函數(shù),然后繼續(xù)執(zhí)行后續(xù)的代碼。這意味著spinOnce不會(huì)阻塞,它會(huì)檢查回調(diào)函數(shù)隊(duì)列,執(zhí)行一個(gè)回調(diào)函數(shù)(如果隊(duì)列中有的話),然后立即返回。spinOnce通常與ros::Rate對(duì)象一起使用,在while循環(huán)中調(diào)用,以控制節(jié)點(diǎn)處理回調(diào)函數(shù)的頻率。作業(yè)7:編寫訂閱者程序1、啟動(dòng)海龜示例節(jié)點(diǎn)2、仿照示例1,編寫運(yùn)行程序,實(shí)現(xiàn)訂閱海龜坐標(biāo)信息并輸出3、編寫訂閱者程序,訂閱話題/turtle1/color_sensor,然后輸出顏色數(shù)據(jù)編寫發(fā)布/訂閱程序程序功能:發(fā)布者程序每秒發(fā)送消息(字符串),訂閱者程序接收消息實(shí)現(xiàn)過程:一、發(fā)布者程序:1、導(dǎo)包2、初始化節(jié)點(diǎn)3、定義發(fā)布者變量并調(diào)用rospy.Publisher()函數(shù)初始化,設(shè)定參數(shù)(指定自定義話題,消息類型,隊(duì)列長(zhǎng)度)4、定義并設(shè)定消息發(fā)布頻率5、定義消息變量并設(shè)置消息值6、發(fā)送消息(循環(huán))

示例1:編寫簡(jiǎn)單的發(fā)布者/訂閱者程序程序功能:發(fā)布者程序每秒發(fā)送消息(字符串),訂閱者程序接收消息實(shí)現(xiàn)過程:二、訂閱者程序:1、導(dǎo)包2、初始化節(jié)點(diǎn)3、定義訂閱者變量并調(diào)用rospy.Subscriber()函數(shù)初始化,設(shè)定參數(shù)(使用自定義話題,消息類型,回調(diào)函數(shù))4、定義并編寫回調(diào)函數(shù)處理消息

示例1:編寫簡(jiǎn)單的發(fā)布者/訂閱者程序發(fā)布者程序:訂閱者程序:

示例1:編寫簡(jiǎn)單的發(fā)布者/訂閱者程序發(fā)布者和訂閱者程序中的話題名必須相同發(fā)布者和訂閱者程序中的話題名必須相同運(yùn)行程序

示例1:編寫簡(jiǎn)單的發(fā)布者/訂閱者程序節(jié)點(diǎn)列表與話題列表

示例1:編寫簡(jiǎn)單的發(fā)布者/訂閱者程序訂閱者/發(fā)布者程序程序功能:繪制放大版圓繪制過程:1、發(fā)布者程序節(jié)點(diǎn)發(fā)出繪制圓的消息(線速度,角速度),因?yàn)樵掝}名

mycircle

與仿真烏龜節(jié)點(diǎn)/turtlesim的話題/turtle1/cmd_vel名不同,烏龜節(jié)點(diǎn)/turtlesim不接收該消息。2、訂閱者程序節(jié)點(diǎn)接收發(fā)布者節(jié)點(diǎn)發(fā)出的geometry_msgs::Twist消息(兩個(gè)節(jié)點(diǎn)有共同話題),處理后(線速度*2,角速度不變)轉(zhuǎn)發(fā)給/turtle1/cmd_vel話題3、烏龜節(jié)點(diǎn)/turtlesim接收到消息后繪制圖形

示例2:訂閱者/發(fā)布者程序

示例2:發(fā)布者程序my_pub.py自定義的話題名稱,仿真烏龜收不到該話題消息示例2:訂閱者程序my_sub.py定義回調(diào)函數(shù),用于接收自定義話題消息,處理后轉(zhuǎn)發(fā)自定義的話題名稱,必須與發(fā)布者程序中的話題相同課堂練習(xí):在自己電腦上編寫并運(yùn)行示例1、示例21、創(chuàng)建包,包名為姓名拼音首字母或拼音全名2、編寫發(fā)布訂閱程序控制仿真烏龜繪制圖形,要求:(1)發(fā)布者程序運(yùn)行后接收鍵盤輸入數(shù)字或字母,然后通過自定義話題把該數(shù)字或字母從發(fā)送給訂閱者查詢;(自定義消息的類型可設(shè)置為:“std_msgs/String”或“std_msgs/Int8”)(2)編寫訂閱者程序,接收(1)步中的消息,然后在話題“/turtle1/cmd_vel”上發(fā)送geometry_msgs/Twist消息,仿真烏龜收到消息后繪制出圖形。(3)發(fā)布者程序循環(huán)運(yùn)行,直到被終止。

2024/11/29134作業(yè)8:編寫發(fā)布者訂閱者程序服務(wù)(service)Service通信

topic是ROS中的一種單向的異步通信方式。有些時(shí)候單向的通信滿足不了通信要求這種情況下,就需要有另外一種請(qǐng)求-響應(yīng)式的通信模型——service(服務(wù))

service方式在通信模型上與topic不同。Service通信是雙向的,它不僅可以發(fā)送消息,同時(shí)還會(huì)有反饋。所以service包括兩部分,一部分是請(qǐng)求方(Clinet)[客戶],另一部分是應(yīng)答方/服務(wù)提供方(Server)。通信時(shí),客戶(Client)發(fā)送一個(gè)request(請(qǐng)求),要等待server處理,然后反饋回一個(gè)reply/response(回復(fù)/應(yīng)答),這樣通過“請(qǐng)求-應(yīng)答”的機(jī)制完成整個(gè)服務(wù)通信

Service工作原理

service是同步通信方式,所謂同步就是節(jié)點(diǎn)A(請(qǐng)求方)發(fā)布請(qǐng)求后會(huì)在原地等待響應(yīng),直到節(jié)點(diǎn)B(服務(wù)方)處理完了請(qǐng)求并且完成了響應(yīng),節(jié)點(diǎn)A才會(huì)繼續(xù)執(zhí)行。節(jié)點(diǎn)A在等待響應(yīng)的過程中是處于阻塞狀態(tài)。這樣的通信模型沒有頻繁的消息傳遞,沒有沖突與高系統(tǒng)資源的占用,只有接受請(qǐng)求才執(zhí)行服務(wù),簡(jiǎn)單高效

Service工作原理

Service與topic異同遠(yuǎn)程過程調(diào)用(RemoteProcedureCall,RPC),可以簡(jiǎn)單通俗的理解為在一個(gè)進(jìn)程里調(diào)用另一個(gè)進(jìn)程的函數(shù)Service工作原理

1、使用命令rosservice2、編寫client/server程序server

rosservice命令作用rosservicelist列出所有服務(wù)rosserviceinfo[服務(wù)名]查看一個(gè)服務(wù)的數(shù)據(jù)類型rosservicecall[服務(wù)名]

[參數(shù)]命令行調(diào)用服務(wù)rosservice相關(guān)命令作用rossrvshow[服務(wù)數(shù)據(jù)類型]查看服務(wù)的數(shù)據(jù)類型構(gòu)成rosnodeinfo[節(jié)點(diǎn)名]查看特點(diǎn)節(jié)點(diǎn)提供的服務(wù)、話題等信息Service的使用方式

查看烏龜節(jié)點(diǎn)服務(wù)、話題信息

rosnodeinfo/turtlesim

發(fā)布了3個(gè)topic訂閱1個(gè)topic提供的服務(wù)了解海龜?shù)墓?jié)點(diǎn)信息

rosservicelist列出所有服務(wù)(包含仿真海龜提供的服務(wù))

清除仿真烏龜軌跡殺烏龜復(fù)位/重置烏龜生成一個(gè)新烏龜設(shè)置軌跡的顏色、寬度移動(dòng)烏龜?shù)街付ㄗ鴺?biāo)和朝向通過設(shè)置線速度和角度移動(dòng)烏龜了解海龜節(jié)點(diǎn)提供的Service rosserviceinfo[服務(wù)名]提供服務(wù)的節(jié)點(diǎn)服務(wù)的數(shù)據(jù)類型調(diào)用該服務(wù)需要的參數(shù)查看服務(wù)信息(數(shù)據(jù)類型與參數(shù))

rossrvshow[類型名]查看服務(wù)的數(shù)據(jù)類型定義

調(diào)用服務(wù)(無(wú)參數(shù))1、清除軌跡rosservicecall

/clear

調(diào)用服務(wù)示例1 調(diào)用服務(wù)(無(wú)參數(shù))2、重置復(fù)位rosservicecall

/reset

調(diào)用服務(wù)示例2

調(diào)用服務(wù)(有參數(shù))3、生成新烏龜rosservicecall

/spawn550turtle2

先輸命令rosservicecall/spawn然后按TAB自動(dòng)補(bǔ)全參數(shù)格式然后移動(dòng)光標(biāo)輸入?yún)?shù)值

移動(dòng)光標(biāo),輸入服務(wù)調(diào)用命令的各個(gè)參數(shù)值調(diào)用服務(wù)生成新烏龜,坐標(biāo)為(5,5),朝向0,烏龜名稱為“turtle2”

注意:冒號(hào)后有空格方法一:直接輸入命令方法二:使用TAB鍵補(bǔ)全調(diào)用服務(wù)示例3

調(diào)用服務(wù)(有參數(shù))4、殺烏龜rosservicecall

/killturtle1

先輸命令rosservicecall/kill然后按TAB自動(dòng)補(bǔ)全參數(shù)格式

移動(dòng)光標(biāo),輸入要?dú)⒌舻臑觚斆畹拿Qturtle1冒號(hào)后有空格方法一:直接輸入命令方法二:使用TAB鍵補(bǔ)全調(diào)用服務(wù)示例4

調(diào)用服務(wù)(有參數(shù))5、設(shè)置軌跡的顏色、寬度rosservicecall/turtle1/set_pen{255,0,0,5,0}先輸命令rosservicecall/kill然后按TAB自動(dòng)補(bǔ)全參數(shù)格式

移動(dòng)光標(biāo),輸入要設(shè)置的顏色和寬度冒號(hào)后有空格方法二:使用TAB鍵補(bǔ)全調(diào)用服務(wù)設(shè)置軌跡線顏色為紅色、寬度為5方法一:直接輸入命令,參數(shù)用花括號(hào)包含,逗號(hào)分隔調(diào)用服務(wù)示例5

調(diào)用服務(wù)(有參數(shù))6、移動(dòng)烏龜?shù)街付ㄗ鴺?biāo)和朝向

rosservicecall/turtle1/teleport_absolute{10,10,1.57}移動(dòng)光標(biāo),輸入要設(shè)置的坐標(biāo)和朝向冒號(hào)后有空格方法二:使用TAB鍵補(bǔ)全調(diào)用服務(wù)移動(dòng)烏龜?shù)剑?0,10),朝向?yàn)?0°方法一:直接輸入命令,參數(shù)用花括號(hào)包含,逗號(hào)分隔調(diào)用服務(wù)示例6

調(diào)用服務(wù)(有參數(shù))7、設(shè)置線速度、角度移動(dòng)烏龜rosservicecall/turtle1/teleport_relative{5,1.57}移動(dòng)光標(biāo),輸入要設(shè)置的線速度和角度冒號(hào)后有空格技巧:使用TAB鍵補(bǔ)全方法一:直接輸入命令,參數(shù)用花括號(hào)包含,逗號(hào)分隔調(diào)用服務(wù)示例7

使用rostopic、rosservice命令繪制以下圖形

調(diào)用服務(wù)示例8:繪制笑臉

使用rostopic命令繪制以下圖形分析:整個(gè)圖形由不連續(xù)的幾段圖形構(gòu)成,需要控制烏龜分別繪制。繪制完成其中一段后,殺掉烏龜,然后在下一段需要繪制圖形的坐標(biāo)點(diǎn)生成一只新的烏龜繪制相應(yīng)的圖形,直至全部圖形繪制完成。A(5,5)O(5,7)B(4,8)C(6,8)D(4,6)E(6,6)調(diào)用服務(wù)示例8:繪制笑臉

使用rostopic命令繪制調(diào)用服務(wù)示例8:繪制笑臉

1、參考課件,在自己電腦上練習(xí)示例1-82、使用rostopic繪制下列圖形

2024/11/29155作業(yè)9編寫服務(wù)請(qǐng)求程序1、導(dǎo)包rospy2、導(dǎo)入服務(wù)類型(根據(jù)要調(diào)用的服務(wù)導(dǎo)入相應(yīng)的類型)使用rosserviceinfo服務(wù)了解該服務(wù)使用的數(shù)據(jù)類型使用rossrvshow類型了解該服務(wù)數(shù)據(jù)類型的詳細(xì)定義,方便在程序中使用

編寫服務(wù)請(qǐng)求(client)程序的步驟服務(wù)名類型參數(shù)/clearstd_srvs/Empty無(wú)/killturtlesim/Killname/resetstd_srvs/Empty無(wú)/spawnturtlesim/Spawnxythetaname/turtle1/set_penturtlesim/SetPenrgbwidthoff/turtle1/teleport_absoluteturtlesim/TeleportAbsolutexytheta/turtle1/teleport_relativeturtlesim/TeleportRelativelinearangular2、導(dǎo)入服務(wù)類型對(duì)于每個(gè)定義好的服務(wù)類,系統(tǒng)會(huì)自動(dòng)生成Request和Response類型,用于發(fā)送調(diào)用服務(wù)的參數(shù)和接收響應(yīng)數(shù)據(jù)例如:Spawn類自動(dòng)生成SpawnRequest、SpawnResponse類型,SpawnRequest用于調(diào)用服務(wù)時(shí)傳送創(chuàng)建烏龜?shù)淖鴺?biāo)等參數(shù)SpawnResponse用于接收創(chuàng)建成功后的響應(yīng)數(shù)據(jù)(在對(duì)應(yīng)的服務(wù)名后面加上Request、Response構(gòu)成請(qǐng)求、響應(yīng)的數(shù)據(jù)類型)

編寫服務(wù)請(qǐng)求(client)程序的步驟2、導(dǎo)入服務(wù)類型服務(wù)數(shù)據(jù)類型的詳細(xì)定義:用---把數(shù)據(jù)分為請(qǐng)求(client)和響應(yīng)(server)兩部分(1)無(wú)請(qǐng)求數(shù)據(jù),無(wú)響應(yīng)數(shù)據(jù)(2)有請(qǐng)求數(shù)據(jù),有響應(yīng)數(shù)據(jù)(3)有請(qǐng)求數(shù)據(jù),無(wú)響應(yīng)數(shù)據(jù)

編寫服務(wù)請(qǐng)求(client)程序的步驟3、初始化節(jié)點(diǎn)4、定義client變量并調(diào)用rospy.ServiceProxy()函數(shù)初始化,設(shè)定參數(shù)(指定服務(wù)名,服務(wù)類型)5、等待服務(wù)端啟動(dòng)(阻塞)6、定義請(qǐng)求變量并填充參數(shù)(調(diào)用無(wú)參數(shù)的服務(wù)不需要這一步)7、調(diào)用服務(wù)并接收響應(yīng)

編寫服務(wù)請(qǐng)求(client)程序的步驟程序功能:程序調(diào)用turtlesim節(jié)點(diǎn)的/spawn服務(wù),在指定的坐標(biāo)生成海龜

示例1:編寫服務(wù)請(qǐng)求程序(有參數(shù))導(dǎo)入服務(wù)類型,SpawnRequest、SpawnResponse是系統(tǒng)自動(dòng)生成的類型定義SpawnRequest類型變量用于設(shè)置參數(shù)阻塞調(diào)用進(jìn)程,等待服務(wù)響應(yīng)定義服務(wù)調(diào)用的客戶端并初始化調(diào)用服務(wù),把響應(yīng)結(jié)果存變量response中定義SpawnResponse類型變量用于處理響應(yīng)程序功能:程序調(diào)用turtlesim節(jié)點(diǎn)的/clear服務(wù),清除軌跡

示例2:編寫服務(wù)請(qǐng)求程序(無(wú)參數(shù))定義服務(wù)調(diào)用的客戶端并初始化導(dǎo)入服務(wù)類型1、參考課件示例,編寫并運(yùn)行示例1、示例22、編寫服務(wù)調(diào)用程序1,運(yùn)行后重置海龜3、編寫服務(wù)調(diào)用程序2,運(yùn)行后殺掉一個(gè)海龜4、編寫服務(wù)調(diào)用程序3,運(yùn)行后改變海龜運(yùn)行軌跡的顏色和寬度5、編寫服務(wù)調(diào)用程序4,運(yùn)行后移動(dòng)海龜?shù)街付ㄗ鴺?biāo)(本次作業(yè)課堂檢查,不提交程序文件)

2024/11/29163作業(yè)10:編寫服務(wù)調(diào)用程序編寫服務(wù)請(qǐng)求程序改進(jìn)示例1(在指定位置生成烏龜),編寫程序,隨機(jī)生成烏龜思路:在生成烏龜?shù)某绦蚧A(chǔ)上,使用隨機(jī)函數(shù)生成烏龜?shù)淖鴺?biāo)和朝向補(bǔ)充:在python中用于生成隨機(jī)數(shù)的模塊是random,在使用前需要import導(dǎo)入random.random()用于生成一個(gè)0到1的隨機(jī)符點(diǎn)數(shù):0<=n<1.0

random.randint(a,b)用于生成一個(gè)指定范圍內(nèi)的整數(shù)。其中參數(shù)a是下限,參數(shù)b是上限,生成的隨機(jī)數(shù)n:a<=n<=b,

示例3:隨機(jī)生成烏龜改進(jìn)示例3,編寫程序,隨機(jī)生成10個(gè)烏龜

改進(jìn)示例3:隨機(jī)生成烏龜編寫程序,繪制圖形

示例4:繪制圖形

編寫程序,繪制圖形

示例4:繪制圖形

1、編寫程序,繪制下列圖形

2、編寫程序,繪制下列圖形之一

課堂作業(yè):繪制圖形abcdef

g

h

習(xí)題課作業(yè)5 1.編寫小海龜繪制心型、月型、環(huán)型的參數(shù)計(jì)算程序2.輸出1-100的累計(jì)求和值3.輸出n的階乘(n<10)4.輸出1-100間的素?cái)?shù)

作業(yè)6 在vscode中編寫ROS程序繪制下列幾何圖形(python)

作業(yè)7:編寫訂閱者程序1、啟動(dòng)海龜示例節(jié)點(diǎn)2、仿照示例1,編寫運(yùn)行程序,實(shí)現(xiàn)訂閱海龜坐標(biāo)信息并輸出3、編寫訂閱者程序,訂閱話題/turtle1/color_sensor,然后輸出顏色數(shù)據(jù)1、創(chuàng)建包,包名為姓名拼音首字母或拼音全名2、編寫發(fā)布訂閱程序控制仿真烏龜繪制圖形,要求:(1)發(fā)布者程序運(yùn)行后接收鍵盤輸入數(shù)字或字

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝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)論