機器人程序設計之如何正確入門ROS | 硬創公開課(附視頻)

ROS和Android一樣是開源的,功能上也是相差無幾,它可以提供硬體抽象,底層設備控制,常用功能實現,進程間消息以及數據包管理。其獨特之處在於,能夠支持多種語言,如C++、Python、Octave和LISP,甚至支持多種語言混合使用,這可以簡化開發者的工作。因為它是基於Linux的系統,其可靠性也會更高,體積可以做到更小,適合嵌入式設備。

另外,ROS是一種分散式處理框架,開發者可以單獨設計可執行文件。不同節點的進程能接收、發布各種信息(例如感測,控制,狀態,規劃等等)。

與Android一樣,ROS也是業界公認的機器人三大操作系統之一(另一個為Ubuntu),不過ROS的開發門檻相對較高。Top博士自2009年第一次接觸到ROS後,便認識到其在機器人開發中的重要性,並不遺餘力在國內進行推廣。然而隨著ROS近年來火熱,在教學中也發現很多新夥伴對ROS的認識存在一些誤區,為了加快小夥伴們的學習速度,雷鋒網(公眾號:雷鋒網)本期公開課雷鋒網邀請Top和大家分享一點自己學習和使用的經驗和心得。

雷鋒網本期公開課面向想入手ROS卻又不知從何下手的小夥伴,為大家梳理好學習思路。內容包括但不限於ROS全球使用現狀、核心概念、工作原理等學習重點,及模擬環境、工具庫等需了解的內容。介紹了具體的學習路徑及有用的資源鏈接。

嘉賓介紹:

Top Liu,易科機器人實驗室、(星火計劃)ROS公開課聯合發起人,致力於機器人技術的探索與分享,撰寫各類技術文章近百篇,出版有《ROS機器人程序設計2》、《機器人編程實戰》、《嵌入式機器人學》、《機器人與未來》。

以下內容整理自Top Liu在硬創公開課的分享。

公開課視頻:

115期:機器人程序設計之如何正確入門ROS | 硬創公開課 - 騰訊視頻 https://v.qq.com/x/page/q0365z68o15.html?start=59

當前大家學習ROS還是以自學為主,所以會走很多的彎路,目前所謂的大神們也都是這樣過來的。基本上早期開發機器人大家都是各干各的,甚至是防著彼此,生怕別人把我們的代碼、設計抄襲過去,這樣其實大家就是在重複地造輪子,進行一些底層的無聊工作。

我最早接觸ROS是2009年在翻譯《嵌入式機器人學》這本書,作者托馬斯·布勞恩教授當時開發了一套RoBIOS的機器人操作系統,按照他的說法,這是最早的機器人操作系統,而且是可以嵌入式應用的。當時和他溝通,他表示不會開源,而且售價特別高,當時在網上搜索,不經意間看到了ROS,Box版本,很古老的版本。

什麼是ROS?這是個老生常談的問題,這裡用官網的定義來解釋一下。ROS是一個適用於機器人的開源的元操作系統。它不是一個真正的操作系統,但它提供了操作系統應用的服務,包括硬體抽象,底層設備控制,常用函數的實現,進程間消息傳遞,以及包管理。它也提供用於獲取、 編譯、編寫、和跨計算機運行代碼所需的工具和庫函數。 它主要採用的是松耦合點對點進程網路,目前主要支持的還是Ubuntu系統,Mac OS X支持,Windows目前有測試版本,但支持的並不很好,不推薦。

為什麼學習ROS

首先,目前機器人開發,軟體開發的比重越來越大,而軟體開發的時候軟體框架的選擇,是軟體架構設計中一個重要的決策,直接決定了軟體開發的直接效率,以及後續功能的實現程度。

目前除了ROS,還有很多類似的機器人軟體框架,包括Player、YARP、Orocos、CARMEN、Orca、MOOS,以及Microsoft Robotics Studio

