现场可编程小车迷宫算法研究.doc

上传人:公**** 文档编号:560327112 上传时间:2023-04-13 格式:DOC 页数:10 大小:1.50MB
返回 下载 相关 举报
现场可编程小车迷宫算法研究.doc_第1页
第1页 / 共10页
现场可编程小车迷宫算法研究.doc_第2页
第2页 / 共10页
现场可编程小车迷宫算法研究.doc_第3页
第3页 / 共10页
现场可编程小车迷宫算法研究.doc_第4页
第4页 / 共10页
现场可编程小车迷宫算法研究.doc_第5页
第5页 / 共10页
点击查看更多>>
资源描述

《现场可编程小车迷宫算法研究.doc》由会员分享,可在线阅读,更多相关《现场可编程小车迷宫算法研究.doc(10页珍藏版)》请在金锄头文库上搜索。

1、直流电机现场可编程小车应用迷宫算法问题研究摘要:笔者基于自己制作的一款可编程小车为研究对象,探讨了一下迷宫算法在实际的应用中会出现的问题。本文首先介绍了这款可编程小车所用芯片CortexM3的优点以及在这款小车中所起的至关重要的作用,特别是介绍了其优点在笔者所作小车的设计过程中起到的举足轻重的作用。然后介绍了这款小车笔者所设计的指令系统。通过这套指令系统,在分析如何精确控制直流电机后,笔者讨论了迷宫搜索算法,以及如何将迷宫搜索算法的结果应用到小车上。本文所讨论的内容完全可以设计成设计一套指令让小车自行寻找,这种思想对于复杂情况下小车的行进以及救援工作具有重要意义。一、 现场可编程小车基本构架我

2、们制作的小车基于CortexM3内核,集成了热释红外模块,超声波模块,摄像头模块以及无线串口模块,在小车层次上实现了单步执行指令和执行程序的功能。1. Cortex-M3 内核Cortex-M3是一款物美价廉的处理器,在【1】中我们可以看到它的优点:性能强劲。在相同的主频下能做处理更多的任务,全力支持劲爆的程序设计。功耗低。延长了电池的寿命这简直就是便携式设备的命门(如无线网络应用)。 实时性好。采用了很前卫甚至革命性的设计理念,使它能极速地响应中断,而且响应中断所需的周期数是确定的。代码密度得到很大改善。一方面力挺大型应用程序,另一方面为低成本设计而省吃俭用。使用更方便。现在从8位/16位处

3、理器转到32位处理器之风刮得越来越猛,更简单的编程模型和更透彻的调试系统,为与时俱进的人们大大减负。低成本的整体解决方案。让32位系统比和8位/16位的还便宜,低端的CortexM3单片机甚至还卖不到1美元。遍地开花的优秀开发工具。免费的,便宜的,全能的,要什么有什么。2. LM3s系列-LM3s811【2】中详细介绍了LM3s811LM3S811 微控制器是针对工业应用方案而设计的,包括测试和测量设备、工厂自动化、HVAC和建筑控制、运动控制、医疗器械、火警安防以及电力/能源。除此之外,该LM3S811微控制器的优势还在于能够方便的运用多种ARM的开发工具和片上系统(SoC)的底层IP应用方

4、案,以及广大的用户群体。 另外,该微控制器使用了兼容ARM的Thumb指令集的Thumb2指令集来减少存储容量的需求,并以此达到降低成本的目的。 最后,LM3S811微控制器与Stellaris系列的所有成员是代码兼容的,这为用户提供了灵活性,能够适应各种精确的需求。尤其值得注意的是,对于应用开发,LM公司提供了DriverLib驱动库,借助优秀的IDE(例如,笔者选择的是在VS中写程序,IAR中编译),可以使开发的难度大大降低,学习和开发周期大大减少。同时对于系统级应用,M3提供的丰富而及时的中断响应机制(例如:抢占、咬尾、晚到中断,)以及双堆栈的设置,使得为该芯片设计的程序可以变得更加实时

5、性和健壮。对于良好的UART实现,也是我们值得称赞的,借助M3优秀的中断系统,UART具有极高的效率:【2】告诉我们 2个完全可编程的16C550-type UART, 带有独立的16x8发送(TX)以及16x12接收(RX)FIFO,可减轻CPU中断服务的负担 可编程的波特率产生器,并带有分频器 可编程设置FIFO长度,包括1字节深度的操作,以提供传统的双缓冲接口。 FIFO 触发水平可设为1/8, 1/4, 1/2, 3/4 和 7/8 标准异步通信位:开始位、停止位、奇偶位 无效起始位检测 行中止的产生和检测我们的小车电源做的比较不稳定,因为用电池供电,使得单片机的供电比较不稳定,而【2

6、】中介绍的LM3s811独特的功率控制特性,弥补了这一点: 片内低压差(LDO)稳压器,具有可编程的输出电压,用户可调节的范围为2.25V到2.75V 控制器的低功耗模式:睡眠模式和深度睡眠模式 外设的低功耗模式:软件控制单个外设的关断 LDO带有检测不可调整电压和自动复位的功能,可由用户控制使能 3.3V电源掉电检测,可通过中断或复位来报告3. 我们的小车因为有强大的工具,所以我们优秀。我们的小车配备了UART串口摄像头模块,该模块可以具有串口抓拍高清晰图像的功能。串口摄像头模组是通过串口获取JPG图像的模块,可以很容易集成到设备中去,让设备具有图像抓拍功能。另外小车还配备了红外避障模块,热

