找回密码
 马上注册

QQ登录

只需一步,快速开始

查看: 20561|回复: 20

好奇解魔方机器人

  [复制链接]
发表于 2013-6-6 21:23:20 | 显示全部楼层 |阅读模式
本帖最后由 OnTheWay 于 2013-6-6 21:22 编辑

好奇解魔方机器人

1、技术背景

看了网上的各种乐高的解魔方机器人,参照着做了,但是结果总是不尽如意,分析起来存在如下问题:
1.            在进行魔方旋转时,没有通过软件或者硬件手段对旋转的角度进行校正。如果采用分层复原算法,对于一般的魔方,大概有100多步,再转换成魔方机器人能够操作的步骤,大概有300多步,要完成300多步的准确操作,在没有人工干预的情况下,对于NXT控制的电机来说基本是不可能的。至于其它求解魔方的更优算法,目前网上我还没有找到公开的资料,如果哪位大神,能够有更好的算法,希望不吝赐教。
2.            在复原魔方时只是单纯的通过蓝牙驱动电机,关于蓝牙驱动电机的每个命令,我都进行了测试,效果都不太理想,很难将电机控制到比较精确的位置。特别是在同时驱动两个电机协调运行的时候,我采用过定时器和和多线程的方式。但是都没有达到 MINDSTORMS控制电机的效果。这样的结果只会导致软件对硬件的依赖性强,系统的可重复性差。
3.            在进行复原操作时时没有图形模拟,对于300多步的操作,如果没有仿真模拟,用户等了20多分钟,只是看着机器人对魔方翻来覆去的操作,感觉心里还真没有底,因为中间如果错了一步,则最终结果就完全不一样。
针对上面的问题,我们对David Gilday搭建MindCuber的解魔法的机器人进行了改进,并且开发了相应的软件,好奇解魔法机器人解决了如下问题:
1.            在进行魔方的旋转操作时,通过机械的手段进行了位置矫正,使得魔方总是能够精确地停留在0°、90°、180°、270°的位置。
2.            操作魔方时,采用了两种方式,一种方式是通过蓝牙直接驱动,一种是通过驱动NXT中的程序进行间接驱动。这两种方式用户可通过配置文件进行配置。建议的驱动方式是:驱动颜色传感器时通过蓝牙直接驱动,而驱动电机时则通过驱动NXT中的程序进行间接驱动。
在复原的过程中,进行图形同步仿真,操作过程中的每一步,魔方应该处于什么状态,通过图形的方式向用户显示出来。这样用户就可以确定当前的操作是否正确。

2、硬件搭建

关于机器人的搭建,大家可以在网上搜索到David Gilday的搭建图,好奇魔方机器人的搭建是在David Gilday的MindCuber搭建的基础上改进的。好奇魔方机器人用到了几个乐高玩具版的零件,主要用于抓住魔方。当然我想你也可以用手头其它的零件替代。特殊零件如下图1:

特殊零件

特殊零件

图1 特殊零件
下图2是好奇魔方机器人的整体图,装魔方的小盒子我依据所使用的魔方做了一点改动,增加了8个套管,注意下图中的那个黄色和黑色的套管是活动的哦。大家搭建时可以参考下图中的魔方小盒子的位置矫正功能,不用拘泥于下图的搭建,我做的第二版在下图的基础上有改动,只是更稳固,当然也用了更多的零件。为了便于颜色的识别,在选用魔方时,最好选用黑色的魔方,应为白色的魔方会对黄色的识别造成干扰。一个解魔方的机器人套装应该要4千大洋左右吧,所以魔方我建议你最好也买个正版的品牌货,如果就拿个10元钱左右的地摊货就不要跟我说魔方总是旋转不到位,并且可能会很卡,如果一不小心把你电机烧坏了就得不偿失了。在调试时,最好上一点魔方油。魔方油?没有听说过?其实我也没有听说过,并在我所在的市区的各个商店还没有卖,怎么办,用食用油或者机油替代,好像不太卫生,想了好久,胡子都快跟眉毛一样长还没有结果,在打理胡子的时候,看到镜子旁边有一瓶护手霜,灵光一闪,对了,就是是它了!用上去感觉效果还不错。
解魔方机器人.png


图2 好奇解魔法机器人整体图
对于魔法机器的其它部分的搭建可以参考下图3: 相信大家可以网上找得到更详细的搭建步骤。
MindCuber.png

图3 MindCuber解魔法机器人

3、软件设计

