魔方机器人(一)还原算法
- 还原算法简介 我使用的是Thislethwaite还原算法.其简介如下:一般的魔方还原的解法是通过逐块(piece or block or layer)还原来减少下一步剩余块的状态数,最终直到所有的块还原。Thislethwaite方法(TM)则与上述方法有着本质的不同。魔方的任意一种状态与魔方群的一个群元素是一一对应的。TM的思想就是通过逐步降解魔方所处的群到更小的子群,最后直到单位子群,也即魔方的复原状态。所以在还原魔方的每一步魔方看起来都还会是乱的,但实际上魔方的状态数是随着所处的群的减小而规则减小的。此思想已经用代码实现,网上可以搜许多,各位小伙伴要是感兴趣的话可以到这个连接底下去看看https://tomas.rokicki.com/cubecontest/winners.html。
- 我所使用的程序简介
- 界面 如下是该程序运行界面截图(c#),不过这个程序现在在我的电脑上已经无法完整的跑起来了,能出现这个界面就已经是万幸了。这个还原步骤生成程序我忘了是从哪里下的了,只能大家自行搜索了(我的程序拿来你们估计也跑不起来我就不放上来了)。 接下来我对这个界面做一个简单的说明: 导入按钮是用来导入魔方打乱后所生成的序列的,打乱序列(这个打乱序列是经过颜色识别算法之后生成的)存放在一个.txt文件中。当点击计算按钮之后输出框里会输出一串由英文字母组成的序列,这串序列是针对该打乱序列的一个还原序列。这两步是最核心的部分。剩下的看自己的需求去做。 换算按钮左边的文本框里放的其实就是还原序列,换算之后在Arduino右边的文本框里出现的就是操作电机转动的序列了。
- 功能 这个模块是连接上下位机的桥梁。它在完成颜色识别之后将打乱序列加载进来通过还原算法生成还原序列,将还原序列转换成下位机所能识别的指令通过串口发送至Arduino。串口通讯我用的是SerialPort(c#)相关代码如下
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
//using System.Threading.Tasks;
using System.Windows.Forms;
using System.Diagnostics;
using System.IO;
using System.Collections;
using System.IO.Ports;
//using System.Threading;
namespace Test
{
public partial class Form1 : Form
{
SerialPort port;//定义串口
public Form1()
{
InitializeComponent();
if (port == null)
{
port = new SerialPort("COM3", 9600);//我用的是mega2560,串口为COM3
//port.Open();
}
}
private void PortWrite(string message)//串口通讯
{
if (port != null && port.IsOpen)
{
port.Write(message);
}
}
private void button5_Click(object sender, EventArgs e)
{
PortWrite("UDFBLR");//调用串口通讯
//textBox6.Text = "";
//开始按钮
}
}
}
- 补充 这个程序一开始下载下来的时候只有固定的一个打乱序列,你点击了计算之后会根据这个序列生成还原步骤,至于这个打乱序列是如何生成的我会在颜色识别部分进行详细讲解,在此不做过多说明。(因为写的有点急,这部分没写全面,有什么不明白的可以留言,我会做补充说明,今天先更到这)