Gmapping:這其實是在OpenSlam項目繼承過來的(后來發(fā)展和改動較大),利用gmapping可以實現(xiàn)laser-basedSLAM,快速建立室內(nèi)二維地圖。

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

△robot_localization示意圖
Navigation:基于Dijkstra、A*算法(全局規(guī)劃器)和動態(tài)窗口法DWA(局部規(guī)劃器)的移動機器人路徑規(guī)劃模塊,可以在二維地圖上實現(xiàn)機器人導(dǎo)航。

△navigation示意圖
MoveIt:這個是專注于移動機械臂運動規(guī)劃的模塊,下次講運動規(guī)劃入門的時候再詳細介紹它。

△MoveIt對UR5進行運動規(guī)劃
當然,除了這些最先進算法外,ROS還有各種機器人、傳感器驅(qū)動等內(nèi)容。
5、是一個最活躍的機器人開發(fā)交流平臺
個人認為,這應(yīng)該是最重要的一點。除了ROS外,現(xiàn)在有需要其他的項目可以代替或者部分代替ROS的功能:OpenRave運動規(guī)劃,V-rep仿真。但是這些項目的社區(qū)遠沒有ROS活躍。
ROS版本定期更新、主要模塊有專人維護、問答區(qū)活躍、各maillists也非常活躍、開發(fā)者非常熱衷交流分享。如果深入到ROS社區(qū),可以學(xué)到很多東西。
為什么
首先,用過工業(yè)機器人的人肯定知道,不同工業(yè)機器人的開發(fā)系統(tǒng)基本都不一樣,示教、編程方法也不同,一個熟練使用Motoman的工程師很可能并不會使用Kuka機械臂。就算是同種機器人,由于固件版本的更新?lián)Q代,也可能造成程序的不兼容(我在UR上就遇到過這個問題)。這就大大影響了機器人的推廣普及。

△左:不同機器人的示教器;右:UR固件版本不兼容
對此,ROS可以用統(tǒng)一的方式來封裝機器人(URDF模型+機器人驅(qū)動),用戶只需要在ROS中編寫應(yīng)用程序,并不用關(guān)心機器人的控制方式。如果所有機器人都采用了這種方式,那么機器人必將得到更廣泛地應(yīng)用(對系統(tǒng)集成商的要求會降低)。
其次,現(xiàn)在越來越多機器人廠商開始嘗試使用ROS,包括占據(jù)最多工業(yè)市場份額的機器人四大家族和各種流行的研究型機器人;甚至有如Rethink的Baxter,只能使用ROS控制。研究機器人的如果不去學(xué)習(xí)ROS的話,以后可能就會面臨不會使用機器人的問題。

△使用ROS的機器人
再者,機器人是一個復(fù)雜且涉及面極廣的學(xué)科,從下往上包括機械設(shè)計、電機控制、傳感器、軌跡規(guī)劃、運動學(xué)與動力學(xué)、運動規(guī)劃、機器視覺、定位導(dǎo)航、機器學(xué)習(xí)、高級智能等等。一個研究生基本不可能在幾年時間內(nèi)掌握所有領(lǐng)域。
對于一個做上層規(guī)劃的研究生,如果不用ROS的話,往往需要花費非常長時間用于搭建實驗系統(tǒng),從而大大擠壓了真正用在發(fā)明新知識的時間。例如,我做運動規(guī)劃,就必須先把機械臂運動學(xué)正逆解、物體識別算法、碰撞檢測算法等完成才有可能開始做運動規(guī)劃。造輪子的事就交給專業(yè)造輪子的人做吧。
所以,對于科研人員來說,ROS可以幫助你快速搭建機器人軟件系統(tǒng),同時其模塊化的設(shè)計可以讓你方便地用自己的算法替換其中某一模塊,讓你專注于自己的研究點。
最后,就是對于創(chuàng)業(yè)或者參加比賽的人來說,ROS可以幫助你快速搭建原型樣機。原型樣機出來了,自然比只有設(shè)計說明書的人有優(yōu)勢。
為防止做廣告嫌疑,創(chuàng)業(yè)的例子就不說了,就拿我們?nèi)ツ陞⒓拥囊粋€創(chuàng)業(yè)大賽來講。我們組四個人用了不到兩個月時間完成了下面這個超市購物機器人的軟硬件設(shè)計與制作,功能包括避障、防跌、人員跟隨、藍牙校正(跟蹤對的人)、手勢識別、商品自動計價、自動支付等。
嗯,我的公眾號Nao(qRobotics)的頭像就是在這個項目時設(shè)計的。

△去年參加某創(chuàng)業(yè)大賽的作品MarketBot
如何
這方面已經(jīng)可以找到很多答案了,但是學(xué)習(xí)這種東西只能靠自己多練習(xí)了,我只簡單從我個人角度給出幾個建議吧。
首先,就是要先了解ROS的基本架構(gòu)和開發(fā)方式。我個人是強烈推薦直接看ROS官網(wǎng)上的教程ROS/Tutorials的BeginnerLevel(多看幾遍),同時充分使用ROS的問答社區(qū)ROSAnswers與各模塊的MailLists,很多基礎(chǔ)問題可能前人都遇到過。
其次,在了解ROS的基本架構(gòu)與開發(fā)方式后,就可以有針對性地看自己所關(guān)心的部分了。如做移動機器人的同學(xué)就去看Navigation教程;做物體識別的就去看ORK教程;做運動規(guī)劃的就去看MoveIt教程。這一步最好能跟有實際機器人練手(如果沒有的話,就用gazebo仿真)。由于一些模塊的教程不夠清楚(如MoveIt),一定要多練習(xí),甚至是去看部分源碼,先保證自己會用ROS實現(xiàn)一些功能。
對于ROS與實際機器人的連接,建議仔細看看action(編寫機器人驅(qū)動package)、URDF(機器人描述文件)的教程(或者ros_control)。如下圖,我為SDA5F機器人編寫了URDF文件,并修改了motoman_driver中的action,使得在ROS環(huán)境中用MoveIt規(guī)劃控制雙臂機器人運動。

△SDA5F雙臂機器人與其URDF模型
最后,就是進階階段了。我要強調(diào)一句“ROS只是一個工具”,你會用ROS做SLAM并不能說明你會做SLAM。對于自己研究的內(nèi)容,必須沉下心去看教材和論文,去理解每種算法背后的原理,知道如何調(diào)整算法參數(shù)、如何改進算法,最終能夠自己編寫某部分代碼,并替換ROS的相應(yīng)模塊(如自己寫運動學(xué)正逆解替代KDL等)。
做研究,交流非常重要。如果你改進ROS某一算法后,最好能與package的原作者交流,將自己的修改merge到原項目中,在交流中提高自己與package的水平。當然,如果對算法有疑問,也可以直接咨詢作者,ROS里的貢獻者大都非常愿意分享和交流。
當然,在問別人之前,請一定要保證自己充分熟悉了官方Tutorials,而不是朝別人發(fā)一堆編譯錯誤截圖,然后問這是怎么回事。提問的藝術(shù)真的非常重要,有時候不是對方不愿意跟你交流,而是對方不愿意手把手帶你過Tutorials。
結(jié)尾
很多人在爭論是否應(yīng)該使用ROS、是否應(yīng)該在產(chǎn)品上使用ROS、是否應(yīng)該在工業(yè)中使用ROS。但是從我個人的角度上看,ROS對于服務(wù)機器人上層算法開發(fā)和研究而言是一個很棒的工具,作為學(xué)術(shù)研究使用的話,可以大大加快實驗平臺搭建過程。