為什麼使用ROS呢?我總結了下,ROS有四大優點:1、鬆散耦合的機制方便機器人軟體框架的組織;2、最豐富的機器人功能庫,方便快速搭建原型;3、非常便利的數據記錄、分析、模擬工具,方便調試;4、學界和產業界的標準,方便學習和交流。 使用一句話總結,使用ROS,能夠方便迅速地搭建好機器人原型。當然,它的性能不是最優的,但是這四條優點足以保障它在機器人操作系統裡面的地位。

然後,ROS比較好的一點是使用了BSD許可證,這是一個非常寬鬆的開放許可證,允許在商業和閉源產品使用,這對於開發產品的創業公司是比較重要的一點。

ROS是最龐大的使用者群體,是事實上的機器人標準,這是麻省理工在一篇文章中給出的評論。然後在2016年ROS大會數據顯示,目前在使用操作系統做開發的人員用戶超過35萬,其中活躍用戶美國占第一位,中國占第二位。

在學術研究領域,基本上機器人演算法都會給出ROS版本的源程序。最早在2009年ROS發布的「ROS: an open source Robot Operating System」 論文,目前已經被引用了2871次。

2016年官方支持ROS的機器人超過了100個。目前已經有很多機器人公司採用了ROS系統來開發一些應用於全新市場的產品,如ClearPath、Rethink、Unbounded、Neurala、Blue River、Big-i,最典型的就是Willow Garage的PR2機器人。投資機構也對創業公司給予了極大的支持,僅2015年相關風險投資機構就在基於ROS操作系統的機器人公司投資了超過1.5億美元。Nvidia、博世、高通、英特爾、寶馬以及大 疆等大公司也紛紛推出ROS介面。

這是ROS當前的代碼統計量,總行數已經超過了1400萬,超過2477名作者。代碼語言以C++為主,63.98%的代碼是用C++寫的,排名第二的是python,佔13.57% ,也就是說ROS基本上都是使用這兩種語言,可以實現大部分的功能。

應該學什麼

要想學ROS,應該從哪裡入手,它的先後順序是怎樣的呢?ROS由四大部分構成,第一個是基礎結構,這些通訊機制是如何實現的;第二個是工具,包括模擬工具、調試工具等;第三個是體現它功能的package;第四個就是社區,如何去上面下載、發布代碼,和其他開發者交流學習。

入門的話,首先要了解這四點:設計思想,核心概念,核心模塊,核心工具

ROS設計思想

設計思想主要是分散式架構,將機器人的功能和軟體,做成一個個節點,然後每個節點通過topic進行溝通,但你這些節點可以部署在同一台機器上,也可以部署在不同機器上,還可以部署在互聯網上。

ROS核心概念

ROS的核心概念主要是這幾個,首先是節點,然後是節點之間的通信和話題,通信的方式有兩種,一個是剛剛講的話題,一個是服務。那麼,如何管理ROS的這些節點和話題之間的溝通呢?這就需要用到Master,也就是ROS管理器,它還維持了一個參數的服務。而怎麼組織代碼,就是通過功能包集與功能包。

節點是各自獨立的可執行文件,能夠通過話題、服務或參數,與伺服器或其他進程(節點)通信。ROS通過使用節點的方式將代碼和功能解耦,提高了系統容錯能力和可維護性,使系統簡化。同時,節點允許了ROS系統能夠布置在任意多個機器上並同時運行。關於節點需要注意的事項,節點在系統中必須有唯一的名稱;節點可以使用不同的庫進行編寫,如roscpp和rospy,其中roscpp基於C++,rospy基於Python。

節點之間通過topic機制進行通信,topic機制是一個一對多的Publish/Subscribe 模式: 同一個話題也可以有很多個訂閱者,它的底層傳輸依靠的是TCP/IP,也可以是UDP。topic具體傳輸的message,具有一定的類型和數據結構,包括ROS提供的標準類型,和用戶自定義類型。

