水中机器鱼大赛技术文档.docx
《水中机器鱼大赛技术文档.docx》由会员分享,可在线阅读,更多相关《水中机器鱼大赛技术文档.docx(42页珍藏版)》请在冰豆网上搜索。
水中机器鱼大赛技术文档
参赛学校:
某大学
参赛队名:
水中机器鱼队
参赛项目:
水中机器人全局视觉水球2VS2
文档内容:
摘要
本文章是参加2015年中国水中机器人大赛。
本文描述了软件功能介绍,硬件介绍,基本操作,策略编写,策略加载。
引言
今年来理工学院十分重视机器人比赛团队的建设,训练和参赛,并特地提供了实验室,给予了大量人力,物力和财力支持,以鼓励有兴趣的同学们投入到相关的学习和研究中。
我队主要致力于机器智能的研究。
在机器人的研究方面,着重于机器人编程软件及组装方面。
在仿人形机器人中,我们队主要熟悉MURobot大平台(含小平台),摄像头驱动,CP210X驱动安装及应用,并用C++语言编写策略,使仿真鱼在水中完成各项任务。
机器鱼的控制,相当于参照一条真正鱼的行动方式,需要“眼睛”来识别,需要“尾巴”来获得动力,需要一个“脑子”做决策。
我们针对实体鱼来说明一下,“眼睛”就是我们鱼池上方的摄像头,动力就是鱼体内的舵机,决策的“脑子”就是我们的程序
比赛规则如下:
裁判鸣哨开球后,所有的机器鱼由各参赛队员手动启动。
在裁判哨声前抢先启动的机器鱼将被警告,二次警告后将被移离比赛场地,不得再参加比赛。
比赛分上下两个半场。
在上半场开场时,A队机器鱼从靠近水球点出发,B队机器鱼从本方球门处出发,以体现开球优势;同理,在下半场开场时,B队机器鱼从靠近水球点出发,A队机器鱼从本方球门出发。
若有一方进球后,则重新开球。
被进球方的机器鱼从靠近水球点出发,进球方的机器鱼则从本方球门出发。
机器鱼要求:
机器鱼游动方向定义为长度,摆动方向定义为厚度,两者垂直方向定义为高度。
头部长度:
150-180mm
头部高度:
60-90mm
头部厚度:
30-50mm
尾部长度(不包括尾鳍):
160-190mm,尾部高度厚度不得超过头部
尾鳍长度:
沿长度方向50-80mm,沿高度方向90-120mm
胸鳍尾鳍材料:
采用较硬塑料材料,不得用金属材料,以免比赛中刮坏
尾部材料:
尾部统一使用橡胶皮套
机器鱼颜色为黑色,可以在机器鱼的尾鳍侧面粘贴学校的名称、标志或编号,以区别不同球队的机器鱼。
每个机器鱼重量不得超过2kg;在不受挤压的情况下,机器鱼必须能够放进一个底面半径为75mm,高为450mm的圆筒里面。
一、软硬件安装
1.1水池的搭建
比赛场地为长方形水池,包括两台比赛电脑、一个支架、两个个摄像头,两套球门、两个无线通信模块。
水池内部矩形区域为最终的有效比赛场地,不包括水池壁及球门架两侧区域,有效比赛场地尺寸为2700mm×2000mm×300mm(长×宽×高)
1.2MURobot控制平台安装
①在U盘“软件驱动”目录下选择“MURobot”安装文件,例如上图所示电脑系统为32位,在安装文件时选择32位安装包,双击打开。
(32位安装包和64位安装包区别:
32位安装包为X86,64位安装包为X64)。
如下图
②打开32位“MURobot”安装文件,双击运行里面安装包,根据下图顺序进行安装。
③正常安装完成后桌面会出现三个快方式,此时MURobot控制平台安装完毕,如下图所示(如不能正常安装查阅附表1-001)
二、软件功能介绍
2.1、串口介绍
串行接口(Serial port)又称“串口”,主要用于串行式逐位数据传输。
在全局视觉机器鱼上我们利用串口来进行数据交互。
在使用全局鱼平台时,将无线发射模块(参考硬件篇)通过USB与电脑连接,就会出现对应串口的COM口。
接下来介绍串口端口号的查找,鼠标右击桌面“计算机”图标
,单机“属性”,出现计算机属性界面,单机打开左上角的设备管理器,按下图操作来找到串口端口号,此串口端口号是为使用大平台、小平台时打开串口号做准备的,在使用大平台、小平台时时会按照此端口号打开串口。
2.2、大平台介绍
大平台是对机器鱼所在环境进行分析处理另外处理程序代码与机器鱼互传指令实现人机交互的一个操作平台。
双击桌面快捷方式
,运行大平台,进入大平台主界面,如下图
(1).通信参数设置
通过大平台主界面的“通信参数设置”按键,单机打开,就可以进入通信时各参数设置,功能如下图所示
(2).图像参数设置
通过大平台主界面的“图像参数设置”按键,单机打开,可以对摄像头采集的图像。
(3).目标识别控制
通过大平台主界面的“目标识别”按键,单机打开,可对
打开的原始图像(Original)中目标进行识别控制。
选择鱼或球或环方法:
点击要选鱼、球或环序号在原始图像上框选要选择的对象即可选择,按住0框选需取消对象即可取消选择。
选择A队1-8号鱼的快捷键分别是:
1、2、3、4、5、6、7、8;
选择B队1-8号鱼的快捷键分别是:
Q、W、E、R、T、Y、U、I;
选择1-9号鱼的快捷键分别是:
A、S、D、F、G、H、J、K、L;
(4).原始图像控制
通过大平台主界面的“原始图像”按键,单机打开,可以设置加载策略时使用的临时目标点或是障碍物。
(5).前景图像
通过大平台主界面的“前景图像”按键,单机打开,能显示捕捉的背景图像。
(6).信息显示
通过大平台主界面的“信息显示”按键,单机打开,能实时显示摄像头捕获信息。
2.3.小平台介绍
(1).小平台打开方式
①通过大平台主界面的“调试助手”按键,单机打开小平台。
②在U盘“软件驱动”目录下,按下图所示打开
(2).基本控制
通过基本控制可对机器鱼进行手动操控,连接检测等操作。
(3).高级控制
频率:
单位时间内完成周期性变化的次数,单位赫兹(HZ)。
通常在发射和接收频率相同的情况下进行信号传递、交互。
本机器鱼发射模块和机器鱼都有6个一一对应的频率,当两者频率相同时可以进行通讯。
ID:
身份标识号码,也称为序列号或帐号,是某个体系中相对唯一的编码。
在全局视觉机器鱼中,当发射模块和机器鱼频率相同时利用不同的ID来区分不同的鱼。
在更改机器鱼时一定要辨清频率和ID之间的关系。
(4).关节调直
当打开鱼的开关鱼不能正常绷直的时候,需要用到“关节调直“功能。
(5).参数设置
当机器鱼游动效果不理想时,或在做科研时需通过“参数设置”修改一些参数。
(6).模式设置
对一条或多条编辑一些小命令,进行自动执行,可用于机器鱼检测或展示。
1单机“模式设置”打开设置界面,保证机器鱼与小平台连接正常,如下图操作
2每条鱼(每个ID)可以编辑10个不同时间段的动作指令。
三、硬件体系结构
3.1机器鱼
机器鱼是多水下机器人平台的执行者,可以实时接收信息执行相应任务,也可以实时反馈信息给大平台或小平台。
机器鱼在使用时注意避免与尖锐物品碰撞,不要使电池过放电。
机器鱼在不使用时气孔打开,放在干燥荫凉的环境中,保证机器鱼电量在50%以上。
下面是机器鱼实物与结构图。
3.2无线发射模块
大平台发出的指令通过无线模块传递给机器鱼,同时可以接收机器鱼反馈的信息通过串口传递给大平台或小平台。
下图为发射模块和USB接口线
1、摄像头
摄像头在工作时采集图像信息相当于一个传感器,可获得机器鱼的各种信息传递给大平台进行处理,来分析鱼的坐标,方向以及其他运动信息。
下图是摄像头以及摄像头USB线
四、基本操作
4.1机器鱼开机和充电
根据机器硬件介绍的开关位置拨动机器鱼开关(开关在鱼皮内部),开关有三个档位,当机器鱼不使用时将档位拨到中间档位,开关偏向鱼身左方或右方时可进行开启或充电(具体档位根据机器鱼而定,如果偏左是开启机器鱼那么另一方即是充电)。
开机:
拨动开关,机器鱼会稍微颤动一下,然后尾部呈绷直状态。
(若不绷直请参考“烧写底层”操作,如果仍然无法解决请查阅附表1-003)
充电:
充电器有两个输出接头,红接口为正极,黑接口为负极。
把开关拨至与机器鱼开机相反方向,根据机器鱼硬件介绍中俯视图,充电器正极接机器鱼正极,充电器负极接机器鱼负极。
充电器自带充电保护功能,一般情况下充两个小时就能充满。
(如果充不上电或不能充电,查阅附表1-004)
4.2小平台连接机器鱼
1通过USB与发射模块连接后,通过大平台或直接打开小平台两种方式打开小平台,选定对应的com端口,并打开串口(串口号通过以上步骤已知道是COM3)
2打开机器鱼,当机器鱼绷直时,则表明机器鱼已开启。
观看小平台接收区有没有数据显示(连接成功如下图)。
当无数据时表示通讯模块发射频率和机器鱼的接收频率不配套,这时我们需要通过高级控制更改通讯模块的频率来找到机器鱼的频率(详见“更改频率和ID”)。
3根据小平台介绍的功能来对机器鱼进行操作。
以下是用键盘进行手动操作。
速度键位:
数字区1~9为速度1~9挡,键盘区0~5为速度10~15挡(注:
1最小,15最大)
方向键位:
键盘区Y~Q为方向左键,小键盘区←为最大左转向。
键盘区U~}为方向右键,小键盘区→为最大右转向。
直游键位:
Z
停止键位:
空格键
4.3、更改频率和ID
(1)修改无线发射模块频率
当使用者不慎将机器鱼的频率弄混淆时导致机器鱼和上位机无法通信时,此时就要用到更改无线发射模块频率了。
首先,将无线模块通过USB接口与电脑连接。
打开小平,然后将发射模块上的J2排针跳帽,由右边移到左边启动内部工作模态如下图所示,完成后打开小平台“高级控制”,在“更改频率”按键左边,选择频率,单击“更改频率”,如果接收区出现一小段代码,说明更改完成,点击“返回当前频率”,将弹出对话框显示现在频率。
此时再将跳帽恢复到右边启动外部工作模态就可以连接机器鱼了,如果连接不上,继续更改其他频率。
4.4.修改机器鱼ID
①多条鱼使用一个频率上完成不同任务时,需要对机器鱼进行修改ID。
②当频率修改正常时,使用小平台连接机器鱼,小平台接收区有正常信号反馈,但使用小平台无法控制机器鱼,此时可以尝试调节小平台ID按下图操作一次一次尝试。
在小平台中打开“高级控制”,再按下图操作更改鱼ID。
4.5.修改机器鱼频率
将小平台连接和鱼,小平台与鱼能正常通讯的情况下更改机器鱼频率。
打开“高级控制”更改鱼的频率。
点击“更改频率”后,重启机器鱼机器鱼的频率更改完成。
4.6.对机器鱼烧写底层
对机器鱼进行无线烧写需要用到超级终端,超级终端的版本有好多种,但用法都大同小异,下面选其中一种进行讲解。
在烧写底层时发射模块频率要和机器鱼频率相同,所以使用机器鱼的时候要养成良好习惯,每次记录使用的鱼的频率。
(1)、在U盘“超级终端”中选择“hypertrm”软件双击打开,如下图所示
(2)、如果电脑第一次使用超级终端会出现下面界面内容,按图中所示操作
(3)、点击确定后需要创建连接按下图操作
(4)、完成以上操作,打开机器鱼,会出现如下界面
(5)、关掉机器鱼,然后按住键盘按键“D”,同时打开机器鱼,会出现以下界面,界面中不断出现“C”。
(6)、单机窗口中的“传送”键,进入发送界面,选择“发送文件”,按以下步骤操作。
(7)、等待发送完毕,机器鱼出现绷直现象。
此时先关闭机器鱼,然后关闭超级终端窗口,烧写底层完毕。
五、机器鱼基本控制策略讲解
5.1类函数的定义
程序中变量都定义为C++语言中“类”的方式。
至于什么是“类”,简单理解是定义的对象、变量包含同样的特性,作为一种形式提供给我们使用的一种函数类型,定义一种类需要进行实例化,说明类的具体内容,包含的参数,变量,对象是什么。
更多的大家可以具体上网查,我们需要知道有这种东西,能用就行。
它的基本形式是:
Cpoint+变量名;
通道
临时目标点:
指所控制的鱼在一定的区域范围内需要到达的位置。
5.2最基本的定义变量说明
1)程序的定义的最基本变量有四个:
1、鱼中心坐标;2、球中心坐标;3、鱼头方向;4、球门中心坐标
下面具体说明
定义鱼中心坐标是:
CPointf_pt:
f是fish的简写,pt表示坐标,f_pt是鱼的中心坐标,鱼中心坐标f_pt。
定义球的中心坐标是:
CPointb_pt:
b是Ball的简写,pt是坐标,b_pt就是球的中心坐标。
定义球门中心坐标是:
CPointg_pt:
g是goal(球门)的简写,pt是坐标,所以g_pt代表球门坐标。
定义鱼头方向是:
doublef_dir:
f就是fish简写,dir是direction的简写,这是一个双精度的变量。
绝对坐标系中范围是[-π,π],所以程序中鱼头方向的范围就是[-π,π]。
大家或许有疑问,为什么鱼头方向是双精度的变量而其他的三个是类呢。
因为其他三个都是包含这x和y坐标,也就是类包含相同的参数(对象),而鱼头方向没有包含这些,仅仅是一个[-π,π]的变化范围。
2)基本变量在程序中的获取
我们定义了最基本的四个变量,那么程序中是怎么获得的呢,我们下面来说明。
针对三个类(鱼中心坐标,球中心坐标,球门中心坐标),我们大平台已经写好对这些这些类的定义和例化函数,具体我们不需要了解。
获取的函数也已经写好,就是简单的调用一个函数就行。
具体程序是
对鱼中心坐标的获取f_pt=m_FishInfo[0].GetCenterPt();
m_FishInfo[0].GetCenterPt()是一个类函数,不需要具体了解函数具体内容,只需要记住其实现的功能。
功能是获取鱼的中心坐标。
m_FishInfo[0]
m_是标识作用,fish代表“鱼”,info代表“输入”[数字]数字代表鱼的编号
这个获取的是0号鱼的,GetCenterPt()代表获得中心坐标。
那么2vs2程序获取0号是:
f_pt[0]=m_FishInfo[0].GetCenterPt();
程序获取1号是;f_pt[1]=m_FishInfo[1].GetCenterPt();
对球中心坐标的获取是:
b_pt=m_goalinfo.GetBallPt();
m_goalinfo.GetBallPt()是一个类函数,功能是获得球中心坐标
m_goalinfo[0]同时在2013的新平台上也需要输入鱼的编号
m_是标识作用,goal代表球门,info是“输入”,
GetBallPt()代表球中心坐标
对球门中心坐标的获取是:
g_pt=m_Channel[0].center;
[数字]中括号内部的数字代表获取的是第几个通道的坐标。
如果很多个通道可以代替临时目标点的作用吗?
对鱼头方向的获取是:
f_dir=m_FishInfo[0].GetDirection();
[数字]也是同样的含义,代表获取的方向是第几条鱼的。
5.3三个基本服务函数
程序中还有最简单的三个服务函数。
1获取角度函数Angle(CPointpoint,CPointaimer);
2获取距离函数Distance(x,y);其中形参都是定义为“类”。
3转换角度函数Checkangle(doubledir)形参类型是双精度。
大家有英文字母的含义应该就了解函数的作用了。
请记住三个函数的功能。
1)角度函数此函数所测算的角度建立于绝对坐标系基础上
Angle(CPointpoint,CPointaimer)具体定义如下:
Angle(CPointpoint,CPointaimer)//声明函数,两个类的形参point和aimer
{doublea;
a=atan2((double)(aimer.y-point.y),(double)(aimer.x-point.x));
//就是求一个反正切的角度
returna;//返回一个角度值范围是[-π/2,π/2](这个很重要,记住范围)
}
红色为point黑色为aimer
2)距离函数
Distance(CPointpoint,CPointaimer)函数具体定义如下:
Distance(CPointpoint,CPointaimer)
{
doublea;
a=sqrt((double)(point.x-aimer.x)*(point.x-aimer.x)+
(double)(point.y-aimer.y)*(point.y-aimer.y));
//就是一个求距离的平方根公式
returna;//返回距离值,双精度类型
}
3)转换角度函数
Checkangle(doubledir)具体定义如下:
Checkangle(doubledir)//把dir换算成[-pi~pi]之间的数
{
if(dir>PI)
dir-=2*PI;
elseif(dir<-PI)
dir+=2*PI;
returndir;
}
5.4点到点函数的讲解
这是程序中核心的函数,机器鱼所执行的动作都是调用这个函数来实现的,所以请大家一定要理解函数内容,并且能够修改优化这个程序。
先给出函数功能说明
。
点对点底层函数详解
重在理解点对点函数是如何运行的,底层函数研究根据自身能力酌情处理。
voidRoundp2p(CPointaimpt,CFishAction&action,intfishID,CFishInfom_FishInfo)
{
//定义一个函数,包含四个参变量,
第一个是aimpt作为目标点的类,
第二个是鱼的动作模式action(包括速度、方向以及运动模式)
第三个是鱼的ID,
第四个是鱼的入口参数(包含鱼中心坐标,鱼头方向等)。
其中,鱼的ID是整数类型外,其他的都是“类”。
CPointFishPt;//鱼中心的位置
doubleFishDir;//鱼头的方向
CPointFishHeadPt;//鱼头的位置
CPointLastFishPt;
CPointFishRotatePt;/;//鱼的转动位置,程序未用到,作为预留变量待开发使用。
CPointFishTailPt;//鱼尾巴的位置,程序未用到,作为预留变量待开发使用。
CPointGoalPt1,GoalPt2;//临时目标点,GoalPt2没有用到
CPointPt1,Pt2,Pt3,Pt4;
//CPointf_headpt;//pointoffish'shead
//f_headpt=m_FishInfo[0].GetHeadPoint();
doubledir1=0;
doubledir0;
doubledist0;
doubledist1=0;
doubledir2=0;
doubledist2=0;//临时用到的方向和距离
CPointcenterpt1,centerpt2;//作为鱼要绕的中心来用
CPointcenterpt3,centerpt4,centerpt5,centerpt6;
CPointcenterpt0,centerpt00;
doubledis1,dis2;
dis1=0;
dis2=0;
doubleradius;///需要游动的半径,可以随意的设置.
FishPt=m_FishInfo.GetCenterPt();//获取鱼的中心位置
FishDir=m_FishInfo.GetDirection();//获取鱼头方向
dist1=Distance(FishPt,aimpt);//计算鱼中心位置和所要游动目标点的距离dist1变量
dir1=Angle(FishPt,aimpt);//计算鱼中心位置和所要游动目标点连线的夹角(绝对坐标系)
dir1-=FishDir;//这个语句的作用是把绝对坐标系表示的角度转换为相对坐标系
//就是以鱼和目标点的连线为参考轴,dir1代表此情况的鱼头方向
dir1=Checkangle(dir1)*180/PI;//调用函数,把dir1的从弧度换为角度表示
action.speed=15;//定义鱼的速度为最快的15执行动作
m_FishInfo.SetAction(action);//发送动作设置状态给鱼
if(dist1>100)//下面是鱼和目标点的距离大于100像素的情况
{
if(dir1>-5&&dir1<5)
action.direction=7;
elseif(dir1<-5&&dir1>-10)
action.direction=5;
elseif(dir1<-10&&dir1>-30)
action.direction=4;
elseif(dir1<-30&&dir1>-50)
action.direction=2;
elseif(dir1<-50&&dir1>-70)
action.direction=1;
elseif(dir1<-70&&dir1>-90)
action.direction=0;
elseif(dir1<-90)
action.direction=0;
elseif(dir1>5&&dir1<10)
action.direction=9;
elseif(dir1>10&&dir1<20)
action.direction=10;
elseif(dir1>20&&dir1<40)
action.direction=12;
elseif(dir1>40&&dir1<50)
action.direction=12;
elseif(dir1>50&&dir1<80)
action.direction=14;
elseif(dir1>80&&dir1<90)
action.direction=14;
else
action.direction=14;
}
else//以下是鱼和目标点的距离小于100像素的情况。
{if(dir1>-5&&dir1<5)
action.direction=7;
elseif(dir1<-5&&dir1>-20)
action.direction=4;
elseif(dir1<-20&&dir1>-40)
action.direction=1;
elseif(dir1<-40&&dir1>-60)
action.direction=0;
elseif(dir1<-60&&dir1>-70)
action.direction=0;
elseif(dir1<-70&&dir1>-90)
action.direction=0;
elseif(dir1<-120)
action.direction=0;
elseif(dir1>5&&dir1<20)
action.direction=10;
elseif(dir1>20&&dir1<30)
action.direction=12;
elseif(dir1>30&&dir1<50)
action.direction=13;
elseif(dir1>50&&dir1<70)