好奇魔方机器人的的软件不仅仅适用于上图的搭建,用户通过修改配置文件,可以适用于任何单个NXT驱动的魔方机器人。软件的整体界面如下图4:

软件界面.png

图4 好奇解魔法机器人软件
3.1 软件设计原理
好奇软件在复原一个魔方时,首先需要读入魔方的初始状态。当然你也可通过手动输入魔方的初始状态,在读入的过程中,在界面中通过平面和立体两种方式显示出来。通过平面图和立体图对比,你应该很容易分清魔方的前后左右了。在手动输入时,可以通过鼠标右键或者工具条进行输入,两种输入方式只能同时选用一种方式。选用工具条手动输入时,先选定一种颜色,然后直接点击平面图中的色块,就可以将该色块设置为选定的颜色;选用鼠标右键输入时,此时要确保工具条中所有颜色都处于未选定状态,在魔方选定平面图中选定相应的色块,单击鼠标右键,即可弹出右键工具条,选择你要设置的颜色,即可将选定的色块设置为弹出工具条中选定的颜色。由于魔方并不是任意的组装方式都有复原解,本软件并没有对你设置的颜色进行详细校验,注意不要输入错误的状态,否则可能找不到解。输入完成后注意保存初始状态,因为在实际操作中,我发现无论是通过颜色传感器读入还是通过手动输入魔方的初始状态,都是一个痛苦的等待过程。看来下次版本得增加一个通过摄像头输入的过程。
在读入初始状态后,系统通过层先发求解,对于一个一般的魔方,大概需要100多步。据说20步能够复原一个任意三阶魔方,能够写出这个算法的人,应该是神一样的存在了!听说有个美国的学生写了一个28步求解任意三阶魔方,那应该也是大神。我认为写出少于50步求解一个任意三阶魔方的算法,都应该是数学家的干活了。我曾经用递归的方法写了一个求解算法,但是当递归到第三层时感觉有点慢,递归到第6层时,我吃了个午餐,睡了个午觉,还去洗个冷水澡时间还绰绰有余。递归10层时,我最终选择直接将电脑关机……,如果要想等它递归完20层找到最优解法,估计上帝都等不到了。我分析了一下我的算法,魔方旋转的次数=18的n次方(n等于递归的层数)。看来这个工作还真不是一般人能够干得了的,没办法最后只得选用层先发求解,如果哪位大侠有更好的解法,希望不吝赐教。
系统在求解的过程中,将旋转的方式和魔方的所处的状态保存在左边的列表中,用户单击其中的任意一行即可了解到魔方当时处于什么状态。如果你有一个魔方不知道怎么复原,可以通过输入魔方的初始状态,让它给你求解,虽然方法有点笨,但是至少能够达到目的。
在找到魔方的复原解法以后,还不能直接给魔方机器人操作,因为魔方机器人能够操作的只能在水平或者垂直方向对魔法机器人进行翻转,或者对魔法的底部进行旋转,在进行垂直方向的旋转时,一次还只能旋转动90度,所以还必须进行操作转换。
在操作转换后,再可以让机器人操作了,但是在操作之前,你得先打开蓝牙,并且你可能需要先对魔法机器人进行调试。调试时你可以使用调试对话对水平转的3个角度、垂直旋转1个角度(其它两个角度无非就是多转几次),和底部旋转的3个角度,总共7种操作进行调试。当然在读颜色时,你可以定义更多的操作。在调试完成之后你就可以对你的魔方机器人进行复原了,注意魔方的初始状态一定要放对哦,我的方式是将上图2中两个橙色零件中间的连杆贴着的那一面作为正面,该面和模拟图中的正面对应,你也可以选择其它的面作为正面,注意正面的选取是和翻转方式密切相关的,正面的选取不同,则翻转的方式也不相同,在调试时,你要确保魔方的翻转后的状态和模拟的翻转状态保持一致!
在调试完成之后,即可开始试运行了,运行时你可以选择单步执行或者自动执行的方式,注意在暂停后才可以单步执行的。

