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