【S118】迷宫机器人
作品说明 |
作者:喻勤勤 许丹妮 焦林峰 程章磊
单位:江汉大学
指导老师:徐伟 侍中楼
1. 综述
机器人竞赛是一项综合运用项目,对自身的思维以及所学的知识运用有较高的要求,并且需要灵活的去解决所遇到的问题,是培养人才,锻炼人才的一个很好的平台,同样也是展现高科技的平台,而这种比赛也推动着产业化的发展。而迷宫机器人是移动机器人路径规划算法的典型应用,在国际上迷宫机器人一直是控制领域和计算机领域的研究热点问题。早期有向左(右)算法,在迷宫中,机器人一直沿着迷宫隔栅走,可以顺利走出迷宫,但对于有孤岛的迷宫,这种算法就容易陷入死循环,后来又有流水法即广度优先算法等等。
作品说明
迷宫机器人
2. 市场调研及市场前景说明
机器人产业在二十一世纪将成为和汽车、电脑并驾齐驱的主干产业。从庞大的工业机器人到微观的纳米机器人,机器人正在日益向我们走近,在我们的生产生活以及其他各种行业都无处不见,逐渐成为人类最亲密的朋友。机器人技术和产业化娱乐化在我国具有一定的现实基础和广阔的市场前景。迷宫机器人是智能移动机器人路径规划算法的典型应用,在国际上迷宫机器人一直都是控制领域和计算机领域的研究热点问题。迷宫机器人的硬件是越来越先进,算法也越来越多,而一般都是用向左向右算法,机器人若是一直沿着迷宫墙壁不重复地走,就可以顺利走出。
根据迷宫机器人走迷宫的实际特点,本作品着重研究迷宫机器人的传感器系统和控制系统,同时我们对机器人走迷宫的一些算法也进行了研究。本项目设计的迷宫机器人具有红外避障传感器和轨迹识别传感器,能对迷宫的立体墙壁进行检测,其中红外传感器有三个分别对机器人左前右三个方向的迷宫壁进行检测,而轨迹识别传感器则用来检测机器人是否到达出口而便让机器人能够停下来,两者相互配合进行机器人的角度的调整和终点检测,以防止机器人在迷宫中迷路和不能停下来。在往后的改进中,我认为此机器人可对陌生地段实施勘测功能,然后得出一条最佳路径,方便于野外救援等一系列活动。
3. 功能介绍
本项目设计的“迷宫小车”是让小车自主地从迷宫入口走到出口,在这一过程中分为小车运转的以下四种情况以及传感器的工作情况:
① 右转弯:小车由两轮单独驱动的三轮式结构构成,标准舵机可左右各旋转90度,可以使车轮灵活旋转。即小车右偏时,左边轮子前进,右边轮子后退,使小车达到右转弯目的。
② 左转弯:小车由两轮单独驱动的三轮式结构构成,标准舵机可左右各旋转90度,可以使车轮灵活旋转。即小车左偏时,右边轮子前进,左边轮子后退,使小车达到左转弯目的。
③ 前进:小车由两轮单独驱动的三轮式结构构成,且中间搭载电池,降低重心,运动结构稳定,不会左右偏移,可以达到小车笔直前进目的。
④ 掉头:当小车的三个红外传感器都识别出有障碍时,就转至后方继续用左手定则判断。
⑤ 判断地形:小车使用三个红外传感器和一个黑标传感器。其中三个红外传感器分别对左前右三个方向的迷宫壁进行检测,而黑标传感器则是用来检测是否到达迷宫终点,在迷宫终点我们会在地上贴上黑色胶带,方便小车上的黑标传感器识别,判断是否到达终点。
4. 制作过程
4.1 结构设计
本项目设计的“迷宫机器人”主体结构由两片“J04 大平板”叠加连接,增强结构的稳定性,保持结构重心。由于只使用了两片“平板”,在重量上也较一般的机构相对轻一些。迷宫小车的前轮为万向轮,后两轮单独驱动的三轮式结构,控制简单,运动灵活,能够方便地实现前进、掉头、转弯等动作。
本作品使用了三个红外和一个黑标传感器,它能对迷宫的立体环境进行检测,三个红外传感器分别对机器人左前右三个方向的迷宫壁进行检测,以“左手法则”为例,如果左手摸着墙壁,向前走;如果左手摸不到墙壁,就左转;若左手摸着墙壁,而前方有障碍则向右转。若进入一个死胡同,则进入掉头命令,继续使用左手定则。当识别出地上有黑线时则表明已至终点,并使小车停下。本次我们两平板中间的是电池,给两个舵机提供动能,标准舵机可左右各旋转90度。动力大、稳定性高,而在平板上面的是本作品使用的控制板是BSAR控制板和BIGFISH扩展板。
控制板示意图
Basra 是一款基于 Arduino 开发源方案设计的一款开发板,可以通过各种各样的传感器来感知环境,也可以控制灯光、马达等其他的装置来反馈、影响外部所处环境。板子上所带有的微控制器可以在 Ardunio、eclipse、Visual Studio 等 IDE 中通过 c/c++语言来编写程序,编译成二进制文件,烧录进微控制器当中。Basra 的处理器核心是 ATmega328, 同时具有 14 路数字输入/输出口(其中 6 路可作为 PWM 输出),6 路模拟输入,一个 16MHz晶体振荡器,一个 USB 口,一个电源插座,一个 ICSP header 和一个复位按钮。
主 CPU 采用 AVR ATMEGA328 型控制芯片,支持 C 语言编程方式;该系统的硬件电路主要包括:电源电路、串口通信电路、MCU 基本电路、烧写接口、显示模块、AD/DA 转换模块、输入模块、IIC 存储模块等。。控制板尺寸不超过 60*60mm,非常便于安装。CPU 硬件软件全部开放,除能完成对本次我们设计的全地形机器人的控制外,还能使用本实验板完成单片机所有基础实验。供电范围宽泛,大约在 5v~9v 的电压,干电池或者锂电池都适用。编程器集成在控制板上,通过 USB 大小口的方式与电脑连接,下载程序。开放全部底层源代码。控制板含 3A6V 的稳压芯片,可为舵机提供 6v 额定电压。板子上所搭载的一片直流电机驱动芯片 FAN8100MTC,可同时驱动两个直流电机。板子上所搭载的 USB 驱动芯片及自动复位电路,可以在烧录程序时无需手动复位。2 个 2*5 的杜邦座扩展坞,方便无线模块、OLED、蓝牙等扩展模块直插连接。
BigFish扩展板
通过BigFish扩展板连接的电路可靠稳定,上面还扩展了伺服电机接口、8*8Led 点阵、直流电机驱动以及一个通用扩展接口,可以说是Arduino控制板的必备配件。
4.2 编程过程
本次编程我们所使用的软件为Arduino,是编写代码及编译代码的软件,同时我们将写好的编译代码上传到小车的控制板中,其编写及编译的基本流程图如下所示:
4.3 程序源代码
const int leftsensor=14; const int frontsensor=19; const int blacksensor=17; const int leftmotorpin1=5; const int leftmotorpin2=6; const int rightmotorpin1=9; const int rightmotorpin2=10; void setup() { pinMode(leftsensor,INPUT); pinMode(frontsensor,INPUT); pinMode(blacksensor,INPUT); pinMode(leftmotorpin1,OUTPUT); pinMode(leftmotorpin2,OUTPUT); pinMode(rightmotorpin1,OUTPUT); pinMode(rightmotorpin2,OUTPUT); } void loop() { if(digitalRead(blacksensor)){ if(!digitalRead(leftsensor) && !digitalRead(frontsensor)){ while(!digitalRead(leftsensor) && !digitalRead(frontsensor)){ turnleft(); } } if(!digitalRead(leftsensor) && digitalRead(frontsensor)){ while(!digitalRead(leftsensor) && digitalRead(frontsensor)){ turnright(); } } if(digitalRead(leftsensor) && digitalRead(frontsensor)){ while(digitalRead(leftsensor) && digitalRead(frontsensor)){ turnright(); } } if(digitalRead(leftsensor) && !digitalRead(frontsensor)){ while(digitalRead(leftsensor) && !digitalRead(frontsensor)){ forward(); } } } else{ stop(); } delay(20); } void forward(){ digitalWrite(leftmotorpin1,1); digitalWrite(leftmotorpin2,0); digitalWrite(rightmotorpin1,1); digitalWrite(rightmotorpin2,0); } void turnleft(){ digitalWrite(leftmotorpin1,0); digitalWrite(leftmotorpin2,1); digitalWrite(rightmotorpin1,1); digitalWrite(rightmotorpin2,0); } void turnright(){ digitalWrite(leftmotorpin1,1); digitalWrite(leftmotorpin2,0); digitalWrite(rightmotorpin1,0); digitalWrite(rightmotorpin2,1); } void stop(){ digitalWrite(leftmotorpin1,0); digitalWrite(leftmotorpin2,0); digitalWrite(rightmotorpin1,0); digitalWrite(rightmotorpin2,0); } |
* 本项目未获得作者开源授权,无法提供资料下载。
|