感知网联单车分布式虚拟环境设计与实现
2020-08-20茌众博
茌众博
摘要:意在设计感知网联单车分布式虚拟环境系统,让用户在虚拟环境中进行骑行健身,解决当下室内健身单车枯燥无聊的问题。
关键词:分布式虚拟环境;物联网;健身单车
中图分类号: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.