茌眾博
摘要:意在設計感知網聯單車分布式虛擬環境系統,讓用戶在虛擬環境中進行騎行健身,解決當下室內健身單車枯燥無聊的問題。
關鍵詞:分布式虛擬環境;物聯網;健身單車
中圖分類號:TP3 文獻標識碼:A ?文章編號:1003-9082(2020)07-000-01
一、系統整體設計
1. 項目整體技術架構
下位機是由健身單車主體、兩塊Arduino開發板及多種傳感器構成,下位機系統控制部分由兩塊Arduino開發板構成,一塊用于將傳感器所獲取的數據通過串口通信傳輸至上位機,處理速度信息、角度信息等這些由用戶本身產生信息,另一塊用于讀取并解析上位機系統指令,虛擬環境中風速、單車上下坡所帶來不同阻力感等信息會通過此單片機反饋至用戶。下位機系統還包含了大量傳感器與控制模塊,傳感器采集用戶騎行數據,例如騎行速度、車把方向、剎車信號等,控制模塊用于將虛擬環境中環境信息,例如風速、阻力、振動等作用于騎行用戶。
上位機部分,利用Unity3D引擎搭建虛擬環境,虛擬環境中建立基本人物模型與環境交互內容,與單片機通過串口通信傳遞用戶騎行信息、人機交互信息等,保證系統信息實時傳遞。為實現分布式虛擬環境,又架設了服務器及數據庫,設計了一套基于服務器—客戶端框架的網絡傳輸模式,并存儲用戶騎行信息,實現局域網下兩輛單車可以在同一虛擬環境下進行交互。
2. 單車部分設計方案
單車結構主要考慮傳感器、執行器安裝以及用戶騎車體驗。在車把前部加裝鐵板平面,用來安裝風扇和用戶打卡系統,且方便放置VR頭盔,風扇模擬風力,用戶打卡系統實現用戶刷卡上機操作。在車把下方安裝角度傳感器,在車把上配備電子剎把。在左側車把處增加搖桿,用戶可通過左手拇指對虛擬環境中界面進行操作。在右側車把處選用自復位按鍵,分別在虛擬環境中起到復位、加速和鳴笛效果,用戶右手拇指即可輕松操作。在車把內部加入振動馬達模擬顛簸與碰撞,車把套中嵌入心率傳感器以獲取用戶心率。單車的下方用角鐵固定電動推桿,通過鐵絲牽引健身單車飛輪剎車片,采用磁控力,通過控制磁鐵與飛輪之間距離產生不同阻尼力,實現不同阻力效果。在單車飛輪上固定一磁鐵片,于單車的飛輪中心處安裝霍爾傳感器讀取騎行速度。
3. 虛擬環境部分設計方案
在賽道中增加上下坡、指示標、加速減時道具、傳送門、檢查點、蹦床、行人等內容。當用戶觸碰減速道具時,虛擬環境中的計時器會對時間進行縮減;觸碰加速道具時,用戶通過點擊加速按鍵可加速;傳送門可以使賽道多樣化,通過在傳送門之間穿梭尋找捷徑;檢查點的設置讓用戶獲知自己行進路程;設置蹦床為增加用戶多樣性體驗;設置行人目的是為了增加賽道難度,撞到行人會增加比賽時間。
此外增加用戶交互界面,提升用戶體驗。并且設計了一套基于服務器—客戶端框架網絡傳輸模式,使兩輛單車在局域網環境下實現分布式虛擬環境。
二、系統整體實現
1.軟硬件交互部分
通過C# 中SerialPort 類實現與Arduino的數據交流,建立子線程執行數據接收與處理。兩個子線程一個接收來自硬件的數據,一個向硬件發送數據。Arduino采集信息數據以字符串(x,y)形式傳入串口緩沖區,使用正則表達式讀取線程,匹配過濾非法數據。數據有不同標志位標記數據類型,例如方向、轉速等,其中x坐標代表具體數值,y坐標代表數據含義。
2. 硬件部分
包括速度信號、角度信號、剎車信號、按鍵信號、搖桿信號、打卡信號和心率信號等。
3.軟件部分
(1)虛擬環境內容
運用Unity3D引擎,從硬件采集數據,設計單車模擬行駛系統,建立單車的運動狀態及空間坐標邏輯關系,構建虛擬環境中的單車模型。單車模擬行駛系統計算單車在加速、拐彎、剎車等不同情況下的行駛情況,單車輪子與車體物理運算分開,輪子和車體都為單車物體的子物體。車體部分搭載了自動調整重心算法以保持平衡。輪子部分運用減震器的物理算法,能夠在車輪進行滾動的同時模擬輪子垂直抖動。輪子與地面的摩擦力是單車的動力來源。單車進行拐彎動作時,算法會回饋給單車車體一個角動量,減少車身抖動,平衡車體以及減少用戶VR眩暈感。將VR相機與單車車體綁定,實現用戶第一人稱視角體驗。同時運用復位點插件,用戶在虛擬環境中撞墻的話便可以使得用戶回到賽道中正確位置,配合實體單車的復位按鍵實現復位功能。
利用Unity3D引擎內置的UGUI系統,可以“可視化地”開發交互界面。建立一個通用界面管理器,通過它來控制界面顯示和關閉。在界面管理器中,定義顯示界面與關閉界面兩個基本方法,同時界面管理器中還包含著一個列表,索引所有已經打開的界面,從而避免界面重復打開。還編寫了一個界面基類,每一個界面都是繼承自面板基類。在基類中包含了初始化、開啟、關閉這三個固定方法,面板基類的初始化方法中,程序會根據所給路徑動態加載界面資源并控制面板的上下層關系。
(2)網絡傳輸部分
當客戶端發起連接時,基于套接字數據包將會通過指定端口,被發給搭建好的多線程異步服務器,部署于服務端的數據庫記錄了用戶登錄信息,可用于用戶信息比對及更新。客戶端與服務器之間通過附帶時間戳的心跳協議,確保之間的相互連接。每隔一定時間,客戶端向服務器發送心跳協議以測試連通性,服務器收到后恢復心跳,并通過時間戳更新上次響應時間,長時間未響應的用戶會被斷開連接。
用戶騎行信息會被實時傳輸給服務器,并由服務器分發給所有用戶。服務器通過六軸坐標及速率、角動量雙重傳輸及預測位置更新算法,可以在網絡不佳情況下減少可能出現的位置同步錯誤,并顯著降低延遲,同時對傳輸來信息進行防作弊檢測,增加競技公平性。在多人健身競技中,計算每位玩家所用時間、所獲積分,并將其傳輸給服務器,從而實現排行榜功能,在每次騎行結束后展示給用戶。服務端數據庫可保存用戶每次騎行數據,以便于用戶之間相互挑戰及檢驗用戶健身效果。
客戶端與服務器傳輸核心方法是將各類信息對象通過JSON序列化編碼傳輸,服務器會通過其協議名稱及所包含的參數自動進行下一步處理。服務端數據存儲使用MySQL數據庫,并將SQL語句定義并封裝在服務端C#程序單獨的類中。
參考文獻
[1]潘志庚,cad.zju.edu.cn,姜曉紅等.分布式虛擬環境綜述[J].軟件學報,2000
(04):461-467.