解魔方
1
机器人解魔方的例子在网上已经有过很多,对于LEGOMINDSTORMS来说,从NXT开始就已经有了,EV推出后许多玩家更是将解魔方机器人的搭建当成玩EV的代表作品。
设计思路
初次接触解魔方机器人可能会觉得无从下手,因此我们需要进行任务分解,将复杂的大任务逐步分解为简单的小任务。这种“解决问题”的系统都理解为三部分组成:输入、计算、输出,按照这种思路整理如下:
INPUTSYSTEMOUTPUTScan魔方扫描
→
Compute算法计算
→
Solve转动解决
动作分解
在分解动作之前,先来看看机器人所拥有的“能力”。EV连接的主要设备包括:颜色传感器1个、大型马达个、中型马达1个。各个设备的作用:
颜色传感器:扫描魔方
大型马达(底座):转动底座
大型马达(手臂):转动手臂
中型马达:转动扫描头
而通过这些设备的组合,可以实现机器人所需要的基本动作,比如:拧魔方、翻转魔方、扫描每个色块。
接下来按照之前讨论的设计思路,对系统的三个部分分别进行动作分解。
输入-魔方扫描
先来想象一下扫描魔方的过程:扫描第1个面、翻转、扫描第个面、翻转……扫描第6个面。
再想象扫描单面的过程:扫描中心块1、旋转45度、扫描角块、宣传45度、扫描边块……扫描边块9。
而关于翻转魔方,由于EV机器人只能从一个方向翻转魔方,当翻转到第4个面后,需要将魔方旋转90度后才能继续将第5、第6个面翻转上来。
如果理解了扫描魔方的动作过程,那么每个马达所需要做的动作也就容易得出:
大型马达(底座):顺时针转90度、逆时针转90度、顺时针转45度、逆时针转45度
大型马达(手臂):抬起、扣住、后拉
中型马达:定位中心块、定位角块、定位边块
计算-算法计算
通常算法是一些理论的实现,而工程设计是要将算法与实际相结合。就拿解魔方为例,解魔方的算法早已经得出,而计算机程序设计也已经实现,但EV机器人若想应用这些算法和程序,就要做相应的兼容接口,为算法和机器人充当翻译的角色。
实现解魔方算法的程序往往已经有特定的输入与输出,因此EV要做的第一件事就是要将扫描到的结果转化为与算法相同的表示方式;而计算之后还要将算法的输出转化为EV能够识别的机器人动作。
不难想象,在这一步所需的动作分解:
魔方表示方法的转化:扫描初始状态、标准化、符合算法的表示方法
算法实现:利用已有的解魔方程序
算法嵌入EV程序
输出-转动解决
最后就是将已计算出的解魔方步骤转化为机器人动作,EV的动作无法像人一样十指齐发多维度拧魔方,只能通过两个大型马达的配合每次拧最下面的一层,如果需要拧其他面就得先通过旋转、翻转把要拧的那一面挪到最下面才行。
魔方一共6个面,所以输出的动作分解可以理解为:
拧正面:顺时针90度、逆时针90度、度
拧背面:顺时针90度、逆时针90度、度
拧上面:顺时针90度、逆时针90度、度
拧下面:顺时针90度、逆时针90度、度
拧左面:顺时针90度、逆时针90度、度
拧右面:顺时针90度、逆时针90度、度
小结
通过本文可以从整体上对EV解魔方的流程、环节、动作有一定了解,这些对下一步的任务实现具有非常重要的作用,尤其是对输入-计算-输出的理解,能够帮助我们在程序设计时能更加清晰的找到关键问题。
要想让机器人完成解魔方的各种动作,我们先来分解每个马达的最基本的动作,然后通过这些基本的动作组合实现机器人更复杂的动作指令。根据马达的不同位置和作用,我们将EVMindCubr的三个马达命名为:底座马达、手臂马达和探头马达。
底座马达基本动作
底座马达负责转动底座,自身可以完成魔方的旋转、配合手臂可以完成拧魔方最底层、配合探头可以完成魔方各个色块的颜色扫描。因此,底座马达的基本动作可以总结为:
顺时针旋转90度
逆时针旋转90度
顺时针旋转度(也可以采用逆时针,这里使用顺时针)
顺时针旋转45度(也可以采用逆时针,区别在于色块扫描的顺序,这里使用顺时针)
第一个问题:如何让底座转90度?
仔细观察搭建图不难发现,动力系统是通过安装在大型马达上的一个小齿轮,带动底座下面的一个大齿轮完成的,并不很复杂。两个齿轮的传动比为1:,即小齿轮转动圈相当于大齿轮转动1圈。因此如果要底座转动90度,马达应转动70度,LEGOEV的大型马达转1圈相应的走60步、即1步等于1度。
第二个问题:如何表示马达的运行位置?
EV的马达属于伺服马达,这种马达的优势就是可以通过转动的步数精确计算马达的位置(position),无论马达处在停止还是运行状态都可以读取当前位置。对于位置可以这样理解:设想马达刚连接到EV端口上,此时的位置为0;当顺时针转动一圈之后,此时的位置是60;再逆时针转一圈,位置又回到0;如果继续逆时针转动,位置就会变为相应的负数。如果持续的转动,位置的值也会持续的增加(或减少)。
对于马达运行位置的表示,EV提供了两种方式:绝对位置、相对位置:
绝对位置:采用这种表示方式,无论马达此时的位置值是多少,都会运行到设置的位置值。比如:此时马达的位置值是60,设置运行到绝对位置90,马达不会顺时针转动90步,而是逆时针转动70步,之后位置值变为90。
相对位置:采用这种表示方式,运行的位置只是相对马达当前位置的位移。比如:此时马达的位置值是60,设置运行到绝对位置90,马达将会顺时针转动90步,之后位置值变为。
对于底座马达,我们需要采用相对位置的运行方式。
第三个问题:马达每次停止都有一些位移误差?
显然,这种位移误差对于需要精准控制底座角度的需求是无法容忍的。要想解决这个问题,需要先了解EV马达的停止模式。EV马达有三种停止模式:coast、brake、hold:
coast模式:马达得到停止指令时,停止供电,随惯性再转会停止。
brake模式:马达得到停止指令时,停止供电,立刻停止转动,制动距离较coast模式要短得多。
hold模式:马达得到停止指令时,马达并不会停止供电,而是将马达稳稳的保持在停止时的位置,此时如果你用外力强制改变他的位置,马达会强有力的跟你较劲,还是会转回它的位置。
综上,使用hold模式能够更精准的控制马达所转动的角度,也不会使底座发生“变形”。
最后:马达的速度设置
EV马达的速度有两种表达方式:速度值、占空比:
速度值:马达的速度值单位为:步/秒,由于EV马达一圈正好60步,因此等同于:角度/秒。
占空比:使用占空比表达马达的速度,取值范围-%到%,%为顺时针最大速度。
这两种方式对于底座马达都可以,通常如果对速度的精度需求不那么大的情况下,可以采用占空比的方式。
如果理解了底座马达的基本动作,就会很好整理出手臂马达和探头马达的基本动作。唯一区别是,手臂马达和探头马达由于动作比较固定,采用的位置控制方式均为绝对位置。
另外还有一个机器人的输入设备,颜色传感器。颜色传感器的主要作用就是扫描魔方色块的颜色,在传感器工作模式上与LEGO官方定义的三种模式(环境光、反射光、颜色)也略有不同。
手臂马达
机器人的手臂动作主要包括:
完全抬起,这样可以进行扫描和方向旋转
按住魔方,这样可以配合底座进行拧魔方
拉推魔方,这样可以将魔方翻面,而这个动作又可以分为拉和推
对应于马达的基本动作为:
抬起
按住
拉回(推与按住相同)
按照机器人的搭建结构,完成这4种基本动作是通过大型马达所转动的位置实现的。我们设定手臂抬起是马达的初始化状态,即此时位置为0,之后通过试验可以很容易的得到每种动作所对应的马达的位置。
探头马达
探头马达用来控制颜色传感器进行定位扫描,按照扫描位置的不同可以分为:中心块、边块、角块,再加上完全收起的位置,因此探头马达的基本动作有4种:
收起
扫描中心块
扫描边块
扫描角块
按照搭建结构,完成以上动作是通过中型马达所转动的位置实现。我们设定探头收起是马达的初始化状态,即此时位置为0,之后通过试验可以容易得到每种动作所对应的马达位置。
颜色传感器
颜色传感器在LEGO官方给出的模式有三种:环境光模式、反射光模式和彩色模式。其中彩色模式可以识别出7种不同的颜色,可惜这些颜色对于魔方的色块来说有些不适用,好在传感器实际的能力是可以识别出颜色的R、G、B值,因此采用RGB模式直接读取R、G、B值的方式来进行魔方色块的识别。
拥有了基本动作这些工具之后,回想最开始的方案设计,我们现在该着手解决系统中的“输入”了。输入即EV对魔方进行扫描,通过计算机语言数字化的对魔方进行表示。仍然本着任务分解的思路,我们将扫描魔方这个任务继续分解为更小的任务:扫描色块、扫描单面、扫描六面。
.1扫描色块
上一章已经介绍,扫描魔方时色彩传感器为RGB模式,因此在扫描后会得到R、G、B值,每个色块的颜色就需要采用包含个值的数组来存储。例如:color[0]=R、color[1]=G、color[]=B。
.扫描单面
EV每次扫描最上面的面,我们按照先中间再四周的顺序进行扫描,单面一共9个色块,扫描流程为:
扫描中间块
顺时针转45度
扫描角块
顺时针转45度
扫描边块
顺时针转45度
扫描角块
顺时针转45度
扫描边块
顺时针转45度
扫描角块
顺时针转45度
扫描边块
顺时针转45度
扫描角块
顺时针转45度
扫描边块
探头收回
从机器人的正面俯视,容易知道每个色块的扫描顺序。
.扫描六面
扫描六面基本思想就是扫描完一面后,将魔方翻转,再扫描另一面。需要注意的是:面向机器人的魔方正面和背面在扫描的时候,需要先进行底座旋转,并且此时扫描后得到的色块顺序相对于其他面也是不一样的。尤其是色块顺序,在之后对魔方进行建模时非常重要,其实也并不难,只是需要足够的耐心来认真确认。扫描流程:
扫描单面
翻动魔方
扫描单面
翻动魔方
扫描单面
翻动魔方
扫描单面
底座逆时针转90度
翻动魔方
扫描单面
翻动魔方
翻动魔方
扫描单面
底座顺时针转90度
翻动魔方
底座顺时针转90度
定义从机器人的正面俯视魔方的面为第1个面,得到魔方各个面及色块的扫描顺序:
4
我们已经得到了6×9个RGB值,但这些都代表什么颜色?我们需要的是不同色块对应到6种不同的颜色,因此必须对这54个RGB值进行划分,使他们归到自己的颜色分类中。关于颜色分类其实属于数字图像处理学中的一个重要研究领域,在此仅对比较通用的一种方法进行介绍。
4.1色彩模型转换
色彩模型是描述使用一组值(通常使用个、4个值或者颜色成分)表示颜色方法的抽象数学模型。例如三原色光模式(RGB)和印刷四分色模式(CMYK)都是色彩模型。EV颜色传感器获得的就是RGB模型,可以表示为三维直角坐标颜色系统的一个单位正方体。
在大多数的彩色图形显示设备一般都是使用红、绿、蓝三原色,我们的真实感图形学中的主要的颜色模型也是RGB模型,但是红、绿、蓝颜色模型用起来不太方便,它与直观的颜色概念如色调、饱和度和亮度等没有直接的联系。比如,我们很难从RGB的取值上区分这个颜色属于哪个色域,因此根据不同应用,还有HSV、HSI、CHL、LAB、CMY等其他色彩模型。由于颜色本身并没有发生变化,只是各个色彩模型表示颜色的方法不同,色彩模型之间可以通过固定的公式进行相互转换。
HSV、HSI、LAB都可以很好的将色相以一定规律排列出来。在本项目中,使用HSV模型作为颜色识别的色彩模型。关于HSV模型的详细描述,可以参见治疗白癜风哪的医院好些啊北京治疗白癜风哪里比较好