史星彥,關(guān)志偉,彭 濤,吳 迪,胡樂(lè)媛,蔡一杰
(天津職業(yè)技術(shù)師范大學(xué)汽車(chē)與交通學(xué)院,天津300222)
智能小車(chē)在物流、家庭服務(wù)、工業(yè)等領(lǐng)域廣泛應(yīng)用。但室內(nèi)移動(dòng)智能小車(chē)的普及,還存在著許多問(wèn)題需要解決,如準(zhǔn)確定位、精確構(gòu)建地圖、實(shí)時(shí)路徑規(guī)劃等。為解決上訴問(wèn)題,近幾十年的研究提出了許多有效的解決方案,如自適應(yīng)蒙特卡羅定位算法,即時(shí)定位與地圖構(gòu)建,動(dòng)態(tài)窗口局部路徑規(guī)劃算法,A*全局路徑規(guī)劃算法等。
2010年Willow Garage公司發(fā)布了開(kāi)源機(jī)器人操作系統(tǒng)ROS,大大增加了移動(dòng)智能小車(chē)在軟件上的復(fù)用性和移植性和提高了軟件的兼容性。本文基于ROS系統(tǒng),介紹了一種自動(dòng)導(dǎo)航避障兼跟隨功能實(shí)現(xiàn)的基本方法,并在此基礎(chǔ)上設(shè)計(jì)了一款結(jié)構(gòu)簡(jiǎn)單、低成本和通用性良好的多功能室內(nèi)移動(dòng)智能小車(chē)。
智能小車(chē)通常通過(guò)激光雷達(dá)和視覺(jué)等傳感器掃描周?chē)鷮?shí)時(shí)環(huán)境,并且實(shí)時(shí)估計(jì)自身在環(huán)境中的位置,并通過(guò)基本的建圖算法構(gòu)建2D的柵格地圖模型[1]。在此基礎(chǔ)上根據(jù)構(gòu)建好的2D柵格地圖規(guī)劃出從起點(diǎn)到終點(diǎn)的最佳全局路徑和行駛。在途中小車(chē)可能會(huì)碰到實(shí)時(shí)障礙物,則需要進(jìn)行局部路徑規(guī)劃以避開(kāi)障礙物。
為實(shí)現(xiàn)上述功能,本文設(shè)計(jì)的小車(chē)通過(guò)激光雷達(dá)和里程計(jì)等傳感器來(lái)獲取信息,并傳給裝有ROS系統(tǒng)的小車(chē)工控機(jī),然后采用常用的Gmapping建圖算法構(gòu)建地圖[2],基于自適應(yīng)蒙特卡羅定位法(AMCL)定位[3]與全局和局部路徑規(guī)劃[4]進(jìn)行小車(chē)從起點(diǎn)到終點(diǎn)的導(dǎo)航。并基于ROS系統(tǒng)的Python編程實(shí)現(xiàn)了智能小車(chē)對(duì)最近目標(biāo)的跟隨功能[5]。
小車(chē)采用小型工控機(jī)作為上位機(jī),STM32嵌入式單片機(jī)為下位機(jī),主要分為硬件和軟件兩大部分。硬件方面有小車(chē)底座、上位機(jī)、激光雷達(dá)、攝像頭、和小車(chē)底層控制板STM32的選擇與安裝。軟件方面包括編寫(xiě)小車(chē)底層控制板與工控機(jī)之間的基于ROS接口等相關(guān)程序,開(kāi)發(fā)相關(guān)功能包,從而實(shí)現(xiàn)建圖導(dǎo)航等功能,進(jìn)一步編寫(xiě)相關(guān)Linux相關(guān)腳本和啟動(dòng)文件等。總體框架和控制、數(shù)據(jù)傳輸路線(xiàn)如圖1所示,硬件連接如圖2所示。
圖1 總體基本框架
圖2 硬件連接示意圖
最底層采用長(zhǎng)方形鋁合金結(jié)構(gòu)作為小車(chē)底座,其目的是鋁合金材料質(zhì)輕且柔軟,強(qiáng)度和耐腐蝕性各方面都比較優(yōu)秀,可放置電機(jī)和轉(zhuǎn)向舵機(jī)等。底座上方為多層靜電防護(hù)亞克力板,可放置STM32嵌入式單片機(jī),激光雷達(dá)和攝像頭等設(shè)備。上位機(jī)采用Ubuntu16.04系統(tǒng)并且安裝ROS系統(tǒng),為保證程序處理和運(yùn)算速度,為后續(xù)加入更多模塊,并且考慮重量、成本、體積、性?xún)r(jià)比等因素,選用i5處理器配合4G運(yùn)行內(nèi)存的小型工控機(jī)來(lái)運(yùn)行ROS系統(tǒng)。
本智能小車(chē)設(shè)計(jì)主要是應(yīng)用于室內(nèi)環(huán)境,活動(dòng)范圍小,因此對(duì)傳感器要求不高。
(1)激光雷達(dá)
激光雷達(dá)主要采集用來(lái)構(gòu)建2D柵格地圖的深度信息,按激光線(xiàn)束分為單線(xiàn)和多線(xiàn)。可以360°全方位的采集周?chē)嚯x信息。采用低成本單線(xiàn)激光雷達(dá)Rplidar a1為宜。該雷達(dá)為思嵐公司生產(chǎn),價(jià)格低廉,可靠性高,能夠確保二維柵格地圖構(gòu)建的質(zhì)量,具體技術(shù)參數(shù)見(jiàn)表1。
表1 Rplidar A1技術(shù)參數(shù)
(2)深度相機(jī)
采用樂(lè)視Astra Pro三合一體感深度相機(jī),能夠以圖像形式探測(cè)周?chē)h(huán)境,精度高。主要由RGB攝像頭和紅外線(xiàn)發(fā)射器等組成分別用于生成彩色圖像和獲取圖像深度信息,因此可以模擬出立體視覺(jué)效果。深度相機(jī)不僅可以高清晰地成像,還能獲得物體的深度信息。因此也可用于構(gòu)建二維柵格地圖。具體技術(shù)參數(shù)見(jiàn)表2。
表2 深度相機(jī)技術(shù)參數(shù)
STM32是一種應(yīng)用廣泛嵌入式處理器,是一款屬于ARM公司的Cortex-M內(nèi)核的32位微控制器,本文具體采用高性能STM32F407芯片作為底層控制驅(qū)動(dòng)板,如圖3所示為小車(chē)下位機(jī)控制板,具有4路直流電機(jī)和電機(jī)驅(qū)動(dòng)4路AB相編碼器接口1路USB串口接口3路TTL串口接口1路超時(shí)傳感器接口1路遙控器手柄接口1路9自由度IMU。通過(guò)編寫(xiě)與上位機(jī)接口程序,接收來(lái)自上位機(jī)的控制命令。
圖3 小車(chē)下位機(jī)控制板
ROS是一個(gè)用于編寫(xiě)機(jī)器人軟件的靈活框架,它集成了大量的工具、庫(kù)、協(xié)議等。ROS架構(gòu)可以分成三層操作系統(tǒng)層、中間層和應(yīng)用層。從系統(tǒng)實(shí)現(xiàn)的角度看,ROS也可以分為計(jì)算圖、文件系統(tǒng)、和開(kāi)源社區(qū)三個(gè)層次[6-7]。
從計(jì)算圖來(lái)看小車(chē)的軟件系統(tǒng)以節(jié)點(diǎn)為單位獨(dú)立運(yùn)行,并且通過(guò)端對(duì)端的拓?fù)浣Y(jié)構(gòu)進(jìn)行連接,根據(jù)節(jié)點(diǎn)之間的通信關(guān)系設(shè)計(jì)通信模式。節(jié)點(diǎn)為一些執(zhí)行運(yùn)算任務(wù)的進(jìn)程,可以稱(chēng)之為軟件模塊。
文件系統(tǒng)是在ROS中用來(lái)管理和組織源代碼,不同功能的文件被放置在不同的文件夾下,是開(kāi)發(fā)者基于ROS進(jìn)行相關(guān)功能軟件設(shè)計(jì)開(kāi)發(fā)的重點(diǎn)部分,相關(guān)功能包算法源代碼就是存放在文件系統(tǒng)中。
工作空間和功能包括:工作空間是存放源代碼、腳本語(yǔ)言、等文件的文件夾。功能包是完成一項(xiàng)具體功能的代碼,腳本,配置文件,編譯規(guī)則等信息的集合。在ROS框架下修改節(jié)點(diǎn)之間通信接口程序,即可使用相關(guān)功能包模塊。如果使用個(gè)人編寫(xiě)的功能包來(lái)實(shí)現(xiàn)特定的二次開(kāi)發(fā)功能,則需要對(duì)功能包進(jìn)行編譯和執(zhí)行。除功能包開(kāi)發(fā)之外,開(kāi)發(fā)者可在ROS中編寫(xiě)相關(guān)Launch文件快速運(yùn)行多個(gè)節(jié)點(diǎn),并且自動(dòng)配置參數(shù)以達(dá)到操作簡(jiǎn)便的目的[8]。
在本小車(chē)軟件系統(tǒng)中,所有的節(jié)點(diǎn)、相關(guān)配置以及啟動(dòng)文件均在功能包中實(shí)現(xiàn)。下文對(duì)小車(chē)在ROS框架中的軟件模塊做具體介紹。
根據(jù)小車(chē)所要實(shí)現(xiàn)的功能,在ROS下主要搭建了以下幾個(gè)重要軟件模塊節(jié)點(diǎn)。
(1)建圖節(jié)點(diǎn):用來(lái)提供智能小車(chē)建圖的算法,在ROS開(kāi)源社區(qū)中有多種SLAM算法功能包,如Gmapping、Hector等算法,可在此基礎(chǔ)上進(jìn)行二次開(kāi)發(fā)或直接使用,其中基于Rbpf粒子濾波的開(kāi)源SLAM算法Gmapping[9]是其中最為常用和成熟的地圖構(gòu)建算法,其框架如圖4所示。
圖4 Gmapping總體框架
Gmapping功能包構(gòu)成了小車(chē)的建圖節(jié)點(diǎn),用來(lái)訂閱小車(chē)采集到的深度信息、IMU信息和里程計(jì)信息,在ROS中完成一些必要參數(shù)的配置,即可用該功能包構(gòu)建出一張基于概率的二維柵格地圖。相比Hector建圖算法對(duì)激光雷達(dá)頻率要求更低、魯棒性更高,地圖構(gòu)建精度高,構(gòu)建小場(chǎng)景地圖所需要的計(jì)算量較小。因此非常適合室內(nèi)移動(dòng)智能小車(chē)的地圖構(gòu)建。
(2)導(dǎo)航功能包節(jié)點(diǎn):該節(jié)點(diǎn)主要為智能小車(chē)提供路徑規(guī)劃和小車(chē)定位兩個(gè)算法,在ROS中主要由Move_base功能包和AMCL功能包來(lái)完成,前者用來(lái)實(shí)現(xiàn)智能小車(chē)的路徑規(guī)劃。后者用來(lái)實(shí)現(xiàn)二維地圖中的智能小車(chē)的定位,該定位一種概率定位[10],以2D方式對(duì)小車(chē)定位,它實(shí)現(xiàn)了自適應(yīng)(或者KLD-采樣)蒙特卡洛定位法,使用粒子濾波跟蹤智能小車(chē)在已知地圖中的位姿,最后由Move_base功能包發(fā)布速度控制話(huà)題給智能小車(chē)驅(qū)動(dòng)節(jié)點(diǎn)來(lái)控制小車(chē)移動(dòng)。如圖5所示為小車(chē)導(dǎo)航框架。
圖5 小車(chē)導(dǎo)航框架
全局路徑規(guī)劃:全局路徑規(guī)劃是根據(jù)給定的目標(biāo)位置和全局地圖進(jìn)行總體路徑的規(guī)劃。在導(dǎo)航中,使用Dijkstra或A*算法進(jìn)行全局路徑的規(guī)劃,計(jì)算出小車(chē)到目標(biāo)位置的最優(yōu)路線(xiàn),作為小車(chē)的全局路線(xiàn)。
本地實(shí)時(shí)規(guī)劃:又稱(chēng)為局部路徑規(guī)劃,往往由于動(dòng)態(tài)障礙物的出現(xiàn),智能小車(chē)無(wú)法嚴(yán)格按照全局路線(xiàn)行駛,否則會(huì)碰到障礙物。使用動(dòng)態(tài)窗口算法(DWA)搜索躲避動(dòng)態(tài)障礙物的多條路經(jīng),根據(jù)是否會(huì)撞擊障礙物,和所需要的時(shí)間的長(zhǎng)短作為評(píng)價(jià)標(biāo)準(zhǔn)選取最優(yōu)路徑,同時(shí)計(jì)算行駛周期內(nèi)的線(xiàn)速度和角速度,在ROS中以Geometry_msgs/Twist類(lèi)型發(fā)布速度話(huà)題控制命令傳給小車(chē)驅(qū)動(dòng)節(jié)點(diǎn),該節(jié)點(diǎn)訂閱該話(huà)題信息,并且解析命令中的線(xiàn)速度、角速度完成小車(chē)相應(yīng)的運(yùn)動(dòng),避免與動(dòng)態(tài)出現(xiàn)的障礙物發(fā)生碰撞。
(3)跟隨功能包節(jié)點(diǎn):使用Python語(yǔ)言實(shí)現(xiàn),由于Python語(yǔ)言是一種解釋型語(yǔ)言,不需要編譯,在ROS框架下編寫(xiě)好后直接在Linux終端執(zhí)行即可,使用方便。該節(jié)點(diǎn)提供一種簡(jiǎn)單的跟隨算法,跟隨距離智能小車(chē)最近的物體,跟隨前確保被跟隨物體離智能小車(chē)最近,再運(yùn)行功能包。智能小車(chē)通過(guò)激光雷達(dá)掃描到最近的物體,根據(jù)設(shè)定的距離,同樣以Geometry_msgs/Twist類(lèi)型發(fā)布速度話(huà)題控制命令傳給小車(chē)驅(qū)動(dòng)節(jié)點(diǎn),完成小車(chē)的相應(yīng)運(yùn)動(dòng)。如圖6為小車(chē)?yán)走_(dá)跟隨框架。
圖6 雷達(dá)跟隨簡(jiǎn)單框架
(4)智能小車(chē)驅(qū)動(dòng)節(jié)點(diǎn):該節(jié)點(diǎn)主要用于小車(chē)控制板與工控機(jī)(上位機(jī))之間的通訊,如訂閱導(dǎo)航避障節(jié)點(diǎn)發(fā)布速度控制話(huà)題消息,進(jìn)一步驅(qū)動(dòng)電機(jī)讓小車(chē)移動(dòng)。
(6)激光雷達(dá)節(jié)點(diǎn):ROS在Sensor_msgs包中定義了專(zhuān)用數(shù)據(jù)類(lèi)型LaserScan,該類(lèi)型用來(lái)存儲(chǔ)了單線(xiàn)激光雷達(dá)所掃描的消息,激光雷達(dá)以ROS中話(huà)題的通信形式發(fā)布出去,供其他節(jié)點(diǎn)訂閱,如建圖節(jié)點(diǎn)和導(dǎo)航節(jié)點(diǎn)。
基于以上設(shè)計(jì)構(gòu)建如圖7所示的智能小車(chē)進(jìn)行實(shí)驗(yàn)。
圖7 智能小車(chē)
選定在一般普通室內(nèi)環(huán)境實(shí)驗(yàn),其地面平整,有相關(guān)凸起物可以被激光雷達(dá)掃描到。
開(kāi)啟小車(chē)電源后,啟動(dòng)相關(guān)功能包節(jié)點(diǎn),通過(guò)鍵盤(pán)控制小車(chē)移動(dòng),小車(chē)在移動(dòng)的過(guò)程通過(guò)激光雷達(dá)來(lái)實(shí)時(shí)掃描周?chē)h(huán)境,并且進(jìn)行自身定位,并通過(guò)Gmapping算法構(gòu)建2D增量式地圖。并將及時(shí)構(gòu)建好的地圖數(shù)據(jù)通過(guò)無(wú)線(xiàn)網(wǎng)傳輸?shù)絺€(gè)人終端上顯示。圖8為開(kāi)始構(gòu)建地圖階段,圖中箭頭指示分別為激光雷達(dá)掃描線(xiàn)和障礙物輪廓線(xiàn),圖9為構(gòu)建完畢后的效果圖,因?yàn)槎ㄎ痪鹊仍颍貓D構(gòu)建過(guò)程中時(shí)常有激光雷達(dá)掃描線(xiàn)和障礙物輪廓線(xiàn)不完全重合的情況,總體上和實(shí)際環(huán)境相差不大。
圖8 構(gòu)建地圖開(kāi)始階段
圖9 構(gòu)建完畢的地圖
2D地圖構(gòu)建好后,可以在地圖上進(jìn)行任意兩點(diǎn)之間的導(dǎo)航功能。將小車(chē)放在設(shè)定好的起點(diǎn)后,指定一個(gè)終點(diǎn),小車(chē)進(jìn)行全局路徑規(guī)劃,并沿著全局規(guī)劃路徑向指定位置移動(dòng),在移動(dòng)的過(guò)程中,如遇到臨時(shí)障礙物,局部代價(jià)地圖則修正路線(xiàn)使小車(chē)沿著局部規(guī)劃路徑安全避開(kāi)障礙。實(shí)驗(yàn)效果如圖10所示,表明小車(chē)能夠很好地進(jìn)行路徑規(guī)劃并避開(kāi)動(dòng)態(tài)障礙物,最終到達(dá)目標(biāo)點(diǎn)。
圖10 小車(chē)導(dǎo)航功能
將實(shí)驗(yàn)環(huán)境改為平整附著系數(shù)良好的路面。啟動(dòng)相關(guān)功能包節(jié)點(diǎn)實(shí)現(xiàn)小車(chē)對(duì)最近距離物體的跟隨功能。如圖11所示為雷達(dá)跟隨效果圖,圖中后方小車(chē)跟隨前方小車(chē)移動(dòng)而移動(dòng)。并且保持一定的距離。結(jié)果表明小車(chē)具有良好的跟隨功能,因?yàn)樾≤?chē)只能跟隨最近距離物體,在抗干擾上面還有待改進(jìn)。
圖11 雷達(dá)跟隨
本文運(yùn)用新一代機(jī)器人操作系統(tǒng)ROS來(lái)開(kāi)發(fā)智能移動(dòng)小車(chē),設(shè)計(jì)了一種簡(jiǎn)單的基于ROS的智能小車(chē)自主建圖導(dǎo)航和雷達(dá)跟隨的方法。實(shí)驗(yàn)表明該方法能夠清晰地構(gòu)建2D柵格地圖和完成導(dǎo)航功能,及平整路面上的最近目標(biāo)的跟隨功能。實(shí)現(xiàn)了一種低成本、高性能的室內(nèi)移動(dòng)智能小車(chē)定位與導(dǎo)航簡(jiǎn)單設(shè)計(jì)方案。可用于ROS框架和移動(dòng)小車(chē)的基礎(chǔ)實(shí)驗(yàn)等。
使用ROS開(kāi)發(fā)移動(dòng)智能小車(chē)具有很高的開(kāi)放性和擴(kuò)展性,能進(jìn)行跨平臺(tái)開(kāi)發(fā),可用該系統(tǒng)開(kāi)發(fā)機(jī)械臂等;系統(tǒng)集合多種功能完善功能包,使得只需在ROS框架下編寫(xiě)相關(guān)程序和調(diào)整相關(guān)參數(shù)等,就能快速開(kāi)發(fā)出具有相應(yīng)功能的智能小車(chē),提高了開(kāi)發(fā)效率和減少了軟件開(kāi)發(fā)的復(fù)雜性。