




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
PAGEPAGE1計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)設(shè)計(jì)報(bào)告設(shè)計(jì)名稱基于ad-hoc網(wǎng)絡(luò)的無線定位系統(tǒng)目錄需求分析…………4系統(tǒng)調(diào)研報(bào)告……………………總體設(shè)計(jì)………..5系統(tǒng)的流程及關(guān)鍵技術(shù)………..6系統(tǒng)使用說明……………………8實(shí)驗(yàn)中遇到的問題和解決方法………………11實(shí)驗(yàn)總結(jié)………12程序源碼………13需求分析1.系統(tǒng)開發(fā)背景可穿戴設(shè)備是一種通過軟件支持以及數(shù)據(jù)交互來實(shí)現(xiàn)強(qiáng)大功能的硬件設(shè)備。智能手環(huán)引發(fā)了我們對(duì)于健康問題的關(guān)注,谷歌眼鏡讓我看到了“拓展現(xiàn)實(shí)”的可能。隨著可穿戴設(shè)備的日漸發(fā)展,它已經(jīng)對(duì)我們的生活、感知帶來了巨大的轉(zhuǎn)變并滲透到了我們生活的方方面面。此外,可穿戴設(shè)備的應(yīng)用領(lǐng)域也被不斷擴(kuò)大,其中運(yùn)動(dòng)領(lǐng)域也是可穿戴設(shè)備掀起巨大革命的主戰(zhàn)場(chǎng)之一。該系統(tǒng)可以實(shí)通過實(shí)時(shí)分析足球運(yùn)動(dòng)員在場(chǎng)上的位置情況,便于教練員監(jiān)控球員的戰(zhàn)術(shù)執(zhí)行以及及時(shí)根據(jù)場(chǎng)上情況變更戰(zhàn)術(shù)。因此,在進(jìn)行硬件微型化處理之后,該系統(tǒng)無論在球員的訓(xùn)練還是實(shí)戰(zhàn)中對(duì)于提高運(yùn)動(dòng)員競(jìng)技水平,提高球隊(duì)效率都有著十分重要的意義。2.系統(tǒng)目標(biāo)球員通過置于自己身上的追蹤器發(fā)送信號(hào),通過教練端的計(jì)算機(jī)直觀方便地實(shí)時(shí)顯示球員的位置和運(yùn)動(dòng)路線,定位精度精確到3米以內(nèi),幫助教練制定和改變戰(zhàn)術(shù)。3.系統(tǒng)范圍本系統(tǒng)是可實(shí)際使用的球員定位系統(tǒng)的一個(gè)demo,適用于各業(yè)余、專業(yè)足球俱樂部,學(xué)校校隊(duì)等,適用于任何想要通過該系統(tǒng)提高訓(xùn)練效率與實(shí)戰(zhàn)勝率的球隊(duì)或組織。4.系統(tǒng)的成功標(biāo)準(zhǔn)界面友好,系統(tǒng)穩(wěn)定,可以正常使用該系統(tǒng)并且不出現(xiàn)BUG,用戶能快速理解并使用該系統(tǒng)進(jìn)行日常操作。系統(tǒng)調(diào)研報(bào)告定位系統(tǒng)綜述由于定位技術(shù)的廣泛需求與應(yīng)用,出現(xiàn)了基于各種技術(shù)的定位系統(tǒng)。定位系統(tǒng)的穩(wěn)定性與定位精度無疑成為了衡量各個(gè)系統(tǒng)優(yōu)劣的重要指標(biāo)。目前比較廣泛使用的定位技術(shù)有:GPS定位技術(shù)、RFID定位技術(shù)、基于信號(hào)模型的定位技術(shù)、超聲定位技術(shù)、ZigBee定位技術(shù)以及無線定位技術(shù)。GPS定位:GPS(GlobalPositioningSystem全球定位系統(tǒng))是由美國(guó)建立的一個(gè)衛(wèi)星導(dǎo)航系統(tǒng)??臻g部分是由24顆GPS工作衛(wèi)星所組成,每顆GPS工作衛(wèi)星都發(fā)出用于導(dǎo)航定位的信號(hào)??刂撇糠钟煞植荚谌虻娜舾筛櫿窘M成的監(jiān)控系統(tǒng)構(gòu)成,而用戶部分有GPS接收機(jī)、數(shù)據(jù)處理軟件及相應(yīng)用戶設(shè)備所組成。通過接受GPS衛(wèi)星所發(fā)出的信號(hào),利用這些信號(hào)進(jìn)行導(dǎo)航定位。GPS定位可以實(shí)現(xiàn)全天候、連續(xù)、實(shí)時(shí)的三維導(dǎo)航定位,但其精度通常無法達(dá)到球場(chǎng)所需的要求。RFID定位技術(shù):2.無線定位綜述相對(duì)于其他定位技術(shù)而言,無線定位技術(shù)具有定位精度高、實(shí)時(shí)性好、定位成本低廉、速度快且不受天氣等因素影響的巨大優(yōu)勢(shì)。但是由于障礙物對(duì)于無線信號(hào)的衰減,所處環(huán)境的復(fù)雜程度也是影響其定位精度的重要因素之一。此外,所采用的無線定位算法,也將對(duì)精度高低產(chǎn)生巨大的影響。下表列出了各個(gè)無線定位算法的比較:算法名稱精度實(shí)現(xiàn)難度算法描述缺點(diǎn)中心點(diǎn)法不高容易將被定位的終端所能探測(cè)到的所有接入點(diǎn)的算術(shù)平均值作為定位的結(jié)果精度不高加權(quán)中心點(diǎn)法不高容易以所有接入點(diǎn)的加權(quán)平均值作為定位結(jié)果,這個(gè)權(quán)值是和接收到的AP點(diǎn)的信號(hào)強(qiáng)度有關(guān)精度不高AP-DI法不高容易此法可以看做是只有一個(gè)WiFi接入點(diǎn)的中心點(diǎn)法,即把這個(gè)接入點(diǎn)位置作為最終的定位結(jié)果精度較低,安全性不高基于模型的算法比較高適中這個(gè)算法主要是將接收到的信號(hào)強(qiáng)度和傳播距離進(jìn)行轉(zhuǎn)換。一旦信號(hào)強(qiáng)度轉(zhuǎn)換成距離,就能進(jìn)行傳統(tǒng)的三角定位接收機(jī)型號(hào)會(huì)影響適用性指紋算法比較高較復(fù)雜有最近鄰算法、K近鄰算法、基于概率的算法(貝葉斯算法)、基于相關(guān)系數(shù)的算法等僅適用于被采集指紋的區(qū)域在足球場(chǎng)這一特定應(yīng)用情境下,需要較高的定位精度,且由于區(qū)域有限,指紋算法十分適用于這一環(huán)境,因此,在硬件設(shè)備相對(duì)有限的情況下,小組采用定位精度同樣較高的指紋算法實(shí)現(xiàn)足球運(yùn)動(dòng)員系統(tǒng)。3.各Fingerprinting算法比較總體設(shè)計(jì)系統(tǒng)架構(gòu):1.局域網(wǎng)組建1.1采用硬件設(shè)備介紹:BeagleBoneBlack開發(fā)板:優(yōu)點(diǎn):內(nèi)建文件系統(tǒng),可以容易的存儲(chǔ)、組織和檢索數(shù)據(jù);支持多種可用的編程語言且支持多線程;有完善的開發(fā)文檔和論壇資源;開源硬件,功能強(qiáng)大且拓展性高。RTL8187主控芯片優(yōu)點(diǎn):具有三倍放大功率,USB接口,適用于BeagleBoneBlack開發(fā)板;可以穩(wěn)定接收較弱的信號(hào);成本低,經(jīng)測(cè)試覆蓋范圍足夠?qū)嶒?yàn)所需。1.2硬件設(shè)計(jì)筆記本電腦同時(shí)搭載天線和無線網(wǎng)卡模擬基站,天線開啟monitor模式進(jìn)行監(jiān)聽,嗅探追蹤器定時(shí)發(fā)出的數(shù)據(jù)包。基站處理數(shù)據(jù)包提取定位算法所需的RSSI數(shù)值。四個(gè)筆記本電腦在同一路由表內(nèi),基站自動(dòng)轉(zhuǎn)發(fā)帶有RSSI數(shù)值的數(shù)據(jù)包至上位機(jī)。上位機(jī)對(duì)數(shù)據(jù)包進(jìn)行綜合處理,實(shí)現(xiàn)定位算法并實(shí)時(shí)顯示。1.3軟件設(shè)計(jì)(1)Ad-hoc網(wǎng)絡(luò):定義:Ad-hoc網(wǎng)是一種多跳的、無中心的、自組織無線網(wǎng)絡(luò),又稱為多跳網(wǎng)(Multi-hopNetwork)、無基礎(chǔ)設(shè)施網(wǎng)(InfrastructurelessNetwork)或自組織網(wǎng)(Self-organizingNetwork)。整個(gè)網(wǎng)絡(luò)沒有固定的基礎(chǔ)設(shè)施,每個(gè)節(jié)點(diǎn)都是移動(dòng)的,并且都能以任意方式動(dòng)態(tài)地保持與其它節(jié)點(diǎn)的聯(lián)系。在這種網(wǎng)絡(luò)中,由于終端無線覆蓋取值范圍的有限性,兩個(gè)無法直接進(jìn)行通信的用戶終端可以借助其它節(jié)點(diǎn)進(jìn)行分組轉(zhuǎn)發(fā)。每一個(gè)節(jié)點(diǎn)同時(shí)是一個(gè)路由器,它們能完成發(fā)現(xiàn)以及維持到其它節(jié)點(diǎn)路由的功能。應(yīng)用需求:在沒有有線通信設(shè)施的地方,如沒有建立硬件通信設(shè)施或有線通信設(shè)施遭受破壞;需要分布式特性的網(wǎng)絡(luò)通信環(huán)境;現(xiàn)有有線通信設(shè)施不足,需要臨時(shí)快速建立一個(gè)通信網(wǎng)絡(luò)環(huán)境;作為生存性較強(qiáng)的后備網(wǎng)絡(luò)。在足球場(chǎng)這一應(yīng)用情境下,ad-hoc網(wǎng)絡(luò)的組網(wǎng)的便捷性、實(shí)用性以及低廉的成本發(fā)揮了較大的優(yōu)勢(shì)。該系統(tǒng)需要組成對(duì)等的臨時(shí)網(wǎng)絡(luò),因此我們選取了Ad-hoc的網(wǎng)絡(luò)模型。在該模型下,在足球場(chǎng)上配備三個(gè)基站(筆記本搭載天線模擬),一臺(tái)上位機(jī)即可完成實(shí)驗(yàn)測(cè)試。(2)OLSR路由協(xié)議:OLSR路由協(xié)議是由IETFMANET(MobileAdhocNETwork)工作組為無線移動(dòng)AdHoc網(wǎng)提出的一種標(biāo)準(zhǔn)化的表驅(qū)動(dòng)式優(yōu)化鏈路狀態(tài)路由協(xié)議。節(jié)點(diǎn)之間需要周期性地交換各種控制信息,通過分布式計(jì)算來更新和建立自己的網(wǎng)絡(luò)拓?fù)鋱D,被鄰節(jié)點(diǎn)選為多點(diǎn)中繼站MPR(MultipointRelay)的節(jié)點(diǎn)需要周期性地向網(wǎng)絡(luò)廣播控制信息。根據(jù)所選取的網(wǎng)絡(luò)模型,采用OLSR協(xié)議實(shí)現(xiàn)基站對(duì)追蹤器所發(fā)出信息包的嗅探以及基站間信息包的轉(zhuǎn)發(fā)。該路由協(xié)議適配于小組選擇的Ad-hoc網(wǎng)絡(luò)模型,此外,該協(xié)議以路由跳數(shù)提供最優(yōu)路徑,適用于實(shí)驗(yàn)應(yīng)用場(chǎng)景。局域網(wǎng)內(nèi)基站軟件工作過程所有基站以及上位機(jī)均處于ad-hoc網(wǎng)絡(luò)中,通過改寫每個(gè)基站的網(wǎng)卡配置實(shí)現(xiàn);配置完成后開啟網(wǎng)卡;開啟追蹤器的發(fā)包程序,定時(shí)發(fā)送數(shù)據(jù)包基站通過嗅探程序處理嗅探到的數(shù)據(jù)包,采集定位算法所需的RSSI數(shù)值;基站通過轉(zhuǎn)發(fā)程序?qū)崿F(xiàn)包含RSSI值,基站標(biāo)記以及時(shí)間戳的數(shù)據(jù)包至上位機(jī);上位機(jī)處理該數(shù)據(jù)包,實(shí)現(xiàn)指紋定位算法,實(shí)時(shí)顯示球員位置與運(yùn)動(dòng)軌跡。2.Fingerprinting算法設(shè)計(jì)開發(fā)環(huán)境:Javajdk1.6開發(fā)平臺(tái):EclipseWindowBuilderRSSI的提取RSSI是ReceivedSignalStrengthIndicator的簡(jiǎn)稱,指的是接收到的無線信號(hào)的強(qiáng)度指標(biāo),我們通過選擇RSSI值來生成位置指紋。它與距離d有一個(gè)近似Log模型的數(shù)據(jù)關(guān)系:其中,p0為基站功率,或者基站處的信號(hào)強(qiáng)度,d為測(cè)試點(diǎn)與基站的距離,d0為單位距離,一般取1m,ω(θ)是以測(cè)試點(diǎn)和坐標(biāo)原點(diǎn)的連線與橫坐標(biāo)軸之間的夾角為自變量的環(huán)境干擾參數(shù)。我們小組使用libpcap進(jìn)行抓包,對(duì)數(shù)據(jù)包的內(nèi)容進(jìn)行分析,將包固定位置的RSSI數(shù)值以及時(shí)間戳信息提取出來。反復(fù)抓包以采集RSSI信號(hào)。Fingerprinting定位算法設(shè)計(jì)Fingerprinting定位算法的基本思想是利用RSSI受距離和環(huán)境影響而變化這一特點(diǎn),其依賴于定位區(qū)域中指紋的采集而形成的樣本庫。在該系統(tǒng)中,我們?cè)跍y(cè)試場(chǎng)地的三個(gè)角安置基站用于發(fā)射WIFI信號(hào)。定位算法實(shí)現(xiàn)的第一步便是樣本庫的建立。我們將測(cè)試場(chǎng)地(足球場(chǎng))用網(wǎng)格劃分為若干個(gè)采樣點(diǎn),用追蹤器監(jiān)聽基站信號(hào),同時(shí)將數(shù)據(jù)發(fā)送到上位機(jī)建立樣本庫。在數(shù)據(jù)采集的過程中,測(cè)試人員保持追蹤器位置不變,緩慢旋轉(zhuǎn),將得到的數(shù)據(jù)進(jìn)行平均以減少人體遮擋所帶來的干擾。樣本庫建立完畢,進(jìn)入實(shí)地測(cè)試階段。上位機(jī)接收實(shí)時(shí)的RSSI數(shù)據(jù)包,進(jìn)行濾波處理,并與樣本庫進(jìn)行匹配,計(jì)算RSSI方差,估算追蹤器的坐標(biāo),并在場(chǎng)地模型上進(jìn)行顯示。總體而言,F(xiàn)ingerprinting定位算法簡(jiǎn)單,易實(shí)現(xiàn),效率高,但定位精度有所欠缺,在與樣本庫匹配的過程中,有可能匹配到實(shí)際位置點(diǎn)周圍的點(diǎn)上,這是有待改進(jìn)的部分。系統(tǒng)的流程及關(guān)鍵技術(shù)局域網(wǎng)局域網(wǎng)環(huán)境搭建RSSI信號(hào)采集Fingerprinting算法實(shí)現(xiàn)系統(tǒng)集成與測(cè)試1.系統(tǒng)的實(shí)際工作流程如下:將追蹤器置于球員身上,啟動(dòng)追蹤器程序發(fā)送數(shù)據(jù)包;周圍wifi模擬基站利用Ad-hoc網(wǎng)絡(luò)模型組網(wǎng),與追蹤器通信,嗅探數(shù)據(jù)包,處理后采集RSSI信號(hào)并在網(wǎng)內(nèi)轉(zhuǎn)發(fā);上位機(jī)對(duì)發(fā)送過來的數(shù)據(jù)包進(jìn)行處理,利用Fingerprinting算法計(jì)算出球員的物理位置,實(shí)現(xiàn)球員定位;上位機(jī)圖形化實(shí)時(shí)顯示球員的位置。2.關(guān)鍵技術(shù):(1)Ad-hoc組網(wǎng)與RSSI信號(hào)的采集:所用器材:帶有無線網(wǎng)卡的筆記本電腦五臺(tái)(其中,三臺(tái)裝有LinuxUbuntu版),一臺(tái)裝有Windows系統(tǒng)及Java開發(fā)環(huán)境,另一臺(tái)裝有Windows系統(tǒng)并使用putty應(yīng)用程序與BeagleBoneBlack通信)。四個(gè)RTL8187無線網(wǎng)卡,一個(gè)TL-WN322G+無線網(wǎng)卡,一個(gè)BeagleBoneBlack開發(fā)板。硬件部分:三臺(tái)基站均連接RTL8187天線(由于筆記本性能差異,基站2的自帶無線網(wǎng)卡太弱,因此另加了一個(gè)TL-WN322G+無線網(wǎng)卡供實(shí)驗(yàn)使用),充當(dāng)追蹤器的電腦連接BeagleBoneBlack開發(fā)板并搭載RTL8187天線。軟件部分:將所有基站以及上位機(jī)置于同一Ad-hoc網(wǎng)絡(luò)中,通過在/etc/network/interfaces中改寫網(wǎng)卡配置文件實(shí)現(xiàn),具體實(shí)現(xiàn)代碼見附錄;追蹤器開啟發(fā)包程序,持續(xù)發(fā)送UDP數(shù)據(jù)包,具體實(shí)現(xiàn)代碼見附錄;基站開啟嗅探程序獲取RSSI信號(hào)數(shù)值以及追蹤器的MAC地址,并開啟轉(zhuǎn)發(fā)程序?qū)⒆陨淼腗AC地址以及嗅探到的RSSI數(shù)值和追蹤器的MAC地址打包蓋上時(shí)間戳之后轉(zhuǎn)發(fā)給上位機(jī)(若在這一過程中發(fā)現(xiàn)某個(gè)基站距離上位機(jī)過遠(yuǎn)導(dǎo)致無法直接到達(dá),則開啟Olsrd路由協(xié)議通過距離近的基站進(jìn)行轉(zhuǎn)發(fā))。各個(gè)基站均需安裝libpcap工具并且編譯時(shí)連接libpcap庫(-lpcap)實(shí)現(xiàn)RSSI信號(hào)的采集,具體實(shí)現(xiàn)代碼見附錄;上位機(jī)接受來自各個(gè)基站發(fā)來的數(shù)據(jù)包,存入文件進(jìn)行進(jìn)一步處理。(2)Fingerprinting定位算法的實(shí)現(xiàn)以及位置的實(shí)時(shí)顯示:Fingerprinting算法的設(shè)計(jì)與基本原理已經(jīng)在上一部分做了詳細(xì)的闡釋,這一部分主要介紹本小組Fingerprinting定位算法實(shí)現(xiàn)的具體過程。小組將足球場(chǎng)抽象成無應(yīng)力平面圖,在上面劃分柵格,大約每隔一米建立一個(gè)采樣點(diǎn),測(cè)試采樣點(diǎn)的RSSI數(shù)值,建立定位指紋庫;在初始階段,小組采用方差配對(duì)的方式實(shí)現(xiàn)定位,上位機(jī)根據(jù)802.11協(xié)議對(duì)數(shù)據(jù)包的格式定義取出追蹤器的RSSI數(shù)值,將取出的RSSI與數(shù)據(jù)庫指紋做方差比較,選出方差最小的數(shù)據(jù)以獲得坐標(biāo)并實(shí)現(xiàn)定位。該算法較為簡(jiǎn)單容易實(shí)現(xiàn),效率高,多點(diǎn)匹配的現(xiàn)象較少,對(duì)于小組初步集成系統(tǒng)以及把控系統(tǒng)的精度具有很大的意義,但是該方法依舊會(huì)匹配多個(gè)點(diǎn);在方差匹配的基礎(chǔ)上,小組對(duì)定位算法進(jìn)行了優(yōu)化,采用KNN算法實(shí)現(xiàn)定位。通過計(jì)算出數(shù)據(jù)庫中j參考點(diǎn)來自3個(gè)AP接入點(diǎn)的平均值,根據(jù)歐氏距離公式計(jì)算出與t時(shí)刻的在線RSSI值Rt的歐式距離。然后選出歐氏距離較小的K個(gè)點(diǎn)求平均然后獲得坐標(biāo),確定球員的物理位置。用該算法實(shí)現(xiàn)效率較高且沒有出現(xiàn)多點(diǎn)匹配的情況,該算法的實(shí)現(xiàn)較貝葉斯算法和神經(jīng)網(wǎng)絡(luò)算法相對(duì)簡(jiǎn)單。(3)系統(tǒng)測(cè)試與優(yōu)化①Fingerprinting無線定位算法的實(shí)現(xiàn),RSSI數(shù)值的穩(wěn)定性與精確性起到了至關(guān)重要的作用,而遮擋物無疑會(huì)對(duì)RSSI的數(shù)值產(chǎn)生巨大的影響,因此小組首先設(shè)計(jì)對(duì)比實(shí)驗(yàn)分析走動(dòng)與遮擋對(duì)RSSI數(shù)值的影響。實(shí)驗(yàn)測(cè)量旋轉(zhuǎn)對(duì)RSSI數(shù)值的影響:小組設(shè)計(jì)將追蹤器垂直于地面放于胸前,此時(shí)測(cè)量旋轉(zhuǎn)因素(有人體遮擋)對(duì)于RSSI數(shù)值的影響;將追蹤器平行于地面放于胸前,測(cè)量旋轉(zhuǎn)因素(有人體遮擋)對(duì)于RSSI數(shù)值的影響;接下來,小組通過改變追蹤器的放置位置,測(cè)量追蹤器的放置位置對(duì)于RSSI數(shù)值的影響并評(píng)估該系統(tǒng)定位精度。實(shí)驗(yàn)測(cè)量追蹤器放置位置對(duì)RSSI數(shù)值的影響:將追蹤器垂直于地面放于胸前(有人體遮擋)沿著三角區(qū)域邊緣行走測(cè)量RSSI數(shù)值的變化;蹤器平托于胸前(有人體遮擋)沿著三角區(qū)域邊緣行走,測(cè)量RSSI數(shù)值的變化;將追蹤器平放于頭頂(無人體遮擋)沿著三角區(qū)域邊緣行走,測(cè)量RSSI數(shù)值的變化;最后,小組有設(shè)計(jì)實(shí)驗(yàn)來測(cè)量RSSI的變化幅度,通過測(cè)量一條直線上的RSSI數(shù)值變化(追蹤器平放于頭頂)實(shí)現(xiàn)。實(shí)驗(yàn)測(cè)試最初的實(shí)驗(yàn)結(jié)果截圖如下(部分):②由于初始實(shí)驗(yàn)的測(cè)試結(jié)果十分粗糙,精度不是很高,有的點(diǎn)甚至出現(xiàn)了多點(diǎn)匹配的情況,因此,小組設(shè)計(jì)實(shí)驗(yàn)進(jìn)行了干擾信號(hào)過濾的處理,以提高系統(tǒng)精度。最后的預(yù)期結(jié)果應(yīng)該是獲得一個(gè)符合高斯分布的概率分布圖,小組獲得的原始數(shù)據(jù)如下圖所示:因此,小組采用高斯濾波的方式調(diào)整原始數(shù)據(jù)的分布圖,使其近似滿足高斯分布。根據(jù)高斯濾波的定義,對(duì)所得到的數(shù)據(jù)進(jìn)行加權(quán)平均,得到的實(shí)驗(yàn)結(jié)果如下:最后實(shí)驗(yàn)測(cè)得,當(dāng)取25個(gè)數(shù)值進(jìn)行平均后所得的概論分布圖像最優(yōu),因此在發(fā)送數(shù)據(jù)包的過程中我們采用取25個(gè)做平均的方式進(jìn)行。系統(tǒng)使用說明本系統(tǒng)是涵蓋了硬件設(shè)計(jì)與軟件設(shè)計(jì)的綜合性系統(tǒng),采用BeagleBoneBlack開發(fā)板作為追蹤器,筆記本電腦搭載RTL8187芯片模擬基站實(shí)現(xiàn)足球運(yùn)動(dòng)員的實(shí)時(shí)定位。首先運(yùn)動(dòng)員要佩戴BeagleBoneBlack模擬的追蹤器(由于我們?cè)O(shè)計(jì)的系統(tǒng)是實(shí)際可用系統(tǒng)的簡(jiǎn)單demo,因此硬件沒有做微小化處理),運(yùn)動(dòng)員開啟追蹤器,追蹤器上的發(fā)包程序便會(huì)開始按固定時(shí)間發(fā)送數(shù)據(jù)包(UDP);教練在固定區(qū)域里所需的位置處設(shè)立基站,基站已經(jīng)事先調(diào)為Ad-hoc模式,因此教練員只需打開基站上的嗅探程序以及轉(zhuǎn)發(fā)程序,基站間就可以持續(xù)地嗅探追蹤器所發(fā)出的數(shù)據(jù)包并截取數(shù)據(jù)包中所需的RSSI數(shù)值以及基站的MAC地址并且蓋上時(shí)間戳在網(wǎng)內(nèi)轉(zhuǎn)發(fā)至上位機(jī)等待進(jìn)一步處理;教練員在上位機(jī)終端打開實(shí)現(xiàn)定位算法與位置圖像化顯示的程序,即可開始對(duì)發(fā)送至上位機(jī)的數(shù)據(jù)包進(jìn)行處理,并在電腦屏幕上顯示運(yùn)動(dòng)員的位置,便于教練對(duì)運(yùn)動(dòng)員的軌跡路線進(jìn)行觀察,判斷球員的戰(zhàn)術(shù)執(zhí)行情況以及靈活地變更戰(zhàn)術(shù)。實(shí)驗(yàn)中遇到的問題與解決方法1.對(duì)于開題報(bào)告時(shí)老師指出的問題:如果有多個(gè)追蹤器同時(shí)在網(wǎng)內(nèi)運(yùn)動(dòng),是否會(huì)在基站處理時(shí)造成沖突?解決方法:在開題報(bào)告之后小組查閱了大量資料,發(fā)現(xiàn)WIFI的協(xié)議本身就喲與防碰撞的機(jī)制,如果發(fā)生碰撞的話,接收端的基站就無法解碼,后期小組進(jìn)行了實(shí)驗(yàn)測(cè)試,基站可以正確解碼并發(fā)送數(shù)據(jù)包,因此這種碰撞的情況可以得到解決。2.硬件的穩(wěn)定性問題:由于筆記本電腦自身電池供電的電壓不穩(wěn)定等限制,可能會(huì)導(dǎo)致系統(tǒng)產(chǎn)生一些不可預(yù)期的誤差。解決方法:為了是追蹤器獲得穩(wěn)定的電壓,利用BeagleBoneBlack開發(fā)板有眾多的可用接口這一特點(diǎn),我們?yōu)锽eagleBoneBlack開發(fā)板搭載移動(dòng)電源來解決這一問題,使追蹤器可以獲得穩(wěn)定的電壓。3.在系統(tǒng)集成的最初階段,所采用的定位算法較為粗糙,導(dǎo)致了多點(diǎn)匹配的情況,定位精度較差。解決方案:后期小組對(duì)定位算法的實(shí)現(xiàn)進(jìn)行了一定的改進(jìn),采用KNN算法實(shí)現(xiàn)定位,大大提高了系統(tǒng)的定位精度,在測(cè)試過程中也幾乎不出現(xiàn)多點(diǎn)匹配的情況,此外,經(jīng)過高斯濾波的處理,也是數(shù)據(jù)所得到的分布達(dá)到了預(yù)期的效果。實(shí)驗(yàn)總結(jié)通過本次實(shí)驗(yàn),小組對(duì)于實(shí)際組網(wǎng)原理與過程、各種網(wǎng)絡(luò)模型、無線網(wǎng)絡(luò)協(xié)議等都有了更為深入的認(rèn)識(shí)。同時(shí),本次實(shí)驗(yàn)也讓小組實(shí)際體驗(yàn)了涉及軟件設(shè)計(jì)和硬件設(shè)計(jì)兩方面的完整系統(tǒng)的實(shí)現(xiàn)。其中,硬件方面出現(xiàn)了許多不可預(yù)期的問題,小組通過查閱大量資料以及實(shí)際測(cè)試找出了這些問題的解決方案,對(duì)嵌入式編程、網(wǎng)卡的原理、配置以及各個(gè)硬件有了深刻的理解。在軟件設(shè)計(jì)方面,本次課程設(shè)計(jì)小組采用了多種程序設(shè)計(jì)語言實(shí)現(xiàn),在接觸硬件底層的部分,小組采用C語言進(jìn)行編寫實(shí)現(xiàn)了數(shù)據(jù)包的嗅探與轉(zhuǎn)發(fā),在與用戶接觸的終端部分,為了設(shè)計(jì)對(duì)用戶更為友好的界面以及便于跨平臺(tái)的移植,小組采用Java編寫實(shí)現(xiàn)了定位算法以及球員位置的顯示,也對(duì)這兩種編程語言的使用增加了實(shí)踐經(jīng)驗(yàn)。經(jīng)過多次實(shí)地實(shí)驗(yàn)以及對(duì)系統(tǒng)代碼以及硬件的調(diào)整和優(yōu)化,本次課程設(shè)計(jì)小組最后系統(tǒng)的精度大致在3米左右,達(dá)到了合理的誤差水平。小組查閱資料發(fā)現(xiàn),目前國(guó)外足球俱樂部投入使用的相關(guān)定位以及生理監(jiān)測(cè)的可穿戴設(shè)備的精度達(dá)到了1米以內(nèi),因此不可否認(rèn)的是,該系統(tǒng)離實(shí)際可投入使用的系統(tǒng)的精度還存在一定的距離。小組進(jìn)一步查閱資料發(fā)現(xiàn),他們所采用的時(shí)間差的定位算法等對(duì)于實(shí)際硬件設(shè)備有較高的要求,成本較高,超出了小組的可實(shí)行范圍。此外,本小組進(jìn)行的濾波處理雖然調(diào)制出了近似高斯分布的概率分布圖,但是做使用的濾波方法還是較為粗糙,有待進(jìn)一步的改進(jìn)。最后,小組通過優(yōu)化實(shí)現(xiàn)的KNN算法,雖然已經(jīng)達(dá)到了精度較高的水平,但是與目前越來越流行的神經(jīng)網(wǎng)絡(luò)算法還是有一定差距,由于課程設(shè)計(jì)的時(shí)間限制,關(guān)于神經(jīng)網(wǎng)絡(luò)算法的進(jìn)一步實(shí)現(xiàn),小組還會(huì)進(jìn)行進(jìn)一步的探究??偠灾?,雖然該系統(tǒng)還存在一些需要改善的地方,但是在有限的時(shí)間和成本范圍內(nèi),該系統(tǒng)驗(yàn)證了精度對(duì)于球員定位的可行性,是一個(gè)demo,也是對(duì)同時(shí)涉及軟硬件實(shí)際可用系統(tǒng)開發(fā)的一次寶貴經(jīng)歷。通過本次課程設(shè)計(jì),小組成員各方面的能力都得到了較大的提升。附錄:程序源碼:更改網(wǎng)卡配置:在/etc/network/interfaces中寫入:autowlan0(不同天線wlan后的數(shù)字可能不同)ifacewlan0inetstaticwireless-modead-hocwireless-channel11wireless-essidTEST0address(每臺(tái)基站以及追蹤器的IP都不同)追蹤器發(fā)送數(shù)據(jù)包程序:#include<stdio.h>#include<stdlib.h>#include<string.h>#include<errno.h>#include<sys/types.h>#include<sys/socket.h>#include<netinet/in.h>#include<unistd.h>intport=2015;intmain(intargc,char**argv){intsocket_descriptor;intiter=0;charbuf[2];structsockaddr_inaddress;bzero(&address,sizeof(address)); socket_descriptor=socket(AF_INET,SOCK_DGRAM,0);address.sin_family=AF_INET;address.sin_port=htons(port); address.sin_addr.s_addr=inet_addr("55");intbBroadcast=1;setsockopt(socket_descriptor,SOL_SOCKET,SO_BROADCAST,(constchar*)&bBroadcast,sizeof(bBroadcast));for(iter=0;1;iter++){ buf[0]=iter; buf[1]='\n'; sendto(socket_descriptor,buf,sizeof(buf),0,(structsockaddr*)&address,sizeof(address)); usleep(500000); printf("sent:%d\n",iter); }close(socket_descriptor);exit(0);return(EXIT_SUCCESS);}基站嗅探程序(需使用libpcap):#include<sys/socket.h>#include<stdio.h>#include<string.h>#include<netinet/in.h>#include<netdb.h>#include<arpa/inet.h>#include<string.h>#include<stdlib.h>#include<pcap.h>#defineMAXBYTE2CAPTURE2048intport=2015;doublesum=0.0;intcounter=0;voidprocessPacket(u_char*arg,conststructpcap_pkthdr*pkthdr,constu_char*packet){ intbuf[4]; charmessage[15]; intsocket_descriptor; structsockaddr_inaddress; bzero(&address,sizeof(address)); address.sin_family=AF_INET; address.sin_addr.s_addr=inet_addr(""); address.sin_port=htons(port); socket_descriptor=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP); intbBroadcast=1; setsockopt(socket_descriptor,SOL_SOCKET,SO_BROADCAST,(constchar*)&bBroadcast,sizeof(bBroadcast)); buf[2]=256-(int)packet[22]; buf[0]=(int)packet[73]; buf[1]=3; buf[3]=(u_int)packet[86]+256*((256*(u_int)packet[89]+(u_int)packet[88])*256+(u_int)packet[87]); sprintf(message,"%02d#%02d#%02d#%05d\n",buf[0],buf[1],buf[2],buf[3]); sendto(socket_descriptor,&message,sizeof(message),0,(structsockaddr*)&address,sizeof(address)); printf(message); printf("\n\n"); close(socket_descriptor); }intmain(){ inti=0,count=0; bpf_u_int32netaddr=0,mask=0; pcap_t*descr=NULL; charerrbuf[PCAP_ERRBUF_SIZE],*device="wlan4"; memset(errbuf,0,PCAP_ERRBUF_SIZE); structbpf_programfilter; structpcap_pkthdrpkthdr; printf("Openingdevice%s\n",device); descr=pcap_open_live(device,MAXBYTE2CAPTURE,1,512,errbuf); pcap_lookupnet(device,&netaddr,&mask,errbuf); pcap_compile(descr,&filter,"dstport6789",1,mask); pcap_setfilter(descr,&filter); pcap_loop(descr,-1,processPacket,(u_char*)&count); return0;}基站轉(zhuǎn)發(fā)數(shù)據(jù)包程序:#include<stdio.h>#include<stdlib.h>#include<string.h>#include<errno.h>#include<sys/types.h>#include<sys/socket.h>#include<netinet/in.h>#include<unistd.h>#defineMAXLINE4096intportOfRS=2015;intmain(intargc,char**argv){ intsin_len; charmessage[15]; intsocket_descriptor; structsockaddr_insin; bzero(&sin,sizeof(sin)); sin.sin_family=AF_INET; sin.sin_addr.s_addr=htonl(INADDR_ANY); sin.sin_port=htons(portOfRS); sin_len=sizeof(sin); socket_descriptor=socket(AF_INET,SOCK_DGRAM,0); bind(socket_descriptor,(structsockaddr*)&sin,sizeof(sin)); intsockfd,n; int*buf; structsockaddr_inservaddr; sockfd=socket(AF_INET,SOCK_STREAM,0); servaddr.sin_family=AF_INET; servaddr.sin_port=htons(2016); servaddr.sin_addr.s_addr=inet_addr("");//上位機(jī)的IP connect(sockfd,(structsockaddr*)&servaddr,sizeof(servaddr)); while(1) { recvfrom(socket_descriptor,message,sizeof(message),0,(structsockaddr*)&sin,&sin_len); printf("Thedatais:%s\n",message); if(send(sockfd,message,sizeof(message),0)<0) printf("sendfailed\n"); } close(socket_descriptor);close(sockfd);exit(0);return(EXIT_SUCCESS);}定位算法實(shí)現(xiàn)與可視化程序:Database:packageat.client.db.connect;importjava.util.List;importjava.sql.*;importjava.util.ArrayList;publicclassDatabase{//數(shù)據(jù)庫連接類,負(fù)責(zé)與數(shù)據(jù)庫相連接,將數(shù)據(jù)進(jìn)行存儲(chǔ)或者將數(shù)據(jù)取出。publicstaticList<String>lnum=newArrayList<String>();publicstaticList<String>lxn=newArrayList<String>();publicstaticList<String>lyn=newArrayList<String>();publicstaticList<String>lx=newArrayList<String>();publicstaticList<String>ly=newArrayList<String>();publicstaticList<String>l1=newArrayList<String>();publicstaticList<String>l2=newArrayList<String>();publicstaticList<String>l3=newArrayList<String>();//publicstaticList<String>l4=newArrayList<String>();publicstaticvoidgetPosition(){ try{Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");/***直接連接access文件。*/Stringdbur1="jdbc:odbc:driver={MicrosoftAccessDriver(*.mdb,*.accdb)};DBQ=d://athlete.mdb";Connectionconn=DriverManager.getConnection(dbur1);Statementstmt=conn.createStatement();ResultSetrs=stmt.executeQuery("select*fromPOSITION");while(rs.next()){lnum.add(rs.getString("num").trim());lxn.add(rs.getString("x").trim());lyn.add(rs.getString("y").trim());}rs.close();stmt.close();conn.close(); }catch(Exceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); }}publicstaticvoidgetRssi(){ try{Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");/***直接連接access文件。*/Stringdbur1="jdbc:odbc:Driver={MicrosoftAccessDriver(*.mdb,*.accdb)};DBQ=d:\\athlete.mdb";Connectionconn=DriverManager.getConnection(dbur1);Statementstmt=conn.createStatement();ResultSetrs=stmt.executeQuery("select*fromRSSIS");while(rs.next()){lx.add(rs.getString("x").trim());ly.add(rs.getString("y").trim());l1.add(rs.getString("ap1").trim());l2.add(rs.getString("ap2").trim());l3.add(rs.getString("ap3").trim());}rs.close();stmt.close();conn.close(); }catch(Exceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); }}publicstaticvoidsavePosition(Stringnum,Stringx,Stringy){ try{ Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); /** *直接連接access文件。 */ //加載驅(qū)動(dòng) Stringdbur1="jdbc:odbc:driver={MicrosoftAccessDriver(*.mdb,*.accdb)};DBQ=d://athlete.mdb"; Connectionconn=DriverManager.getConnection(dbur1); Statements=conn.createStatement(); //存儲(chǔ)數(shù)據(jù) Stringsql=String.format("insertintoPOSITIONvalues('%s','%s','%s')",num,x,y); s.executeUpdate(sql); s.close(); }catch(Exceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); }}publicstaticvoidsaveRssi(Stringnum,StringtimeNum,doublerssi0,doublerssi1,doublerssi2){ try{ Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); /** *直接連接access文件。 */ //加載驅(qū)動(dòng) Stringdbur1="jdbc:odbc:driver={MicrosoftAccessDriver(*.mdb,*.accdb)};DBQ=d://athlete.mdb"; Connectionconn=DriverManager.getConnection(dbur1); Statements=conn.createStatement(); //存儲(chǔ)數(shù)據(jù) Stringsql=String.format("insertintoRSSIvalues('%s','%s','%d','%d','d%')",num,timeNum,rssi0,rssi1,rssi2); s.executeUpdate(sql); s.close(); }catch(Exceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); }}}Deal:packageat.client.db.connect;importjava.io.BufferedReader;importjava.io.FileReader;importjava.io.IOException;importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.SQLException;importjava.sql.Statement;importjava.util.ArrayList;importjava.util.List;publicclassdeal{ publicstaticvoidsave(Stringnum,Stringx,Stringy){ try{ Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); /** *直接連接access文件。 */ //加載驅(qū)動(dòng) Stringdbur1="jdbc:odbc:driver={MicrosoftAccessDriver(*.mdb,*.accdb)};DBQ=f://athlete.mdb"; Connectionconn=DriverManager.getConnection(dbur1); Statements=conn.createStatement(); //存儲(chǔ)數(shù)據(jù) Stringsql=String.format("insertintotestvalues('%s','%s','%s')",num,x,y); s.executeUpdate(sql); s.close(); }catch(Exceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); }} publicstaticvoidmain(String[]args)throwsIOException,SQLException,ClassNotFoundException{ //TODOAuto-generatedmethodstub Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); /** *直接連接access文件。 */ //加載驅(qū)動(dòng) Stringdbur1="jdbc:odbc:driver={MicrosoftAccessDriver(*.mdb,*.accdb)};DBQ=f://athlete.mdb"; Connectionconn=DriverManager.getConnection(dbur1); Statementsq=conn.createStatement(); //存儲(chǔ)數(shù)據(jù) doubled=0; FileReaderin=newFileReader("src/at/client/db/connect/RssiDoc"); BufferedReaderb=newBufferedReader(in); Stringstr=null; booleanflag=true; while((str=b.readLine())!=null){ System.out.println("read"); String[]s=str.split("#");// System.out.println(s.length); if(s[1].equals("03")){ Stringsql=String.format("insertintotestvalues('%s','%s','%s')",s[1],s[2],s[3]); sq.executeUpdate(sql);} } }}MainFrame:packageat.client.db.connect;importjava.awt.Toolkit;importjava.util.ArrayList;importjava.util.List;importjava.util.TreeMap;importorg.eclipse.swt.SWT;importorg.eclipse.swt.custom.CTabFolder;importorg.eclipse.swt.custom.CTabItem;importorg.eclipse.swt.events.DisposeListener;importorg.eclipse.swt.events.PaintEvent;importorg.eclipse.swt.events.PaintListener;importorg.eclipse.swt.events.SelectionAdapter;importorg.eclipse.swt.events.SelectionEvent;importorg.eclipse.swt.graphics.GC;importorg.eclipse.swt.graphics.Image;importorg.eclipse.swt.widgets.Button;importorg.eclipse.swt.widgets.Canvas;importorg.eclipse.swt.widgets.Display;importorg.eclipse.swt.widgets.Group;importorg.eclipse.swt.widgets.Menu;importorg.eclipse.swt.widgets.MenuItem;importorg.eclipse.swt.widgets.Shell;importorg.eclipse.swt.widgets.Text;importat.client.db.connect.*;importat.client.dc.rssi.DataCollection;importat.client.dc.toxy.FingerPrint;publicclassMainFrame{ publicbooleanflag=true; publicstaticStringfnum; publicstaticList<String>lx=newArrayList<String>(); publicstaticList<String>ly=newArrayList<String>(); protectedShellshell; privateTexttext; publicRssitoDocrd=newRssitoDoc(); /** *Launchtheapplication. *@paramargs */ publicstaticvoidmain(String[]args){ try{ MainFramewindow=newMainFrame(); window.open(); }catch(Exceptione){ e.printStackTrace(); } } /** *Openthewindow. */ publicvoidopen(){ Displaydisplay=Display.getDefault(); createContents(display); shell.open(); shell.layout(); while(!shell.isDisposed()){ if(!display.readAndDispatch()){ display.sleep(); } } } /** *Createcontentsofthewindow. */ protectedvoidcreateContents(finalDisplaydisplay){ shell=newShell(SWT.MIN|SWT.CLOSE|SWT.MAX); intwidth=Toolkit.getDefaultToolkit().getScreenSize().width; intheight=Toolkit.getDefaultToolkit().getScreenSize().height; shell.setSize(width,height); shell.setLocation(0,0); shell.setText("SWTApplication"); Menumenu=newMenu(shell,SWT.BAR); shell.setMenuBar(menu); MenuItemmenuItem=newMenuItem(menu,SWT.CASCADE); menuItem.setText("\u6587\u4EF6"); Menumenu_1=newMenu(menuItem); menuItem.setMenu(menu_1); MenuItemmenuItem_1=newMenuItem(menu_1,SWT.NONE); menuItem_1.setText("\u6253\u5F00\u6570\u636E\u5E93\u6587\u4EF6"); MenuItemmenuItem_2=newMenuItem(menu,SWT.CASCADE); menuItem_2.setText("\u7F16\u8F91"); Menumenu_2=newMenu(menuItem_2); menuItem_2.setMenu(menu_2); MenuItemmenuItem_3=newMenuItem(menu,SWT.CASCADE); menuItem_3.setText("\u7A97\u53E3"); Menumenu_3=newMenu(menuItem_3); menuItem_3.setMenu(menu_3); MenuItemmenuItem_4=newMenuItem(menu_3,SWT.NONE); menuItem_4.setText("\u6253\u5F00"); MenuItemmenuItem_5=newMenuItem(menu,SWT.CASCADE); menuItem_5.setText("\u5E2E\u52A9"); Menumenu_4=newMenu(menuItem_5); menuItem_5.setMenu(menu_4); Groupgroup=newGroup(shell,SWT.NONE); group.setToolTipText("\u6309\u94AE\u6846"); group.setBounds(10,134,143,576); ButtonbtnNewButton=newButton(group,SWT.NONE); btnNewButton.setBounds(10,10,130,37); btnNewButton.setText("\u5F00\u542F\u670D\u52A1"); finalGroupgroup_1=newGroup(shell,SWT.NONE); group_1.setText("\u53EF\u89C6\u5316\u6846"); group_1.setBounds(520,0,840,569); Imageimg=newImage(display,"src/at/client/mf/img/bg.jpg");// Imageimg23=newImage(display,"src/at/client/mf/img/n3.jpg"); finalCTabFoldertabFolder=newCTabFolder(group_1,SWT.BORDER); tabFolder.setBounds(0,0,840,569); tabFolder.setSelectionBackground(Display.getCurrent().getSystemColor(SWT.COLOR_TITLE_INACTIVE_BACKGROUND_GRADIENT)); CTabItemtabItem=newCTabItem(tabFolder,SWT.NONE); tabItem.setText("NewItem"); finalCanvascanvas=newCanvas(tabFolder,SWT.NONE); tabItem.setControl(canvas); canvas.setBackgroundImage(img); tabFolder.setSelection(tabItem); btnNewButton.addSelectionListener(newSelectionAdapter(){ @Override publicvoidwidgetSelected(SelectionEvente){ ServerRunsr=newServerRun(); sr.start(); System.out.println("pppp"); for(inti=0;i<450;i++){ TreeMap<String,double[]>m_map=DataCollection.r_map; if(!m_map.isEmpty()){ System.out.println(m_map.get(m_map.firstKey())); Stringstr_key=m_map.firstKey(); Stringstr[]=str_key.split("#"); double[]a=m_map.remove(str_key); System.out.println(a[0]+"..."+a[1]+"..."+a[2]); Stringstr1[]; if(a[0]!=0&&a[1]!=0&&a[2]!=0){ System.out.println("進(jìn)入繪圖");// a=m_map.remove(str_key); doubleap1=a[0]; doubleap2=a[1]; doubleap3=a[2]; Database.getRssi(); Stringstr_1=FingerPrint.matchRssi(ap1,ap2,ap3); str1=str_1.split("#"); doublem_num=Double.valueOf(str[1]); intmy_num=(int)m_num; intx=Integer.parseInt(str1[0]); inty=Integer.parseInt(str1[1]); System.out.println(x+"+++++"+y); Stringqiuyuan=str[1]+""; Stringshijian=str[0]+""; // Database.saveRssi(qiuyuan,shijian,ap1,ap2,ap3);// Database.savePosition(qiuyuan,x+"",y+""); drawView(canvas,display,my_num,x,y); } } else{ System.out.println("kong"); try{ Thread.sleep(700); }catch(InterruptedExceptione1){ //TODOAuto-generatedcatchblock e1.printStackTrace(); } } }// // for(inti=1;i<10;i++){// drawView(canvas,display,i,20*i,30*i);// canvas.redraw();// tabFolder.redraw();// try{// Thread.sleep(2000);// }catch(InterruptedExceptione1){// //TODOAuto-generatedcatchblock// e1.printStackTrace();// }// }// System.out.println("drawok");// // System.out.println("qqqqqq"); } }); Groupgroup_2=newGroup(shell,SWT.NONE); group_2.setText("\u72B6\u6001"); group_2.setBounds(159,683,853,27); Groupgroup_3=newGroup(shell,SWT.NONE); group_3.setText("\u6570\u636E\u7EDF\u8BA1"); group_3.setBounds(159,134,321,544); text=newText(group_3,SWT.BORDER); text.setBounds(10,24,117,23); ButtonbtnNewButton_1=newButton(group_3,SWT.NONE); btnNewButton_1.addSelectionListener(newSelectionAdapter(){ @Override publicvoidwidgetSelected(SelectionEvente){ fnum=text.getText(); System.out.println(fnum); Database.getPosition(); chooseNum(); System.out.println(lx.isEmpty()); createView(tabFolder,display,fnum,lx,ly); } }); btnNewButton_1.setBounds(158,20,134,27); btnNewButton_1.setText("\u8F93\u5165\u53F7\u7801\u67E5\u8BE2"); Groupgroup_4=newGroup(shell,SWT.NONE); group_4.setText("\u6570\u636E\u7EDF\u8BA1"); group_4.setBounds(10,0,482,128); } //創(chuàng)建新的選項(xiàng)卡的函數(shù) publicvoidcreateView(CTabFoldertabFolder,finalDisplaydisplay,finalStringnum,finalList<String>lx2,finalList<String>ly2){ CTabItemtabItem=newCTabItem(tabFolder,SWT.Activate); tabItem.setText(num+"號(hào)視圖"); Imageimg=newImage(display,"src/at/client/mf/img/bg.jpg"); Canvascanvas=newCanvas(tabFolder,SWT.NONE); tabItem.setControl(canvas); tabFolder.setSelection(tabItem); canvas.setBackgroundImage(img); GCgc=newGC(img); for(inti=0;i<lx2.size()-1;i+=2){ gc.setBackground(display.getSystemColor(SWT.COLOR_CYAN)); gc.fillOval(Integer.parseInt(lx2.get(i)),Integer.parseInt(ly2.get(i)),15,15); //drawarrow(Integer.parseInt(lx2.get(i)),Integer.parseInt(ly2.get(i)), //Integer.parseInt(lx2.get(i+1)),Integer.parseInt(ly2.get(i+1)),e); } } //矢量旋轉(zhuǎn)函數(shù),參數(shù)含義分別是x分量、y分量、旋轉(zhuǎn)角、是否改變長(zhǎng)度、新長(zhǎng)度 publicdouble[]rotateVec(intpx,intpy,doubleang,booleanisChLen,doublenewLen){ doublemathstr[]=newdouble[2]; doublevx=px*Math.cos(ang)-py*Math.sin(ang); doublevy=px*Math.sin(ang)+py*Math.cos(ang); if(isChLen){ doubled=Math.sqrt(vx*vx+vy*vy); vx=vx/d*newLen; vy=vy/d*newLen; mathstr[0]=vx; mathstr[1]=vy; } returnmathstr; } //畫箭頭的函數(shù)x1==loc[num][1],y1==temp[1]... publicvoiddrawarrow(intx1,inty1,intx2,inty2,PaintEvente){ doubleH=15;//箭頭高度 doubleL=9;//底邊的一半 intx3=0; inty3=0; intx4=0; inty4=0; doubleawrad=Math.atan(L/H);//箭頭角度 doublearraow_len=Math.sqrt(L*L+H*H);//箭頭的長(zhǎng)度 double[]arrXY_1=rotateVec(x1-y1,x2-y2,awrad,true,arraow_len); double[]arrXY_2=rotateVec(x1-y1,x2-y2,-awrad,true,arraow_len); doublex_3=x1-arrXY_1[0];//(x3,y3)是第一端點(diǎn) doubley_3=x2-arrXY_1[1]; doublex_4=x1-arrXY_2[0];//(x4,y4)是第二端點(diǎn) doubley_4=x2-arrXY_2[1]; DoubleX3=newDouble(x_3); x3=X3.intValue(); DoubleY3=newDouble(y_3); y3=Y3.intValue(); DoubleX4=newDouble(x_4); x4=X4.intValue(); DoubleY4=newDouble(y_4); y4=Y4.intValue(); e.gc.drawLine(x1,x2,x3,y3);//畫箭頭的一半 e.gc.drawLine(x
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 科技創(chuàng)新與青少年商業(yè)思維的培養(yǎng)
- 消費(fèi)者心理與產(chǎn)品價(jià)值感知的關(guān)系
- 社區(qū)經(jīng)濟(jì)發(fā)展與居民生活質(zhì)量提升
- 2025年幼兒園拼音標(biāo)準(zhǔn)課件標(biāo)準(zhǔn)課件
- 塘廈工廠綠化養(yǎng)護(hù)施工方案
- Unit 4 Interests and Abilities-Lesson 2 Joining The Club 教學(xué)設(shè)計(jì)2024-2025學(xué)年北師大版英語七年級(jí)上冊(cè)
- 中國(guó)藥科大學(xué)《藥物分析與檢測(cè)》2023-2024學(xué)年第二學(xué)期期末試卷
- 惠州工程職業(yè)學(xué)院《機(jī)電系統(tǒng)設(shè)計(jì)與控制》2023-2024學(xué)年第二學(xué)期期末試卷
- 購物中心防滑工程施工方案
- 河北環(huán)境工程學(xué)院《普通話與漢語表達(dá)技巧》2023-2024學(xué)年第二學(xué)期期末試卷
- 住戶調(diào)查輔助調(diào)查員培訓(xùn)教學(xué)課件
- 數(shù)字營(yíng)銷基礎(chǔ)PPT完整全套教學(xué)課件
- 園林植物環(huán)境PPT完整全套教學(xué)課件
- 跨境電商B2B數(shù)據(jù)運(yùn)營(yíng)高職PPT全套完整教學(xué)課件
- 2023年山西省太原市迎澤區(qū)校園招考聘用教師筆試題庫含答案詳解
- 2023中職27 嬰幼兒保育 賽題 模塊三 嬰幼兒早期學(xué)習(xí)支持(賽項(xiàng)賽題)
- 教師師德和專業(yè)發(fā)展課件
- 服務(wù)器巡檢報(bào)告模版
- 2023年中國(guó)煤化工行業(yè)全景圖譜
- 2023年高中生物新教材人教版(2023年)必修二全冊(cè)教案
- 小學(xué)美術(shù) 四年級(jí) 人教版《造型?表現(xiàn)-色彩表現(xiàn)與創(chuàng)作》“色彩”單元美術(shù)作業(yè)設(shè)計(jì)《色彩的明與暗》《色彩的漸變》《色彩的情感》
評(píng)論
0/150
提交評(píng)論