本帖最后由 xvholly 于 2016-9-5 17:25 编辑
目标机器人解魔方的例子在网上已经有过很多,对于LEGO MINDSTORMS来说,从NXT开始就已经有了,EV3推出后许多玩家更是将解魔方机器人的搭建当成玩EV3的代表作品。那么机器人究竟是如何完成解魔方这件事情的,这是导致我这次选题来做的原因。 可惜我对工业设计并不了解,魔方的整体搭建基于David Gilday的结构,搭建图纸可以到他的官方网站下载:http://mindcuber.com。 本系列文章主要向对此感兴趣的同学分享我在程序设计方面的内容,一起学习解魔方机器人的程序实现。文章并没有一次性写完,还会陆续更新。 设计思路初次接触解魔方机器人可能会觉得无从下手,因此我们需要进行任务分解,将复杂的大任务逐步分解为简单的小任务。这种“解决问题”的系统都理解为三部分组成:输入、计算、输出,按照这种思路整理如下: INPUT | | SYSTEM | | OUTPUT | Scan
魔方扫描 | → | Compute
算法计算 | → | Solve
转动解决 | 动作分解在分解动作之前,先来看看机器人所拥有的“能力”。EV3连接的主要设备包括:颜色传感器1个、大型马达2个、中型马达1个。各个设备的作用: - 颜色传感器:扫描魔方
- 大型马达(底座):转动底座
- 大型马达(手臂):转动手臂
- 中型马达:转动扫描头
而通过这些设备的组合,可以实现机器人所需要的基本动作,比如:拧魔方、翻转魔方、扫描每个色块。 接下来按照之前讨论的设计思路,对系统的三个部分分别进行动作分解。 输入-魔方扫描先来想象一下扫描魔方的过程:扫描第1个面、翻转、扫描第2个面、翻转……扫描第6个面。 再想象扫描单面的过程:扫描中心块1、旋转45度、扫描角块2、宣传45度、扫描边块3……扫描边块9。 而关于翻转魔方,由于EV3机器人只能从一个方向翻转魔方,当翻转到第4个面后,需要将魔方旋转90度后才能继续将第5、第6个面翻转上来。 如果理解了扫描魔方的动作过程,那么每个马达所需要做的动作也就容易得出: - 大型马达(底座):顺时针转90度、逆时针转90度、顺时针转45度、逆时针转45度
- 大型马达(手臂):抬起、扣住、后拉
- 中型马达:定位中心块、定位角块、定位边块
计算-算法计算通常算法是一些理论的实现,而工程设计是要将算法与实际相结合。就拿解魔方为例,解魔方的算法早已经得出,而计算机程序设计也已经实现,但EV3机器人若想应用这些算法和程序,就要做相应的兼容接口,为算法和机器人充当翻译的角色。 实现解魔方算法的程序往往已经有特定的输入与输出,因此EV3要做的第一件事就是要将扫描到的结果转化为与算法相同的表示方式;而计算之后还要将算法的输出转化为EV3能够识别的机器人动作。 不难想象,在这一步所需的动作分解: - 魔方表示方法的转化:扫描初始状态、标准化、符合算法的表示方法
- 算法实现:利用已有的解魔方程序
- 算法嵌入EV3程序
输出-转动解决最后就是将已计算出的解魔方步骤转化为机器人动作,EV3的动作无法像人一样十指齐发多维度拧魔方,只能通过两个大型马达的配合每次拧最下面的一层,如果需要拧其他面就得先通过旋转、翻转把要拧的那一面挪到最下面才行。 魔方一共6个面,所以输出的动作分解可以理解为: - 拧正面:顺时针90度、逆时针90度、180度
- 拧背面:顺时针90度、逆时针90度、180度
- 拧上面:顺时针90度、逆时针90度、180度
- 拧下面:顺时针90度、逆时针90度、180度
- 拧左面:顺时针90度、逆时针90度、180度
- 拧右面:顺时针90度、逆时针90度、180度
小结通过本文可以从整体上对EV3解魔方的流程、环节、动作有一定了解,这些对下一步的任务实现具有非常重要的作用,尤其是对输入-计算-输出的理解,能够帮助我们在程序设计时能更加清晰的找到关键问题。 |