ROS機(jī)器人開發(fā)項(xiàng)目實(shí)戰(zhàn) 課件 第3、4章 ROS通信機(jī)制、ROS運(yùn)行管理_第1頁(yè)
ROS機(jī)器人開發(fā)項(xiàng)目實(shí)戰(zhàn) 課件 第3、4章 ROS通信機(jī)制、ROS運(yùn)行管理_第2頁(yè)
ROS機(jī)器人開發(fā)項(xiàng)目實(shí)戰(zhàn) 課件 第3、4章 ROS通信機(jī)制、ROS運(yùn)行管理_第3頁(yè)
ROS機(jī)器人開發(fā)項(xiàng)目實(shí)戰(zhàn) 課件 第3、4章 ROS通信機(jī)制、ROS運(yùn)行管理_第4頁(yè)
ROS機(jī)器人開發(fā)項(xiàng)目實(shí)戰(zhàn) 課件 第3、4章 ROS通信機(jī)制、ROS運(yùn)行管理_第5頁(yè)
已閱讀5頁(yè),還剩83頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第3章 ROS通信機(jī)制目錄contentsROS通信機(jī)制介紹ROS項(xiàng)目開發(fā)流程話題通信機(jī)制服務(wù)通信機(jī)制參數(shù)服務(wù)器ROS通信機(jī)制介紹01CATALOGUEROS通信機(jī)制介紹話題(Topic)——異步通信機(jī)制節(jié)點(diǎn)間用來(lái)傳輸數(shù)據(jù)的重要總線;使用發(fā)布/訂閱模型,數(shù)據(jù)由發(fā)布者傳輸?shù)接嗛喺?,同一個(gè)話題的訂閱者或發(fā)布者可以不唯一。消息(Message)——話題數(shù)據(jù)具有一定的類型和數(shù)據(jù)結(jié)構(gòu),包括ROS提供的標(biāo)準(zhǔn)類型和用戶自定義類型;使用編程語(yǔ)言無(wú)關(guān)的.msg文件定義,編譯過(guò)程中生成對(duì)應(yīng)的代碼文件。ROS通信機(jī)制介紹服務(wù)(Service)——同步通信機(jī)制使用客戶端/服務(wù)器(C/S)模型,客戶端發(fā)送請(qǐng)求數(shù)據(jù),服務(wù)器完成處理后返回應(yīng)答數(shù)據(jù);使用編程語(yǔ)言無(wú)關(guān)的.srv文件定義請(qǐng)求和應(yīng)答數(shù)據(jù)結(jié)構(gòu),編譯過(guò)程中生成對(duì)應(yīng)的代碼文件。ROS通信機(jī)制介紹話題與服務(wù)的區(qū)別ROS通信機(jī)制介紹參數(shù)(Parameter)——全局共享字典可通過(guò)網(wǎng)絡(luò)訪問(wèn)的共享、多變量字典;節(jié)點(diǎn)使用此服務(wù)器來(lái)存儲(chǔ)和檢索運(yùn)行時(shí)的參數(shù);適合存儲(chǔ)靜態(tài)、非二進(jìn)制的配置參數(shù),不適合存儲(chǔ)動(dòng)態(tài)配置的數(shù)據(jù)。ROS項(xiàng)目開發(fā)流程02CATALOGUEROS項(xiàng)目開發(fā)流程ROS項(xiàng)目開發(fā)過(guò)程,采用如下步驟:ROS項(xiàng)目開發(fā)流程工作空間(workspace)是一個(gè)存放工程開發(fā)相關(guān)文件的文件夾。src:代碼空間(SourceSpace)build:編譯空間(BuildSpace)devel:開發(fā)空間(DevelopmentSpace)install:安裝空間(InstallSpace)ROS項(xiàng)目開發(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項(xiàng)目開發(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]同一個(gè)工作空間下,不允許存在同名功能包

不同工作空間下,允許存在同名功能包話題通信機(jī)制03CATALOGUEROSTopic通信編程話題模型(發(fā)布者/訂閱者)ROSTopic通信編程分別編寫發(fā)布者和訂閱者,實(shí)現(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通信編程如何實(shí)現(xiàn)一個(gè)發(fā)布者:1)初始化ROS節(jié)點(diǎn);2)向ROSMaster注冊(cè)節(jié)點(diǎn)信息,包括發(fā)布的話題名和話題中的消息類型;3)創(chuàng)建消息數(shù)據(jù);4)按照一定頻率循環(huán)發(fā)布消息。ROSTopic通信編程如何實(shí)現(xiàn)一個(gè)訂閱者:1)初始化ROS節(jié)點(diǎn);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話題通信示例下面通過(guò)創(chuàng)建自定義消息,要求該消息包含人的信息:姓名、身高、年齡等。自定義msg話題通信示例下面通過(guò)創(chuàng)建自定義消息,要求該消息包含人的信息:姓名、身高、年齡等。1.按照固定格式創(chuàng)建msg文件在功能包下新建msg文件夾,新建文件PersonMsg.msg,并在該文件中寫入如下信息:stringnameuint16agefloat64height注:這里使用的基礎(chǔ)數(shù)據(jù)類型string、uint16、float64都是與編程語(yǔ)言無(wú)關(guān)的,編譯階段會(huì)變成各種語(yǔ)言對(duì)應(yīng)的數(shù)據(jù)類型。自定義msg話題通信示例下面通過(guò)創(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添加編譯選項(xiàng)find_package(……message_generation)add_message_files(FILESPersonMsg.msg)generate_messages(DEPENDENCIESstd_msgs)catkin_package(……message_runtime)自定義msg話題通信示例下面通過(guò)創(chuàng)建自定義消息,要求該消息包含人的信息:姓名、身高、年齡等。如何實(shí)現(xiàn)一個(gè)發(fā)布者:1)初始化ROS節(jié)點(diǎn);2)向ROSMaster注冊(cè)節(jié)點(diǎn)信息,包括發(fā)布的話題名和話題中的消息類型;3)創(chuàng)建消息數(shù)據(jù);4)按照一定頻率循環(huán)發(fā)布消息。自定義msg話題通信示例下面通過(guò)創(chuàng)建自定義消息,要求該消息包含人的信息:姓名、身高、年齡等。如何實(shí)現(xiàn)一個(gè)訂閱者:1)初始化ROS節(jié)點(diǎn);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時(shí),字符串用哪個(gè)(

)定義。uint32stringfloat64uint16ABCD提交單選題1分服務(wù)通信機(jī)制04CATALOGUEROS服務(wù)通信編程服務(wù)模型(服務(wù)端/客戶端)ROS服務(wù)通信編程分別編寫服務(wù)端和客戶端,實(shí)現(xiàn)文本消息(“HelloROS!”)服務(wù)通信的過(guò)程。1.編寫服務(wù)端程序首先在前面章節(jié)創(chuàng)建的catkin_ws工作空間下,使用如下命令創(chuàng)建功能包和新建文件:cd~/catkin_ws/srccatkin_create_pkglearning_communicationroscpprospystd_msgsstd_srvscdlearning_communication/srcgeditstring_server.cppROS服務(wù)通信編程如何實(shí)現(xiàn)一個(gè)服務(wù)器:1)初始化ROS節(jié)點(diǎn);2)創(chuàng)建Server實(shí)例;3)循環(huán)等待服務(wù)請(qǐng)求,進(jìn)入回調(diào)函數(shù);4)在回調(diào)函數(shù)中完成服務(wù)功能的處理,并反饋應(yīng)答數(shù)據(jù)。ROS服務(wù)通信編程如何實(shí)現(xiàn)一個(gè)客戶端:1)初始化ROS節(jié)點(diǎn);2)創(chuàng)建一個(gè)Client實(shí)例;3)發(fā)布服務(wù)請(qǐng)求數(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,并在該文件中寫入如下信息:#客戶端請(qǐng)求時(shí)發(fā)送的兩個(gè)數(shù)字int32num1int32num2---#服務(wù)器響應(yīng)發(fā)送的數(shù)據(jù)int32sum自定義srv服務(wù)通信示例自定義srv服務(wù)通信示例本例中,客戶端提交兩個(gè)整數(shù)至服務(wù)端,服務(wù)端接收請(qǐng)求后完成求和運(yùn)算,并返回結(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添加編譯選項(xiàng)find_package(catkinREQUIREDCOMPONENTSroscpprospystd_msgsstd_srvsmessage_generation)#需要加入message_generation,必須有std_msgsadd_service_files(FILESAddTwoInts.srv)generate_messages(DEPENDENCIESstd_msgs)3.編譯生成中間文件自定義srv服務(wù)通信示例自定義srv服務(wù)通信示例如何實(shí)現(xiàn)一個(gè)服務(wù)器(AddTwoInts_Server.cpp):1)初始化ROS節(jié)點(diǎn);2)創(chuàng)建Server實(shí)例;3)循環(huán)等待服務(wù)請(qǐng)求,進(jìn)入回調(diào)函數(shù);4)在回調(diào)函數(shù)中完成服務(wù)功能的處理,并反饋應(yīng)答數(shù)據(jù)。自定義srv服務(wù)通信示例自定義srv服務(wù)通信示例如何實(shí)現(xiàn)一個(gè)客戶端(AddTwoInts_Client.cpp):1)初始化ROS節(jié)點(diǎn);2)創(chuàng)建一個(gè)Client實(shí)例;3)發(fā)布服務(wù)請(qǐng)求數(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ù)器也可以說(shuō)是特殊的“通信方式”。參數(shù)服務(wù)器在ROS中主要用于實(shí)現(xiàn)不同節(jié)點(diǎn)之間的數(shù)據(jù)共享。參數(shù)服務(wù)器的維護(hù)方式非常的簡(jiǎn)單靈活,總的來(lái)講有三種方式:命令行參數(shù)設(shè)置、launch文件內(nèi)讀寫和node源碼。參數(shù)服務(wù)器參數(shù)服務(wù)器機(jī)制1.命令行參數(shù)設(shè)置使用命令行來(lái)設(shè)置參數(shù)服務(wù),主要通過(guò)rosparam命令來(lái)進(jìn)行各種操作設(shè)置。rosparam能夠存儲(chǔ)并操作ROS參數(shù)服務(wù)器(ParameterServer)上的數(shù)據(jù)。參數(shù)服務(wù)器能夠存儲(chǔ)整型、浮點(diǎn)、布爾、字符串、字典和列表等數(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)簽只有兩個(gè),一個(gè)是<param>,另一個(gè)是<rosparam>。示例如下:參數(shù)服務(wù)器<!--直接定義參數(shù)并賦值--><paramname="velodyne_frame_id"type="string"value="velodyne"/><!--定義參數(shù)并通過(guò)arg給參數(shù)賦值--><argname="velodyne_frame_id"default="velodyne"/><paramname="velodyne_frame_id"type="string"value="$(argvelodyne_frame_id)"/>3.節(jié)點(diǎn)源碼內(nèi)進(jìn)行讀寫參數(shù)除了上述最常用的兩種讀寫參數(shù)服務(wù)器的方法,還有一種就是修改ROS的源碼,也就是利用API來(lái)對(duì)參數(shù)服務(wù)器進(jìn)行操作。C++節(jié)點(diǎn)中實(shí)現(xiàn)參數(shù)服務(wù)器的讀寫有兩套API系統(tǒng)。參數(shù)服務(wù)器(1)ros::NodeHandle,該方式的示例如下:

//創(chuàng)建ros節(jié)點(diǎn)句柄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)建一個(gè)節(jié)點(diǎn),在其中實(shí)現(xiàn)一個(gè)訂閱者和一個(gè)發(fā)布者,完成以下功能:

發(fā)布者:發(fā)布海龜速度指令,讓海龜圓周運(yùn)動(dòng)

訂閱者:訂閱海龜?shù)奈恢眯畔?,并在終端中周期打印輸出2.創(chuàng)建另外一個(gè)節(jié)點(diǎn),在其中實(shí)現(xiàn)一個(gè)客戶端,完成以下功能:

