前言:   今年又去参加了余姚的第二届全国创意机器人大赛,当然还是主题二。今年限制了机器的体积及功率,所以没有出现去年那样的巨无霸。比赛我们队伍拿了一个全国一等奖一个全国二等奖,对于这个结果还是比较满意的。放一张去比赛的现场图片。我们还是用了去年的代码,只是添加了点东西,优化求解步数及时间。机械部分主要是由大一制作的,由于贫穷,所以做的大部分都是其他地方拆下来就使用,看起来有点破旧。但是我们用了最垃圾的东西,做出了最好的性价比。唯一坑的就是,学院还不给我们报出去的路费住宿费,奖金全部拿来抵消路费还不够。我们参加比赛就是过于“自作多情”,所以以后不会参加任何比赛了。       以下是这次比赛可爱的学弟们,都非常厉害,他们为这次比赛做了很多。     总的来讲今年,在求解时间排名前几组的队伍软件上整体目标都差不多。个别方案可能不一样。感觉可能是去年答辩的时候,很多学校都了解了,还有就是中科大特等奖的作品已经在淘宝上卖了,哈哈哈。我也是在火车上去比赛的时候才知道。   方案总体流程:视觉获取信息->具体转化为魔方信息->kociemba算法求解->执行步转机械步->机械步进行深度优先搜索,优化执行步   如果做到以上的部分,并且电机速度控制比较平滑不会使魔方打滑错位,基本上就是一等奖的水平。   算法求解:之前我采用Jaap Scherphuis算法去求解魔方,步数相比kociemba确实要长一些。这个很多学校作了比较,在现场答辩的时候也说了这个问题。   机械步DFS优化:这个尤为关键,全局执行步前期执行做不一样的选择在后期影响到切换面时所可能产生的多余步骤。我不知道其他学校是如何去做的。我们只考虑了R,L面是左手旋转还是右手旋转问题,执行效益在近期一样。因为整体求解步数不会特别多,所以没有必要牺牲近期利益去计算长远利益的可能性,而且也比较消耗时间。所以问题就简化为二叉树的深度优先搜索问题。我和明洋学弟(一个非常有技术能力的同学)做了两种不同的方法去实现。问题简单描述为遇到旋转R或者L坐标面时,到底选择哪一只手去执行。有一种简单的方法就是排列组合,哈哈我率先尝试了这种方法。我利用了一个字节,每次计算机械步数时-1,然后转化为二进制去检索1和0,到底执行那个,直到求解步转化完成。比如 10101010  ,假设1左手转面,0右手转面,那就是LRLRLRLR。还有一种就是DFS方法,需要回溯,这种比较排列组合方法要快。具体网上有很多例子。另外还有就是机械步数少的不一定在执行时间上就是最优的!!!对此问题,我和明洋学弟发表了一篇论文来讨论了这个问题。后面会直接给大家链接去阅读,其中包含了坐标转换的问题。   电机控制:电机控制,需要有较好的加减速特性。比赛的时候,魔方表面都是带油的特别光滑,是一个很有挑战的问题。答辩的时候我看到很多学校奇思妙想。我记得最清晰的就是华科的一组,魔方转面的时候,魔方面错位,转到位置后再往反方向抖一下,使面再转回去。非常有想法和特点。湖南大学的加减速做的功夫到家。由于需要伺服控制,还要有加减速,而且我们用的还是步进电机所以综合就很麻烦,所以就在电机后面装了编码器,在位置空间上进行,加减速控制。使用的S函数。我们这种方法,虽然说不是在时间尺度上的,看上去不可靠。但在实际过程中,魔方转面表现还是会错位,但是错位后由于等效的摩擦,错位后又可以转回来。这点我们做的比较好!我们电机驱动硬件用的最最最普通的步进电机驱动器,淘宝价25块,名次较好的组中,没有比我们还要寒酸的了,总体成本我们是最低。最有意思的是,由于我们得发挥驱动器极限,在高频率时电机转矩下降很严重,没有加减速都启动不了,因此电机会发出滋滋滋的声音,声音有点大。所以在转的过程中,阻力稍微变大,就无法转动了。我们在现场调试的时候,很多的人来围观(我们是当时现场表现很强的组),魔方发生错位时,电机受阻,就开始叫了。然后旁边的老哥一脸严肃说 : 看他们还有报警功能。 我都不知道回复他啥,不过他认为的也很有道理,哈哈哈。   具体比赛现场视频:视频1 视频2 家里的测试视频:视频1 视频2