智能小车设计实验指导书_智能小车设计指导书
智能小车设计实验指导书由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“智能小车设计指导书”。
智 能 小 车 设 计
实 验 指 导
王 恒 编
2011年4月
书
目录
目录.....................................................................................................I 实验阶段一
智能小车路径规划.......................................................1 实验阶段二
智能小车环境感知与控制...........................................6 实验阶段三
智能小车行为控制.....................................................12 附录: 库函数......................................................................................17
I 实验阶段一
智能小车路径规划
一.实验目的1.熟悉智能小车的硬件开发平台与软件开发环境。2.掌握智能小车路径规划程序设计。
二.实验内容
1.熟悉智能小车硬件设计。
2.学习智能小车的软件使用方法,学会软件的编写、调试与下载。3.编写第一个智能小车程序。4.编写智能小车移动程序。
5.编写复杂的智能小车路径规划程序。
三、实验设备及工具
硬件:能力风暴AS-UII开发平台,程序下载线。
软件:PC 机操作系统Win2000 或WinXP、VJC开发平台。
四、实验原理与步骤
智能小车实验平台配备有5种传感器,对环境的感知能力很强。执行器配备有二只高性能直流电机、一只喇叭和一只2*16 字符的液晶显示器。整个小车通过Motorola 公司8位单片机来进行控制。智能小车的硬件结构如下图所示:
2、让智能小车动起来
下面我们就尝试着让智能小车动起来。
在VJC1.5 开发版执行器模块库中有一专门控制智能小车“移动”的模块,这里我们就用
它来编写一个智能小车直线行走的程序。要求:先让智能小车以速度100 前进3 秒,再让智能小车 以速度-60 后退5 秒,再在原地以功率80 旋转1 秒。(如图4-2 所示)
示范操作步骤如下:
2.1 在 VJC1.5 开发版窗口中编写流程图
a)编写流程图:用鼠标将“执行器模块库”中的“移动”模块移到流程图生成区并与 主程序模块连接上;
b)设置时,右击“移动”流程图模块,在弹出框中输入移动速度为 100、时间为3; c)再用鼠标将“执行器模块库”中的“移动”模块移到流程图生成区并连接; d)在流程图的末端位置;
e)设置第二个“移动”流程图模块,点击右键在弹出框中输入移动速度为-60、时间 为5;
f)再将“执行器模块库”中的“转向”模块连接到程序中,点击右键进入设置对话框,分别设置速率和时间为:80 和1
g)再将“程序模块库”中的“任务结束”移入到流程图生成区并连接在程序的末尾。
drive(0,60);wait(0.2);} stop();} 能力风暴逆时针走约一米见方的正方形路径。其中wait(0.2)是能力风暴转90度弯所需要的 时间。该值和转弯速度以及能力风暴的电机有关,需要实际调整,此外地面的摩擦力也有影 响。利用wait()函数是控制电机工作的常用方法。
五、实验考核
编写智能小车程序,实现下列连续的路径规划:(1)智能小车走两遍1.5米直径的圆;
(2)原地停止1秒后,智能小车走三遍等边三角形(或等腰直角三角形);
(3)再次原地停止1秒后,智能小车走一遍8字形。(或9字形、D字母型、B字母型等,每组的考核指标由指导老师随机抽选)。
我们也可以点击“工具栏”中的“编辑JC 程序代码”按钮,切换到JC 代码界面,对 JC 代码进行修改。
1.2 保存程序
点击工具栏中的“保存”按钮,文件名输入:感光,按“确定”。此时,“感光.flw” 流程图程序文件已被保存。
1.3 程序下载
此时,能力风暴要处于开机状态,并串口连接线已与计算机连接。点击“工具”中的“下 载当前程序”按钮,就会出现下载对话框,等待出现“下载成功!”字样,说明程序已经下 载到能力风暴里了。
1.4 运行程序
将串口连接线取下,将智能小车带到安全的地方,按智能小车身上的“运行”键,在智能小车 的LCD 上就会显示出外界光线的平均值。
2、JC 程序的基本程序结构
下面是JC 程序中最常见的一种程序模式。
while(1)/*循环检测*/ { ir=ir_detector();/*对环境采样*/ if(ir>0)/*条件判断*/ { 语句1;/*做相应的处理*/ 语句2;} else {
试窗口一行编辑框中输入如下程序块:
{while(1){printf(“bump=%dn”,bumper());wait(0.1);}} 按回车,JC 能立即编译这一段程序并下载运行,LCD 上显示: bump=0(表示此时没有碰撞)
按左前碰撞环,LCD 上显示:bump=5。在其他方向施加碰撞,显示的值将不同。各个方 向发生碰撞时返回值对应关系如下:
无0,左前1,右前2,左后4,右后8
下面结合智能小车“台球”程序来学习碰撞传感器的使用。
void main(){ int bill_trans=0;int bill_rot=0;int bmpr=0;while(1)/*无限循环检测*/ { bmpr=bumper();/*检测碰撞传感器*/ if(bmpr!=0){ if(bmpr==0b0011)/*正前方发生碰撞*/ { bill_trans=-80;/*后退*/ bill_rot=0;} else if(bmpr==0b1100)/*正后方发生碰撞*/ { bill_trans=80;/*前进*/ bill_rot=0;} else if(bmpr & 0b0101)/*左侧发生碰撞*/ { 51 bill_trans=0;bill_rot=-80;drive(bill_trans,bill_rot);wait(0.5);/*顺时针转一个角度*/ bill_trans=80;/*前进*/ bill_rot=0;} else if(bmpr & 0b1010)/*右侧发生碰撞*/ { bill_trans=0;bill_rot=80;drive(bill_trans,bill_rot);wait(0.5);/*逆时针转一个角度*/ bill_trans=80;/*前进*/
void main(){ int ir;while(1){ ir=ir_detector();if(ir!=0)/*判断有否障碍*/ { motor(-80,-40);/*执行语句,即倒退0.5秒*/ wait(0.5);} 26 motor(100,0);/*前进*/ } } 运行此程序可知当前方有障碍时,能力风暴智能智能小车有反应。
五、实验考核
编写智能小车跟随前方物体的程序,实现下列要求:
智能小车可以跟随前方移动的人或物;如果撞上前方的物体,就停一停;如果前方红外系统探测范围内没有物体,它就停下来。
六、思考题
1、实验中碰到哪些故障或问题?解决方法是怎样的?将实验中碰到的问题及解决方法写入实验报告中。
2、如果要对智能小车双轮的转速实现带反馈的控制,需要在硬件上添加什么部件?为什么?
1bill_rot=0;} else if(bmpr & 0b0101)/*左侧发生碰撞*/ { bill_trans=0;bill_rot=-80;wait(0.5);/*顺时针转一个角度*/ bill_trans=80;/*前进*/ bill_rot=0;} else if(bmpr & 0b1010)/*右侧发生碰撞*/ { bill_trans=0;bill_rot=80;wait(0.5);/*逆时针转一个角度*/ bill_trans=80;/*前进*/ bill_rot=0;} } } 54 } void billiards_drive(){ while(1)drive(bill_trans,bill_rot);/*驱动电机*/ } void main(){ start_proce(billiards_drive());/*创建电机驱动进程*/ start_proce(billiards());/*创建碰撞处理进程*/ } “台球”改成多进程后,运行的效果没变,但结构已经完全不一样了。电机驱动进程 billiards_drive()专门设置电机速度,碰撞处理进程billiards()判断碰撞并改变电机速 度。两个进程之间通过全局变量bill_trans 和bill_rot 进行通讯。能力风暴的操作系统自 动调度两个进程,给它们分配时间片。从执行效果来讲,就相当于这两个进程并列运行。这 样的结构非常方便增加新的进程,同时处理更多的外部信息。
2、进程间通信
我们给前面的程序增加一个红外避障进程,改变它的行为,而其它部分不需要做大的变动。改动后的程序如下。
int bill_trans=0;int bill_rot=0;int bmpr=0;int forward=0;
3{ bill_trans=20;bill_rot=80;/*逆时针转*/ } else if(ir==1)/*左侧有障碍,向右绕*/ { bill_trans=20;bill_rot=-80;/*顺时针转*/ } else if(ir==0)/*前方没有障碍,恢复直行*/ { bill_trans=80;bill_rot=0;}} wait(0.1);}} 56 } void billiards_drive(){ while(1){ running = bill_trans;/*能力风暴正在运动*/ drive(bill_trans,bill_rot);/*驱动电机*/ } } void main(){ start_proce(billiards_drive());/*创建电机驱动进程*/ start_proce(billiards_ir());/*创建避障进程*/ start_proce(billiards());/*创建碰撞处理进程*/ } 改动以后的程序增加了避开侧面障碍物的行为。比较一下,增加的代码除了红外避障进 程外,就是用于进程之间的通讯。进程间的通讯和同步是多进程编程的难点,不解决好这个 问题,多进程程序可能会产生一些奇怪的行为。在这个程序里,由于碰撞处理进程和红外避 障进程都要修改设置电机速度的两个全局变量(bill_trans,bill_rot),这是进程间发生冲 突的根源。如果不加以限制,两个进程同时修改电机速度,必然会出现一片混乱,能力风暴 下一步的运动方向将无法预知。
本程序中把bmpr 改为全局变量,通过bmpr 来划分两个进程生效的时间。即发生碰撞时,只有碰撞处理进程可以修改电机速度;在其他时间里碰撞处理进程只是在不断检测碰撞传感 器,只有红外避障进程才有可能修改电机速度。我们可以看到,在本程序里碰撞处理进程的 优先级高于红外避障进程。增加的另两个全局变量是出于红外避障行为逻辑的需要。全局变 量running 是能力风暴开始运动的标志,红外避障进程要等待这一事件发生后才能起作用。forward 反映能力风暴当前运动方向,用于避免红外避障进程在后退时候处理前方障碍。
3、智能小车的行为控制
借助于多进程功能,可以方便实施目前处于研究前沿的行为控制方法。
行为控制的基本思想是建构行为能力,而非功能模块。首先把要设计机器人的行为特点描述下来,表达成基本的行为构成,如要做一只模拟机器飞蛾的智能小车,一边到处找食物,一边向较
附录: 库函数
1.执行器输出
void stop()关闭左右两个电机,停止运动;
void stop_motor(int m)关闭电机m,0为所有电机,1为左电机, 2为右电机, 3为扩展电机; void motor(int m, int speed)以功率级别speed(-100到100)启动电机m(1为左电机, 2为右电机, 3 为扩展电机);
void drive(int move, int turn)同时设定两个电机的速度,move 为平移速度,turn 为旋转速度。
2.传感器输入
int photo()光敏传感器检测。photo(1)为检测左光敏, photo(2)为检测右光敏,返回值为0~ 255的数字量;
int microphone()声音传感器检测。返回值为0~255的数字量;
int ir_detector()红外传感器检测。返回值的意义:0=> 没有障碍, 1=>左边有障碍, 2=>右边有 障碍, 4=>前方有障碍;
int bumper()碰撞传感器检测。返回值的意义:0=>无碰撞,1=>左前受碰,2=>右前受碰,4=> 左后受碰,8=>右后受碰。
int rotation(int index)光电编码器脉冲累计读数,rotation(1)为检测左光电编码器,rotation(2)为 检测右光电编码器。
int digitalport(int channel)读数字口上传感器的值。channel的范围是0~7。返回值:从传感器数字硬 件读到的值为零伏或逻辑零时,返回1;否则返回0 int analogport(int channel)读模拟口上传感器的值。channel的范围是0~7。返回值是0到255间的整数 值
int encoder(int index)读取光电编码器的当前状态。0为低电平/1为高电平(分别对应光栅的通光缺口 /遮光齿)。
3.时间
void wait(float sec)延时等于或稍大于指定的sec时间(秒)后再执行后面的语句。sec是一个浮点数 void resettime()将系统时间复位清零
float seconds()以秒的形式返回系统时间,它是一个浮点数,精度为0.001秒
4.声音
void beep()产生一段0.3秒500赫兹的音频信号。发声结束后返回。
void tone(float frequency, float length)产生一个length秒长音调为frequency赫兹的音频信号。
5.电池
int battery()检测电池电量,返回值为0~255的数字量;
6.其他函数
void asosreset()软件复位函数。与按下能力风暴的复位开关的效果一样,ASOS操作系统重启动,程序停止运行。
int runbutton()读运行键状态。运行键在能力风暴智能智能小车的头顶上,可以在程序中使用该 按钮。返回值:0没按,1按下 int abs(int val)取整数val的绝对值 int max(int x, int y)求两个整数的最大值 int min(int a, int b)求两个整数的最小值 float rand()返回0~1之间的随机浮点数
int random(int scale)返回0~scale之间的随机整数
文章来源:EDN电子设计技术网站作者:谭永宏 张辉【提要】本文对目标识别与跟踪技术进行了分析,在此基础上结合智能小车目标跟踪系统的开发,详细讨论了特定目标跟踪系统的具体实现......
2016—2017学年第二学期期末考试《单片机原理及应用*》实践考核项目设计说明书专业:学号:电子科学与技术 20160060156 姓名: 张一鸣2017年 6 月14日考核项目及要求项目一:电机......
新型便携式井下巡迹探测小车作者:黄浩 彭江摘要80C51 单片机是一款八位单片机,他的易用性和多功能性受到了广大使用者的好评。这里介绍的是如何使用8051系列单片机来实现武汉......
机器人控制技术实验设计报告书题目:基于STC89C52的智能小车的设计 姓名:李如发 学号:073321032 专业:电气工程及其自动化 指导老师:李东京 设计时间:2010年 6 月目录1.引 言 ...........
智能小车设计报告魏旭峰、孔凡明、陈梦洋(河北科技大学 电气信息学院 ) 摘要:AT89S52单片机是一款八位单片机,他的易用性和多功能性受到了广大使用者的好评。该设计是结合科......