7、释红外模块,另有步进机模块可以实现模块的旋转,使红外避障,热释红外以及摄像头具有更大的视角。二、 可编程小车指令系统由于具有强大的硬件基础,笔者可以利用他专门的设计一款指令系统。后续更高的计算机系统通过串口利用这套指令系统操纵我们的小车。LM3s811热释红外步进机红外避障串口摄像头指令系统无线串口处理系统,在接下来的阶段,将在本系统上实现迷宫算法,并用他的指令来操纵可编程小车系统框图如左图所示。我们的指令系统融合了小车的功能,结构如下:XX XX XX XX (XX+)14 (XX+) FD (XX+) FD FF其中前两位是红外避障中断程序的地址,后两位是热释红外中断程序的地址,在后面是主

8、程序的开始。指令最多支持1000个字节。相信这些字节应该能放得下一个程序吧。指令系统如下:指令说明备注参数一参数二参数三00小车前进小车一直前进,直到遇到停止前进命令不填不填不填01小车停止前进不填不填不填02小车后退不填不填不填03小车停止后退不填不填不填04小车右转不填不填不填05小车停止右转不填不填不填06小车左转不填不填不填07小车停止左转不填不填不填08步进机运转程序等待步进电机前进一段时间继续执行转向(0左转,1右转)周期(步进次数)转速(1/n)09减速电机运转程序等待减速电机前进一段时间继续执行转向(0左转,1右转)周期(步进次数)转速(1/n)0A小车前进一会程序等待小车前进

9、一段时间继续执行时间(1/10s)不填不填0B小车后退一会时间(1/10s)不填不填0C小车右转一会时间(1/10s)不填不填0D小车左转一会时间(1/10s)不填不填0E速度设定数越大越慢的速度不填不填0F停止一切动作不填不填不填10停止程序不填不填不填11中断允许不填不填不填12中断禁止不填不填不填13拍照不填不填不填14直接跳转需要给出跳转的指令地址跳转地址不填不填15红外未发现障碍物则跳转需要给出跳转的指令地址跳转地址不填不填FD中断结束是一个标记,不代表任何动作FF程序结束是一个标记,不代表任何动作下面是一个合法的程序:00 0b 00 36 0e 10 11 00 14 00 06

10、 0e 01 12 01 08 00 0c 28 15 00 26 08 01 18 28 15 00 2e 08 00 0c 28 0b 14 14 00 0f 08 01 0c 28 0d 09 11 fd 08 00 0c 28 0c 0d 11 fd 0f 13 10 fd ff这段程序描述了一个自动避障的小车,利用了热释红外,但是对到死胡同时候小车的运行情况并未做一个完整的解答,下面的问题将集中在如何精确控制直流电机和如何解决死胡同方面。三、 直流电机的精确控制这里,主要讨论如何让小车精确的转弯。考虑到步进电机,在高速运转时会存在丢步现象,另外由于成本,我们最终选择了直流电机,作为小

11、车行进过程动力的主要来源。但是直流电机的功率一定的情况下,随着载重量的不同,直流电机的速度是不一样的。另一方面,在转弯时,小车存在摩擦阻力,这也是导致小车速度不能恒定的一个重要原因。此问题的解决,一种可以利用霍尔传感器,实时测定小车的速度v,给出调整。设 小车左轮速度为V左,右轮转速为V右则直走的时候,V左=V右=V。所以,对于特定的距离S,t=S/v对于转弯,要解决小车转的角度,转速=v/r。其中r=小车轮子的宽度通过这样关键的问题是求出v。但是在没有霍尔传感器时,实时速度V是较难以测量的,原因是直走和拐弯时摩擦阻力是大不相同的。我们试过在轮子上加一些减小摩擦的物质,只有这样才能减小力矩,但

12、具体减少了多少却又不得而知。在这里,我们只能理论估计一下。设滑动摩擦系数u,f=uN,则行进时所受摩擦力f=uN,功率P=Fv=UI,Pf=fv,然而小车匀速,因此v=UI/f=UI/u/mg,只要解决u,m,I,v即可解决。当然这只是初步理论,小车的摩擦力取决于很多因素,不仅是滑动摩擦力。更重要的是滚动摩擦力,即静摩擦力。我们在这里讨论滑动摩擦力,只因为他较简单。四、 迷宫算法在解决了如何让小车精确转弯的问题后,我们需要讨论另外一个问题,让小车行进于迷宫中。在讨论之前我们先讨论一下迷宫的搜索算法。1. 迷宫搜索算法迷宫搜索算法网上讨论的比较多,大致分为两类,一类基于堆栈的深度优先搜索,一类基

13、于队列的广度优先搜索,目前还有较为智能的A*算法。现分别说明如下:对于深度优先搜索:【3】有以下程序#include #include using namespace std;/路点struct Positionint row;int col;/迷宫,定义为5*5,外围是墙,中间部分可自行修改,2是起点,3是重点,1是障碍,0是可行走区域int maze55=1,1,1,1,1, 1,2,1,0,1, 1,0,1,1,1, 1,1,0,3,1, 1,1,1,1,1;/深度搜寻void Path(int entry_row,int entry_col,int exit_row,int exit_

14、col) int mark55;for(int i=0;i5;i+)/初始化标记表 for(int j=0;j5;j+) if(mazeij=1) markij=1; else markij=0; int next_row=0; /下一路点int next_col=0;int dir=0; /当前方向int row,col=0; /当前位置bool found = 0; /是否到终点Position position;position.row=entry_row;position.col=entry_col;stack stack1; /储存路点的栈stack1.push(position); /起点入栈stack1.push(position); /多入栈一次,是为了下面刚进入循环时会出栈while ( stack1.size()0 & !found ) /

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 社会民生

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号