Gmapping:這其實(shí)是在OpenSlam項(xiàng)目繼承過(guò)來(lái)的(后來(lái)發(fā)展和改動(dòng)較大),利用gmapping可以實(shí)現(xiàn)laser-basedSLAM,快速建立室內(nèi)二維地圖。
△gmapping建立二維地圖
Localization:基于擴(kuò)展卡爾曼濾波(EKF)和無(wú)跡卡爾曼濾波(UKF)的機(jī)器人定位算法,可以融合各種傳感器的定位信息,獲得較為準(zhǔn)確的定位效果。
△robot_localization示意圖
Navigation:基于Dijkstra、A*算法(全局規(guī)劃器)和動(dòng)態(tài)窗口法DWA(局部規(guī)劃器)的移動(dòng)機(jī)器人路徑規(guī)劃模塊,可以在二維地圖上實(shí)現(xiàn)機(jī)器人導(dǎo)航。
△navigation示意圖
MoveIt:這個(gè)是專(zhuān)注于移動(dòng)機(jī)械臂運(yùn)動(dòng)規(guī)劃的模塊,下次講運(yùn)動(dòng)規(guī)劃入門(mén)的時(shí)候再詳細(xì)介紹它。
△MoveIt對(duì)UR5進(jìn)行運(yùn)動(dòng)規(guī)劃
當(dāng)然,除了這些最先進(jìn)算法外,ROS還有各種機(jī)器人、傳感器驅(qū)動(dòng)等內(nèi)容。
5、是一個(gè)最活躍的機(jī)器人開(kāi)發(fā)交流平臺(tái)
個(gè)人認(rèn)為,這應(yīng)該是最重要的一點(diǎn)。除了ROS外,現(xiàn)在有需要其他的項(xiàng)目可以代替或者部分代替ROS的功能:OpenRave運(yùn)動(dòng)規(guī)劃,V-rep仿真。但是這些項(xiàng)目的社區(qū)遠(yuǎn)沒(méi)有ROS活躍。
ROS版本定期更新、主要模塊有專(zhuān)人維護(hù)、問(wèn)答區(qū)活躍、各maillists也非常活躍、開(kāi)發(fā)者非常熱衷交流分享。如果深入到ROS社區(qū),可以學(xué)到很多東西。
為什么
首先,用過(guò)工業(yè)機(jī)器人的人肯定知道,不同工業(yè)機(jī)器人的開(kāi)發(fā)系統(tǒng)基本都不一樣,示教、編程方法也不同,一個(gè)熟練使用Motoman的工程師很可能并不會(huì)使用Kuka機(jī)械臂。就算是同種機(jī)器人,由于固件版本的更新?lián)Q代,也可能造成程序的不兼容(我在UR上就遇到過(guò)這個(gè)問(wèn)題)。這就大大影響了機(jī)器人的推廣普及。
△左:不同機(jī)器人的示教器;右:UR固件版本不兼容
對(duì)此,ROS可以用統(tǒng)一的方式來(lái)封裝機(jī)器人(URDF模型+機(jī)器人驅(qū)動(dòng)),用戶只需要在ROS中編寫(xiě)應(yīng)用程序,并不用關(guān)心機(jī)器人的控制方式。如果所有機(jī)器人都采用了這種方式,那么機(jī)器人必將得到更廣泛地應(yīng)用(對(duì)系統(tǒng)集成商的要求會(huì)降低)。
其次,現(xiàn)在越來(lái)越多機(jī)器人廠商開(kāi)始嘗試使用ROS,包括占據(jù)最多工業(yè)市場(chǎng)份額的機(jī)器人四大家族和各種流行的研究型機(jī)器人;甚至有如Rethink的Baxter,只能使用ROS控制。研究機(jī)器人的如果不去學(xué)習(xí)ROS的話,以后可能就會(huì)面臨不會(huì)使用機(jī)器人的問(wèn)題。
△使用ROS的機(jī)器人
再者,機(jī)器人是一個(gè)復(fù)雜且涉及面極廣的學(xué)科,從下往上包括機(jī)械設(shè)計(jì)、電機(jī)控制、傳感器、軌跡規(guī)劃、運(yùn)動(dòng)學(xué)與動(dòng)力學(xué)、運(yùn)動(dòng)規(guī)劃、機(jī)器視覺(jué)、定位導(dǎo)航、機(jī)器學(xué)習(xí)、高級(jí)智能等等。一個(gè)研究生基本不可能在幾年時(shí)間內(nèi)掌握所有領(lǐng)域。
對(duì)于一個(gè)做上層規(guī)劃的研究生,如果不用ROS的話,往往需要花費(fèi)非常長(zhǎng)時(shí)間用于搭建實(shí)驗(yàn)系統(tǒng),從而大大擠壓了真正用在發(fā)明新知識(shí)的時(shí)間。例如,我做運(yùn)動(dòng)規(guī)劃,就必須先把機(jī)械臂運(yùn)動(dòng)學(xué)正逆解、物體識(shí)別算法、碰撞檢測(cè)算法等完成才有可能開(kāi)始做運(yùn)動(dòng)規(guī)劃。造輪子的事就交給專(zhuān)業(yè)造輪子的人做吧。
所以,對(duì)于科研人員來(lái)說(shuō),ROS可以幫助你快速搭建機(jī)器人軟件系統(tǒng),同時(shí)其模塊化的設(shè)計(jì)可以讓你方便地用自己的算法替換其中某一模塊,讓你專(zhuān)注于自己的研究點(diǎn)。
最后,就是對(duì)于創(chuàng)業(yè)或者參加比賽的人來(lái)說(shuō),ROS可以幫助你快速搭建原型樣機(jī)。原型樣機(jī)出來(lái)了,自然比只有設(shè)計(jì)說(shuō)明書(shū)的人有優(yōu)勢(shì)。
為防止做廣告嫌疑,創(chuàng)業(yè)的例子就不說(shuō)了,就拿我們?nèi)ツ陞⒓拥囊粋€(gè)創(chuàng)業(yè)大賽來(lái)講。我們組四個(gè)人用了不到兩個(gè)月時(shí)間完成了下面這個(gè)超市購(gòu)物機(jī)器人的軟硬件設(shè)計(jì)與制作,功能包括避障、防跌、人員跟隨、藍(lán)牙校正(跟蹤對(duì)的人)、手勢(shì)識(shí)別、商品自動(dòng)計(jì)價(jià)、自動(dòng)支付等。
嗯,我的公眾號(hào)Nao(qRobotics)的頭像就是在這個(gè)項(xiàng)目時(shí)設(shè)計(jì)的。
△去年參加某創(chuàng)業(yè)大賽的作品MarketBot
如何
這方面已經(jīng)可以找到很多答案了,但是學(xué)習(xí)這種東西只能靠自己多練習(xí)了,我只簡(jiǎn)單從我個(gè)人角度給出幾個(gè)建議吧。
首先,就是要先了解ROS的基本架構(gòu)和開(kāi)發(fā)方式。我個(gè)人是強(qiáng)烈推薦直接看ROS官網(wǎng)上的教程ROS/Tutorials的BeginnerLevel(多看幾遍),同時(shí)充分使用ROS的問(wèn)答社區(qū)ROSAnswers與各模塊的MailLists,很多基礎(chǔ)問(wèn)題可能前人都遇到過(guò)。
其次,在了解ROS的基本架構(gòu)與開(kāi)發(fā)方式后,就可以有針對(duì)性地看自己所關(guān)心的部分了。如做移動(dòng)機(jī)器人的同學(xué)就去看Navigation教程;做物體識(shí)別的就去看ORK教程;做運(yùn)動(dòng)規(guī)劃的就去看MoveIt教程。這一步最好能跟有實(shí)際機(jī)器人練手(如果沒(méi)有的話,就用gazebo仿真)。由于一些模塊的教程不夠清楚(如MoveIt),一定要多練習(xí),甚至是去看部分源碼,先保證自己會(huì)用ROS實(shí)現(xiàn)一些功能。
對(duì)于ROS與實(shí)際機(jī)器人的連接,建議仔細(xì)看看action(編寫(xiě)機(jī)器人驅(qū)動(dòng)package)、URDF(機(jī)器人描述文件)的教程(或者ros_control)。如下圖,我為SDA5F機(jī)器人編寫(xiě)了URDF文件,并修改了motoman_driver中的action,使得在ROS環(huán)境中用MoveIt規(guī)劃控制雙臂機(jī)器人運(yùn)動(dòng)。
△SDA5F雙臂機(jī)器人與其URDF模型
最后,就是進(jìn)階階段了。我要強(qiáng)調(diào)一句“ROS只是一個(gè)工具”,你會(huì)用ROS做SLAM并不能說(shuō)明你會(huì)做SLAM。對(duì)于自己研究的內(nèi)容,必須沉下心去看教材和論文,去理解每種算法背后的原理,知道如何調(diào)整算法參數(shù)、如何改進(jìn)算法,最終能夠自己編寫(xiě)某部分代碼,并替換ROS的相應(yīng)模塊(如自己寫(xiě)運(yùn)動(dòng)學(xué)正逆解替代KDL等)。
做研究,交流非常重要。如果你改進(jìn)ROS某一算法后,最好能與package的原作者交流,將自己的修改merge到原項(xiàng)目中,在交流中提高自己與package的水平。當(dāng)然,如果對(duì)算法有疑問(wèn),也可以直接咨詢作者,ROS里的貢獻(xiàn)者大都非常愿意分享和交流。
當(dāng)然,在問(wèn)別人之前,請(qǐng)一定要保證自己充分熟悉了官方Tutorials,而不是朝別人發(fā)一堆編譯錯(cuò)誤截圖,然后問(wèn)這是怎么回事。提問(wèn)的藝術(shù)真的非常重要,有時(shí)候不是對(duì)方不愿意跟你交流,而是對(duì)方不愿意手把手帶你過(guò)Tutorials。
結(jié)尾
很多人在爭(zhēng)論是否應(yīng)該使用ROS、是否應(yīng)該在產(chǎn)品上使用ROS、是否應(yīng)該在工業(yè)中使用ROS。但是從我個(gè)人的角度上看,ROS對(duì)于服務(wù)機(jī)器人上層算法開(kāi)發(fā)和研究而言是一個(gè)很棒的工具,作為學(xué)術(shù)研究使用的話,可以大大加快實(shí)驗(yàn)平臺(tái)搭建過(guò)程。