版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
ROS星火計劃 ROS通信及工作機制 NXROBO&ExBotROS通信及工作機制上一講中,主要講解了ROS功能包系統(tǒng)依賴的管理、編譯構(gòu)建系統(tǒng)、工作空間的創(chuàng)建和疊加、功能包的創(chuàng)建及package.xml文件的規(guī)則。這一講繼續(xù)進行功能包的相關內(nèi)容學習,主要從以下幾方面進行:? ROSnode的編寫規(guī)則? CMakeLists.txt文件規(guī)則? 功能包的編譯至此我們已經(jīng)了解了功能包文件結(jié)構(gòu)及相關配置文件的規(guī)則,下面開始著手編寫最簡單的功能包代碼。ROS編程的一般流程前面我們講這個ROS編程呢一般是我們首先得給他創(chuàng)建這個工作空間,如果這個工作空間已經(jīng)有了那就可以直接在這個工作空間里面來去做相應工作。然后就是創(chuàng)建這個ROS的功能包就可以去這個編寫自己的代碼了。編程語言的選擇C++作為編譯類語言,運行時執(zhí)行效率高,適合就算兩較大的算法類程序。C++作為ROS原生語言,基于roscpp,功能全面完整。Python作為解釋型語言,執(zhí)行效率低,一般不適合大型算法類程序,但其編碼效率較高,修改程序方便,可快速成形和測試。基于rospy,ROS有些功能沒有pyhton接口。編程工具選擇至于代碼編輯器或IDE的選擇,建議使用Vim或Eclipse。Vim可以讓你專注編碼,而且有很多插件,實現(xiàn)代碼補全、語法高亮、文件管理等功能,但如果沒用過,上手需要一段時間,命令掌握不熟反而效率更低。Eclipse交互界面更加為友好,有支持C++版本,使用PytDev插件實現(xiàn)支持Python。ROS通信層中間件可以說是ROS系統(tǒng)的核心,我們之前介紹的ROS系統(tǒng)諸多特性與功能都基于此,我們這節(jié)課就要仔細討論ROS通信中間件的原理與topic/service具體實現(xiàn),為我們之后進一步理解ROS框架,使用ROS通信api打好基礎。之前介紹過,ROS的通信層設計是基于網(wǎng)絡運輸層tcp/udp協(xié)議,而最為重要的一點是,ROS的computationalgraph(計算圖)概念。ROS的網(wǎng)絡拓撲結(jié)構(gòu)為p2p,節(jié)點間互相獨立。下面進行ROS通信層中的術語解析。ROSnode的基本結(jié)構(gòu)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)速率類node初始化——ros::init()通過調(diào)用ros::init()函數(shù)來初始化node。此函數(shù)向ROS系統(tǒng)傳遞命令行參數(shù)、定義node名字及其它參數(shù)。
在調(diào)用roscpp其它函數(shù)前必須先調(diào)用ros::init(),其函數(shù)原型為:argc和argv:ROS解析命令行參數(shù)進行參數(shù)映射。參數(shù)映像語法為name:=new_name,如:$rosrunbeginner_tutorialstestfoo:=/a/foo具體請查閱RemappingArguments/RemappingArguments如果手動指定這兩個參數(shù),那命令行參數(shù)就不能傳送進來,可在此之前進行命令行參數(shù)的分析與處理。name:定義node的名字,不能帶命名空間,可通過映射參數(shù)覆蓋。在ROS系統(tǒng)中要保證Node名字唯一,如果運行同名的node,先運行的node會自動關閉。如果想一個node能同時多實例運行,可以通過設置option為init_options::AnonymousName,當然通過參數(shù)映射同樣能實現(xiàn)。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上。除了上面介紹的初始化函數(shù),還有兩種ros::init()的重載函數(shù):這兩個重載函數(shù)將argc和argv替換成直接指定映像參數(shù)。node啟動——ros::NodeHandlenhros::NodeHandl負責實例化與這個node有關的publisher/subscriber/service/parameterserver對象。通過創(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)注銷。函數(shù)ros::spin()函數(shù)進入事件循環(huán)。創(chuàng)建發(fā)布器發(fā)布器由ros::NodeHandle的實例化對象創(chuàng)建,將所發(fā)布主題的名稱和對應的消息類型告知節(jié)點管理器發(fā)布器創(chuàng)建方式:ros::Publisherpub=nh.advertise<message_type>(topic_name,buff_len);topic_name:話題名稱,指定往那個話題上發(fā)消息。message_type:消息類型,指定該話題(topic)上傳輸什么類型的消息。buff_len:發(fā)送緩沖區(qū)大小創(chuàng)建訂閱器訂閱器由ros::NodeHandle的實例化對象創(chuàng)建,將所發(fā)布主題的名稱和對應的消息類型告知節(jié)點管理器訂閱器創(chuàng)建方式:ros::Subscribersub=nh.subscribe(topic_name,buff_len,callback_func);topic_name:話題名稱,指定往那個話題上獲取消息。buff_len:接收緩沖區(qū)大小。callback_func:回調(diào)函數(shù),即話題(topic)上有數(shù)據(jù)的時候,你要怎么處理這些數(shù)據(jù)。需要程序員明確定義此函數(shù)。創(chuàng)建服務器服務器由ros::NodeHandle的實例化對象創(chuàng)建,將服務名稱和服務響應函數(shù)告知節(jié)點管理器,對外廣播所能提供的服務。服務器創(chuàng)建方式:ros::ServiceServer=nh.advertiseService(service_name,service_func);service_name:服務名稱,指定能提供哪個服務。service_func:響應服務請求的處理函數(shù),既有客戶端請求服務事,你要怎么處理這些請求。需要程序員明確定義一次函數(shù)。創(chuàng)建服務器客戶端服務客戶端由ros::NodeHandle的實例化對象創(chuàng)建,將請求的名稱和服務類型告知節(jié)點管理器??蛻舳藙?chuàng)建方式:ros::ServiceClientclient=nh.ServiceClient(service_type,service_name);service_name:服務名稱,指定在哪個服務上請求服務。service_type:服務類型,指定出請求和響應的類型。主循環(huán)循環(huán)條件ros::ok():當接受到ctrl+c信號或者ros::shutdown()調(diào)用時,為false,終止運行節(jié)點。主循環(huán)中,使用ros::rate實現(xiàn)將循環(huán)一次的時間控制在一個我們設置的一個周期內(nèi)。ROS_INFO();publish();編寫CMakeLists.txt文件Cmakelist.txt作用CMakeLists.txt文件CMake構(gòu)建系統(tǒng)的配置文件,用于描述代碼如何編譯構(gòu)建以及安裝到何位置等參數(shù),CMake根據(jù)此檔生成makefiles文件,任何兼容CMake的軟件包至少包含一個CMakeLists.txt文件。相比普通的CMake項目,catkin項目中的CMakeLists.txt只是額外多加了幾條約束。Cmakelist.txt作用CMake最低版本要求
(cmake_minimum_required)規(guī)定CMake的最低版本,catkin構(gòu)建必須以此行開頭,使用cmake_minimum_required宏命令。cmake_minimum_required(VERSION2.8.3功能包名(project())通過CMake的project()宏命令定義功能包名稱,cmake腳本中通過${PROJECT_NAME}訪問。創(chuàng)建環(huán)境變量${PROJECT_NAME}_BINARY_DIR和${PROJECT_NAME}_SOURCE_DIR。project(beginner_tutorials)構(gòu)建時需要的其它CMake/Catkin軟件包
構(gòu)建此工程時需要的其它CMake/Catkin軟件包,而且是構(gòu)建依賴而非運行依賴,使用find_package()宏命令格式:find_package(<name>[[REQUIRED|COMPONENTS][componets...]])catkin是必須要定義:find_package(catkinREQUIRED)在CMake會話,工程依賴的其它包會自動作為catkin的組件(components)加入,如果將其加入到find_package()中則過程則簡單得多:find_package(catkinREQUIREDCOMPONENTSstd_msgsrospyroscpp)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文件。處理Message/Service/Action文件
Messages(.msg)、services(.srv)和actions(.action)三個文件需要進行預處理以便于功能包構(gòu)建使用,生成所支持的編程語言需要并識別的文件:add_message_files()add_service_files()add_action_files()其后加上宏:generate_messages()處理Message/Service/Action文件還需在find_package()宏中添加功能包信息參數(shù),如:find_package(catkinREQUIREDCOMPONENTSmessage_generation)而且在package.xml文件中必須添加message_generation、actionlib和actionlib_msgs為構(gòu)建依賴;message_runtime、actionlib和actionlib_msgs為運行依賴,如果此功能包依賴的其它功能包中已包含此依賴則不必再次添加。提示:actionlib*在需處理.action檔情況下添加比較完整的示例,(假設這些messages依賴std_msgs和sensor_msgs),如:CMakList.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ù):INCLUDE_DIRS
此功能包輸出的包含路徑(如用于:cflags)LIBRARIES
功能包輸出的庫CATKIN_DEPENDS
依賴的其它catkin工程DEPENDS
依賴的非catkin的CMake工程CFG_EXTRAS
其它配置項定義構(gòu)建目標,構(gòu)建目標包括可執(zhí)行程序和庫文件,主要定義內(nèi)容包括:頭文件路徑庫路徑目標構(gòu)建規(guī)則單元測試
通過catkin的宏catkin_add_gtest()實現(xiàn):安裝規(guī)則
構(gòu)建完成后,所有構(gòu)建目標將會存放于catkin工作空間的devel目錄,如果想用makeinstall執(zhí)行安裝操作,就必須定義安裝規(guī)則。安裝對象一般有可執(zhí)行程序或腳本、庫、頭文件、roslaunch文件及其它資源類文件。規(guī)則定義通過install()宏實現(xiàn),有四種參數(shù):TARGETS需安裝的對象ARCHIVEDESTINATION靜態(tài)庫和DLL的清單文件LIBRARYDESTINATION非DLL共享庫和模塊RUNTIMEDESTINATION可執(zhí)行對象和DLL形式的共享庫定義構(gòu)建目標包含路徑通過include_directories()和link_directories()兩個宏實現(xiàn),分別表示要包含的頭文件路徑和庫路徑。頭文件路徑可以手動指定路徑也可以使用由find_package()宏生成的形如*_INCLUDE_DIRS這樣的CMake變量。庫路徑,無特殊情況,一般都由find_package()自動生成添加。目標規(guī)則主要指定構(gòu)建的目標名稱及其源文件和鏈接需要的庫,由add_executable()和add_library()兩個宏分別實現(xiàn)可執(zhí)行程序和庫目標定義。語法如下:使用target_link_libraries()宏來定義可執(zhí)行程序鏈接需要的庫:安裝規(guī)則形式如下:Python綁定庫必須安裝到特殊的活頁夾以便于其它Python代碼import:頭文件安裝規(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文檔。編譯構(gòu)建功能包編寫好package.xml、CMakelist.txt及功能代碼就可以進行編譯構(gòu)建了。編譯構(gòu)建工作在catkin工作空間頂層目錄下進行:$cd~/catkin_ws
$catkin_make編譯構(gòu)建部分指定的包:$catkin_make-DCATKIN_WHITELIST_PACKAGES=”package1;package2”需要安裝的話,就執(zhí)行:$catkin_makeinstall編寫CMakeLists.txt文件1.node初始化——rospy.init_node()rospynode初始化是其進程的初始化,包括指定node的名字、ROS的輸出信息級別、是否創(chuàng)建SIGINT信號處理器,由**init_node()**函數(shù)完成,其原型如下:name(str):Node的名字,在ROS系統(tǒng)中唯一,而且不加命名空間。argv([str]):傳遞進來的命令行參數(shù),包括映射參數(shù),默認為sys.argv。如果指定argv,則必須在創(chuàng)建任何rospy數(shù)據(jù)結(jié)構(gòu)之前調(diào)用init_node()。anonymous(bool):如果是True,則在指定的node名字后加隨機數(shù),保證多實例運行時最終node名唯一。但這樣的node不能重映射名字。log_level(int):定義發(fā)送message給/rosout及記錄日志文件的日志級別,可用值有:rospy.DEBUG,rospy.INFO,rospy.ERROR,rospy.WARN,rospy.FATAL,一般設置成INFO。disable_signals(bool):如果設置成True,則rospy不會注冊自帶的信號handler,需要手動調(diào)用rospy
溫馨提示
- 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025版土地租賃與使用權置換協(xié)議3篇
- 校企攜手2025年度共建紡織工藝培訓基地合同3篇
- 二零二五年度文化藝術展覽場地臨時使用協(xié)議書3篇
- 2025版建筑工程碎石料采購與安全管理合同3篇
- 2025年度個人教育培訓機構(gòu)投資合同書(教育連鎖版)4篇
- 二零二五年深海油氣資源開發(fā)電焊工勞務分包協(xié)議3篇
- 個人出租車的對外承包協(xié)議書 3篇
- 二零二五版淋浴房環(huán)保材料生產(chǎn)與應用合同3篇
- 二零二五年度城市道路施工監(jiān)理合同標準版4篇
- 二零二五年度健康醫(yī)療大數(shù)據(jù)合作投資合同3篇
- 定額〔2025〕1號文-關于發(fā)布2018版電力建設工程概預算定額2024年度價格水平調(diào)整的通知
- 2024年城市軌道交通設備維保及安全檢查合同3篇
- 【教案】+同一直線上二力的合成(教學設計)(人教版2024)八年級物理下冊
- 湖北省武漢市青山區(qū)2023-2024學年七年級上學期期末質(zhì)量檢測數(shù)學試卷(含解析)
- 單位往個人轉(zhuǎn)賬的合同(2篇)
- 科研倫理審查與違規(guī)處理考核試卷
- GB/T 44101-2024中國式摔跤課程學生運動能力測評規(guī)范
- 高危妊娠的評估和護理
- 2024年山東鐵投集團招聘筆試參考題庫含答案解析
- 兒童10歲生日-百日宴-滿月酒生日會成長相冊展示(共二篇)
- 2023年高考全國甲卷數(shù)學(理)試卷【含答案】
評論
0/150
提交評論