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