汉诺塔机器人结题报告
第一章课程设计题目
汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。
有三根相邻的柱子,标号为A,B,C,A柱子上从下到上按金字塔状叠放着n个不同大小的圆盘,现在把所有盘子一个一个移动到柱子B上,并且每次移动同一根柱子上都不能出现大盘子在小盘子上方。
为常人所熟知的汉诺塔盘,不少人都接触过。
但用机械臂尝试解开一个汉诺塔,相信一定会让人耳目一新。
故我们组提出:用一个智能机械臂来自动夹取汉诺塔圆片,完成汉诺塔的求解。
该系统有下列要求。
1.机械臂和三根杆的距离是固定的,圆片的厚度是固定的。
2.起始杆和目的杆是固定的。
3.圆片的数量未知。
(>3)
第二章设计思路
2.1机械臂选取
机械臂选取6自由度Arduino机械手臂,其中有 4自由度控制机械臂位置,另外2自由度控制机械臂姿态。
该机械臂配套Arduino控制板,开放舵机动作调试平台和Arduino编程平台,支持二次开发。
机械臂如下图2.1。
图2.1
传感器方面:除了机械臂内传感器以外,外传感器选择红外传感器和触摸传感器,触摸传感器起到开关的作用,红外传感器用于获取汉诺塔的位置信息。
2.2设计流程框图
总体思路为:使用超声波传感器定位到汉诺塔,然后把汉诺塔的距离信息与获取到的圆片数量信息传输给汉诺塔求解程序,由求解程序输出指导求解步骤,经整合后确定每一步要将哪个圆片从那一个柱移动到哪一个柱子。
流程图见图2.2
图2.2
2.3求解准备
在指导程序指导求解之前,我们需要先把整套流程拆分成几个基本动作,然后由汉诺塔程序给出每一步骤执行哪一个基本动作。
因此首先,我们定义三个空栈ABC用来储存某一时刻汉诺塔上每个柱子的圆片数量信息。
并且用连续的自然数来代表圆片,根据圆片数量给栈赋初值。
举个例子如果A柱上有5个圆片从小到大摆放,其他两个柱子是空的,那么有:
A={5,4,3,2,1};
B={NULL};
C={NULL};
如果将A顶上的一个圆片移动到B上后,此时:
A={5,4,3,2};
B={1}
C={NULL};
而该移动指令可以表示为:A->B。
有了这样一个栈结构,在描述汉诺塔状态与移动指令的时候就方便了许多。
其次是基础动作的分解:
机械臂在将一个圆片从一个塔移动到另一个塔的一整个完整的动作中,可以分成两部分:分别为将圆片从一个塔上夹出和套入另一个塔。
而将圆片从塔上夹出又存在从ABC三个塔中哪一个夹出,和夹出的顶层圆片目前在第几层两个问题。
因此对于n层汉诺塔,夹出这一部分一共有3n个基础动作。
套到另一个塔上的情况比较简单,因为只需将圆片套到孔上然后松开机械夹子即可,故一共只有3个动作组。
将以上3n+3个动作组预先调试好存入内存,即作为n层汉诺塔的动作组,可根据实际汉诺塔层数来调用哪个动作组。
由于高层数情况的动作组包含了低层数情况的动作组。
也可以存入一个最高层数的动作组,然后每次从该组取一部分。
基础动作组的效果请见视频演示2。
2.4 求解程序
伪代码:
int n;
char a,b,c;
char x,y; //起始柱目标柱
Int s,t; //起始柱圆片数量
//目标柱圆片数量
int hanoi(n,a,b,c)
{
if (n==1) {
x=a;
y=c;
GetNum(x,y);}//获取当前圆片数量 else {
hanoi (n-1,a,c,b);
x=a ; y=c;
hanoi (n-1,b,a,c);
GetNum(x,y);}
}
GetNum(x,y)
{
s = x.size();
t = y.size();
y.push() = x.pop();//更新栈信息
}
第三章后期实现
放弃了汉诺塔定位,改为距离确定的情况。
完成了所有移动圆片的所有基础动作(分为夹取与放下两部分)的编辑(例如A塔2号块取出;C塔放下)。
使用汉诺塔求解程序完成了指导机械臂求解汉诺塔,其中展示的是三层汉诺塔。
并且为了增强功能性与趣味性,设置了手柄操控方式如图3.1,使人可以自行夹取,尝试求解。
详细情况见视频演示3.4.
第四章总结与反思
我们组到目前为止实现了用机械臂与程序求解汉诺塔,解决了一些如定位不精确、套环难度太大等问题,同时也避开了一些无法解决的问题,比如汉诺塔位置不固定等。
我们在实验过程中对机械控制,以及Arduino编程有了较深入的了解。
希望老师同学对我们的成果多多提供一些宝贵的意见和建议,我们一定积极听取,优化自我。