版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
編寫及編譯ROS程序本課程主要內(nèi)容用C++編寫ROSnodeC++代碼編寫CMakeLists.txt的編寫規(guī)則用python編寫ROSnode?NXROBO20222主要掌握ROSnode的編程范式,理解ROS通信機(jī)制在程序中的體現(xiàn)。創(chuàng)建工程空間創(chuàng)建自己的ROS包在包目錄下創(chuàng)建***.cpp或.py源代碼文件若*.cpp,則修改CMakeLists.txt文件編譯ROS編程的一般流程3?NXROBO2022√本課講解√本課講解√本課講解編程語言的選擇C++作為編譯類語言,運(yùn)行時(shí)執(zhí)行效率高,適合計(jì)算量較大的算法類程序;
C++為ROS原生語言,基于roscpp,功能全面完整Python作為解釋性語言,執(zhí)行效率低,一般不適合大型算法類程序,但其編碼效率較高,修改程序方便,可快速成形和測試?;趓ospy,ROS有些功能沒有python接口4?NXROBO2022編輯工具選擇至于代碼編輯器或IDE的選擇,建議使用Vim或Eclipse。Vim可以讓你專注編碼,而且有很多插件,實(shí)現(xiàn)代碼補(bǔ)全、語法高亮、文件管理等功能,但如果沒用過,上手需要一段時(shí)間,命令掌握不熟反而效率更低。Eclipse交互界面更為友好,有支持C++版本,使用PyDev插件實(shí)現(xiàn)支持Python。5?NXROBO2022用C++編寫ROSnode實(shí)例代碼ros_tutorials:/ros/ros_tutorialsroscppapi文檔:/kinetic/api/roscpp/html/鼓勵大家多自己查看文檔,多編程實(shí)踐。ROSnode的基本結(jié)構(gòu)7?NXROBO2022#include<ros.h>voidcallback_func(msg){…...}intmain(){
//1.初始化,向rosmaster注冊登記
ros::init(...);
//2.啟動節(jié)點(diǎn),并定義發(fā)布器、訂閱器、服務(wù)器、客戶端、…
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ā)布消息或響應(yīng)訂閱到的消息
ros::Rateloop_rate(10); while(ros::ok()){
//3.1構(gòu)建所需要發(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()關(guān)閉函數(shù)ros::NodeHandle節(jié)點(diǎn)句柄類ros::Publisher發(fā)布器類ros::Subscriber訂閱器類ros::Rateloop_rate循環(huán)速率類8?NXROBO2022node初始化——ros::init()通過調(diào)用ros::init()函數(shù)來初始化node,目的是向節(jié)點(diǎn)管理器注冊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名字唯一,如果運(yùn)行同名的node,先運(yùn)行的node會自動關(guān)閉。如果想一個(gè)node能同時(shí)多實(shí)例運(yùn)行,可以通過參數(shù)映射同樣能實(shí)現(xiàn),也可通過設(shè)置option為init_options::AnonymousName實(shí)現(xiàn)。10?NXROBO2022node初始化——ros::init()options:這個(gè)參數(shù)是可選項(xiàng),是一個(gè)位結(jié)構(gòu)體,所以可指定多個(gè)選項(xiàng)值,可設(shè)置的值有:ros::init_options::NoSigintHandler
指定此參數(shù)將不創(chuàng)建SIGINT信號處理器。如果設(shè)置了此參數(shù),為了使node能被正常關(guān)閉,需要自行創(chuàng)建SIGINT信號的處理器。SIGINT信號是UNIX系統(tǒng)用來結(jié)束進(jìn)程的,一般由CTRL+C等方式觸發(fā)。ros::init_options::AnonymousName
指定此參數(shù)將在node名字后追加一個(gè)隨機(jī)數(shù),這樣同一個(gè)node被多次運(yùn)行時(shí),每個(gè)實(shí)例名是唯一的。ros::init_options::NoRosou
指定此參數(shù)將不把ros控制臺的輸出信息廣播到/rosout這個(gè)topic上。11?NXROBO2022node初始化——ros::init()ros::init()除了上面介紹的初始化函數(shù),還有兩種ros::init()的重載函數(shù):這兩個(gè)重載函數(shù)將argc和argv替換成直接指定映像參數(shù)。12?NXROBO2022node啟動——ros::NodeHandlenh通過創(chuàng)建ros::NodeHandle實(shí)例來啟動node。這是最通常的做法,此步驟也可通過其他方式完成。第一個(gè)ros::NodeHandle實(shí)例創(chuàng)建后就會調(diào)用ros::start(),最后一個(gè)ros::NodeHandle實(shí)例銷毀后就會調(diào)用ros::shutdown()。函數(shù)ros::start()才真正開始執(zhí)行node的內(nèi)部功能,包括運(yùn)轉(zhuǎn)線程、開始網(wǎng)絡(luò)輪詢和xmlrpc循環(huán)、連接內(nèi)部訂閱、運(yùn)行service服務(wù)端等。函數(shù)ros::shutdown()是關(guān)閉node的,主要過程有斷開一切網(wǎng)絡(luò)連接(用于TOPIC和SERVICE)、從節(jié)點(diǎn)管理器(master)注銷。ros::NodeHandle負(fù)責(zé)實(shí)例化與這個(gè)node有關(guān)的publisher/subscriber/server/parameterserver對象。13?NXROBO2022創(chuàng)建發(fā)布器發(fā)布器由ros::NodeHandle的實(shí)例化對象創(chuàng)建,將所發(fā)布主題的名稱和對應(yīng)的消息類型告知節(jié)點(diǎn)管理器發(fā)布器創(chuàng)建方式:topic_name:話題名稱,指定往哪個(gè)話題上發(fā)消息message_type:消息類型,指定該話題(topic)上傳輸什么類型的消息。buff_len:發(fā)送緩沖區(qū)大小14?NXROBO2022ros::Publisherpub=nh.advertise<message_type>(topic_name,buff_len);創(chuàng)建訂閱器訂閱器由ros::NodeHandle的實(shí)例化對象創(chuàng)建,將所訂閱主題的名稱及對應(yīng)的消息類型告知節(jié)點(diǎn)管理器訂閱器創(chuàng)建方式:topic_name:話題名稱,指定從哪個(gè)話題上獲取消息buff_len:接收緩沖區(qū)大小callback_func:回調(diào)函數(shù),即話題(topic)上有數(shù)據(jù)的時(shí)候,你要怎么處理這些數(shù)據(jù)。需要程序員明定義此函數(shù)。15?NXROBO2022ros::Subscribersub=nh.subscribe(topic_name,buff_len,callback_func);創(chuàng)建服務(wù)器服務(wù)器由ros::NodeHandle的實(shí)例化對象創(chuàng)建,將服務(wù)名稱和服務(wù)響應(yīng)函數(shù)告知節(jié)點(diǎn)管理器,對外廣播所能提供的服務(wù)服務(wù)器創(chuàng)建方式:service_name:服務(wù)名稱,指定能提供哪個(gè)服務(wù)service_func:響應(yīng)服務(wù)請求的處理函數(shù),即有客戶端請求服務(wù)時(shí),你要怎么處理這些請求。需要程序員明定義此函數(shù)。16?NXROBO2022ros::ServiceServerserver=nh.advertiseService(service_name,service_func);創(chuàng)建服務(wù)客戶端服務(wù)客戶端由ros::NodeHandle的實(shí)例化對象創(chuàng)建,將請求服務(wù)的名稱和服務(wù)類型告知節(jié)點(diǎn)管理器客戶端創(chuàng)建方式:service_name:服務(wù)名稱,指定在哪個(gè)服務(wù)上請求服務(wù)service_type:服務(wù)類型,指定出請求和響應(yīng)的類型。17?NXROBO2022ros::ServiceClientclient=nh.ServiceClient<service_type>(service_name);主循環(huán)循環(huán)條件ros::ok():當(dāng)接受到ctrl+c信號或者ros::shutdown()調(diào)用時(shí),為false,終止運(yùn)行節(jié)點(diǎn)。主循環(huán)中,使用ros::rate實(shí)現(xiàn)將循環(huán)一次的時(shí)間控制在一個(gè)我們設(shè)置的一個(gè)周期內(nèi)。18?NXROBO2022或示例:發(fā)布節(jié)點(diǎn)19?NXROBO2022示例:訂閱節(jié)點(diǎn)20?NXROBO202221?NXROBO2022示例:服務(wù)器節(jié)點(diǎn)22?NXROBO2022示例:客戶端節(jié)點(diǎn)ROSnode總結(jié)從api使用角度來看,通信方式的不同體現(xiàn)在程控流上。topic無同步service有同步publish非阻塞call阻塞。何時(shí)使用topic或service?實(shí)時(shí)更新的數(shù)據(jù)使用topic傳輸。特殊邏輯的小數(shù)據(jù)使用service。topic需要更多精力去處理異步數(shù)據(jù)獲得與主控制流的邏輯關(guān)系。實(shí)現(xiàn)難度上要更高。23?NXROBO2022修改CMakelist.txt文件Cmakelist.txt作用CMakeLists.txt文件CMake構(gòu)建系統(tǒng)的配置文件用于描述代碼如何編譯構(gòu)建以及安裝到何位置等參數(shù)CMake根據(jù)此檔生成makefiles文件,任何兼容CMake的軟件包至少包含一個(gè)CMakeLists.txt文件相比普通的CMake項(xiàng)目,catkin項(xiàng)目中的CMakeLists.txt只是額外多加了幾條約束。25?NXROBO2022Cmakelist.txt樣例26?NXROBO2022Cmakelist.txt規(guī)則CMake最低版本要求
(cmake_minimum_required)規(guī)定CMake的最低版本,catkin構(gòu)建必須以此行開頭,使用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ī)則構(gòu)建時(shí)需要的其它CMake/Catkin軟件包
構(gòu)建此工程時(shí)需要的其它CMake/Catkin軟件包,而且是構(gòu)建依賴而非運(yùn)行依賴,使用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這幾個(gè)環(huán)境變量,以供CMake腳本調(diào)用,具體情況可在構(gòu)建成功后查看工作空間build目錄下的CMakecache.txt文件29find_package(catkinREQUIREDCOMPONENTSstd_msgsrospyroscpp)?NXROBO2022Cmakelist.txt規(guī)則處理Message/Service/Action文件
Messages(.msg)、services(.srv)和actions(.action)三個(gè)文件需要進(jìn)行預(yù)處理以便于功能包構(gòu)建使用,生成所支持的編程語言需要并識別的文件:其后加上宏: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為構(gòu)建依賴;message_runtime、actionlib和actionlib_msgs為運(yùn)行依賴,如果此功能包依賴的其它功能包中已包含此依賴則不必再次添加。提示:actionlib*在需處理.action檔情況下添加find_package(catkinREQUIREDCOMPONENTSmessage_generation)31?NXROBO2022處理Message/Service/Action文件比較完整的示例,(假設(shè)這些messages依賴std_msgs和sensor_msgs),如:32?NXROBO2022Cmakelist.txt規(guī)則定義功能包構(gòu)建的輸出信息
為構(gòu)建系統(tǒng)提供catkin特有的信息以供系統(tǒng)生成pkg-config和CMake文件,通過catkin構(gòu)建系統(tǒng)的catkin_package()宏實(shí)現(xiàn)。其有5個(gè)可選參數(shù):33INCLUDE_DIRS
此功能包輸出的包含路徑(如用于:cflags)LIBRARIES
功能包輸出的庫CATKIN_DEPENDS
依賴的其它c(diǎn)atkin工程DEPENDS
依賴的非catkin的CMake工程CFG_EXTRAS
其它配置項(xiàng)?NXROBO2022Cmakelist.txt規(guī)則定義構(gòu)建目標(biāo)
構(gòu)建目標(biāo)包括可執(zhí)行程序和庫文件,主要定義內(nèi)容包括:34頭文件路徑庫路徑目標(biāo)構(gòu)建規(guī)則?NXROBO2022定義構(gòu)建目標(biāo)包含路徑
包含路徑通過include_directories()和link_directories()兩個(gè)宏實(shí)現(xiàn),分別表示要包含的頭文件路徑和庫路徑。頭文件路徑可以手動指定路徑也可以使用由find_package()宏生成的形如*_INCLUDE_DIRS這樣的CMake變量。庫路徑,無特殊情況,一般都由find_package()自動生成添加。35?NXROBO2022定義構(gòu)建目標(biāo)目標(biāo)規(guī)則
目標(biāo)規(guī)則主要指定構(gòu)建的目標(biāo)名稱及其源文件和鏈接需要的庫,由add_executable()和add_library()兩個(gè)宏分別實(shí)現(xiàn)可執(zhí)行程序和庫目標(biāo)定義。語法如下:使用target_link_libraries()宏來定義可執(zhí)行程序鏈接需要的庫:36?NXROBO2022Cmakelist.txt規(guī)則單元測試
通過catkin的宏catkin_add_gtest()實(shí)現(xiàn):37?NXROBO2022Cmakelist.txt規(guī)則安裝規(guī)則
構(gòu)建完成后,所有構(gòu)建目標(biāo)將會存放于catkin工作空間的devel目錄,如果想用makeinstall執(zhí)行安裝操作,就必須定義安裝規(guī)則。安裝對象一般有可執(zhí)行程序或腳本、庫、頭文件、roslaunch文件及其它資源類文件。規(guī)則定義通過install()宏實(shí)現(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,實(shí)現(xiàn)Python模塊的安裝。
其它細(xì)節(jié)問題請查閱catkin文檔和CMake文檔。41?NXROBO2022編譯構(gòu)建功能包編寫好package.xml、CMakelist.txt及功能代碼就可以進(jìn)行編譯構(gòu)建了。編譯構(gòu)建工作在catkin工作空間頂層目錄下進(jìn)行:編譯構(gòu)建部分指定的包:需要安裝的話,就執(zhí)行:$cd~/catkin_ws
$catkin_make$catkin_make-DCATKIN_WHITELIST_PACKAGES=”package1;package2”$catkin_makeinstall42?NXROBO2022用Python編寫ROSnode實(shí)例代碼ros_tutorials:/ros/ros_tutorialsroscppapi文檔:http:///kinetic/api/rospy/html/鼓勵大家多自己查看文檔,多編程實(shí)踐。創(chuàng)建工程空間創(chuàng)建自己的ROS包在包目錄下創(chuàng)建***.py源代碼文件無需編譯ROSPython編程基本步驟√本課講解44√本課講解?NXROBO2022ROSnode的基本結(jié)構(gòu)(python)45?NXROBO2022importrospydefcallback(msg):
…….if__name__=='__main__':
//1.初始化,向rosmaster注冊登記
rospy.init_node(...)
//2.啟動節(jié)點(diǎn),并定義發(fā)布器、訂閱器、服務(wù)器、客戶端、… 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ā)布消息或響應(yīng)訂閱到的消息
rospy.spin()
loop_rate=rospy.Rate(10) whilenotrospy.is_shutdown():
//3.1構(gòu)建所需要發(fā)布的消息
...
//3.2發(fā)布消息
pub.publish(....);
//3.3調(diào)控節(jié)奏 loop_rate.sleep();為Python提供的客戶庫為rospy,rospynode初始化是其進(jìn)程的初始化同樣為了向節(jié)點(diǎn)管理器注冊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]):傳遞進(jìn)來的命令行參數(shù),包括映射參數(shù),默認(rèn)為sys.argv。如果指定argv,則必須在創(chuàng)建任何rospy數(shù)據(jù)結(jié)構(gòu)之前調(diào)用init_node()。anonymous(bool):如果是True,則在指定的node名字后加隨機(jī)數(shù),保證多實(shí)例運(yùn)行時(shí)最終node名唯一。但這樣的node不能重映射名字。log_level(int):定義發(fā)送message給/rosout及記錄日志文件的日志級別,可用值有:rospy.DEBUG,rospy.INFO,rospy.ERROR,rospy.WARN,rospy.FATAL,一般設(shè)置成INFO。47?NXROBO2022rospy.init_node()disable_signals(bool):如果設(shè)置成True,則rospy不會注冊自帶的信號handler,需要手動調(diào)用rospy.signal_shutdown(reason)以保證node的正常關(guān)閉。一般常用于在不主線程中調(diào)用init_node或在處理信號時(shí)需添加特別動作的情況。xmlrpc_port(int):如果指定此參數(shù),將使用此值作為埠號進(jìn)行XMLRPC的通信。tcpros_p
溫馨提示
- 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度恒溫恒濕儲藏室建設(shè)與維護(hù)合同3篇
- 2025年度影視制作車輛借用及拍攝服務(wù)合同2篇
- 領(lǐng)導(dǎo)干部談心談話記錄
- 2024年質(zhì)押借款補(bǔ)充合同模板
- 2024收銀員崗位技能提升及入職培訓(xùn)合同3篇
- 不銹鋼建筑安裝工程承攬協(xié)議版B版
- 2024年軟件開發(fā)購買合同
- 2024智能家居弱電裝修系統(tǒng)合同
- 2024年度特制版權(quán)轉(zhuǎn)讓協(xié)議(專業(yè)版)
- 專業(yè)化集裝箱物流配送服務(wù)協(xié)議2024版B版
- 安全保障作業(yè)方案
- 變壓器互感器制造工試題及答案
- 大學(xué)寫作課(課堂課件)
- 電工安全培訓(xùn)教育記錄
- 梅花鹿養(yǎng)殖基地產(chǎn)業(yè)化建設(shè)項(xiàng)目可行性研究報(bào)告(含財(cái)務(wù)表)
- 一年級帶拼音閱讀(全)
- 管理研究方法論for msci.students maxqda12入門指南
- TSEESA 010-2022 零碳園區(qū)創(chuàng)建與評價(jià)技術(shù)規(guī)范
- GB/T 3003-2017耐火纖維及制品
- GB/T 18920-2020城市污水再生利用城市雜用水水質(zhì)
- 2023年市場部主管年終工作總結(jié)及明年工作計(jì)劃
評論
0/150
提交評論