客戶端:請(qǐng)求海龜誕生的服務(wù),在仿真器中產(chǎn)生一只新的海龜THANKS感謝觀看第4章 ROS運(yùn)行管理目錄contentsROS節(jié)點(diǎn)運(yùn)行管理ROS工作空間覆蓋ROS節(jié)點(diǎn)重名ROS話題名稱設(shè)置ROS參數(shù)名稱設(shè)置Launch文件綜合案例ROS節(jié)點(diǎn)運(yùn)行管理01CATALOGUEROS節(jié)點(diǎn)運(yùn)行管理ROS使用多進(jìn)程(節(jié)點(diǎn))的分布式框架,一個(gè)完整的ROS系統(tǒng)可能出現(xiàn)如下情形:

可能包含多臺(tái)主機(jī);每臺(tái)主機(jī)上有多個(gè)工作空間;每個(gè)工作空間中又包含多個(gè)功能包;每個(gè)功能包包含多個(gè)節(jié)點(diǎn),不同的節(jié)點(diǎn)都有自己的節(jié)點(diǎn)名稱;每個(gè)節(jié)點(diǎn)可能還會(huì)設(shè)置一個(gè)或多個(gè)話題。ROS節(jié)點(diǎn)運(yùn)行管理—launch文件launch文件是一個(gè)XML格式的文件,可以啟動(dòng)本地和遠(yuǎn)程的多個(gè)節(jié)點(diǎn),還可以在參數(shù)服務(wù)器中設(shè)置參數(shù)。其作用是簡(jiǎn)化節(jié)點(diǎn)的配置與啟動(dòng),提高ROS程序的啟動(dòng)效率。