3.2 配置文件介绍
软件的配置文件主要放在SysConfig.ini文件中。在该文件中定义了颜色传感器的操作,颜色的读取,颜色的区分、马达的操作,程序的操作、魔方的翻转等等。
Motor表示驱动马达,如Motor0表示驱动A口马达,Motor1表示驱动B口马达,Motor2表示驱动C口马达,Motor12表示驱动BC口马达,前面我说了,通过蓝牙直接驱动马达的效果不太理想,建议通过运行NXT中的程序进行间接驱动。
Sleep表示暂停多少毫秒,因为你的电脑的运行速度比机器人的操作速度快很多很多,因此电脑需要暂停等待一定的时间等待机器人操作完成,如果机器人操作还没有完成,就进行下一个驱动,可能导致下面的操作无反应。比如当一个程序运行还没有运行完成时,就驱动下一个程序,则NXT可能直接跳过下一个程序的驱动,还有就是要确保NXT的电池电量是足够的,如果电池报警一次电量不足,也会对驱动程序的操作无响应。
Progr=***  表示运行NXT中的***程序,建议对于马达的操作都写成*.Rbt程序下装到NXT中,然后通过蓝牙运行该程序来驱动马达。
COMPort表示电脑上蓝牙连接对应的串口。
ColorPort 表示颜色传感器连接到NXT的哪一个端口
串口的链接
[PORT_SET]
COMPort =2
ColorPort=1
魔方的6个面以及旋转
魔方的6个面的定义
F表示前,初始时为蓝色, U表示上,初始为黄色,
B表示后,初始时为绿色   D表示下,初始为白色
L表示左,初始时为橙色   R表示右,初始为红色
F1表示将前面旋转90度,F2表示将前面旋转180,F3表示将前面旋转270度,其它依次类推
颜色的读取区分定义
通过颜色传感器分布发出红、绿、蓝三种颜色来判断读取的是哪一种颜色。由于要进行读取值获取,因此颜色传感器是通过蓝牙进行直接驱动。
控制颜色传感器发出哪种光的颜色的定义为:
LIGHT_COLOR=0表示颜色传感器发出红光,LIGHT_COLOR=1表示颜色传感器发出绿光,LIGHT_COLOR=2表示颜色传感器发出蓝光  
六种颜色的定义为:{blue=1,red=2,yellow=3,green=4,white=5,orange=6,black=7}Colors;//7种颜色分别用1~7表示
在软件调试对话框中,有颜色值的比较列表,在打开蓝牙串口之后,将颜色传感器对准魔方中的色块,可以点击最左边的颜色列表中相应的颜色,即可读取该色块的红、绿、蓝值,如图5。

调试对话框

调试对话框

图5 硬件调试对话框
   系统后通过三步来区分读到的魔方色块是哪种颜色,每种光够区分出两种颜色。通过蓝光,可以将白色和蓝色其它颜色中挑选出来,再通过红光分辨是白色还是黄色,用绿光在如下的四种颜色中区分出黄、绿两种颜色,然后用红光区分黄、绿;余下的红、橙用绿光区分。
