版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
機器人操作系統(tǒng)(ROS)機器人操作系統(tǒng)(ROS)ROS編程基礎5機器人操作系統(tǒng)(ROS)5.ROS編程基礎在搭建完ROS環(huán)境之后,本章將會開始對ROS的使用進行初步探索,包括創(chuàng)建工作空間、創(chuàng)建功能包、使用ROS節(jié)點、ROS節(jié)點交互、使用參數(shù)服務器和創(chuàng)建節(jié)點等。機器人操作系統(tǒng)(ROS)5.1創(chuàng)建工作空間在開始具體工作之前,首先需要創(chuàng)建工作空間。通過Ctrl+Alt+T快捷鍵打開終端,我們要新建工作空間的文件夾,鍵入以下命令:$mkdir-p~/catkin_ws/src $cd~/catkin_ws/src $catkin_init_workspace
執(zhí)行后的界面如圖所示:catkin_init_workspace命令的輸出機器人操作系統(tǒng)(ROS)5.1創(chuàng)建工作空間通過上述命令將在主文件夾內(nèi)創(chuàng)建一個名為catkin_ws的工作空間文件夾,在這個文件夾中有另一個名為src的文件夾。src文件夾的名字不能修改,但是可以修改src文件夾中文件的名稱。之后用cd指令切換到src文件夾并初始化一個新的ROS工作空間。如果不初始化工作空間,就不能正確地創(chuàng)建、編譯和鏈接程序包。創(chuàng)建完成后,可以通過cd指令在工作空間的根目錄下使用catkin_make命令編譯整個工作空間:$cd~/catkin_ws/$catkin_make編譯完成后的終端界面如圖所示:catkin_make命令的輸出機器人操作系統(tǒng)(ROS)5.1創(chuàng)建工作空間現(xiàn)在打開home文件夾內(nèi)的catkin_ws工作空間文件夾,里面就自動產(chǎn)生了devel和build兩個新的文件夾,如圖所示:執(zhí)行catkin_make命令后的catkin_ws文件夾機器人操作系統(tǒng)(ROS)5.1創(chuàng)建工作空間打開devel文件夾會發(fā)現(xiàn)其中已經(jīng)產(chǎn)生了幾個setup.*sh形式的環(huán)境變量設置腳本??梢允褂胹ource命令運行這些腳本文件,使工作空間中的環(huán)境變量得以生效。$sourcedevel/setup.bash如果不確定環(huán)境變量是否生效,可以使用如下命令檢查:$echo$ROS_PACKAGE_PATH執(zhí)行命令后,如果打印的路徑中包含著當前工作空間的路徑,則表面環(huán)境變量設置成功,命令運行結果如圖所示。查看當前工作空間路徑機器人操作系統(tǒng)(ROS)5.2創(chuàng)建功能包一個ROS功能包中包含著package.xml和CMakeLists.txt等文件。package.xml文件提供了功能包的元信息,即功能包的屬性;CMakeLists.txt文件則記錄了功能包的編譯規(guī)則。ROS提供了直接創(chuàng)建功能包的命令,其使用方法如下:$catkin_create_pkg<package_name>[depend1][depend2][depend3]運行命令時,需要在命令的<package_name>部分輸入功能包的名稱和所依賴的其他的功能包的名稱(depend1、depend2等)。例如,如果我們想創(chuàng)建一個名為“hello_world”的功能包,這個功能包依賴于roscpp、rospy、std_msgs等功能包,則需要在工作空間中的src文件夾下執(zhí)行如下指令:$cd~/catkin_ws/src$catkin_create_pkghello_worldroscpprospystd_msgs機器人操作系統(tǒng)(ROS)5.2創(chuàng)建功能包執(zhí)行完命令后,src目錄內(nèi)就會自動生成一個名為hello_world的功能包,其中包含了package.xml和CMakeLists.txt文件,如圖所示:hello_world功能包機器人操作系統(tǒng)(ROS)5.2創(chuàng)建功能包可以看到,除了之前所說的package.xml和CMakeLists.txt文件以外,還有src及include文件夾。src文件夾中保存著ROS功能包的源代碼,通常是C++文件。如果想要保存Python腳本,那么需要在功能包文件夾中自行創(chuàng)建另一個名為scripts的文件夾。include文件夾包含了源代碼的頭文件,這個文件夾可以自動生成,第三方的函數(shù)庫文件也可以放到這個文件夾中。之后回到工作空間的根目錄下使用catkin_make命令進行編譯,并且設置環(huán)境變量:$cd~/catkin_ws/$catkin_make$source~/catkin_ws/devel/setup.bash以上便完成了對一個ROS功能包的創(chuàng)建。需要注意的是,ROS不允許在某個功能包中嵌套其他的功能包,如果有多個功能包就需要平行存放在代碼空間中;在同一個工作空間下,不能夠存在具有相同名稱的功能包,否則編譯過程中會報錯。機器人操作系統(tǒng)(ROS)5.3使用ROS節(jié)點一個節(jié)點是ROS功能包中的一個可執(zhí)行文件。ROS節(jié)點可以與其他節(jié)點通信,節(jié)點可以發(fā)布或接收一個話題。節(jié)點都是可執(zhí)行程序,放置在devel文件夾中。接下來我們將分析turtlesim的典型功能包。首先,如果安裝了完整版本的ROS,那么系統(tǒng)已經(jīng)有了turtlesim功能包。如果沒有,可以使用以下命令進行安裝:$sudoapt-getinstallros-melodic-ros-tutorials打開終端并且使用命令roscore打開ROS的master節(jié)點:$roscore機器人操作系統(tǒng)(ROS)5.3使用ROS節(jié)點為了獲得節(jié)點信息,我們可以再打開一個終端,使用rosnode工具。為了查看rosnode命令有哪些參數(shù),可以輸入命令:$rosnode將會得到一個可接受參數(shù)的清單,如圖所示。rosnode可接受參數(shù)清單機器人操作系統(tǒng)(ROS)5.3使用ROS節(jié)點我們?nèi)粝胍@取正在運行的節(jié)點的相關信息,輸入命令:$rosnodelist將會看到系統(tǒng)正在運行的所有節(jié)點列表,當前系統(tǒng)只運行了master節(jié)點,因此終端只有一個/rosout信息,用來收集日志以及debug輸出結果的,運行結果如圖所示。查看當前運行節(jié)點機器人操作系統(tǒng)(ROS)5.3使用ROS節(jié)點要查看節(jié)點的具體信息,可運行如下指令,運行結果如圖所示:$rosnodeinfo/rosout查看rosout節(jié)點信息機器人操作系統(tǒng)(ROS)5.3使用ROS節(jié)點接下來,我們利用rosrun命令啟動新的節(jié)點turtlesim_node,指令如下:$rosrunturtlesimturtlesim_node我們將看到彈出一個新的窗口,窗口中有一只小海龜,如圖所示。如果再查看運行節(jié)點列表,會發(fā)現(xiàn)其中多出了一個節(jié)點/turtlesim,如圖所示。小海龜窗口節(jié)點清單變化機器人操作系統(tǒng)(ROS)5.3使用ROS節(jié)點我們來嘗試下rosnodeinfo命令查看節(jié)點信息:$rosnodeinfo/turtlesim該指令的輸出信息如圖所示。節(jié)點/turtlesim信息機器人操作系統(tǒng)(ROS)5.4ROS節(jié)點交互本節(jié)我們將初步使用ROS的兩種通信方式——話題(Topic)和服務(Services)。話題是ROS里一種異步通信的模型,一般節(jié)點間分工明確,有的只負責發(fā)送,有的只負責接收處理。對于絕大多數(shù)的機器人應用場景,比如傳感器數(shù)據(jù)和速度控制指令的收發(fā),話題模型是最適合的通信方式。服務是一種請求和反饋的通信機制。請求的一方通常被稱為客戶端,提供服務的一方叫做服務器端。服務機制相比于話題的不同之處在于:消息的傳輸是雙向的,有反饋的,而不是單一的流向;消息往往不會以固定頻率傳輸,不連續(xù),而是在需要時才會向服務器發(fā)起請求。機器人操作系統(tǒng)(ROS)5.4ROS節(jié)點交互(1)話題Topic上一節(jié)我們已經(jīng)運行了/turtlesim節(jié)點,接下來我們運行如下命令:$rosrunturtlesimturtle_teleop_key運行該節(jié)點,我們可以用鍵盤上的方向箭頭按鍵操作小海龜移動。我們可以通過如下命令查看到現(xiàn)在系統(tǒng)運行的所有話題,如圖所示:$rostopiclistlist查看話題清單機器人操作系統(tǒng)(ROS)5.4ROS節(jié)點交互其中/turtle1/cmd_vel就是用來控制小海龜運動的話題。我們可以運行以下命令輸出話題的實時消息內(nèi)容,結果如圖5-13所示:$rostopicecho/turtle1/cmd_vel此時按下相應的方向按鍵,消息也會實時地變化。echo查看話題內(nèi)容機器人操作系統(tǒng)(ROS)5.4ROS節(jié)點交互另外,我們還可以通過命令行發(fā)送指令的方式控制小海龜?shù)倪\動。發(fā)送命令如下:$rostopicpub/turtle1/cmd_velgeometry_msgs/Twist--'[3.0,0.0,0.0]''[0.0,0.0,1.0]'其中線速度x為3.0,角速度z為1.0。消息發(fā)布之后,可以觀察到小海龜移動了一小段距離后便會停止移動。如果需要控制小海龜連續(xù)運動,可將指令修改如下:$rostopicpub-r20/turtle1/cmd_velgeometry_msgs/Twist--'[3.0,0.0,0.0]''[0.0,0.0,1.0]'其中,“-r20”表示話題以20hz的頻率持續(xù)發(fā)送,此時小海龜將持續(xù)做圓周運動。機器人操作系統(tǒng)(ROS)5.4ROS節(jié)點交互如果要圖形化的方式顯示當前節(jié)點與話題的關系,可以通過如下命令查看:$rqt_graph這時會彈出一個窗口,其中展示了所有的節(jié)點以及話題之間的連接關系,如圖所示。
rqt_graph運行結果機器人操作系統(tǒng)(ROS)5.4ROS節(jié)點交互讀者還可以繼續(xù)嘗試rostopic相關命令,具體指令如下所示:rostopiclist#顯示活動的話題目錄rostopicecho[話題名稱]#實時顯示指定話題的消息內(nèi)容rostopicfind[類型名稱]#顯示使用指定類型的消息的話題rostopictype[話題名稱]#顯示指定話題的消息類型rostopicbw[話題名稱]#顯示指定話題的消息帶寬(bandwidth)rostopichz[話題名稱]#顯示指定話題的消息數(shù)據(jù)發(fā)布周期rostopicinfo[話題名稱]#顯示指定話題的信息rostopicpub[話題名稱][消息類型][參數(shù)]#用指定的話題名稱發(fā)布消息rosmsgshow[msg/srv]#查看msg/srv的詳細內(nèi)容rosmsglist#顯示所有的msg/srv機器人操作系統(tǒng)(ROS)5.4ROS節(jié)點交互(2)服務services服務是能提供節(jié)點之間相互通信的另一種方法,服務允許節(jié)點發(fā)送請求和接收響應。我們使用命令:$rosserviceslist查看當前運行的服務列表,注意此時我們應提前運行了roscore并啟動turtlesim節(jié)點,將得到如圖的結果。list查看服務清單機器人操作系統(tǒng)(ROS)5.4ROS節(jié)點交互如果想查看某個特定服務的類型,例如/clear服務,可以使用如下命令,結果如圖所示:$rosservicetype/clear查看/clear服務的類型若想使用該服務,可使用如下命令:$rosservicecall/clear此時小海龜?shù)囊苿泳€條消失了。機器人操作系統(tǒng)(ROS)5.4ROS節(jié)點交互接下來我們嘗試其他的服務,例如/spawn服務。spawn服務將在小海龜彈窗中創(chuàng)建另外一只小海龜。運行如下命令查看該服務的相關信息,結果如圖所示:$rosserviceinfo/spawn服務/spawn信息我們可以通過以下命令獲得該服務的具體數(shù)據(jù)類型,結果如圖所示:$rossrvshowturtlesim/Spawn查看服務/Spawn的信息機器人操作系統(tǒng)(ROS)5.4ROS節(jié)點交互通過這些字段,我們就可以知道,調用/spawn服務需指定新創(chuàng)建的小海龜?shù)奈恢米鴺耍▁,y)、方向角(theta)以及名字,運行如下指令進行新海龜?shù)膭?chuàng)建,指令運行和結果如圖5-19和圖5-20所示:$rosservicecall/spawn“x:2.0y:5.0theta:1.0name:’turtle2’”調用服務/spawn生成第二只小海龜生成第二只小海龜結果圖機器人操作系統(tǒng)(ROS)5.4ROS節(jié)點交互讀者可以繼續(xù)嘗試rosservice相關命令,具體指令如下所示:rosservicelist#顯示活動的服務信息rosserviceinfo[服務名稱]#顯示指定服務的信息rosservicetype[服務名稱]#顯示服務類型rosservicefind[服務類型]#查找指定服務類型的服務rosserviceuri[服務名稱]#顯示ROSRPCURI服務rosserviceargs[服務名稱]#顯示服務參數(shù)rosservicecall[服務名稱][參數(shù)]#用輸入的參數(shù)請求服務rossrvshow<pkg_name>/srv_name#顯示服務類型的所有信息rossrvlist
#顯示所有服務類型信息機器人操作系統(tǒng)(ROS)5.5使用參數(shù)服務器我們有時需要在機器人工作時對機器人的參數(shù)(如傳感器參數(shù)、算法的參數(shù))進行設置。有些參數(shù)(如機器人的外型、傳感器的高度)在機器人啟動時就已經(jīng)設定好了,參數(shù)無需再進行修改;另外有些參數(shù)則需要動態(tài)改變(如配置文件、調試參數(shù)等)。ROS提供了參數(shù)服務器來滿足這一需求。我們可以將參數(shù)設置在參數(shù)服務器中,在需要用到的時候再從參數(shù)服務器中獲取。首先,我們使用命令:$rosparamlist查看當前所有節(jié)點使用的參數(shù),其輸出結果如圖所示。list查看參數(shù)名機器人操作系統(tǒng)(ROS)5.5使用參數(shù)服務器其中/background參數(shù)是用來調整turtlesim節(jié)點背景顏色的。我們可以通過命令:$rosparamget/turtlesim/background_b獲取/background_b參數(shù)數(shù)值可以得到當前背景的藍色RGB值為255,運行結果如圖所示,我們可以通過調整RGB色值改變背景顏色,命令如下:$rosparamset/turtlesim/background_r255同時還需要輸入命令:$rosservicecall/clear調用清除服務使得修改后的參數(shù)生效,這時背景就變成了粉色,結果如圖所示。機器人操作系統(tǒng)(ROS)5.5使用參數(shù)服務器更改背景顏色結果機器人操作系統(tǒng)(ROS)讀者還可以繼續(xù)嘗試rosparam相關命令,具體的命令如下所示:rosparamloadxxx.yaml#加載配置文件中參數(shù)信息rosparamset[參數(shù)名稱][參數(shù)]#設置某個節(jié)點的信息(無則新建)rosparamget[參數(shù)名稱]#獲取某個節(jié)點的信息rosparamdumpfilename#將參數(shù)信息寫入到具體的文件中rosparamlist#列出服務器中有哪些參數(shù)信息5.5使用參數(shù)服務器機器人操作系統(tǒng)(ROS)在本節(jié)中我們要學習如何創(chuàng)建兩個節(jié)點:一個發(fā)布數(shù)據(jù)的節(jié)點(publisher),另一個接收這些數(shù)據(jù)的節(jié)點(subscriber)。5.6.1創(chuàng)建publisher節(jié)點機器人操作系統(tǒng)(ROS)我們首先嘗試使用代碼實現(xiàn)一個節(jié)點,在節(jié)點中創(chuàng)建一個publisher并發(fā)布字符串“Thisispublisher!”。publisher程序的大致步驟為:初始化ROS節(jié)點;向ROSMaster注冊節(jié)點信息,包括發(fā)布的話題名和話題中的消息類型;按照一定頻率循環(huán)發(fā)布消息。將本書提供的talker.cpp源碼放在catkin_ws/src/hello_word/src文件夾下,詳細內(nèi)容如下:#include<sstream>#include"ros/ros.h"#include"std_msgs/String.h"intmain(intargc,char**argv){//ROS節(jié)點初始化ros::init(argc,argv,"talker");//創(chuàng)建節(jié)點句柄ros::NodeHandlen;//創(chuàng)建一個Publisher,發(fā)布名為chatter的topic,消息類型為std_msgs::Stringros::Publisherchatter_pub=n.advertise<std_msgs::String>("chatter",1000);//設置循環(huán)的頻率ros::Rateloop_rate(10);intcount=0;while(ros::ok()){ //初始化std_msgs::String類型的消息std_msgs::Stringmsg;std::stringstreamss;ss<<"Thisispublisher!"<<count;msg.data=ss.str(); //發(fā)布消息ROS_INFO("%s",msg.data.c_str());chatter_pub.publish(msg); //循環(huán)等待回調函數(shù)ros::spinOnce(); //按照循環(huán)頻率延時loop_rate.sleep();++count;}return0;}5.6.1創(chuàng)建publisher節(jié)點機器人操作系統(tǒng)(ROS)接下來,對以上代碼逐一解釋用法和功能。(1)頭文件部分#include"ros/ros.h"#include"std_msgs/String.h"ros/ros.h包含了標準ROS類的聲明,每一個ROS程序都應該包含此頭文件。另外,本節(jié)點會發(fā)布String類型的消息,所以需要先包含該消息類型的頭文件String.h,該頭文件根據(jù)String.msg的消息結構定義自動生成。我們也可以自定義消息結構,并生成所需要的頭文件。5.6.1創(chuàng)建publisher節(jié)點機器人操作系統(tǒng)(ROS)(2)初始化部分ros::init(argc,argv,"talker");初始化ROS節(jié)點。名稱為“talker”,該名稱在運行的ROS中必須是獨一無二的,不允許同時存在兩個相同名稱的節(jié)點。ros::NodeHandlen;創(chuàng)建一個節(jié)點句柄,方便對節(jié)點資源的使用和管理。ros::Publisherchatter_pub=n.advertise<std_msgs::String>("chatter",1000);在ROSMaster端注冊一個publisher,并告訴系統(tǒng)publisher節(jié)點將會發(fā)布以chatter為話題的String類型消息,消息隊列大小為1000,當發(fā)布消息的實際速度較慢時,publisher會將消息存儲在一定空間的隊列中;如果消息數(shù)量超過隊列大小時,ROS會自動刪除隊列中最早入隊的消息。5.6.1創(chuàng)建publisher節(jié)點機器人操作系統(tǒng)(ROS)(3)主循環(huán)部分ros::Rateloop_rate(10);設置主程序循環(huán)的頻率,單位是Hz,這里設置的是10Hz,即100ms程序執(zhí)行一次。當調用Rate::sleep()函數(shù)時,ROS節(jié)點會根據(jù)此處設置的頻率休眠相應的時間,以保證循環(huán)維持一致的時間周期。while(ros::ok())進入節(jié)點的主循環(huán),在節(jié)點未發(fā)生異常的情況下將一直在循環(huán)運行,一旦發(fā)生異常,ros::ok()就會返回false,從而跳出循環(huán),退出程序。std_msgs::Stringmsg;std::stringstreamss;ss<<"Thisispublisher!"<<count;msg.data=ss.str();5.6.1創(chuàng)建publisher節(jié)點機器人操作系統(tǒng)(ROS)初始化即將發(fā)布的消息。ROS中定義了很多通用的消息類型,這里我們使用了最為簡單的String消息類型,該消息類型只有一個成員,即data,用來存儲字符串數(shù)據(jù)。chatter_pub.publish(msg);發(fā)布封裝完畢的消息msg。消息發(fā)布后,Master會查找訂閱該話題的節(jié)點,并且?guī)椭鷥蓚€節(jié)點建立連接,完成消息的傳輸。ROS_INFO("%s",msg.data.c_str());ROS_INFO類似于C/C++中的printf/cout函數(shù),用來打印日志信息。這里我們將發(fā)布的數(shù)據(jù)在本地打印,以確保發(fā)出的數(shù)據(jù)符合要求。ros::spinOnce();該命令是用來處理節(jié)點訂閱話題的所有回調函數(shù)。loop_rate.sleep();程序執(zhí)行一次完成后,根據(jù)前面設置的循環(huán)頻率進行休眠。5.6.1創(chuàng)建publisher節(jié)點機器人操作系統(tǒng)(ROS)我們嘗試創(chuàng)建一個subscriber以訂閱publisher節(jié)點發(fā)布的“Thisispublisher!”字符串,將本書提供的listener.cpp源碼放在catkin_ws/src/hello_word/src文件夾下。subscriber程序大致步驟為:初始化ROS節(jié)點;訂閱需要的話題;循環(huán)等待話題消息;接收到消息后進入回調函數(shù)和在回調函數(shù)中完成消息處理。其中源碼listener.cpp的詳細內(nèi)容如下:5.6.2創(chuàng)建subscriber節(jié)點#include"ros/ros.h"#include"std_msgs/String.h"
//接收到訂閱的消息后,會進入消息回調函數(shù)voidchatterCallback(conststd_msgs::String::ConstPtr&msg){//將接收到的消息打印出來ROS_INFO("Iheard:[%s]",msg->data.c_str());}intmain(intargc,char**argv){//初始化ROS節(jié)點ros::init(argc,argv,"listener");//創(chuàng)建節(jié)點句柄ros::NodeHandlen;//創(chuàng)建一個Subscriber,訂閱名為chatter的topic,注冊回調函數(shù)chatterCallbackros::Subscribersub=n.subscribe("chatter",1000,chatterCallback);//循環(huán)等待回調函數(shù)ros::spin();
return0;}機器人操作系統(tǒng)(ROS)下面剖析以上代碼中subscriber節(jié)點的實現(xiàn)過程。(1)回調函數(shù)部分voidchatterCallback(conststd_msgs::String::ConstPtr&msg){//將接收到的消息打印出來ROS_INFO("Iheard:[%s]",msg->data.c_str());}這是一個回調函數(shù),當有新消息到達chatter話題時它就會被自動調用,用來接收publisher發(fā)布的消息,并將該消息打印出來。5.6.2創(chuàng)建subscriber節(jié)點機器人操作系統(tǒng)(ROS)(2)main函數(shù)部分main函數(shù)中ROS節(jié)點初始化部分的代碼與publisher的相同。ros::Subscribersub=n.subscribe("chatter",1000,chatterCallback);訂閱節(jié)點首先需要聲明自己訂閱的消息話題,該信息會在ROSMaster中注冊。Master會關注系統(tǒng)中是否存在發(fā)布該話題的節(jié)點,如果存在則會幫助兩個節(jié)點建立連接,完成數(shù)據(jù)傳輸。NodeHandle::subscribe()用來創(chuàng)建一個Subscriber。第一個參數(shù)即為消息話題名稱;第二個參數(shù)是接收消息隊列的大小,與發(fā)布節(jié)點的隊列相似,當消息入隊數(shù)量超過設置的隊列大小時,會自動舍棄最早的消息;第三個參數(shù)是接收到話題消息后的回調函數(shù)。ros::spin();進入消息回調處理函數(shù),當有消息到達時,調用回調函數(shù)進行數(shù)據(jù)的處理。5.6.2創(chuàng)建subscriber節(jié)點機器人操作系統(tǒng)(ROS)C++是一種編譯語言,在運行之前需要將代碼編譯成可執(zhí)行文件,ROS中的編譯器使用的是CMake,編譯規(guī)則通過功能包中的CMakeLists.txt文件設置,使用catkin命令創(chuàng)建的功能包中會自動生成該文件。打開功能包中的CMakeLists.txt文件,不要修改注釋(#)示例,只需將以下幾行添加到CMakeLists.txt文件的底部:5.6.3編譯功能包add_executable(talkersrc/talker.cpp)target_link_libraries(talker${catkin_LIBRARIES})add_dependencies(talker${PROJECT_NAME}_generate_messages_cpp)
add_executable(listenersrc/listener.cpp)target_link_libraries(listener${catkin_LIBRARIES})add_dependencies(listener${PROJECT_NAME}_generate_messages_cpp)機器人操作系統(tǒng)(ROS)CMakeLists.txt文件中主要包括以下幾種編譯配置項:(1)include_directories用于設置頭文件的相對路徑。頭文件的默認路徑是功能包的所在目錄,比如功能包的頭文件一般會放到功能包根目錄下的include文件夾中。此外,該配置項還包含ROScatkin編譯器默認包含的其他頭文件路徑,比如ROS默認安裝路徑、Linux系統(tǒng)路徑等。(2)add_executable用于設置需要編譯的代碼和生成的可執(zhí)行文件。第一個參數(shù)為期望生成的節(jié)點的名稱,第二個參數(shù)為參與編譯的源碼文件,如果需要多個代碼文件,則可在后面依次列出,中間使用空格進行分隔。5.6.3編譯功能包機器人操作系統(tǒng)(ROS)(3)target_link_libraries用于設置鏈接庫。很多功能需要使用系統(tǒng)或者第三方的庫函數(shù),通過該選項可以配置執(zhí)行文件鏈接的庫文件,其第一個參數(shù)與add_executable相同,是節(jié)點的名稱,后面依次列出需要鏈接的庫。本章編譯的publisher節(jié)點和subscriber節(jié)點沒有使用其他依賴庫,因此添加默認鏈接庫即可。(4)add_dependencies用于設置依賴。在很多應用中,我們需要定義語言無關的消息類型,消息類型會在編譯過程中產(chǎn)生相應語言的代碼,如果編譯的節(jié)點依賴這些動態(tài)生成的代碼,則需要使用add_dependencies添加${PROJECT_NAME}_generate_messages_cpp配置,即該功能包動態(tài)產(chǎn)生的消息代碼。該編譯規(guī)則也可以添加其他需要依賴的功能包。5.6.3編譯功能包機器人操作系統(tǒng)(ROS)CMakeLists.txt修改完成后,在工作空間的路徑下開始編譯:$cd~/catkin_ws$catkin_make以上編譯內(nèi)容會幫助系統(tǒng)生成兩個節(jié)點:talker和listener,放置在工作空間的~/catkin_ws/devel/lib/<packagename>路徑下,如圖所示。5.6.3編譯功能包編譯生成的執(zhí)行文件結果機器人操作系統(tǒng)(ROS)假如編譯不通過,出現(xiàn)如圖所示的問題,將talker.cpp和listener.cpp源文件的權限改為如圖所示的權限狀態(tài)。5.6.3編譯功能包編譯錯誤修改文件權限機器人操作系統(tǒng)(ROS)編譯完成后,可以運行publisher和subscriber節(jié)點了。在運行節(jié)點之前,需要在終端中設置環(huán)境變量,否則無法找到功能包最終編譯生成的可執(zhí)行文件:$source~/catkin_ws/devel/setup.bash如果只有一個工作空間,可以將環(huán)境變量的配置腳本添加到終端的配置文件中:$echo"source~/catkin_ws/devel/setup.bash">>~/.bashrc$source~/.bashrc5.6.4運行Publisher與Subscriber機器人操作系統(tǒng)(ROS)環(huán)境變量設置成功后,可以按照以下步驟啟動例程。(1)啟動ROSMaster:$roscore(2)啟動publisher:$rosrunlearning_communicationtalker如果publisher節(jié)點運行正常,終端中會出現(xiàn)如圖所示的日志信息。5.6.4運行Publisher與Subscriberpublisher節(jié)點啟動成功后的日志信息機器人操作系統(tǒng)(ROS)(3)啟動subscriber:$rosrunlearning_communicationlistener如果消息訂閱成功,會在終端中顯示接收到的消息內(nèi)容,如圖所示。這個例程中的publisher與subscriber就這樣運行起來了,也可以調換兩者的運行順序,先啟動subscriber,該節(jié)點會處于循環(huán)等待狀態(tài),直到publisher啟動后終端中才會顯示訂閱收到的消息內(nèi)容。5.6.4運行Publisher與SubscriberSubscriber節(jié)點啟動成功后的日志信息機器人操作系統(tǒng)(ROS)以上例程中話題的消息類型是ROS中預定義的String數(shù)據(jù)類型。在ROS的元功能包common_msgs中提供了許多不同消息類型的功能包,如std_msgs(標準數(shù)據(jù)類型)、geometry_msgs(幾何學數(shù)據(jù)類型)、sensor_msgs(傳感器數(shù)據(jù)類型)等。讀者還可以針對自己的機器人應用設計特定的消息類型,ROS也提供了一套語言無關的消息類型定義方法。msg文件就是ROS中定義消息類型的文件,一般放置在功能包根目錄下的msg文件夾中。在功能包編譯過程中,可以使用msg文件生成不同編程語言使用的代碼文件。例如下面的msg文件(hello_world/msg/gps_rtk.msg),定義了一個描述RTK信息的消息類型,包括RTK接收機型號、經(jīng)度、緯度和高程信息:stringnamefloat32longitudefloat32latitudefloat32height這里使用的基礎數(shù)據(jù)類型string、float都是語言無關的,編譯階段會變成各種語言對應的數(shù)據(jù)類型。5.6.5自定義話題消息機器人操作系統(tǒng)(ROS)首先通過以下命令在helloword功能包目錄下新建一個msg文件夾:$mkdirmsg然后在msg文件夾下通過以下命令新建一個名為gps_rtk.msg的消息文件:$cdmsg$geditgps_rtk.msg然后將上述文件內(nèi)容添加到該文件中,如圖所示。5.6.5自定義話題消息新建的gps_rtk.msg的消息文件機器人操作系統(tǒng)(ROS)為了使用這個自定義的消息類型,還需要編譯msg文件。msg文件的編譯需要修改相應依賴和編譯選項。(1)在package.xml中添加功能包依賴5.6.5自定義話題消息<build_depend>message_generation</build_depend><build_export_depend>message_runtime</build_export_depend><exec_depend>message_runtime</exec_depend>修改后的package.xml文件如圖所示。修改后的package.xml文件機器人操作系統(tǒng)(ROS)(2)在CMakeLists.txt中添加編譯選項5.6.5自定義話題消息find_package(catkinREQUIREDCOMPONENTSgeometry_msgsroscpprospystd_msgsmessage_generation)catkin_package(……CATKIN_DEPENDSroscpprospystd_msgsmessage_runtime……)add_message_files(FILESgps_rtk.msg)generate_messages(DEPENDENCIESstd_msgs)機器人操作系統(tǒng)(ROS)修改后的CMakeLists.txt文件如圖所示。5.6.5自定義話題消息修改后的CMakeLists.txt文件機器人操作系統(tǒng)(ROS)以上配置工作都完成后,就可以回到工作空間的根路徑下,使用catkin_make命令進行編譯了。編譯成功后,可以使用如下命令查看自定義的gps_rtk消息類型,結果如圖所示:$rosmsgshowgps_rtk5.6.5自定義話題消息查看自定義的gps_rtk消息類型機器人操作系統(tǒng)(ROS)與自定義話題消息類似,ROS中服務數(shù)據(jù)通過srv文件進行語言無關的接口定義,一般放置在功能包根目錄下的srv文件夾中。該文件包含兩個部分,由“---”隔開,上面為請求數(shù)據(jù)區(qū)域,下面為應答數(shù)據(jù)區(qū)域。首先創(chuàng)建一個服務數(shù)據(jù)類型的srv文件hello_world/srv/MultiplyTwoInts.srv。int64aint64b---int64multi5.6.6自定義服務數(shù)據(jù)機器人操作系統(tǒng)(ROS)首先通過以下命令在hello_word功能包目錄下新建一個srv文件夾:$mkdirsrv然后在srv文件夾下通過以下命令新建一個名為MultiplyTwoInts.srv的服務文件:$cdsrv$geditMultiplyTwoInts.srv然后將上述文件內(nèi)容添加到該文件中,如圖所示。5.6.6自定義服務數(shù)據(jù)新建的MultiplyTwoInts.srv的服務文件機器人操作系統(tǒng)(ROS)該srv文件的內(nèi)容較為簡單,在服務請求的數(shù)據(jù)區(qū)域中定義了兩個int64類型的變量a和b,分別作為兩個乘數(shù);在應答數(shù)據(jù)區(qū)域定義了一個int64類型的變量multi,用于存儲結果,即“a*b”。接下來需要修改package.xml文件配置,與上節(jié)中自定義消息時修改package.xml文件類似。打開package.xml文件,添加以下依賴文件(5.6.5節(jié)自定義話題消息已經(jīng)添加):5.6.6自定義服務數(shù)據(jù)<build_depend>message_generation</build_depend><build_export_depend>message_runtime</build_export_depend><exec_depend>message_runtime</exec_depend>機器人操作系統(tǒng)(ROS)然后打開CMakeLists.txt文件,將如下內(nèi)容添加進文件:5.6.6自定義服務數(shù)據(jù)add_service_files(FILESMultiplyTwoInts.srv)修改后的CMakeLists.txt文件如圖所示。修改后的CMakeLists.txt文件機器人操作系統(tǒng)(ROS)然后運行catkin_make進行編譯,編譯成功后,我們可以在dev/include/hello_word文件夾找到編譯好的頭文件,如圖所示,也可以通過$rossrvshow指令查看服務內(nèi)容。5.6.6自定義服務數(shù)據(jù)自定義服務編譯好的頭文件查看自定義服務的頭文件機器人操作系統(tǒng)(ROS)接下來我們創(chuàng)建server節(jié)點和client節(jié)點調用自定義的服務。首先創(chuàng)建server節(jié)點,實現(xiàn)該功能的程序在hello_word/src/server.cpp里,內(nèi)容如下:5.6.6自定義服務數(shù)據(jù)#include
"ros/ros.h"
//這里使用的頭文件是hello_word/MultiplyTwoInts.h,這是我們自定義的服務數(shù)據(jù)類型的描述文件。
#include
"hello_world/MultiplyTwoInts.h"
//service回調函數(shù),輸入?yún)?shù)req,輸出參數(shù)res
bool
add(hello_world::MultiplyTwoInts::Request
&req,
hello_world::MultiplyTwoInts::Response
&res)
{
//將參數(shù)中的請求數(shù)據(jù)相加,結果放入應答變量中
res.multi
=
req.a
*
req.b;
ROS_INFO("request:
x=%1d,y=%1d"
,(long
int)req.a,(long
int)req.b);
ROS_INFO("sending
back
response:
[%1d]"
,(long
int)res.multi);
return
true;
}
int
main(int
argc,
char
**argv)
{
//ROS節(jié)點初始化,創(chuàng)建節(jié)點名稱
ros::init(argc,
argv,
"multiply_two_ints_server");
//創(chuàng)建節(jié)點句柄
ros::NodeHandle
n;
//創(chuàng)建一個名為add_two_ints的server,注冊回調函數(shù)add()
ros::ServiceServer
service
=
n.advertiseService("multiply_two_ints",add);
//循環(huán)等待回調函數(shù)
ROS_INFO("Ready
to
multiply
two
ints!");
ros::spin();
return
0;
}機器人操作系統(tǒng)(ROS)編寫好server之后,我們還需要一個客戶端Client,我們在src的目錄下創(chuàng)建一個名為Clinet.cpp的cpp類型文件,
溫馨提示
- 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 第1單元 古代亞非文明(高頻非選擇題25題)(原卷版)
- 《波蘭歪屋設計》課件
- 《證券市場概述周》課件
- 玩具設計美工工作總結
- 2023-2024年項目管理人員安全培訓考試題帶答案(黃金題型)
- 關于認識實習報告匯編六篇
- 《系統(tǒng)安全評價概述》課件
- 《婦產(chǎn)科學緒論》課件
- 《監(jiān)理工作程序》課件
- 《應用開發(fā)和管理》課件
- 麻風病防治知識課件
- 訴訟費退費確認表
- 全球變暖視野下中國與墨西哥的能源現(xiàn)狀分析
- 建筑結構荷載統(tǒng)計計算表格(自動版)
- 學前教育學課程思政建設
- 事故隱患報告和舉報獎勵制度
- 腹部外傷門診病歷
- 品質異常處理及要求培訓
- 模具部年終總結--ppt課件
- 立式熱虹吸再沸器機械設計說明書
- 國家開放大學電大《生產(chǎn)與運作管理》2025-2026期末試題及答案
評論
0/150
提交評論