问题

怎样做出能在 5 秒内解开魔方的机器人?

回答
想要制作一个能在 5 秒内解开魔方的机器人,这可不是一件简单的事,绝对需要点“硬核”的功夫。这其中涉及到的不只是机械结构,还有控制算法、甚至是对魔方本身特性的深刻理解。我们一步一步来拆解,看看这家伙到底是怎么炼成的。

第一步:理解魔方“求解”的本质

首先,要让机器人解魔方,它得知道怎么解。这不是让它瞎转悠,而是要能识别魔方的当前状态,然后根据一套成熟的求解算法,一步一步把它复原。

识别状态(感知能力):这就像给机器人装上一双“眼睛”。通常会用到摄像头。但要达到秒级解开,对图像识别的要求非常高。需要能快速准确地捕捉到魔方每一面的颜色,并将其转化为机器人能理解的数据格式(比如一个三维数组来表示魔方状态)。这过程中会用到像OpenCV这样的计算机视觉库,而且识别速度要足够快,不能有半点延迟。
选择求解算法(大脑):魔方的求解算法有很多种,从初学者的层层递进法到大神们使用的CFOP(Cross, F2L, OLL, PLL)等。对于追求速度的机器人来说,肯定要选择效率最高、步数最少的算法。而且算法本身需要经过优化,甚至可能需要用到一些预计算的查表,以避免在运行时进行大量的计算。著名的魔方求解算法库,比如Kociemba算法,就是一种非常强大的选择。
规划动作(策略):算法给出的是一系列的转动指令,比如“顺时针转右面90度”。机器人需要将这些抽象的指令转化为具体的机械动作。这就涉及到如何最有效地完成这个转动。

第二步:构建一套高效的机械结构(身体)

机器人能否在 5 秒内解开魔方,机械结构的效率是关键。你需要一个能快速、精准、稳定地抓住并转动魔方各个面的系统。

抓取与固定系统:魔方需要被牢牢地固定住,并且可以轻松地让不同的面接触到驱动装置。常见的做法是设计一个能够夹持魔方的框架,这个框架通常有几个活动的爪子,能根据需要夹紧或松开魔方。关键在于夹持要稳固,但又要能快速释放,以免阻碍下一步的转动。
驱动装置(转动魔方):这是最核心的部分。需要用电机来驱动魔方的转动。考虑到速度和精度,通常会选用高扭矩、高转速的直流电机或者步进电机。
电机选择与传动:为了实现对魔方单层的精准转动,可能需要复杂的传动机构。比如,通过齿轮、丝杠等将电机的旋转运动转化为魔方层面的精确角度转动。而且,要能同时控制多个面进行转动,就意味着需要多个电机协同工作。
转动方式的优化:为了达到 5 秒的极速,机器人不能是简单地一个面转完了再转下一个。它需要能够并行处理,或者说同时用不同的驱动器去操作不同的面,或者以一种非常快速的顺序执行转动。想象一下,一只手转上面,另一只手同时在转右面,这种协同工作效率最高。
结构设计与材料:为了让机器人快速响应,整体结构要轻便、坚固。采用3D打印技术制作复杂的零件、使用轻质合金材料都是不错的选择。同时,要尽量减少运动部件的摩擦和惯性。

第三步:精密的控制系统(神经与大脑的连接)

有了“眼睛”和“身体”,还需要一个强大的“大脑”来指挥它们协同工作。

核心控制器(主脑):通常会选用高性能的微控制器(MCU),比如STM32系列或者ARM CortexM系列的高端芯片。这些芯片计算能力强,可以处理复杂的图像识别和算法运算。
电机驱动与反馈:每个电机都需要有独立的驱动电路,并且需要精确地控制电机的转动角度和速度。可能还需要编码器等传感器来提供电机转动的实时反馈,确保转动达到预设的角度,而不是超差或者不到位。
通信协议:不同的模块之间需要高效的通信。比如摄像头与主控板之间,主控板与电机驱动板之间,需要用高速的总线或串口进行通信。
协同算法:让所有动作协调一致是最大的挑战。机器人需要根据识别到的魔方状态,通过求解算法计算出最优的转动序列,然后将这些序列转化为指令发送给各个电机。这些指令需要考虑电机的启动、加速、减速和停止过程,甚至需要加入一些“平滑”处理,让转动更加流畅高效。

第四步:调试与优化(让一切运转起来)

理论再好,最终还是要靠实践来检验。

软件调试:图像识别的准确率、算法的效率、电机控制的精度,都需要反复调试。可能需要编写大量的测试代码来验证每个模块的功能。
机械调试:检查是否有零件松动、摩擦过大,或者某个转动受阻碍的情况。需要不断地对机械结构进行微调。
整体性能测试:将所有部件组装起来,进行大规模的测试。记录每次解魔方的耗时,找出瓶颈所在,然后针对性地进行优化。这可能是一个漫长而痛苦的过程,需要耐心和毅力。