<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文件時(shí),首先會(huì)判斷是否啟動(dòng)了roscore。如果已經(jīng)啟動(dòng),則不再啟動(dòng),否則,會(huì)自動(dòng)調(diào)用roscore。launch文件標(biāo)簽<launch>標(biāo)簽是所有l(wèi)aunch文件的根標(biāo)簽,充當(dāng)其他標(biāo)簽的容器,文件中的其他內(nèi)容都必須放在這個(gè)標(biāo)簽中。<node>標(biāo)簽用于指定ROS節(jié)點(diǎn),是最常見的標(biāo)簽,需要注意的是roslaunch命令不能保證按照node的聲明順序來(lái)啟動(dòng)節(jié)點(diǎn)(節(jié)點(diǎn)的啟動(dòng)是多進(jìn)程的)。1.屬性pkg=“包名”:節(jié)點(diǎn)所在的功能包名稱type="nodeType":節(jié)點(diǎn)的可執(zhí)行文件名稱name="nodeName":節(jié)點(diǎn)運(yùn)行時(shí)的名稱(在ROS網(wǎng)絡(luò)拓?fù)渲泄?jié)點(diǎn)的名稱)args="xxxxxxxxx"(可選):將參數(shù)傳遞給節(jié)點(diǎn)2.子級(jí)標(biāo)簽env環(huán)境變量設(shè)置remap重映射節(jié)點(diǎn)名稱rosparam參數(shù)設(shè)置param參數(shù)設(shè)置launch文件標(biāo)簽<include>標(biāo)簽用于將另一個(gè)xml格式的launch文件導(dǎo)入到當(dāng)前文件中,類似C語(yǔ)言中的頭文件包含。1.屬性file="$(find功能包名)/xxx/xxx.launch":要包含的文件路徑ns="xxx"(可選):在指定命名空間導(dǎo)入文件2.子級(jí)標(biāo)簽env環(huán)境變量設(shè)置arg將參數(shù)傳遞給被包含的文件launch文件標(biāo)簽<remap>標(biāo)簽用于重映射ROS計(jì)算圖資源的命名。用戶不需要修改已有功能包的接口,只需要將接口名稱重映射,取一個(gè)別名,這樣系統(tǒng)就能識(shí)別該接口。屬性from="xxx":原命名to="yyy":映射之后的命名比如turtlebot的鍵盤控制節(jié)點(diǎn)發(fā)布速度指令話題是/turtlebot/cmd_vel,但是如果當(dāng)前機(jī)器人訂閱的速度控制話題是/cmd_vel,這時(shí)使用<remap>就可以輕松解決問(wèn)題,實(shí)現(xiàn)代碼如下:<remapfrom="/turtelbot/cmd_vel"to="/cmd_vel"/>launch文件標(biāo)簽<param>標(biāo)簽主要用來(lái)在參數(shù)服務(wù)器上設(shè)置參數(shù),參數(shù)源可以在標(biāo)簽中通過(guò)value指定,也可以通過(guò)外部文件加載,在<node>標(biāo)簽中時(shí),相當(dāng)于私有命名空間。launch文件執(zhí)行后,參數(shù)值就加載到ROS的參數(shù)服務(wù)器上。屬性name="命名空間/參數(shù)名":參數(shù)名稱,可以包含命名空間value="xxx"(可選):定義參數(shù)值,如果此處省略,必須指定外部文件作為參數(shù)源type="str|int|double|bool|yaml"(可選):指定參數(shù)類型,如果未指定,roslaunch會(huì)嘗試確定參數(shù)類型launch文件標(biāo)簽<rosparam>標(biāo)簽可以將YAML格式文件中的參數(shù)全部導(dǎo)入到ROS參數(shù)服務(wù)器中,或?qū)?shù)導(dǎo)出到Y(jié)AML文件,也可以用來(lái)刪除參數(shù),<rosparam>標(biāo)簽在<node>標(biāo)簽中時(shí)被視為私有標(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)簽是用于動(dòng)態(tài)傳參,類似于函數(shù)的參數(shù),僅限于launch文件使用,便于launch文件的重構(gòu),與ROS節(jié)點(diǎn)內(nèi)部的實(shí)現(xiàn)沒(méi)有關(guān)系。1.屬性name="參數(shù)名稱":default="默認(rèn)值"(可選)value="數(shù)值"(可選):不可以與default并存doc="描述":參數(shù)說(shuō)明2.示例設(shè)置argument使用<arg>標(biāo)簽元素,語(yǔ)法如下:<argname="arg-name"default="arg-value"/>launch文件中需要使用argument時(shí),可以使用如下方式調(diào)用:<paramname="foo"value="$(argarg-name)"/><nodename="node"pkg="package"type="type"args="$(argarg-name)"/>ROS工作空間覆蓋02CATALOGUEROS工作空間覆蓋所謂工作空間覆蓋,是指在不同工作空間中,存在同名功能包的情形。(1)新建工作空間A與工作空間B,兩個(gè)工作空間中都創(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,則此時(shí)會(huì)進(jìn)入自定義工作空間B。出現(xiàn)上述結(jié)果的原因如下:設(shè)置時(shí)需要遵循一定的原則:ROS_PACKAGE_PATH中的值和.bashrc的配置順序相反--->后配置的優(yōu)先級(jí)更高。ROS節(jié)點(diǎn)重名03CATALOGUEROS節(jié)點(diǎn)重名場(chǎng)景:ROS中創(chuàng)建的節(jié)點(diǎn)是有名稱的,C++初始化節(jié)點(diǎn)時(shí)通過(guò)API:ros::init(argc,argv,"xxxx")來(lái)定義節(jié)點(diǎn)名稱,在Python中初始化節(jié)點(diǎn)則通過(guò)rospy.init_node("yyyy")來(lái)定義節(jié)點(diǎn)名稱。在ROS的網(wǎng)絡(luò)拓?fù)渲校遣豢梢猿霈F(xiàn)重名的節(jié)點(diǎn)的,在ROS中如果啟動(dòng)重名節(jié)點(diǎn)的話,之前已經(jīng)存在的節(jié)點(diǎn)會(huì)被直接關(guān)閉。[WARN][1578812836.351049332]:Shutdownrequestreceived.[WARN][1578812836.351207362]:Reasongivenforshutdown:[newnoderegisteredwithsamename]rosrun設(shè)置命名空間與重映射1.rosrun設(shè)置命名空間語(yǔ)法:rosrun功能包名

