周 鑫 李喬碩 陳君君 姜家旺 王文品
(河南科技大學(xué),河南 洛陽 471003)
隨著人類社會(huì)的發(fā)展與進(jìn)步,垃圾的清理與回收漸漸成為當(dāng)今的社會(huì)焦點(diǎn)問題之一,其中水面垃圾清理回收則一直是急于解決的難題。傳統(tǒng)的水面清理往往依靠大量的人力,且對(duì)于大面積區(qū)域進(jìn)行集中清理費(fèi)時(shí)費(fèi)力,難以保證水面長久美觀整潔。而本裝置采用視覺智能系統(tǒng),配合動(dòng)力導(dǎo)航模塊,可以實(shí)現(xiàn)自動(dòng)捕捉,巡航,采集一系列清理水面垃圾以及智能化調(diào)整清掃任務(wù)等功能,可以有效解決所面臨的問題。
系統(tǒng)結(jié)構(gòu)圖如圖1所示。
圖1 系統(tǒng)結(jié)構(gòu)圖
系統(tǒng)由視覺模塊、動(dòng)力模塊、機(jī)械臂抓取機(jī)構(gòu)以及基于ROS操作系統(tǒng)的樹莓派3B+等模塊組成。視覺模塊實(shí)時(shí)拍攝工作場景的圖像,主控部分對(duì)圖像執(zhí)行識(shí)別處理,判斷有無垃圾。若有垃圾,主控則返回垃圾的位置數(shù)據(jù),主控控制機(jī)械臂裝置對(duì)垃圾進(jìn)行精確抓取,并放入回收箱中。對(duì)圖像中的垃圾清理后,由動(dòng)力系統(tǒng)控制電機(jī)驅(qū)動(dòng)螺旋槳,實(shí)現(xiàn)裝置的移動(dòng),進(jìn)行下一個(gè)區(qū)域的清理。垃圾清理裝置結(jié)合GPS的定位導(dǎo)航裝置和視覺處理模塊能夠?qū)崿F(xiàn)在水面的自主移動(dòng)。
系統(tǒng)使用樹莓派3B+作為垃圾清理裝置的主控,樹莓派3B+上使用的CPU為64位1.4GHz四核ARM Cortex-A53的BCM 2837B0,具有1GB內(nèi)存。其CSI攝像頭接口接500萬像素?cái)z像頭,對(duì)工作場景實(shí)時(shí)回傳圖像,樹莓派對(duì)實(shí)時(shí)環(huán)境圖像抓取處理,進(jìn)行識(shí)別。樹莓派運(yùn)行ROS機(jī)器人操作系統(tǒng),對(duì)視覺的實(shí)現(xiàn)和裝置的運(yùn)動(dòng)進(jìn)行全局管控。
機(jī)械抓取裝置采用機(jī)械連桿結(jié)構(gòu)如圖2所示。船箱中的伺服電機(jī)向外輸出動(dòng)力能夠?qū)崿F(xiàn)位置精確,方便對(duì)垃圾的抓取和船體的移動(dòng)。向外輸出的動(dòng)力使船體上的導(dǎo)軌滑塊移動(dòng),帶動(dòng)連桿機(jī)構(gòu)的轉(zhuǎn)動(dòng)使夾板張開與關(guān)閉,實(shí)現(xiàn)對(duì)垃圾的抓取。抓取裝置后臂上的導(dǎo)軌滑塊帶動(dòng)連桿機(jī)構(gòu)的轉(zhuǎn)動(dòng)對(duì)前臂進(jìn)行收放,將抓取的垃圾放到后方垃圾回收箱中。
圖2 機(jī)械抓取結(jié)構(gòu)
抓取裝置常采用伺服電機(jī)直接控制張合,多數(shù)電路裸露在外,需要進(jìn)行防水處理,提高了維護(hù)成本和使用難度,文章設(shè)計(jì)裝置整個(gè)采用連桿機(jī)構(gòu)聯(lián)動(dòng),設(shè)備的移動(dòng)以及轉(zhuǎn)動(dòng)部分的靈活性較高,能夠有效避免電路與水面的接觸,免去防水維護(hù)。
裝置主要以收集塑料等漂浮垃圾為主,材料采用碳纖維材料。碳纖維材料具有高強(qiáng)度、耐高溫、抗摩擦、導(dǎo)電、導(dǎo)熱及耐腐蝕等特性,材料密度小,質(zhì)量輕。
機(jī)器人操作系統(tǒng)(Robot Operating System)操作方便、功能強(qiáng)大,適用于多節(jié)點(diǎn)多任務(wù)的復(fù)雜場景。廣泛應(yīng)用于機(jī)械臂、移動(dòng)底盤、無人機(jī)、無人車等設(shè)備。隨著大數(shù)據(jù)和AI的迅速發(fā)展,ROS的發(fā)展也日漸成熟。在發(fā)展的同時(shí),領(lǐng)域擴(kuò)展也在不斷的創(chuàng)新。ROS作為機(jī)器人的軟件開發(fā)平臺(tái),是通信機(jī)制、工具軟件包、機(jī)器人技能和機(jī)器人生態(tài)系統(tǒng)的集合體,支持C++和Python等多種編程語言,為信息交互提供了便利。ROS為各種結(jié)點(diǎn)服務(wù)提供各種工具軟件包,實(shí)現(xiàn)多功能調(diào)用,為各模塊提供通信框架,將原本松散的框架進(jìn)行了耦合[1]。
Navigation Stack工作框架如圖3所示。
圖3 Navigation Stack工作框架
Navigation Stack包含了ROS在路徑規(guī)劃、定位等方面的package。機(jī)器人自主導(dǎo)航功能依靠Navigation 中package,包含定位功能的amcl 和fake_localization、機(jī)器人位姿的卡爾曼濾波robot_pose_ekf、路徑規(guī)劃結(jié)點(diǎn)move_base 等。Navigation工作框架如圖3所示,move_base 位于框架的中心,實(shí)現(xiàn)導(dǎo)航功能。move_base使用傳感器處理后的數(shù)據(jù)來對(duì)機(jī)器人進(jìn)行路徑規(guī)劃[2]。在實(shí)際導(dǎo)航任務(wù)中,將結(jié)點(diǎn)接入并完成啟動(dòng),通過傳感器提供的數(shù)據(jù),規(guī)劃機(jī)器人的路徑和速度。
move_base作為Navigation Stack中的核心節(jié)點(diǎn),在導(dǎo)航系統(tǒng)中必不可少,包含垃圾收集裝置的路徑規(guī)劃等核心功能模塊。ROS作為機(jī)器人操作系統(tǒng),具有路徑規(guī)劃等開源算法軟件功能包,使用ROS中的路徑規(guī)劃算法包,對(duì)算法進(jìn)行改進(jìn),使功能滿足垃圾收集裝置的路徑航線設(shè)置。位于收集裝置前方的攝像頭執(zhí)行障礙信息收集,使用光流法結(jié)合測(cè)距傳感器作為move_base的數(shù)據(jù)輸入,為路徑規(guī)劃提供必要數(shù)據(jù)。通過全局規(guī)劃算法,在垃圾收集裝置開始工作前,形成整個(gè)水域的行駛路線,在規(guī)定的行駛路線上對(duì)水面的垃圾進(jìn)行清理。收集裝置路徑規(guī)劃如圖4所示。
圖4 收集裝置路徑規(guī)劃
垃圾收集裝置通過靜態(tài)地圖獲取水面區(qū)域信息,內(nèi)置算法進(jìn)行路徑規(guī)劃,從A點(diǎn)開始沿圖中所示路徑行駛,發(fā)現(xiàn)水面有垃圾時(shí),通過垃圾回收功能實(shí)現(xiàn)對(duì)垃圾的清理。在設(shè)備視覺范圍內(nèi)檢測(cè)無垃圾時(shí),按預(yù)定行駛路線繼續(xù)巡視監(jiān)測(cè)。若檢測(cè)到行駛路徑超預(yù)定范圍時(shí),通過GPS定位導(dǎo)航糾偏,校正行駛路線[3]。
垃圾識(shí)別系統(tǒng)整體框架如圖5所示。
圖5 垃圾識(shí)別系統(tǒng)整體框架
由于水面垃圾形狀不一,如果僅識(shí)別垃圾外形輪廓,易出現(xiàn)識(shí)別誤差,且程序邏輯設(shè)計(jì)較難。采用機(jī)器視覺,計(jì)算機(jī)深度學(xué)習(xí),建立神經(jīng)網(wǎng)絡(luò)模型進(jìn)行垃圾識(shí)別,通過垃圾圖像的數(shù)據(jù)集建立模型,基于Keras框架建立深度學(xué)習(xí)模型,攝像頭采集的圖像使用OpenCV庫進(jìn)行處理,使用Numpy庫進(jìn)行數(shù)值運(yùn)算,通過訓(xùn)練所得模型實(shí)現(xiàn)對(duì)垃圾的識(shí)別檢測(cè)。
Keras是神經(jīng)網(wǎng)絡(luò)的API,由Python語言編寫,程序設(shè)計(jì)使用Keras框架,以TensorFlow作為后端運(yùn)行。Keras框架的核心數(shù)據(jù)結(jié)構(gòu)為神經(jīng)網(wǎng)絡(luò)模型models,使用較多的為Sequential順序模型,由多個(gè)神經(jīng)層線性堆疊而成。在訓(xùn)練模型之前,需要配置學(xué)習(xí)過程,主要通過compile方法完成,其中的優(yōu)化器,損失函數(shù)和評(píng)估函數(shù)三個(gè)參數(shù)尤為重要。訓(xùn)練模型使用fit方法,應(yīng)用訓(xùn)練完成的模型進(jìn)行測(cè)試集預(yù)測(cè)[4]。
OpenCV是基于Apache2.0許可發(fā)行的計(jì)算機(jī)視覺和機(jī)器學(xué)習(xí)軟件庫,實(shí)現(xiàn)了圖像處理和計(jì)算機(jī)視覺方面的多種通用算法。OpenCV由C++語言編寫,具有C++,Python,Java和Matlab接口,支持多種系統(tǒng)。垃圾識(shí)別程序設(shè)計(jì)采用OpenCV-Python。Python對(duì)比C/C++等語言程序處理速度偏慢,但邏輯簡單性、代碼可讀性強(qiáng)使得解決計(jì)算機(jī)視覺處理更加簡捷。程序可采用C/C++語言進(jìn)行擴(kuò)展,底層復(fù)雜密集的代碼框架由C/C++編寫,通過Python來封裝。
垃圾識(shí)別模塊所需數(shù)據(jù)來自攝像頭捕捉。采用OpenCV對(duì)圖像進(jìn)行預(yù)處理,主要完成圖像的濾波降噪和圖像分割。在對(duì)圖像預(yù)處理后,再應(yīng)用OpenCV中的邊緣檢測(cè)算子。邊緣檢測(cè)容易受噪聲影響,可以先通過高斯濾波除去噪聲。Sobel算子計(jì)算水平和豎直方向的一階導(dǎo)數(shù),根據(jù)公式推測(cè)像素點(diǎn)方向和梯度[5]。其中Gx代表圖像x方向梯度的幅值,Gy代表圖像y方向梯度的幅值。在OpenCV檢測(cè)邊緣時(shí),其算法程序已經(jīng)封裝好供外部使用,因此只需調(diào)用cv2.Canny()函數(shù)即可。
模型建立前,首先準(zhǔn)備測(cè)試集和訓(xùn)練集,即各種分類完成的垃圾圖片。對(duì)已分類圖片進(jìn)行數(shù)據(jù)預(yù)處理,深度學(xué)習(xí)需要大量測(cè)試集,如果測(cè)試集數(shù)據(jù)量較少,可以對(duì)圖片執(zhí)行旋轉(zhuǎn)、平移、剪裁等方式進(jìn)行數(shù)據(jù)補(bǔ)充。搭建神經(jīng)網(wǎng)絡(luò)模型進(jìn)行訓(xùn)練,數(shù)據(jù)集經(jīng)過卷積池化等操作輸出分類結(jié)果,最后對(duì)測(cè)試集進(jìn)行預(yù)測(cè)得出準(zhǔn)確率。模型建立框架如圖6所示。文章訓(xùn)練數(shù)據(jù)共有2 536張圖片,包含紙、塑料瓶、紙板等水面漂浮垃圾。
圖6 模型建立框架
構(gòu)建神經(jīng)網(wǎng)絡(luò)后,模型通過卷積和池化運(yùn)算,對(duì)數(shù)據(jù)集的圖片進(jìn)行特征提取與訓(xùn)練。運(yùn)行程序發(fā)現(xiàn),當(dāng)?shù)綌?shù)為126步時(shí),對(duì)訓(xùn)練好的模型進(jìn)行測(cè)試準(zhǔn)確率最高。在模型訓(xùn)練過程中可以通過圖形可視化,直觀的顯示準(zhǔn)確率和損失率。Epochs每一步的批量大小對(duì)測(cè)試的準(zhǔn)確結(jié)果產(chǎn)生一定影響,由實(shí)際情況和效率而定。當(dāng)模型訓(xùn)練損失不斷上升時(shí),說明模型進(jìn)入過擬合狀態(tài),可以停止訓(xùn)練。迭代步數(shù)與測(cè)試準(zhǔn)確率如表1所示。
表1 迭代步數(shù)與測(cè)試準(zhǔn)確率
隨著近年來旅游業(yè)的發(fā)展,許多景區(qū)或者公園內(nèi)的湖泊存在漂浮垃圾情況。目前的水面垃圾清理主要依靠人工打撈,費(fèi)時(shí)費(fèi)力,效率較低,對(duì)于適航能力較強(qiáng)的視覺識(shí)別垃圾抓取裝置發(fā)展空間大,應(yīng)用前景廣闊。