鄧維迪,朱宏輝
(武漢理工大學 物流工程學院,武漢430063)
自改革開放以來,我國不斷加大了對公路、鐵路隧道建設的投資。但由于對隧道施工環境的監控不足,地質條件發生變化未能及時作出反應從而導致嚴重地質災害,造成人員傷亡的事故時有發生。因此超前地質預報工作成為隧道施工過程中必不可少的一個環節。在隧道工程中典型的建圖方法有基于魯棒的掃描匹配和3D 導航技巧的HectorSLAM、基于粒子濾波的Gmapping 算法、基于圖論的KartoSLAM以及基于圖優化的LagoSLAM 等[1]。HectorSLAM 是利用高更新速率和現代激光雷達距離測量的低噪聲來對機器人的移動進行實時的估計。這種方法沒有使用里程計的數據,使得這種方法可以在無人機或者不平地面的機器人中使用。但另一方面,當只有低速激光掃描時或者里程計數據準確的時候,HectorSLAM 可能會出現問題[2];Gmapping 是世界范圍內最為廣泛使用的機器人建圖算法。作為一種粒子濾波算法,Gmapping 通常需要數量多的粒子才能獲取良好的結果,使得算法需要較高的計算復雜度。同時由于粒子耗盡,即粒子濾波器重新取樣時,粒子的權重被大大減少,會有極小的幾率得不出正確的結果[3];KartoSLAM 是由SRI International Karto Robotics 開發的一種基于圖論的建圖算法。這種算法使用了高度優化的、非迭代的Cholesky 矩陣分解來解決計算中的線性稀疏矩陣方程。基于圖論的SLAM 建圖算法用圖來表示地圖,具體來說就是每個節點代表了機器人在移動軌跡上的一個位姿,每個節點通過代表位姿變化的邊緣進行連接。建圖的過程就是在圖里面添加新的節點,節點的位姿受到位姿變化的限制?;趫D論的建圖算法在進行建圖時的特征匹配需要的內存較多,但在保存建好的地圖時需要的內存更少;LagoSLAM 也是另一種基于圖論的建圖算法,不過這種算法是求機器人位姿的非線性非凸函數的最小代價,在每次迭代計算中,求出最初問題的局部近似解,以此更新圖的性質,直到達到代價函數的極小值。但是這種優化算法只有在一個較好的初始的預估值才能收斂,粒子濾波算法的求解過程如圖1 所示。

圖1 粒子濾波算法演示Fig.1 Demonstration of particle filter algorithm
本文根據隧道施工安全預警要求,并結合自動控制與物聯網技術,設計出一種機器人行走遠程控制系統。該系統通過云服務器作為連接用戶和機器人的橋梁,用戶使用瀏覽器,在網上發出控制指令,云服務器將這些指令發送到機器人上位機上,通過機器人底盤伺服電機實現機器人不同位姿的精確控制,上位機通過USB 獲取里程計的采集數據,將數據通過mesh 網絡上傳至遠程服務器進行數據分析,將隧道的環境和機器人的位姿狀態實時展示給用戶。在實際施工現場對系統進行一系列的測試,驗證了系統的穩定性和可運行性。通過網頁可以使幾乎所有的設備作為探測數據的查詢終端,可以顯示出機器人的行走位置,從而有效地提高隧道施工監測效果。
該探水自動檢測系統是在隧道安全預警小車需求的基礎上提出的。系統要求通過管理員遠程控制小車的移動,并可以實時監視小車周圍障礙物的情況。車載傳感器檢測數據,并將數據傳輸至遠程服務端,同時根據測量數據自動分析出地圖并展示給管理員。系統總體結構主要由云服務器、mesh 路由器、上位機、STM32 單片機、左直流電機、右直流電機、激光雷達以及里程計組成。由于在隧道施工環境中需要考慮防水需求,故該系統將上位機和STM32 單片機搭載在小車內部,以提高防水等級。直流電機帶動履帶轉動以實現底盤的差動控制,使機器人能靈活控制??紤]到隧道中傳統的4G 和WLAN 有效傳輸距離很短,在隧道施工現場部署了mesh 網絡,保證機器人能有穩定的互聯網接入??紤]到小車上位機的性能和攜帶電池的容量有限,小車本體只負責從傳感器讀取數據,所有的建圖算法都在云服務器上運行。考慮到管理的方便性以及操作的簡便性,使用網頁通過云服務器連接機器人運動控制裝置以發送控制指令。同時通過網頁對數據分析結果進行展示,小車結構如圖2 所示,底盤位姿控制部分放大圖如圖3 所示。

圖2 小車整體結構Fig.2 Overall structure of trolley

