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