第一步区分:通过蓝光将蓝色和白色从其他颜色中区分开来, COLOR_MIN为发出蓝光时,蓝色和绿色的中间值。再用红光将蓝白区分开来。大的为白色,小的为蓝色。其中COLOR_MID为发出红光时白色和蓝色的中间值
[DISTINGUISH_STEP1]
LIGHT_COLOR1=2
COLOR_MIN=289
LIGHT_COLOR2=0
COLOR_MID=391   
LAGER_COLOR=5   
SMALLER_COLOR=1
第二步区分:用绿光在如下的四种颜色中区分出黄、绿两种颜色,其中COLOR_MIN为发出绿光时,绿色和橙色的中间值;然后用红光区分黄色和绿色,其中COLOR_MID为为发出红光时,黄色和绿色中间值。
[DISTINGUISH_STEP2]
LIGHT_COLOR1=1
COLOR_MIN=359
LIGHT_COLOR2=0
COLOR_MID=354
LAGER_COLOR=3
SMALLER_COLOR=4
第三步区分:用绿光区分红橙,其中COLOR_MID为发出绿光时,红色和橙色中间值。
[DISTINGUISH_STEP3]
LIGHT_COLOR1=1
COLOR_MID=282
LAGER_COLOR=6
SMALLER_COLOR=2
在读取了六种颜色之后,如果点击“自动配置”,则会根据上面的颜色分辨方式配置颜色识别文件。
机器人操作调试设置
和调试菜单对话框中的下拉菜单对应,左边的和相应的操作定义section对应。如HORIZONTAL1对应section [HORIZONTAL1]的操作。水平转90度未下拉菜单中的下拉名字。
[MOTOR_SECTION]
HORIZONTAL1=水平转90
HORIZONTAL2=水平转180
HORIZONTAL3=水平转270
VERTICAL1=垂直转90
VERTICAL2=垂直转180
VERTICAL3=垂直转270
CATCH1=底部转90
CATCH2=底部转180
CATCH3=底部转270
ReadColor_U=上面颜色读取
;用于对魔方进行底部转90度时的前后操作
CATCH_CUBE = 抓住魔方
RELEASE_CUBE = 释放魔方
魔方的姿态调试设置
将前面调整到底部
[F_D]
HORIZONTAL=3
VERTICAL=1
将魔方的U的位置调整到D的位置
[U_D]
VERTICAL=2
将魔方的B的位置调整到D的位置
[B_D]
HORIZONTAL=1
VERTICAL=1
将魔方的L的位置调整到D的位置
[L_D]
HORIZONTAL=2
VERTICAL=1
将魔方的R的位置调整到D的位置
[R_D]
VERTICAL=1
将魔方的D的位置调整到D的位置 不用操作
[D_D]
读取魔方的颜色定义
读取魔方的颜色,oper表示读魔方之后要对魔方如何翻转,注意此时的翻转不仅仅是魔方实体的翻转,也包含了模拟魔方的翻转,因此不能NXT中的程序代替,NULL表示不用翻转,每次读取9个色块的颜色,由于颜色传感器只能读取上面的颜色,因此读完之后,需要对魔方进行翻转才能读取下一个面的颜色。
[READ_COLOR]
ReadU = ReadColor_U
Oper = VERTICAL1
ReadU = ReadColor_U
Oper = VERTICAL1
ReadU = ReadColor_U
Oper = VERTICAL1
ReadU = ReadColor_U
Oper = HORIZONTAL3
Oper = VERTICAL1
ReadU = ReadColor_U
Oper = VERTICAL2
ReadU = ReadColor_U
读取魔方上面的颜色定义
Motor表示对电机进行操作,在此也可以配置成程序操作。Read = 22表示第一次先读取中间的色块,然后颜色传感器后退一点,读取32的颜色,魔方一面的9个颜色定义用[1-3][1-3]的一个二维数组定义,如图6。注意,读取的颜色具体放在那个块中,也是同你定义的魔方的正面相关的。如图
[ReadColor_U]
Progr=ForLight
Sleep=1500
Read=22
Progr=Back22
Sleep=1500
Read=12
Progr=Turn12
Sleep=1000
Read=13
Progr=Turn13
Sleep=1000
Read=23
Progr=Turn12                  
Sleep=1000
Read=33
Progr=Turn13
Sleep=1000
Read=32
Progr=Turn12
Sleep=1000
Read=31
Progr=Turn13
Sleep=1000
Read=21
Progr=Turn12
Sleep=1000
Read=11
Progr=BackLight
Sleep=2000
;注意在程序的最后一定要加一个延时,否则在该模块被调用时,可能导致后面的程序模块无响应
魔方.png

图6 魔方编号

魔方水平面上旋转操作
;将魔方在水平面以上面为基准逆时针旋转90°
[HORIZONTAL1]
Progr=H270
Sleep=2500
;将魔方在水平面以上面为基准逆时针旋转180°
[HORIZONTAL2]
Progr=H180
Sleep=5000
;将魔方在水平面以上面为基准逆时针旋转270°
[HORIZONTAL3]
Progr=H90
Sleep=2500
抓住释放魔方的操作
;抓住魔方的动作
[CATCH_CUBE]
Power=70
Motor1=-10
SLEEP=500
;释放魔法的动作
[RELEASE_CUBE]
Power=75
SLEEP=100
Motor0=55
;将魔方中上部不动,从上看,底部顺时针转90度
魔方底部旋转操作
[CATCH1]
Progr=CH90
Sleep=3000
;将魔方中上部不动,从上看,底部顺时针转180度
[CATCH2]
Progr=CH180
Sleep=6000
;将魔方中上部不动,从上看,底部顺时针转270度
[CATCH3]
Progr=CH270
Sleep=3000
魔方垂直方向的旋转操作
;将魔方在垂直面以右面为基准顺时针旋转90°
[VERTICAL1]
Progr=V90
Sleep=2500
;将魔方在垂直面以右面为基准顺时针旋转180°
[VERTICAL2]
Progr=V90
Sleep=2500
Progr=V90
Sleep=2500
;将魔方在垂直面以右面为基准顺时针旋转270°
[VERTICAL3]
Progr=V90
Sleep=2500
Progr=V90
Sleep=2500
Progr=V90
Sleep=2500
魔方的状态保存
;保存魔方的状态,每个面的颜色记录为一个9位数,按照图6中的编号[1][1]、[1][2]、[1][3]、[2][1]、[2][2]、[2][3]、[3][1]、[3][2]、[3][3]的顺序存放,同图4中的左边的列表中存储的数字一致。
[SAVE_CUBE]
UP=333333333
DOWN=555555555
FRONT=222111666
BACK=666444222
LEFT=111666444
RIGHT=444222111

