线迷宫小车算法(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月
正在阅读:
线迷宫小车算法(1)08-07
第二讲应激与健康05-21
药店GSP及药品知识学习材料汇总03-26
DSP汇编编程及应用举例03-13
河北政法职业学院教学文件计算机辅助设计典型案例绘制指导03-08
部编版小学二年级语文下册句子专项训练05-01
汉语拼音a-ü b-f(教案)05-26
关于冬天的好词好句03-10
专题10:综合性学习03-08
- 教学能力大赛决赛获奖-教学实施报告-(完整图文版)
- 互联网+数据中心行业分析报告
- 2017上海杨浦区高三一模数学试题及答案
- 招商部差旅接待管理制度(4-25)
- 学生游玩安全注意事项
- 学生信息管理系统(文档模板供参考)
- 叉车门架有限元分析及系统设计
- 2014帮助残疾人志愿者服务情况记录
- 叶绿体中色素的提取和分离实验
- 中国食物成分表2020年最新权威完整改进版
- 推动国土资源领域生态文明建设
- 给水管道冲洗和消毒记录
- 计算机软件专业自我评价
- 高中数学必修1-5知识点归纳
- 2018-2022年中国第五代移动通信技术(5G)产业深度分析及发展前景研究报告发展趋势(目录)
- 生产车间巡查制度
- 2018版中国光热发电行业深度研究报告目录
- (通用)2019年中考数学总复习 第一章 第四节 数的开方与二次根式课件
- 2017_2018学年高中语文第二单元第4课说数课件粤教版
- 上市新药Lumateperone(卢美哌隆)合成检索总结报告
- 小车
- 迷宫
- 算法
- 2016年蛋糕行业现状及发展趋势分析
- 中国未来三十年经济发展的动力
- 房屋建筑工程和市政基础设施工程-勘察文件质量检查报告
- 个人网上银行操作手册范本
- 工程拨款申请单 确认单 审批单 验收单 空白模板 打印50份
- 2016-2022年中国红酒市场运营态势报告
- 【资格考试】2019最新整理-司考经济法和商法试题评析
- 【八年级地理教案】第二章第三节 河流
- 第一节_人体对外界环境的感知──眼和视觉
- 优化方案2016届高考政治大一轮复习第三单元单元优化总结(精)
- 房地产项目春节营销方案
- 医学英语unit1 PPT
- 某机械厂10KV降压变电所电气设计
- 建设工程法规及相关知识_模拟试题二_2012年版
- 新苏教版三年级小学语文上册期中试题(全)
- 10风险管理 Microsoft PowerPoint 演示文稿
- 第12章 财务报表
- 想做产品经理但没经验,如何写求职
- 自考马克思主义基本原理概论选择题 重点
- 【人教版九年级物理下册】 第二十章 电与磁 第2节 电生磁PPT精品课件