人人范文网 范文大全

智能小车设计实验指导书

发布时间:2020-03-03 03:50:13 来源:范文大全 收藏本文 下载本文 手机版

智 能 小 车 设 计

实 验 指 导

王 恒 编

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位单片机来进行控制。智能小车的硬件结构如下图所示:

- 1

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) 再将“程序模块库”中的“任务结束”移入到流程图生成区并连接在程序的末尾。

- 3drive(0,60); wait(0.2); } stop(); } 能力风暴逆时针走约一米见方的正方形路径。其中wait(0.2)是能力风暴转90度弯所需要的 时间。该值和转弯速度以及能力风暴的电机有关,需要实际调整,此外地面的摩擦力也有影 响。利用wait()函数是控制电机工作的常用方法。

五、实验考核

编写智能小车程序,实现下列连续的路径规划: (1) 智能小车走两遍1.5米直径的圆;

(2) 原地停止1秒后,智能小车走三遍等边三角形(或等腰直角三角形);

(3) 再次原地停止1秒后,智能小车走一遍8字形。(或9字形、D字母型、B字母型等,每组的考核指标由指导老师随机抽选)。

- 5

我们也可以点击“工具栏”中的“编辑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 {

- 7试窗口一行编辑框中输入如下程序块:

{while(1) {printf(\"bump=%d\\n\",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; /*前进*/

- 9void 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、如果要对智能小车双轮的转速实现带反馈的控制,需要在硬件上添加什么部件?为什么?

- 11bill_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;

- 13{ 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、智能小车的行为控制

借助于多进程功能,可以方便实施目前处于研究前沿的行为控制方法。

行为控制的基本思想是建构行为能力,而非功能模块。首先把要设计机器人的行为特点描述下来,表达成基本的行为构成,如要做一只模拟机器飞蛾的智能小车,一边到处找食物,一边向较

- 15

附录: 库函数

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的数字量;

116 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之间的随机整数

- 17 -

智能小车设计

智能小车设计

智能小车设计

智能小车设计报告

智能小车设计报告

智能小车的自动寻迹实验

电磁智能小车设计报告

智能小车设计文献综述

智能循迹小车___设计报告

智能小车课程设计

智能小车设计实验指导书
《智能小车设计实验指导书.doc》
将本文的Word文档下载到电脑,方便编辑。
推荐度:
点击下载文档
点击下载本文文档