版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、rofish 工程训练中心出品- 1 -rofish 工程训练中心出品水中机器鱼说明书(策略部分详解 ) rofish 工程训练中心出品- 2 -rofish 工程训练中心出品绪论在机器鱼实验室多年的过程,收获颇多, 也希望大家能够后浪推前浪,在机器鱼实验室中收获知识,收获成长。机器鱼的控制, 相当于参照一条真正鱼的行动方式,需要“眼睛”来识别,需要“尾巴”来获得动力,需要一个“脑子”做决策。我们针对实体鱼来说明一下, “眼睛”就是我们鱼池上方的摄像头,动力就是鱼体内的舵机,决策的“脑子”就是我们的程序。本次所写内容是根据自己的编程的经验,总结给大家,主要内容是机器鱼程序的讲解和编程思路的分析
2、。我们重要讲解的是关于策略部分的内容。首先说明程序用到的参数的定义和一些参数的使用含义, 接着是对于程序中用到关键方向的具体解释,在然后是解释控制程序中一些基本的程序,例如点到点函数,计算角度的函数,计算距离的函数。其中重点讲解的是点到点函数,往后就是具体函数的简单实例,像场地追逐的程序,1vs1程序,具体说明程序的编写思想和鱼在对应情况的执行方式。希望大家一定要掌握好关键用到的方向的参数定义,还有点到点函数的作用,可以从场地追逐这个最简单的程序中开始进行程序的编写,最后理解好 1vs 1 程序,以后编写其他的不同项目的程序时应该能够应付过来。最后,希望这个仓促中编写的程序讲解能够给大家带来帮
3、助,从rofish 工程训练中心出品- 3 -rofish 工程训练中心出品中出现的错误也希望指正,一些关于编程的思想也一起交流。知识导航绪论 . 2机器鱼控制的基本定义. 4?鱼的基本表示方式,如图一。. 4?鱼池的基本模型定义,如图二. 5?基本的方向设定,如图三. 6机器鱼基本控制策略讲解. 7? 类函数的定义. 7? 最基本的定义变量说明. 71)程序的定义的最基本变量有四个:. 72)基本变量在程序中的获取. 8?三个基本服务函数. 91)角度函数此函数所测算的角度建立于绝对坐标系基础上 . 92)距离函数 . 10 3)转换角度函数. 10 ?点到点函数的讲解. 11 点对点底层函
4、数详解. 11 具体程序的编写举例. 14 ?场内追逐的程序示例. 14 ? 1v1 综合测试实例 . 16 rofish 工程训练中心出品- 4 -rofish 工程训练中心出品机器鱼控制的基本定义我们需要先了解机器鱼的一些最基本的定义的东西,这样后面的学习中会更简单一些。?鱼的基本表示方式,如图一。224651015a鱼头长度鱼的天线位置dcb线段就是天线的高度,而程序中鱼中心的位置就是定义为天线的位置。段就是鱼头侧视图rofish 工程训练中心出品- 5 -rofish 工程训练中心出品的长度(这个是重要概念),通常在程序中定义为多少个像素,或者。?鱼池的基本模型定义,如图二51015右
5、半场左半场发球点球门2球门 1abdcoxyjkfe程序中定义坐标系的方式为, 以点为坐标系原点, 为轴且右为正向,为轴且下为正向。就是鱼池的长度, 在大平台软件中表现为像素的多少,在到的范围内。 就是鱼池宽度大平台表现像素的大小,在到的范围内。点就是比赛的发球点, 在中线和中线交点上。鱼池分左半场与右半场,和上下半场。共有两个球门。在程序中判断鱼在左还是右半场,就是判断鱼的坐标是否大于中线的坐标,同理判断鱼在上还是下半场就是判断鱼的坐标是否大于中线的坐标。rofish 工程训练中心出品- 6 -rofish 工程训练中心出品?基本的方向设定,如图三鱼池左上角图三基本的方向设定oe方向为鱼头方
6、向鱼中心位置顺时针为负向角逆时针为正向角oekjacbo对于方向的设定, 存在两个坐标系, 一个是绝对坐标系, 就是以鱼池左上角为原点的坐标系, 还有一个是相对参考坐标系, 就是一鱼中心位置为原点,鱼头方向为轴方向的坐标系。对于相对参考坐标系, 为鱼头方向, 以鱼头方向为参照, 程序中定义是逆时针为正向角度,顺时针为负向角度。所以,表示的话为,为。另外对于绝对坐标系,它的方向正负判断则是相反的,顺时针为正向角度,逆时针为负向角度, 具体原因会在后期解释angle 函数时提道,平常我们经常用到的就是绝对坐标系下的角度, 因此综上,这是我们程序编写必须要了解的基本参数的意义大家需要重点掌握的是基本
7、方向的设定,我们后面理解程序的时候会觉得简单一些。rofish 工程训练中心出品- 7 -rofish 工程训练中心出品机器鱼基本控制策略讲解?类函数的定义程序中变量都定义为c+ 语言中“类”的方式。至于什么是“类”,简单理解是定义的对象、 变量包含同样的特性, 作为一种形式提供给我们使用的一种函数类型,定义一种类需要进行实例化,说明类的具体内容,包含的参数,变量,对象是什么。更多的大家可以具体上网查,我们需要知道有这种东西,能用就行。它的基本形式是: cpoint+ 变量名;通道临时目标点:指所控制的鱼在一定的区域范围内需要到达的位置。?最基本的定义变量说明1)程序的定义的最基本变量有四个:
8、1、鱼中心坐标;2、球中心坐标;3、鱼头方向;4、球门中心坐标下面具体说明定义鱼中心坐标是:cpoint f_pt :f 是 fish 的简写, pt 表示坐标, f_pt 是鱼的中心坐标,鱼中心坐标f_pt。定义球的中心坐标是:cpoint b_pt :b 是 ball 的简写, pt 是坐标, b_pt 就是球的中心坐标。定义球门中心坐标是:cpoint g_pt :g 是 goal(球门)的简写,pt 是坐标,所以g_pt 代表球门坐标。定义鱼头方向是:double f_dir :f 就是 fish 简写, dir 是 direction 的简写,这是一个双精度的变量。绝对坐标系中范围是
9、- ,所以程序中鱼头方向的范围就是-, 。大家或许有疑问, 为什么鱼头方向是双精度的变量而其他的三个是类呢。因为其他三个都是包含这 x 和 y 坐标,也就是类包含相同的参数(对象),而鱼头方向没有包含这些,仅仅是一个 -, 的变化范围。rofish 工程训练中心出品- 8 -rofish 工程训练中心出品2)基本变量在程序中的获取我们定义了最基本的四个变量,那么程序中是怎么获得的呢,我们下面来说明。针对三个类(鱼中心坐标,球中心坐标,球门中心坐标),我们大平台已经写好对这些这些类的定义和例化函数, 具体我们不需要了解。 获取的函数也已经写好,就是简单的调用一个函数就行。具体程序是对鱼中心坐标的
10、获取 f_pt=m_fishinfo0.getcenterpt() ; m_fishinfo0.getcenterpt()是一个类函数,不需要具体了解函数具体内容,只需要记住其实现的功能。功能是获取鱼的中心坐标。m_fishinfo0 m_ 是标识作用, fish 代表“鱼”,info代表“输入” 数字 数字代表鱼的编号这个获取的是 0 号鱼的, getcenterpt() 代表获得中心坐标。那么 2 vs 2 程序获取 0 号是: f_pt0=m_fishinfo0.getcenterpt() ; 程序获取 1 号是; f_pt1=m_fishinfo1.getcenterpt() ; 对球
11、中心坐标的获取是: b_pt=m_goalinfo.getballpt(); m_goalinfo.getballpt()是一个类函数,功能是获得球中心坐标m_goalinfo0同时在 2013 的新平台上也需要输入鱼的编号m_ 是标识作用, goal 代表球门, info是“输入”,getballpt() 代表球中心坐标对球门中心坐标的获取是:g_pt=m_channel0.center ; 数字 中括号内部的数字代表获取的是第几个通道的坐标。如果很多个通道可以代替临时目标点的作用吗?对鱼头方向的获取是: f_dir=m_fishinfo0.getdirection() ; 数字 也是同样的
12、含义,代表获取的方向是第几条鱼的。rofish 工程训练中心出品- 9 -rofish 工程训练中心出品?三个基本服务函数程序中还有最简单的三个服务函数。1 获取角度函数 angle(cpoint point,cpoint aimer); 2 获取距离函数 distance(x,y);其中形参都是定义为“类” 。3 转换角度函数 checkangle(double dir)形参类型是双精度。大家有英文字母的含义应该就了解函数的作用了。请记住三个函数的功能。1)角度函数此函数所测算的角度建立于绝对坐标系基础上angle(cpoint point,cpoint aimer)具体定义如下:angle
13、(cpoint point,cpoint aimer) / 声明函数,两个类的形参point和 aimer double a; a=atan2(double)(aimer.y-point.y),(double)(aimer.x-point.x);/ 就是求一个反正切的角度return a;/ 返回一个角度值 范围是 - /2, /2( 这个很重要,记住范围 ) 红色为 point 黑色为 aimer rofish 工程训练中心出品- 10 -rofish 工程训练中心出品2)距离函数distance(cpoint point,cpoint aimer)函数具体定义如下:distance(cpo
14、int point,cpoint aimer) double a; a=sqrt(double)(point.x-aimer.x)*(point.x-aimer.x)+(double)(point.y-aimer.y)*(point.y-aimer.y); / 就是一个求距离的平方根公式return a; /返回距离值,双精度类型 3)转换角度函数checkangle(double dir) 具体定义如下:checkangle(doubl e dir) /把 dir换算成 -pipi之间的数 if(dirpi) dir-=2*pi; else if(dir100) /下面是鱼和目标点的距离大于
15、100 像素的情况 if(dir1-5&dir15) action.direction=7; else if(dir1-10) action.direction=5; else if(dir1-30) action.direction=4; else if(dir1-50) action.direction=2; else if(dir1-70) action.direction=1; else if(dir1-90) rofish 工程训练中心出品- 13 -rofish 工程训练中心出品action.direction=0; else if(dir15&dir110&
16、;dir120&dir140&dir150&dir180&dir1-5&dir15) action.direction=7; else if(dir1-20) action.direction=4; else if(dir1-40) action.direction=1; else if(dir1-60) action.direction=0; else if(dir1-70) action.direction=0; else if(dir1-90) action.direction=0; else if(dir15&dir120&dir
17、130&dir150&dir170&dir190) action.direction=14; else if(dir1120) rofish 工程训练中心出品- 14 -rofish 工程训练中心出品action.direction=14; else action.direction=14; m_fishinfo.setaction(action); 具体程序的编写举例下面我们进行一些简单程序编写讲解,主要有两个,一个是最简单的场内追逐比赛的程序,另一个是1的程序。请大家好好理解,学会如何编程?场内追逐的程序示例我们把鱼池共分为八个部分,每个部分的判定条件是根据x坐标和
18、 y坐标来划分的。鱼在每个区域都会有一个目标点,鱼在该区域时就会游向该目标点。需要编写的就是鱼在当前区域下鱼游向目标点的程序。下面具体说明区域 a程序: if ( f_pt.x40&f_pt.y40&f_pt.x320&f_pt.y320&f_pt.x600&f_pt.y600&f_pt.y600&f_pt.y240) goal_pt.x = 600; /e目标点的x 坐标 goal_pt.y = 440; / y坐标m_action0.speed=15; /鱼的速度设置为最大 15 m_action0.mode=0; /鱼的速度模式为0
19、 roundp2p(goal_pt,m_action0,0,m_fishinfo0); / 调用点到点函数,执行动作 区域 f 程序: if ( f_pt.x320&f_pt.x240) goal_pt.x =320; /f目标点的x 坐标 goal_pt.y = 470; / y坐标m_action0.speed=15; /鱼的速度设置为最大 15 m_action0.mode=0; /鱼的速度模式为0 roundp2p(goal_pt,m_action0,0,m_fishinfo0); /调用点到点函数,执行动作 区域 g程序: if ( f_pt.x40&f_pt.x24
20、0) goal_pt.x =320; /g目标点的x 坐标 goal_pt.y = 20; / y坐标m_action0.speed=15; /鱼的速度设置为最大 15 m_action0.mode=0; /鱼的速度模式为0 roundp2p(goal_pt,m_action0,0,m_fishinfo0); / 调用点到点函数,执行动作 区域 h程序: if ( f_pt.x240) rofish 工程训练中心出品- 16 -rofish 工程训练中心出品 goal_pt.x = 20; / h目标点的x 坐标 goal_pt.y = 240; / y坐标m_action0.speed=15
21、; /鱼的速度设置为最大 15 m_action0.mode=0; /鱼的速度模式为0 roundp2p(goal_pt,m_action0,0,m_fishinfo0); / 调用点到点函数,执行动作 这就是场地追逐很简单的程序例子,简单易懂。程序很简单,所以存在这一些缺点。第一个是程序对场地分类不够精细,鱼在实际游动的时候往往偏差较大,第二个是目标点根据场地就变化,修改目标点坐标过程繁琐。这里给出简单的形式是希望大家理解编程的方式,自己能够编写简单的程序,在水池让鱼游起来,实现追逐功能。针对程序的优化,第一个大家可以把场地划分更多的区域,进行精细化,第二个大家可以改用设置通道的方式代替目标
22、点,这样修改目标点坐标就很方便了。希望大家可以多多思考,交流,优化程序。? 1v1 综合测试实例 cpoint f_pt;/ 鱼的中心点坐标f_pt=m_fishinfo0.getcenterpt();/getcenterpt()返回中心点坐标double f_dir;/ 鱼的方向, -pi,pi f_dir=m_fishinfo0.getdirection(); cpoint tempt0,tempt1,tempt2,tempt3,tempt4,tempt5; cpoint f_headpt;/point of fishs head f_headpt=m_fishinfo0.getheadp
23、oint(); cpoint b_pt;/ 球的中心点坐标b_pt=m_goalinfo.getballpt(); cpoint g_pt;/ 球门中心点坐标g_pt=m_channel0.center; double disfishtoball; disfishtoball=distance(f_pt,b_pt);/ 鱼到球的距离double dirballtogoal; dirballtogoal=angle2(b_pt,g_pt);/ 球到目标点的角度double r=9.0; / 右攻目标点tempt0.x=b_pt.x-1.3*r*cos(dirballtogoal); tempt0
24、.y=b_pt.y-0.2*r*sin(dirballtogoal); / 在球门右攻tempt4.x=b_pt.x-2*r*cos(dirballtogoal); tempt4.y=b_pt.y-0*r*sin(dirballtogoal); / 左攻目标点tempt1.x=b_pt.x+1.3*r*cos(dirballtogoal); tempt1.y=b_pt.y+0.1*r*sin(dirballtogoal); / 在球门左攻tempt5.x=b_pt.x+2*r*cos(dirballtogoal); tempt5.y=b_pt.y-0*r*sin(dirballtogoal);
25、 rofish 工程训练中心出品- 17 -rofish 工程训练中心出品/ 球门目标点tempt2.x=b_pt.x-1.4*r; tempt2.y=b_pt.y-0*r*sin(dirballtogoal);/ (右攻)tempt3.x=b_pt.x+1.5*r; tempt3.y=b_pt.y+0.1;/0*r*sin(dirballtogoal);/(左攻)、bool m_right; if (g_pt.x378) m_right= true ; else m_right= false ; if (m_right) if (f_headpt.x610) if ( b_pt.y=212)
26、 / 球门程序 if (disfishtoball35) m_action0.mode=0; m_action0.speed=14; else m_action0.mode=0; m_action0.speed=15; roundp2p(tempt2,m_action0,0,m_fishinfo0); else if (disfishtoball35) m_action0.mode=0; m_action0.speed=13; else m_action0.mode=0; m_action0.speed=15; roundp2p(tempt4,m_action0,0,m_fishinfo0);
27、 rofish 工程训练中心出品- 18 -rofish 工程训练中心出品 else if (disfishtoball35) m_action0.mode=0; m_action0.speed=13; else m_action0.mode=0; m_action0.speed=15; roundp2p(tempt0,m_action0,0,m_fishinfo0); else if (f_pt.y5/6*pi&f_dir-2/3*pi&f_dirpi/2) m_action0.mode=1; m_action0.direction=0; else m_action0.mod
28、e=0; m_action0.direction=f_dirb_pt.y+r)/ 鱼在球右下面 m_action0.speed=15; if ( f_dir5/6*pi&f_dir-pi/2&f_dir2/3*pi ) m_action0.mode=1; m_action0.direction=14; else m_action0.mode=0; m_action0.direction=f_dir0?2:12; else / 鱼和球的 y 值相同。 m_action0.speed=15; if (f_dir-2/3*pi) m_action0.mode=1; m_action0
29、.direction=f_dirb_pt.x+1.4*r)/ 鱼在球右边 if (b_pt.x95) if (b_pt.y227) if (disfishtoball35)/the velosity change easy to approach m_action0.mode=0; m_action0.speed=14; rofish 工程训练中心出品- 20 -rofish 工程训练中心出品else m_action0.mode=0; m_action0.speed=15; roundp2p(tempt3,m_action0,0,m_fishinfo0); else if (disfishtoball35)/the velosity change easy to approach m_action0.mode=
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年版个人房产销售协议版B版
- 2024年版权质押合同:文学作品版权质押融资详细规定
- 2023-2028年中国IP视讯行业市场深度分析及未来发展趋势预测报告
- 2025年中国风热感冒颗粒行业市场调查研究及投资前景预测报告
- 天馈线分析仪行业市场发展及发展趋势与投资战略研究报告
- 2021档案员自我鉴定范文
- 岛上书店读后感15篇
- 自我介绍三年级作文300字集合九篇
- 高三年度工作计划
- 同学邀请函合集6篇
- 2024年01月22332高等数学基础期末试题答案
- 期末素养测评卷(试题)-2024-2025学年三年级上册数学人教版
- 印章交接表(可编辑)
- 体育场馆运营合同
- 5-项目五 跨境电商出口物流清关
- 栋号长年度述职报告
- 无人机安全飞行承诺书
- 四川省成都市九县区2023-2024学年高一下学期期末调研考试化学试题(解析版)
- 《网页设计与制作案例实战教程》全套教学课件
- 产品创意设计学习通超星期末考试答案章节答案2024年
- 协议书范文离婚书范本模板
评论
0/150
提交评论