好奇解魔方机器人使用说明乐高官方的解魔方机器人的程序部分是通过刷固件的方式实现,机器人如何复原的过程对于一般用户来说很难理解。本软件将解魔方的过程分为三个部分:复位计算,过程模拟,硬件操作,使用的主要技术有flash、MFC、C语言、EV3蓝牙控制。只要你精通其中的任何一个部分,都可以对其进行优化。对于一般用户来说,你仅需要给解魔方机器人定义几个基本的操作步骤,即可实现魔方的复原操作。如果你有兴趣,也可以通过技术说明,对其中任意一部份做修改,特别是魔方机器人的搭建部分最容易修改。当然如果你不是乐高玩家,只是想知道怎么把魔方复原,通过本软件,可以轻松让你成为魔方复原高手;如果你对魔方复原算法比较精通,你也可以使用你自己的算法,本软件为各种魔方复原算法提供了最简单的接口,当前使用的四种算法,都是由国外网友提供的,目前算法是以他们的名字命名的。 1、基本操作说明:Ø 系统运行环境要求: 处理器估计要求Core i3 及其以上,配置太低可能会在flash动画演示过程中出错,我的一台笔记处理器为:Intel, 酷睿2双核 P8600就出现这样的问题。 操作系统为 xp或win7以上。Flash player要求为flash player11 以上。 Ø Flash环境变量设置:用浏览器打开FlashClub.swf文件,点击鼠标右键->全局设置->高级选卡->受信任位置(找不到?拖动一下右侧的滚动条吧),将FlashClub.swf添加为受信任文件,便于主程序调用。 Ø 魔方颜色快速设置:魔方设置置色:勾选“置色”多选钮,在左边选择要设置的颜色,点击要设置颜色的色块即可;点击右边的“置色”按钮,你可以将魔方置无色或复位。 Ø 魔方复位:点击复位按钮,即可对魔方的当前状态进行复位计算,计算出来的步骤左边的列表中显示。 Ø 魔方手动旋转:勾选“旋转”多选钮,按下鼠标左键,滑过两个色块。 Ø 查看复位动画演示:点击左边的列表中的行,即可查看从上一步到当前步的动画演示。如果上一步魔方的姿态不和当前步姿态一致,则系统会自动作转换(如:上一步的上面为黄色,当前步的上面为橙色,即是姿态不一致,系统会自动对下一步的操作进行转换)。 Ø 复原过程演示:点击“一键复位”、“逐步复位”、“单步操作”三个按钮中的任意一个都可以。注意在打开蓝牙和不打开蓝牙的情况下,点击上面的三个按钮的效果是不一样的。当不打开蓝牙时,系统会默认为只是复原过程动画演示,此时“一键复位”、“逐步复位”两个按钮的操作效果是一样的;当打开蓝牙时,系统会默认为驱动机器人,此时“一键复位”按钮比“逐步复位”按钮多了一个颜色读取功能,并且系统将会依据操作步骤去驱动机器人中的程序,对于不能直接执行的操作步骤,系统会根据[CHILD_TRANS_STEP]字段中定义的转换方法进行操作转换。 Ø 查看魔方的另外三面:通过左下角的X或者Y轴的滑块即可旋转魔方的状态。 Ø 魔方显示颜色修改:通过配置文件FlashSet.xml,可以配置魔方的颜色和动画演示速度。在FlashSet.xml文件中,
<FaceColor title='0_YELLOW'> 16776960 </FaceColor>
表示的是第0个颜色的定义。'0_YELLOW'前面的“0”表示颜色编码,后面的字符串只是一个名称,这些是不可修改的;后面的数字16776960为RGB颜色的十进制值,16776960 = 0xFFFF00,是可以修改的,通过修改RGB值你可以定义不同的0_YELLOW,甚至将0_YELLOW的显示定义为红色都行,如:
<FaceColor title='2_ORANGE'> 0</FaceColor>
表示将颜色2_ORANGE的显示定义为黑色,它的代码为2。注意这里的颜色代码与EV3中颜色的代码标识不一致,在与乐高解魔方机器联调时要作颜色转换。MindStorms中,共有8个颜色代码,这里只定义了7个颜色代码,0-5代表在FlashSet.xml中定义的颜色, 6代表无颜色。
<TurnSpeed Angle='3'>20</TurnSpeed>
行设置动画演示速度,此行的意义表示每20毫秒旋转3度。相同设置,对于不同性能的电脑,可能看起来旋转速度不一样 Ø 魔方当前状态保存:如果你的魔方状态是手动输入的,则保存一个魔方的状态就显得比较重要,点击文件操作的保存就可以将当前魔方的状态保存到相应的文件中。 2、对解魔方机器人控制:2.1 翻转和旋转控制定义一个魔方共有6*9=54个色块,魔方的操作分为翻转和旋转。翻转是对所有的54个色块同时操作,不改变各色块的相对位置,一个复原状态的魔方,翻转后还是复原状态。旋转则是对部分色块的旋转操作,一次旋转只能改变21个色快的位置。 依据flash的立体坐标定义,魔方可以围绕X、Y、Z三个坐标分别旋转90°、180°、270°,旋转的锚点(旋转时不动的那个点)是魔方的正中心,将魔方沿着三个轴的翻转动作分别定义为Y1,Y2,Y3;Z1,Z2,Z3; X1,X2,X3,负数表示如下图1所示的反方向翻转。 图 1 魔方的上、下、左、右、前、后分别用UP=0, DOWN=1, LEFT=2, RIGHT=3, FRONT=4, BACK=5的首字母表示,并且用0-5分别对应于上、下、左、右、前、后六个面。魔方的每个面也可以旋转90°、180°、270°将六个面顺时针旋转的动作分别定义为U1, U2, U3; F1,F2, F3; R1, R2, R3, D1, D2, D3, B1, B2, B3, L1, L2, L3负数表示逆时针旋转。 系统对魔方机器人的控制主要是在配置文件SysConfig.ini中定义。 字段[BLUETOOTH_SET]主要是定义蓝牙对应的串口和通过蓝牙运行一个程序所用的最长时间,如果你定义的COM口没有对应到蓝牙连接口,则复原过程中可能会出错。在自动执行时,程序是通过定时器定时查询的,MAX_PROGREMA_TIME定义了最大查询次数,超过此次数会出错。IsTesting为调试定义,便于测试你的转换步骤是否正确,当它的值设置为1时,即使你打开了蓝牙也不会驱动机器人,要驱动机器人,此值必须设置为0。 [BLUETOOTH_SET] port=3 MAX_PROGREMA_TIME=1000 IsTesting=0 字段[ROCOVER_WAY]主要魔方解法定义,如果你想增加自己的算法,只需在下面增加即可,等号左边为你的算法程序的名字,系统在解魔方时会调用此算法。 [ROCOVER_WAY] JaapScherphuis=解法一 StefanPochmann=解法二 JoeLindstr=解法三 MikaelKlasson=解法四 字段[CHILD_TRANS_STEP]表示对机器人不能实现的操作的转换操作定义,如官方的魔方机器人只能进行D面的旋转(本人搭建的也是一样),对于其它面的旋转都要做转换。转换方法通过如下字段进行定义,前面有分号,表示此行为注释。 [CHILD_TRANS_STEP] ;上部翻转,先将上部翻转到底部,再对底部做变换 U1=X-2D1 U2=X-2D2 U3=X-2D-1 ;右面旋转,先将右面旋转到后面,再转到下面 R1=Y1X-1D1 R2=Y1X-1D2 R3=Y1X-1D-1 ;左面旋转,先将左面旋转到后面,再转到下面 L1=Y-1X-1D1 L2=Y-1X-1D2 L3=Y-1X-1D-1 ;前面旋转,先将前面旋转到后面,再转到下面 F1=Y2X-1D1 F2=Y2X-1D2 F3=Y2X-1D-1 ;后面旋转,直接将后面旋转到到下面 B1=X-1D1 B2=X-1D2 B3=X-1D-1 ;其它几个旋转定义 Y3=Y-1 D3=D-1 X1=Y2X-1 X2=X-1X-1 X3=X-1 X-2=X-1X-1 X-3=Y2X-1 除了转换定义,魔方机器人还必须至少能够实现一些基本的操作,该操作通过字段[USABLE_PRO]定义,由于在乐高的程序命名中不能有负号“-”,因此负号“-”号用下划线“_”代替 [USABLE_PRO] Y1=EV3_Y1 Y2=EV3_Y2 Y-1=EV3_Y-1 Z1=EV3_Z1 D1=EV3_D1 D2=EV3_D2 D-1=EV3_D-1 以下为各字段要对应的执行程序的定义。 [EV3_Y1] ProPathName=../prjs/Driver/TurnY1.rbf Sleep=50 [EV3_Y2] ProPathName=../prjs/Driver/TurnY2.rbf Sleep=50 [EV3_Y-1] ProPiathName=../prjs/Driver/TurnY_1.rbf Sleep=100 [EV3_X-1] ProPathName=../prjs/Driver/TurnX_1.rbf Sleep=50 [EV3_D1] ProPathName=../prjs/Driver/TurnD1.rbf Sleep=50 [EV3_D2] ProPathName=../prjs/Driver/TurnD2.rbf Sleep=50 [EV3_D-1] ProPathName=../prjs/Driver/TurnD_1.rbf Sleep=50 [ReadColorU] ProPathName=../prjs/Driver/Read.rbf Sleep=50 [ReadColorU_1] ProPathName=../prjs/Driver/Read_1.rbf Sleep=50 [InitColor] ProPathName=../prjs/Driver/InitColor.rbf Sleep=50 以第一行Y1=EV3_Y1为例,表示要实现Y1的旋转,即沿Y轴按照图1所示的方向旋转90度,则通过字段EV3_Y1实现。在后面的EV3_Y1字段中定义了机器人实现这个操作的程序的全路径。注意 “../prjs/”是固定的,不要问我这个为什么和EV3中的Project不对应,EV3的控制规则就是这么定义的,我也不知为什么;Driver是你保存的工程文件的名字,“TurnY1.rbf” 是工程文件中的可执行程序模块的名字,为什么是rbf结尾?通过EV3的 编程软件Mindstorms中内存浏览功能你就知道为什么了。后面的Sleep=50,表示执行此程序完成后休眠50毫秒,增加一个休眠时间是为了便于硬件操作和软件显示步骤一致。 通过上面的定义可以看出魔方机器人执行一个操作的过程是。先查看这个操作在[USABLE_PRO]中有没有定义,如果没有,则在[CHILD_TRANS_STEP]中找到该步骤的转换操作方法,转换后的最终步骤必须都在[USABLE_PRO]中能够找到定义,在找到定义之后,再依据定义找到可执行程序定义执行对应程序。 注意转换定义不能出现循环定义,如U1的转换操作为Z2D1,在[USABLE_PRO]中Z2没有定义,必须对Z2操作再做转换,再次转换的方法中不能再次包含U1,间接包含也不行,否则就出现循环定义,最好的定义方法是,第一次转换后的操作都能够在[USABLE_PRO]找到定义,如将U1定义为Z1Z1D1。 2.2颜色读取和设置要对个魔方进行复原的第一步是进行颜色的识别,为了便于将识别的颜色输入到对应的位置,首先对魔方的27个小立方体按照如下图2进行编号 图2 由于每个小立方块又有六个面,各个面又按照
UP=0, DOWN=1, LEFT=2, RIGHT=3, FRONT=4, BACK=5
的方法进行编号。魔方的六种颜色也是按照0-5进行编号的,这样通过三个数据就能够设置魔方的各个面的颜色, 如:通过字段(10_0_0)可以将上部中间面的颜色设置为黄色。 由于乐高的的颜色传感器的基本定义中可以识别7种颜色,0为不可识别,1-7分别对应不同的颜色,但是其中有两种黑色和棕色是一般魔方的色块没有的,当然你也可以自己修改魔方为这两种色块。不过,不进行颜色校正,颜色传感器识别颜色时受外界的影响还是很大,经常将黄色和白色混淆。我研究了官方的解魔方方法,发现其对颜色传感器重新定义了一个模块使之能够输出RGB三色,你去官方的网站下载ColorSensorRGB-v1.00.ev3b模块,就可以读取颜色传感器的RGB色,我的第一个版本也是通过蓝牙直接读取RGB色来区分颜色的,但是这样会导致软件和硬件的耦合度太高,因此为了降低软硬件的耦合度,我也使用了颜色传感器的三色模块。并且自己定义了一个颜色校正功能。在校正后不仅能够识别橙色,对其它颜色的识别也基本不会出现偏差。 在附件中对应的EV3程序中,对颜色传感器的识别原理如下: Ø 通过魔方的中心块颜色对魔方的六种颜色进行RGB值校正,校正后的6*3共18个值RGB输出到文件InitRGB中存储。依据机器人对魔方的翻转过程,我在程序中定义的颜色的校正顺序是黄、蓝、白、绿、橙、红。当然你可以依据自己的机器人定义你自己的颜色校正顺序。 Ø 在颜色识别时,读取一个色块的RGB值,通过与上面的6组颜色比较,与哪组颜色的差值最小,则就判断该色块与上面定义的中心色块的颜色一致,最后通过数组将该颜色转换为魔方中相应颜色对应的数字。 魔方机器人的颜色识别过程是先运行颜色识别程序,颜色识别程序将识别的颜色输出到文件中,如果在颜色识别的过程中出现差错,则可以先执行一次颜色校正,再通过蓝牙下装文件来读取识别的颜色。其中颜色识别文件的配置字段为[READ_COLOR] ;O开头的字段表示对魔方进行翻转操作,O开头的字段值必须是[USABLE_PRO] 中定义的Key,及 ‘=’左边的值如:X-1,如果直接定义到可执行模块,则电脑中的仿真过程不会旋转。
;R开头的字段表示读取颜色的程序,EV3运行此程序后将读出的颜色值输出到文件中
;G开头的字段表示从EV3中获得颜色文件 [READ_COLOR] ReadU = ReadColorU GetColorFile = GetColorFileU Oper = X-1 ReadU = ReadColorU_1 GetColorFile = GetColorFileU Oper = X-1 ReadU = ReadColorU GetColorFile = GetColorFileU Oper = X-1 ReadU = ReadColorU_1 GetColorFile = GetColorFileU Oper = Y1 Oper = X-1 ReadU = ReadColorU GetColorFile = GetColorFileU Oper = X-1 Oper = X-1 ReadU = ReadColorU_1 GetColorFile = GetColorFileU 在上面的定义中O(是Operator的第一个字母)开头的字段表示对魔方进行翻转操作,O开头的字段值(即”=”右侧的值)必须是[USABLE_PRO] 中定义的Key(即”=”左侧的值)值;并且该字段值必须只有一步操作如X-1,不能是X-1X-1,如果是两步操作则定义两个Oper即可。R开头的字段定义读取颜色的程序,EV3执行此程序后将读出的颜色值输出到文件color中,G开头的字段表示从EV3中读取颜色文件。 [ReadColorU]字段的定义为: [ReadColorU] ProPathName=../prjs/LP/Pm.rbf Sleep=40 第一行表示要运行的程序,Sleep表示程序运行完成后延时多少毫秒。 [GetColorFileU]表示读取[ReadColorU]中的执行程序的输出文件color,
;Cubies表示文件中包含了多少个方块的颜色,一个面是9个方块,
;ReadTimes表示读颜色文件的最大次数,超过此次数则出错。由于颜色文件可能一次读不完整,所以需要多次读取,但是也不能无限次读取。 [GetColorFileU] Cubies=9 ReadTimes=300 OutPutFile=../prjs/Driver/color.rtf 系统读取魔方的颜色的过程是:依次读取[ReadColorU]字段中定义的操作,当操作为读颜色程序时,则运行读颜色的程序,此程序必须要将读取的颜色输出到文件color中,当此程序运行完成后,一般要跟一个读取输出文件的定义,将文件中定义的颜色赋值到魔方上,读完一面的颜色后,一般要对魔方进行翻转,此时就可以定义一个翻转动作,当读到翻转动作时,仿真魔方也会根据翻转定义进行翻转。以下为颜色文件中保存颜色的格式。 10_0_0 1_0_0 0_0_0 9_0_0 18_0_0 19_0_0 20_0_0 11_0_0 2_0_0 上面的颜色表示将魔方的上面的9个色块全部设置为黄色。每一行代表一个色块的颜色,各行的先后顺序调换,不影响结果,因为每行的第一数字就指定了魔方中的27个小立方体中的一个,第二个数字定义了该小立方体的哪个面,第三个数字定义了该面的颜色,通过该方式可以定义27*6=164个面的颜色,但是实际有用的只有54个面,其它的面是观察不到的面。注意输出颜色文件中包含的色块的颜色的定义个数一定要与[GetColorFileU]中Cubies的值一致,否则程序会认为颜色读取没有完成,会一直读颜色值直到ReadTimes=300次,然后报错。 2.3调试方法要想软件与硬件协调工作就必须有调试,调试时可能需要分步测试各种程序。通过修改配置文件[READ_COLOR]和点击“颜色识别”按钮就能实现分步调试。“颜色识别”按钮的作用就是逐步执行[READ_COLOR]中定义的操作直到执行完成,或者出错。当你只配置一步操作时,它就能实现单步操作。系统与EV3协调控制主要是通过两个功能进行的,一个是执行程序,另一个是颜色文件下装。当然通过自定义的执行程序,你可以实现任何动作。 3魔方复原算法接口复原过程中,系统将魔方的初始状态参数输出到OutState.txt文件中,魔方算法程序通过接收文件中的参数,通过复原计算后输出复原方法。 测试魔方复原算法的方法是通过命令行运行四种复原方法中的一种,所用的参数就是OutState.txt文件中的内容,最后输出复原算法。 如 > JaapScherphuis LB RF UL DB LD FD RD URUF LF UB BR URB ULF BLU RFD LDF BDL RDB FRU 本软件使用的四种复原方法的作者,让我认识一下他们的大名吧! | 算法名称 | 作者 | 大小 | 速度 | | | JaapScherphuis | | 2059 | 154ms | | | StefanPochmann | | 1311 | 197ms | | | JoeLindstr | | 2054 | 1600ms | | | MikaelKlasson | | 2190 | 10ms | |
以上为主要的使用方法,有点长,但是我认为应该说清楚了吧。关于魔方模拟的flash接口,EV3程序的驱动方法,魔方复原算法,我的解魔方机器人的搭建方法,蓝牙连接方法(这个本来很简单的,但是不知乐高蓝牙是怎么搞的,经常连接不上,有时要连接七八次才能够连接上,有时还会死机,如果你使用的是一台很古董的电脑,好像比较容易连接,所以值得一说),将会陆续在6690974的QQ空间上贴出。
|