目前,機器人遙操作系統(tǒng)已成為機器人研究的一個熱點。在機器人遙操作的過程中,本地服務(wù)器與遠程客戶機之間的網(wǎng)絡(luò)通信問題是遙操作的關(guān)鍵環(huán)節(jié)。針對機器人遙操作的通信問題,本文設(shè)計了一種在Windows XP環(huán)境下,運用Socket實現(xiàn)的基于TCP/IP協(xié)議的網(wǎng)絡(luò)通信平臺。 1 Socket編程原理 1.1 Socket簡介 Socket(套接字)最初是加州大學(xué)伯克利分校為UNIX操作系統(tǒng)開發(fā)的網(wǎng)絡(luò)通信接口。后來Intel, Microsoft, Sun等網(wǎng)絡(luò)廠商將其移植到Windows中,形成了Windows Sockets規(guī)范,它定義了一套Windows環(huán)境下網(wǎng)絡(luò)編程的接口。利用Windows Socket開發(fā)的網(wǎng)絡(luò)通信程序的層次結(jié)構(gòu)如圖1示。 圖1 Sockets編程的結(jié)構(gòu) 根據(jù)傳輸數(shù)據(jù)類型的不同,Sockets可分為流式套接字(SOCK_STREAM)和數(shù)據(jù)報式套接字(SOCK_DGRAM)兩類。流式套接字提供面向連接、可靠的數(shù)據(jù)傳輸服務(wù),數(shù)據(jù)無差錯、無重復(fù)的發(fā)送,且按發(fā)送順序接受。流式套接字實際上是基于TCP協(xié)議實現(xiàn)的。數(shù)據(jù)報式套接字提供無連接服務(wù)。數(shù)據(jù)報以獨立包形式發(fā)送,不提供無錯保證,數(shù)據(jù)可能丟失或重復(fù),并且接受順序混亂。數(shù)據(jù)報套接字實際上是基于UDP協(xié)議實現(xiàn)的。 按照套接字在客戶機/服務(wù)器(Client/ Server)模式中的功能可將其分為兩類: *套接字:該套接字位于服務(wù)器端,它的主要功能就是對特定的端口進行不斷的*,當(dāng)檢測到有連接請求時,接受申請,并構(gòu)造一個新的客戶端套接字,與連接申請方的客戶端套接字建立連接,從而為雙方的通信做好準(zhǔn)備。 客戶端套接字:該套接字是用來進行網(wǎng)絡(luò)通信的實體。它位于客戶機和服務(wù)器上,服務(wù)器必須維持它為之服務(wù)的客戶一樣數(shù)量的這種套接字,形成一個以服務(wù)器為中心的星型結(jié)構(gòu)。 1.2 TCP網(wǎng)絡(luò)通信平臺設(shè)計步驟 基于Internet的機器人遙操作技術(shù)是現(xiàn)代網(wǎng)絡(luò)技術(shù)和機器人控制技術(shù)的結(jié)合,Internet使用網(wǎng)際分組交換協(xié)議TCP/IP作為通信規(guī)范,它包括 TCP, UDP和ICMP等協(xié)議。其中TCP協(xié)議是面向連接的協(xié)議,要求在數(shù)據(jù)交換以前必須與通信方建立一條連接、它具有分段和重組功能,能夠確保數(shù)據(jù)可靠、有序地傳輸。 TCP通信整個過程可以分成三個階段:連接建立、數(shù)據(jù)傳輸和拆除連接。 (1)連接建立階段:首先服務(wù)器中的*套接字對斷口進行偵聽,客戶端的套接字向服務(wù)器端的特定斷口提出連接申請。 (2)通信階段:這是整個過程的核心部分,任務(wù)就是負責(zé)數(shù)據(jù)的收發(fā)。 (3)拆除連接階段:在傳完數(shù)據(jù)之后,關(guān)閉套接字,釋放所分配的資源。 使用Soeket編寫TCP通信程序的主要步驟如下: 1) 構(gòu)造 Soeket對象 ; 2) 使用該對象構(gòu)造基本的Socket句柄。由于遙操作的數(shù)據(jù)通信要求可靠,準(zhǔn)確,故采用TCP協(xié)議,套接字使用流式套接字; 3)建立客戶機CSocket,調(diào)用Connect()建立與服務(wù)器套接字的連接.服務(wù)器調(diào)用Listen()*請求連接情況,并在收到客戶端請求后調(diào)用Accept()接收客戶端連接. 4) 構(gòu)造CSocketFile對象,并使用CSocket對象與之關(guān)聯(lián). 5) 構(gòu)造CArchive對象 ,用于接受和發(fā)送數(shù)據(jù)。使用CArchive對象來進行客戶端與服務(wù)器端之間的Socket通信 6) 通信結(jié)束,關(guān)閉套接字,退出程序。 2 TCP網(wǎng)絡(luò)通信平臺程序的實現(xiàn) 本程序是為機器人遙操作的通信所搭建的一個網(wǎng)絡(luò)通信平臺,該平臺實現(xiàn)了本地服務(wù)器與遠程客戶機之間的數(shù)據(jù)網(wǎng)絡(luò)通信,系統(tǒng)結(jié)構(gòu)圖如圖2所示。 圖2 遙操作系統(tǒng)結(jié)構(gòu)圖 本文的程序設(shè)計是基于TCP/IP協(xié)議的,使用客戶機/服務(wù)器模式。本程序設(shè)計調(diào)試的網(wǎng)絡(luò)環(huán)境為采用Windows XP中的 TCP/IP協(xié)議配置的局域網(wǎng),服務(wù)器的的IP地址是“192.168.0.104”,通信端口可任意設(shè)置,本文設(shè)為4231。 2.1 通信平臺程序的實現(xiàn)流程 服務(wù)器是控制機器人的主控制臺,通過服務(wù)器可以控制機器人的爬行、檢測以及轉(zhuǎn)向等。本文中服務(wù)器端程序,主要是建立一個能夠讓客戶端連接的端口,并通過*,與需要連接的客戶端建立連接,并與其進行數(shù)據(jù)信息通信,將機器人傳感器獲取的機器人的狀態(tài)信息發(fā)送給客戶端來實現(xiàn)遠程信號處理,并接收來自的客戶端的控制信息以實現(xiàn)對機器人的操控。 客戶機端是對機器人進行遠程控制的計算機,它通過請求與服務(wù)器建立連接之后,將控制信息傳送給服務(wù)器端,服務(wù)器端根據(jù)控制信息實現(xiàn)對機器人控制。而且,客戶機端還能夠接受服務(wù)器傳送過來的機器人狀態(tài)信息,以便對機器人獲取的信息進行處理。本文的客戶機端程序通過Connect()與服務(wù)器建立連接,來達到相互通信的目的。 網(wǎng)絡(luò)通信平臺實現(xiàn)的流程圖如圖3所示。服務(wù)器端程序是通信平臺的核心部分,本文的服務(wù)器端程序不僅可以實現(xiàn)與一個遠程客戶機端的單對單通信,而且可以與多個客戶機端同時進行通信。客戶機端程序相對于服務(wù)器端程序比較簡單,沒有了服務(wù)器端程序的*程序和接受連接程序,但是比服務(wù)器端增加了連接程序。連接程序和*程序是區(qū)別于服務(wù)器端程序和客戶機端程序的標(biāo)志。 圖3 通信平臺流程圖 (1) *程序 Listen()(*程序)是服務(wù)器程序區(qū)別于客戶機端程序最主要的標(biāo)志,服務(wù)器端通過*程序來*有沒有客戶機端請求連接。當(dāng)有客戶機提出連接請求,通過*程序?qū)⑦B接請求發(fā)至服務(wù)器來建立兩者之間的連接,服務(wù)器與客戶機才能實現(xiàn)通信。*程序還是區(qū)別使用了流式套接字或數(shù)據(jù)報式套接字的標(biāo)志。*程序的存在為網(wǎng)絡(luò)通信提供了可靠、無差錯的連接。 (2)連接程序 Connect()(連接程序)是客戶端中所獨有的程序,是向服務(wù)器端發(fā)送連接請求所編寫的。連接程序在收到客戶機端需要連接服務(wù)器的請求之后,就會發(fā)送所需要連接的服務(wù)器IP地址和服務(wù)器端口。發(fā)送之后會等待連接消息的反饋消息,來確認客戶機端是否連接成功。 (3) 接受連接程序 Accept()(接收連接程序)是客戶機端對應(yīng)于客戶機端連接程序而編寫的,該程序可以實現(xiàn)對連接程序的反饋。當(dāng)程序接收到客戶機端程序發(fā)來的連接請求時,會對客戶機反饋回連接是否成功的消息,而且該程序可以獲取要求連接的客戶機端的IP地址和端口,以便服務(wù)器端可以記錄客戶機端的連接狀態(tài)信息。 (4)發(fā)送消息程序 Send()(發(fā)送消息程序)可以實現(xiàn)控制信息實時地從遠程操作者一方發(fā)向服務(wù)器,而機器人的狀態(tài)信息又通過各種傳感器(如視覺傳感器、力覺傳感器等)獲取后,由服務(wù)器反饋給遠程客戶端。 (5)接收消息程序 Receive()(接收消息程序)可以實現(xiàn)客戶機或者服務(wù)器端接收來自對方發(fā)送的數(shù)據(jù)消息。該程序在服務(wù)器和客戶機中都是一致的,配合發(fā)送消息程序?qū)崿F(xiàn)了客戶機和服務(wù)器之間的數(shù)據(jù)消息通信。 2.2 實驗結(jié)果 本文的網(wǎng)絡(luò)通信平臺運行之后的界面輸出圖像如圖4所示。 圖4(a)顯示的是服務(wù)器端運行之后的界面。服務(wù)器端是該程序的核心端,所有客戶端的數(shù)據(jù)都將傳輸?shù)椒⻊?wù)器端,客戶端之間通信需要通過服務(wù)器端進行中轉(zhuǎn)。而本文所設(shè)計的程序中的服務(wù)器端不僅可以實現(xiàn)以廣播的形式向所有連接到該服務(wù)器的客戶端發(fā)送信息,還可以以單對單通信的方式向單個的客戶端進行通信。在圖 4(a)中就顯示了服務(wù)器端分別利用這兩種方式進行了通信。點擊界面中的發(fā)送按鈕就采取廣播式發(fā)送信息,而點擊界面中的1和2兩個按鈕則是對特定客戶端發(fā)送數(shù)據(jù)。 本文設(shè)計的程序可以支持多個不同的 圖4 通信平臺運行界面 客戶端和服務(wù)器進行連接并通信。圖4(b)顯示的是IP為“192.168.0.106”的客戶端和服務(wù)器建立連接之后的通信,而圖4(c)則是IP為“192.168.0.110”的客戶端和服務(wù)器通信的界面。 3 實驗性能分析 1.時延和數(shù)據(jù)的丟失問題 機器人遙操作要求數(shù)據(jù)傳輸要具備可靠性和次序性,TCP協(xié)議提供了可靠而有序的傳輸,基于這一特性,可以在傳輸過程中使用超時重傳、分段、重組等檢錯糾錯策略,通過這些檢錯糾錯策略可以保證在數(shù)據(jù)傳輸過程中的可靠性和有序性,可以有效的防止數(shù)據(jù)的丟失。 機器人遠端遙操作控制的采用并不意味著實時控制作用被上移到網(wǎng)絡(luò),實時控制依然由現(xiàn)場的控制單元來完成,而網(wǎng)絡(luò)遙操作更關(guān)注的是對現(xiàn)場信息的監(jiān)視和管理以及對機器人的非實時控制,所以TCP通信在傳輸過程中存在的時延問題也就顯得影響不大。 2.數(shù)據(jù)共享問題及其解決方案 由于本文中程序是多任務(wù)多線程的,當(dāng)多個客戶端同時連接到服務(wù)器時,多任務(wù)、多線程就極易造成數(shù)據(jù)共享問題。數(shù)據(jù)共享問題可以解釋如下:假定有多個函數(shù)(或者ISR、任務(wù))共享一個變量,如果在某一時刻存在對該變量的數(shù)值的操作,并且在對其施加操作的的過程中,僅有部分操作完成,還有一部分沒有完成,若在此時產(chǎn)生一個中斷,如果此時還有另一個函數(shù)也在共享該變量,且前面的操作已經(jīng)完成,該變量的數(shù)值可能與預(yù)期的不同。因此,當(dāng)一個函數(shù)與另一個函數(shù)共享某變量時,所調(diào)用的ISR或者另一個函數(shù)都有可能改變此變量,是變量的數(shù)值發(fā)生變化,在返回時此變量的新數(shù)值將從堆棧轉(zhuǎn)載到四個寄存器中,未完成的操作將按照寄存器中的新數(shù)值執(zhí)行,程序就會發(fā)生錯誤。 在本文中,利用了以下措施消除了程序中由共享數(shù)據(jù)問題所導(dǎo)致的錯誤。 1) 對于從中斷返回的變量,在聲明中使用了volatile。此聲明可以警告編譯器,這些變量是可更改的。 2)在中斷之前將完全執(zhí)行的部分中對原子指令使用可再生函數(shù),此部分叫臨界段。 3) 將共享的變量放入循環(huán)隊列中。需要使用該變量數(shù)值的函數(shù)總是從隊列的前端將其刪除。而另一些寫入該變量的數(shù)值的函數(shù)總是從隊列的末端進行操作。 4)在臨界段開始執(zhí)行之前通過使用信號量來關(guān)閉中斷,在其完成之時打開中斷。 4 結(jié)論 本文設(shè)計了一種基于TCP協(xié)議的網(wǎng)絡(luò)通信平臺,通過該平臺可以實現(xiàn)遠程客戶機與本地服務(wù)器之間的信息通信,而且保證了數(shù)據(jù)傳輸?shù)目煽啃院痛涡蛐�,對機器人的遙操作提供了可靠的網(wǎng)絡(luò)通信條件。 網(wǎng)絡(luò)通信平臺的建立,擴大了對機器人操作的遠程化距離,而且該平臺具有架構(gòu)容易,低成本,維護便利等優(yōu)點,對機器人遙操作領(lǐng)域的技術(shù)進步將會起到幫助作用。 |