節(jié)點(diǎn)名__ns:=新名稱rosrunturtlesimturtlesim_node__ns:=/xxxrosrunturtlesimturtlesim_node__ns:=/yyy這時(shí)會(huì)發(fā)現(xiàn)兩個(gè)節(jié)點(diǎn)都可以正常運(yùn)行。再通過(guò)運(yùn)行rosnodelist查看節(jié)點(diǎn)信息,顯示結(jié)果為:/xxx/turtlesim/yyy/turtlesimrosrun設(shè)置命名空間與重映射3.rosrun命名空間與名稱重映射疊加語(yǔ)法:rosrun功能包名

節(jié)點(diǎn)名__ns:=新名稱__name:=新名稱具體案例如下:rosrunturtlesimturtlesim_node__ns:=/xxx__name:=tn運(yùn)行rosnodelist查看節(jié)點(diǎn)信息,其顯示結(jié)果為:/xxx/tn2.rosrun名稱重映射名稱重映射即為節(jié)點(diǎn)起別名,其語(yǔ)法格式為:rosrun功能包名

節(jié)點(diǎn)名__name:=新名稱具體案例:rosrunturtlesimturtlesim_node__name:=turtle1或rosrunturtlesimturtlesim_node/turtlesim:=turtle1rosrunturtlesimturtlesim_node__name:=turtle2或rosrunturtlesimturtlesim_node/turtlesim:=turtle2同樣兩個(gè)節(jié)點(diǎn)都可以運(yùn)行,使用rosnodelist查看節(jié)點(diǎn)信息,結(jié)果如下:/turtle1/turtle2launch文件設(shè)置命名空間與重映射前面章節(jié)介紹launch文件的使用語(yǔ)法時(shí),在<node>標(biāo)簽中有兩個(gè)屬性:name和ns,二者分別是用于實(shí)現(xiàn)名稱重映射與命名空間設(shè)置的。使用launch文件方式來(lái)設(shè)置命名空間與名稱重映射相對(duì)來(lái)說(shuō)比較簡(jiǎn)單。下面是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可選。運(yùn)行上述launch文件后,使用rosnodelist命令查看節(jié)點(diǎn)信息,則顯示結(jié)果為:/turtle1/turtle2/turtle1/hello編碼設(shè)置命名空間與重映射如果使用自定義節(jié)點(diǎn)實(shí)現(xiàn)方式,那么可以更靈活地設(shè)置命名空間與重映射。1.C++實(shí)現(xiàn)重映射核心代碼為:ros::init(argc,argv,"zhangsan",ros::init_options::AnonymousName);2.C++實(shí)現(xiàn)命名空間核心代碼如下:std::map<std::string,std::string>map;map["__ns"]="xxxx";ros::init(map,"wangqiang");3.Python實(shí)現(xiàn)重映射核心代碼:rospy.init_node("lisi",anonymous=True)ros話題名稱設(shè)置04CATALOGUEros話題名稱設(shè)置在ROS中節(jié)點(diǎn)名稱可能出現(xiàn)相同名字的情況,同理,話題名稱也可能重名。