圖3 小車底盤位姿控制部分放大圖Fig.3 Enlarged view of position and attitude control part of trolley chassis
網頁終端通過wifi 或4G 等聯網方式連接遠程服務器,發出各種對機器人的控制指令,云服務器上部署了kafka 消息隊列,發布機器人命令的主題,訂閱機器人狀態的主題; 機器人上也部署了kafka消息隊列,訂閱了機器人命令的主題,發布機器人狀態的主題。每次機器人收到訂閱的消息后,根據消息的具體命令執行對應的操作,收到移動指令后,上位機通過串口對STM32 控制機器人底盤的運動,使機器人前進后退,左右旋轉到達指定的位姿。同時,機器人還讀取里程計的數據,通過消息隊列發送到服務器上,服務器收到機器人發送的數據后,對這些數據進行分析后,通過網頁直觀的展示可視化結果。由于服務器有公網ip,各種設備只要能上網,同時能夠通過驗證就可訪問serverless 的nginx 服務器,通過網絡將探測結果顯示到瀏覽器上,系統總體架構如圖4 所示。

圖4 系統總體架構圖Fig.4 System overall architecture diagram
系統控制芯片采用STM32F407,通過+5 V 電源對系統進行供電,系統通過USB 串口讀取里程計數據,通過GPIO 控制底盤伺服電機的運動并且和上位機通信,接收上位機接收到的云服務器發送的控制指令并返回機器人的位姿狀態,底盤位姿控制裝置的硬件系統框圖如圖5 所示。

圖5 硬件系統框圖Fig.5 Hardware system block diagram
USB 串口主要是對里程計和激光雷達數據進行讀取。里程計選擇型號為HiPNUC 的MPU9250,運行電壓為5 V; 輸出速率是100 Hz; 測量范圍±2000°/s;非線形度±0.1%;噪聲密度0.08°/s·Hz-1;采樣率1000 Hz。激光雷達選擇型號為思嵐的RPLIDAR A2,高度41 mm;直徑76 mm;重量190 g;測距范圍0.15~18 m;掃描角度為360°;角度分辨率為0.45°。采用115200 波特率的串口輸出,其控制方式為USB 異步串口通信。選擇波特率為115200,無校驗位[4]。里程計和激光雷達接收數據格式相同,如圖6所示,其中A 為報頭;B 為保留位;C 為指令包的長度;D 為發出的命令;E 為命令的參數;F 為CRC16校驗位。

圖6 里程計和激光雷達接收數據格式Fig.6 Odometer and lidar receiving data format
推桿控制模塊主要通過STM32 的2 個GPIO引腳分別控制2 個伺服電機運動。電機的最大轉速為2500 r/min,供電電源為直流24 V。選擇PA10,PA11,PC10,PC11 引腳和GND 連接直流電機正反轉模塊,DC POWER 端連接24 V 電源,電機接線如圖7 所示。

圖7 電機連接圖Fig.7 Motor connection diagram
上位機通信模塊主要作用是接收上位機接收到的云服務器發送的控制指令并返回機器人的位姿狀態。上位機上面安裝了wifi 模塊,可以連接上隧道中部署的mesh 網絡,連接上互聯網,運行kafka消息隊列和云服務器保持可靠的通信。和部署在隧道環境的mesh 路由器進行通信,連接上互聯網,向服務器發送數據同時接收服務器發送的命令。上位機運行的是Ubuntu 18.04 LTS 系統,通過GPIO 和機器人底盤位姿控制裝置通信,來控制機器人的位姿并讀取狀態信息反饋到云服務器上。
GPIO 通信模塊主要作用是和STM32 進行通信,控制機器人底盤的位姿并將數據發送至云服務器進行處理。使用的工控機裝有8 路GPIO,選擇其中的引腳1、 引腳2 和STM32 上的GPIO 引腳進行連接。將STM32 的GPIO 串口設置為主機模式,并將波特率設置為9600,1 位停止位,無校驗位,STM32 引腳接線說明見表1,STM32 引腳接線電路如圖8 所示。

表1 STM32 引腳接線說明Tab.1 STM32 pin wiring instructions

圖8 STM32 引腳接線電路圖Fig.8 STM32 circuit diagram of pin wiring
kafka 消息隊列的作用是保證數據不被丟失的正常發送。在隧道中雖然部署了mesh 無線網絡,但是在一些地方信號不好。如果使用傳統的tcp 連接,在信號不好的時候連接會斷開,造成數據丟失。使用kafka 消息隊列,數據在沒有網的時候會在本地緩存,在有網的時候自動發送到遠程服務器。同時kafka 的內存占用低,性能高,編程簡單,適合在電池和性能有限的移動機器人中使用。
云服務器和上位機發布和接收的kafka 主題分別是server_command 和client_response,消息內容為json 定義,如表2 和表3 所示。

表2 發布消息格式說明Tab.2 Post message format description

