版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
合肥工业大学计算机与信息学院机器人足球仿真实验报告班级:计算机科学与技术11-1班姓名:魏慷学号:2425年12月5日1试验一机器人足球比赛编程预备知识1.试验目的掌握RoboCup仿真机器人足球比赛有关知识点,详细内容如下:(1)Linux操作系统的熟悉及理解其基本操作。(2)掌握Linux下怎样进行C++编程,理解gcc编译器以及某些简朴编辑工具,如:vi、emacs、gedit、Anjuta、Kdevelope等。(3)启动RoboCup仿真(2D)足球队的比赛。2.试验设备硬件环境:PC机软件环境:操作系统linux3.试验内容(1)掌握Linux某些常用的命令文献或目录处理格式:Is[-atFlgR][name]第一项是某些语法加量。第二项是文献名。常用的措施有:ls列出目前目录下的所有文献。ls-a列出包括以.开始的隐藏文献的所有文献名。ls-t根据文献最终修改时间的次序列出文献名。Is-F列出目前目录下的文献名及其类型。以/结尾表达为目录名、以*结尾表达未可执行文献、以@结尾表达为符号连接。ls-1列出目录下所有文献的权限、所有者、文献大小、修改时间及名称。Is-lg同上,并显示出文献的所有者工作组名。ls-R显示出目录下以及其所有子目录的文献名。变化工作目录格式:cd[name]name:目录名、途径或目录缩写。常用的措施有:cd变化目录位置至顾客登录时的工作目录。cddirl变化目录位置至dirl目录下。cd~user变化复制文献格式:cp[-r]源地址目的地址2常用的措施有:cpfilelfile2将文献file1复制成file2cpfileldir1将文献filel复制到目录dirl目录。移动或更改文献、目录名称格式:mv源地址目的地址常用的措施有:mvfilelfile2将文献filel更名为file2。mvfileldirl将文献file1转移到目录dirl下,文献名仍为filel。mvdirldir2将目录dirl更改为目录dir2。建立新目录格式:mkdir目录名删除目录格式:rmdir[目录名文献名]常用的措施有:rm-rdirl删除目录dir1及其子目录下的所有文献。列出目前所在的目录位置格式:pwd查看文献内容格式:cat文献名文献权限的设定格式:chmod[-R]modenamename:文献名或目录名。mode:3个或8个数字或rwx的组合。r-read(读权限)、w-write(写权限)、x-execute(执行)常用的措施有:chmod777filel给所有顾客filel所有的权限。文献的打包和解压缩格式:tar[option][file]gzip[option][file]tar重要来进行打包而不压缩,而gzip则进行压缩。option重要有:-c—创立一种新归档。-f—当与-c选项一起使用时,创立的tar文献使用该选项指定的文献名;当与-x选项一起使用时,则解除该选项指定的归档。-t一显示包括在tar文献中的文献列表。-v—显示文献的归档进度。-x—从归档中抽取文献。-z—使用gzip来压缩tar文献。如使用:tar-cvf/home/mine/work/ho上面的命令把/home/mine目录下的work和school子目录内的所有文献3都放入目前目录中一种叫做的新文献里。(2)完毕如下操作:1.怎样找到顾客主目录的绝对途径名?在自己的系统上,顾客主目录的绝对途径名是什么?执行cd;执行pwd;即显示顾客主目录的绝对途径名。顾客完毕如下操作:rcssserverresslogplayer在球队途径下:./start.sh试验二Demeer5基本动作11.试验目的(1)理解Demeer5的工作原理4(2)学会对Demeer5进行简朴的修改2.试验设备(1)Demeer5的工作原理:Demeer5函数是整个球队的关键,它最终返回一种可以执行的动作,底层的模块负责将此动作发送给server,然后由server执行。可以说,Demeer5就是我们想法的体现,是一支球队的大脑。在Demeer5中有一系列的判断来决定每个周期的动作。下面对Demeer5进行简要的分析.Demeer50是一种决策函数,在方略上使用的是下面这个简朴的方略:假如球可踢,则用最大力量踢球;假如球不可踢且if(WM->isBallKickable()//假如球可踢{VecPositionposGoal(PITCH_LENGTH/2.0,-1+2*(WM->getCurrentCycle(%2)*0.4*SS->getGoalWidthO);soc=kickTo(posGoal,SS->getBallSpeedMax());//kickmaxiACT->putCommandInQueue(ACT->putCommandInQueue(turnNeckToObject(OBJECT_BAL/记录调试信息Log.log(100,"kickba}这一小段函数决定了当球在球员Agent的可踢范围之内时应当做的动作,这里是一种简朴的把球向前踢而不考虑任何其他状况的措施。该程序段的条理是很清晰的。5(2)对Demeer5进行简朴的修改:目前我们对Demeer5进行简朴的修改,让它在球可踢的时候进行带球的动作。带球就是kick和dash动作序列的结合。带球的函数在BasicPlayer中,函数为dribble().它接受两个参数,第一种参数为带球的方向,第二个参数为带球的类型。带球类型解释如下:DRIBBLE_FAST:迅速带球;DRIBBLE_SLOW:慢速带球;DRIBBLE_WITHBALL:安全带球;因此,对dribble的一种调用形式为:dribble(ang,DRIBBLE_FAST)其中ang为AngDeg(是一种double)类型该函数的返回值if(WM->isBallKickable(){AngDegsoc=dribble(ang,DRIBBLE_FAST);//进行带球ACT->putCommandInQueue(ACT->putCommandInQueue(turnNeckToObject(OBJECT_BALLog.log(100,"kickball");}这样,在球可踢的时候,球员智能体将把球带向前方,这里取的是0度角,即沿x轴一直向前迅速带球。我们再次对Demeer5函数进行修改,这次是让球员Agent将球踢向各个不一样的地方。这将调用kickTo()函数来完毕。下面简要阐明一下kickTo()函数的使用措施:这个函数有两个参数,第一种参数是目的点的坐标,第二个参数是球抵达目的点是的速度,返回一种踢球的动作。可以将会决定踢球时所用力量的大小,并且会判断与否能够将球踢到该点,并作出对应的调整。例如,将球一直踢向(0,0)点,1.0的末速度:elseif(WM->isBallKickable()){soc=kickTo(VecPosition(0,0),1.0);6/将动作放入命令队列中ACT->putCommandInQueue(ACT->putCommandInQueue(turnNeckToObject(OBJECT_BALLog.log(100,"kickba}(3)根据上述操作,完毕如下踢球操作:将球踢向对方的球门。VecPositionpos=WM->getPosOpponentGoal;soc=kickTo(pos,1.0);ACT->putCommandInQueue(soc);ACT->putCommandlnQueue(turno=WM->getClosestInSetTo(OBJECT_SET_TEAMMATES,posAgent);soc=kickTo(WM->getGlobalPosition(o),1.0);ACT->putCommandInQueue(soc);ACT->putCommandInQueue(turnNeckToObject(OBJECT_BALL,soc));尝试不一样的踢球点。(略)(4)根据上述内容,完毕如下带球的操作:用不一样的带球模式进行带球,并观测效果,比较异同。AngDegang=0.0;soc=dribble(ACT->putCommandInQueue(soc);ACT->putCommandInQueue(turnNeckToObject(OBJECT_BALL,soc));向对方的球门方向带。doubleang=(VecPosition(52.5,0)-posAgent).getDirection();//求soc=dribble(ang,DRIBBLE_SLOW);ACT->puACT->putCommandInQueue(turnNeckToObject(OBJECT_BALL,soc));尝试不一样的带球组合。(略)(5)根据上述内容,完毕如下综合练习:带球与踢球的结合:让agent一直向对方球门的方向带球,在进入对方禁7门(末速度最大为2.7)。波及到的详细函数请查看教材。VecPositionposGoal(52.5,0);{soc=dribble(ang,DRIBBLE_FAST)ACT->putCommandInQueue(turnNeckToObject(OBJECT_BAL试验三Demeer5基本动作21.试验目的熟悉demeer5并学会demeer5的基本使用措施,详细内容如下:(1)能理解UVA程序中本来的demeer5中的内容(2)能通过修改demeer5中的详细函数内容实现对场上球员的控制(3)能通过底层动作的简朴组合控制场上队员做出某些复杂动作2.试验设备:硬件设备:pc机软件设备:操作系统linux3.试验内容(1)在球队程序中找到playerTeams.cpp;(2)在player.cpp中找到demmer5函数;(3)阅读此段程序,并结合Monitor观测球员的详细行为(你将发队员中假如是离球近来的队员就去截球,否者则按阵型跑位);(4)修改demmer5函数变化队员的行为详细环节如下:①在demeer5函数中找到8VecPositionposGoal(PITCH_LENGTH/2.0,(-1+2*(WM->getCurrentCycle0%2))*0.4*SS->getGoalWidthOsoc=kickTo(posGoal,SS->getBallSpeedMax();//朝球门方向将球以最大ACT->putCommandInQueue(turnNeckToObject(OBJECT_BAL}②『控球」将此函数修改为if(WM->isBallKickableO){ACT->putCommandInQueue(soc);ACT->putCommandInQueue(turnNeckToObject(OBJECT_B}然后编译运行程序,观测球员的行为我们会发现当球可踢时,球员不再朝着球门的方向踢了,而是将球绕自己身体转动(uva的这个底层动作常常把球转丢!)③『带球』将此函数修改为soc=dribble(0.0,DRIBBLE_SLOW);//其中dribble函数中第一种参数方向-180~180之间,不一定是0.0ACT->putCommandInQueue(soc);ACT->putCommandInQueue(turnNeckToObject(OBJECT_B}后编译运行程序,观测球员的行为我们会发现当球可踢时,球员不再朝着球门的方向踢了,而是朝我们指定9④『传球』将此函数修改为if(WM->isBallKsoc=leadingPass(OBJECT_TEAMMATE_9,1);//9是接球的人,1是指球与接球人号码(1~11)的球员,不一定是OBJECT_TEAMMATE_9ACT->putCommandInQueue(soc);ACT->putCommandInQueue(turnNeckToObject(OBJECT_B然后编译运行程序,观测球员的行为我们会发现当球可踢时,球员不再朝着球门的方向踢了,而是将球传给ACT->putCommandInQueue(soc);ACT>putCommandInQueue(turnNeckToObject(OBJECT_BALL,soc));}编译程序,观测球员行为,我们会发现,当9号队员得到球后会朝前方带球,其他队员得到球后会将球传给9号(不管9号是不是越位).(5)根据以上描述完毕如下试验内容:假如在对方禁区内就射门,否则,假如是7,8,9号队员就朝前带球,其他队员将球传给9号(用WM->isInTheirPenaltyArea(WM->getBal判断球与否在对方禁区)假如队员的位置在自己半场就将球朝对方球门踢去,否者就朝前方带球(用WM->getBallPos().getXO来得到球的x坐标)当有人来抢球时(离自己很近),就将球传给离自己近来的队员,否则就自己带球(调用WM->getClosestRelativeInSet函数来得到离自己近来的己方或对方球员,通过posl.getDistanceTo(pos2)来得到两位置之间的距离)。Circleci我为圆心,2.0为半径intnum=WM->getNrInSetInCircle(OBJECT_SET_OPPONENTS,cir);//判断2.0if(num>0){soc=leadingPass(WM->getClosestRelativelnSet(OBJECT_SET_TEAMMATES),1);}elseif(WM->getBallPos(.getXO>0){if(WM->isInTheirPenaltyArea(WM->getBallPos()){posGoal(PITCH_LENGTH/2.0,(-1+2*(WM->getCurrentCycle(%2))*0.4*SS->getGoalWisoc=kickTo(posGoal,SS->getBallSpeedMax0);elseWM->getAgentObjectType()==OBJECT_TEAMMATE_9){soc=dribbl(PITCH_LENGTH/2.0,(-1+2*(WM->getCurrentCycle(%2))*0.4*SS->getGoalWidthO);soc=kickToACT->putCommandInQueue(soc);//放入命令队列ACT->putCommandInQueue(turnNeckToObject(OBJECT_BAL试验四复杂的动作决策1.试验目的深入理解demeer5并能熟悉的修改demeer5的内容以到达对场上的球员的控制(1)能理解UVA程序中本来的demeer5中的所有内容(2)能通过修改demeer5中的详细函数内容实现对场上球员的控制(3)能通过底层动作的简朴组合控制场上队员做出某些复杂动作决策(4)对WorldModel有初步的认识,学会在WorldModel,basicplayer里添加新函数2.试验设备硬件环境:PC软件环境:操作系统linux3.试验内容(2)在player.c中找到demmer5函数;(3)阅读此段程序,并结合monitor观测球员的详细行为(你将发队员中假如是离球近来的队员就去截球,否者则按阵型跑位);(4)修改demmer5函数变化队员的行为详细环节如下:①在demeer5函数中找到elseif(WM->getFastestInSetTo(OBJECT_SET_TEAMMATES,OBJECT_BALL,&iTmp)`WM->getAgentObjectType()&&!WM->isDeadBasoc=intercept(false);//截球if(mandType==CMD_DASH&&WM->getAgentStamina().getStamina()<SS->getRecoverDecThr()*SS->getStaminsoc.dPower=30.0*WM->getAgentStamina().getRecovery0;//慢速移动ACT->putCommandInQueue(soc);ACT->putCommandInQueue(turnNeckToObject(OBJECT_BALelseACT->putCommandInQueue(turnNeckToObject(OBJECT_BALL,中定义)观测在队员体力值不不小于多少时,带球速度会变慢。②目前我们来通过修改函数,来变化非if(WM->getAgentObjectType(O)==OBJECT_TEAMMATE_9)//假如是9号队员{ACT->putCommandInQueue(}然后编译运行程序,观测球员的行为我们会发现当9号不持球时,身体在一直的转动(此动作可用来找球)isOpponentAtAngleEx(AngDegangA,AngDegangB,doubledDist);该函数用来判断目前球员角度在angA~angB之间距离不不小于dDist的范围内是②.找到并打开WorldModel.c在里面填加一种新函数boolWorldModel::isOpponentAtAngleEx(AngDegangA,AngDegangB,doubledDist){VecPositionposAgent=getAgentGlobalPosition0;Vecfor(ObjectTo=iterateObjectStart(ilndex,OBJECT_SET_OPPONENTS);o!=OBJECT_ILo=iterateObjectNext(iIndex,OBJECT_SET_OPPONENTS)){posOpp=getGloba=(posOpp-posAgentposAgent.getDistanceTo(posOpp)<dDist)retur(VecPosition(52.5,0)-posAgent).getDirection();if(WM->isOpponentAtAngang+=45;elseif(WM->isOpponentAtAngleEx(ang,ang+45,6))anSoccerCommandsoc=dribble(ang,DRIBBLE_SLOWACT->putCommandInQueue(turnNeckToObject(OBJECT_BAL}然后编译运行程序,观测球员的行为,试分析球员的行为(6)根据以上描述完毕练习:通过基本动作的组合实现球员的如下行为判断守门员的位置,朝球门空隙较大的一方射门,(通过在WorldModel里建立新状态来判断,球门哪一方空隙较大,守门员的位置为VecPositionposGoalie=WM->getGlobalPosition(WM->getOppGoalieType();球门位置坐标为(52.5,0),可尝试朝(52.5,6.5)(52.5,-6.5)两点射门)vec=WM->getGlobalPosition(WM->getOppGoalieType();if(vec.getYO>0){VecPositionpos=(52.2,-6.5);soc=kickTo(pos,SS->getBallSpeedMaxO);soc=kickTo(pos1,SS->getBallSpeedMaxO);}ACT->putCommandInQuACT->putCommandInQueue(turnNeckToObject(OBJECT_BAL在BasicPlay里填加一种带球函数,规定假如无人阻挡(带球将要通过的路线附近没有对方球员)就朝球门方向带球,否则想措施避开对方球员带球前进(规定只要作出闪避的动作即可,不规定效果)。打开WorldModel.h,在里面预定义函数,即写入boolisOpponentAtAngleEx(AngDegangA,AngDegangB,double该函数用来判断目前球员角度在angA~angB之间距离不不小于dDist的范围内是否有对方队员。找到并打开WorldModel.c在里面添加一种新函数:boolWorldModel::isOpponentAtAngleEx(AngDegangA,AngDegangB,doubledDist){VecPositionposAgent=getAgentGlobalPosition();VecPositionangOpp;intiIndex;for(ObjectTo=iterateObjectStart(ilndex,OBJECT_ILLEGAL;o=iterateObjectNext(iIndex,OBJECT_SET_OPPONENTS)){posOpp=getGlobalPosition(o);angOpp=(posOpp-posAgent).getDiif(angA<=angOpp&&angOpp<=angB&&posAgent.getDistanceTo(posOpp)<dDiiterateObjectDone(iIndex);returnfalse;在playerteams.cpp中添加elseif(WM->isBallKickable()intnum=WM->getNrInSetInCircle(OBJECT_SET_OPPONENTS,cir);(VecPosition(52.5,0)-posAgent).getDirection();if(WM->isOpponentAtAngleEx(ang-45,ang,6))ang+=45;elseif(WM->isOpponentAtAngleEx(ang,ang+45,6))ang-=45;SoccerCommandsoc=dribble(DRIBBLE_SLOW);}else{soc=driACT->putCommandInQueue(turnNeckToObject(OBJECT_BALL,soc);}尝试修改视觉函数使得球员能更多的获得场上信息(规定不影响球员的动作)。先在Basicplayer.h中函数申明SoccerCommandview1122333提成1122333的视觉模式("1"代表60度,“2”代表120,“3”代表180)*/SoccerCommandBasicPlayer:://7-->共提成7份VecPositionposAgent=WM->getAgentGlobalPosition();AngDegWM->getAgentGlobalBodyAngle();AngDegangTurn=30;switch(WM->getCurrentCycle()%7){VecPosition::normalizeAngle(angBody+angTurn),POLAR)ACT->putCommandInQueue(turnNeckToPoint(posAgent+VecPosition(5,angBody,POLAR),soc));break;ACT->putCommandInQueue(SoccerCommand(CMD_CHANGEVIEW,VA_WIDE,VQ_HIGH);break;default:;}}再在playerTeams.cpp球可踢的条件下增长ACT->putCommandInQueue(view1122333(soc));试验五特殊比赛模式的设计1.试验目的掌握Robocup仿真机器人足球比赛中特殊比赛模式发生的条件;掌握Robocup仿真机器人足球比赛特殊比赛模式的规则规定;理解Robocup仿真机器人足球比赛特殊比赛模式的战术设计思想;深入熟悉WorldModel类。2.试验设备硬件环境:PC机软件环境:操作系统Linux3.试验内容(1)概述Robocup仿真机器人足球比赛特殊比赛模式包括角球(corner_kick)、界外球(kick_in)、定位球/任意球(free_kick)以及球门球(goal_kick)。(2)角球(corner_kick)当防守方球员将球踢出底线时,由攻打方开角球。Server一旦接受到发球队员发出的kick命令后,就将比赛模式设为正常的play_on模式。注意,和国际足联的规则类似,发球队员在其他球员接触球之前不能再触球,否则判犯规。此时,另一方球员须在一定期间(根据Manual的规定为300周期)内将球开出,否则算发球失误,由对方发定位球。在UVA_trilearn的原代码中,球员是不管这些特殊比赛模式的,统统是近来的球员跑向就需要我们手工编码完毕这些细节地方。一种简朴的设计思绪是:(1)假如比赛进入角球模式,则离球近来的球员A跑向球,而次近的球员B跑到某个接应点,等待A将球传过来;(2)A跑到球跟前(即进入可踢范围)时,不必立即将球开出,可以先看看场上环境,等B跑到预定位置并且体力恢复得差不多时再开球。以上设计思绪同学们在试验过程中只须完毕(1)即可,对于学有余力的同学可以考虑(2)的实现。下面列出几种也许用到的函数:PlayModeTWorldModel::getPlayMode()const返回比赛模式(或者直接用boolWorldModel:isCornerKickUsO判断是不是我方开角球);ObjectTWorldModel:getClosestInSetTo(ObjectSetTobjectSet,ObjectTo,double*dDist=NULL,doubledConfThr=-1.0)返回在对象集合objectSet中距离对象o近来的对象,只有当对象的可信度高于给定的阈值才被考虑,假如没有给出阈值则使用PlayerSettings中定义double*dDist=NULL,doubledConfThr=-1.0)返回在对象集合objectSet中距离对象o次近的对象,只有当对回距离。下面详细描述一下实现过程:首先,我们懂得demeer5(重要是围绕三句话展开的,即(1)假如球可踢,则用最大力量踢球;(2)假如球不可踢且我是队友中最快到球的队员,则去截球;(3)其他状况按战略点跑位。我们可以围绕这三句话来实现角球方略。即在角球模式下(1)假如球可踢,则传球给接应球员;(2)假如球不可踢且我是队友中最快到球的队员,则去发球;(3)其他状况下,假如我是离球次近的队员,那么我去接应。接着,有了这个基本思想后,我们开始编写代码。在demeer50中找到Elseif(WM->isBallKickable(){//ifkickable在里面加入我们的角球代码:If(WM->isCornerKickUSO){ACT->putCommandInQueue(kickTo(pointToKickTo(),SS->getBallSpee}这一部分代码是完毕开球动作。函数pointToKickToO是Player类的组员函数,返回一种VecPosition类型Player::pointToKickToO{VecPositionpos,temp;
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年度个人房屋抵押贷款合同续签协议
- 2025年度牛奶品牌线上线下联合营销合同4篇
- 2025年农用昆虫侦测器设备租赁合同
- 2025年古玩定值保险合同
- 2025年度风力发电场建设与运营合同范本4篇
- 2025年度农家乐亲子教育主题活动承包合同4篇
- 二零二五年度民间借贷合同终止与授权委托协议4篇
- 二零二五年度智能交通系统设计与实施合同6篇
- 2025年山东高唐县鱼丘湖风景区开发建设有限公司招聘笔试参考题库附带答案详解
- 2025年冀少新版九年级地理下册月考试卷含答案
- 2024年山东省泰安市高考物理一模试卷(含详细答案解析)
- 护理指南手术器械台摆放
- 肿瘤患者管理
- 2025年中国航空部附件维修行业市场竞争格局、行业政策及需求规模预测报告
- 2025春夏运动户外行业趋势白皮书
- 《法制宣传之盗窃罪》课件
- 通信工程单位劳动合同
- 2024年医疗器械经营质量管理规范培训课件
- 零部件测绘与 CAD成图技术(中职组)冲压机任务书
- 2024年计算机二级WPS考试题库380题(含答案)
- 高低压配电柜产品营销计划书
评论
0/150
提交评论