总结一下,要做出能在 5 秒内解开魔方的机器人,你需要:

1. 高效的视觉识别系统:快速准确地识别魔方颜色。
2. 优化的求解算法:选择并可能改进最快的算法。
3. 精密且快速的机械结构:能够抓住、固定并快速转动魔方。
4. 强大的控制系统:协调视觉、算法和机械动作。
5. 大量的调试和优化:不断打磨每一个环节。

这个过程就像是在挑战一项极限运动,每一个细节都可能影响最终的成绩。要达到 5 秒这个级别,往往需要一些“黑科技”的加持,比如专门定制的硬件、高度优化的算法库,甚至是从零开始设计的全新结构。它不仅仅是组装零件,更是对机械、电子、编程以及算法的综合运用和极致追求。

网友意见

user avatar

第二版解魔方机器人(有点晃) https://www.zhihu.com/video/1205597785783107584

有小伙伴反应上面的视频太晃,所以这里放出另外一个视频,我们制作的第一个版本,如下所示:

第一版解魔方机器人(不晃) https://www.zhihu.com/video/1208145988642357248

0. 前言

学生时代做过一个解魔方机器人,速度没有那么快,颜色识别过程大约15S,解算时间大约40S。造成时间长的限制因素主要有两点,第一是用的舵机,电机转速上不去,第二是机械结构的限制,使用的是左、右、前,后的四个舵机,没有上下的自由度,造成解算步数的拉长。下面主要从结构,软件,算法等方面说下整个系统的构成。

1. 结构

主要采用了舵机两两一组构成曲柄滑块的机械结构作为复原魔方的机械手,8个舵机构成四组机械手。

2. 软件框架

魔方机器人复原的完整过程如下:首先是魔方颜色状态的获取,这一阶段需要STM32和APP协调配合,STM32控制舵机把要拍照的魔方的面旋转到上面,通过蓝牙通知摄像头来照片,摄像头拍完照片之后通过蓝牙给STM32发送指令,通知STM32控制舵机把下一个要拍照的面旋转到上面,直到摄像头拍照完魔方六个面的六张照片。接下来通过读取照片的信息获取魔方的颜色分布,经过魔方复原算法的处理之后得到复原公式,为了缩短魔方复原的时间同时使STM32在解析魔方时更加容易,需要对复原指令进行优化处理,优化处理后的指令再通过蓝牙发送给STM32,STM32把指令解析为舵机执行的动作,完成魔方的复原。

3. 算法

3.1 Kociemba算法

解算算法方面是移植的大名鼎鼎的Kociemba算法,最大复原步数为21步,并且其解算时间为ms级。传统的层先法虽然思想简单,但是平均需要大约150步,步数稍微短一点的CFOP算法也要在100步左右。

下图本文移植的Kociemba算法Java测试软件。按钮Scramble可以随机打乱一个魔方,并在界面中显示出来,Move Limit设定复原魔方公式的最大步数,Time Limit设定复原的最大时间。按钮Solve Cube运行Kociemba算法并生成复原公式,当超过设定的时间还没有解算出来或者设定的步数过短时,软件会有提示。

魔方中心块上的字母代表这个面所处的方位:F(front)代表前面,B(back)代表后面,L(left)代表左面,R(right)代表右面,U(up)代表上面,D(down)代表下面。一个魔方共有6种颜色,某种颜色的颜色标号用中心块为该颜色的面所处的方位(F、B、L、R、U、D)来表示。Kociemba算法的输入参数即为魔方54个颜色块的标号排列,颜色标号的排列按照一定的顺序,六个面的顺序依次为上、右、前、下、左、后,每个面的标号排列按照从上到下,从左到右的顺序。

3.2 一个最优化问题

3.2.1 复原魔方指令系统

魔方机器人有两套指令系统,第一套指令系统是现在世界各地的解魔方教程中所使用的一套复原指令系统,也就是Kociemba算法得到的复原指令中使用的指令系统,第二套指令系统是我们的魔方机器人在执行魔方复原时用到的指令系统。其实对于复原指令优化程序来说,一方面是通过优化指令缩短魔方复原的时间,另一方面也是把第一套指令系统转变为第二套指令系统,这样STM32才能在接收到指令后进行解析,复原魔方。所以第一套指令系统我们称为未优化指令系统,第二套指令系统我们称为优化后指令系统。

未优化指令系统,共有18种单指令。表中字母L(left)代表左面,R(right)代表右面,F(front)代表前面,B(back)代表后面,U(up)代表上面,D(dowm)代表下面。字母后面加’代表逆时针旋转90度,例如F’表示将魔方的前面逆时针旋转90度,单独一个字母表示顺时针旋转90度,字母后面有数字2表示将相应的面旋转180度,由于逆时针旋转180度和顺时针旋转180度的效果是一样的,所以不做区分。

