APP下载

弹钢琴拟人机械手控制软件设计

2015-05-30王舒扬孙江波蔡赟柳虹亮

中小企业管理与科技·上旬刊 2015年11期
关键词:软件设计拟人仿真

王舒扬 孙江波 蔡赟 柳虹亮

摘 要:在Visual Studio开发环境下,使用C#语言设计了弹钢琴拟人机械手控制软件,软件由乐谱管理,音频播放,仿真操作界面以及串口通信部分组成。软件设计了算法对输入的乐谱数据进行识别与分析,将乐谱的弹奏任务智能分配给机械手。充分利用C#语言可视化编程的优点,将机械手运动的过程进行了可视化仿真。

关键词:拟人;机械手;仿真;软件设计

0 引言

随着科学不断进步,新型机械手在关节自由度、灵活性、定位精度等方面有了很大的提高,加强了音乐机器人物理演奏能力。现有的控制系统大致上分为两类,一是采用记录并回放的方式,将演奏过程中按键的轻重等因素记录为midi音源,并通过将其转化为波形脉冲信号驱动机器人达到演奏的目的[1]。这种方式应用于早期的钢琴自动演奏技术上,其硬件不具有拟人化的特征,例如日本早稻田大学曾经研制过钢琴演奏机器人,共有88台击键器和两台踏板驱动装置。二是采用硬编码的方式,即将完整曲目进行手工分析、每个曲谱分配给机械手相应的部位(例如某一根手指)计算运动轨迹然后编码。这种方式虽然在硬件上具有了拟人化的特性,但是任意两个不同结构的机械手之间即使是同一曲目的编码也各不相同,无法实现歌曲编码的复用。同时这两种类控制系统对环境、乐器规格适应性不强,无法对未知曲目进行自动分析并演奏。

编写符合软件工程理念,能对未知曲谱拟进行自动分析的拟人机械手弹钢琴控制软件能提高机器人演奏的自动程度和减少系统开发的开销,在音乐机器人演奏方面的应用前景十分广阔。

1 弹钢琴拟人机械手硬件结构

机械手选用圆柱的手指外形,使得手指的强度增加,同时最大化的接近人手的比例,可以使机械手更加的灵活[2-4]。手指的连接处采用平滑的边缘设计,使得手指节在复位时限位在手指伸直的中心轴线上。

采用气动作为动力源,气动作为驱动具有体积小、结构简单等优点[5]。气缸通过闸线进行传动,在机械手的上指节处连接,受力点在上指节并以连接销为轴进行运动,使得机械手拥有人手骨骼与肌肉一样的工作方式。整个气动回路连接气缸固定在固定板上,在固定板上与闸线定位块上的闸线穿孔进行对心固定。整体装配图如图1所示。

2 软件总体设计

软件使用C#语言编写,总体分为四大部分,乐谱管理,音频播放,操作界面以及串口通信,其中乐谱管理是软件的核心,包括对乐谱的输入与输出,将乐谱处理成机械手可以识别的数据格式,并将弹奏过程以可视化的形式在软件界面中仿真出来[6]。软件总体框图如图2所示。

3 乐谱处理

使用乐谱的最终目的是在软件可视化仿真时播放对应的音频,所以必须让计算机的发声设备能够理解软件发送的信号,因此采用了MIDI(Musical Instrument Digital Interface)格式传输数据[7]。

3.1 软件数据结构设计

整个软件中使用的数据都是整数类型,且乐谱的播放是有序的,所以选择数组作为数据结构。具体的数据需求及处理如下:

3.1.1 当前系统正在播放的音符

正在播放的音符使用MIDI音符编码,但由于用户输入的乐谱格式和输出的MIDI音符编码方式不同,所以需要在内部进行转换。钢琴上的白色琴键依次对应简谱中的1、2、3……,但在MIDI中对应的编码却不是连续的,因为穿插在白色琴键中的黑色琴键也占用了MIDI中的发音序列。考虑到琴键的总数是有限的,所以在软件中直接使用哈希表的形式将两者的编码建立映射。从中央C开始白色琴键和其间的黑色琴键的MIDI编码与用户输入编码的部分映射语句如下:

Hashtable soundToMidiNote = new Hashtable();

soundToMidiNote.Add("1",60);

soundToMidiNote.Add("#1", 61);

soundToMidiNote.Add("2",62);

3.1.2 当前音符在整首乐谱中所处的时间位置

第三方组件C# MIDI Toolkit提供了内部时钟用以计时,并将其转化成整数形式表示的时间位置,当内部时钟与音符位置相同时产生一个发音事件。

3.1.3 当前音符使用左手还是右手弹奏

3.1.4 当前音符使用哪个手指弹奏

3.1.5 机械手需要移动的距离

