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