HaoQi.rar

565.46 KB, 下载次数: 675

评分

参与人数 1乐币 +20 人气 +2 收起 理由
iRobot + 20 + 2 很好!

查看全部评分

如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
发表于 2013-6-6 21:58:35 | 显示全部楼层
谢谢!  学习中!
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2013-6-6 22:00:03 | 显示全部楼层
好文!不过既然已经在用上位机了,干脆做得彻底一点,来个解5价魔方吧,计算和动作指令全由上位机来完成得了!
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

 楼主| 发表于 2013-6-6 22:13:23 | 显示全部楼层
对于一个三阶的魔方,常规的状态,转换成魔方机器人能够操作的步骤都要300多步,如果没有一个比较好的算法,五阶魔方不知要多少步呢,估计到时候机器人运行的散架了还转不出来。
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2013-6-7 08:17:15 | 显示全部楼层
这个 是楼主自己写的吗?
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

 楼主| 发表于 2013-6-7 08:37:10 | 显示全部楼层
你如果在网上能找到比这个更早的贴子,就不是我写的,如果找不到,那就应该是我写了!
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

 楼主| 发表于 2013-6-7 08:41:24 | 显示全部楼层
更多关于好奇魔方机器人的搭建图,可以参考我的相册中的图片,由于时间有限,没空做出详细的搭建图,望大家见谅。关于搭建的问题,我可以在帖子中回复
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2013-6-7 08:44:36 | 显示全部楼层
OnTheWay 发表于 2013-6-7 08:37
你如果在网上能找到比这个更早的贴子,就不是我写的,如果找不到,那就应该是我写了!

那我就认为是你写的啦。

很厉害啊!好神奇!佩服!赞一个!

期待你的更多作品
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

 楼主| 发表于 2013-6-7 09:10:22 | 显示全部楼层
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2013-6-7 17:59:42 | 显示全部楼层
好厉害啊,学习了!准备暑假参考这个试试看(学生平时压力大啊)!
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2013-6-7 21:25:15 | 显示全部楼层
强悍啊,膜拜ing。
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2013-6-8 08:16:35 | 显示全部楼层
强人啦,我一直都很崇拜做解魔方机器人的原创者,我们是照着做都做不会
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

 楼主| 发表于 2013-6-8 12:18:49 | 显示全部楼层
这个魔方机器人比较慢,但是可靠性是没有问题的!昨天录了读54个色块的视频,一次性成功,但是耗时花了11分钟,想录一个复原的视频,录制的过程中魔方倒是没有出错,但是手机没有空间了,最后没有成功!花了我40多分钟,看来做一个视频还真不容易!
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2013-7-2 09:38:58 | 显示全部楼层
这个真心慢啊!不过楼主能让ARM7能够识别和计算已经算是高手了,我试过自己写的代码,运行识别和计算需要10分钟,而且还往往会发生未知错误,更加不要说转的时间了,........楼主使用的这种结构,也是效率不高的原因这一,转动过程中,一个转动面是无法实现最短路径的!

我一直在期待irobot兄弟能够讲解一下,安卓手机端的APP编写,然后是手机和NXT的兰牙的通讯!只有通过目前手机端强大的多核ARM计算能力,取代NXT可怜的ARM7和实在少得可怜的内存,才能提高识别和计算速度!
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

 楼主| 发表于 2013-7-2 11:35:05 | 显示全部楼层
你说错了,其实识别和计算都不是用ARM7完成的,而是在计算机中完成的!ARM7只是完成读取颜色值和翻转魔方,但是使用蓝牙通过颜色传感器识别颜色的过程中本来就会出错的!
我采取的方式是读取10次颜色传感器的值,去掉最高值和最低值,对如下的8个数取加权平均,三种光要读取30次,才能够识别一个色块,54个色块,共要读取1620次,还不包括翻转所用的时间,你说能不慢么!
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

QQ|手机版|中文乐高 ( 桂ICP备13001575号-7 )

GMT+8, 2024-4-27 13:02 , Processed in 0.112271 second(s), 26 queries .

Powered by Discuz! X3.5

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表