機器人操作系統(tǒng)(ROS)課件 5.ROS編程基礎(chǔ);6.ROS常用工具_第1頁
機器人操作系統(tǒng)(ROS)課件 5.ROS編程基礎(chǔ);6.ROS常用工具_第2頁
機器人操作系統(tǒng)(ROS)課件 5.ROS編程基礎(chǔ);6.ROS常用工具_第3頁
機器人操作系統(tǒng)(ROS)課件 5.ROS編程基礎(chǔ);6.ROS常用工具_第4頁
機器人操作系統(tǒng)(ROS)課件 5.ROS編程基礎(chǔ);6.ROS常用工具_第5頁
已閱讀5頁,還剩112頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

機器人操作系統(tǒng)(ROS)機器人操作系統(tǒng)(ROS)ROS編程基礎(chǔ)5機器人操作系統(tǒng)(ROS)5.ROS編程基礎(chǔ)在搭建完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)境變量設置成功,命令運行結(jié)果如圖所示。查看當前工作空間路徑機器人操作系統(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é)點的相關(guān)信息,輸入命令:$rosnodelist將會看到系統(tǒng)正在運行的所有節(jié)點列表,當前系統(tǒng)只運行了master節(jié)點,因此終端只有一個/rosout信息,用來收集日志以及debug輸出結(jié)果的,運行結(jié)果如圖所示。查看當前運行節(jié)點機器人操作系統(tǒng)(ROS)5.3使用ROS節(jié)點要查看節(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)容,結(jié)果如圖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é)點與話題的關(guān)系,可以通過如下命令查看:$rqt_graph這時會彈出一個窗口,其中展示了所有的節(jié)點以及話題之間的連接關(guān)系,如圖所示。

rqt_graph運行結(jié)果機器人操作系統(tǒng)(ROS)5.4ROS節(jié)點交互讀者還可以繼續(xù)嘗試rostopic相關(guān)命令,具體指令如下所示: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é)點,將得到如圖的結(jié)果。list查看服務清單機器人操作系統(tǒng)(ROS)5.4ROS節(jié)點交互如果想查看某個特定服務的類型,例如/clear服務,可以使用如下命令,結(jié)果如圖所示:$rosservicetype/clear查看/clear服務的類型若想使用該服務,可使用如下命令:$rosservicecall/clear此時小海龜?shù)囊苿泳€條消失了。機器人操作系統(tǒng)(ROS)5.4ROS節(jié)點交互接下來我們嘗試其他的服務,例如/spawn服務。spawn服務將在小海龜彈窗中創(chuàng)建另外一只小海龜。運行如下命令查看該服務的相關(guān)信息,結(jié)果如圖所示:$rosserviceinfo/spawn服務/spawn信息我們可以通過以下命令獲得該服務的具體數(shù)據(jù)類型,結(jié)果如圖所示:$rossrvshowturtlesim/Spawn查看服務/Spawn的信息機器人操作系統(tǒng)(ROS)5.4ROS節(jié)點交互通過這些字段,我們就可以知道,調(diào)用/spawn服務需指定新創(chuàng)建的小海龜?shù)奈恢米鴺耍▁,y)、方向角(theta)以及名字,運行如下指令進行新海龜?shù)膭?chuàng)建,指令運行和結(jié)果如圖5-19和圖5-20所示:$rosservicecall/spawn“x:2.0y:5.0theta:1.0name:’turtle2’”調(diào)用服務/spawn生成第二只小海龜生成第二只小海龜結(jié)果圖機器人操作系統(tǒng)(ROS)5.4ROS節(jié)點交互讀者可以繼續(xù)嘗試rosservice相關(guān)命令,具體指令如下所示: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)改變(如配置文件、調(diào)試參數(shù)等)。ROS提供了參數(shù)服務器來滿足這一需求。我們可以將參數(shù)設置在參數(shù)服務器中,在需要用到的時候再從參數(shù)服務器中獲取。首先,我們使用命令:$rosparamlist查看當前所有節(jié)點使用的參數(shù),其輸出結(jié)果如圖所示。list查看參數(shù)名機器人操作系統(tǒng)(ROS)5.5使用參數(shù)服務器其中/background參數(shù)是用來調(diào)整turtlesim節(jié)點背景顏色的。我們可以通過命令:$rosparamget/turtlesim/background_b獲取/background_b參數(shù)數(shù)值可以得到當前背景的藍色RGB值為255,運行結(jié)果如圖所示,我們可以通過調(diào)整RGB色值改變背景顏色,命令如下:$rosparamset/turtlesim/background_r255同時還需要輸入命令:$rosservicecall/clear調(diào)用清除服務使得修改后的參數(shù)生效,這時背景就變成了粉色,結(jié)果如圖所示。機器人操作系統(tǒng)(ROS)5.5使用參數(shù)服務器更改背景顏色結(jié)果機器人操作系統(tǒng)(ROS)讀者還可以繼續(xù)嘗試rosparam相關(guān)命令,具體的命令如下所示: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)等待回調(diào)函數(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的消息結(jié)構(gòu)定義自動生成。我們也可以自定義消息結(jié)構(gòu),并生成所需要的頭文件。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í)行一次。當調(diào)用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é)點訂閱話題的所有回調(diào)函數(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)等待話題消息;接收到消息后進入回調(diào)函數(shù)和在回調(diào)函數(shù)中完成消息處理。其中源碼listener.cpp的詳細內(nèi)容如下:5.6.2創(chuàng)建subscriber節(jié)點#include"ros/ros.h"#include"std_msgs/String.h"