软件播放音符时,仿真界面下方的机械手也应该随著音符的改变而变化自身的位置,所以将音符和中央C之间的距离进行映射。以中央C为距离0,一个白色琴键的宽度为单位1,黑色琴键的宽度为0.5,从中央C开始连续7个白色琴键和其间的黑色琴键的距离映射代码如下:

Hashtable soundToMidiDistance = new Hashtable();

soundToMidiNote.Add("1",0); soundToMidiNote.Add("#1", 0.5);

soundToMidiNote.Add("2",1);

因为以上元素都用数字来表示,是相同的数据类型,并且每一个音符都包含上述元素信息且音符之间具有顺序关系,所以采用二维数组作为软件的数据结构。数组的定义及初始化的代码如下:

int[,] finAnalyse = new int[originaSound.Length, 5];

for (int i = 0; i < originaSound.Length; i++)

{ finAnalyse[i,0] = midiNoteSound[i];//音符

finAnalyse[i, 1] = 0;//时间(节拍计算)

finAnalyse[i, 2] = 0;//使用哪只手弹奏

finAnalyse[i, 3] = 0;//使用哪个手指弹奏

finAnalyse[i, 4] = 0;//机械手移动距离 }

3.2 软件算法设计

比较简单的算法是将琴键从正中分为两部分,两只机械手分别管辖这两部分,依次循环数组中的曲谱,首先判断曲谱属于哪一大部分,在计算当前机械手中哪个手指与当前曲谱位置最近,驱动机械手去弹奏。但这样做会使机械手左右最边上的手指使用频繁,而乐谱不恰好落入当前手掌范围内则很少用到处于中间的手指,并且限于机械手的性能,频繁的位移会影响弹奏的流畅性。所以应当尽量减少移动次数,也就是应该在一次机械手移动的过程中尽可能的多弹奏音符。为了达到这个目的,为每个机械手定义一个存放所弹奏乐谱的序列,当序列中最大音符与最小音符之差超出机械手能控制的弹奏范围时,即意味着机械手需要进行移动。循环处理所有音符,将每个音符放入距离较近的机械手的对应乐谱序列中,每当达到需要机械手进行移动的条件时,确定下来机械手的位移距离,将乐谱序列清空,并将移动后的机械手位置记录下来。软件流程图如图3所示:

4 软件操作及仿真界面

整个软件的界面分为数据的输入及显示区域,操作区域以及机械手演奏的仿真三个部分。当乐谱播放时,仿真界面会模拟机械手弹奏的过程,移动机械手的位置,以深色显示出曲谱对应的琴键及当前动作的机械手的手指,同时将弹奏的乐谱播放出来。软件界面如图4所示。

5 结论

使用C#语言编写了弹钢琴拟人机械手控制软件,软件定义了乐谱的输入与输出格式,设计了算法对输入的乐谱数据进行识别与分析,将乐谱的弹奏任务智能分配给机械手。并将机械手运动的过程进行了可视化仿真。实际应用结果表明软件操作界面友好灵活,仿真过程清晰易懂,达到了设计要求。

参考文献:

[1]蔡自兴.机器人学[M].北京:清华大学出版社,2000.

[2]张邦成,谭海东,刑天羿,等.微小型救援机械手的轻量化设计[J].制造业自动化,2014(15):129-132.

[3]庞在祥,宫丽男,姜大伟,等.基于CATIA/ADAMS仿人灵巧手建模与动力学仿真[J].长春工业大学学报:自然科学版,2013,34(3):264-267.

[4]周慧明.关节型机械手的结构创新设计[J].煤矿机械,2007,28(10):17-19.

[5]董立立,赵益萍,梁林泉,等.機械优化设计理论方法研究综述[J].机床与液压,2010(8):114-119.

[6]张邦成,张玉玲,王占礼,等.汽车离合器从动盘拖拽分离测试机软件设计[J].机械设计与制造,2011(9):203-205.

[7]冯国杰,王吉军.基于分层次聚类的MIDI音乐主旋律提取方法[J].计算机工程与应用,2009,45(26):233-235.

基金项目:

吉林省教育厅“十二五”科学技术研究项目(2012110)。

作者简介:

王舒扬(1983-),男,汉族,吉林长春人,长春工业大学讲师,硕士,主要从事软件应用与虚拟现实方向研究。

猜你喜欢

软件设计拟人仿真
拟人句
拟人句
拟人句
学会拟人句
基于STC单片机的厨房智能安全管控系统的设计
基于STM8S903K3的序列打螺丝夹具的软件设计
Buck开关变换器的基本参数设计及仿真分析
试析PLC控制下的自动化立体仓库仿真情况分析
基于MADYMO的航空座椅约束系统优化设计
中国体态假人模型与FAA Hybrid Ⅲ 型假人模型冲击差异性分析