新聞中心

EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 基于WinPhone 7的體感健身系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)

基于WinPhone 7的體感健身系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)

作者: 時(shí)間:2012-08-30 來(lái)源:網(wǎng)絡(luò) 收藏

隨著人們生活節(jié)奏的加快,很多人難以做到經(jīng)常進(jìn)行體育鍛煉。近幾年對(duì)該問(wèn)題提出了多種解決方案,其中運(yùn)用體域網(wǎng)(Body Area Network)技術(shù)實(shí)現(xiàn)的健身方案逐漸受到市場(chǎng)的青睞。

體域網(wǎng)通過(guò)連接多個(gè)傳感器節(jié)點(diǎn),實(shí)現(xiàn)人體周邊、體表以及體內(nèi)范圍的通信,支持醫(yī)療保健、個(gè)人娛樂(lè)等功能。它把人體變成通信網(wǎng)絡(luò)的一部分,從而真正實(shí)現(xiàn)了網(wǎng)絡(luò)的泛在化,具有廣泛的應(yīng)用前景和巨大的市場(chǎng)潛力。

該系統(tǒng)使用ZigBee技術(shù)組成體域網(wǎng),并將采集到的人體運(yùn)動(dòng)信息以無(wú)線的方式發(fā)送到Windows Phone 7系統(tǒng)上。運(yùn)用XNA技術(shù)和.NET 框架,在系統(tǒng)上模擬實(shí)現(xiàn)110 m跨欄競(jìng)賽流程的。用戶可通過(guò)屏幕看到模擬的運(yùn)動(dòng)畫面,增加鍛煉的趣味性,提高人們對(duì)運(yùn)動(dòng)的熱情。系統(tǒng)具有體積小巧、方便易用的特點(diǎn),適合在相對(duì)較小的空間使用。

1 系統(tǒng)總體架構(gòu)設(shè)計(jì)

首先通過(guò)高靈敏的角度傳感器和心率傳感器實(shí)時(shí)采集運(yùn)動(dòng)者腿部擺動(dòng)角度以及心率變化信息,然后利用ZigBee模塊組成體域網(wǎng),再傳輸?shù)狡脚_(tái)中。系統(tǒng)對(duì)收到的信息進(jìn)行處理,實(shí)時(shí)模擬出一個(gè)3D跨欄的游戲。系統(tǒng)結(jié)構(gòu)圖如圖1所示。

Windows Phone 7是微軟公司于2010年10月發(fā)布的全新智能手機(jī)操作系統(tǒng)。它并不是之前Windows Mobile操作系統(tǒng)的升級(jí)或是繼承,而是一個(gè)全新的操作系統(tǒng),它基于Windows Embedded Compact 7新內(nèi)核編寫系統(tǒng),完全脫離了Mobile 6的技術(shù)架構(gòu)。簡(jiǎn)潔華麗的metro界面,宣告了它不同以往的風(fēng)格;采用全新的Push Notification技術(shù)方便了手機(jī)終端與服務(wù)器的數(shù)據(jù)同步[1]。

為方便開(kāi)發(fā),Windows Phone 7提供了模擬器(Emulator),Emulator可以運(yùn)行在Windows 7操作系統(tǒng)下,并且在調(diào)試和運(yùn)行程序時(shí),不需要將游戲部署到真正的設(shè)備中[2]。

2 系統(tǒng)硬件設(shè)計(jì)

2.1 ZigBee數(shù)據(jù)采集模塊

ZigBee數(shù)據(jù)采集模塊是硬件平臺(tái)的關(guān)鍵部分,該部分首先利用ZigBee技術(shù)組成體域網(wǎng),然后采集用戶橈動(dòng)脈處的脈搏信號(hào)和腿部的擺動(dòng)角度信號(hào),處理后再以無(wú)線的方式將數(shù)據(jù)傳輸?shù)较到y(tǒng)接收模塊上。為了擴(kuò)大系統(tǒng)的應(yīng)用范圍,將來(lái)也可考慮用藍(lán)牙設(shè)備作為無(wú)線傳輸工具。體感傳感器模塊硬件框圖如圖2所示。


