

前言
本來是要寫一篇STM32移植ROS的一個小lib庫,ROS一般都是需要跑在Linux上的,STM32使用就是當成一個ROS通訊的小節點,但是寫文章時間不夠,所以就簡單做一篇ROS的介紹文章,分享給嵌入式的小伙伴們。ROS現在在機器人領域會有比較多的應用,學習的人群也逐漸增多,甚至會有專門的ROS崗位進行招聘,并且普遍工資要比一般的嵌入式開發高一些。今天給大家分享一下,希望大家可以一起學習進步哈。
?
作者:良知猶存
轉載授權以及圍觀:歡迎添加微信公眾號:羽林君

?



?
ROS是什么
ROS(機器人操作系統,Robot Operating System),是專為機器人軟件開發所設計出來的一套電腦操作系統架構。它是一個開源的元級操作系統(后操作系統),提供類似于操作系統的服務,包括硬件抽象描述、底層驅動程序管理、共用功能的執行、程序間消息傳遞、程序發行包管理,它也提供一些工具和庫用于獲取、建立、編寫和執行多機融合的程序。
ROS的運行架構是一種使用ROS通信模塊實現模塊間P2P的松耦合的網絡連接的處理架構,它執行若干種類型的通訊,包括:
1.基于服務的同步RPC(遠程過程調用)通訊;
2.基于Topic的異步數據流通訊,還有參數服務器上的數據存儲。
發展目標
ROS的首要設計目標是在機器人研發領域提高代碼復用率。ROS是一種分布式處理框架(又名Nodes)。這使可執行文件能被單獨設計,并且在運行時松散耦合。這些過程可以封裝到數據包(Packages)和堆棧(Stacks)中,以便于共享和分發。ROS還支持代碼庫的聯合系統。使得協作亦能被分發。這種從文件系統級別到社區一級的設計讓獨立地決定發展和實施工作成為可能。上述所有功能都能由ROS的基礎工具實現。
為了實現“共享與協作”這一首要目標,人們制訂了ROS架構中的其他支援性目標:
- “輕便”:ROS是設計得盡可能方便簡易。您不必替換主框架與系統,因為ROS編寫的代碼可以用于其他機器人軟件框架中。毫無疑問的,ROS更易于集成與其他機器人軟件框架。事實上ROS已完成與OpenRAVE、Orocos和Player的整合。
- ROS-agnostic庫:【agnostic:不可知論】建議的開發模型是使用clear的函數接口書寫ROS-agnostic庫。
- 語言獨立性:ROS框架很容易在任何編程語言中執行。我們已經能在Python和C++中順利運行,同時添加有Lisp、Octave和Java語言庫。
- 測試簡單:ROS有一個內建的單元/組合集測試框架,稱為“rostest”。這使得集成調試和分解調試很容易。
- 擴展性:ROS適合于大型實時系統與大型的系統開發項目
在ROS的計算圖中,ROS的Master以一個name service的方式工作。它給ROS的節點存儲了topics和service的注冊信息。Nodes 與Master通信從而報告它們的注冊信息。當這些節點與master通信的時候,它們可以接收關于其他以注冊節點的信息并且建立與其它以注冊節點之間的聯系。當這些注冊信息改變時Master也會回饋這些節點,同時允許節點動態創建與新節點之間的連接。
節點之間的連接是直接的;Master僅僅提供了查詢信息,就像一個DNS服務器。節點訂閱一個topic將會要求建立一個與發布該topics的節點的連接,并且將會在同意連接協議的基礎上建立該連接。ROS里面使用最廣的連接協議是TCPROS,這個協議使用標準的TCP/IP 接口。
這樣的架構允許解耦操作(decoupled operation),通過這種方式大型或是更為復雜的系統得以建立,其中names方式是一種行之有效的手段。names方式在ROS系統中扮演極為重要的角色:topics, services, and parameters 都有各自的names。每一個ROS客戶端庫都支持重命名,這等同于,每一個編譯成功的程序能夠以另一種形似【名字】運行。
ROS通信接口正在成為機器人軟件互操作的事實標準,也就是 說絕大部分最新的硬件驅動和最前沿的算法實現都可以在 ROS中找到。例如,在ROS的官方網頁 上有著大量的開源軟 件庫,這些軟件使用ROS通用接口,從而避免為了集成它們而 重新開發新的接口程序


