程序设计
1 准备工作
1.1 Leap Motion
-
Leap Motion是一种人机交互中的体感控制器,可利用手势识别采集数据,即借助手掌和手指的动作感应技术进行信息输入,完成人机互动。因其设备使用方式简单、体积小、价格低廉、手势精度高、可配合多种传感设备进行辅助操作,为人机交互的应用提供了一种新的思路。Leap Motion 由于直接捕获真实的手势运动数据,其数据更自然、逼真、仿真度高。同时,支持双手交互控制,可在极端情况下进行动作采集、跟踪,结果更精确、稳定、识别度好。
-
Leap Motion 的坐标系原点位于 Leap Motion 控制器镜面的中心。以这个中心平行设备向右,为 X 轴的正方向;垂直 X 轴指向玩家,为 Z 轴的正方向;垂直镜面向上,为 Y 轴的正方向,如下图所示:
-
倘若 Leap Motion 设备在其视野中追踪手、手指和工具,它将提供一组数据集(或者是帧,或者是数据)进行更新。每帧数据包含一个基本追踪数据列表,如手、手指和工具,也包括识别出的手势和描述场景中的运动因素。
-
【注释:帧是 Leap Motion 最根本的数据模型,可以把它理解为一个集合,其他的实体数据都存放在这个集合里,比如手、手指、手势等。】
-
Hands
-
手模型提供关于手,或者其他被检测出来的手指或工具的坐标、特征和运动。
-
Leap Motion 使用人手的内部模型来提供预测性追踪,即使手部分不可见时也是如此。手模型总是提供五个手指的位置,但是当手的轮廓和其手指清晰可见时,其跟踪效果是最佳的。
-
Leap Motion 的接口函数尽可能多地提供关于一个手的信息。也就是说,Leap Motion 可能无法计算出在每帧下的所有手部信息。例如,当一个手握成一个拳头,它的手指则无法被 Leap Motion 看到,所以手指的信息就为空。
-
如果一个人的手或其他手状物体出现在视野范围内,则手部列表中可能会出现多于两只手的情况。但是,建议在 Leap Motion 的视野中至多保留两只手,以获得最佳运动跟踪质量。
-
Arms
-
一个臂是骨状物体。数据集提供了一个臂的取向、长度、宽度和结束点。当肘部不在视野内时,Leap Motion 控制器根据过去的观察结果以及典型的人体比例来估计其位置。
-
Fingers
-
Leap Motion 可以提供手的每个手指的信息。如果全部或部分手指不可见,则基于最近的观察和手的解剖模型来估计手指特征。每个手指由类型名称标识。
-
手指由 Finger 类表示。
-
指尖位置和方向矢量提供指尖的位置和手指指向的大致方向
-
一个 Finger 对象提供了描述每个解剖手指骨的位置和定向的 Bone 对象。所有的手指都包含从基座到尖端排列的四根骨头。
-
骨骼被识别为:
-
掌骨 - 将手指连接到手腕上的骨头(拇指除外)
-
近节指骨 - 手指根部的骨骼,与手掌相连
-
中节指骨 - 指尖和基部之间的手指中间骨
-
远节指骨 - 手指末端的终端骨骼
-
-
这种拇指模型与标准解剖命名系统不太匹配。真正的拇指比其他手指少一根骨头。然而,为了便于编程,Leap Motion 拇指模型包括零长度的掌骨,以便拇指具有与其他手指相同索引的相同数量的骨骼。因此,拇指的解剖掌骨被标记为近节指骨并且解剖近侧指骨被标记为 Leap Motion 手指骨模型中的中节节骨。
-
Tool
-
Leap Motion 会把细长笔直的圆柱形物体当作工具,比如铅笔。
-
相关类:Tool,Tool 是 Pointable 类的子类。
-
Gesture
-
在 Leap Motion 的世界,除了记录我们手的坐标、方向的数据,还能根据我们每一个手指和工具的运动,识别出我们的某些手势,比如:画圆、挥手、按键、点击屏幕。
-
相关类:Gesture以及Gesture的子类:CircleGesture、SwipeGesture、KeyTapGesture、ScreenTapGesture。
-
Sensor Images
-
随着计算出的跟踪数据,可以从 Leap Motion 相机中获取带有叠加校准点的原始传感器图像。
-
图像数据包含测量的红外亮度值和校正复杂镜头失真所需的校准数据。可以将传感器图像用于增强现实应用,特别是当Leap Motion硬件安装在VR头显上时。
1.2 Processing
-
Processing是一种灵活的软件素描簿,也是一种用于学习如何在视觉艺术环境中编码的语言。自2001年以来,Processing一直在视觉艺术中推广软件素养和技术中的视觉素养。有数以万计的学生、艺术家、设计师、研究人员和业余爱好者使用Processing进行学习和原型设计。
-
下载Processing
-
到Processing 官方网站上下载最新版本的Processing:
-
打开Processing
界面包括:
-
菜单栏:包含文件菜单、编辑菜单、速写本菜单、调试菜单、工具菜单和帮助菜单;
-
工具栏:包含运行、停止、调试和模式;
-
编辑区:编写程序代码区域;
-
控制台:显示程序编译等信息,如果程序出现错误会有错误提示。
-
学习
-
在Processing官网,有许多例子可供学习。
-
参考文档
-
点击帮助->参考文档,即可获得可用函数或命令的使用说明。
1.3 Leap Motion for Processing
-
Leap Motion for Processing 是一个用于结合 Processing 和 Leap Motion 的库。
-
库的安装
-
打开如下图所示的界面,单击“添加库文件…”;
-
在各个选项卡中选择需要的库、模式、工具、范例,然后单击安装按钮;
-
Leap Motion的安装
-
由于新版本的Ultraleap的手部跟踪软件似乎与Leap Motion for processing不兼容,我们最终找到了与其兼容的版本:猎户座——LEAP MOTION ORION 3.2.1,在旧版版本中找到LEAP MOTION ORION 3.2.1下载并安装;
-
若出现下图中的情况,可找到leapmotion的安装目录,打开CoreServices目录下的Drivers文件,安装dpinst64.exe文件。若leap连接成功,电脑右下角会出现绿色图标。
-
若Leap motion能够成功连接,打开processing的文件->范例程序-> Contributed Libraries-> Leap Motion for Processing,其中有LM_1、LM_2、LM_3三个示例文件可以运行,其中LM_1显示了基本数据访问,运行后可显示手部图像,LM_2显示了如何识别预定义的手势,即滑动手势、转圈手势、屏幕点击手势、按键手势,LM_3可以访问原始相机图像。
-
库参考
-
关于库中所有可使用的对象以及函数等信息,可点击帮助-> Library Reference-> Leap Motion for Processing,可查看库中所有类以及函数的详细说明。
2 程序与硬件
2.1 Leap Motion for Processing
-
本项目需识别五种与乐器弹奏相关的手势,设计的手势分别为大阮、笙、钹、月琴、云锣这些乐器的演奏手势。
-
大阮
-
笙
-
钹
-
月琴
-
云锣
-
为满足手势识别的要求,本项目使用Leap Motion,通过Leap Motion for Processing库进行编程,基于动作本身的特点,通过不同的算法提取了手势的handPosition、handSide、handDistance、handRoll、handNumber、FingerOutstretched等特征,通过提取的特征对输入的手势进行分类识别,手势识别的效果如下:
-
为实现通过不同手势控制Arduino上的器械,本项目使用串口通讯实现Leap Motion与Arduino两个设备之间的交互。
-
Processing串口设置
-
Arduino串口设置
-
Processing部分的实验代码如下:
Processing实验代码
2.2 Arduino
-
本项目的民族乐器交互装置由Arduino UNO、DFPlayer Mini MP3模块以及SG90舵机组成,通过Leap Motion for Processing进行手势识别,将识别结果通过串口通讯发送给Arduino UNO,以控制DFPlayer Mini的音乐播放以及舵机的转动,共可播放云锣、大阮、月琴、钹、笙五种乐器的声音。当识别到第一个手势时,手势对应的乐器声响起,对应的熊猫图案的部件依靠舵机进行摇动,用户可在一首乐曲的时间内,选择想要加入的乐器并做出对应的手势,即可欣赏到自己参与控制的、多乐曲演奏出的《春节序曲》。用户可在使用过程中欣赏到传统民族乐器的优美声音,以及体会不同民族乐器以不同组合演奏时的音乐碰撞出的火花。
-
实验器材
-
DFPlayer Mini *5
-
SG90舵机 *5
-
扬声器 *5
-
TF卡 *5
-
器材简介
-
DFPlayer Mini
-
DFPlayer Mini是一款小巧且价格低廉的MP3模块,可以直接接驳扬声器。模块配合供电电池、扬声器、按键可以单独使用,也可以通过串口控制,作为Arduino UNO或者是任何有串口的单片机的一个模块。模块本身完美的集成了MP3、WAV、WMA的硬解码。同时软件支持TF卡驱动,支持FAT16、FAT32文件系统。通过简单的串口指令即可完成播放指定的音乐,以及如何播放音乐等功能,无需繁琐的底层操作,使用方便,稳定可靠。
-
使用"DFRobotDFPlayerMini.h",可实现30级音量的调整、乐曲的切换、乐曲的播放与暂停等功能。
-
-
SG90舵机
-
舵机是一种位置(角度)伺服的驱动器,由外壳、电路板、驱动马达、减速器与位置检测元件所构成,适用于那些需要角度不断变化并可以保持的控制系统。目前,在高档遥控玩具,如飞机、潜艇模型,遥控机器人中已经得到了普遍应用。主要用于需要输出某一控制角度的场合,舵机可以根据控制信号来输出指定的角度,常见的有0-90°、0-180°、0-360°。
-
工作原理:舵机是由接收机发出讯号给舵机,经由电路板上的 IC驱动无核心马达开始转动,透过减速齿轮将动力传至摆臂,同时由位置检测器送回讯号,判断是否已经到达定位。一般的伺服马达是将细铜线缠绕在三极转子上,当电流流经线圈时便会产生磁场,与转子外围的磁铁产生排斥作用,进而产生转动的作用力。
-
-
实验接线
-
实验总代码
-
Processing部分的实验代码如下:
-
Arduino部分的实验代码如下: