胡鴻彬,李彥明,唐小濤,李志騰,劉成良,2
(1.上海交通大學(xué) 機(jī)械與動力工程學(xué)院,上海 200240;2.上海世達(dá)爾現(xiàn)代農(nóng)機(jī)有限公司,上海 200245)
基于高精度GNSS的農(nóng)機(jī)自動導(dǎo)航技術(shù)作為精準(zhǔn)農(nóng)業(yè)的一個重要方向,被廣泛地應(yīng)用于耕作、收割、播種、施肥等農(nóng)業(yè)生產(chǎn)過程中,可以大大延長作業(yè)時間、提高作業(yè)精度和效率、減輕勞動者工作強(qiáng)度[1]。農(nóng)機(jī)導(dǎo)航管理系統(tǒng)的作用是實現(xiàn)人機(jī)交互控制、實時導(dǎo)航作業(yè)監(jiān)控、路徑規(guī)劃,以及歷史作業(yè)數(shù)據(jù)管理和查詢等,是農(nóng)業(yè)機(jī)械裝備信息化和智能化的一個重要載體,是農(nóng)機(jī)自動導(dǎo)航技術(shù)的研究重點(diǎn)之一。
國外發(fā)達(dá)國家(如美國)很早就開展了對農(nóng)機(jī)自動駕駛技術(shù)的研究和應(yīng)用。O’Conner 等人于1995年研發(fā)了一套4天線載波相位GPS系統(tǒng)成功應(yīng)用于John Deere 7800拖拉機(jī)的直線行駛自動導(dǎo)航,橫向偏差精度控制在2.5cm以內(nèi)[2]。長期的技術(shù)積累使得國外農(nóng)業(yè)機(jī)械廠商已經(jīng)成為全球精準(zhǔn)農(nóng)業(yè)的領(lǐng)導(dǎo)者。例如,美國Trimble(天寶)公司為農(nóng)機(jī)自動駕駛提供了從高精度定位接收機(jī)、車載控制系統(tǒng)、導(dǎo)航管理終端、農(nóng)業(yè)作業(yè)云數(shù)據(jù)平臺服務(wù)等一整套解決方案,其最新的導(dǎo)航管理終端TMX-2050基于Android平臺進(jìn)行開發(fā),提供了精致完善的農(nóng)機(jī)自動導(dǎo)航的操作和管理功能。相比之下,國內(nèi)的研究和應(yīng)用起步較晚,從事精準(zhǔn)農(nóng)業(yè)的廠商的導(dǎo)航管理系統(tǒng)有些是直接引用國外的產(chǎn)品進(jìn)行組合和二次開發(fā)。國內(nèi)高校關(guān)于農(nóng)機(jī)導(dǎo)航控制的研究大多處于實驗室階段,有關(guān)導(dǎo)航管理系統(tǒng)的研究較少。張亞嬌等人提出了一種基于WinCE的農(nóng)機(jī)導(dǎo)航監(jiān)控終端系統(tǒng),并在旱田作業(yè)拖拉機(jī)上進(jìn)行了測試,取得了一定的實用效果[3]。筆者在Android移動終端在工業(yè)中應(yīng)用越來越廣泛的趨勢下[4],結(jié)合基于GPS技術(shù)的農(nóng)機(jī)導(dǎo)航系統(tǒng)發(fā)展現(xiàn)狀[5],針對精準(zhǔn)農(nóng)業(yè)中的作業(yè)管理需求[6],設(shè)計了一套基于Android平臺的農(nóng)機(jī)導(dǎo)航管理系統(tǒng),提出了一種實用的路徑規(guī)劃算法,其具有豐富的功能模塊和良好的人機(jī)交互實踐效果。
根據(jù)水稻田穴直播機(jī)的實際作業(yè)需求,導(dǎo)航管理系統(tǒng)的硬件包括拖拉機(jī)車載控制器、無線數(shù)傳電臺收發(fā)端、串口藍(lán)牙和小米平板,如圖1所示。車載控制器用于接入GPS定位數(shù)據(jù)、角度傳感器、陀螺儀傾角數(shù)據(jù)及精量播種等傳感輸入信息,并輸出控制信號控制轉(zhuǎn)向及油門和檔位系統(tǒng)的動作。
KYL-320H高速數(shù)傳電臺和串口藍(lán)牙構(gòu)成遠(yuǎn)程無線通信方案;小米平板是基于Android系統(tǒng)的終端設(shè)備。本文的重點(diǎn)是軟件系統(tǒng)的設(shè)計。從圖1中可以看到:其架構(gòu)主要包含農(nóng)機(jī)參數(shù)與作業(yè)參數(shù)管理、水田地理信息管理、農(nóng)機(jī)作業(yè)路徑規(guī)劃、導(dǎo)航實時監(jiān)控和交互界面和歷史作業(yè)數(shù)據(jù)管理5個模塊。系統(tǒng)的工作流程如圖2所示。工作時,安裝并初始化GPS接收機(jī),啟動車載控制器,然后啟動Android終端程序打開藍(lán)牙連接建立通信。導(dǎo)航管理系統(tǒng)先加載包括地塊信息、車輛參數(shù)和作業(yè)行間距等在內(nèi)的默認(rèn)參數(shù)設(shè)置。系統(tǒng)初次運(yùn)行時需要用戶對新添地塊進(jìn)行標(biāo)定,即沿著田塊輪廓行走一圈確定其拓?fù)溥吔绮⒈4娴降貕K信息數(shù)據(jù)庫中。配置好地塊和車輛后,用戶點(diǎn)擊進(jìn)入導(dǎo)航實時監(jiān)控頁面,加載規(guī)劃路徑,啟動自動導(dǎo)航,車載控制器開始控制執(zhí)行機(jī)構(gòu)進(jìn)行實時路徑跟蹤作業(yè),作業(yè)結(jié)束后可以通過歷史作業(yè)管理模塊查詢歷史作業(yè)數(shù)據(jù)。
圖1 系統(tǒng)功能模塊劃分
圖2 系統(tǒng)工作流程
Android系統(tǒng)已經(jīng)占據(jù)移動端市場的80%以上,工業(yè)中也越來越多地使用Android代替?zhèn)鹘y(tǒng)的嵌入式終端設(shè)備的軟件平臺。本文根據(jù)農(nóng)機(jī)導(dǎo)航系統(tǒng)的功能需求和業(yè)務(wù)邏輯,將系統(tǒng)分為4個層次,在Android Studio集成開發(fā)環(huán)境下完成了導(dǎo)航軟件的設(shè)計與開發(fā)。系統(tǒng)設(shè)計框架分為交互界面層、業(yè)務(wù)邏輯層、算法工具層,以及數(shù)據(jù)訪問和通信層,如圖3所示。這些層之間垂直調(diào)用,共同完成系統(tǒng)功能。使用分層結(jié)構(gòu)的好處是便于數(shù)據(jù)、模型和界面的解耦,實現(xiàn)程序的模塊化設(shè)計。
圖3 分層設(shè)計框架
交互界面層負(fù)責(zé)用戶與車載控制器的交互操作、作業(yè)參數(shù)和導(dǎo)航軌跡顯示等工作。Android系統(tǒng)程序每個界面對應(yīng)一個Activity文件加一個XML布局文件。本系統(tǒng)中包含有啟動界面、設(shè)備連接管理界面、車輛參數(shù)添加界面、地塊添加界面、路徑規(guī)劃界面,以及導(dǎo)航實時監(jiān)控界面等。另外,此層的工作還包括每個界面中的按鈕、控件、彈窗、自定義控件及其適配器和屬性動畫等編寫等。
業(yè)務(wù)邏輯層負(fù)責(zé)偵聽用戶的操作,把用戶的輸入事件收集起來回調(diào)給主線程,交給程序作進(jìn)一步處理,同時負(fù)責(zé)從后臺接收消息和數(shù)據(jù)對主界面進(jìn)行刷新。該層主要包括BroadcastReceiver(廣播接收器)、Service(后臺服務(wù))、OnClickListener(事件偵聽器)及Handler(消息處理器)。廣播接收器用于藍(lán)牙設(shè)備連接時,系統(tǒng)硬件驅(qū)動層進(jìn)行設(shè)備搜索,把結(jié)果廣播給導(dǎo)航管理控制應(yīng)用程序;后臺服務(wù)用于后臺開啟和保持藍(lán)牙收發(fā)數(shù)據(jù)的通信線程。事件偵聽器在程序中大量使用,每個按鈕和自定義控件的點(diǎn)擊、長按等動作都會觸發(fā)該類,然后將動作回調(diào)給活動進(jìn)行下一步處理;消息處理器(Handler)用于導(dǎo)航實時監(jiān)控界面。Android應(yīng)用是單線程模型,默認(rèn)只有一個主界面線程,即UI線程,所有組件都是運(yùn)行在這個線程中,所以這個線程不能進(jìn)行實時刷新,如果在這個線程進(jìn)行耗時的操作會阻塞UI線程,導(dǎo)致程序不響應(yīng)甚至可能報錯[7]。導(dǎo)航管理系統(tǒng)的導(dǎo)航實時監(jiān)控界面,需要不斷從車載終端讀取數(shù)據(jù)并刷新界面,這時需要另外開啟一個工作線程,該線程負(fù)責(zé)無線通信數(shù)據(jù)的收發(fā)。此時,子線程收到的數(shù)據(jù)就需要通過Handler對UI進(jìn)行實時刷新。此外,需要特別注意的是,在應(yīng)用中使用消息處理器的活動要配合使用弱引用方法(WeakReference)來避免內(nèi)存泄漏問題[8]。
算法工具層負(fù)責(zé)連接數(shù)據(jù)和業(yè)務(wù)邏輯的功能,包括空間地理幾何算法類、作業(yè)路徑生成類、導(dǎo)航交互指令控制邏輯類、文件格式轉(zhuǎn)換工具類及通信數(shù)據(jù)解析工具類等。地理幾何算法類將幾個常用計算幾何算法封裝成了可以供其他類直接調(diào)用的方法,包括點(diǎn)線位置判斷、兩直線夾角、直線平移算法和判斷點(diǎn)是否在多邊形內(nèi)部的PNPoly算法等[9]。作業(yè)路徑類封裝了水田自動導(dǎo)航常規(guī)作業(yè)路徑規(guī)算法。導(dǎo)航交互指令控制邏輯類用于處理終端和車載控制器的交互控制指令。這些指令包括農(nóng)機(jī)導(dǎo)航的啟動、停止、運(yùn)行檔位、油門控制、轉(zhuǎn)向指令、設(shè)置AB點(diǎn)、制動,以及懸掛的精量穴直播機(jī)的控制等若干指令。為了防止導(dǎo)航終端對車載控制器的控制指令因為網(wǎng)絡(luò)丟包、延遲等原因而未及時得到響應(yīng),指令交互控制的邏輯設(shè)計仿照TCP建立連接的“三次握手”的方式,Android終端每一個指令都會持續(xù)發(fā)送給車載控制器,直到車載控制器返回響應(yīng)信號,終端才會切換發(fā)送指令。地圖格式轉(zhuǎn)換工具主要借助第三方開源工具包,將新添加的地塊地理信息數(shù)據(jù)以shape文件格式保存。擁有豐富的開源資源,這也是Android平臺應(yīng)用開發(fā)的一大優(yōu)勢。通信數(shù)據(jù)解析類的作用在于將藍(lán)牙通信建立的Socket流數(shù)據(jù)解包為一個個獨(dú)立的消息。
數(shù)據(jù)訪問和通信層主要包括應(yīng)用數(shù)據(jù)的存取和通信數(shù)據(jù)的收發(fā)解決方案。本文的導(dǎo)航管理系統(tǒng)用到了Android系統(tǒng)數(shù)據(jù)持久化的4個方案中的3種:文件、SQLite數(shù)據(jù)庫和SharedPreferences。
文件用于永久保存一些訪問不是很頻繁的數(shù)據(jù),如拖拉機(jī)車輛參數(shù)信息、農(nóng)機(jī)掛載農(nóng)具參數(shù)和水田地塊數(shù)字地圖等,同時可以作為這些數(shù)據(jù)的備份方案。SQLite是一種輕量型數(shù)據(jù)庫,其操作主要包括SQLiteOpenHelper和DatabaseManager類。本文設(shè)計的系統(tǒng)中的數(shù)據(jù)庫共建立了4個分表,即田塊地理信息表、車輛及農(nóng)具參數(shù)表、作業(yè)AB線表即歷史作業(yè)數(shù)據(jù)表,且封裝好了這些數(shù)據(jù)表的增刪改查操作方法,有效地實現(xiàn)了農(nóng)機(jī)導(dǎo)航過程中各種數(shù)據(jù)的持久化保存和快速讀取。SharedPreferences是Android系統(tǒng)的一種特有的使用“鍵值對”的方式把數(shù)據(jù)存儲在XML文件中的數(shù)據(jù)存取方案,用于保存用戶默認(rèn)偏好設(shè)置。它在本系統(tǒng)中用于保存如默認(rèn)車輛、默認(rèn)地塊等的系統(tǒng)默認(rèn)設(shè)置參數(shù),下次程序啟動時如果用戶不進(jìn)行修改則直接加載默認(rèn)配置,節(jié)省了用戶操作時間。通信層的功能是負(fù)責(zé)藍(lán)牙連接管理和藍(lán)牙Socket的建立,這里需要用到Android多線程開發(fā)技術(shù),需要單獨(dú)開啟一個通信線程負(fù)責(zé)終端和車載控制器的數(shù)據(jù)接收和發(fā)送。
基于GPS的農(nóng)機(jī)自動導(dǎo)航的作業(yè)方式一般采用AB線方式,農(nóng)機(jī)在田塊一側(cè)設(shè)定基準(zhǔn)A點(diǎn),駕駛一段距離后設(shè)置基準(zhǔn)B點(diǎn),然后沿著AB線方向及其平行線完成整個地塊的自動駕駛[10]。這種方式缺點(diǎn)是每次作業(yè)都需要人工駕駛拖拉機(jī)在地塊表面上行走一段,不僅費(fèi)力費(fèi)時,且壓實了田地不利于播種。本文設(shè)計了一種既可以基于AB線方式生成規(guī)劃路徑又可以根據(jù)地塊輪廓自動生成規(guī)劃路徑的算法,流程如圖4所示。其主要過程為選擇地塊區(qū)域、選擇預(yù)設(shè)AB線(可以為空)、地頭寬度和作業(yè)行間距,先確定地頭區(qū)域和基準(zhǔn)線,然后基于平行掃描和PNPoly幾何算法生成所需軌跡。其中,地頭區(qū)域?qū)挾鹊拇_定由拖拉機(jī)最小拐彎半徑、作業(yè)方向等參數(shù)決定[11-12],作業(yè)行間距由農(nóng)機(jī)具幅寬和結(jié)合線寬度決定。圖5展示了上面算法在實驗地塊上沒有AB線和有AB線的兩種作業(yè)路徑規(guī)劃的結(jié)果。
圖4 路徑規(guī)劃流程圖
圖5 路徑規(guī)劃結(jié)果
將導(dǎo)航管理系統(tǒng)裝載在平板上,與拖拉機(jī)車載控制器建立好無線連接,使用平板操作農(nóng)機(jī)自動導(dǎo)航作業(yè),在上海市松江農(nóng)機(jī)推廣站的試驗田上開展的多次試驗。圖6是一次導(dǎo)航實驗的實時監(jiān)控界面;圖7是農(nóng)機(jī)在水田的實際行走軌跡。在實驗過程中,平板系統(tǒng)界面簡潔易操作,始終能保持穩(wěn)定的無線數(shù)據(jù)傳輸,幾乎沒有數(shù)據(jù)丟失;控制指令能夠快速下發(fā)給車載控制器并得到其響應(yīng),實時導(dǎo)航作業(yè)監(jiān)控界面能夠?qū)崟r顯示農(nóng)機(jī)的行走軌跡,快速刷新農(nóng)機(jī)運(yùn)動參數(shù);地塊信息、車輛信息數(shù)據(jù)庫能夠穩(wěn)定工作,歷史作業(yè)數(shù)據(jù)可以很方便地查詢;導(dǎo)航界面上農(nóng)機(jī)的行走軌跡真實地繪制了農(nóng)機(jī)的實際軌跡。另外,可以看到導(dǎo)航界面上規(guī)劃的路徑幾乎完全被實際行走軌跡覆蓋,說明設(shè)計的農(nóng)機(jī)車載控制器的跟蹤精度非常理想,后續(xù)開展的導(dǎo)航實驗橫向偏差數(shù)據(jù)分析也驗證了這一點(diǎn)。田間試驗結(jié)果表明:導(dǎo)航管理系統(tǒng)能夠很好地適應(yīng)車載導(dǎo)航控制器的人機(jī)交互功能,體驗性能良好。
圖6 田間試驗導(dǎo)航實時監(jiān)控界面
圖7 拖拉機(jī)實際行走軌跡
設(shè)計了一種基于Android的水稻田農(nóng)機(jī)自動導(dǎo)航管理系統(tǒng),該系統(tǒng)包括農(nóng)機(jī)參數(shù)管理、田地地理信息管理、路徑規(guī)劃、導(dǎo)航實時監(jiān)控和歷史作業(yè)數(shù)據(jù)管理等幾個模塊,提出了一種實用的作業(yè)路徑規(guī)劃方法,采用分層設(shè)計模式完成了系統(tǒng)軟件設(shè)計,并開展了多次田間試驗。試驗結(jié)果表明:該系統(tǒng)能夠?qū)崿F(xiàn)基于高精度GNSS的農(nóng)機(jī)自動導(dǎo)航管理、監(jiān)控和交互操作功能,運(yùn)行穩(wěn)定可靠,體驗性能良好,在農(nóng)機(jī)自動導(dǎo)航中具有現(xiàn)實意義。