?
ROS可以做什么
當我們希望稍微提高一下機器人復雜度的時候,就會發現另一個需要考慮的問題,進程間通信。在我們用Windows + RTX的時候,進程間通信使用RTX提供的shared memory,不過都是比較慢的圖像處理進程向shared memory中寫數據,決策和運動控制進程讀數據。shared memory顯然并不是很好的通信方式,這里不再多加討論。ROS則使用了一個很好的通信架構,并且是ROS整個框架的一個基礎(不論是對于ROS中的topic,service,plugin,actionlib等基礎概念還是rviz,navigation package等功能包。
ROS為開發者提供了一系列非常有用的工具,可以大大提高我們開發的效率。
rqt_plot:可以實時繪制當前任意Topic的數值曲線;

?

rqt_graph:可以繪制出各節點之間的連接狀態,和正在使用的Topic等;

?

TF:TF是Transform的簡寫,利用它,我們可以實時知道各連桿坐標系的位姿,也可以求出兩個坐標系的相對位置。

?

Rviz:超強大的3D可視化工具,可以顯示機器人模型、3D電影、各種文字圖標、也可以很方便二次開發;


?
除了ROS本身之外,世界上已經有很多非常優秀的機器人開源項目,但是ROS正逐漸將它們一一囊括在自己的范疇里,所以你可以在ROS里面很容易的使用這些開源項目:(這部分項目介紹文字摘自公眾號:【Nao】 一位交大的算法博士的公眾號)
OROCOS:這個開源項目主要側重于機器人底層控制器的設計,包括用于計算串聯機械臂運動學數值解的KDL、貝葉斯濾波、實時控制等功能。
OpenRave:這是在ROS之前最多人用來做運動規劃的平臺,ROS已經將其中的ikfast(計算串聯機械臂運動學解析解)等功能吸收。
Player:一款優秀的二維仿真平臺,可以用于平面移動機器人的仿真,現在在ROS里可以直接使用。
OpenCV:大名鼎鼎的機器視覺開源項目,ROS提供了cv_bridge,可以將OpenCV的圖片與ROS的圖片格式相互轉換。
OMPL:現在最著名的運動規劃開源項目,已經成了MoveIt的一部分。
Visp:一個開源視覺伺服項目,已經跟ROS完美整合。
Gazebo:一款優秀的開源仿真平臺,可以實現動力學仿真、傳感器仿真等,也已被ROS吸收。
當然,除了吸收別的優秀開源項目,ROS自己也發展出許多非常優秀的項目和庫。
ORK:一個物體識別與位姿估計開源庫,包含LineMod等算法,但實際使用效果還不是太理想。下圖是LineMod識別效果

?

PCL:一個開源點云處理庫,原本是從ROS中發展起來的,后來由于太受歡迎,為了讓非ROS用戶也能用,就單獨立了一個PCL的項目。
Gmapping:這其實是在OpenSlam項目繼承過來的(后來發展和改動較大),利用gmapping可以實現laser-based SLAM,快速建立室內二維地圖,下圖就是gmapping建立二維地圖

?

Localization:基于擴展卡爾曼濾波(EKF)和無跡卡爾曼濾波(UKF)的機器人定位算法,可以融合各種傳感器的定位信息,獲得較為準確的定位效果。
robot_localization示意圖


?
Navigation:基于Dijkstra、A*算法(全局規劃器)和動態窗口法DWA(局部規劃器)的移動機器人路徑規劃模塊,可以在二維地圖上實現機器人導航。

?

MoveIt:這個是專注于移動機械臂運動規劃的模塊,運動規劃.

?

當然,除了這些最先進算法外,ROS還有各種機器人、傳感器驅動等內容。


?
ROS怎么學
Nao作者
首先,ROS版本定期更新、主要模塊有專人維護、問答區活躍、各mail lists也非常活躍、開發者非常熱衷交流分享。如果深入到ROS社區,可以學到很多東西。
ROS的基本架構和開發方式。我個人是強烈推薦直接看ROS官網上的教程ROS/Tutorials的Beginner Level(多看幾遍),同時充分使用ROS的問答社區ROS Answers與各模塊的Mail Lists,很多基礎問題可能前人都遇到過。
其次,在了解ROS的基本架構與開發方式后,就可以有針對性地看自己所關心的部分了。如做移動機器人的同學就去看Navigation教程;做物體識別的就去看ORK教程;做運動規劃的就去看MoveIt教程。這一步最好能跟有實際機器人練手(如果沒有的話,就用gazebo仿真)。由于一些模塊的教程不夠清楚(如MoveIt),一定要多練習,甚至是去看部分源碼,先保證自己會用ROS實現一些功能。
對于ROS與實際機器人的連接,建議仔細看看action(編寫機器人驅動package)、URDF(機器人描述文件)的教程(或者ros_control)。我為SDA5F機器人編寫了URDF文件,并修改了motoman_driver中的action,使得在ROS環境中用MoveIt規劃控制雙臂機器人運動。
最后,就是進階階段了。我要強調一句“ROS只是一個工具",你會用ROS做SLAM并不能說明你會做SLAM。對于自己研究的內容,必須沉下心去看教材和論文,去理解每種算法背后的原理,知道如何調整算法參數、如何改進算法,最終能夠自己編寫某部分代碼,并替換ROS的相應模塊(如自己寫運動學正逆解替代KDL等)。做研究,交流非常重要。如果你改進ROS某一算法后,最好能與package的原作者交流,將自己的修改merge到原項目中,在交流中提高自己與package的水平。當然,如果對算法有疑問,也可以直接咨詢作者,ROS里的貢獻者大都非常愿意分享和交流。
此外除了一個好的學習平臺,我們還需要一個趁手的使用工具:推薦TurtleBot

?

TurtleBot可以說是ROS中最為重要的機器人之一,它伴隨ROS一同成長,一直都作為ROS開發前沿的機器人,幾乎每個版本的ROS測試都會以TurtleBot為主,包括ROS2也率先在TurtleBot上進行了大量測試。
所以TurtleBot是ROS支持度最好的機器人之一,可以在ROS社區中獲得大量關于TurtleBot的相關資源,很多功能包都能直接復用到我們自己的移動機器人平臺上,絕對是使用ROS開發移動機器人的重要資源。并且TurtleBot相關的國內支持平臺:創客制造網站也提供了許多詳細資料。
這就是我分享的ROS,最近也有在用ROS以及更加深入的學習ROS,有些資料大家可以添加我微信,我可以分享給大家。此外如果大家有什么更好的思路,也歡迎分享交流哈。
—END—
推薦閱讀
【1】c++nullptr(空指針常量)、constexpr(常量表達式)
【2】嵌入式底層開發的軟件框架簡述 必讀
【3】CPU中的程序是怎么運行起來的
【4】C++的匿名函數(lambda表達式)
【5】階段性文章總結分析
本公眾號全部原創干貨已整理成一個目錄,回復[ 資源 ]即可獲得.