徐 浩, 鞠文清, 錢 夔, 潘昱辰, 朱晟宇, 李嵩爽
(南京工程學(xué)院 自動(dòng)化學(xué)院,江蘇 南京 211167)
近年來,隨著人工智能、傳感器技術(shù)和計(jì)算機(jī)技術(shù)的快速發(fā)展,移動(dòng)機(jī)器人即時(shí)定位與地圖構(gòu)建[1](Simultaneous Localization and Mapping,SLAM)、目標(biāo)檢測(cè)、路徑規(guī)劃等算法日趨成熟,移動(dòng)機(jī)器人的應(yīng)用場(chǎng)景日漸多元化。如今,危險(xiǎn)環(huán)境下的作業(yè)(如隧道探測(cè)、變電站巡檢等工作)往往由移動(dòng)機(jī)器人進(jìn)行,為確保移動(dòng)機(jī)器人的作業(yè)效率和安全,往往需要對(duì)其工作狀態(tài)和周遭環(huán)境進(jìn)行監(jiān)控。在此背景下,迫切需要能夠遠(yuǎn)程操控并監(jiān)控機(jī)器人的人機(jī)交互軟件[2]。
針對(duì)此需求,黎振勝等[3]基于LabVIEW 操作者框架設(shè)計(jì)了一種移動(dòng)機(jī)器人遠(yuǎn)程人機(jī)交互平臺(tái)并驗(yàn)證了該平臺(tái)對(duì)移動(dòng)機(jī)器人的遠(yuǎn)程控制效果。徐建明等[4]采用Xenomai(一種實(shí)時(shí)操作系統(tǒng))內(nèi)核和開放實(shí)時(shí)以太通信網(wǎng)絡(luò)協(xié)議(Ethernet for Control Automation Technology,EtherCAT)主站技術(shù)設(shè)計(jì)軟件驅(qū)動(dòng)層,并將搭建的EtherCAT主站運(yùn)行在ROS(Robot Operating System,機(jī)器人操作系統(tǒng))節(jié)點(diǎn)中,最后利用客戶機(jī)/服務(wù)器(Client/Server,C/S)架構(gòu)設(shè)計(jì)了遠(yuǎn)程客戶端人機(jī)界面,實(shí)現(xiàn)了移動(dòng)機(jī)器人的遠(yuǎn)程控制和自主導(dǎo)航功能。Webviz、Foxglove[5]等開源項(xiàng)目通過WebSocket等技術(shù)實(shí)現(xiàn)了機(jī)器人視頻消息和點(diǎn)云信息的可視化功能驗(yàn)證。但以上研究均未能解決跨平臺(tái)開發(fā)和部署問題,也未能實(shí)現(xiàn)敏捷開發(fā)和控制功能的服務(wù)化調(diào)用,且大多需要專用工業(yè)總線或?qū)崟r(shí)以太網(wǎng)等特殊設(shè)備和系統(tǒng)的支持,非專業(yè)人員操作十分困難[6]。
為解決以上問題,本文設(shè)計(jì)了一種基于ROS網(wǎng)橋的跨平臺(tái)網(wǎng)絡(luò)化人機(jī)交互系統(tǒng),通過ROS網(wǎng)橋中的WebSocket通道協(xié)議進(jìn)行跨平臺(tái)的信息交互,解決了傳統(tǒng)人機(jī)交互系統(tǒng)不能跨平臺(tái)通信的問題。通過Node.js[7]在Linux平臺(tái)上創(chuàng)建了服務(wù)端,利用Bootstrap框架和jQuery組件建立了交互前端的網(wǎng)絡(luò)化控制系統(tǒng)架構(gòu)。最終實(shí)現(xiàn)了遠(yuǎn)程監(jiān)控和控制移動(dòng)機(jī)器人的目的,從而實(shí)現(xiàn)人機(jī)交互技術(shù)的網(wǎng)絡(luò)化、服務(wù)化和智能化。
為了能夠使用戶舒服、高效并且安全地與機(jī)器人互動(dòng),使機(jī)器人交互技術(shù)朝著智能化和服務(wù)化的方向發(fā)展,本文開發(fā)了一款跨平臺(tái)的人機(jī)交互系統(tǒng)。該系統(tǒng)的主要功能是實(shí)現(xiàn)跨平臺(tái)遠(yuǎn)程監(jiān)控功能。
所設(shè)計(jì)的系統(tǒng)總體結(jié)構(gòu)如圖1所示,該系統(tǒng)的硬件層主要由移動(dòng)機(jī)器人底盤、傳感器設(shè)備(如激光雷達(dá)、深度相機(jī)、慣性測(cè)量單元(Inertial Measurement Unit,IMU)等和網(wǎng)絡(luò)設(shè)備組成。
ROS_Web服務(wù)層主要包括Roslibjs、Ros2djs、Ros3djs、Web_video_server、Rosbrigde等功能包,實(shí)現(xiàn)了ROS與Web端的話題、服務(wù)數(shù)據(jù)交互和模型可視化功能。ROS_Web服務(wù)層擴(kuò)展了ROS的應(yīng)用范圍,將ROS系統(tǒng)中話題通信和Web技術(shù)跨平臺(tái)的優(yōu)勢(shì)相結(jié)合,從而提高了整體系統(tǒng)的可視化和交互性能。
應(yīng)用服務(wù)層主要包括運(yùn)動(dòng)控制硬件驅(qū)動(dòng)、路徑規(guī)劃、機(jī)器人導(dǎo)航,以及2D SLAM和3D SLAM等移動(dòng)機(jī)器人本地服務(wù),通過LeGO-LOAM(Lightweight and Ground-Optimized Lidar Odometry and Mapping)、A*等算法實(shí)現(xiàn)開放環(huán)境下移動(dòng)機(jī)器人的三維地圖構(gòu)建、多點(diǎn)導(dǎo)航和巡航功能。
前端界面采用了Bootstrap框架,通過HTML5、層疊樣式表(Cascading Style Sheets,CSS)和JavaScript技術(shù)實(shí)現(xiàn)。Bootstrap框架是一個(gè)在jQuery的基礎(chǔ)上進(jìn)行了個(gè)性化完善的前端框架,并且兼容大部分jQuery插件,能夠更好地向用戶呈現(xiàn)簡潔、美觀的人機(jī)交互界面。
后端服務(wù)器使用Node.js的Express框架來搭建,主要負(fù)責(zé)響應(yīng)前端請(qǐng)求并對(duì)數(shù)據(jù)或文件進(jìn)行存取。Node.js是一個(gè)基于Chorme V8引擎的JavaScript環(huán)境,使用事件驅(qū)動(dòng)、非阻塞式輸入輸出(Input/Output,I/O)系統(tǒng)模型,讓JavaScript運(yùn)行在服務(wù)端的開發(fā)平臺(tái),用于搭建響應(yīng)速度快、易于擴(kuò)展的網(wǎng)絡(luò)應(yīng)用。Express是基于Node.js的Web開發(fā)框架,具有上手容易、性能高、擴(kuò)展性強(qiáng)的優(yōu)點(diǎn)。
常見的通信協(xié)議有超文本傳輸協(xié)議(Hyper Text Transfer Protocol,HTTP)和WebSocket協(xié)議兩種,而HTTP是非持久性的協(xié)議,客戶端想獲取服務(wù)端的處理進(jìn)度只能通過使用Ajax進(jìn)行輪詢或者采用長輪詢(Long Poll)的方式,但是前者對(duì)服務(wù)器壓力大,后者則會(huì)因?yàn)橐恢钡却齊esponse(響應(yīng))造成阻塞[8]。
WebSocket是一種在單個(gè)傳輸控制協(xié)議(Transmission Control Protocol,TCP)連接上進(jìn)行全雙工通信的協(xié)議。WebSocket的優(yōu)勢(shì)在于:
① 傳輸效率高。在對(duì)移動(dòng)機(jī)器人進(jìn)行遠(yuǎn)程監(jiān)控和控制時(shí)需要有很好的實(shí)時(shí)性,因此對(duì)傳輸效率提出了較高的要求,而WebSocket通信協(xié)議通信數(shù)據(jù)的標(biāo)頭信息只有2 B,有效降低了數(shù)據(jù)冗余,極大地降低了數(shù)據(jù)傳輸?shù)难舆t。
② 實(shí)用場(chǎng)景廣。在移動(dòng)機(jī)器人工作時(shí)往往有大量的數(shù)據(jù)產(chǎn)生,如激光點(diǎn)云信息和遠(yuǎn)程監(jiān)控圖像等,WebSocket的消息傳輸優(yōu)勢(shì)能夠滿足機(jī)器人在各種場(chǎng)景下的需求。
③ 較強(qiáng)的平臺(tái)通用性。在機(jī)器人系統(tǒng)ROS中,Rosbridge作為機(jī)器人和服務(wù)器進(jìn)行通信的核心功能包,同樣采用了WebSocket通信協(xié)議,能夠?qū)崿F(xiàn)ROS與其他平臺(tái)的數(shù)據(jù)傳輸。
ROS提供了豐富的消息類型,開發(fā)人員可以根據(jù)具體需求自定義消息。本設(shè)計(jì)采用JavaScript對(duì)象表示法(JavaScript Object Notation,JSON)消息作為數(shù)據(jù)傳輸格式,它采用完全獨(dú)立于編程語言的文本格式來對(duì)數(shù)據(jù)進(jìn)行存儲(chǔ)和表示,并且層次鮮明。同時(shí),考慮到機(jī)器人數(shù)據(jù)傳輸?shù)男?本設(shè)計(jì)采用基于WebSocket協(xié)議的ROS網(wǎng)橋通信方式來完成ROS消息和網(wǎng)頁消息的相互轉(zhuǎn)換,ROS功能包能夠以黑盒應(yīng)用程序編程接口(Application Programming Interface,API)的形式在網(wǎng)頁端對(duì)外發(fā)布并且能接收網(wǎng)頁端的指令[9]。
為了實(shí)現(xiàn)ROS程序和非ROS程序通信的目的,利用了Rosbridge提供的JSON接口,將ROS系統(tǒng)的數(shù)據(jù)消息進(jìn)行序列化,轉(zhuǎn)換成JSON[10]格式后實(shí)現(xiàn)與Web交互的功能。
Rosbridge有3個(gè)比較重要的屬性:Rosapi、Rosbridge_server和Rosbridge_library。其中,Rosapi的主要作用是連接WebSocket的客戶端API;Rosbridge_server主要負(fù)責(zé)通信的傳輸層,其主要功能是開啟WebSocket服務(wù)端,等待客戶端的連接請(qǐng)求;Rosbridge_library主要提供ROS消息和JSON消息相互轉(zhuǎn)換的Python API,它幾乎包含了ROS的全部核心消息類型,并能根據(jù)具體的ROS消息對(duì)其進(jìn)行相應(yīng)的序列化轉(zhuǎn)換。以相機(jī)的圖像消息為例,經(jīng)過Rosbridge轉(zhuǎn)換的JSON消息如表1所示[11]。
表1 Rosbridge消息格式轉(zhuǎn)換表
基于ROS網(wǎng)橋的通信鏈路如圖2所示,用戶使用Web應(yīng)用中的功能模塊時(shí),后端將相應(yīng)的節(jié)點(diǎn)啟動(dòng)請(qǐng)求通過WebSocket傳輸?shù)絉osbridge,Rosbridge負(fù)責(zé)啟動(dòng)ROS系統(tǒng)中的具體控制算法和硬件驅(qū)動(dòng),以此開啟傳感器和主控設(shè)備。然后,機(jī)器人將自身傳感器(如激光雷達(dá)、相機(jī)、IMU等)數(shù)據(jù)傳輸?shù)絉OS系統(tǒng)中,經(jīng)過數(shù)據(jù)處理算法集成后發(fā)布相應(yīng)話題,Rosbridge將這些話題和服務(wù)轉(zhuǎn)換成JSON格式,最后利用WebSocket完成與Web應(yīng)用端的信息交換。相反地,用戶也能通過Rosbridge向ROS端發(fā)布話題[12]。
圖2 基于ROS網(wǎng)橋的通信鏈路
在消息的通信鏈路確定后,需要完成軟件框架設(shè)計(jì),如圖3所示。網(wǎng)頁客戶端采用HTML5技術(shù)展現(xiàn)主體內(nèi)容,網(wǎng)頁風(fēng)格和各組件的布局由CSS組件決定,基于Three.js和PlaneVisualizer等JavaScript庫能夠?qū)崿F(xiàn)三維圖形的渲染以及界面的縮放、旋轉(zhuǎn)等功能。Node.js服務(wù)器提供了地圖保存、數(shù)據(jù)存取、節(jié)點(diǎn)啟動(dòng)等服務(wù)。Node.js服務(wù)器基于Express框架搭建,Express提供了Web應(yīng)用程序框架,可以創(chuàng)建路由和處理HTTP請(qǐng)求,用戶能夠通過POST請(qǐng)求與服務(wù)器進(jìn)行交互,服務(wù)器借助Body-parser解析HTTP請(qǐng)求的中間件后利用Child_process生成子進(jìn)程,通過FS文件系統(tǒng)訪問并執(zhí)行能夠啟動(dòng)移動(dòng)機(jī)器人各項(xiàng)組件和服務(wù)的腳本文件,以此完成移動(dòng)機(jī)器人的數(shù)據(jù)管理、運(yùn)動(dòng)控制、SLAM建圖、機(jī)器導(dǎo)航等服務(wù)調(diào)用。在SLAM建圖、機(jī)器導(dǎo)航過程中,移動(dòng)機(jī)器人通過Rosbridge服務(wù)的WebSocket接口將用戶請(qǐng)求的數(shù)據(jù)交給網(wǎng)頁客戶端顯示。Rosnodejs實(shí)現(xiàn)了服務(wù)器與ROS通信以及話題的訂閱和發(fā)布功能。用戶能夠使用泛平臺(tái)硬件對(duì)機(jī)器人的運(yùn)動(dòng)過程進(jìn)行監(jiān)控。整體項(xiàng)目部署在移動(dòng)機(jī)器人的工控機(jī)上,用戶無須安裝其他插件或依賴,具有模塊化、無依賴、輕量化的特點(diǎn),并且能夠?qū)崿F(xiàn)跨平臺(tái)操作, 解決了傳統(tǒng)人機(jī)交互系統(tǒng)跨平臺(tái)開發(fā)和部署困難的問題。
圖3 軟件框架
運(yùn)動(dòng)控制模塊的主要功能是實(shí)現(xiàn)移動(dòng)機(jī)器人的遠(yuǎn)程運(yùn)動(dòng)控制。圖4為運(yùn)動(dòng)控制模塊的原理圖。該模塊主要利用Keyboardteleopjs[13]功能包,首先通過Java-Script對(duì)瀏覽器中鍵盤按鍵進(jìn)行識(shí)別,發(fā)布相對(duì)應(yīng)的Twist消息。然后,Rosbridge客戶端使用JSON命令將Twist消息通過WebSocket接口傳遞給服務(wù)器。在服務(wù)器解析命令后,通過控制器實(shí)現(xiàn)對(duì)機(jī)器人的運(yùn)動(dòng)控制。
圖4 運(yùn)動(dòng)控制模塊原理圖
本設(shè)計(jì)在人機(jī)交互界面上增加了視頻監(jiān)控模塊,能夠完整顯示視頻流。設(shè)計(jì)視頻監(jiān)控模塊的主要目的是防止用戶遠(yuǎn)程操作機(jī)器人時(shí)發(fā)生碰撞事故,此模塊能夠大幅提高用戶操作時(shí)的安全性。
本模塊采用JSON格式對(duì)圖像顯示參數(shù)進(jìn)行預(yù)描述。圖像參數(shù)在JSON格式中可以看作各種“鍵/值”對(duì)的集合,根據(jù)設(shè)計(jì)要求,本模塊主要涉及的“鍵/值”對(duì)參數(shù)包括圖像的ID、端口地址、圖顯示的尺寸、訂閱的ROS話題等。視頻監(jiān)控功能的實(shí)現(xiàn)基于ROS中的Web_video_server[14]功能包,在通信建立后,Web_video_server首先會(huì)打開本地端口并等待傳入的HTTP請(qǐng)求,一旦用戶通過HTTP發(fā)出ROS主題的視頻流請(qǐng)求,該功能包就會(huì)訂閱相應(yīng)主題并創(chuàng)建視頻編碼器實(shí)例,然后將原始的視頻數(shù)據(jù)包提供給客戶端,最后通過WebSocket接口進(jìn)行傳輸,從而實(shí)現(xiàn)Web瀏覽器中的圖像顯示功能。此外,為了滿足用戶對(duì)不同類型圖像的需求,該模塊通過訂閱不同的圖像話題實(shí)現(xiàn)了對(duì)彩色圖像和深度圖像的顯示,用戶可以通過界面上的按鈕自由選擇。
本設(shè)計(jì)采用RS-LiDAR-16三維激光雷達(dá)來提供點(diǎn)云數(shù)據(jù),網(wǎng)頁端需具備3D可視化功能。因此,本設(shè)計(jì)利用Ros3djs作為Rosbridge客戶端。與視頻監(jiān)控模塊類似,本模塊也采用JSON數(shù)據(jù)格式進(jìn)行傳輸,其參數(shù)包括端口地址、點(diǎn)云顯示的尺寸、訂閱的ROS話題等。首先需要?jiǎng)?chuàng)建ROS3d.viewer視圖對(duì)象,用于放置視圖內(nèi)容, 建立ROSlib.tfclient客戶端,用于訂閱相應(yīng)的TF數(shù)據(jù),并建立ROS3d.ponitcloud2客戶端,用于獲取點(diǎn)云數(shù)據(jù);當(dāng)ROS系統(tǒng)接收到建圖請(qǐng)求后,服務(wù)器主動(dòng)推送點(diǎn)云數(shù)據(jù)和TF數(shù)據(jù),通過Tf2_web_republisher將TF數(shù)據(jù)通過ROSbridge接口發(fā)送給ROS3djsclient和ROSlib.tfclient,在接收到TF數(shù)據(jù)后,對(duì)ROS3d.viewer對(duì)象和ROS3d.ponitcloud2對(duì)象進(jìn)行更新,最終實(shí)現(xiàn)瀏覽器中的點(diǎn)云顯示[15]。
本文設(shè)計(jì)的基于ROS網(wǎng)橋的跨平臺(tái)網(wǎng)絡(luò)化人機(jī)交互系統(tǒng)主要是實(shí)現(xiàn)移動(dòng)機(jī)器人的遠(yuǎn)程監(jiān)控和運(yùn)動(dòng)控制。
實(shí)驗(yàn)環(huán)境如圖5所示,其由一臺(tái)配置了Ubuntu的Linux系統(tǒng)工控機(jī)、Robuster移動(dòng)機(jī)器人底盤、Intel 3D相機(jī)、RS-LiDAR-16激光雷達(dá)、一臺(tái)配置Windows 10的系統(tǒng)主機(jī)組成。工控機(jī)作為服務(wù)器端,Windows系統(tǒng)主機(jī)作為客戶端,用于遠(yuǎn)程消息的監(jiān)控。為保證監(jiān)控平臺(tái)能夠跨平臺(tái)通信,需要2臺(tái)主機(jī)處在同一局域網(wǎng)下。為了測(cè)試本文所述設(shè)計(jì)的效果,具體實(shí)驗(yàn)步驟如表2所示。
表2 實(shí)驗(yàn)步驟
圖5 實(shí)驗(yàn)環(huán)境圖
本文設(shè)計(jì)的人機(jī)交互界面如圖6所示,圖6主體部分左側(cè)是RS-LiDAR-16激光雷達(dá)的點(diǎn)云顯示情況,右側(cè)是RealSense 3D相機(jī)彩色圖像的顯示情況。節(jié)點(diǎn)關(guān)系分析如下:Robuster對(duì)應(yīng)的節(jié)點(diǎn)/Robuster_mr可以與/Rosbridge_websocket、/Web_video_server節(jié)點(diǎn)通信,并將Cmd_vel話題發(fā)布到Robuster_mr上,實(shí)現(xiàn)了對(duì)Robuster的運(yùn)動(dòng)控制。與此同時(shí),相機(jī)話題被發(fā)布到/Web_video_server服務(wù)器上,實(shí)現(xiàn)了遠(yuǎn)程在客戶端上訂閱相機(jī)的實(shí)時(shí)圖像信息的功能。
圖6 人機(jī)交互界面
表3為本文設(shè)計(jì)的人機(jī)交互系統(tǒng)和傳統(tǒng)人機(jī)交互系統(tǒng)特性的對(duì)照。實(shí)驗(yàn)結(jié)果表明,與傳統(tǒng)的人機(jī)交互系統(tǒng)相比,該方案擺脫了只能運(yùn)行在特定單一平臺(tái)上的限制,能夠在泛平臺(tái)實(shí)現(xiàn)移動(dòng)機(jī)器人監(jiān)控,與傳統(tǒng)人機(jī)交互系統(tǒng)框架式開發(fā)不同的是,本系統(tǒng)采用服務(wù)化開發(fā)模式,后續(xù)功能的開發(fā)無須改動(dòng)整體框架,只需調(diào)用相應(yīng)服務(wù),各模塊耦合度較低,方便解耦、移植和功能擴(kuò)展,使人機(jī)交互系統(tǒng)更智能且面向服務(wù)。另外,本方案集成部署在移動(dòng)機(jī)器人平臺(tái)上,用戶能夠直接通過瀏覽器控制和監(jiān)控機(jī)器人,實(shí)現(xiàn)人機(jī)交互系統(tǒng)的輕量化和集成化??傮w來說,本設(shè)計(jì)的跨平臺(tái)人機(jī)交互系統(tǒng)能夠較為準(zhǔn)確地對(duì)移動(dòng)機(jī)器人進(jìn)行運(yùn)動(dòng)控制和狀態(tài)監(jiān)控,并且有效可行。
表3 人機(jī)交互系統(tǒng)特性對(duì)照表
本文設(shè)計(jì)了一種基于ROS網(wǎng)橋的跨平臺(tái)網(wǎng)絡(luò)化人機(jī)交互系統(tǒng)。首先,利用HTML5、CSS、JavaScript技術(shù)構(gòu)建了面向ROS的遠(yuǎn)程監(jiān)控平臺(tái),設(shè)計(jì)了基于ROS網(wǎng)橋的通信鏈路,實(shí)現(xiàn)了跨平臺(tái)數(shù)據(jù)交換。然后,在此基礎(chǔ)上采用模塊化開發(fā)方式開發(fā)了人機(jī)交互界面,主要功能包括運(yùn)動(dòng)控制、圖像監(jiān)控、點(diǎn)云顯示等。最后將系統(tǒng)應(yīng)用于Robuster機(jī)器人,檢驗(yàn)了本系統(tǒng)的跨平臺(tái)運(yùn)動(dòng)控制、點(diǎn)云顯示和視頻監(jiān)控功能。所設(shè)計(jì)的系統(tǒng)具有跨平臺(tái)、可移植性強(qiáng)等特點(diǎn),為人機(jī)交互技術(shù)的網(wǎng)絡(luò)化、服務(wù)化和智能化提供了基礎(chǔ)。另外,基于本文設(shè)計(jì)的人機(jī)交互框架,未來將結(jié)合生物電子技術(shù),實(shí)現(xiàn)跨模態(tài)的人機(jī)交互。