电脑鼠实验报告综述.docx
《电脑鼠实验报告综述.docx》由会员分享,可在线阅读,更多相关《电脑鼠实验报告综述.docx(43页珍藏版)》请在冰点文库上搜索。
电脑鼠实验报告综述
《视觉机器人》
实验报告
学院:
姓名:
专业:
二零一六年一月
第1章背景和意义
电脑鼠可看作是一种具有人工智能的小型机器人,依照比赛规则,当电脑鼠
放入“迷宫”起点,按下启动键之后,它就必须自行决定搜寻法则并且在迷中前进、转弯、记忆迷宫墙壁资料、计算最短路径、搜寻终点等功能。
电脑鼠结合了机械、电机、电子、控制、光学、程序设计和人工智能等多方面的科技识。
国际电工和电子工程学会(IEEE)每年都要举办一次国际性的电脑鼠走迷宫竞赛。
首场电脑鼠迷宫竞赛1979年于纽约举行,1991年以来,每年都有世界级的比赛。
2007年,国内开始举行IEEE标准电脑鼠走迷宫邀请赛,自举办以来高校参赛踊跃,许多大学还开设了“电脑鼠原理和制作”选修课程。
电脑鼠走迷宫竞赛具有一定难度,是一项富有挑战性和趣味性的比赛。
电脑鼠可看作一个集多项工程学科知识于一体的小型系统,成功的设计者通常都是合作团体。
他们必须考虑电子、电气、机械以及计算机各方面的问题,重量、速度、功耗、传感技术重心以及程序各方面都是设计中需要决定和综合考虑的因素。
电脑鼠结合了多学科知识,对于提升我们的动手能力、团队协作能力和创新能力,促进课堂知识的消化和扩展自身的知识面都非常有帮助;另外成立小组合作参赛,不仅使我们学到了知识,而且加强了同学之间的交流,交际能力语言表达能力等也得到了锻炼和提升;最后电脑鼠走迷宫竞赛极具趣味性,容易得到学生的认同及参与,并能很好的激发和引导学生这方面的兴趣和爱好,为继续参加比赛和深入学习提供了良好的条件。
第2章系统方案设计
硬件部分设计概要:
软件部分结构设计:
第3章硬件设计
3.1电脑鼠基本硬件组成
电脑鼠的硬件大致分为以下几部分:
传感器、执行部件、微处理器、机械结构,如图3-1所示
1.传感器
它是电脑鼠感知外界环境的窗口,是电脑鼠的双眼。
好的传感器是电脑鼠准确获取外部环境信息以做出正确判断的依据,是电脑鼠灵敏快捷的保证。
红外测距方式在电脑鼠上应用最广。
常见的红外如图3-2所示
本次电脑鼠使用6组红外传感器,每组红外传感器由红外发线射器和红外线接收器组成用于检测迷宫墙壁信息,分别用于检测左、左前、前、前、右前和右六个方向的墙壁信息。
我们用U1-U5表示红外线接收头传感器,RF1-RF5为发送红外线装置,使用6组可调电阻W1-W5控制红外信号发射强度,调整可见距离。
信号采用载波调制,增强抗干扰性。
传感器由高功率880nm红外发射管和高灵敏度红外接收管组成,传感器返回数据为模拟量,通过ADC读取,通过数值,可估算障碍物的距离。
图3-2红外传感器
2.执行部件
电机是电脑鼠的动力源,是电脑鼠的四肢。
只有具备健壮且灵活的四肢的电脑鼠才有可能在比赛中高效的解开迷宫。
电机不但要能输出足够的马力还要便于控制,在此基础上再配以合适的控制算法就能使电脑鼠快速而精确的行走。
电脑鼠中常用的是步进电机和直流电机,步进电机控制容易,但直流电机使电脑鼠控制更加灵敏。
本次电脑鼠上有两个两相四线制的步进电机,左电机和右电机用来控制电脑鼠前进,左转和右转,停止。
步进电机是一种将电脉冲转化为角位移的执行机构。
当步进驱动器接收到一个脉冲信号,它就驱动步进电机按设定的方向转动一个固定的角度(称为“步距角”),它的旋转是以固定的角度一步一步运行的。
可以通过控制脉冲个数来控制角位移量,从而达到准确定位的目的;同时可以通过控制脉冲频率来控制电机转动的速度和加速度,从而达到调速的目的。
四相步进电机如图3-3所示,电机驱动采用ROHM公司MOS全桥芯片驱动,压降低,给电机提供较大的输入电压。
电机控制简单,每个电机采用三个控制信号:
两个I/O控制电机的正反转、刹车,一个PWM控制电机调速,PWM范围20KHz~100KHz。
图3-3四相步进电机
3.微处理器
微处理器是电脑鼠的核心部分,是电脑鼠的大脑。
几乎所有的信息,包括墙壁信息,位置信息,角度信息和电机状态信息等都需要经过微处理器处理并做出相应的判断。
所有的数据分析,算法实现和执行指令的发出等都需要由微处理器来完成。
主控芯片STM32F103RET6具有72MHz的主频,512KFlash,64KRAM,加个外部Flash,足够比较使用。
4.机械结构
电脑鼠要能够在迷宫里面灵活穿梭,必须有一副好身板,有适合在迷宫中快速运行的身体结构。
首先他必须结实,拥有两只东倒西歪的轮子的电脑鼠是很难不在迷宫中碰壁的,其次身材娇小的电脑鼠在迷宫里是会更灵活的,它有更大的空间用于完成转弯,有更大的空间用于纠正姿,最后体重太大和没有平衡感的老鼠也是不适宜迷宫竞赛的。
基于如此多的考虑,一只学富五车而又娇小玲珑的电脑鼠要求我们从机械上面有更多创新。
电脑鼠的机械结构如图3-4所示。
图3-4电脑鼠的机械结构
3.2电脑鼠基本动作
电脑鼠基本动作包括路口检测,行走控制和转弯。
路口检测:
由安装在前、右、左的三个红外线发射对管和接收部件实现,利用时钟中断来控制,实现远红外测距功能,探测前、右、左有无障碍。
行走控制:
由左、右45°角的两个红外线发射对管和接收部件实现,利用时钟中断来控制,实现近红外测距功能,保持电脑鼠在中轴线上行走,避免撞墙。
转弯:
由于电机采用的是步进电机,只要对一个电机的步数进行设定,电机采用PWM进行驱动,另外一个电机停止或者反转同样的步数,当然这个步数要自己实际测量。
第4章软件设计
4.1电脑鼠软件设计概要说明
电脑鼠的软件主要可以分为等高图制作模块、冲刺模块、转弯模块、搜索模块、相对方向与绝对方向转变模块、墙壁资料存储模块和电脑鼠搜索策略模块这七个模块。
如图3-5所示。
下面介绍一下电脑鼠运行中必须要知道的一些参数,及其在程序运行过程中的用途。
电脑鼠在运行中可以划分为四个状态:
等待,启动,搜索迷宫和冲刺状态。
1.等待状态
在该状态中,电脑鼠静止在起点,等待开始命令。
同时实时显示传感器检测结果和电池电压,这样方便调试传感器的灵敏度和更换电池。
当控制启动的按键按下后,电脑鼠进入启动状态。
2.启动状态
在该状态中,电脑鼠根据第一次转弯的方向判断起点是在坐标的(0,0)点还是在(15,0)点。
其程序流程图见图3-6所示:
图4-2判断起点坐标程序流程图
3.搜索迷宫状态
在该状态中,电脑鼠的任务就是搜索并记忆迷宫地图,以采用右手搜索法则为例搜索全迷宫,其流程图如图3-7所示。
图4-3迷宫搜索流程图
4.冲刺状态
迷宫搜索完毕后,根据算法找出一条最优路径冲刺到终点,冲刺结束后返回到起点。
4.2等高图制作模块
等高图就是等高线地图的简称,有如一般地图可以标出同一高度的地区范围,或有如气象报告时的等气压的范围和大小。
那么等高图运用在迷宫地图上,可以标出每个迷宫格到起点相等步数的关系,许多封闭路径的逃脱与冲刺的关卡都可以在制作出等高图后迎刃而解,使电脑鼠更容易逃脱,少走一些弯路。
首先开辟一块1616的二维数组空间(MapStep[16][16]),其中每一个元素代表迷宫的一个方格,用以计算后储存各方格至起点的最短路径步数(所谓步数即为路径中经过的方格数)。
当起点坐标处标识为1时,可以直接达到的相邻方格均为2,再远的方格的等高值依次递增,这样距离越远的地方等高值越大。
4.3冲刺模块
冲刺函数的实现是建立在等高图已经建立好的基础上的。
当电脑鼠要进行冲刺的时候,调用冲刺函数时,首先会调用等高图制作函数将等高图制作好。
然后该函数通过等高图和墙壁信息来进行电脑鼠的行进控制。
当然,我们认为电脑鼠在走直道的时候应该会比走弯道的时候,来的更快一点,所以我们没有进行特殊的加权,直接是走直道的。
电脑鼠从起点开始,一直利用等高图信息和墙壁信息进行一格一格的对比,只有当这一格在电脑鼠绝对方向上时,这一格才算记录到进行直道冲刺,同时直道格数加一。
当遇到电脑鼠要转弯的时候,已经将要走的步数记录下来了,接下来直接调用行进函数,控制电脑鼠走完记录好的步数后,即走到电脑鼠要转弯的地方后,再进行转弯,然后接着继续进行上一步的动作。
4.4转弯模块
转弯也是电脑鼠运行时必不可少一部分,同时转弯也分为静止转弯和行进中转弯。
静止转弯要求电脑鼠首先要停止,主要用在电脑鼠进行搜索中,这时要求电脑鼠要绝对的稳定,所以采用静止转弯比较好。
行进中转弯的特点是消除了静止转弯的要求电脑鼠停止的弊端,可以节省一些时间,主要用在电脑鼠进行冲刺时,这时要求电脑鼠要以竟可能短的时间从起点到达终点,所以行进中转弯可以节省不少的时间。
静止转弯时,对两个电机设置走相同的步数,如当要转左转90°时,设置左电机向后走40步,右电机向前走40步。
通过两个电机走的方位不同,来实现静止转弯,但静止转弯的缺点就是,在转弯前首先要让电机停止,然后再对电机的要走的步数进行赋值,这样会浪费一点时间。
行进中转弯时,让一个轮子停止,一个轮子进行运转来实现。
如当要左转90°时,设置左电机停止转动,右电机转动80步。
与静止转弯区别开来的是,电机的步数在其他的函数中赋值好了,在转弯函数中只要一开始将一个电机停止转动就可以了,而不用一开始就将两个电机都停止,然后对电机的步数进行赋值,这样的话,就可以节省一些不必要的时间。
4.5搜索模块
电脑鼠一开始进行迷宫搜索时必须要用到这个模块。
通过这个模块电脑鼠进行迷宫的墙壁信息的采集,电脑鼠所走过的每个坐标都会有一个相应的墙壁信息,这些墙壁信息是电脑鼠后来进行等高图制作和冲刺的基础。
在进行搜索时,电脑鼠的红外是在时钟中断下,不停地被驱动的,这一连串的动作有发射短波红外,发射长波红外,和接受红外。
处理器通过读取红外接收器对应引脚的信息来判断四周的情况,同时将迷宫的信息进行编码后存储在对应坐标的一个迷宫情况数组中。
当遇到岔路时,程序跳出搜索函数,回到主函数中将岔路坐标进行处理,将这个坐标进行入栈,再回到搜索函数中,根据所选用的搜索法则选择好一条路后,继续搜索,并这样一直下去直到电脑鼠运行到终点。
4.6迷宫地图相对方向与绝对方向的建立
迷宫是用18cm×18cm大小的方格组成的,其行列各有16个方格。
为了让电脑鼠记住所走过的各个迷宫格的信息,我们就坐标的方法来对256个迷宫格进行编号。
根据坐标的的定义和比赛规则,也为了把上下左右这四个方向参数转换为微控制器能够识别的符号,在本文中,将向上的方向定义为0、向右为1、向下为2、向左为3,如图3-8所示。
只要有了迷宫的坐标和方向后,电脑鼠在迷宫行走就可以随时知道自己所处的位置和方位了。
然而,对于电脑鼠而言,红外线传感器的位置和方向是固定不变的,但是对于迷宫,红外线传感器的位置和方向是随着老鼠前进方向的变化而一起变化的。
这是由于选择参照物的不同而引起的,由此引出了两个方向的问题:
相对方向和绝对方向。
相对方向:
以电脑鼠当前行走方向为参照的方向。
绝对方向:
以迷宫绝对坐标平面为参照的方向。
那么传感器所检测到的信息如何才能更便于处理呢?
周立功提到了如果以相对方向存储的资料将是混乱的,不仅要存储麻烦,而且要记录起检测时电脑鼠所处的方向,存储量比较大,处理起来也非常麻烦。
而以绝对方向存储就不需要考虑当前电脑鼠的方向。
这样就会经常遇到相对方向和绝对方向的互换。
在本文中采取了以变量Dir记录电脑鼠前进方向上的绝对方向值,即前方的绝对方向值始终为Dir。
这样电脑鼠的相对方向转换成绝对方向如表3-1所示。
表3-1相对方向转换成绝对方向
相对方向
绝对方向
电脑鼠前方
Dir+1
电脑鼠右方
(Dir+1)%4
电脑鼠后方
(Dir+2)%4
电脑鼠左方
(Dir+3)%4
有时候系统还需要根据绝对方向(Dir_dst)和当前的绝对方向(Dir)求出方向偏差值(△Dir),如式3-1所示。
△Dir=Dir_dst–Dir式3-1
为了使△Dir的值落在0~3的范围内,计算式进行式3-2的转换如下:
△Dir=(Dir_dst+4–Dir)%4式3-2
这时就可以根据方向偏差值求出电脑鼠的相对方向,如表3.2所示。
表3-2绝对方向转换成相对方向
绝对方向差值(△Dir)
相对方向
0
电脑鼠前方
1
电脑鼠右方
2
电脑鼠后方
3
电脑鼠左方
假设电脑鼠已知当前位置坐标(X,Y),那么就可以求出在其某绝对方向上的相邻坐标值,如表3.3所示。
该表是可逆的,即可以根据坐标值的变化求出绝对方向。
表3-3坐标转换
绝对方向
坐标
当前位置
(X,Y)
上方(0)
(X,Y+1)
右方
(1)
(X+1,Y)
下方
(2)
(X,Y-1)
左方(3)
(X-1,y)
当电脑鼠达到一方格坐标时,应根据传感器检测结果记录下当前方格的墙壁资料,为了方便管理和节省存储空间,每一个字节变量的低四位分别用来存储一个方格四周的墙壁资料,如表3.4所示。
因为迷宫共有8×8个方格,所以可以定义一个16×16的二维数组变量来保存整个迷宫墙壁资料。
表3-4墙壁资料存储方式
变量位
代表的绝对方向
备注
bit0
上方(0)
1:
有路,0:
有墙壁
bit1
右方
(1)
1:
有路,0:
有墙壁
bit2
下方
(2)
1:
有路,0:
有墙壁
bit3
左方(3)
1:
有路,0:
有墙壁
bit7~bit4
保留位
迷宫墙壁资料全部初始化为0,表示走过迷宫格至少有一方没墙壁,即墙壁资料不为0。
这样就可以通过单元格存储的墙壁资料是否为0来确定该单元格是否曾搜索过。
4.7墙壁资料存储
为了记忆迷宫的详细信息,需要对迷宫单元的位置进行线路标记。
全迷宫共有16×16个单元组成,可采用二维坐标方式标记,即用每个单元的XY坐标表示,如起点可标记为(0,0),终点为(7,7)。
此外,还需要对迷宫单元的可行进方向进行标记,可采用绝对方位或相对方位二种方式。
绝对方位:
这是一种与电脑鼠行进方向无关的标记方式,以一个四位的二进制数,分别表示“东”﹑“西”﹑“南”和“北”四个方向。
以1表示允许行进(无墙壁),0表示不允许行进(有墙壁)。
相对方位:
这是一种与电脑鼠行进方向有关的标记方式,以一个三位的二进制数即可实现标记,分别表示“前”“左”“右”,以1表示允许(无墙壁),0表示不允许(有墙壁)。
4.8电脑鼠搜索策略
电脑鼠走迷宫可以采用全迷宫探索策略,即将迷宫的所有单元均搜索一次,从中找出最佳的行走路径。
这种策略需要有足够的时间或探测次数,但在IEEE竞赛规则中每场竞赛只有15分钟的时间,因此是不可能的。
另一种方法是部分迷宫探索策略,即在有限的时间或探测次数下,只探测迷宫的一部分,从中找出次最佳的路径,显然只能采用这种策略。
电脑鼠在一巷道内行走,如果最后无路可走,则该巷为死巷。
电脑鼠在任一单元内,可能的行走方向最多只有三个(前、左、右),如果有二个或二个以上的可能行走方向,称为交叉,遇有交叉时,由于有多个可以行走的方向,在行走方向的选择上,可有下面的几种选择法则:
(1)右手法则:
遇有交叉时,以右边为优先的前进方向,然后是直线方向、左边方向。
(2)左手法则:
遇有交叉时,以左边为优先的前进方向,然后是直线方向、右边方向。
(3)中左法则:
遇有交叉时,以直线为优先的前进方向,然后是左边方向、右边方向。
与此类似的还有中右法则。
(4)乱数法则:
遇有交叉时,取随机值作为前进方向。
(5)向心法则:
由于终点在迷宫的中心,遇有交叉时,以向迷宫中心的方向为优先的前进方向。
参考文献
[1]金东勇.ZigBee技术在智能家居控制系统中的应用研究[D].太原理工大学工学硕士学位论文.2008:
13-16
[2]郭天祥新概念51单片机C语言教程:
入门、提高、开发、拓展全攻略(附DVD光盘1张)2009-01-01
[3]胡汉才单片机原理及其接口技术(第3版)(附CD-ROM光盘1张)2010-05-01
[4]程国钢51单片机应用开发案例手册2011-11-01
附件:
电脑鼠原理图:
电脑鼠单片机控制程序:
--------------FileInfo---------------------------------------------------------------------------------
FileName:
maze.c
LastmodifiedDate:
2015/10/15
LastVersion:
V1.0
Description:
¸ù¾Ýµ×²ã³ÌÐòÈ¡µÃµÄÃÔ¹¬ÐÅÏ¢£¬¾¹ý¸ÃÖÇÄÜËã·¨¿ØÖƵçÄÔÊóµÄÏÂһ״̬£¬²¢ËÍÍùµ×²ãÇý¶¯³Ì
ÐòÖ´ÐС£
--------------------------------------------------------------------------------------------------------
CreatedBy:
LiaoMaogang
Createddate:
2007/09/08
Version:
V1.0
Descriptions:
--------------------------------------------------------------------------------------------------------
Modifiedby:
WhoMovedMyCheese
Modifieddate:
Version:
Description:
°üº¬Í·Îļþ
#include"Maze.h"
#include"stm32f10x.h"
#include"BitBand.h"
#include"Mouse_Drive.h"
È«¾Ö±äÁ¿¶¨Òå
staticuint8GucXStart=0;/Æðµãºá×ø±ê/
staticuint8GucYStart=0;/Æðµã×Ý×ø±ê/
staticuint8GucXGoal0=XDST0;/ÖÕµãX×ø±ê£¬ÓÐÁ½¸öÖµ/
staticuint8GucXGoal1=XDST1;
staticuint8GucYGoal0=YDST0;/ÖÕµãY×ø±ê£¬ÓÐÁ½¸öÖµ/
staticuint8GucYGoal1=YDST1;
staticuint8GucMouseTask=WAIT;/״̬»ú£¬³õʼ״̬ΪµÈ´ý/
staticuint8GucMapStep[MAZETYPE][MAZETYPE]={0xff};/±£´æ¸÷×ø±êµÄµÈ¸ßÖµ/
staticMAZECOORGmcStack[MAZETYPEMAZETYPE]={0};/ÔÚmapStepEdit()ÖÐ×÷¶ÑջʹÓÃ/
staticMAZECOORGmcCrossway[MAZETYPEMAZETYPE]={0};/Main()ÖÐÔÝ´æδ×ß¹ý֧·×ø±ê/
//externuint8GucGoHead;
Functionname:
Delay
Descriptions:
ÑÓʱº¯Êý
inputparameters:
uiD:
ÑÓʱ²ÎÊý£¬ÖµÔ½´ó£¬ÑÓʱԽ¾Ã
outputparameters:
ÎÞ
Returnedvalue:
ÎÞ
voiddelay(uint32uiD)
{
for(;uiD;uiD--);
}
/
Functionname:
mapStepEdit
Descriptions:
ÖÆ×÷ÒÔÄ¿±êµãΪÆðµãµÄµÈ¸ßͼ
inputparameters:
uiX:
Ä¿µÄµØºá×ø±ê
uiY:
Ä¿µÄµØ×Ý×ø±ê
outputparameters:
GucMapStep[][]:
¸÷×ø±êÉϵĵȸßÖµ
Returnedvalue:
ÎÞ
voidmapStepEdit(int8cX,int8cY)
{
uint8n=0;/GmcStack[]챐/
uint8ucStep=1;/µÈ¸ßÖµ/
uint8ucStat=0;/ͳ¼Æ¿ÉÇ°½øµÄ·½ÏòÊý/
uint8i,j;
GmcStack[n].cX=cX;/ÆðµãXÖµÈëÕ»/
GmcStack[n].cY=cY;/ÆðµãYÖµÈëÕ»/
n++;
/
³õʼ»¯¸÷×ø±êµÈ¸ßÖµ
/
for(i=0;ifor(j=0;jGucMapStep[i][j]=0xff;
}
}
/
ÖÆ×÷µÈ¸ßͼ£¬Ö±µ½¶ÑÕ»ÖÐËùÓÐÊý¾Ý´¦ÀíÍê±Ï
/
while(n){
GucMapStep[cX][cY]=ucStep++;/ÌîÈëµÈ¸ßÖµ/
/
¶Ôµ±Ç°×ø±ê¸ñÀï¿ÉÇ°½øµÄ·½Ïòͳ¼Æ
/
ucStat=0;
if((GucMapBlock[cX][cY]&0x01)&&/Ç°·½Óз/
(GucMapStep[cX][cY+1]>(ucStep))){/Ç°·½µÈ¸ßÖµ´óÓڼƻ®É趨ֵ/
ucStat++;/¿ÉÇ°½ø·½ÏòÊý¼Ó1/
}
if((GucMapBlock[cX][cY]&0x02)&&/ÓÒ·½Óз/
(GucMapStep[cX+1][cY]>(ucStep))){/ÓÒ·½µÈ¸ßÖµ´óÓڼƻ®É趨ֵ/
ucStat++;/¿ÉÇ°½ø·½ÏòÊý¼Ó1/
}
if((GucMapBlock[cX][cY]&0x04)&&
(GucMapStep[cX][cY-1]>(ucStep))){
ucStat++;/¿ÉÇ°½ø·½ÏòÊý¼Ó1/
}
if((GucMapBlock[cX][cY]&0x08)&&
(GucMapStep[cX-1][cY]>(ucStep))){
ucStat++;/¿ÉÇ°½ø·½ÏòÊý¼Ó1/
}
/
ûÓпÉÇ°½øµÄ·½Ïò£¬ÔòÌøתµ½×î½ü±£´æµÄ·ÖÖ§µã
·ñÔòÈÎÑ¡Ò»¿ÉÇ°½ø·½ÏòÇ°½ø
/
if(ucStat==0){
n--;
cX=GmcStack[n].cX;
cY=GmcStack[n].cY;
ucStep=GucMapStep[cX][cY];
}else{
if(ucStat>1){/Óжà¸ö¿ÉÇ°½ø·½Ïò£