解決策略與節(jié)點(diǎn)名稱重名類似,也是使用名稱重映射或?yàn)槊Q添加前綴。根據(jù)前綴不同,話題名稱可以分為全局、相對(duì)、和私有三種類型。全局(參數(shù)名稱直接參考ROS系統(tǒng),與節(jié)點(diǎn)命名空間平級(jí))相對(duì)(參數(shù)名稱參考的是節(jié)點(diǎn)的命名空間,與節(jié)點(diǎn)名稱平級(jí))私有(參數(shù)名稱參考節(jié)點(diǎn)名稱,是節(jié)點(diǎn)名稱的子級(jí))名稱重映射是為名稱起別名,為名稱添加前綴,實(shí)現(xiàn)起來(lái)比節(jié)點(diǎn)重名更復(fù)雜一點(diǎn),不單是使用命名空間作為前綴、還可以使用節(jié)點(diǎn)名稱做為前綴。兩種策略的實(shí)現(xiàn)有以下三種途徑:1)rosrun命令;2)launch文件;3)編碼實(shí)現(xiàn)。rosrun設(shè)置話題重映射rosrun名稱重映射語(yǔ)法:rorun功能包名

節(jié)點(diǎn)名

話題名:=新話題名稱實(shí)現(xiàn)teleop_twist_keyboard命令與小海龜顯示節(jié)點(diǎn)通信方案有以下兩種。1.方案一將teleop_twist_keyboard節(jié)點(diǎn)的話題設(shè)置為/turtle1/cmd_vel啟動(dòng)鍵盤控制節(jié)點(diǎn):rosrunteleop_twist_keyboardteleop_twist_keyboard.py/cmd_vel:=/turtle1/cmd_vel啟動(dòng)小海龜顯示節(jié)點(diǎn):rosrunturtlesimturtlesim_node則二者可以實(shí)現(xiàn)正常通信。2.方案二將小海龜顯示節(jié)點(diǎn)的話題設(shè)置為/cmd_vel啟動(dòng)鍵盤控制節(jié)點(diǎn):rosrunteleop_twist_keyboardteleop_twist_keyboard.py啟動(dòng)小海龜顯示節(jié)點(diǎn):rosrunturtlesimturtlesim_node/turtle1/cmd_vel:=/cmd_vel則二者同樣可以實(shí)現(xiàn)正常通信。launch文件設(shè)置話題重映射launch文件設(shè)置話題重映射語(yǔ)法如下:<nodepkg="xxx"type="xxx"name="xxx"><remapfrom="原話題"to="新話題"/></node>實(shí)現(xiàn)teleop_twist_keyboard節(jié)點(diǎn)與小海龜顯示節(jié)點(diǎn)通信方案有以下兩種。1.方案一將teleop_twist_keyboard節(jié)點(diǎn)的話題設(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>這樣可以實(shí)現(xiàn)二者的正常通信。launch文件設(shè)置話題重映射2.方案二將小海龜顯示節(jié)點(diǎn)的話題設(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>同樣可以實(shí)現(xiàn)二者的正常通信。編碼設(shè)置話題重映射演示準(zhǔn)備:(1)初始化節(jié)點(diǎn),設(shè)置一個(gè)節(jié)點(diǎn)名稱;ros::init(argc,argv,"hello")(2)設(shè)置不同類型的話題。(3)啟動(dòng)節(jié)點(diǎn)時(shí),傳遞一個(gè)__ns:=xxx。(4)節(jié)點(diǎn)啟動(dòng)后,使用rostopic查看話題信息。1)全局名稱格式:以“/”開頭的名稱,和節(jié)點(diǎn)名稱無(wú)關(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)相對(duì)名稱格式:非“/”開頭的名稱,參考命名空間(與節(jié)點(diǎn)名稱平級(jí))來(lái)確定話題名稱示例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)使用“~”,而話題名稱又以“/”開頭時(shí),那么話題名稱是絕對(duì)的ros參數(shù)名稱設(shè)置05CATALOGUEros參數(shù)名稱設(shè)置

