多点触摸交互系统
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
山东轻工业学院
第一届“银兴杯”电子设计大赛
设计方案
作品名称:多点触摸交互系统
参赛编号:A甲03
摘要
MultiTouch多点触摸交互系统是采用红外摄像头采集红外信号并通过CCV-1.3专用转换软件将红外信号转换为触点的坐标信号,并将其发送到计算机的port3333端口,通过java 端口信息拦截工具将信息拦截并发送至flash Demo,使程序作出相应动作,实现对计算机的多点触摸操控。
它与普通触摸屏的区别在于可以实现多点同时触摸动作。
关键词: MultiTouch 红外摄像头 port3333 CCV-1.3 多点触摸
目录
1系统方案...................................................................................................................................... - 1 -1.1总体方案的论证与选择 .. (1)
1.2软件/硬件系统的论证与选择 (3)
1.2.1软件方案的论证与选择 (3)
1.2.2硬件方案的论证与选择 (3)
2系统理论分析与计算 (4)
2.1光路的设计与屏幕尺寸的计算 (4)
2.2摄像头安装高度计算 (4)
3系统与程序设计 (4)
3.1系统总体框图 (4)
3.2软件调试与例程开发 (4)
4测试方案与测试结果 (5)
5 结论 (5)
附录1:硬件耗材 (6)
附录2:测试程序列表 (6)
1系统方案
根据系统的需要,本系统主要包括显示及触摸屏、信号采集及发送、信号处理软件、执行例程等部分。
1.1总体方案的论证与选择
多点触摸交互系统指的是允许计算机用户同时用多个手指来控制图形应用的人机交互系统。
目前,根据技术特点该系统有以下几种实现方案:
1.受抑全内反射多点触摸技术(FTIR)
2.背面散射光多点触摸技术(DI)
3.激光平面多点触摸技术(LLP)
4.红外二极管多点触摸技术(LED-LP)
方案一:受抑全内反射多点触摸技术(FTIR)
本方案是通过受抑全内反射原理把红外线反射在一块遵守全内反射规则的压克力内部,当用户在压克力表面触摸时,光线就会被用户的接触部位反/折射(通过皮肤),在触摸的地方就会将原本反射在内部的红外线折射回我们在压克力板下架设的红外摄像头(图1.1),通过对应的软件就可以侦测到我们相对应的信息点。
图1.1
方案二:背面散射光多点触摸技术(DI)
红外光从底部照射在触摸屏幕上,将漫反射幕放在触摸屏幕的上部或者底部,当物体触摸屏幕的时候会反射比漫反射幕更多的红外光,然后被摄像头读取(如图1.2)
图1.2
方案三:激光平面多点触摸技术(LLP)
红外激光头发射出来的红外光铺满整个屏幕,这个激光红外面的厚度大概在1mm左右,当手指触摸屏幕的时候,手指的尖部会作为一个红外点显示出来(如图1.3)。
图1.3
方案四:散射光平面多点触摸技术(DSI)
散射光平面多点触摸技术是利用一种特殊的压克力来使红外线照亮整个屏幕,当用户在压克力表面触摸时,光线就会被用户的接触部位反/折射(通过皮肤),在触摸的地方就会将原本反射在内部的红外线折射回我们在压克力板下架设的红外摄像头(图1.4),通过对应的软件就可以侦测到我们相对应的信息点。
图1.4
四种方案的比较
通过对五种方案的比较,考虑到系统本身的成本与安全易用性,及易实现性,故选择方案一。
1.2软件/硬件系统的论证与选择
1.2.1 软件方案的论证与选择
多点触摸输入编程和其他任何形式的编程一样,不过在多点触摸编程里,有
一套自己的某些协议,语法和标准。
在众多爱好者及专家的努力下,多点触摸编程已经有了针对多种编程语言的开发框架,这些语⾔包括ActionScript 3,Python,C,C++,C#以及Java。
根据自己对这几种语言的理解以及学习的易上手和开发的易用性,选择ActionScript 3作为应用例程的开发平台。
而数据的采集与处理发送则是用专用软件CCV-1.3来实现。
软件截图
1.2.2 硬件方案的论证与选择
摄像头:
根据系统功能的要求,要求摄像头采集信号要精确,采集频率要高,才能达到系统的定位精准,触摸顺畅;所以摄像头要求高像素和高帧频;根据对市场上的摄像头产品的比较,本系统选用帧频较高,价格相对较低的SONY PS3EYE 高清摄像头。
亚克力:
系统采用FTIR方案,根据对受抑全内反射的条件的要求,要采用厚度为10mm的抛光亚克力板。
显示设备:
显示设备有两种备选方案,一是用led显示面板置于亚克力下部来实现桌面显示,二是通过投影机背投到亚克力背面来实现桌面显示。
根据系统的要求,本系统选择投影机作为显示方案,这样不管尺寸多大都比较容易实现并能获得更好的色彩还原度。
红外二极管:
为使IR-LED灯带与亚克力边缘紧密接触,减少红外光的泄露,系统选用平头IR-LED 制作灯带。
2系统理论分析与计算
2.1光路的设计与屏幕尺寸的计算:
为尽量减少系统体积,光路采用两次反射后再投射到触摸屏上,这样极大程度上降低了系统箱体的高度。
基本光路图如图2-1
图2-1
根据投影机的投射比4:3,亚克力屏尺寸计算如下:
确定长a=60cm 则宽b=60*(3/4)=45cm;而根据投影机的投射角α=30°,计算光路长度为L=(45/2)÷tan15°=84cm
2.2摄像头安装高度计算:
采用SONY PS3EYE摄像头,根据其镜头与CCD感光元件的尺寸和比例,摄像头的安装高度应在亚克力板下部约80cm处。
3 系统与程序设计
3.1系统总体框图
3.2 软件调试与例程开发
本系统的例程开发采用FLASH AS3,例程的详细开发过程见测试方案。
4测试方案与测试结果
当启动一个已经准备好的程序开始发送触点信息时,程序可以通过TUIO 协议来读取它。
然而,Flash 并不能马上理解这些触点信息。
因为TUIO 是一个建立在UDP 通信协议上的一个非常简单的协议,所以当使用Adobe Flash CS3 或者ActionScript 3.0 来创建一个个能快速响应的程序时,需要有一个桥梁来读取UDP 接口信息然后转变为TCP 连接模式,Flash
OSC可以在需要的Touchlib 和Flash 之间搭一座桥,这样创建Flash 多点触摸应用。
创建Inside MyFirstApp.as文件,粘贴这些代码:
package app.demo.MyTouchApp {
import flash.display.*;
public class MyFirstApp extends Sprite {
public function MyFirstApp():void {
trace(“MyFirstApp Loaded”);
}
}
}
在调整FLASH 控件属性后,找到你的DocumentClass(文档类)属性,并且填入
app.demo.MyTouchApp.MyFirstApp,这个文件就和MyFirstApp.as ⾔件连接起来了。
现在的Flash 控件是空的,并且要让TUIO 工作的话,要放置个Shape 覆盖舞台,使用矩形工具并让它填满整个舞台。
然后设定颜色, TUIO 就可以识别shape 并且做出响应。
然后运用“控制”菜单中的“运行”按钮,测试影片。
测试完成后,添加一个TUIO 类到这个.as 文件中。
内容如下:
public function MyFirstApp():void {
TUIO.init(this,’localhost’,3000,’’,true);
}
}
}
再次测试影片,应该看到白、红、绿的正方形在左上角,触摸的信息在右上角,并且当在舞台上触摸的时候,在手指下面出现圈圈。
然后把收集的触摸信息添加到这个数组中。
只需要在flash/event/TUIO.as 中添加以下内容:
public static function returnBlobs():Array {
return OBJECT_ARRAY;
}
保存文件并回到MyFirstApp.as 文件。
}
结果分析:
1.由于系统采用的摄像头帧频不够高,在触摸时可能出现卡帧现象
2.程序的触点定位过于粗糙,可能会导致定位偏差大,从而引起误操作
5 结论
系统的可行性已经通过自己搭建的简易Mtmini实验系统测试通过,硬件搭建简单,并且在测试过程中硬件、软件(CCV-1.3、TUIO_Simulator-1.4、Flash AS3)未出现不稳定的情况。
参考文献:
《多点触摸技术手册》
《Action Script3》清华大学出版社
附录1:硬件耗材
元件名称参数规格数量SONY PS3EYE摄像头USB 个 1
投影机4∶3 台 1 IR-LED 平头个若干木箱65×40×80 个 1
附录2:测试程序清单
测试程序如下:
package app.demo.MyTouchApp{
import flash.display.Sprite;
import flash.events.TUIO;
import flash.events.Event;
public class MyFirstApp extends Sprite {
public function MyFirstApp():void {
TUIO.init(this,’localhost’,3000,’’,true);
addEventListener(Event.ENTER_FRAME, test_returnBlobs);
}
public function test_returnBlobs(e:Event):void {
trace(TUIO.returnBlobs().length);
}
}。