版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
編寫及編譯ROS程序本課程主要內(nèi)容用C++編寫ROSnodeC++代碼編寫CMakeLists.txt的編寫規(guī)則用python編寫ROSnode?NXROBO20222主要掌握ROSnode的編程范式,理解ROS通信機制在程序中的體現(xiàn)。創(chuàng)建工程空間創(chuàng)建自己的ROS包在包目錄下創(chuàng)建***.cpp或.py源代碼文件若*.cpp,則修改CMakeLists.txt文件編譯ROS編程的一般流程3?NXROBO2022√本課講解√本課講解√本課講解編程語言的選擇C++作為編譯類語言,運行時執(zhí)行效率高,適合計算量較大的算法類程序;
C++為ROS原生語言,基于roscpp,功能全面完整Python作為解釋性語言,執(zhí)行效率低,一般不適合大型算法類程序,但其編碼效率較高,修改程序方便,可快速成形和測試?;趓ospy,ROS有些功能沒有python接口4?NXROBO2022編輯工具選擇至于代碼編輯器或IDE的選擇,建議使用Vim或Eclipse。Vim可以讓你專注編碼,而且有很多插件,實現(xiàn)代碼補全、語法高亮、文件管理等功能,但如果沒用過,上手需要一段時間,命令掌握不熟反而效率更低。Eclipse交互界面更為友好,有支持C++版本,使用PyDev插件實現(xiàn)支持Python。5?NXROBO2022用C++編寫ROSnode實例代碼ros_tutorials:/ros/ros_tutorialsroscppapi文檔:/kinetic/api/roscpp/html/鼓勵大家多自己查看文檔,多編程實踐。ROSnode的基本結構7?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構建所需要發(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)速率類8?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/RemappingArguments9$rosrunbeginner_tutorialstestfoo:=/a/foo?NXROBO2022name:定義node的名字,不能帶命名空間,可通過映射參數(shù)覆蓋。在ROS系統(tǒng)中要保證Node名字唯一,如果運行同名的node,先運行的node會自動關閉。如果想一個node能同時多實例運行,可以通過參數(shù)映射同樣能實現(xiàn),也可通過設置option為init_options::AnonymousName實現(xiàn)。10?NXROBO2022node初始化——ros::init()options:這個參數(shù)是可選項,是一個位結構體,所以可指定多個選項值,可設置的值有:ros::init_options::NoSigintHandler
指定此參數(shù)將不創(chuàng)建SIGINT信號處理器。如果設置了此參數(shù),為了使node能被正常關閉,需要自行創(chuàng)建SIGINT信號的處理器。SIGINT信號是UNIX系統(tǒng)用來結束進程的,一般由CTRL+C等方式觸發(fā)。ros::init_options::AnonymousName
指定此參數(shù)將在node名字后追加一個隨機數(shù),這樣同一個node被多次運行時,每個實例名是唯一的。ros::init_options::NoRosou
指定此參數(shù)將不把ros控制臺的輸出信息廣播到/rosout這個topic上。11?NXROBO2022node初始化——ros::init()ros::init()除了上面介紹的初始化函數(shù),還有兩種ros::init()的重載函數(shù):這兩個重載函數(shù)將argc和argv替換成直接指定映像參數(shù)。12?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)部功能,包括運轉線程、開始網(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對象。13?NXROBO2022創(chuàng)建發(fā)布器發(fā)布器由ros::NodeHandle的實例化對象創(chuàng)建,將所發(fā)布主題的名稱和對應的消息類型告知節(jié)點管理器發(fā)布器創(chuàng)建方式:topic_name:話題名稱,指定往哪個話題上發(fā)消息message_type:消息類型,指定該話題(topic)上傳輸什么類型的消息。buff_len:發(fā)送緩沖區(qū)大小14?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ù)。15?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ù)。16?NXROBO2022ros::ServiceServerserver=nh.advertiseService(service_name,service_func);創(chuàng)建服務客戶端服務客戶端由ros::NodeHandle的實例化對象創(chuàng)建,將請求服務的名稱和服務類型告知節(jié)點管理器客戶端創(chuàng)建方式:service_name:服務名稱,指定在哪個服務上請求服務service_type:服務類型,指定出請求和響應的類型。17?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)。18?NXROBO2022或示例:發(fā)布節(jié)點19?NXROBO2022示例:訂閱節(jié)點20?NXROBO202221?NXROBO2022示例:服務器節(jié)點22?NXROBO2022示例:客戶端節(jié)點ROSnode總結從api使用角度來看,通信方式的不同體現(xiàn)在程控流上。topic無同步service有同步publish非阻塞call阻塞。何時使用topic或service?實時更新的數(shù)據(jù)使用topic傳輸。特殊邏輯的小數(shù)據(jù)使用service。topic需要更多精力去處理異步數(shù)據(jù)獲得與主控制流的邏輯關系。實現(xiàn)難度上要更高。23?NXROBO2022修改CMakelist.txt文件Cmakelist.txt作用CMakeLists.txt文件CMake構建系統(tǒng)的配置文件用于描述代碼如何編譯構建以及安裝到何位置等參數(shù)CMake根據(jù)此檔生成makefiles文件,任何兼容CMake的軟件包至少包含一個CMakeLists.txt文件相比普通的CMake項目,catkin項目中的CMakeLists.txt只是額外多加了幾條約束。25?NXROBO2022Cmakelist.txt樣例26?NXROBO2022Cmakelist.txt規(guī)則CMake最低版本要求
(cmake_minimum_required)規(guī)定CMake的最低版本,catkin構建必須以此行開頭,使用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)27?NXROBO2022Cmakelist.txt規(guī)則構建時需要的其它CMake/Catkin軟件包
構建此工程時需要的其它CMake/Catkin軟件包,而且是構建依賴而非運行依賴,使用find_package()宏命令格式:catkin是必須要定義:find_package(<name>[[REQUIRED|COMPONENTS][componets...]])find_package(catkinREQUIRED)28?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)用,具體情況可在構建成功后查看工作空間build目錄下的CMakecache.txt文件29find_package(catkinREQUIREDCOMPONENTSstd_msgsrospyroscpp)?NXROBO2022Cmakelist.txt規(guī)則處理Message/Service/Action文件
Messages(.msg)、services(.srv)和actions(.action)三個文件需要進行預處理以便于功能包構建使用,生成所支持的編程語言需要并識別的文件:其后加上宏:add_message_files()add_service_files()add_action_files()generate_messages()30?NXROBO2022處理Message/Service/Action文件還需在find_package()宏中添加功能包信息參數(shù),如:而且在package.xml文件中必須添加message_generation、actionlib和actionlib_msgs為構建依賴;message_runtime、actionlib和actionlib_msgs為運行依賴,如果此功能包依賴的其它功能包中已包含此依賴則不必再次添加。提示:actionlib*在需處理.action檔情況下添加find_package(catkinREQUIREDCOMPONENTSmessage_generation)31?NXROBO2022處理Message/Service/Action文件比較完整的示例,(假設這些messages依賴std_msgs和sensor_msgs),如:32?NXROBO2022Cmakelist.txt規(guī)則定義功能包構建的輸出信息
為構建系統(tǒng)提供catkin特有的信息以供系統(tǒng)生成pkg-config和CMake文件,通過catkin構建系統(tǒng)的catkin_package()宏實現(xiàn)。其有5個可選參數(shù):33INCLUDE_DIRS
此功能包輸出的包含路徑(如用于:cflags)LIBRARIES
功能包輸出的庫CATKIN_DEPENDS
依賴的其它catkin工程DEPENDS
依賴的非catkin的CMake工程CFG_EXTRAS
其它配置項?NXROBO2022Cmakelist.txt規(guī)則定義構建目標
構建目標包括可執(zhí)行程序和庫文件,主要定義內(nèi)容包括:34頭文件路徑庫路徑目標構建規(guī)則?NXROBO2022定義構建目標包含路徑
包含路徑通過include_directories()和link_directories()兩個宏實現(xiàn),分別表示要包含的頭文件路徑和庫路徑。頭文件路徑可以手動指定路徑也可以使用由find_package()宏生成的形如*_INCLUDE_DIRS這樣的CMake變量。庫路徑,無特殊情況,一般都由find_package()自動生成添加。35?NXROBO2022定義構建目標目標規(guī)則
目標規(guī)則主要指定構建的目標名稱及其源文件和鏈接需要的庫,由add_executable()和add_library()兩個宏分別實現(xiàn)可執(zhí)行程序和庫目標定義。語法如下:使用target_link_libraries()宏來定義可執(zhí)行程序鏈接需要的庫:36?NXROBO2022Cmakelist.txt規(guī)則單元測試
通過catkin的宏catkin_add_gtest()實現(xiàn):37?NXROBO2022Cmakelist.txt規(guī)則安裝規(guī)則
構建完成后,所有構建目標將會存放于catkin工作空間的devel目錄,如果想用makeinstall執(zhí)行安裝操作,就必須定義安裝規(guī)則。安裝對象一般有可執(zhí)行程序或腳本、庫、頭文件、roslaunch文件及其它資源類文件。規(guī)則定義通過install()宏實現(xiàn),有四種參數(shù):38TARGETS需安裝的對象ARCHIVEDESTINATION靜態(tài)庫和DLL的清單文件LIBRARYDESTINATION非DLL共享庫和模塊RUNTIMEDESTINATION可執(zhí)行對象和DLL形式的共享庫?NXROBO2022安裝規(guī)則形式如下:
Python綁定庫必須安裝到特殊的活頁夾以便于其它Python代碼import:39?NXROBO2022安裝規(guī)則頭文件安裝規(guī)則示例如下:40?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文檔。41?NXROBO2022編譯構建功能包編寫好package.xml、CMakelist.txt及功能代碼就可以進行編譯構建了。編譯構建工作在catkin工作空間頂層目錄下進行:編譯構建部分指定的包:需要安裝的話,就執(zhí)行:$cd~/catkin_ws
$catkin_make$catkin_make-DCATKIN_WHITELIST_PACKAGES=”package1;package2”$catkin_makeinstall42?NXROBO2022用Python編寫ROSnode實例代碼ros_tutorials:/ros/ros_tutorialsroscppapi文檔:http:///kinetic/api/rospy/html/鼓勵大家多自己查看文檔,多編程實踐。創(chuàng)建工程空間創(chuàng)建自己的ROS包在包目錄下創(chuàng)建***.py源代碼文件無需編譯ROSPython編程基本步驟√本課講解44√本課講解?NXROBO2022ROSnode的基本結構(python)45?NXROBO2022importrospydefcallback(msg):
…….if__name__=='__main__':
//1.初始化,向rosmaster注冊登記
rospy.init_node(...)
//2.啟動節(jié)點,并定義發(fā)布器、訂閱器、服務器、客戶端、… pub=rospy.Publisher(topic_name,message_type,buff_len)
sub=rospy.Subscriber(topic_name,buff_len,callback_func)
server=rospy.Service(service_name,service_type,service_func)client=rospy.ServiceProxy(service_name,service_type)
//3.循環(huán)發(fā)布消息或響應訂閱到的消息
rospy.spin()
loop_rate=rospy.Rate(10) whilenotrospy.is_shutdown():
//3.1構建所需要發(fā)布的消息
...
//3.2發(fā)布消息
pub.publish(....);
//3.3調(diào)控節(jié)奏 loop_rate.sleep();為Python提供的客戶庫為rospy,rospynode初始化是其進程的初始化同樣為了向節(jié)點管理器注冊node,rospy類的node也必須先初始化包括指定node的名字、ROS的輸出信息級別、是否創(chuàng)建SIGINT信號處理器,由**init_node()**函數(shù)完成,其原型如下:46?NXROBO2022node初始化——rospy.init_node()rospy.init_node()name(str):Node的名字,在ROS系統(tǒng)中唯一,而且不加命名空間。argv([str]):傳遞進來的命令行參數(shù),包括映射參數(shù),默認為sys.argv。如果指定argv,則必須在創(chuàng)建任何rospy數(shù)據(jù)結構之前調(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。47?NXROBO2022rospy.init_node()disable_signals(bool):如果設置成True,則rospy不會注冊自帶的信號handler,需要手動調(diào)用rospy.signal_shutdown(reason)以保證node的正常關閉。一般常用于在不主線程中調(diào)用init_node或在處理信號時需添加特別動作的情況。xmlrpc_port(int):如果指定此參數(shù),將使用此值作為埠號進行XMLRPC的通信。tcpros_p
溫馨提示
- 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年外研版2024高二數(shù)學下冊月考試卷含答案
- 2025中國節(jié)能環(huán)保集團限公司黨委管理領導崗位招聘3人高頻重點提升(共500題)附帶答案詳解
- 2025中國石油寧夏石化分公司高校畢業(yè)生招聘42人高頻重點提升(共500題)附帶答案詳解
- 2025中國海油春季校園招聘1900人高頻重點提升(共500題)附帶答案詳解
- 2025中國平安人壽保險股份限公司廈門分公司校園招聘12人高頻重點提升(共500題)附帶答案詳解
- 2025中國農(nóng)科院植物保護研究所經(jīng)濟作物蟲害監(jiān)測與控制創(chuàng)新團隊科研助理公開招聘1人高頻重點提升(共500題)附帶答案詳解
- 2025中國東方電氣集團科學技術研究院限公司社會招聘1人高頻重點提升(共500題)附帶答案詳解
- 2025東航集團外事辦校園招聘高頻重點提升(共500題)附帶答案詳解
- 2025下半年浙江省溫州市鹿城區(qū)事業(yè)單位招聘(選調(diào))48人歷年高頻重點提升(共500題)附帶答案詳解
- 2025下半年安徽蚌埠固鎮(zhèn)縣事業(yè)單位招聘115人高頻重點提升(共500題)附帶答案詳解
- 噴淋、消火栓試壓記錄表
- 學校精準扶貧工作計劃
- 工業(yè)產(chǎn)品質量安全風險管控清單
- 【幼兒生活環(huán)節(jié)中數(shù)學思維能力培養(yǎng)研究5500字(論文)】
- 《中醫(yī)婦科學》教材
- 大額保單操作實務
- 限制被執(zhí)行人駕駛令申請書
- 皮帶輸送機巡檢規(guī)程
- 遼寧省大連市沙河口區(qū)2022-2023學年七年級上學期期末語文試題(含答案)
- 華為DSTE戰(zhàn)略管理體系完整版
- 新版深度學習完整整套教學課件
評論
0/150
提交評論