发表日期:2019-05-30 16:59:05文章编辑:信息管理员浏览次数: 标签:
竞速赛要求参赛者在最短的时间内把所有的目标物从起点正确搬运到指定目标地点,记录任务完成所用的时间。参赛者应具备精确控制机器人和调节传感器的能力,掌握编程和动力学原理等知识,灵活选择行驶路径并完成任务。机器人由程序驱动自动行驶。
项目说明
组队人员:该项目是面向小学、初中、高中学生的比赛项目,要求每队一名参赛选手和一名教练员;
机器人制作:参赛队伍的机器人需要现场制作,并且严格控制机器人的规格大小,裁判会将制作好的机器人在现场进行测量仪测量,机器人规格长X宽为22cmX18cm,高度无限制;
机器人任务结构:为方便场地任务完成,机器人可以装上 上推、抓取、覆盖、装载的结构物;
场地说明:赛场场地是有两块160cmX120cm的板块拼接而成,如图一所示:
图一
赛场场地有八种竞赛图可供参考,如图二所示:
图二
任务说明:首先机器人要从现场裁判制定的起点出发,沿着黑线停在指定的终点位置,如图一中的两个黑色框架即为终点和起点位置(注意:机器人在通过起点和到达终点均不能触碰到框架),其次,在机器人行驶的路线中有若干个目标物、障碍物和印有“X”标记的陷阱,目标物需要搬运到裁判指定的区域即可得分,正确搬运一个得一分(注意:一次只能搬运一个目标物,搬运好的目标物机器人可以随意触碰,不会记为犯规,但是机器人把搬运好的目标物碰离目标区域会失去得分),目标物规格如下图三所示:
图三
黄色目标物为6cmX6cmX6cm的大立方体,蓝色目标物为3cmX3cmX3cm的小立方体;障碍物在赛场上只有物理上的制约,没有其他扣分,障碍物如图四所示:
图四
它的规格为20cmX20cmX20cm的立方体;赛场上的“X”陷阱位置是不能穿越的地点;
比赛流程及排名设置:比赛前的准备时间为两个小时,参赛选手需要在两个小时内完成机器人制作和程序设计;比赛时间为两分钟,两分钟内完成任务的得分即为选手的比赛成绩;排名优先级为目标任务成功数量>有无时间记录>是否成功停在终点线位置>时间记录比较
详细规则介绍可参考IRO官网http://www.irochina.com/和亮宁机器人官网http://www.robedu.cn
竞赛车型设计
此项目由于需要进行目标物的搬运任务因此需要给我们机器人加装一个机械爪,考虑到此项目对车体规格限制在了22cmX18cm以内,所以我们需要从新对车型进行改装,具体方案如下:
机械手安装,如图五所示:
图五
图五红框位置为机械手180度伺服电机的安装位,每个电机只需要一块2X4的树脂板和两根1.5cm的铜柱即可固定;
巡线传感器安装板改装,如图六所示:
图六
先找一块传感器安装板在板子前端固定两个白色从动轮,在图六中的红色框和绿色框中分别固定一块2X8的树脂板和一块3X8的树脂板,并装上合适高度的铜柱,安装板改装后将其装载车体主板中间孔的位置,如图七所示:
图七
安装后,可以把电池一并固定在其中,并且在主板上方固定好触碰开关即可完成车型的改装;
参考程序
由于该项目的说明中,有时间记录的比较,为了在最短时间内完成,我们巡线程序需要把巡线速度尽可能加快,程序示例如下:
#include <LNDZ.h>
int n, ll, l, m, r, rr,;
servo sf1;
servo sf2;
void check()
{
ll = AR(4) < 123;
l = AR(2) < 321;
m = AR(1) < 233;
r = AR(3) < 132;
rr = AR(5) <121;
n = ll + l + m + r + rr;
}
void find()//常规速度巡线子函数
{
if (ll == 0) motor(-35, 35);
else if (l == 0) motor(0, 35);
else if (m == 0) motor(50, 55);
else if (r == 0) motor(35, 0);
else if (rr == 0) motor(35, -35);
}
void find1()//快速巡线子函数
{
if (ll == 0) motor(-40, 40);
else if (l == 0) motor(0, 50);
else if (m == 0) motor(70, 78);
else if (r == 0) motor(50, 0);
else if (rr == 0) motor(40, -40);
}
void init()
{
sf1.attach(2);
sf2.attach(3);
sf1.write(90);
sf2.write(90);//机械手初始化状态
DI(31);
while (DR(31) == 1) {}
beep(300);
motor(40, 45);
delay(200);
while (1)
{
check();
find();
if (n < 3)
{
motor(0, 0);
beep(100);
motor(-40, 40);
delay(300);
break;
}
}
while (2)
{
check();
find();
if (n < 3|ll+l==0)
{
motor(0, 0);
beep(100);
sf1.write(55);
sf2.write(125);
delay(500);//机械手抓取
motor(50, -60);
delay(500);
break;
}
}
while (3)
{
check();
find();
if (n < 3)
{
motor(0, 0);
beep(100);
break;
}
}