线迷宫小车算法(1)

更新时间:2023-08-07 03:56:01 阅读量: 实用文档 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

线迷宫小车算法(1)center 311 lab2智能小车设计方案

**********************迷宫算法设计*********************

路径主要有如下可能

通过分析我们可以将迷宫线做如下分析

我们将迷宫的入口和出口用两条相互闭合的线连接起来,红线和黑线分别代表小车运行时的左侧和右侧,只要小车沿着其中任何条线来行使,小车定能走出迷宫。

我们假设小车沿着左侧红线行使。并在到达岔路口时做如下判断:

注:B代表 Back 返回

A 代表 Advance 前进

R 代表 Right 右转

L 代表 Left 左转

线迷宫小车算法(1)center 311 lab2智能小车设计方案

有图可以看出 沿着左侧红线行走时 遇到第一个“左前路口”记录“L”,遇到“死胡同路口”时做了一个180度转弯 记录“B”继续行走遇到第三个路口“丁字路口”记录“L”

当遇到死胡同时说明此岔路口为错误路线记录为“LBL”那么当遇到这个路口时我们可以用“A”来代替。“LBL”=“A”

小车继续行走遇到“前右路口”继续前进记录“A”,遇到死胡同记录“B”又遇到“左前路口”记录“L”,小车遇到了“死胡同”说明小车走错了路线记录了如下数据:“ABL”

可以看出小车到此路口应右转所以“ABL”=“R”。

综上分析小车沿着红线行走时遇到岔路口记录一次数据,遇到“死胡同”说明走错路线,那么同上每次遇到“死胡同”时处理一次数据

注:小车在没有遇到岔路时不记录数据 例如 “左弯道” 和“右弯道”

结果:“LBL ABL LBL LBL L”=“A R A A L”

分析结果完全正确,看我们只是简单的做了个“寻线”神秘的迷宫小车算法就这样被我们破解了,那么我们换一个较复杂的迷宫测试是否正确:

线迷宫小车算法(1)center 311 lab2智能小车设计方案

小车沿左侧线行驶遇到岔路口记录数据

原数据“:LBL A ABL LBL BL L L LBA A LBL BL BL LBL L L ABL ” 处理1:“A A R A BL L L R A A BL BL A L L R ” 处理2:“A A R R L L R A R BL A L L R ” 处理3:“A A R R L L R A B A L L R ” 处理4:“A A R R L L R B L L R ” 处理5:“A A R R L L B L R ” 处理6:“A A R R L A R ” 每次遇到B 做一次判断 处理6为最终结果和上图比较小车按照“AARRLA R”行驶可以找到终点。

注:处理2:R BL= B

处理3:A B A= B

处理5:L B L= A

总结:迷宫可能有如下9种组合结果:

"LBL=A","LBA=R","ABL=R","ABA=B","ABR=L","RBA=L","RBR=A","RBL=B","LBR=B"

/******附:最优路线计算函数**********/

unsigned char idata road[70];