在ROS中的節(jié)點(diǎn)名稱、話題名稱可能出現(xiàn)同名的情況,同理,參數(shù)名稱也可能重名。

為了避免參數(shù)重名,通常都是采用為參數(shù)名添加前綴的方式,其實(shí)現(xiàn)方式類似于話題名稱,有全局、相對(duì)和私有三種類型。

全局(參數(shù)名稱直接參考ROS系統(tǒng),與節(jié)點(diǎn)命名空間平級(jí));

相對(duì)(參數(shù)名稱參考的是節(jié)點(diǎn)的命名空間,與節(jié)點(diǎn)名稱平級(jí));

私有(參數(shù)名稱參考節(jié)點(diǎn)名稱,是節(jié)點(diǎn)名稱的子級(jí))。

設(shè)置參數(shù)的方式同樣有三種方式:rosrun命令、launch文件、編碼實(shí)現(xiàn)。rosrun設(shè)置參數(shù)rosrun在啟動(dòng)節(jié)點(diǎn)時(shí),也可以設(shè)置參數(shù)。語(yǔ)法:rosrun功能包名

節(jié)點(diǎn)名稱_參數(shù)名:=參數(shù)值啟動(dòng)小海龜顯示節(jié)點(diǎn),并設(shè)置參數(shù)A=100,語(yǔ)句為:rosrunturtlesimturtlesim_node_A:=100通過(guò)運(yùn)行rosparamlist查看節(jié)點(diǎn)信息,結(jié)果顯示為:/turtlesim/A/turtlesim/background_b/turtlesim/background_g/turtlesim/background_r結(jié)果顯示參數(shù)A前綴節(jié)點(diǎn)名稱,也就是說(shuō)rosrun執(zhí)行設(shè)置參數(shù),參數(shù)名使用的是

私有模式。launch文件設(shè)置參數(shù)

通過(guò)launch文件設(shè)置參數(shù)時(shí),可以在<node>標(biāo)簽外,或<node>標(biāo)簽中通過(guò)<param>或<rosparam>來(lái)設(shè)置參數(shù)。在<node>標(biāo)簽外設(shè)置的參數(shù)是全局性質(zhì)的,參考的是“/”,在<node>標(biāo)簽中設(shè)置的參數(shù)是私有性質(zhì)的,參考的是/命名空間/節(jié)點(diǎn)名稱。以<param>標(biāo)簽為例設(shè)置參數(shù)如下:<launch><paramname="p1"value="100"/><nodepkg="turtlesim"type="turtlesim_node"name="turtle1"><paramname="p2"value="100"/></node></launch>通過(guò)運(yùn)行rosparamlist命令查看節(jié)點(diǎn)信息,其結(jié)果為:/p1/turtle1/p2編碼設(shè)置參數(shù)使用C++方式時(shí),可以使用ros::param或者ros::NodeHandle來(lái)設(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í),如果以“/”開頭,那么就是

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 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)論