嵌入式的我們需要學(xué)習(xí)一下ROS嗎?
來(lái)源:羽林君
前言
? ? 本來(lái)是要寫(xiě)一篇STM32移植ROS的一個(gè)小lib庫(kù),ROS一般都是需要跑在Linux上的,STM32使用就是當(dāng)成一個(gè)ROS通訊的小節(jié)點(diǎn),但是寫(xiě)文章時(shí)間不夠,所以就簡(jiǎn)單做一篇ROS的介紹文章,分享給嵌入式的小伙伴們。ROS現(xiàn)在在機(jī)器人領(lǐng)域會(huì)有比較多的應(yīng)用,學(xué)習(xí)的人群也逐漸增多,甚至?xí)袑iT(mén)的ROS崗位進(jìn)行招聘,并且普遍工資要比一般的嵌入式開(kāi)發(fā)高一些。今天給大家分享一下,希望大家可以一起學(xué)習(xí)進(jìn)步哈。
ROS是什么
?????ROS(機(jī)器人操作系統(tǒng),Robot Operating System),是專為機(jī)器人軟件開(kāi)發(fā)所設(shè)計(jì)出來(lái)的一套電腦操作系統(tǒng)架構(gòu)。它是一個(gè)開(kāi)源的元級(jí)操作系統(tǒng)(后操作系統(tǒng)),提供類似于操作系統(tǒng)的服務(wù),包括硬件抽象描述、底層驅(qū)動(dòng)程序管理、共用功能的執(zhí)行、程序間消息傳遞、程序發(fā)行包管理,它也提供一些工具和庫(kù)用于獲取、建立、編寫(xiě)和執(zhí)行多機(jī)融合的程序。
ROS的運(yùn)行架構(gòu)是一種使用ROS通信模塊實(shí)現(xiàn)模塊間P2P的松耦合的網(wǎng)絡(luò)連接的處理架構(gòu),它執(zhí)行若干種類型的通訊,包括:
- 1.基于服務(wù)的同步RPC(遠(yuǎn)程過(guò)程調(diào)用)通訊;
- 2.基于Topic的異步數(shù)據(jù)流通訊,還有參數(shù)服務(wù)器上的數(shù)據(jù)存儲(chǔ)。
發(fā)展目標(biāo)
??? ROS的首要設(shè)計(jì)目標(biāo)是在機(jī)器人研發(fā)領(lǐng)域提高代碼復(fù)用率。ROS是一種分布式處理框架(又名Nodes)。這使可執(zhí)行文件能被單獨(dú)設(shè)計(jì),并且在運(yùn)行時(shí)松散耦合。這些過(guò)程可以封裝到數(shù)據(jù)包(Packages)和堆棧(Stacks)中,以便于共享和分發(fā)。ROS還支持代碼庫(kù)的聯(lián)合系統(tǒng)。使得協(xié)作亦能被分發(fā)。這種從文件系統(tǒng)級(jí)別到社區(qū)一級(jí)的設(shè)計(jì)讓獨(dú)立地決定發(fā)展和實(shí)施工作成為可能。上述所有功能都能由ROS的基礎(chǔ)工具實(shí)現(xiàn)。為了實(shí)現(xiàn)“共享與協(xié)作”這一首要目標(biāo),人們制訂了ROS架構(gòu)中的其他支援性目標(biāo):- “輕便”:ROS是設(shè)計(jì)得盡可能方便簡(jiǎn)易。您不必替換主框架與系統(tǒng),因?yàn)镽OS編寫(xiě)的代碼可以用于其他機(jī)器人軟件框架中。毫無(wú)疑問(wèn)的,ROS更易于集成與其他機(jī)器人軟件框架。事實(shí)上ROS已完成與OpenRAVE、Orocos和Player的整合。
- ROS-agnostic庫(kù):【agnostic:不可知論】建議的開(kāi)發(fā)模型是使用clear的函數(shù)接口書(shū)寫(xiě)ROS-agnostic庫(kù)。
- 語(yǔ)言獨(dú)立性:ROS框架很容易在任何編程語(yǔ)言中執(zhí)行。我們已經(jīng)能在Python和C 中順利運(yùn)行,同時(shí)添加有Lisp、Octave和Java語(yǔ)言庫(kù)。
- 測(cè)試簡(jiǎn)單:ROS有一個(gè)內(nèi)建的單元/組合集測(cè)試框架,稱為“rostest”。這使得集成調(diào)試和分解調(diào)試很容易。
- 擴(kuò)展性:ROS適合于大型實(shí)時(shí)系統(tǒng)與大型的系統(tǒng)開(kāi)發(fā)項(xiàng)目
?????在ROS的計(jì)算圖中,ROS的Master以一個(gè)name service的方式工作。它給ROS的節(jié)點(diǎn)存儲(chǔ)了topics和service的注冊(cè)信息。Nodes 與Master通信從而報(bào)告它們的注冊(cè)信息。當(dāng)這些節(jié)點(diǎn)與master通信的時(shí)候,它們可以接收關(guān)于其他以注冊(cè)節(jié)點(diǎn)的信息并且建立與其它以注冊(cè)節(jié)點(diǎn)之間的聯(lián)系。當(dāng)這些注冊(cè)信息改變時(shí)Master也會(huì)回饋這些節(jié)點(diǎn),同時(shí)允許節(jié)點(diǎn)動(dòng)態(tài)創(chuàng)建與新節(jié)點(diǎn)之間的連接。
????????節(jié)點(diǎn)之間的連接是直接的;Master僅僅提供了查詢信息,就像一個(gè)DNS服務(wù)器。節(jié)點(diǎn)訂閱一個(gè)topic將會(huì)要求建立一個(gè)與發(fā)布該topics的節(jié)點(diǎn)的連接,并且將會(huì)在同意連接協(xié)議的基礎(chǔ)上建立該連接。ROS里面使用最廣的連接協(xié)議是TCPROS,這個(gè)協(xié)議使用標(biāo)準(zhǔn)的TCP/IP 接口。????????這樣的架構(gòu)允許解耦操作(decoupled operation),通過(guò)這種方式大型或是更為復(fù)雜的系統(tǒng)得以建立,其中names方式是一種行之有效的手段。names方式在ROS系統(tǒng)中扮演極為重要的角色:topics, services, and parameters 都有各自的names。每一個(gè)ROS客戶端庫(kù)都支持重命名,這等同于,每一個(gè)編譯成功的程序能夠以另一種形似【名字】運(yùn)行。
??? ROS通信接口正在成為機(jī)器人軟件互操作的事實(shí)標(biāo)準(zhǔn),也就是 說(shuō)絕大部分最新的硬件驅(qū)動(dòng)和最前沿的算法實(shí)現(xiàn)都可以在 ROS中找到。例如,在ROS的官方網(wǎng)頁(yè) 上有著大量的開(kāi)源軟 件庫(kù),這些軟件使用ROS通用接口,從而避免為了集成它們而 重新開(kāi)發(fā)新的接口程序
ROS可以做什么
????當(dāng)我們希望稍微提高一下機(jī)器人復(fù)雜度的時(shí)候,就會(huì)發(fā)現(xiàn)另一個(gè)需要考慮的問(wèn)題,進(jìn)程間通信。在我們用Windows RTX的時(shí)候,進(jìn)程間通信使用RTX提供的shared memory,不過(guò)都是比較慢的圖像處理進(jìn)程向shared memory中寫(xiě)數(shù)據(jù),決策和運(yùn)動(dòng)控制進(jìn)程讀數(shù)據(jù)。shared memory顯然并不是很好的通信方式,這里不再多加討論。ROS則使用了一個(gè)很好的通信架構(gòu),并且是ROS整個(gè)框架的一個(gè)基礎(chǔ)(不論是對(duì)于ROS中的topic,service,plugin,actionlib等基礎(chǔ)概念還是rviz,navigation package等功能包。?????? ROS為開(kāi)發(fā)者提供了一系列非常有用的工具,可以大大提高我們開(kāi)發(fā)的效率。rqt_plot:可以實(shí)時(shí)繪制當(dāng)前任意Topic的數(shù)值曲線;
rqt_graph:可以繪制出各節(jié)點(diǎn)之間的連接狀態(tài),和正在使用的Topic等;
TF:TF是Transform的簡(jiǎn)寫(xiě),利用它,我們可以實(shí)時(shí)知道各連桿坐標(biāo)系的位姿,也可以求出兩個(gè)坐標(biāo)系的相對(duì)位置。
Rviz:超強(qiáng)大的3D可視化工具,可以顯示機(jī)器人模型、3D電影、各種文字圖標(biāo)、也可以很方便二次開(kāi)發(fā);?
???除了ROS本身之外,世界上已經(jīng)有很多非常優(yōu)秀的機(jī)器人開(kāi)源項(xiàng)目,但是ROS正逐漸將它們一一囊括在自己的范疇里,所以你可以在ROS里面很容易的使用這些開(kāi)源項(xiàng)目:(這部分項(xiàng)目介紹文字摘自公眾號(hào):【Nao】 一位交大的算法博士的公眾號(hào))
OROCOS:這個(gè)開(kāi)源項(xiàng)目主要側(cè)重于機(jī)器人底層控制器的設(shè)計(jì),包括用于計(jì)算串聯(lián)機(jī)械臂運(yùn)動(dòng)學(xué)數(shù)值解的KDL、貝葉斯濾波、實(shí)時(shí)控制等功能。
OpenRave:這是在ROS之前最多人用來(lái)做運(yùn)動(dòng)規(guī)劃的平臺(tái),ROS已經(jīng)將其中的ikfast(計(jì)算串聯(lián)機(jī)械臂運(yùn)動(dòng)學(xué)解析解)等功能吸收。
Player:一款優(yōu)秀的二維仿真平臺(tái),可以用于平面移動(dòng)機(jī)器人的仿真,現(xiàn)在在ROS里可以直接使用。
OpenCV:大名鼎鼎的機(jī)器視覺(jué)開(kāi)源項(xiàng)目,ROS提供了cv_bridge,可以將OpenCV的圖片與ROS的圖片格式相互轉(zhuǎn)換。
OMPL:現(xiàn)在最著名的運(yùn)動(dòng)規(guī)劃開(kāi)源項(xiàng)目,已經(jīng)成了MoveIt的一部分。Visp:一個(gè)開(kāi)源視覺(jué)伺服項(xiàng)目,已經(jīng)跟ROS完美整合。Gazebo:一款優(yōu)秀的開(kāi)源仿真平臺(tái),可以實(shí)現(xiàn)動(dòng)力學(xué)仿真、傳感器仿真等,也已被ROS吸收。
當(dāng)然,除了吸收別的優(yōu)秀開(kāi)源項(xiàng)目,ROS自己也發(fā)展出許多非常優(yōu)秀的項(xiàng)目和庫(kù)。ORK:一個(gè)物體識(shí)別與位姿估計(jì)開(kāi)源庫(kù),包含LineMod等算法,但實(shí)際使用效果還不是太理想。下圖是LineMod識(shí)別效果
PCL:一個(gè)開(kāi)源點(diǎn)云處理庫(kù),原本是從ROS中發(fā)展起來(lái)的,后來(lái)由于太受歡迎,為了讓非ROS用戶也能用,就單獨(dú)立了一個(gè)PCL的項(xiàng)目。Gmapping:這其實(shí)是在OpenSlam項(xiàng)目繼承過(guò)來(lái)的(后來(lái)發(fā)展和改動(dòng)較大),利用gmapping可以實(shí)現(xiàn)laser-based SLAM,快速建立室內(nèi)二維地圖,下圖就是gmapping建立二維地圖
Localization:基于擴(kuò)展卡爾曼濾波(EKF)和無(wú)跡卡爾曼濾波(UKF)的機(jī)器人定位算法,可以融合各種傳感器的定位信息,獲得較為準(zhǔn)確的定位效果。robot_localization示意圖
Navigation:基于Dijkstra、A*算法(全局規(guī)劃器)和動(dòng)態(tài)窗口法DWA(局部規(guī)劃器)的移動(dòng)機(jī)器人路徑規(guī)劃模塊,可以在二維地圖上實(shí)現(xiàn)機(jī)器人導(dǎo)航。
MoveIt:這個(gè)是專注于移動(dòng)機(jī)械臂運(yùn)動(dòng)規(guī)劃的模塊,運(yùn)動(dòng)規(guī)劃.
當(dāng)然,除了這些最先進(jìn)算法外,ROS還有各種機(jī)器人、傳感器驅(qū)動(dòng)等內(nèi)容。
ROS怎么學(xué)
???Nao作者????首先,ROS版本定期更新、主要模塊有專人維護(hù)、問(wèn)答區(qū)活躍、各mail lists也非常活躍、開(kāi)發(fā)者非常熱衷交流分享。如果深入到ROS社區(qū),可以學(xué)到很多東西。??? ROS的基本架構(gòu)和開(kāi)發(fā)方式。我個(gè)人是強(qiáng)烈推薦直接看ROS官網(wǎng)上的教程ROS/Tutorials的Beginner Level(多看幾遍),同時(shí)充分使用ROS的問(wèn)答社區(qū)ROS Answers與各模塊的Mail Lists,很多基礎(chǔ)問(wèn)題可能前人都遇到過(guò)。
????其次,在了解ROS的基本架構(gòu)與開(kāi)發(fā)方式后,就可以有針對(duì)性地看自己所關(guān)心的部分了。如做移動(dòng)機(jī)器人的同學(xué)就去看Navigation教程;做物體識(shí)別的就去看ORK教程;做運(yùn)動(dòng)規(guī)劃的就去看MoveIt教程。這一步最好能跟有實(shí)際機(jī)器人練手(如果沒(méi)有的話,就用gazebo仿真)。由于一些模塊的教程不夠清楚(如MoveIt),一定要多練習(xí),甚至是去看部分源碼,先保證自己會(huì)用ROS實(shí)現(xiàn)一些功能。????對(duì)于ROS與實(shí)際機(jī)器人的連接,建議仔細(xì)看看action(編寫(xiě)機(jī)器人驅(qū)動(dòng)package)、URDF(機(jī)器人描述文件)的教程(或者ros_control)。我為SDA5F機(jī)器人編寫(xiě)了URDF文件,并修改了motoman_driver中的action,使得在ROS環(huán)境中用MoveIt規(guī)劃控制雙臂機(jī)器人運(yùn)動(dòng)。????最后,就是進(jìn)階階段了。我要強(qiáng)調(diào)一句“ROS只是一個(gè)工具",你會(huì)用ROS做SLAM并不能說(shuō)明你會(huì)做SLAM。對(duì)于自己研究的內(nèi)容,必須沉下心去看教材和論文,去理解每種算法背后的原理,知道如何調(diào)整算法參數(shù)、如何改進(jìn)算法,最終能夠自己編寫(xiě)某部分代碼,并替換ROS的相應(yīng)模塊(如自己寫(xiě)運(yùn)動(dòng)學(xué)正逆解替代KDL等)。做研究,交流非常重要。如果你改進(jìn)ROS某一算法后,最好能與package的原作者交流,將自己的修改merge到原項(xiàng)目中,在交流中提高自己與package的水平。當(dāng)然,如果對(duì)算法有疑問(wèn),也可以直接咨詢作者,ROS里的貢獻(xiàn)者大都非常愿意分享和交流。
? ?
? ?此外除了一個(gè)好的學(xué)習(xí)平臺(tái),我們還需要一個(gè)趁手的使用工具:推薦TurtleBot? ????? TurtleBot可以說(shuō)是ROS中最為重要的機(jī)器人之一,它伴隨ROS一同成長(zhǎng),一直都作為ROS開(kāi)發(fā)前沿的機(jī)器人,幾乎每個(gè)版本的ROS測(cè)試都會(huì)以TurtleBot為主,包括ROS2也率先在TurtleBot上進(jìn)行了大量測(cè)試。????所以TurtleBot是ROS支持度最好的機(jī)器人之一,可以在ROS社區(qū)中獲得大量關(guān)于TurtleBot的相關(guān)資源,很多功能包都能直接復(fù)用到我們自己的移動(dòng)機(jī)器人平臺(tái)上,絕對(duì)是使用ROS開(kāi)發(fā)移動(dòng)機(jī)器人的重要資源。并且TurtleBot相關(guān)的國(guó)內(nèi)支持平臺(tái):創(chuàng)客制造網(wǎng)站也提供了許多詳細(xì)資料。這就是我分享的ROS,最近也有在用ROS以及更加深入的學(xué)習(xí)ROS,有些資料大家可以添加我微信,我可以分享給大家。此外如果大家有什么更好的思路,也歡迎分享交流哈。—END—
更多分享,掃碼關(guān)注我