char* str_text(/*char * road*/){

uchar i,k,f=1,f2=1;//i用于计数 f内层标记 f2外层标记

uchar *j,*j2; //int占用2个字节空间 char占用一个 节约内存

uchar yy[60]; //yy数组用于中介 临时存放数据

do{

for(i=0;i<9;i++,f=1)

{

do { j=strstr(road,aa[i]); //选出匹配字符串 if(j!=0) { j2=j+3;

strcpy(yy,j2); //截取后面字符串并保留

*j='\0'; //截取前面字符串

strcat(road,&a[i][0]); //在前面字符串后连接对应项

strcat(road,yy); //将后面字符串重新连接

}

else{

f=0;//没有匹配项 标记清零 } }while(f==1);//判断本次匹配替换是否结束,如果否 继续匹配并替换

线迷宫小车算法(1)center 311 lab2智能小车设计方案

} //for循环结束

//*******校验

for(k=0;k<9;k++)

{

j=strstr(road,aa[k]);

if(j!=0)

{

f2=1;break; //判断是否仍然有匹配项目,如果有重新执行内层do~while语句 }else{f2=0;}

}//校验for结束

}while(f2==1); //外层do while 用于校验

return road; //road首地址

//printf("%s\n",turn2);scanf("%s",c);

}

**************************传感器与软件设计********************************* 传感器设计一:

等腰梯形设计:

我们采用了五个传感器

前端三个为寻线,左右两个为路口检测

线迷宫小车算法(1)center 311 lab2智能小车设计方案

用三个传感器中间的在线上两侧分别骑线这样便于快速校正小车位置,而且中间传感器还用于90度转弯时小车头部位置的确定。

寻线程序:

sbit P2_0=P2^0; //右侧传感器

sbit P2_1=P2^1; //中右传感器

sbit P2_2=P2^2; //中间传感器

sbit P2_3=P2^3 //中间传感器

sbit P2_4=P2^4; //左侧传感器

turn1=P2|0xE0; //P2用于检测路线 0xE0屏蔽高位

switch(turn1)

{//寻线模块//

case 0xE4: advance(1) ;break; //11100100B 前进

case 0xEC: balance(1,70,1,90);break; //11101100微右偏,轻微右转

case 0xE8: balance(1,30,1,90);break; //11101000重右偏,大幅度右转

case 0xE6: balance(1,90,1,70);break; //11100110微左偏,轻微左转 case 0xE2: balance(1,90,1,30);break; //11100010重左偏,大幅度左转

}

Advance();为前进函数

Balance();为左右轮速度控制函数,1为前进,70,90为pwm小车速度值 (详见:源程序)

岔路口检测程序:

我们默认小车检测到岔路口时转弯优先级为:“左”—“中”—“右”

if(P2_4==1) //遇到左侧路口

{

if(P2_1==1|| P2_2==1 ||P2_3==1) // 前端有一个检测到路线 视为前方有路 此处为岔路口

{

if(logo){ //logo==1 读取最优路径

turn(*p++,medium);

}else

{

turn('L',medium); //左转

crossing('L'); //记录数据

}

}

}

Else 后运行了两个函数 分别turn('L',medium); //左转,medium为中速,左侧轮停止右侧轮中速crossing('L');//向字符串记录数据‘L’

其他请况留给读者。

传感器布局二:

一字型设计

线迷宫小车算法(1)center 311 lab2智能小车设计方案

分析一字型传感器,当检测到岔路时需要调用“延时函数”让小车微进一段距离,再次检测前端传感器如果检测到“黑线”说明此为岔路口,并调用转弯函数左轮后退右轮前进

达到90度转弯的效果,那么怎么样小车达到90度的转弯效果呢?主要有两种方式 1,调用90度延时函数2.仅当传感器P2_3==1&&P2_2==1时判断左转90度结束,我们采用了第 二种方式。

程序流程图:

我们只列举了两种类型的传感器布局方式另外还有 “U”字形和三角形等,留给读者设计。 比较以上两种传感器的布局设计

梯形设计有程序简单 误差小等优点,但是硬件焊接较麻烦。

一字型设计程序复杂 硬件焊接较容易 直角转弯效果较好

我们选择了一字型作为本次的设计方案。

线迷宫小车算法(1)center 311 lab2智能小车设计方案

/***********可调脉宽调制双侧轮pwm调速软件设计

*****************/

/********pwm中断调速定义*************/

void pwm()

{

TMOD=0x02; /* 设定T0的工作模式为2,重加载模式 */

TH0=0x9B; /* 装入定时器的初值 晶振20MHZ 每100us中断一次10次(即1MS)为1个PWM周期*/

TL0=0x9B;

EA=1; /* 开总中断 */

ET0=1; /* 定时器0允许中断 */

TR0=1; /* 启动定时器0 */

}

/*****定时中断函数2*****/

void timer0() interrupt 1 /* T0中断服务程序 */

{

} if(t==0) /* 1个PWM周期完成后才会接受新数值 */ { tmp1=m1; tmp2=m2; } if(t<tmp1) en1=1; else en1=0; /* 产生电机1的PWM信号 */ if(t<tmp2) en2=1; else en2=0; /* 产生电机2的PWM信号 */ t++; if(t>=100) t=0; /* 1个PWM信号由10次中断产生 */

/************寻线与校正处理函数********/

void balance(uchar indexL, char speedL,uchar indexR,char speedR) //balance

{

//左侧电机处理 if(indexL==1) /* 电机1的处理 */ { if(speedL>=-100 && speedL<=100)

线迷宫小车算法(1)center 311 lab2智能小车设计方案

{ m1=abs(speedL); /* 取速度的绝对值 */ if(speedL<0) /* 速度值为负则反转 */ { s1=1;s2=0; } else /* 不为负数则正转 */ { s1=0;s2=1; } } }else{/*=0时左侧电机停止运行*/ s1=1;s2=1; }

//右侧电机处理

if(indexR==1) /* 电机2的处理 */

{

if(speedR>=-100&&speedR<=100)

{

} m2=abs(speedR); /* 电机2的速度控制 */ } if(speedR<0) /* 电机2的方向控制 */ { s3=1;s4=0; } else { s3=0;s4=1; } }else { /*=0右侧电机停止*/ s3=1;s4=1; }

邮箱:center311@http://www.77cn.com.cn

参考文献:《C语言程序设计》中国铁道出版社 作者:恰汗·合木尔 单洪森 所用软件:keil uVision 2 (程序编译与hex文件)

Progisp (程序下载)

AutoCAD 2008 简体中文版(迷宫与传感器布局分析)

Vc 6 (最优路径字符串处理编写与测试)

Protel 99 SE (电路原理图设计)

视频:http://www.77cn.com.cn/player.php/sid/XMTgzNDkxMzA4/v.swf

作者:钱士森

自动化系08级

时间:2010年6月

本文来源:https://www.bwwdw.com/article/58cj.html

Top