表3 接收消息格式說明Tab.3 Receiving message format description
網頁的主要作用是完成用戶身份認證;將用戶的輸入轉化為控制命令發送到機器人;監視機器人底盤的運行狀態以及將結果展示給用戶。當用戶打開網頁后,開始進行身份驗證,如驗證成功,則模塊進入機器人可視化界面,通過使用鍵盤控制機器人的移動并在界面上追蹤機器人的位置。用戶點擊菜單欄中的下拉框查看機器人,選擇所需的機器人進行連接,之后網頁將下拉框收回,進入全屏模式,顯示機器人控制界面,點擊“開始”控制按鈕后,使用鍵盤上的方向鍵便可按指定方向進行運動,網頁界面實時顯示運動位置。不需要手動控制后,可通過點擊停止控制按鈕,機器人將不受用戶的控制。
用戶身份認證主要通過一個有3 個input 的form 控件實現,3 個input 的類型分別是text,password 和submit,分別對應了用戶名、密碼和提交按鈕。當用戶點擊submit 類型的input 時,獲取text 和password 的input 的身份以及密碼信息,并進行驗證。當驗證通過時,證明該用戶是設備操作人員,同時切換到機器人選擇界面,用戶身份認證界面如圖9 所示。

圖9 用戶身份認證界面Fig.9 User authentication interface
用戶通過身份驗證后,打開新的Dom 元素。在window.onload()函數中初始化界面,顯示機器人選擇界面,用戶可以選擇機器人或后退。如選擇后退則程序結束,如選擇某個機器人后,程序繼續運行,同時程序將向遠程服務器打開一個websocket 鏈接,websocket 注冊onopen,onmessage,onclose 三個回調函數[5]。通過onopen()方法向服務器發送用戶選擇的具體機器人標識號,服務器就會在這條websocket 鏈接上發送選擇機器人的相關信息。onmessage()方法則是用來處理服務器發過來的數據,這些數據將由另外的函數處理并繪制在網頁的canvas元素上。當用戶關閉瀏覽器頁面或者點擊“停止”按鈕時,onclose()負責斷開連接前做出一些清理。同時還會使用setInterval()函數使websocket 鏈接定時發送心跳包,保持客戶端的存活。
當點擊“開始”控制后,用戶的鍵盤操作將可以直接控制機器人的移動,為此還需要使用window.onkeydown()監聽用戶的鍵盤輸入,上下左右4 個方向鍵對應著ArrowUp,ArrowDown,ArrowLeft,ArrowRight。當用戶按下按鍵時,回調函數會根據發生的事件中key 屬性,判斷用戶的點擊按鍵,從而使用websocket的send()方法向服務器發送對應的數據。當websocket 接收到服務器發送的消息后,需要在界面上顯示給用戶。使用canvas 的fillRect(),beginPath(),moveTo(),lineTo(),fill()方法繪制機器人的位姿。網頁websocket 連接流程如圖10 所示。

圖10 用戶瀏覽器和云服務器通訊連接流程Fig.10 User browser and cloud server communication connection flow chart
可視化界面主要實時顯示機器人的位姿狀態。主要使用了canvas 進行圖像的動態繪制、使用web socket 從服務器獲取機器人的實時位姿信息,由一個canvas 元素組成。在遠程服務器搭建Nginx 服務器,在網頁端通過websocket 標準庫對服務器進行Http upgrade 請求,獲取實時消息并顯示在canvas 上[6]。
系統軟硬件模塊設計完成后,需要對系統機械結構、硬件運行穩定性和網頁功能進行測試。硬件測試主要測試底盤位姿控制裝置能否正常運行,網頁測試主要包括服務器與機器人上位機的通信以及機器人位姿狀態顯示功能。在貴州桐梓隧道右洞中進行系統測試,桐梓隧道測試現場如圖11 所示。打開網頁,并選擇該機器人,點擊開始控制按鈕,此時遠程控制機器人底盤運動,并將機器人位姿狀態發送到手機上,網頁端實時顯示界面如圖12 所示。

圖11 桐梓隧道測試現場Fig.11 Tongzi tunnel test site

圖12 網頁機器人狀態界面Fig.12 Web robot status interface
當不需要手動控制后,可以通過點擊菜單下的“停止”控制按鈕,結束對機器人的控制,機器人實時行走地圖如圖13 所示。

圖13 機器人實時行走地圖Fig.13 Real-time robot walking map
本文將物聯網技術和云服務相結合,通過分析隧道預警小車的具體需求,設計出一種機器人行走遠程控制系統,通過對軟硬件模塊的設計,實現了隧道環境中機器人位姿數據的自動采集以及傳輸,并通過云服務器分析傳感器數據,得出可視化結果,工程技術人員可通過網頁查看機器人目前位姿,并進行手動控制。從而能夠減少隧道施工過程中工人數量,有效地提高隧道監測預警能力,避免發生意外事故。