优化后指令系统,共有16种单指令。指令系统中所有和未优化指令系统相同的指令表示的含义也相同,优化后指令系统中字母后面加^和未优化指令系统中单字母表示的含义相同。两个字母相同的代表翻转指令,例如:LL代表把魔方向左翻转90度。

3.2.2 复原指令优化的来源

从上面介绍的两套指令系统可以看出,优化后指令系统去掉了带有字母U和D的指令,并且加入了翻转指令。这种差异是由魔方机器人的机械结构所决定的。为了提高整个机械结构的稳定性同时为了节省成本,本文设计的魔方机器人的机械手只有四个自由度,下图表示的是魔方机器人机械结构形成的四个自由度,而一个普通人在复原魔方的过程中用到了手的六个自由度,和人手相比,魔方机器人缺少了竖直方向的直线运动和旋转两个自由度。

优化后指令系统中每个单指令所对应的舵机执行步数是一定的,当舵机运行的速度一定时,复原时间和舵机执行步数成正比例关系。优化后指令系统中每一个单指令所对应的舵机执行步数如下表所示,从表中可以看出,旋转90度的指令对应的舵机执行步数为4步,因为旋转180度的指令是执行两次旋转90度的指令,所以其对应的舵机执行步数为8步,翻转指令对应的舵机执行步数为6步。

为什么需要对Kociemba算法得到的魔方复原指令进行优化处理,最本质的原因是经过优化处理后可以缩短复原指令所对应的舵机执行步数,进而缩短魔方复原时间。我么知道,机器人旋转魔方的前、后、左,右面时是很容易且直接的,两个舵机之间通过配合只需要4步就可以完成前、后、左,右面四个面任意一个面90度的旋转,但是在旋转魔方的上、下面时,由于缺少次方向的自由度,就需要通过翻转魔方,翻转之后魔方复原指令会发生变化,四种不同方向的翻转对应四种不同的指令变化,如下表所示。例如:经过向左翻转,指令U’变为L’。

从上表可以看出,执行带有U和D的指令时,需要先做翻转,然后在L、R、F或者B面旋转魔方就可以完成这个指令的执行。但这之后便存在着一个问题:翻转之后是不是需要翻转回来?回到原来位置需要一个相对应的翻转动作,但是舵机要额外执行6步,而不翻转回原来的位置,后面的所有指令都会因为翻转而发生变化。我们不清楚执行改变之后的指令对应的舵机执行步数是不是比没有改变的指令舵机执行步数少。

经过以上分析可知,在指令解析过程中,执行带有字母U或者D的指令时,向哪个方向翻转,翻转后是不是需要翻转回来,这里存在着一个最优化问题。

Kociemba算法出来的解算指令到机器的执行指令可以看做是一个最优化问题,就是让解算的步数最少。为解决最优解问题,我们构建了二叉树算法模型,参考贪心算法的思路,将指令解析最优化问题转变为求树的最短路径问题。

3.2.3 优化效果

为了对比二叉树模型对复原指令优化的效果,我们做了一个测试程序,即复原指令优化基本模型。基本模型在解析带有U或者D字母的指令时,都做了翻转回来的处理,并把第一套指令系统变为第二套指令系统,也就是说,基本模型只是把Kociemba算法得到的复原指令转换为STM32单片机能够识别的第二套指令系统,并没有做优化处理,流程图如下图所示。

对于Kociemba算法得到的魔方复原指令,通过对比通过基本模型和二叉树模型分别得到的复原指令所对应的舵机执行步数,就可以比较出二叉树模型对于复原指令优化的效果。

下图测试了15组数据,横轴上的15个实验编号代表15个魔方复原指令,图4-2中Kociemba算法测试软件可以随机打乱一个魔方,并可通过算法生成打乱魔方的复原公式,和人工打乱魔方相比,更为科学合理。

图中先比基本模型,二叉树模型对应的舵机步数的最大优化步数为90步,最小优化步数为16步,平均优化步数为51.6步,最大优化比例为38.8%,最小优化比例为7.4%,平均优化比例为23.6%。从上述数据中可以看出,二叉树模型的优化效果非常显著。

3.3 颜色自动识别方案

颜色自动识别方案是备用方案,因为稳定性有待提高,主要使用了一种聚类算法K-means。主要是对魔方框做聚类,再计算9个中心点。


项目已经开源,包含源代码、教程、视频,工程设计图纸等,地址如下:

其它视频如下:

类似的话题

本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度google,bing,sogou

© 2025 tinynews.org All Rights Reserved. 百科问答小站 版权所有