中国高校智能机器人---魔方机器人经验帖

前述:这个项目从寒假放假开始做,在学校里面待了七八天,把机械结构搭好,初始代码有一个雏形,开学之后断断续续的总共做了一个月左右,最后结果比较悲情,结果上传后,很遗憾大佬太多(或是比赛自身公允度也值得怀疑。。。。),但我们自己做的确实较菜,提交的视频是双臂运行了52S。最后是被淘汰的,无缘进入决赛。但对于个人来说,东西是做出快来了,我已无愧。

地址:https://github.com/shuiyihang/CubeSolve

背景:老师推荐这个比赛的时候,我已经大三了,之前说过,不想再参加任何比赛了,比赛玩几次还行,可以锻炼受压能力,但是一直做,其实对于新东西学习很有时间限制,但是看见有魔方机器人的项目,就决定再做一次吧。原因我觉得有三个,其一:那段时间在学习python,树莓派和opencv,就想做一个实际项目吧。其二:没选择其他的如格斗,擦窗之类的,是觉得必须要有一个严格的“界限”,对于魔方来说,做出来就是做出来,必须要把魔方还原才算做出来,但是擦窗,格斗是没有什么硬性指标的[对于我自己来说,是想检验一下这三年有没有能力真正的完成一件事情],其三:就是大一时间看见过别人的解魔方视频,当时是颇为震惊的,想自己来试试。

大体结构:

机械结构,采用最简单的双臂形式

 

中国高校智能机器人---魔方机器人经验帖

控制上面考虑到要图像处理,两种解决方案,一种openmv[需要另行购买模块],另一种opencv,我那时候刚在咸鱼上收购了一个树莓派3B+,所以没多想选择了opencv,语言就选择使用python[确实事半功倍的效果]

双臂魔方机器人的难点:

这个你一定要重视,上面看完,你觉得:哦,似乎没什么难度哈。但许多东西是你做起来才发现问题的。

1:最大的问题,就是双臂的机械结构,从图上可以看到,我们使用的是标准铝型材,搭了两个45角,自以为巧妙无比,但运行过程中,总会发生手臂碰到魔方的问题,因为使用的是步进电机,只要一碰到魔方,步进电机就会失步,达不到位置,后面就全乱了,魔方夹子在某宝上面购买的,设计的颇为让人费力,后期用电磨不断加工,只为了让舵机张到最大时候,旋转时候夹子不会碰到魔方,但其实这里也有两种方案,一种自己3D打印[看自己工具情况吧],一种是不需要加工夹子,在夹子上面的滑轨上面加长的硬性塑料[受力不会弯曲,不然夹不住魔方],或者要是能搞到铁片也好,再把夹子的抓手固定到塑料或铁片上,可以加大舵机最大角度时候抓手之间的距离,确保夹子肯定不会打到魔方。

2:魔方每个面颜色识别处理,没做的时候无非觉得只是,opencv腐蚀,hsv值比较一下就行了,太简单化问题了。。。

实际问题总是要比理论麻烦,摄像头受光照等等影响,我们直接用的树莓派自带的CSI,10几块钱,中午时候采集的图像很清楚,颜色识别也几乎全对,但是总存在不确定性,要知道一个错,就没有解法的。尤其红色和橙色的H值是很接近的,总会造成误判,这里建议大家使用图片中的标准魔方,颜色还是比较正确的,刚开始借舍友的这种魔方,红色和橙色总是傻傻分不清。

中国高校智能机器人---魔方机器人经验帖

其他:剩下的则是一些小问题了,比如抓手必须要贴上一些加大摩擦力的东西,我们使用的是海绵,效果还不错[砂纸也使用过,对魔方不太好],还有一个特别的问腿,我们结构看起来夹子是绝对在一个面上的,但是转动起来的时候[因为我们不是采用的加薄板方案,所以有这个问题,否则略过即可],会偏,后来,队友奇想,把一个手臂用手向一边掰弯,竟然好了!!。。。

过程:

说一下过程吧,因为想着要考研[成电等我!!],在上一年,便把keil之类等等全卸载了,电脑上只留了一个Arduino的编辑器,确实好用方便,寒假留校期间,没有使用树莓派[比较金贵,东西没调好之前怕搞坏了没使用,还有就是没想好怎么使用,电脑远程又没网,不舍得开流量。。。一开始想的是先用C写,完了之后移植到python上,设置为树莓派开机自动启动],这里介绍一下魔方解决算法kociemba,在GitHub上面开源,需要研究源码或是pip安装的了解下,外人以为魔方是一步一步边走边算的,其实是错的,它根据各面信息在最开始便得到过程,剩下则是电机互相配合把它动作出来的问题了。

在校七八天内,等着买的铝材料回来时候,在写电机根据kociemba得出的结果之后的动作,大致想法是把结果字符串分离成一个个字符,再判断字符情况,根据双手目前颜色情况[颜色就在手中,不需要步进电机旋转],与目标颜色相差多少度等等。。。

最后等架子搭起来的时候,因为抓手无法夹着魔方[摩擦力不够],又因为要回家了,就模仿着,单步在Arduino上,根据串口反馈的结果,我自己双手走了一遍,似乎没错误就先这样了

开学来的时候,考虑树莓派用来处理图像,Arduino负责电机动作[因为有完美的servo库和pwm输出,只使用树莓派,要自己配置电机驱动。。。],但这样就要考虑两个之间通信,IIC或者是串口,IIC只能发送字符 ,而我想要的是可以发送字符串[ok,yes之类],后来使用串口,但是两个控制器的串口通信似乎存在不同步问题,这样把指令给Arduino就要费很长时间。所以又放弃这个想法,还是使用单一树莓吧,解决远程[手机或者电脑连接pi],就直接上树莓派了,这里要说一下opencv安装问题,因为树莓派安装cv3的时候需要编译[我在宿舍用了整整一天],后来不知怎么崩了,无法调用,心血全废了。。。。。所以这里建议大家[务必]使用cv2,只需要pip一下,安装也就40分钟左右,对于颜色识别已是足够,只在某些函数调用上面,cv2与cv3相比可能多一些参数。

使用pi的时候,因为怕python加持,很多问题都简单了,在Arduino上比如结果分离成字符的函数需要自己写,在python上面有现成的,一句话的事情,结果也没有移植当初Arduino上的代码,因为觉得写的麻烦了,这里有一个想法:算法是什么?算法是节约空间和时间的,当没有或者是可靠的算法的时候,放弃空间或许可以换来时间和代码可靠性,想来魔方可能情况不多[左右手颜色组合情况],于是就做了一个python里面的字典映射,每种情况对应一种动作,虽然空间臃肿了,但是效果不错!

本来想的是进入决赛更新颜色识别偏,加上模型训练或者是换摄像头,遗憾止步了,五一开始,早上困的不行,没有去图书馆,一直想更新下博客,趁这个机会补上,代码等有空补上[发GitHub上吧。。],树莓派没在身边

视频里最后结果截屏。。。。

 

中国高校智能机器人---魔方机器人经验帖