//接收到訂閱的消息后,會進入消息回調(diào)函數(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,注冊回調(diào)函數(shù)chatterCallbackros::Subscribersub=n.subscribe("chatter",1000,chatterCallback);//循環(huán)等待回調(diào)函數(shù)ros::spin();

return0;}機器人操作系統(tǒng)(ROS)下面剖析以上代碼中subscriber節(jié)點的實現(xiàn)過程。(1)回調(diào)函數(shù)部分voidchatterCallback(conststd_msgs::String::ConstPtr&msg){//將接收到的消息打印出來ROS_INFO("Iheard:[%s]",msg->data.c_str());}這是一個回調(diào)函數(shù),當有新消息到達chatter話題時它就會被自動調(diào)用,用來接收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會關(guān)注系統(tǒng)中是否存在發(fā)布該話題的節(jié)點,如果存在則會幫助兩個節(jié)點建立連接,完成數(shù)據(jù)傳輸。NodeHandle::subscribe()用來創(chuàng)建一個Subscriber。第一個參數(shù)即為消息話題名稱;第二個參數(shù)是接收消息隊列的大小,與發(fā)布節(jié)點的隊列相似,當消息入隊數(shù)量超過設置的隊列大小時,會自動舍棄最早的消息;第三個參數(shù)是接收到話題消息后的回調(diào)函數(shù)。ros::spin();進入消息回調(diào)處理函數(shù),當有消息到達時,調(diào)用回調(diào)函數(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用于設置依賴。在很多應用中,我們需要定義語言無關(guān)的消息類型,消息類型會在編譯過程中產(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í)行文件結(jié)果機器人操作系統(tǒng)(ROS)假如編譯不通過,出現(xiàn)如圖所示的問題,將talker.cpp和listener.cpp源文件的權(quán)限改為如圖所示的權(quán)限狀態(tài)。5.6.3編譯功能包編譯錯誤修改文件權(quán)限機器人操作系統(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就這樣運行起來了,也可以調(diào)換兩者的運行順序,先啟動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也提供了一套語言無關(guān)的消息類型定義方法。msg文件就是ROS中定義消息類型的文件,一般放置在功能包根目錄下的msg文件夾中。在功能包編譯過程中,可以使用msg文件生成不同編程語言使用的代碼文件。例如下面的msg文件(hello_world/msg/gps_rtk.msg),定義了一個描述RTK信息的消息類型,包括RTK接收機型號、經(jīng)度、緯度和高程信息:stringnamefloat32longitudefloat32latitudefloat32height這里使用的基礎(chǔ)數(shù)據(jù)類型string、float都是語言無關(guān)的,編譯階段會變成各種語言對應的數(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消息類型,結(jié)果如圖所示:$rosmsgshowgps_rtk5.6.5自定義話題消息查看自定義的gps_rtk消息類型機器人操作系統(tǒng)(ROS)與自定義話題消息類似,ROS中服務數(shù)據(jù)通過srv文件進行語言無關(guān)的接口定義,一般放置在功能包根目錄下的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,用于存儲結(jié)果,即“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é)點調(diào)用自定義的服務。首先創(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回調(diào)函數(shù),輸入?yún)?shù)req,輸出參數(shù)res

bool

add(hello_world::MultiplyTwoInts::Request

&req,

hello_world::MultiplyTwoInts::Response

&res)

{

//將參數(shù)中的請求數(shù)據(jù)相加,結(jié)果放入應答變量中

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,注冊回調(diào)函數(shù)add()

ros::ServiceServer

service

=

n.advertiseService("multiply_two_ints",add);

//循環(huán)等待回調(diào)函數(shù)

ROS_INFO("Ready

to

multiply

two

ints!");

ros::spin();

return

0;

}機器人操作系統(tǒng)(ROS)編寫好server之后,我們還需要一個客戶端Client,我們在src的目錄下創(chuàng)建一個名為Clinet.cpp的cpp類型文件,輸入如下代碼:5.6.6自定義服務數(shù)據(jù)#include

<cstdlib>

#include

"ros/ros.h"

#include

"hello_world/MultiplyTwoInts.h"

int

main(int

argc,

char

**argv)

{

//ROS節(jié)點初始化

ros::init(argc,

argv,

"multiply_two_ints_client");

//從終端命令行獲取兩個加數(shù),if(argc

!=

3)的意思是引導用戶輸入不超過三個參數(shù),即輸入兩個參數(shù)

if(argc

!=

3)

{

ROS_INFO("usage:

multiply_two_ints_client

X

and

Y");

return

1;

}

//創(chuàng)建節(jié)點句柄

ros::NodeHandle

n;

//功能:創(chuàng)建一個multiply_two_ints的Client實例,指定服務類型為learning_sun::MultiplyTwoInts

ros::ServiceClient

client

=

n.serviceClient<hello_world::MultiplyTwoInts>("multiply_two_ints");

//功能:實例化一個服務類型數(shù)據(jù)的變量,該變量包含兩個成員:request與response,

//

將節(jié)點運行時輸入的兩個參數(shù)作為需要相加的兩個整數(shù)型存儲到變量中

hello_world::MultiplyTwoInts

srv;

srv.request.a

=

atoll(argv[1]);

srv.request.b

=

atoll(argv[2]);

//進行服務調(diào)用,如果調(diào)用過程會發(fā)生阻塞,如果調(diào)用成功則返回ture,調(diào)用失敗則返回false.srv.response則不可用

if(client.call(srv))

{

ROS_INFO("Multi:

%1d",

(long

int)srv.response.multi);

}

else

{

ROS_ERROR("Failed

to

call

service

multiply_two_ints");

return

1;

}

return

0;

}機器人操作系統(tǒng)(ROS)client編寫好之后,需要修改CMakeList.txt文件,將以下代碼增添到文件的最后:5.6.6自定義服務數(shù)據(jù)add_executable(serversrc/server.cpp)add_executable(clientsrc/client.cpp)add_dependencies(server${PROJECT_NAME}_generate_messages_cpp)add_dependencies(client${PROJECT_NAME}_generate_messages_cpp)target_link_libraries(server${catkin_LIBRARIES})target_link_libraries(client${catkin_LIBRARIES})修改好之后CMakeList.txt文件如圖所示。機器人操作系統(tǒng)(ROS)然后重新編譯功能包,運行如下命令:$cdcatkin_ws$catkin_make編譯完成后,運行如下命令打開服務節(jié)點和客戶端節(jié)點:$roscore$rosrunhello_wordserver$rosrunhello_wordclient15665.6.6自定義服務數(shù)據(jù)輸出結(jié)果分別如圖所示。

client啟動后發(fā)布服務請求并收到反饋server接收服務請求并反饋結(jié)果機器人操作系統(tǒng)(ROS)本章我們學習了ROS的基礎(chǔ)操作,包括創(chuàng)建工作空間和功能包、創(chuàng)建和運行ROS節(jié)點、話題和服務通信的使用。這些為我們后續(xù)開發(fā)打下基礎(chǔ),在繼續(xù)學習的過程中也會不斷加深對其的理解。ROS不僅提供完整的開發(fā)架構(gòu)體系,還有豐富的開發(fā)工具,下一章將學習ROS提供的開發(fā)工具。5.7本章小結(jié)機器人操作系統(tǒng)(ROS)機器人操作系統(tǒng)(ROS)ROS常用工具5機器人操作系統(tǒng)(ROS)5.ROS常用工具ROS為機器人開發(fā)提供大量實用的組件工具。本章我們來學習ROS中的幾種常用工具,包括Qt工具箱、rviz可視化工具、gazebo仿真環(huán)境、rosbag數(shù)據(jù)記錄與回放和TF工具。Qt工具箱:提供多種機器人開發(fā)的可視化工具,如日志輸出、計算圖可視化、數(shù)據(jù)繪圖等功能。rviz三維可視化平臺:實現(xiàn)機器人開發(fā)過程中多種數(shù)據(jù)的可視化顯示。gazebo仿真環(huán)境:創(chuàng)建仿真環(huán)境并實現(xiàn)帶有物理屬性的機器人仿真。rosbag數(shù)據(jù)記錄與回放:記錄并回放ROS系統(tǒng)中運行時的所有話題信息,方便后期調(diào)試使用。TF工具:管理機器人系統(tǒng)中坐標系變換關(guān)系。機器人操作系統(tǒng)(ROS)6.1Qt工具箱Qt工具箱提供多種機器人開發(fā)的可視化工具,如日志輸出、計算圖可視化、數(shù)據(jù)繪圖、參數(shù)動態(tài)配置等功能。ROS提供了一個Qt架構(gòu)的后臺圖形工具套件——rqt_common_plugins,其中包含不少實用的工具,可通過以下命令進行安裝:$sudoapt-getinstallros-melodic-rqt$sudoapt-getinstallros-melodic-rqt-common-plugins機器人操作系統(tǒng)(ROS)6.1.1日志輸出工具(rqt_console)日志輸出工具用于輸出日志內(nèi)容(Message)、日志級別(Severity)、節(jié)點(Node)、時間戳(Stamp)、話題(Topics)、位置(Location)等信息。使用以下命令即可啟動該工具:$roscore$rqt_console啟動成功后可以看到如圖6-1所示的可視化界面。當系統(tǒng)中有不同級別的日志消息時,rqt_console的界面中就會依次顯示這些日志的相關(guān)內(nèi)容,包括日志內(nèi)容、時間戳、級別等。當日志較多時,也可以使用該工具進行過濾顯示。日志輸出工具界面機器人操作系統(tǒng)(ROS)6.1.2計算圖可視化工具(rqt_graph)計算圖是ROS處理數(shù)據(jù)的一種點對點的網(wǎng)絡形式。程序運行時,所有進程及它們所進行的數(shù)據(jù)處理,將會通過一種點對點的網(wǎng)絡形式表現(xiàn)出來,即通過節(jié)點、節(jié)點管理器、話題、服務等來進行表現(xiàn)。在系統(tǒng)運行時,使用如下命令即可啟動該工具:$rqt_graph啟動成功后的計算圖顯示如圖所示。rqt_graph工具界面機器人操作系統(tǒng)(ROS)6.1.3數(shù)據(jù)繪圖工具(rqt_plot)rqt_plot是一個二維數(shù)值曲線繪制工具,可以將需要顯示的數(shù)據(jù)在xy坐標系中使用曲線描繪,用于觀察變量隨時間的變化趨勢曲線。使用如下命令即可啟動該工具:$rqt_plot然后在界面上方的Topic輸入框中輸入需要顯示的話題消息,如果不確定話題名稱,可以在終端中使用“rostopiclist”命令查看。例如在烏龜例程中,通過rqt_plot工具描繪烏龜x、y坐標變化的效果如圖6-3所示。rqt_plot工具機器人操作系統(tǒng)(ROS)6.1.4參數(shù)動態(tài)配置工具(rqt_reconfigure)rqt_reconfigure工具可以在不重啟系統(tǒng)的情況下,動態(tài)配置ROS系統(tǒng)中的參數(shù),但是該功能的使用需要在代碼中設置參數(shù)的相關(guān)屬性,從而支持動態(tài)配置。使用如下命令即可啟動該工具:$rosrunrqt_reconfigurerqt_reconfigure啟動后的界面將顯示當前系統(tǒng)中所有可動態(tài)配置的參數(shù)如圖6-4所示,在界面中使用輸入框、滑動條或下拉框進行設置即可實現(xiàn)參數(shù)的動態(tài)配置。rqt_reconfigure工具界面機器人操作系統(tǒng)(ROS)6.2rviz三維可視化平臺ROS針對機器人系統(tǒng)的可視化需求,為用戶提供了一款顯示多種數(shù)據(jù)的三維可視化平臺rviz。rviz是ROS中一款三維可視化平臺,一方面能夠?qū)崿F(xiàn)對外部信息的圖形化顯示,另外還可以通過rviz發(fā)布控制信息,從而實現(xiàn)對機器人的監(jiān)測與控制。rviz可以幫助開發(fā)者實現(xiàn)所有可監(jiān)測信息的圖形化顯示,開發(fā)者也可以在rviz的控制界面下,通過按鈕、滑動條、數(shù)值等方式控制機器人的行為。機器人操作系統(tǒng)(ROS)6.2.1運行rvizrviz已經(jīng)集成在桌面完整版的ROS中,如果已經(jīng)成功安裝桌面完整版的ROS,可以直接跳過這一步驟,否則,請使用如下命令進行安裝:$sudoapt-getinstallros-melodic-rviz安裝完成后,在終端中分別運行如下命令即可啟動ROS和rviz平臺:$roscore$rosrunrvizrviz啟動成功的rviz主界面如圖所示。rviz的主界面機器人操作系統(tǒng)(ROS)6.2.1運行rvizDisplays面板位于rviz的左側(cè),包含rviz的顯示插件列表及其屬性,可以通過點擊左側(cè)的Add按鈕來添加所需的插件,也可以編寫自己的顯示插件并將其添加到面板上。3D視圖顯示區(qū)位于rviz的中間部分,用于可視化不同類型的ROS消息,例如激光雷達3D點云、地圖信息、里程計數(shù)據(jù)、機器人模型、tf等。工具欄位于rviz的頂部,這些工具可以用來與機器人模型交互、調(diào)整相機視圖、設置導航目標以及設置機器人2D位姿估計等,同時還可以在工具欄中以插件的形式添加自定義的工具。Views顯示面板位于rviz的右側(cè),可以保存3D視角的不同視圖,也可以通過加載已保存的配置來切換到相應的視圖模式下。Time時間顯示面板位于rviz的底部,展示了仿真花費的時間??梢酝ㄟ^點擊面板上的Reset按鈕重置rviz的初始設置。機器人操作系統(tǒng)(ROS)6.2.2數(shù)據(jù)可視化為了解釋數(shù)據(jù)可視化,我們將用到turtlesim的示例,運行程序:$roslaunchturtle_tfturtle_tf_demo.launch這是tf坐標變換的示例程序,通過鍵盤控制小海龜1,小海龜2會跟隨其運動,效果如圖所示。接下來我們可以通過rviz工具查看其運動的變化。機器人操作系統(tǒng)(ROS)6.2.2數(shù)據(jù)可視化首先,在Display面板里的全局選項,更改FixedFrame為/world。然后將TF樹添加到Display面板,點擊rviz界面左側(cè)下方的“Add”按鈕,rviz會將默認支持的所有數(shù)據(jù)類型的顯示插件羅列出來,如圖所示。機器人操作系統(tǒng)(ROS)6.2.2數(shù)據(jù)可視化在上一張圖所示的列表中選擇需要的TF,然后在“DisplayName”文本框中填入一個唯一的名稱tf_turtle,用來識別顯示的數(shù)據(jù)。添加完成后,rviz左側(cè)的Dispalys中會列出已經(jīng)添加的顯示插件;點擊插件列表前的加號,可以打開一個屬性列表,根據(jù)需求設置屬性。如果訂閱成功,在中間的顯示區(qū)應該會出現(xiàn)可視化后的數(shù)據(jù),結(jié)果如圖所示。機器人操作系統(tǒng)(ROS)6.3Gazebo仿真環(huán)境Gazebo是一款3D動態(tài)模擬器,能夠在復雜的室內(nèi)和室外環(huán)境中準確有效地模擬機器人。與游戲引擎提供高保真度的視覺模擬類似,Gazebo提供高保真度的物理模擬,其提供一整套傳感器模型,以及對用戶和程序非常友好的交互方式。雖然Gazebo中的機器人模型與rviz使用的模型相同,但是需要在模型中加入機器人和周圍環(huán)境的物理屬性,例如質(zhì)量、摩擦系數(shù)、彈性系數(shù)等。機器人的傳感器信息也可以通過插件的形式加入仿真環(huán)境,以可視化的方式進行顯示。機器人操作系統(tǒng)(ROS)6.3.1安裝并運行Gazebo與rviz一樣,如果已經(jīng)安裝了桌面完整版的ROS,那么可以直接跳過這一步,否則,可以使用以下命令進行安裝:$sudoapt-getinstallros-melodic-gazebo-ros-pkgsros-melodic-gazebo-ros-control安裝完成后,在終端中使用如下命令啟動ROS和Gazebo:$roscore$rosrungazebo_rosgazeboGazebo啟動成功后的界面如圖所示。機器人操作系統(tǒng)(ROS)6.3.1安裝并運行Gazebo主界面中主要包含3D視圖區(qū)、工具欄、模型列表、模型屬性項和時間顯示區(qū)。驗證Gazebo是否與ROS系統(tǒng)成功連接,可以查看ROS的話題列表:$rostopiclist如果連接成功,應該可以看到Gazebo發(fā)布/訂閱的話題,如圖所示。機器人操作系統(tǒng)(ROS)6.3.1安裝并運行Gazebo當然,還有Gazebo提供的服務列表,如圖所示,使用以下命令查看:$rosservicelist機器人操作系統(tǒng)(ROS)6.3.2構(gòu)建仿真環(huán)境Gazebo中有兩種創(chuàng)建仿真環(huán)境的方法,包括直接插入模型和BuildingEditor。(1)直接插入模型首先需要下載相關(guān)模型庫到本地路徑~/.gazebo下,模型下載地址:/osrf/gazebo_models,使用如下命令:$cd~/.gazebo$gitclone/osrf/gazebo_models.git在Gazebo左側(cè)的模型列表中,有一個insert選項羅列了所有可使用的模型。選擇需要使用的模型,放置在主顯示區(qū)中,如圖所示,就可以在仿真環(huán)境中添加機器人和外部物體等仿真實例。機器人操作系統(tǒng)(ROS)6.3.2構(gòu)建仿真環(huán)境(2)BuildingEditor第二種方法是使用Gazebo提供的BuildingEditor工具手動繪制地圖。在Gazebo菜單欄中選擇Edit→BuildingEditor,可以打開如圖6-13所示的BuildingEditor界面。選擇左側(cè)的繪制選項,然后在上側(cè)窗口中使用鼠標繪制,下側(cè)窗口中即可實時顯示繪制的仿真環(huán)境。機器人操作系統(tǒng)(ROS)6.4rosbag數(shù)據(jù)記錄與回放ROS能夠存儲所有節(jié)點通過話題發(fā)布的消息。ROS提供了數(shù)據(jù)記錄與回放的功能包rosbag,包含消息所有字段參數(shù)和時間戳,可以幫助開發(fā)者收集ROS系統(tǒng)運行時的消息數(shù)據(jù),然后在離線狀態(tài)下進行回放和處理。本節(jié)將通過小海龜例程介紹rosbag數(shù)據(jù)記錄和回放的實現(xiàn)方法。機器人操作系統(tǒng)(ROS)6.4.1使用rosbag首先啟動鍵盤控制小海例程所需的所有節(jié)點:$roscore$rosrunturtlesimturtlesim_node$rosrunturtlesimturtle_teleop_key啟動成功后,可以看到可視化界面中的小烏龜了,此時可以在終端中通過鍵盤控制小烏龜移動。然后我們使用以下命令查看在當前ROS系統(tǒng)中存在的話題列表,結(jié)果如圖6-14所示:$rostopiclist-v機器人操作系統(tǒng)(ROS)6.4.1使用rosbag接下來使用rosbag抓取這些話題的消息,并且打包成一個文件放置到指定文件夾中:$mkdir~/rosbagfiles$cd~/rosbagfiles$rosbagrecord-a其中,-a(all)參數(shù)表示記錄所有發(fā)布的消息。此時消息記錄已經(jīng)開始,我們可以在終端中控制小烏龜移動一段時間,然后進入剛才創(chuàng)建的文件夾~/bagfiles中,應該會有一個以時間命名并且以.bag為后綴的文件。機器人操作系統(tǒng)(ROS)6.4.2回放數(shù)據(jù)我們已經(jīng)有一個消息記錄的文件包,之后我們就可以用它回放數(shù)據(jù)。關(guān)閉之前打開的turtle_teleop_key鍵盤控制節(jié)點并重啟turtlesim_node,使用如下命令回放所記錄的話題數(shù)據(jù):$rosbagplay<yourbagfile>在短暫的等待時間后,數(shù)據(jù)開始回放,小烏龜?shù)倪\動軌跡應該與之前數(shù)據(jù)記錄過程中的狀態(tài)完全相同,在終端中也可以看到如圖所示的回放時間信息,運行結(jié)果小海龜運動軌跡對比如圖所示。回放數(shù)據(jù)小海龜軌跡對比圖機器人操作系統(tǒng)(ROS)6.4.2回放數(shù)據(jù)rosbag功能包還提供了info命令,可以查看數(shù)據(jù)記錄文件的詳細信息,命令的使用格式如下:$rosbaginfo<yourbagfile>使用info命令來查看之前生成的數(shù)據(jù)記錄文件,可以看到類似圖所示的信息。查看數(shù)據(jù)記錄文件的相關(guān)信息從以上信息中我們可以看到,數(shù)據(jù)記錄包中包含的所有話題、消息類型、消息數(shù)量等信息。機器人操作系統(tǒng)(ROS)6.5TF工具坐標變換作為機器人學的基礎(chǔ),也是機器人運動控制不可或缺的部分,掌握機器人坐標變換十分必要。在機器人開發(fā)中,無論是相機坐標與機器人坐標之間還是世界坐標與機器人坐標間,都需要用坐標變換統(tǒng)一坐標系。ROS為開發(fā)者提供了TF庫,可以很方便地實現(xiàn)系統(tǒng)中任一個點在所有坐標系之間的坐標變換。本節(jié)首先介紹機器人運動學相關(guān)基礎(chǔ)知識,再介紹TF功能包相關(guān)知識及其使用方法。機器人操作系統(tǒng)(ROS)6.5.1機器人運動學基本原理(1)空間坐標系的描述坐標變換是機器人運動學中的基礎(chǔ)概念。機器人作為一個完整的系統(tǒng),結(jié)構(gòu)上往往由大量組件元素組成,例如機器人的主體部分、連桿、活動關(guān)節(jié)等。在進行機器人設計和應用的過程中涉及各個組件位姿的變化,機器人的構(gòu)型通常根據(jù)他們的坐標系來確定,這就引入了空間坐標系的概念。在機器人運動學中,使用矩陣來表示坐標系和坐標系中的物體。我們用x、y和z軸表示固定的全局參考坐標系F_(x,y,z),用n、o和a軸表示相對于參考坐標系的另一個運動坐標系F_(n,o,a)。字母n、o和a取自于單詞normal、orientation和approach的首字母。參考圖6-18,很顯然為了避免在抓取物體時發(fā)生碰撞,機器人必須沿著抓手的z軸方向來接近該物體。用機器人的術(shù)語,這個軸稱為接近(approach)軸,簡稱為a軸。在抓手坐標系中接近物體的方向稱為方向(orientation)軸,簡稱為o軸。又因為x軸垂直(normal)于上述兩軸,所以簡稱為n軸。因此,在本節(jié)中均稱由normal、orientation和approach軸組成的運動坐標系為F_(n,o,a)。機器人操作系統(tǒng)(ROS)6.5.1機器人運動學基本原理(2)空間坐標系的轉(zhuǎn)換空間坐標系的轉(zhuǎn)換可以分為三類:純平移、繞一個軸純旋轉(zhuǎn)、平移和旋轉(zhuǎn)相結(jié)合。①純平移如果坐標系在空間以不變的姿態(tài)運動,那么該變換就是純平移變換。在這種情況下,他的方向單位向量保持統(tǒng)一方向不變。所有的改變只是坐標系原點相對于參考坐標系的變化。機器人操作系統(tǒng)(ROS)6.5.1機器人運動學基本原理

機器人操作系統(tǒng)(ROS)6.5.1機器人運動學基本原理

機器人操作系統(tǒng)(ROS)6.5.1機器人運動學基本原理

機器人操作系統(tǒng)(ROS)6.5.1機器人運動學基本原理

機器人操作系統(tǒng)(ROS)6.5.1機器人運動學基本原理

機器人操作系統(tǒng)(ROS)6.5.2TF功能包的原理分析(/tf#tf_echo)TF是一個讓用戶隨時間跟蹤多個坐標系的功能包,它維護多個坐標系之間的坐標關(guān)系,可以幫助開發(fā)者在任意時間,在坐標系間完成點、向量等坐標的變換。機器人操作系統(tǒng)(ROS)6.5.2TF功能包的原理分析(/tf#tf_echo)如圖6-22所示,一個機器人系統(tǒng)通常由很多三維坐標系,而且會隨時間的推移發(fā)生變化,如世界坐標系(WorldFrame)、基坐標系(BaseFrame)、機械夾爪坐標系(GripperFrame)、機器人頭部坐標系(HeadFrame)等。TF以時間為軸跟蹤這些坐標系,并且允許開發(fā)者請求如下類型的數(shù)據(jù):(1)機器人夾取的物體相對于機器人頭部的位置在哪里?(2)機器人頭部坐標系相對于中心坐標系的關(guān)系是什么樣的?(3)機器人中心坐標系相對于激光雷達傳感器的位置在哪里?TF可以在分布式系統(tǒng)中進行操作,也就是說,一個機器人系統(tǒng)中所有的坐標變換關(guān)系,對于所有的節(jié)點組件都是可用的,所有訂閱TF消息的節(jié)點都會緩沖一份所有坐標系的變換關(guān)系數(shù)據(jù),所以這種結(jié)構(gòu)不需要中心服務器來存儲任何數(shù)據(jù)。想要使用TF功能包,總體來說需要以下兩個步驟。(1)監(jiān)聽TF變換:接收并緩存系統(tǒng)中發(fā)布的所有坐標變換數(shù)據(jù),并從中查詢所需要的坐標變換關(guān)系。(2)廣播TF變換:向系統(tǒng)中廣播坐標系之間的坐標變換關(guān)系。系統(tǒng)中可能會存在多個不同部分的TF變換廣播,每個廣播都可以直接將坐標變換關(guān)系插入TF樹中,不需要再進行同步。機器人操作系統(tǒng)(ROS)6.5.3TF工具TF提供了豐富的終端工具來幫助開發(fā)者調(diào)試和創(chuàng)建TF變換。如果已經(jīng)安裝了桌面完整版的ROS,那么可以不用單獨安裝TF工具,否則,可以使用以下命令進行安裝:$sudoapt-getinstallros-melodic-tf(1) tf_monitor:查看指定坐標系之間的發(fā)布狀態(tài),命令格式如下:$rosruntftf_monitor<source_frame><target_target>(2) tf_echo:查看指定坐標系之間的變換關(guān)系,命令格式如下:$rosruntftf_echo<source_frame><target_frame>機器人操作系統(tǒng)(ROS)6.5.3TF工具(3) view_frame:可視化調(diào)試工具,生成pdf文件,顯示整個TF數(shù),命令格式如下:$rosruntfview_frames(4) static_transform_publisher:發(fā)布兩個坐標系之間的靜態(tài)坐標變換,這兩個坐標系不發(fā)生相對位置變化,命令格式如下:$rosruntfstatic_transform_publisherxyzyawpitchrollframe_idchild_frame_i

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論