2.2 數(shù)據(jù)接收模塊

系統(tǒng)接收端使用CC2531內(nèi)置的USB將從ZigBee模塊接收到的數(shù)據(jù)傳到手機(jī)終端上。

3 系統(tǒng)軟件設(shè)計(jì)

3.1 開(kāi)發(fā)環(huán)境

系統(tǒng)軟件部分使用Visual Studio 2010開(kāi)發(fā),與舊的Visual Studio 版本相比,最新版本的Visual Studio 在性能上有很大提升,方便程序員高效地編寫高質(zhì)量的代碼。而且微軟公司提供的Windows Phone 7開(kāi)發(fā)包都是基于Visual Studio 2010的,因此本設(shè)計(jì)選擇Visual Studio 2010作為軟件開(kāi)發(fā)平臺(tái)。

Windows Phone 7提供了兩種不同的開(kāi)發(fā)平臺(tái):Silverlight for Windows Phone和XNA 4.0 Game Studio。Silverlight是為開(kāi)發(fā)Windows Phone7準(zhǔn)備的。XNA 4.0 Game Studio是為開(kāi)發(fā)游戲準(zhǔn)備的。

XNA是微軟公司推出的通用軟件開(kāi)發(fā)平臺(tái),建立在C#的基礎(chǔ)上方便游戲開(kāi)發(fā)的一組工具集,目的是讓游戲開(kāi)發(fā)過(guò)程更加輕松簡(jiǎn)單并富有樂(lè)趣。XNA 4.0比起之前的嵌入式版本XNA 3.1而言進(jìn)步非常明顯,能夠支持,而且還封裝了Open GLES 2.0的接口[3]。

為了支持XNA的開(kāi)發(fā),開(kāi)發(fā)環(huán)境還需要安裝.NET Framework 4或.NET Framework 4的 Runtime動(dòng)態(tài)連接庫(kù),否則XNA工程將無(wú)法正常編譯。開(kāi)發(fā)環(huán)境層次圖如圖3所示。


3.2 系統(tǒng)軟件實(shí)現(xiàn)

主要設(shè)計(jì)實(shí)現(xiàn)模擬110 m跨欄競(jìng)賽的流程。圖4展示了游戲全部模塊的關(guān)系結(jié)構(gòu)。對(duì)于軟件開(kāi)發(fā)人員而言,主要實(shí)現(xiàn)的是導(dǎo)入模型、渲染場(chǎng)景、輸入處理、音效處理及運(yùn)行時(shí)機(jī)制等功能。下面結(jié)合本系統(tǒng)的特點(diǎn)分別對(duì)上述幾個(gè)模塊給出處理方法。


3.2.1 模型導(dǎo)入

模型的導(dǎo)入需要XNA的內(nèi)容管道(pipeline)來(lái)支持。XNA自帶了兩類3D模型的導(dǎo)入處理器,可以分別處理
.FBX文件和.x文件。其中,.x文件在DirectX 3D編程中應(yīng)用得比較廣泛。系統(tǒng)軟件使用MAYA制作三維動(dòng)畫文件,通過(guò)插件導(dǎo)出為DirectX(.X)文件,經(jīng)過(guò)pipeline導(dǎo)入器處理后,所有不同類型的內(nèi)容文件都被轉(zhuǎn)換成XNA框架的內(nèi)部格式。在游戲生成階段,編譯器直接將這些文件封裝到游戲的內(nèi)容管理模塊(Content Manager)中。

Content Manager是由XNA框架Runtime引擎驅(qū)動(dòng)的,具有良好的封裝,在形式上對(duì)程序員是透明的。使用模型文件的時(shí)候,調(diào)用Content Manager的LoadT>方法即可實(shí)現(xiàn)對(duì)模型的導(dǎo)入。具體實(shí)現(xiàn)代碼為:
public Model dc_model = null;
再在LoadContent()函數(shù)中對(duì)模型變量賦值,用Load方法導(dǎo)入模型。具體實(shí)現(xiàn)代碼如下:
dc_model
=Game.Content.LoadModel>(@Models+fuwa);
fb_model_batch
= new ModelBatch(Game.GraphicsDevice);

