鄧維迪,朱宏輝
(武漢理工大學(xué) 物流工程學(xué)院,武漢430063)
自改革開放以來,我國(guó)不斷加大了對(duì)公路、鐵路隧道建設(shè)的投資。但由于對(duì)隧道施工環(huán)境的監(jiān)控不足,地質(zhì)條件發(fā)生變化未能及時(shí)作出反應(yīng)從而導(dǎo)致嚴(yán)重地質(zhì)災(zāi)害,造成人員傷亡的事故時(shí)有發(fā)生。因此超前地質(zhì)預(yù)報(bào)工作成為隧道施工過程中必不可少的一個(gè)環(huán)節(jié)。在隧道工程中典型的建圖方法有基于魯棒的掃描匹配和3D 導(dǎo)航技巧的HectorSLAM、基于粒子濾波的Gmapping 算法、基于圖論的KartoSLAM以及基于圖優(yōu)化的LagoSLAM 等[1]。HectorSLAM 是利用高更新速率和現(xiàn)代激光雷達(dá)距離測(cè)量的低噪聲來對(duì)機(jī)器人的移動(dòng)進(jìn)行實(shí)時(shí)的估計(jì)。這種方法沒有使用里程計(jì)的數(shù)據(jù),使得這種方法可以在無人機(jī)或者不平地面的機(jī)器人中使用。但另一方面,當(dāng)只有低速激光掃描時(shí)或者里程計(jì)數(shù)據(jù)準(zhǔn)確的時(shí)候,HectorSLAM 可能會(huì)出現(xiàn)問題[2];Gmapping 是世界范圍內(nèi)最為廣泛使用的機(jī)器人建圖算法。作為一種粒子濾波算法,Gmapping 通常需要數(shù)量多的粒子才能獲取良好的結(jié)果,使得算法需要較高的計(jì)算復(fù)雜度。同時(shí)由于粒子耗盡,即粒子濾波器重新取樣時(shí),粒子的權(quán)重被大大減少,會(huì)有極小的幾率得不出正確的結(jié)果[3];KartoSLAM 是由SRI International Karto Robotics 開發(fā)的一種基于圖論的建圖算法。這種算法使用了高度優(yōu)化的、非迭代的Cholesky 矩陣分解來解決計(jì)算中的線性稀疏矩陣方程?;趫D論的SLAM 建圖算法用圖來表示地圖,具體來說就是每個(gè)節(jié)點(diǎn)代表了機(jī)器人在移動(dòng)軌跡上的一個(gè)位姿,每個(gè)節(jié)點(diǎn)通過代表位姿變化的邊緣進(jìn)行連接。建圖的過程就是在圖里面添加新的節(jié)點(diǎn),節(jié)點(diǎn)的位姿受到位姿變化的限制?;趫D論的建圖算法在進(jìn)行建圖時(shí)的特征匹配需要的內(nèi)存較多,但在保存建好的地圖時(shí)需要的內(nèi)存更少;LagoSLAM 也是另一種基于圖論的建圖算法,不過這種算法是求機(jī)器人位姿的非線性非凸函數(shù)的最小代價(jià),在每次迭代計(jì)算中,求出最初問題的局部近似解,以此更新圖的性質(zhì),直到達(dá)到代價(jià)函數(shù)的極小值。但是這種優(yōu)化算法只有在一個(gè)較好的初始的預(yù)估值才能收斂,粒子濾波算法的求解過程如圖1 所示。
圖1 粒子濾波算法演示Fig.1 Demonstration of particle filter algorithm
本文根據(jù)隧道施工安全預(yù)警要求,并結(jié)合自動(dòng)控制與物聯(lián)網(wǎng)技術(shù),設(shè)計(jì)出一種機(jī)器人行走遠(yuǎn)程控制系統(tǒng)。該系統(tǒng)通過云服務(wù)器作為連接用戶和機(jī)器人的橋梁,用戶使用瀏覽器,在網(wǎng)上發(fā)出控制指令,云服務(wù)器將這些指令發(fā)送到機(jī)器人上位機(jī)上,通過機(jī)器人底盤伺服電機(jī)實(shí)現(xiàn)機(jī)器人不同位姿的精確控制,上位機(jī)通過USB 獲取里程計(jì)的采集數(shù)據(jù),將數(shù)據(jù)通過mesh 網(wǎng)絡(luò)上傳至遠(yuǎn)程服務(wù)器進(jìn)行數(shù)據(jù)分析,將隧道的環(huán)境和機(jī)器人的位姿狀態(tài)實(shí)時(shí)展示給用戶。在實(shí)際施工現(xiàn)場(chǎng)對(duì)系統(tǒng)進(jìn)行一系列的測(cè)試,驗(yàn)證了系統(tǒng)的穩(wěn)定性和可運(yùn)行性。通過網(wǎng)頁(yè)可以使幾乎所有的設(shè)備作為探測(cè)數(shù)據(jù)的查詢終端,可以顯示出機(jī)器人的行走位置,從而有效地提高隧道施工監(jiān)測(cè)效果。
該探水自動(dòng)檢測(cè)系統(tǒng)是在隧道安全預(yù)警小車需求的基礎(chǔ)上提出的。系統(tǒng)要求通過管理員遠(yuǎn)程控制小車的移動(dòng),并可以實(shí)時(shí)監(jiān)視小車周圍障礙物的情況。車載傳感器檢測(cè)數(shù)據(jù),并將數(shù)據(jù)傳輸至遠(yuǎn)程服務(wù)端,同時(shí)根據(jù)測(cè)量數(shù)據(jù)自動(dòng)分析出地圖并展示給管理員。系統(tǒng)總體結(jié)構(gòu)主要由云服務(wù)器、mesh 路由器、上位機(jī)、STM32 單片機(jī)、左直流電機(jī)、右直流電機(jī)、激光雷達(dá)以及里程計(jì)組成。由于在隧道施工環(huán)境中需要考慮防水需求,故該系統(tǒng)將上位機(jī)和STM32 單片機(jī)搭載在小車內(nèi)部,以提高防水等級(jí)。直流電機(jī)帶動(dòng)履帶轉(zhuǎn)動(dòng)以實(shí)現(xiàn)底盤的差動(dòng)控制,使機(jī)器人能靈活控制。考慮到隧道中傳統(tǒng)的4G 和WLAN 有效傳輸距離很短,在隧道施工現(xiàn)場(chǎng)部署了mesh 網(wǎng)絡(luò),保證機(jī)器人能有穩(wěn)定的互聯(lián)網(wǎng)接入。考慮到小車上位機(jī)的性能和攜帶電池的容量有限,小車本體只負(fù)責(zé)從傳感器讀取數(shù)據(jù),所有的建圖算法都在云服務(wù)器上運(yùn)行??紤]到管理的方便性以及操作的簡(jiǎn)便性,使用網(wǎng)頁(yè)通過云服務(wù)器連接機(jī)器人運(yùn)動(dòng)控制裝置以發(fā)送控制指令。同時(shí)通過網(wǎng)頁(yè)對(duì)數(shù)據(jù)分析結(jié)果進(jìn)行展示,小車結(jié)構(gòu)如圖2 所示,底盤位姿控制部分放大圖如圖3 所示。
圖2 小車整體結(jié)構(gòu)Fig.2 Overall structure of trolley
圖3 小車底盤位姿控制部分放大圖Fig.3 Enlarged view of position and attitude control part of trolley chassis
網(wǎng)頁(yè)終端通過wifi 或4G 等聯(lián)網(wǎng)方式連接遠(yuǎn)程服務(wù)器,發(fā)出各種對(duì)機(jī)器人的控制指令,云服務(wù)器上部署了kafka 消息隊(duì)列,發(fā)布機(jī)器人命令的主題,訂閱機(jī)器人狀態(tài)的主題; 機(jī)器人上也部署了kafka消息隊(duì)列,訂閱了機(jī)器人命令的主題,發(fā)布機(jī)器人狀態(tài)的主題。每次機(jī)器人收到訂閱的消息后,根據(jù)消息的具體命令執(zhí)行對(duì)應(yīng)的操作,收到移動(dòng)指令后,上位機(jī)通過串口對(duì)STM32 控制機(jī)器人底盤的運(yùn)動(dòng),使機(jī)器人前進(jìn)后退,左右旋轉(zhuǎn)到達(dá)指定的位姿。同時(shí),機(jī)器人還讀取里程計(jì)的數(shù)據(jù),通過消息隊(duì)列發(fā)送到服務(wù)器上,服務(wù)器收到機(jī)器人發(fā)送的數(shù)據(jù)后,對(duì)這些數(shù)據(jù)進(jìn)行分析后,通過網(wǎng)頁(yè)直觀的展示可視化結(jié)果。由于服務(wù)器有公網(wǎng)ip,各種設(shè)備只要能上網(wǎng),同時(shí)能夠通過驗(yàn)證就可訪問serverless 的nginx 服務(wù)器,通過網(wǎng)絡(luò)將探測(cè)結(jié)果顯示到瀏覽器上,系統(tǒng)總體架構(gòu)如圖4 所示。
圖4 系統(tǒng)總體架構(gòu)圖Fig.4 System overall architecture diagram
系統(tǒng)控制芯片采用STM32F407,通過+5 V 電源對(duì)系統(tǒng)進(jìn)行供電,系統(tǒng)通過USB 串口讀取里程計(jì)數(shù)據(jù),通過GPIO 控制底盤伺服電機(jī)的運(yùn)動(dòng)并且和上位機(jī)通信,接收上位機(jī)接收到的云服務(wù)器發(fā)送的控制指令并返回機(jī)器人的位姿狀態(tài),底盤位姿控制裝置的硬件系統(tǒng)框圖如圖5 所示。
圖5 硬件系統(tǒng)框圖Fig.5 Hardware system block diagram
USB 串口主要是對(duì)里程計(jì)和激光雷達(dá)數(shù)據(jù)進(jìn)行讀取。里程計(jì)選擇型號(hào)為HiPNUC 的MPU9250,運(yùn)行電壓為5 V; 輸出速率是100 Hz; 測(cè)量范圍±2000°/s;非線形度±0.1%;噪聲密度0.08°/s·Hz-1;采樣率1000 Hz。激光雷達(dá)選擇型號(hào)為思嵐的RPLIDAR A2,高度41 mm;直徑76 mm;重量190 g;測(cè)距范圍0.15~18 m;掃描角度為360°;角度分辨率為0.45°。采用115200 波特率的串口輸出,其控制方式為USB 異步串口通信。選擇波特率為115200,無校驗(yàn)位[4]。里程計(jì)和激光雷達(dá)接收數(shù)據(jù)格式相同,如圖6所示,其中A 為報(bào)頭;B 為保留位;C 為指令包的長(zhǎng)度;D 為發(fā)出的命令;E 為命令的參數(shù);F 為CRC16校驗(yàn)位。
圖6 里程計(jì)和激光雷達(dá)接收數(shù)據(jù)格式Fig.6 Odometer and lidar receiving data format
推桿控制模塊主要通過STM32 的2 個(gè)GPIO引腳分別控制2 個(gè)伺服電機(jī)運(yùn)動(dòng)。電機(jī)的最大轉(zhuǎn)速為2500 r/min,供電電源為直流24 V。選擇PA10,PA11,PC10,PC11 引腳和GND 連接直流電機(jī)正反轉(zhuǎn)模塊,DC POWER 端連接24 V 電源,電機(jī)接線如圖7 所示。
圖7 電機(jī)連接圖Fig.7 Motor connection diagram
上位機(jī)通信模塊主要作用是接收上位機(jī)接收到的云服務(wù)器發(fā)送的控制指令并返回機(jī)器人的位姿狀態(tài)。上位機(jī)上面安裝了wifi 模塊,可以連接上隧道中部署的mesh 網(wǎng)絡(luò),連接上互聯(lián)網(wǎng),運(yùn)行kafka消息隊(duì)列和云服務(wù)器保持可靠的通信。和部署在隧道環(huán)境的mesh 路由器進(jìn)行通信,連接上互聯(lián)網(wǎng),向服務(wù)器發(fā)送數(shù)據(jù)同時(shí)接收服務(wù)器發(fā)送的命令。上位機(jī)運(yùn)行的是Ubuntu 18.04 LTS 系統(tǒng),通過GPIO 和機(jī)器人底盤位姿控制裝置通信,來控制機(jī)器人的位姿并讀取狀態(tài)信息反饋到云服務(wù)器上。
GPIO 通信模塊主要作用是和STM32 進(jìn)行通信,控制機(jī)器人底盤的位姿并將數(shù)據(jù)發(fā)送至云服務(wù)器進(jìn)行處理。使用的工控機(jī)裝有8 路GPIO,選擇其中的引腳1、 引腳2 和STM32 上的GPIO 引腳進(jìn)行連接。將STM32 的GPIO 串口設(shè)置為主機(jī)模式,并將波特率設(shè)置為9600,1 位停止位,無校驗(yàn)位,STM32 引腳接線說明見表1,STM32 引腳接線電路如圖8 所示。
表1 STM32 引腳接線說明Tab.1 STM32 pin wiring instructions
圖8 STM32 引腳接線電路圖Fig.8 STM32 circuit diagram of pin wiring
kafka 消息隊(duì)列的作用是保證數(shù)據(jù)不被丟失的正常發(fā)送。在隧道中雖然部署了mesh 無線網(wǎng)絡(luò),但是在一些地方信號(hào)不好。如果使用傳統(tǒng)的tcp 連接,在信號(hào)不好的時(shí)候連接會(huì)斷開,造成數(shù)據(jù)丟失。使用kafka 消息隊(duì)列,數(shù)據(jù)在沒有網(wǎng)的時(shí)候會(huì)在本地緩存,在有網(wǎng)的時(shí)候自動(dòng)發(fā)送到遠(yuǎn)程服務(wù)器。同時(shí)kafka 的內(nèi)存占用低,性能高,編程簡(jiǎn)單,適合在電池和性能有限的移動(dòng)機(jī)器人中使用。
云服務(wù)器和上位機(jī)發(fā)布和接收的kafka 主題分別是server_command 和client_response,消息內(nèi)容為json 定義,如表2 和表3 所示。
表2 發(fā)布消息格式說明Tab.2 Post message format description
表3 接收消息格式說明Tab.3 Receiving message format description
網(wǎng)頁(yè)的主要作用是完成用戶身份認(rèn)證;將用戶的輸入轉(zhuǎn)化為控制命令發(fā)送到機(jī)器人;監(jiān)視機(jī)器人底盤的運(yùn)行狀態(tài)以及將結(jié)果展示給用戶。當(dāng)用戶打開網(wǎng)頁(yè)后,開始進(jìn)行身份驗(yàn)證,如驗(yàn)證成功,則模塊進(jìn)入機(jī)器人可視化界面,通過使用鍵盤控制機(jī)器人的移動(dòng)并在界面上追蹤機(jī)器人的位置。用戶點(diǎn)擊菜單欄中的下拉框查看機(jī)器人,選擇所需的機(jī)器人進(jìn)行連接,之后網(wǎng)頁(yè)將下拉框收回,進(jìn)入全屏模式,顯示機(jī)器人控制界面,點(diǎn)擊“開始”控制按鈕后,使用鍵盤上的方向鍵便可按指定方向進(jìn)行運(yùn)動(dòng),網(wǎng)頁(yè)界面實(shí)時(shí)顯示運(yùn)動(dòng)位置。不需要手動(dòng)控制后,可通過點(diǎn)擊停止控制按鈕,機(jī)器人將不受用戶的控制。
用戶身份認(rèn)證主要通過一個(gè)有3 個(gè)input 的form 控件實(shí)現(xiàn),3 個(gè)input 的類型分別是text,password 和submit,分別對(duì)應(yīng)了用戶名、密碼和提交按鈕。當(dāng)用戶點(diǎn)擊submit 類型的input 時(shí),獲取text 和password 的input 的身份以及密碼信息,并進(jìn)行驗(yàn)證。當(dāng)驗(yàn)證通過時(shí),證明該用戶是設(shè)備操作人員,同時(shí)切換到機(jī)器人選擇界面,用戶身份認(rèn)證界面如圖9 所示。
圖9 用戶身份認(rèn)證界面Fig.9 User authentication interface
用戶通過身份驗(yàn)證后,打開新的Dom 元素。在window.onload()函數(shù)中初始化界面,顯示機(jī)器人選擇界面,用戶可以選擇機(jī)器人或后退。如選擇后退則程序結(jié)束,如選擇某個(gè)機(jī)器人后,程序繼續(xù)運(yùn)行,同時(shí)程序?qū)⑾蜻h(yuǎn)程服務(wù)器打開一個(gè)websocket 鏈接,websocket 注冊(cè)onopen,onmessage,onclose 三個(gè)回調(diào)函數(shù)[5]。通過onopen()方法向服務(wù)器發(fā)送用戶選擇的具體機(jī)器人標(biāo)識(shí)號(hào),服務(wù)器就會(huì)在這條websocket 鏈接上發(fā)送選擇機(jī)器人的相關(guān)信息。onmessage()方法則是用來處理服務(wù)器發(fā)過來的數(shù)據(jù),這些數(shù)據(jù)將由另外的函數(shù)處理并繪制在網(wǎng)頁(yè)的canvas元素上。當(dāng)用戶關(guān)閉瀏覽器頁(yè)面或者點(diǎn)擊“停止”按鈕時(shí),onclose()負(fù)責(zé)斷開連接前做出一些清理。同時(shí)還會(huì)使用setInterval()函數(shù)使websocket 鏈接定時(shí)發(fā)送心跳包,保持客戶端的存活。
當(dāng)點(diǎn)擊“開始”控制后,用戶的鍵盤操作將可以直接控制機(jī)器人的移動(dòng),為此還需要使用window.onkeydown()監(jiān)聽用戶的鍵盤輸入,上下左右4 個(gè)方向鍵對(duì)應(yīng)著ArrowUp,ArrowDown,ArrowLeft,ArrowRight。當(dāng)用戶按下按鍵時(shí),回調(diào)函數(shù)會(huì)根據(jù)發(fā)生的事件中key 屬性,判斷用戶的點(diǎn)擊按鍵,從而使用websocket的send()方法向服務(wù)器發(fā)送對(duì)應(yīng)的數(shù)據(jù)。當(dāng)websocket 接收到服務(wù)器發(fā)送的消息后,需要在界面上顯示給用戶。使用canvas 的fillRect(),beginPath(),moveTo(),lineTo(),fill()方法繪制機(jī)器人的位姿。網(wǎng)頁(yè)websocket 連接流程如圖10 所示。
圖10 用戶瀏覽器和云服務(wù)器通訊連接流程Fig.10 User browser and cloud server communication connection flow chart
可視化界面主要實(shí)時(shí)顯示機(jī)器人的位姿狀態(tài)。主要使用了canvas 進(jìn)行圖像的動(dòng)態(tài)繪制、使用web socket 從服務(wù)器獲取機(jī)器人的實(shí)時(shí)位姿信息,由一個(gè)canvas 元素組成。在遠(yuǎn)程服務(wù)器搭建Nginx 服務(wù)器,在網(wǎng)頁(yè)端通過websocket 標(biāo)準(zhǔn)庫(kù)對(duì)服務(wù)器進(jìn)行Http upgrade 請(qǐng)求,獲取實(shí)時(shí)消息并顯示在canvas 上[6]。
系統(tǒng)軟硬件模塊設(shè)計(jì)完成后,需要對(duì)系統(tǒng)機(jī)械結(jié)構(gòu)、硬件運(yùn)行穩(wěn)定性和網(wǎng)頁(yè)功能進(jìn)行測(cè)試。硬件測(cè)試主要測(cè)試底盤位姿控制裝置能否正常運(yùn)行,網(wǎng)頁(yè)測(cè)試主要包括服務(wù)器與機(jī)器人上位機(jī)的通信以及機(jī)器人位姿狀態(tài)顯示功能。在貴州桐梓隧道右洞中進(jìn)行系統(tǒng)測(cè)試,桐梓隧道測(cè)試現(xiàn)場(chǎng)如圖11 所示。打開網(wǎng)頁(yè),并選擇該機(jī)器人,點(diǎn)擊開始控制按鈕,此時(shí)遠(yuǎn)程控制機(jī)器人底盤運(yùn)動(dòng),并將機(jī)器人位姿狀態(tài)發(fā)送到手機(jī)上,網(wǎng)頁(yè)端實(shí)時(shí)顯示界面如圖12 所示。
圖11 桐梓隧道測(cè)試現(xiàn)場(chǎng)Fig.11 Tongzi tunnel test site
圖12 網(wǎng)頁(yè)機(jī)器人狀態(tài)界面Fig.12 Web robot status interface
當(dāng)不需要手動(dòng)控制后,可以通過點(diǎn)擊菜單下的“停止”控制按鈕,結(jié)束對(duì)機(jī)器人的控制,機(jī)器人實(shí)時(shí)行走地圖如圖13 所示。
圖13 機(jī)器人實(shí)時(shí)行走地圖Fig.13 Real-time robot walking map
本文將物聯(lián)網(wǎng)技術(shù)和云服務(wù)相結(jié)合,通過分析隧道預(yù)警小車的具體需求,設(shè)計(jì)出一種機(jī)器人行走遠(yuǎn)程控制系統(tǒng),通過對(duì)軟硬件模塊的設(shè)計(jì),實(shí)現(xiàn)了隧道環(huán)境中機(jī)器人位姿數(shù)據(jù)的自動(dòng)采集以及傳輸,并通過云服務(wù)器分析傳感器數(shù)據(jù),得出可視化結(jié)果,工程技術(shù)人員可通過網(wǎng)頁(yè)查看機(jī)器人目前位姿,并進(jìn)行手動(dòng)控制。從而能夠減少隧道施工過程中工人數(shù)量,有效地提高隧道監(jiān)測(cè)預(yù)警能力,避免發(fā)生意外事故。