0
ROS和Android一樣是開源的,功能上也是相差無幾,它可以提供硬件抽象,底層設備控制,常用功能實現(xiàn),進程間消息以及數(shù)據(jù)包管理。其獨特之處在于,能夠支持多種語言,如C++、Python、Octave和LISP,甚至支持多種語言混合使用,這可以簡化開發(fā)者的工作。因為它是基于Linux的系統(tǒng),其可靠性也會更高,體積可以做到更小,適合嵌入式設備。
另外,ROS是一種分布式處理框架,開發(fā)者可以單獨設計可執(zhí)行文件。不同節(jié)點的進程能接收、發(fā)布各種信息(例如傳感,控制,狀態(tài),規(guī)劃等等)。
與Android一樣,ROS也是業(yè)界公認的機器人三大操作系統(tǒng)之一(另一個為Ubuntu),不過ROS的開發(fā)門檻相對較高。Top博士自2009年第一次接觸到ROS后,便認識到其在機器人開發(fā)中的重要性,并不遺余力在國內進行推廣。然而隨著ROS近年來火熱,在教學中也發(fā)現(xiàn)很多新伙伴對ROS的認識存在一些誤區(qū),為了加快小伙伴們的學習速度,雷鋒網本期公開課雷鋒網邀請Top和大家分享一點自己學習和使用的經驗和心得。
雷鋒網本期公開課面向想入手ROS卻又不知從何下手的小伙伴,為大家梳理好學習思路。內容包括但不限于ROS全球使用現(xiàn)狀、核心概念、工作原理等學習重點,及仿真環(huán)境、工具庫等需了解的內容。介紹了具體的學習路徑及有用的資源鏈接。
嘉賓介紹:
Top Liu,易科機器人實驗室、(星火計劃)ROS公開課聯(lián)合發(fā)起人,致力于機器人技術的探索與分享,撰寫各類技術文章近百篇,出版有《ROS機器人程序設計2》、《機器人編程實戰(zhàn)》、《嵌入式機器人學》、《機器人與未來》。
以下內容整理自Top Liu在硬創(chuàng)公開課的分享。
當前大家學習ROS還是以自學為主,所以會走很多的彎路,目前所謂的大神們也都是這樣過來的?;旧显缙陂_發(fā)機器人大家都是各干各的,甚至是防著彼此,生怕別人把我們的代碼、設計抄襲過去,這樣其實大家就是在重復地造輪子,進行一些底層的無聊工作。
我最早接觸ROS是2009年在翻譯《嵌入式機器人學》這本書,作者托馬斯·布勞恩教授當時開發(fā)了一套RoBIOS的機器人操作系統(tǒng),按照他的說法,這是最早的機器人操作系統(tǒng),而且是可以嵌入式應用的。當時和他溝通,他表示不會開源,而且售價特別高,當時在網上搜索,不經意間看到了ROS,Box版本,很古老的版本。
什么是ROS?這是個老生常談的問題,這里用官網的定義來解釋一下。ROS是一個適用于機器人的開源的元操作系統(tǒng)。它不是一個真正的操作系統(tǒng),但它提供了操作系統(tǒng)應用的服務,包括硬件抽象,底層設備控制,常用函數(shù)的實現(xiàn),進程間消息傳遞,以及包管理。它也提供用于獲取、 編譯、編寫、和跨計算機運行代碼所需的工具和庫函數(shù)。 它主要采用的是松耦合點對點進程網絡,目前主要支持的還是Ubuntu系統(tǒng),Mac OS X支持,Windows目前有測試版本,但支持的并不很好,不推薦。
首先,目前機器人開發(fā),軟件開發(fā)的比重越來越大,而軟件開發(fā)的時候軟件框架的選擇,是軟件架構設計中一個重要的決策,直接決定了軟件開發(fā)的直接效率,以及后續(xù)功能的實現(xiàn)程度。
目前除了ROS,還有很多類似的機器人軟件框架,包括Player、YARP、Orocos、CARMEN、Orca、MOOS,以及Microsoft Robotics Studio。
為什么使用ROS呢?我總結了下,ROS有四大優(yōu)點:1、松散耦合的機制方便機器人軟件框架的組織;2、最豐富的機器人功能庫,方便快速搭建原型;3、非常便利的數(shù)據(jù)記錄、分析、仿真工具,方便調試;4、學界和產業(yè)界的標準,方便學習和交流。 使用一句話總結,使用ROS,能夠方便迅速地搭建好機器人原型。當然,它的性能不是最優(yōu)的,但是這四條優(yōu)點足以保障它在機器人操作系統(tǒng)里面的地位。
然后,ROS比較好的一點是使用了BSD許可證,這是一個非常寬松的開放許可證,允許在商業(yè)和閉源產品使用,這對于開發(fā)產品的創(chuàng)業(yè)公司是比較重要的一點。
ROS是最龐大的使用者群體,是事實上的機器人標準,這是麻省理工在一篇文章中給出的評論。然后在2016年ROS大會數(shù)據(jù)顯示,目前在使用操作系統(tǒng)做開發(fā)的人員用戶超過35萬,其中活躍用戶美國占第一位,中國占第二位。
在學術研究領域,基本上機器人算法都會給出ROS版本的源程序。最早在2009年ROS發(fā)布的“ROS: an open source Robot Operating System” 論文,目前已經被引用了2871次。
2016年官方支持ROS的機器人超過了100個。目前已經有很多機器人公司采用了ROS系統(tǒng)來開發(fā)一些應用于全新市場的產品,如ClearPath、Rethink、Unbounded、Neurala、Blue River、Big-i,最典型的就是Willow Garage的PR2機器人。投資機構也對創(chuàng)業(yè)公司給予了極大的支持,僅2015年相關風險投資機構就在基于ROS操作系統(tǒng)的機器人公司投資了超過1.5億美元。Nvidia、博世、高通、英特爾、寶馬以及大 疆等大公司也紛紛推出ROS接口。
這是ROS當前的代碼統(tǒng)計量,總行數(shù)已經超過了1400萬,超過2477名作者。代碼語言以C++為主,63.98%的代碼是用C++寫的,排名第二的是python,占13.57% ,也就是說ROS基本上都是使用這兩種語言,可以實現(xiàn)大部分的功能。
要想學ROS,應該從哪里入手,它的先后順序是怎樣的呢?ROS由四大部分構成,第一個是基礎結構,這些通訊機制是如何實現(xiàn)的;第二個是工具,包括仿真工具、調試工具等;第三個是體現(xiàn)它功能的package;第四個就是社區(qū),如何去上面下載、發(fā)布代碼,和其他開發(fā)者交流學習。
入門的話,首先要了解這四點:設計思想,核心概念,核心模塊,核心工具。
設計思想主要是分布式架構,將機器人的功能和軟件,做成一個個節(jié)點,然后每個節(jié)點通過topic進行溝通,但你這些節(jié)點可以部署在同一臺機器上,也可以部署在不同機器上,還可以部署在互聯(lián)網上。
ROS的核心概念主要是這幾個,首先是節(jié)點,然后是節(jié)點之間的通信和話題,通信的方式有兩種,一個是剛剛講的話題,一個是服務。那么,如何管理ROS的這些節(jié)點和話題之間的溝通呢?這就需要用到Master,也就是ROS管理器,它還維持了一個參數(shù)的服務。而怎么組織代碼,就是通過功能包集與功能包。
節(jié)點是各自獨立的可執(zhí)行文件,能夠通過話題、服務或參數(shù),與服務器或其他進程(節(jié)點)通信。ROS通過使用節(jié)點的方式將代碼和功能解耦,提高了系統(tǒng)容錯能力和可維護性,使系統(tǒng)簡化。同時,節(jié)點允許了ROS系統(tǒng)能夠布置在任意多個機器上并同時運行。關于節(jié)點需要注意的事項,節(jié)點在系統(tǒng)中必須有唯一的名稱;節(jié)點可以使用不同的庫進行編寫,如roscpp和rospy,其中roscpp基于C++,rospy基于Python。
節(jié)點之間通過topic機制進行通信,topic機制是一個一對多的Publish/Subscribe 模式: 同一個話題也可以有很多個訂閱者,它的底層傳輸依靠的是TCP/IP,也可以是UDP。topic具體傳輸?shù)膍essage,具有一定的類型和數(shù)據(jù)結構,包括ROS提供的標準類型,和用戶自定義類型。
除了topic,ROS還提供另一種一對一的機制,也就是Service/Client,當你需要直接與節(jié)點通信并獲得應答時,將無法通過話題實現(xiàn),這時需要使用該服務。
Master向ROS系統(tǒng)中其他節(jié)點提供命名和注冊服務,跟蹤和記錄話題的發(fā)布者和訂閱者,使ROS 節(jié)點之間能夠相互查找。一旦節(jié)點找到了彼此,就能建立一種點對點的通信方式。
那么如何組織代碼呢?這主要依靠功能包(Package) ,ROS中軟件組織的基本形式,用于創(chuàng)建ROS程序。功能包包含源代碼和功能包清單(Manifest) 。功能包清單提供關于功能包、許可信息、依賴關系、編譯標志等的信息。功能包清單是一個manifests.xml文件,通過這個文件能夠實現(xiàn)對功能包的管理。
ROS核心模塊包括通信結構基礎、機器人特性功能以及工具集,通信結構基礎包括消息傳遞、記錄和回放消息、遠程過程調用、分布式參數(shù)系統(tǒng);機器人特性功能包括標準機器人消息,機器人幾何庫,機器人描述語言,搶占式遠程過程調用,診斷,位資估計、定位與導航;工具集包括命令式工具、可視化工具以及圖形化接口。
ROS擁有很多第三方的核心工具的支持,或者說Package。我們比較常見的是右邊這五個工具,Gazebo是一個三維仿真環(huán)境,OpenCV是大家非常熟悉的計算機視覺庫,PCL是點云庫,MoveIt!是機械臂的規(guī)劃控制庫,Industrial是工業(yè)上會用的庫。左邊有三維仿真環(huán)境,另外兩個其中值得一提的是MRPT,是一個非常好的機器人編程工具箱。然后,如果對實時控制要求比較高的話,可以考慮最下邊的The Orocos Project。
ROS常用命令工具包括rostopic (Topics)、rosservice (Services)、rosnode (Nodes)、rosparam (Parameters)、rosmsg (Messages)、rossrv (Services)和roswtf (General debugging) ,在這里就不詳細展開了。
ROS用的最多的可視化工具是rqt(集成圖像交互界面)和 rviz(3D 可視化工具)。
ROS具有非常強的數(shù)據(jù)存儲/回放功能,也就是使用bag存儲topic(例如現(xiàn)實中的傳感器數(shù)據(jù)),以后調用bag的topic數(shù)據(jù)則不必每次都在現(xiàn)實中運行機器人,速度非???。
ROS log系統(tǒng)記錄軟件運行相關信息,便于以后的調試。
怎么學
首先,我們在學校學的是指導主義,也就是傳統(tǒng)的教學方式:老師講,學生聽,今天我在這兒其實也屬于這種模式吧,而這種模式的缺點在于開環(huán)或是閉環(huán)周期過長。另一種是建造主義,通過動手來學習,然后你可以得到實時反饋,你學到的知識就能形成一個閉環(huán)。當然,你還是要摸索出一個套路,這樣上手才能比較快。
當然,比較好的套路還是官網的那一套。首先按照官網的步驟安裝ROS,這個過程不要輕易問問題,因為教程里講得已經很明白了,大神們對這些問題也會比較鄙視,通常會笑而不語。另外,建議初學者一定要認真學完整20個初級教程!然后就此打住!那些中級教程就不要再看了,瀏覽下都有啥即可,以后遇到類似問題再回來看即可,這個時候你的重點就應該回到機器人學及其實踐上了,那20個初級教程都是可以在電腦上編程學習的,但不涉及機器人學。
接下來就應該運行真實的機器人、解決真實的問題。有的小伙伴就會問,沒有真實的機器人怎么辦?當然也有辦法,你可以在仿真環(huán)境里邊運行。
仿真環(huán)境由易到難主要有這三個:Turtlesim、ArbotiX、Gazebo。Turtlesim是一個QT開發(fā)的2D軌跡顯示界面,只能顯示運動軌跡;ArbotiX是含有一個差速驅動機器人的rviz模擬器,機器人運動及topic數(shù)據(jù)的3D顯示,但不包含物理學引擎;Gazebo是功能齊全的3D物理模擬器,不過缺點是非常重,對內存和顯卡要求高,慎入!
很多小伙伴會問,ROS版本那么多,該用哪一個? 目前,ROS是一年推出一個版本。通過下載統(tǒng)計,我們發(fā)現(xiàn)現(xiàn)在使用最多的還是Indigo,所以對于初學者,建議還是使用這個版本,因為這是目前使用人數(shù)最多、坑最少的版本。而如果Linux編程能力比較強的,可以使用Kinetic,它可以一直支持到2021年。然后,你在選擇Ubuntu版本時,要與ROS版本需匹配。
命令行不熟悉怎么辦? 有IDE
現(xiàn)在已經有很多IDE了,值得一提的是這個RoboWare Studio是我們中國團隊開發(fā)的一個開源IDE,目前剛剛推出64位版本。最近我也和RoboWare Studio的王博士交流了一下,他表示之后會推出32位版本,包括Arm集成開發(fā)環(huán)境的,而且承諾是免費的,以后也會在適當?shù)臅r候開源。
不熟悉Linux怎么辦?
其實學習ROS并不難,而很多小伙伴遇到的問題在于對于Linux不熟悉。這個只能邊用邊學了,遇到問題也要善用搜索,基本上這些問題都能在搜索中找到答案。教程推薦這兩個版本,一個是英文版本,一個中文版本。書的話,推薦《鳥哥的Linux私房菜》吧!
ROS和ROS2.0該學習哪個呢?
對于大眾學習者、普通開發(fā)者、機器人算法開發(fā)者,在2017年仍推薦使用ROS。對于軟件架構的學習者、強調實時性的開發(fā)者,建議關注ROS2.0 。另外,我在知乎上對于這個問題也有詳細的回答,有興趣的可以去看看。
Q&A 環(huán)節(jié)
Q:請問除了ROS還有其他哪些常用的實時嵌入式操作系統(tǒng)?
A:關于機器人目前操作系統(tǒng)哪家強這個問題,目前已經形成了各個陣營,我們最近會組織一場辯論。主要是現(xiàn)在服務機器人用安卓的比較多。實時系統(tǒng)的話,我建議不要用ROS,因為ROS設計對象是家用移動智能機器人,當初的設計就不是針對實時控制的,不過ROS 2.0已經加入了實時性這個特性,大家可以關注一下。
Q:硬件方面有什么要求呢?
A:剛才講了ROS它具備操作系統(tǒng)的特性,其中一個特性就是對于硬件的抽象,如果你用ROS的話,你不用過多關注底層硬件的東西,因為大家都是按照標準來做好封裝,你直接調用就OK,你主要的精力還是放在機器人系統(tǒng)的設計和算法的開發(fā)上。
Q:您覺得ROS在目前火熱的自動駕駛領域應用前景如何?
A:據(jù)我所知,自動駕駛領域一些大企業(yè)也是用ROS開發(fā)的,它的最終產品不一定是基于ROS,但是研發(fā)階段我相信是會用到的,據(jù)所了解確實有一些是在用的。
Q:ROS未來能不能發(fā)展成完全替代Linux和Window?
A:ROS不會替代Linux和Window,它根本就是兩回事兒。Linux和Window是一個基本的操作系統(tǒng),ROS是完全針對機器人的上層架構,它可以依賴于Linux和Window,當然2.0開始,也開始獨立地去工作。所以,你要搞清楚,哪些是ROS可以做,哪些是它不擅長的領域。
Q:像美國剛剛搞的蜂群無人機,在ROS上是否能實現(xiàn)?
A:目前用ROS開發(fā)不是很好實現(xiàn),如果用ROS 2.0,應該是可以的。因為ROS它用在分布式系統(tǒng)上,一個比較大的問題是需要一個Master,分布式系統(tǒng)是不需要Master的,所以如果你非要用ROS的話,就有點別扭。而ROS 2.0是沒有中心節(jié)點的,是沒有Master的,完全分布式架構,那應該適用于多機器人的應用場景。
編者按:關注雷鋒網機器人垂直欄目微信公眾號「新智造」,可獲取嘉賓完整PPT。
雷峰網原創(chuàng)文章,未經授權禁止轉載。詳情見轉載須知。