其中,模型文件的存儲(chǔ)位置以相對(duì)路徑的形式導(dǎo)入,有效避免了系統(tǒng)安裝在別的目錄后找不到模型文件的錯(cuò)誤。模型導(dǎo)入效果如圖5所示。


3.2.2 場(chǎng)景渲染

場(chǎng)景渲染是將已導(dǎo)入到緩沖區(qū)的模型及紋理繪制在顯示屏上。雖然涉及到大量的繪制操作,但利用XNA提供的繪制精靈(SpriteBetch),可以輕松地完成這一工作。在計(jì)算機(jī)圖形學(xué)術(shù)語(yǔ)中,精靈被定義為一張集成在大場(chǎng)景中的二維或者三維圖像。屏幕顯示管理模塊就是通過(guò)繪制場(chǎng)景中的多種精靈來(lái)完成的。XNA框架提供的精靈也可以用來(lái)進(jìn)行二維圖像繪制,本系統(tǒng)中所有屏幕顯示文本都是由精靈繪制的。

除此之外,開(kāi)發(fā)者還需要關(guān)心世界變換矩陣、攝像機(jī)變換矩陣和投影變換矩陣的設(shè)置。世界變換矩陣是指將模型坐標(biāo)系變換為三維世界坐標(biāo)系的矩陣[4]。具體實(shí)現(xiàn)代碼為:

final_world_transforms = Matrix.Identity
*Matrix.CreateFromYawPitchRoll(dc_rotation.Y, dc_rotation.X, dc_rotation.Z)
* origional_world_transforms
* Matrix.CreateTranslation(dc_position);

攝像機(jī)矩陣是以攝像機(jī)所在坐標(biāo)為原點(diǎn),以攝像機(jī)要觀察的方向?yàn)榛鶞?zhǔn),創(chuàng)建一個(gè)新的攝像機(jī)坐標(biāo)系,將世界坐標(biāo)系變換為攝像機(jī)坐標(biāo)系[4]。XNA提供了一個(gè)CreateLookAt的方法,它返回一個(gè)矩陣。這個(gè)矩陣存儲(chǔ)了從三維圖形轉(zhuǎn)換為平面圖形需要做的方向和位置變換。具體實(shí)現(xiàn)代碼為:

//Make the camera follow the object
cmr_position = object_to_follow + cmr_drag;
cmr_target = object_to_follow;
//Create the view matrix
cmr_view
=Matrix.CreateLookAt(cmr_position,
cmr_target, Vector3.Forward);

投影變換矩陣,是指將三維坐標(biāo)系變?yōu)槎S坐標(biāo)系的變換矩陣。其功能是將三維物體進(jìn)行轉(zhuǎn)換,以便在二維屏幕上輸出。這里用到的投影變換是投射投影法。用此投影法可以表現(xiàn)物體距離的遠(yuǎn)近。具體實(shí)現(xiàn)代碼如下:

//Create the projection matrix
cmr_projection
=Matrix.CreatePerspectiveFieldOfView
(MathHelper.ToRadians(cmr_camera_fov),
graphics_device_in_cmr.Viewport.AspectRatio, 1, 10000);

AspectRatio為程序窗口的長(zhǎng)寬比,1為最近可視距離, 10 000為最遠(yuǎn)可視距離。

3.2.3 音效處理

聲音管理器(AudioManager)繼承自GameComponent,負(fù)責(zé)管理游戲需要使用的聲音。XNA框架提供了能夠處理聲音的SoundEffectInstance類型,類型中除了包含聲音播放的相關(guān)方法,還封裝了聲音效果渲染方法[5]。聲音管理模塊還設(shè)計(jì)了一個(gè)字典(泛型Dictionary)用于存放所有的音效。泛型在排序和搜索方面比普通數(shù)據(jù)類型要好得多。加載聲音、播放聲音、停止聲音和暫停聲音都是調(diào)用SoundEffectInstance類型中封裝的對(duì)應(yīng)方法,將聲音名稱傳入之后,在聲音字典里查找,如果存在,則進(jìn)行相應(yīng)操作。