除了topic,ROS還提供另一種一對一的機制,也就是Service/Client,當你需要直接與節點通信並獲得應答時,將無法通過話題實現,這時需要使用該服務。

Master向ROS系統中其他節點提供命名和註冊服務,跟蹤和記錄話題的發布者和訂閱者,使ROS 節點之間能夠相互查找。一旦節點找到了彼此,就能建立一種點對點的通信方式。

那麼如何組織代碼呢?這主要依靠功能包(Package) ,ROS中軟體組織的基本形式,用於創建ROS程序。功能包包含源代碼和功能包清單(Manifest) 。功能包清單提供關於功能包、許可信息、依賴關係、編譯標誌等的信息。功能包清單是一個manifests.xml文件,通過這個文件能夠實現對功能包的管理。

核心模塊

ROS核心模塊包括通信結構基礎、機器人特性功能以及工具集,通信結構基礎包括消息傳遞、記錄和回放消息、遠程過程調用、分散式參數系統;機器人特性功能包括標準機器人消息,機器人幾何庫,機器人描述語言,搶佔式遠程過程調用,診斷,位資估計、定位與導航;工具集包括命令式工具、可視化工具以及圖形化介面。

核心工具

ROS擁有很多第三方的核心工具的支持,或者說Package。我們比較常見的是右邊這五個工具,Gazebo是一個三維模擬環境,OpenCV是大家非常熟悉的計算機視覺庫,PCL是點雲庫,MoveIt!是機械臂的規劃控制庫,Industrial是工業上會用的庫。左邊有三維模擬環境,另外兩個其中值得一提的是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具有非常強的數據存儲/回放功能,也就是使用bag存儲topic(例如現實中的感測器數據),以後調用bag的topic數據則不必每次都在現實中運行機器人,速度非常快。

ROS log系統記錄軟體運行相關信息,便於以後的調試。

怎麼學

首先,我們在學校學的是指導主義,也就是傳統的教學方式:老師講,學生聽,今天我在這兒其實也屬於這種模式吧,而這種模式的缺點在於開環或是閉環周期過長。另一種是建造主義,通過動手來學習,然後你可以得到實時反饋,你學到的知識就能形成一個閉環。當然,你還是要摸索出一個套路,這樣上手才能比較快。

學習步驟

當然,比較好的套路還是官網的那一套。首先按照官網的步驟安裝ROS,這個過程不要輕易問問題,因為教程里講得已經很明白了,大神們對這些問題也會比較鄙視,通常會笑而不語。另外,建議初學者一定要認真學完整20個初級教程!然後就此打住!那些中級教程就不要再看了,瀏覽下都有啥即可,以後遇到類似問題再回來看即可,這個時候你的重點就應該回到機器人學及其實踐上了,那20個初級教程都是可以在電腦上編程學習的,但不涉及機器人學。

接下來就應該運行真實的機器人、解決真實的問題。有的小夥伴就會問,沒有真實的機器人怎麼辦?當然也有辦法,你可以在模擬環境裡邊運行。

模擬環境由易到難主要有這三個:Turtlesim、ArbotiX、Gazebo。Turtlesim是一個QT開發的2D軌跡顯示界面,只能顯示運動軌跡;ArbotiX是含有一個差速驅動機器人的rviz模擬器,機器人運動及topic數據的3D顯示,但不包含物理學引擎;Gazebo是功能齊全的3D物理模擬器,不過缺點是非常重,對內存和顯卡要求高,慎入!

ROS版本那麼多,該用哪一個?

很多小夥伴會問,ROS版本那麼多,該用哪一個? 目前,ROS是一年推出一個版本。通過下載統計,我們發現現在使用最多的還是Indigo,所以對於初學者,建議還是使用這個版本,因為這是目前使用人數最多、坑最少的版本。而如果Linux編程能力比較強的,可以使用Kinetic,它可以一直支持到2021年。然後,你在選擇Ubuntu版本時,要與ROS版本需匹配。

