代码改变世界

N95当手柄玩游戏,甩起来还可以用手势控制电脑,分享一下我们的设计经验

2010-08-10 01:40  Loning  阅读(2843)  评论(24编辑  收藏  举报

说明

演示视频

 

http://share.renren.com/share/259556761/2861373448

http://share.renren.com/share/259556761/2861370739

使用说明

解压缩后请打开Driver文件夹,按照自己的系统进入文件夹,其中x8632位系统、x6464位系统。

执行devinstall.bat后将会向系统添加模拟手柄的驱动程序。

执行devremove.bat将会删除手柄驱动。

   

执行完毕后请通过 设备管理器 (我的电脑 -》右键-》管理-》设备管理器)查看一个名为Wiisio Joystick Hid Device的设备,如果该设备工作正常,则系统成功安装该设备。

   

添加完驱动后即可直接运行Wiisio目录下的Wiisio.MainWinProgram.exe

   

可以使用test\joytester.exe 测试模拟手柄的运行情况。

   

   

在手机上,使用C(删除键)来切换模式,可以通过手机菜单切换模式

Joystick模式下

手机数字按键1:将当前位置设为手机的平衡位置。

GameKeyboard模式下

手机数字按键1:将当前位置设为手机的平衡位置。

手机Shift键(C删除键左边):切换当前的映射文件。

GestureControl模式下

手机Shift键(C删除键左边):切换当前的映射文件。

   

系统需求

.net framework 2.0 sp2以上的.net框架

Microsoft or Widcomm Bluetooth stack 微软或Widcomm蓝牙协议栈

Nokia N95(其他带传感器的手机因无手机设备未测试)

   

开发人员

Loning

整体程序设计、驱动开发

Sherlock Yang

Nokia N95客户端开发

Reyoung

硬件设计

   

功能概述

手势识别 

手势模拟按键

手势运行程序

新手势训练

游戏模拟

通过重力模拟游戏手柄,映射手机按键

通过重力模拟上下左右wsad等按键,映射手机按键

控制设备

通过串口发送控制信息

   

   

开发计划

iPhone, M9, Windows Phone, Windows Mobile 等客户端开发

使用Wifi通信

公布通信协议接受第三方手机客户端

下载地址

 

http://u.115.com/file/f1f602a133

 

摘要

中文摘要

本系统基于手势识别,Windows驱动模拟,八向全驱四轮机器

人控制技术,蓝牙无线通信以及无线电通信技术,提出了通过对重力加速度进行分析处理进而实现数字控制,并以此为控制信息实现一个以EMB-4650开发板为中心,集娱乐,生活为一体的多方位控制解决方案。通过远程手机客户端提供重力加速度数据,EMB-4650开发板进行分析处理提取相关信息并发送给相关设备,从而实现以一手机客户端控制多个设备行为的目的,进一步展现一机多用低碳环保的社会主题。

 

Abstract

The system is based on gesture recognition, Windows-driven simulation, eight-wheel drive to the whole robot control technology, Bluetooth wireless communications and radio communications technology, put forward a solution that use the result of processing the gravities' data to achieve a multi-directional control solutions that use the EMB-4650 and make life, entertainment together. Remote mobile client provides acceleration of gravity data, EMB-4650 development board analysis and processing extract relevant information and send the information to the related devices, so as to realize the goal that use one mobile client to control multiple devices, to show the theme of a multiple purposes and Low carbon and environmental protection.

系统概述

系统简介及开发背景

现阶段,单一简陋的系统控制方法已经无法满足人们对系统快速准确控制的需要,于是触屏、语音控制、基于图像的手势控制、游戏摇杆等技术应运而生。然而,对于一些特殊应用,需要特殊的控制方法。

本文提出了一套基于加速度分析的控制系统解决方案,实现了一个一机多用、节能低耗、多设备同时处理、具有多种控制模式的控制系统。该系统可以在用于实时手势控制的同时播放电影、进行简单的游戏娱乐。

系统的整体架构分为四层:第一层是数据采集层,第二层是数据分析层,第三层是命令映射和控制层,第四层是被控制设备层。

"数据采集层"的主体为重力加速度信息提取模块,通过远程手机客户端采集加速度信息,并通过蓝牙发送到EMB-4650开发板。现在手机已经相当普遍,拥有重力加速度传感器的手机也已很多,这为此解决方案提供了良好的设备应用基础。

"数据分析层"的主体为数据分析模块,通过SVM支持向量机以及其他数据处理方法对加速度信息特征进行提取。

"命令映射和控制层"的主体为动作映射模块,通过第一层提供的加速度数据特征以及预先设置的映射表和当前系统所处的模式,将相应的加速度数据特征映射成相应的命令,并发送给相应的设备。如需修改映射表,进入本系统的用户界面设置界面对相应的数据特征设置相应的命令。

"被控制设备层"主体是相关设备接收命令以及执行命令的模块,此层范围很广,如本解决方案中的基于单片机的四轮机器人,这个机器人可以通过接收到的命令实现各种操作(如加速,刹车,转弯,复位等)。通过连接不同设备至机器人下方的的扩展接口可实现拖地、扫地、吸尘等功能(扫地、吸尘功能未实现);再如家庭中线路开关,可以接受到控制信号实现闭合控制。第四层与第三层主要通过无线模块进行通讯。

应用前景

该解决方案提供了一种既直观明了、充满想象力和乐趣的系统控制方法。使用该控制系统,用户不必在漆黑的夜晚摸黑找电灯开关,只需用已设定好的手势摇晃用户随声携带的手机就能使眼前一片光明;用户也不必为与同伴一起玩游戏时找不到手柄而发愁,掏出你的手机,这就是一个拥有完整功能的游戏手柄;用户甚至能掏出你的手机,控制机器人帮助他做家务。该解决方案基于EMB-4650开发板的节能嵌入式系统,并且还应用了特殊的节能技术,即在没有数据处理时降低优先级以节省能源,在有数据处理时提高优先级以相应实时数据处理,因此完全可以将本系统作为24小时全天候家庭控制系统。现今,手机的极其普遍,iPad等设备也在逐步增多,加速度传感器已逐渐成为这些设备的标准配置,该解决方案具有相当广泛的应用面。

系统特点

该系统采用加速度信息进行手势识别及系统控制,识别率高,外界环境干扰性小。

新手势易于添加,手势样本需求量小,训练迅速。用户可通过软件附带的训练功能添加自定义手势。

系统能够支持多种不同设备的连接。

充分利用现有资源、提高资源利用率、绿色节能,例如重力加速度信息使用手机等设备、电器控制也仅需在插线板多加一层我们设计的开关。

系统资源占用率低,在系统运行的同时,该设备可处理其他事物,一机多用。自动调节系统程序在操作系统中的运行优先级,无远程设备连接时降低优先级来降低系统资源使用率,节省电能;有远程设备连接时提高优先级,实时处理数据,避免丢包。

系统将加速度信息分为时序性数据与非时序性数据,时序性数据是会对下一次数据处理产生影响的数据,非时序性数据则与之相反。系统将使用不同线程处理这两种不同类型的数据。

系统原理及方案

系统设备组成

主体部分

EMB-4650开发板

1个

Broadcom 2046 Bluetooth 2.1

1个

AT89S52 单片机

1个

FSK-21 超再生无线发射接收模块

1个

标配电源

1个

串口数据线

1条

自制机箱

1个

机器人部分

带有47:1减速齿轮的电机    

4个

舵机

4个

带有橡胶防滑套的车轮

4个

6V 210mAh镍氢电池组

1个

PVC底盘

1个

塑料接插件    

若干

有机玻璃板

若干

AT89S52 单片机

1

FSK-21 超再生无线接收模块

1

远程设备

Nokia N95

1

Nokia 5230

1

 

系统架构

图 3.1 系统整体架构

功能与指标

  1. 实时加速度信息处理

加速度信号在模拟键盘、手柄操作时需要较高的实时性,因而需要将时序性数据处理与非时序性数据处理分离。

  1. 手势识别

可进行离散的手势识别,易于添加新手势,用户可选择不同的手势-功能映射方式,手势识别率在85%以上。

  1. 多远程设备连接

支持多种不同设备同时连接,程序易于二次开发。在处理多设备时系统应保持实时性。

  1. 机器人模块

机动灵活的机器人模块,最高移动速度为5.4km/h。且转弯灵活。可以实现前进、后退、转弯。另外配有大容量电池组,可以在无电缆供电的情况下长期运行。采用低频率无线遥控技术,有效提高通信距离,降低能耗。在无障碍条件下,通讯距离长达10米。

  1. 无线通信模块

系统与被控设备之间通过无线设备进行通信,考虑到该设备工作环境主要位于室内,因此无线信号范围应在半径10M左右,但具有较好的墙体穿透能力。

  1. 无线开关

无线开关是一种被控设备,进行简单的电路闭合控制。该设备应易于安装,能长期稳定运行。

  1. 用户界面友好

操作界面简洁、易用。

  1. 节能低耗

系统空闲时CPU平均占用率不超过1%,每个设备连接后CPU平均占用率的增长不超过5%。

硬件系统设计方案

硬件部署

图 3.2 硬件部署图

被控设备原理图

图 3.3 Wireless 315MHz 无线信号发射部分

图 3.4 Wireless 315MHz 无线信号接收部分以及四轮机器人控制

软件系统设计方案

软件流程

图 3.5 主程序流程图

软件架构

 

整个系统分为4层:

(1) System Layer:该层包含系统API,Bluetooth驱动,串口操作模块,以及系统自定义的手柄模拟驱动。

(2) Library Layer:该层包含程序依赖的各种库。其中SVM.net (1)是一个 .Net 平台下的libsvm (2)实现,Math.net (3) 是一个开源数学库,ZedGraph (4) 是一个绘制图表曲线的开源库,Wiisio.Sensors 是系统实现的加速度信息处理库,HID Library (5)是一个访问HID设备的库。

(3) Logic Layer:该层是系统的主要逻辑层,负责接收、处理加速度信息以及分发数据。

(4) User Interface Layer:该层负责系统与用户间的交互。包括设备监视器、手势训练工具、任务栏通知及系统设置。

系统实现

重力加速度信息提取

手势识别

运动监听

在系统与远程设备连接后,系统会源源不断的接收到加速度信息。系统首先需要分析出该设备是否处于运动状态。由于三轴加速度传感器的不稳定性、用户手部轻微的抖动,系统所获得的三轴加速度信息并不稳定,但在一个窗口时间t内,所获得样本的方差总小于阈值。通过改变该及窗口时间t,即可设置系统检测设备运动状态的灵敏度。

在设备由静止转为运动的过程中,由于运动起始时设备会获得较大的力,从而引起加速度信息的剧烈改变,因而在一个较短的窗口时间内,即可检测出设备的运动情况。

在设备运动的过程中,由于设备会出现匀速状态,在t时间之内,样本的方差会小于,从而会导致系统判断错误。但作为手持设备,由于手部运动范围限制,只要合理设置匀速状态下窗口时间t',即可降低系统误判率。

加速度信息归一化

不同的用户做同一个动作时时间与幅度可能相差很大,同一用户做手势时也可能出现上述情况,因此需要将样本数据归一化。以三轴加速信息中一轴数据样本A进行说明:(1)减去初始加速度(重力)后,对样本A进行线性样条插值,得到一多边形曲线。(2)以样本数对加速度信息进行间隔相同的采样得到样本数据A'(3)对A'进行三次样条插值得到二阶参数连续的三次样条曲线。(4)对样本A'进行统一帧数的采样得到标准长度的样本数据。

经过归一化处理后,样本噪声明显降低。所得平滑曲线如图 4.1所示,其中红色为拟合后曲线,黄色为原始数据。

图 4.1 加速度曲线

特征提取

在对样本数据归一化后,可得到四组样本A1、A2、A3 以及总的加速度Ac。分别计算样本的均值、方差、顶点数目、丰度、偏度。通过直方图,将各点由最大值至最小值分为若干组,统计落在组中的点的个数。

由于三组样本相互独立,我们可以构建一个包含该运动信息的高维特征向量V。然后通过支持向量机对这些向量进行分类处理,实现手势识别。

支持向量机与手势识别

SVM 的最终决策函数只由少数的支持向量所确定,计算的复杂性取决于支持向量的数目,而不是样本空间的维数,这在某种意义上避免了"维数灾难"。 (6)因此,只要选定了合适的核函数及参数即可对向量V进行分类。

系统采用Matthew Alastair Johnson开发的SVM.NET库 (1)。该库重新实现了台湾大学 Chih-Chung Chang and Chih-Jen Lin开发的libsvm (2),并加入了自动选择核函数及参数的过程。

程序内置手势

系统为了简化用户操作,已经内置了一部分训练好的手势供用户使用。用户可以在该基础上添加新的手势,亦可删除这些手势重新训练。系统内置的手势如图4.2所示。

图 4.2 程序内置手势示意图

类游戏手柄信息提取

系统同样关注远程设备的静止状态。由于设备在旋转过程中是平缓的,而且系统关心的是一长期的状态,而非旋转时一刻的状态,因而可认为三轴所得加速度即为重力。将三轴所得数据组成向量V,对V进行标准化后对各维进行反余弦运算,即可得到远程设备与重力夹角。

得到设备与重力的夹角后,系统需要一个平衡位置来取得类手柄的X轴、Y轴信息。规定X轴为远程设备前后旋转信息,Y轴为远程设备左右旋转信息。在设置平衡位置时,系统将重力分量最大的维度作为Y轴信息来源,将Y轴信息改变时改变量最小的维度作为X轴信息来源。

通过格式化X、Y信息,设置合适的呆区,即可实现手柄的左右、上下(带数值)按键,同样可以模拟键盘的左右上下按键。可用来进行赛车、模拟飞行等等支持手柄以及支持上下左右操作的游戏,亦可用来手工操纵四轮机器人。

多设备连接支持

在系统设计初期,考虑到使系统可以支持多种协议的连接、多种设备的接入,对于今后有可能进行的点都进行了抽象。信号处理模块见图 2。

在每一个IDataReceiver的实例中,系统总有一个线程处于监听状态。在远程设备连接后,该监听线程将处理该远程设备传来的信息,同时系统将会开启另一线程进入监听状态。考虑到系统理论最多可支持255个设备,在处理加速度信息时,将要求时序处理的部分用原线程处理、其他部分使用线程池处理,降低在处理复杂数据时丢失加速度及其时间信息的情况,降低系统延迟。

系统支持从不同类型的设备获取加速度信息并进行处理。在远程设备连接后,远程设备上的客户端程序会根据运行的不同环境发送特定格式的初始化消息到服务端。在服务端上以简单工厂模式创建一个可以处理该设备加速度信息的实例,并注册到该远程设备在服务端的代理类上。

在远程设备与系统的网络连接部分类视图中(图 2),DataManager负责远程代理设备与本地设备的映射、事件的统一分发,系统上层结构可通过订阅该类的事件接收所有远程设备的事件,也可通过该类访问远程设备。

通过远程设备特定的初始化请求信息,ILongLifeObjectProviderFactory将产生一个提供该设备所需处理的消息处理程序工厂,即ILongLifeObjectProvider。该系统现在主要专注于分析加速度传感器的信息,但Wii的手柄、不久前发布的iPhone 4GS中是内置陀螺仪的,这样的系统设计结构便于系统的扩展。

图 4.3 多设备连接实现类图

动作映射

在系统接收到一个远程设备的连接请求后,系统会创建类型为RemoteDevice的远程设备代理实例。该类在接收到加速度信息并处理后,会产生一系列的消息报告。消息报告包含基本的消息信息以及相应的处理方法。该处理方法会根据远程设备的工作模式、消息报告自身的类型将相应的动作传递给分配给该远程设备的已知的本地设备的抽象代理类。DataManager的实例将会订阅所有包含RemoteDevice消息报告的事件,管理RemoteDevice与本地设备的映射并且调用消息报告的处理方法。

用户可在配置界面选择映射信息。系统将会根据工作模式不同将处理后的远程设备加速度信息及按键信息进行映射。

类视图(图 4.4)所示为系统现有消息类型,他们均由远程设备的代理类产生。其中DataMessage传递远程设备的加速度信息及按键信息;MovementMessage由类型为IGsensorProcessor的加速度分析器检测到一个运动后由远程设备代理类产生,该消息传递一段离散的动作信息,由运动开始至运动结束;ModeMessage会将远程设备的工作模式传递给本地设备组。

图 4.4 消息模型

    现阶段系统实现了三类手势的映射动作,分别为模拟按键、运行程序与设备控制。其中运行程序可以启动某一个我们需要的程序,也可打开某一文件、网站。模拟按键实现可以用来模拟操作系统、其他程序的快捷键功能,也可模拟一段文字的输入。设备控制会将设备控制参数传递给被控设备控制器,由控制器将信息发送到被控设备。

    系统维护了一个类型为Dictionary<int, GestureAction>的表,其中Key为手势编码。在系统接收到手势后会查找该表并调用相应GestureAction的DoAction方法,执行该指令。类视图见图 4.5。

图 4.5 映射模块类图

用户界面

监视器

在监视器界面,用户可以查看到已经连接到系统的远程设备以及他们的运行模式、即时加速度信息、按键信息,并且可以选择该设备的手势映射模式、按键映射模式,在选择映射方案后会立即生效。系统会记录某个特定设备的配置信息,在该设备再次连接时会自动读取相应的配置。

监视器的窗体在接收到用户请求后才会被系统创建,在用户选定要查看的设备后,监视器才会订阅特定远程设备的数据接收事件,并将该设备的基本信息以及加速度曲线显示在界面上。通过以上方法,降低了系统在UI层上的系统资源使用率。在用户更改映射方案后,远程设备代理类会发出一个包含ModeMessage的事件,DataManager会处理该事件,查找与远程设备配对的本地设备,更改本地设备的映射方案。

图 4.5 监视器界面

 

训练界面

该界面用于向系统添加新的手势。在系统检测到新手势时,该界面会弹出一个新的窗体来显示系统捕获到的手势。为了使操作简便,在编写时加入纯键盘操控的方式,用户可以连续做几组手势,然后完全用键盘操作来增加新手势,简单快捷。同时拥有训练数据的管理界面,在加入了错误数据后可轻易删除。由于系统分类采用支持向量机进行手势分类,少量错误数据对系统不会产生较大影响。


图 4.6 手势输入界面

图 4.7 手势数据管理界面

 

任务栏通知

在进行一些操作时,用户不希望查看监视器,同时也不希望观察远程设备上的反馈信息,但需要确认其手势是否被系统识别。因此,系统提供了接受到消息后在任务栏通知区域显示反馈消息的方式。

设置界面

在设置界面,用户可以设置映射配置、系统是否弹出任务栏通知、以及监视器中加速度图像的更新时间。系统设置的读取与存储由系统自动完成,使用.net framework的序列化功能实现。

在设置手势映射的界面中,系统使用了比较成熟的列表控件ObjectListView (7),该控件支持自定义单元格编辑控件、数据绑定以及自定义列的输入输出方法。由于ObjectListView支持动态绑定单元格编辑控件,不同的手势映射能够在同一个界面中完成,通过多态很容易的实现了这一点。

为了便于热键输入,系统自定义了一个ComboBox。为了避免与系统的快捷键冲突,在输入时用户应逐个按键依次按下,对于系统响应的按键,如Win键,可在下拉的菜单中选取。手势设置界面见图 4.8。

 

图 4.8 手势映射设置界面

    在设置按键映射的界面中,用户可以将远程设备的旋转状态、按键转换为本地的案件信息。设置界面见图 4.9。

图 4.9 按键映射设置界面

基于单片机的四轮机器人

总体设计思路

在机器人设计上,我们采用了模块化的思想。将舵机控制交由专门的舵机控制器执行。剩下控制和通信工作交由51单片机实现。

出于灵活性的考虑,我们并没有采用差速转弯的控制方法,而是利用四个舵机控制方向。这样便可以做到原地转弯或者横向运动。机器人既可以在家中当作娱乐玩具,也可以添加吸尘器等外部设备,做家庭助理。

硬件设计

舵机控制模块

采用高精度8路舵机控制模块,控制脉冲宽度从500ns到2500ns不等,支持匀速切换脉冲宽度,使移动更平滑。切可自由调控波特率,多模块串联等。

该模块通过串口与单片机通讯。达到简化单片机任务,精确控制舵机,消除舵机抖动等不良反应的作用。

无线接收模块

由于我们系统主题通讯为蓝牙通讯,为了防止信号间相互干扰,我们放弃使用2.4hz的无线收发模块。而是采用了成本更为低廉,且不与主要通讯干扰的超再生接受模块(接受频率为315MHz)。其接口如下图显示:

图 4.10 再生接收模块

由于潜在的多设备多指令需求和超再生无线通讯单次通讯位数过少的问题,我们不得不实现了一个无线控制协议。去除校验,控制等因素,可做到91个设备和91个指令的收发。且可扩展性强,可以很轻易的增加设备上限和指令上限。

51系列单片机外部中断为低电平触发,于是我们便加入了非门。将vt得到的接受信息信号,转化为TTL低电平。同时,为了充分利用非门的端口(74LS04),并加强系统的稳定性,提高信号输出的电流,将数据线同时串过非门,从而得到电流更强的输入信号。电路图如图4.11所示:

图 4.11 电路图

电机控制模块

电机控制模块采用了l298芯片,该芯片可以用pwm信号控制电机转速。并且采用光电开关,达到了控制信号隔离的目的。

单片机部分

出于通用性和成本考虑,这里选择了廉价的单片机at89s52。虽然8位单片机的运算能力不强,但是对于简单的控制已经足够使用。运算工作,多交由上位机,即intel开发板工作。这种对于运算性能的牺牲,使机器人整体成本功耗下降,更加节能环保。

软件设计

总体思路

由于潜在的多设备多命令需求,软件必须是可以高并行输入,并且对所输入的信息进行及时响应,于是我们将软件设计为消息驱动的模式,外部事件发生则通过中断产生一个消息,且将消息压入队列。而当系统空闲时,便从消息队列中取出响应消息,进行处理。这样既在原有单核心单线程的硬件基础上达到了接受并行信号的目的,也充分的发挥了单片机的性能。

虽然51系列单片机开发语言为C语言,但是在软件设计上,我们运用了更多面向对象的设计思想。其结构图4.12所示:

图 4.12 单片机软件类型设计

具体模块介绍

CQueue是一个循环队列,由于此类处于系统的核心位置,对其算法进行优化,是之效率更高。

Message主体实现消息队列,实现收到消息,获取消息功能。

Serial 由中断实现串口通讯,并且方便调试,实现了一些串口输出函数,例如输出字符串,输出二进制数等。

WirelessControl实现了多设备多命令的系统的收发协议。

CarControl 针对四轮机器人实现的机器人运动控制函数

SwitchControl 远程电源开关控制函数

消息驱动的系统

图 4.13 消息驱动系统

如图4.13所示,整个系统以消息为中心。此图反映了消息处理流程,系统反复查找新消息,如果有新消息,便去做响应的处理。这种系统扩展性强,便于添加新设备和新的控制任务。

由中断实现的并行输入

我们的系统输入为中断输入,并且只在输入中断中做最简单的消息处理和发送消息,使系统可扩展性,鲁棒性都得到增强。并最大程度的利用了系统资源。

图4.14是串口中断的活动图,内容极为简单,只是将串口数据存下并发送消息给消息队列。

图 4.14 并行输入示意图

图4.15是无线中断活动图,在无线中断中,我们对收发数据进行编码分析,但是其实也是仅仅做了解析无线内容,发送无线消息的任务。而消息的处理,依赖于主消息循环中的处理函数处理。

图 4.15 无线中断活动图

这种中断处理的简单化,有利于大量并行数据的输入。

与主题分离的控制模块

我们的系统可以实现各种控制模块,且可以自由扩展。控制模块接受主体的消息,解析消息和处理消息的工作,完全交由控制模块自己进行。方便扩展。

无线发射及协议

无线发射协议:

每帧四位,且0000位无效

起始帧,一帧,四位分别为1111。

地址帧,两帧,每帧介于0001到1101之间。

数据帧,两帧,每帧介于0001到1101之间。

结束帧,一帧,四位分别问1110.

总体示意图如图4.16:

图 4.16 无线发射协议

无线发射流程:

由串口写入发射命令,例如"A0D0*",其中A后面的数字为设备地址,D后面的数字为发射数据,*是命令截至位。

串口命令写入解析完毕后,调用发射无线消息的函数,按照消息格式进行发送。

 

通信模块

远程设备与开发板的通信

我们选择Bluetooth 技术来完成远程设备与开发板之间的通信。

Bluetooth 技术在2.4 GHz 波段运行,该波段是一种无需申请许可证的工业、科技、医学 (ISM) 无线电波段,能耗低,可以使远程设备更加持久的发送加速度信息。支持点对点及点对多点通信,因而在设备主板上仅需要一个Bluetooth模块。现阶段附带有重力传感器的手持设备通常都具有Bluetooth 模块。

系统定义了与远程设备间通信的消息格式。Bluetooth是全双工模式的,系统接收到加速度信息并处理后,会将处理的结果回发到远程设备,再由远程设备通过不同的方式展现出来。因此,在不外接显示设备的情况下,系统依然可以良好工作。

被控设备与开发板的通信

操作系统驱动

Windows系统没有提供模拟手柄输入设备的API接口。因此,需要开发一款驱动程序,接收程序处理好的手柄模拟信号,再将该信号传递给操作系统。

系统所需驱动为Joystick Driver,是一款在Human Input Device(HID)类下的驱动。该驱动是通过Report与系统、外界程序交互的。考虑到手柄驱动支持反馈,可以在报告定义中,定义一种Output Report,得到Output Report后将信息写入驱动缓冲区,在系统请求Input Report时将缓冲区的信息读出即可。由于在报告定义中没有值是跨字节的,并且缓冲区仅在驱动接受到Output Report后被改写,因而在写入缓冲区时无需考虑线程同步问题。

该驱动采用WDM模型编写,参考了WDM SDK中自带的VHIDMINI驱动程序。可支持带数值的X、Y轴,油门(Z轴),帽子开关(观察点),及12个模拟按钮。

远程设备客户端

远程客户端平台

解决方案采用手机移动平台,考虑到当今社会手机已经相当普及,所以想通过在手机端进行开发,以达到一机多用的效果,同时也符合当今社会低碳环保的社会主题。

在决定采用手机移动平台之后,就需要对众多手机平台进行选择,我们决定选择Symbian平台作为我们解决方案的远程客户端平台。Symbian的优势在于它得到了占据市场份额大多数的手持通讯设备厂商的支持,在NOKIA的大力倡导下,已经成为一个开放的、易用的、专业的开发平台,支持C++和javaSymbian的优势在于它得到了占据市场份额大多数的手持通讯设备厂商的支持,在NOKIA的大力倡导下,已经成为一个开放的、易用的、专业的开发平台,支持C++java语言。Symbian作为一款已经相当成熟的操作系统,拥有着很长的发展历史,同时也拥有着很好的开发资源,以及开发文档,更加便于我们对其进行开发。

蓝牙模块

Symbian OS上的蓝牙模块是由一系列的组件层次结构组成,就是一种堆栈结构,其总体结构见图 4.17。

 

图 4.17 蓝牙模块层次结构图

Symbian OS上的蓝牙API能够使应用程序访问蓝牙的操作,对Bluetooth Host Controller组件,属于底层结构,应用程序无法直接访问,对于Bluetooth Host 组件,应用程序可以通过一些特定操作实现对蓝牙设备的访问。本解决方案的蓝牙模块主要可以分作三个部分:

  1. 蓝牙设备发现模块

此模块用于设备的选取,即选取要连接的服务端,设备发现模块选择使用Symbian OS提供的Bluetooth UI(Bluetooth Device Selection UI),其提供一个对设备选择的简单解决方案,由系统写好的相关界面实现用户对设备的选取,首先会提供使用较多的蓝牙设备供你选择,如果你的设备在此中间就可之间减少蓝牙设备寻找的时间,如不在其间也能对周围蓝牙设备进行重新的搜索。蓝牙发现模块的界面如下:

  1. 蓝牙服务发现模块

此模块用于对服务端的服务进行发现,并获取相关蓝牙服务信息(如port通道数),由于本解决方案实现了多点连接,并自定义了一个基于RFCOMM的通信协议,所以此模块的作用至关重要。服务发现模块的类图见图 4.18:

图 4.18 服务发现模块的类图

蓝牙服务发现模块首先通过上面介绍的Bluetooth Device Selection UI向用户询问要连接的服务端,然后通过Symbian的SDP数据库创建需要寻找的服务的记录(在本例中是自己定义的基于RFCOMM的协议),接着就通过agent在服务端开始相关服务的寻找,并记录下蓝牙服务的相关信息(在本例中是port通道数,如果找到相关服务的话),蓝牙服务发现过程的流程见图 4.19。

图 4.19 蓝牙服务发现过程

  1. 客户端模块

在实现了对需要连接的服务端以及服务端上服务的查找之后,接下来就是需要在手机客户端与服务端之间建立连接,实现相互之间通讯,以将手机上的采集的重力加速度数据传送到服务端加以分析计算,并将结果回发给客户端,使客户端能根据计算结果采取不同的反馈。客户端模块的类图如图4.20所示(仅展示了蓝牙部分):

图 4.20 客户端模块类图

客户端工作的实际过程:首先通过蓝牙服务发现模块(其又通过蓝牙设备发现模块)获取设备的相关信息,然后用Symbian提供的RSocket建立客户端与服务端的连接,客户端就进入工作状态。客户端的状态图见图 4.21。

图 4.21 客户端模块状态图

重力加速度获取模块

手机端对重力加速度的获取通过Symbian OS提供的RRSensorApi,此API采用观察者模式,并且提供给程序访问重力加速度数据的接口,对外提供一个MRRSensorDataListener的接口,只要继承此接口,并重写其对重力加速度数据处理的虚方法,再将其注册进其重力加速度获取实例便能获取到重力加速度数据,其过程还需提供硬件的ID值,可由Symbian SDK相关文档中找到。此模块的类视图见图 4.22。

图 4.22 重力加速度获取模块类图

用户界面

用户界面是用户与客户端进行交流的接口,在本解决方案中,采用了Model-View-Controller模型,整体构架如图4.23所示:

图 4.23 用户界面框架

采取这样的模式使视图层与业务层分离,有利于降低耦合性,增加了可维护性,加开了相关开发速度。用户界面相关的整体结构类图4.24所示:

图 4.24 用户界面类图

用户界面主要有以下功能:

  1. 接收用户的选择

用户界面首先需要实现的就是让用户选择连接的服务端这个功能,此功能的实现直接通过上文所提到的蓝牙模块中的Bluetooth Device Selection UI进行,此过程会首先弹出一个对话框显示最近连接过的蓝牙设备供用户选择,如在此中没有用户想要选择的服务端,则可点击搜索附近的设备进行搜索,UI运行时画面如图4.25所示:

图 4.25 选择连接服务端界面

  1. 在Joystick模式下响应用户按键

当客户端模式切换到Joystick模式时,客户端需要获取用户的按键信息,并把这些信息发送给服务端,这时需要对按键进行监控,并同时将按键映射到其相对应的Joystick按键。当用户按下一个键后,keyboard hardware就会生成一个中断,由keyboard driver捕捉,之后分解出这次按键事件的key code,然后driver将它发送到系统端的一个线程——被称为window server,而window server又会把它发向在window group中拥有焦点的那个应用程序中,这个步骤是使用一个control environment来完成的,这是window server和user interface library之间的一个API函数。按键得映射是由CButtonMapper类完成,在获取到按键相关信息时其会转换成相应所需按键信息并储存起来等待发送给服务端。在对用户的按键行为作出捕捉转换的同时,还需要将相应转换好的信息反馈给用户,以使用户知道服务端接收到了什么信息,此过程通过UI上的变化执行,当接收到用户按键事件并把按键转换成相关Joystick信息后,通过UI上图片的切换让用户了解其所进行的操作,此段的运行时画面如图4.26所示:

图 4.26 响应用户按键

  1. 在各种模式下接受服务端发送过来的反馈信息并传达给用户

用户界面不仅要能响应用户的操作,还应该将从服务端获取的分析结果也直观明了的显示给用户,此过程首先由CBT类(bluetooth实现)接收到服务端的相关消息,然后对消息进行解析,分析出消息所对应的模式,以及消息的正体内容,然后将解析的结果发送给程序UI进行显示。主要分成两种模式:

  1. Joystick模式下

在Joystick模式下,客户端将相应重力加速度信息传递给了服务端,服务端对这些数据进行分析计算,将其模拟成Joystick的数值(如X,Y等),客户端需要的是这些数据所代表的方向信息,即这些数据表示的运动方向,服务端会将此类信息回发至客户端,客户端在收到解析完消息后通过在UI上图片的切换让用户知道刚刚的操作所代表的方向信息,运行时画面如图4.27所示:

图 4.27 显示反馈的Joystick方向信息

  1. Gesture Control模式下

在Gesture Control模式,服务端对一连串加速度数据进行分析计算,通过相关数值特征判断用户正在用客户端进行操作的手势信息,然后会将识别出的手势以及手势所对应的相关操作回发至客户端,客户端在收到解析完消息后,会在屏幕上显示出刚刚识别出的手势类型,以及执行的操作,运行时画面如图4.28所示:

图 4.28 显示反馈的Gesture既相对应命令

其他显示给用户的合理信息

  1. 供用户选择操作菜单

在程序运行的开始程序便会提示按照正常的顺序选择连接的服务端,并且选择工作的模式,不过有时用户需要改变模式,有时需要重新连接到其他设备,所以设计了这个选择操作菜单,当用户在任意时刻按下左功能软键(屏幕上有提示)