3.2.4 輸入處理

本系統(tǒng)是為Windows Phone 7設(shè)備開(kāi)發(fā)的體感游戲,用戶在游戲過(guò)程中,需要進(jìn)行跑和跳的動(dòng)作來(lái)完成游戲。系統(tǒng)所讀取到的輸入信號(hào)就是傳感器在垂直空間的位置變化。輸入處理的流程是,首先使用C#接口函數(shù)讀取USB輸入的數(shù)據(jù),然后初始化一個(gè)三維向量(Vector3)的臨時(shí)變量statevalue,再初始化一個(gè)布爾變量isjump表示是否有跳躍動(dòng)作,之后對(duì)變化后的statevalue進(jìn)行向量的單位化操作,最后根據(jù)兩個(gè)變量的值確定模型的動(dòng)作。

游戲使用事件輪詢驅(qū)動(dòng),不論當(dāng)前是否有輸入操作,都對(duì)輸入模塊進(jìn)行訪問(wèn)。這與傳統(tǒng)的應(yīng)用程序開(kāi)發(fā)的事件注冊(cè)驅(qū)動(dòng)是不同的。采用事件注冊(cè)驅(qū)動(dòng)的程序,用戶輸入后系統(tǒng)對(duì)其進(jìn)行捕捉,喚醒事件處理程序,即在輸入信號(hào)產(chǎn)生之前程序不會(huì)做任何事。相比之下,XNA框架游戲程序由事件輪詢驅(qū)動(dòng),游戲程序會(huì)主動(dòng)詢問(wèn)系統(tǒng)是否有用戶輸入發(fā)生,不論有沒(méi)有用戶輸入,程序都會(huì)一直運(yùn)行。

3.2.5 游戲運(yùn)行時(shí)機(jī)制

本質(zhì)上,游戲運(yùn)行是由循環(huán)的一系列操作組成,這些操作被反復(fù)使用直到游戲結(jié)束。但游戲循環(huán)只包含繪制和更新兩個(gè)方法,所有影響游戲的邏輯都將在這些方法中完成。繪制時(shí)需要與系統(tǒng)進(jìn)行大量的數(shù)據(jù)交互,尤其繪制圖像時(shí)更將耗費(fèi)大量系統(tǒng)空間。為減少繪制方法的負(fù)擔(dān),提高系統(tǒng)性能,游戲?qū)⑦\(yùn)行需要的所有操作(碰撞檢測(cè)、更新分?jǐn)?shù)、游戲結(jié)束檢測(cè)等等)都放到更新方法中實(shí)現(xiàn)。

在實(shí)現(xiàn)繪制方法的過(guò)程中,用到了XNA的深度緩沖(depth buffer)和模板緩沖(stencil buffer)等特性。深度緩沖和模板緩沖是XNA框架中圖形設(shè)備的屬性??紤]到游戲運(yùn)行時(shí)圖形設(shè)備需要繪制的場(chǎng)景較大,內(nèi)容較多,并且還包括完成渲染模型的動(dòng)畫效果等工作,因此,開(kāi)啟緩沖功能有助于提高圖形設(shè)備性能。繪制方法流程圖如圖6所示。

本文詳細(xì)介紹了開(kāi)發(fā)的過(guò)程和方法,對(duì)XNA開(kāi)發(fā)3D游戲過(guò)程中重要的函數(shù)給出了使用說(shuō)明。系統(tǒng)可以幫助那些運(yùn)動(dòng)場(chǎng)地受限制或者行動(dòng)不便的人提高運(yùn)動(dòng)樂(lè)趣,具有比較廣泛的應(yīng)用范圍。

本文引用地址:http://m.butianyuan.cn/article/257273.htm


評(píng)論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