目前,機器人遙操作系統(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)模式中的功能可將其分為兩類:
監(jiān)聽套接字:該套接字位于服務(wù)器端,它的主要功能就是對特定的端口進行不斷的監(jiān)聽,當(dāng)檢測到有連接請求時,接受申請,并構(gòu)造一個新的客戶端套接字,與連接申請方的客戶端套接字建立連接,從而為雙方的通信做好準備。
客戶端套接字:該套接字是用來進行網(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ù)器中的監(jiān)聽套接字對斷口進行偵聽,客戶端的套接字向服務(wù)器端的特定斷口提出連接申請。
(2)通信階段:這是整個過程的核心部分,任務(wù)就是負責(zé)數(shù)據(jù)的收發(fā)。
(3)拆除連接階段:在傳完數(shù)據(jù)之后,關(guān)閉套接字,釋放所分配的資源。
使用Soeket編寫TCP通信程序的主要步驟如下:
1) 構(gòu)造 Soeket對象 ;
2) 使用該對象構(gòu)造基本的Socket句柄。由于遙操作的數(shù)據(jù)通信要求可靠,準確,故采用TCP協(xié)議,套接字使用流式套接字;
3) 建立客戶機CSocket,調(diào)用Connect()建立與服務(wù)器套接字的連接.服務(wù)器調(diào)用Listen()監(jiān)聽請求連接情況,并在收到客戶端請求后調(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ù)器端程序,主要是建立一個能夠讓客戶端連接的端口,并通過監(jiān)聽,與需要連接的客戶端建立連接,并與其進行數(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ù)器端程序的監(jiān)聽程序和接受連接程序,但是比服務(wù)器端增加了連接程序。連接程序和監(jiān)聽程序是區(qū)別于服務(wù)器端程序和客戶機端程序的標志。
?
圖3 通信平臺流程圖
(1) 監(jiān)聽程序
Listen()(監(jiān)聽程序)是服務(wù)器程序區(qū)別于客戶機端程序最主要的標志,服務(wù)器端通過監(jiān)聽程序來監(jiān)聽有沒有客戶機端請求連接。當(dāng)有客戶機提出連接請求,通過監(jiān)聽程序?qū)⑦B接請求發(fā)至服務(wù)器來建立兩者之間的連接,服務(wù)器與客戶機才能實現(xiàn)通信。監(jiān)聽程序還是區(qū)別使用了流式套接字或數(shù)據(jù)報式套接字的標志。監(jiān)聽程序的存在為網(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è)計的程序可以支持多個不同的
?
(a)
?
(b)
?
(c)
圖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ò)通信條件。
評論
查看更多