命令行不熟悉怎麼辦? 有IDE

現在已經有很多IDE了,值得一提的是這個RoboWare Studio是我們中國團隊開發的一個開源IDE,目前剛剛推出64位版本。最近我也和RoboWare Studio的王博士交流了一下,他表示之後會推出32位版本,包括Arm集成開發環境的,而且承諾是免費的,以後也會在適當的時候開源。

不熟悉Linux怎麼辦?

其實學習ROS並不難,而很多小夥伴遇到的問題在於對於Linux不熟悉。這個只能邊用邊學了,遇到問題也要善用搜索,基本上這些問題都能在搜索中找到答案。教程推薦這兩個版本,一個是英文版本,一個中文版本。書的話,推薦《鳥哥的Linux私房菜》吧!

ROS和ROS2.0該學習哪個呢?

對於大眾學習者、普通開發者、機器人演算法開發者,在2017年仍推薦使用ROS。對於軟體架構的學習者、強調實時性的開發者,建議關注ROS2.0 。另外,我在知乎上對於這個問題也有詳細的回答,有興趣的可以去看看。

Q&A 環節

Q:請問除了ROS還有其他哪些常用的實時嵌入式操作系統?

A:關於機器人目前操作系統哪家強這個問題,目前已經形成了各個陣營,我們最近會組織一場辯論。主要是現在服務機器人用安卓的比較多。實時系統的話,我建議不要用ROS,因為ROS設計對象是家用移動智能機器人,當初的設計就不是針對實時控制的,不過ROS 2.0已經加入了實時性這個特性,大家可以關注一下。

Q:硬體方面有什麼要求呢?

A:剛才講了ROS它具備操作系統的特性,其中一個特性就是對於硬體的抽象,如果你用ROS的話,你不用過多關注底層硬體的東西,因為大家都是按照標準來做好封裝,你直接調用就OK,你主要的精力還是放在機器人系統的設計和演算法的開發上。

Q:您覺得ROS在目前火熱的自動駕駛領域應用前景如何?

A:據我所知,自動駕駛領域一些大企業也是用ROS開發的,它的最終產品不一定是基於ROS,但是研發階段我相信是會用到的,據所了解確實有一些是在用的。

Q:ROS未來能不能發展成完全替代Linux和Window?

A:ROS不會替代Linux和Window,它根本就是兩回事兒。Linux和Window是一個基本的操作系統,ROS是完全針對機器人的上層架構,它可以依賴於Linux和Window,當然2.0開始,也開始獨立地去工作。所以,你要搞清楚,哪些是ROS可以做,哪些是它不擅長的領域。

Q:像美國剛剛搞的蜂群無人機,在ROS上是否能實現?

A:目前用ROS開發不是很好實現,如果用ROS 2.0,應該是可以的。因為ROS它用在分散式系統上,一個比較大的問題是需要一個Master,分散式系統是不需要Master的,所以如果你非要用ROS的話,就有點彆扭。而ROS 2.0是沒有中心節點的,是沒有Master的,完全分散式架構,那應該適用於多機器人的應用場景。

編者按:關注雷鋒網機器人垂直欄目微信公眾號「新智造」,可獲取嘉賓完整PPT。

推薦閱讀:

請問《星球大戰:原力覺醒》中機器人BB-8是用什麼技術將頭和身體結合在一起的?身體滾動而頭可以不動?
人形機器人的研究的意義是什麼?
機器人dh坐標系的建立xi的方向不是應該指向下一個軸嗎,這裡的x2和x4為什麼不是這樣呢?
我們在將自己與他人歸類時是如何選擇「標籤」的?
Gowild 智能科技邱楠: 科技和娛樂結合的「琥珀·虛顏」將會成為 AI 皇冠上的明珠

TAG:机器人操作平台ROS | 机器人 | Linux |