fira5v5项目说明_第1页
fira5v5项目说明_第2页
fira5v5项目说明_第3页
fira5v5项目说明_第4页
fira5v5项目说明_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Fira5V5仿真组介绍北京工业大学机器人协会2015年10月1、 Fira5v5项目介绍(一)Fira5v5仿真平台简介1.1 仿真型机器人足球介绍仿真型机器人足球(SimuroSot)SimuroSot 是一种仿真的软件系统,在该项比赛中,参赛的每个机器人不是 实际的机器人,而是用计算机模拟的虚拟机器人,它主要研究比赛策略,以软件为主,忽略机器人的硬件相关的需求。比赛中,我们仅关注的好似软件部分,主要研究用软件来实现既定的策略,完成给定的程序逻辑,主体的程序对语言要求很低,主要是要求拥有清晰的逻辑和编程思想。换言之,SimuroSot 类型的比赛是智力与智力的碰撞。1.2 仿真系统基本结构

2、 仿真系统是有FIRA 提供的仿真程序,这个程序通过DLL(动态连接库)接收双方策略,决策系统由各队提供自己的DLL程序。场上的数据由仿真程序计算给出,DLL接收处理并将要发给机器人的命令传给仿真程序。1.3 仿真平台及系统特点 开发者:澳大利亚的Dr.Jun Jo 领导的Griffith大学信息技术学院RSS开发小组 系统特点:1 机器人模型:Yujin机器人的物理模型2 模拟精确:碰撞检测完全,碰撞处理精确(采用商业游戏引擎公司Havok的碰撞处理引擎)3 界面:3维(采用Direct设计界面,3D Max模型)1.4 运行环境和开发工具仿真系统:3D Robot Soccer Simul

3、ator 1.5a编程语言:C/C+开发环境:MS Visual C+ 6.0 / MS VS2003模 板:使用仿真系统提供的源程序模板程序模板说明:程序使用动态连接库(DLL)方式硬件需求:Pentiun III 600 MHz或其以上级别的显示卡256M系统内存具有32M以上显存的TNT2或其以上级别的显示卡能够支持800×600以上分辨率的显示器软件需求:Windows98或以上版本的操作系统DirectX 8.0或以上的版本1.5 仿真平台的使用介绍1.5.1 运行程序的方法1 先将自己编写好的代码编译成dll文件,黄队程序拷到C:strategyyellow,蓝队程序拷到

4、C:strategyblue。2 在仿真平台中点击STRATEGIES按钮,选择C+,然后输入策略文件名,点击send。3 选择相应的比赛模式,按照规则摆放好球和球员后,点击start,开始比赛。1.5.2 主菜单A-各队载入策略B-选择以何种方式开球,依次为(自由球,开球,点球,任意球,球门球)C-选择开球方 黄队 蓝队D-开始比赛 E-比赛时间和比分F-修改时间和比分 G-开始一场新的比赛 H 平台帮助以及规则1.5.3 策略载入菜单 选择使用何种开发语言(Lingo/C+) 输入蓝队程序的文件名 输入黄队程序的文件名将各队程序载入平台打开状态查看窗口(相识了球和机器人的一些基本信息)1.

5、5.4 比赛控制菜单 A-立即回放 B-暂停 C-结束比赛1.5.5 回放控制菜单A- 从头开始回放B- 从前300个周期开始回放C- 一般速度回放D- 慢速度回放E- 逐帧回放F- 推出回放模式G- 当前进球无效 1.5.6 机器人的编号 Home代表己方机器人 Opp代表对方机器人 箭头所指的方向为机器人当前的正方向1.5.7 鼠标和键盘操作鼠标:在比赛开始前或比赛暂停时,可以用鼠标拖动球机器人到场地的任何位置键盘:在比赛开始前或比赛暂停时,当鼠标点击某一个机器人后可以用<-或->键来调整该机器人的角度。(二)仿真平台与策略关系及其运动策略开发指南2.1 什么是策略程序定义:策

6、略程序就是自己编写的能够使仿真平台中机器人按照预定方式运动的程序。通俗的来说,就是能够打比赛的程序。2.2 仿真平台与策略的运行关系2.2.1 仿真平台与策略程序的通信方式2.2.2 策略程序每个周期接受的数据仿真平台传递给策略程序的数据:4 己方、对方机器人坐标、角度(当前周期,上一周期)5 球的坐标(当前周期,上一周期) 2.2.3 策略程序每个周期发送的数据策略程序发送给仿真平台的数据:己方(homei)每个机器人的左轮速(pwm1)和右轮速(pwm2)2.3 仿真平台场地数据2.3.1 场地顶点坐标 2.3.2 场地的各种标志及尺寸 单位(厘米)机器人小车为理想模型。速度限制在-125

7、125。提供比赛状态(GameState)和控球方(WhosBall)两个参数。度量单位:英寸(如转换成厘米,需乘2.54)。球员方位角单位为角度。每方队员有五名,分别用不同的颜色来标示,右上角是黑色来区分前后,中间是代表队伍的颜色,在左下角是区分不同队员的标识: 0号一般是守门员,用大红色表示; 1号用紫色表示,2号用紫红色表示,这两个一般用作防守; 3号用绿色表示,4号用蓝绿色表示,这两个一般用作进攻;2.4 接口代码解析程序的接口API函数: 函数接口Create主要是程序的初始化,在程序开始时由系统调用,主要作用是定义所有的数据,如创建对应于:Environment->userD

8、ata的函数,其中可以用来存储我们的策略执行状态等 Extern “C” STRATEGY_API void Create (Enviroment *env); 函数接口Destroy主要是程序的销毁,在程序结束时由系统调用,主要作用是释放自定义的数据,如删除对应于:Environment->userData的数据 Extern “C” STARTGY_API void Destroy (Enviroment *env); 函数接口Strategy是程序的主要执行逻辑,由系统反复调用,每次调用相当于真实系统下计算出新的机器人左右轮的速率,并发送给小车,在这里,我们必须处理针对赛场上每一时

9、刻的对策,每秒调用60次,即仿真周期为1/60秒。Extern “C” STARTGY_API void Strategy (Enviroment *env); 实际上程序只需要这三个接口,而我们的工作就是完成这几个接口的处理。程序的基本数据定义Vector3D /位置向量定义typedef structdouble x, y, z;Vector3D;Bounds /区域范围定义typedef struct long left, right, top, bottom; Bounds;Robot /我方机器人的信息定义typedef struct Vector3D pos; /机器人的坐标位置

10、double rotation; /机器人当前的角度 double velocityLeft, velocityRight; /机器人的左右轮速 Robot;OpponentRobot /对方机器人信息的定义typedef struct Vector3D pos; /机器人的坐标位置 double rotation; /机器人当前的角度 OpponentRobot;Ball /小球信息的定义typedef struct Vector3D pos; /小球的坐标位置Ball;Environment /最重要的数据定义,包含所有运行时的信息,由系统刷新typedef struct Robot ho

11、mePLAYERS_PER_SIDE; /我方机器人数组 OpponentRobot opponentPLAYERS_PER_SIDE; /敌方机器人数组 Ball currentBall, /当前小球的位置 lastBall, /上一次小球的位置 predictedBall; /调用PredictBall()函数后可获得数据Bounds fieldBounds, /场地范围 goalBounds; /球门的位置与范围 long gameState; /当前比赛状态(各种定位球的标志变量)long whosBall; /由谁控制球void * userData; /用户自定义信息Environ

12、ment; 仿真系统每秒会调用dll中的接口函数Straegy接口60次,也就是我们的每个处理周期是16.67毫秒,在每次调用时,系统通过Environment * env这个指针向我们传递当前的系统的运行信息,然后我们运算后设置我方所有机器人的左右轮速,依此来控制机器人进行足球比赛。 需要注意的是:程序对于左右半场,应该分别处理。2.5 程序开发流程1 在C:Programe FilesRobot Soccer v1.5a目录下找到Stragegy Source文件。2 将此文件夹的代码拷出,并在VC6.0或.NET2003下打开,可以看到系统提供的接口代码,同时也有一些系统提供的策略,这些

13、策略只是提供参考,如果想要写出好的程序,必须改进,或重新编写。3 在我们看到的程序中像下面这样一类函数都是开发者留给我们参考的,这些以后都需要自己改进,自己编写。void PredictBall(Environment *env); /预测球的位置void Goaliel(Robot *robot, Envirnment *env); /守门员策略void NearBound2(Robot *robot, double vl, double vr, Envirnment *env);void Attack2(Robot *robot, Environment *env); /机器人向小球移动方

14、法void Defend(Robot *robot, Environment *env, double low, double high); /防守(后卫)void MoonAttack(Robot *robot, Environment *env); /移动攻击void MoonFollowOpponent(Robot *robot , OpponentRobot *opponent); /跟随对方球员void Velocity(Robot *robot, int vl, int vr); /给机器人发送左右轮速void Angle(Robot *robot , int desired_an

15、gle); /机器人转到指定角度void Positon (Robot *robot, double x, double y); /机器人移动到指定的坐标2.6 动作函数介绍 为了完成各种策略,基本的做法是用分而治之,逐步求精的方法,将主要的策略分为若干个基础策略,每个完整的策略分别由这些基本的策略组成,而这些策略又由一些基本的行为动作方式组成,我们的机器人控制程序最后就是由这些方法和行为动作方式来构成。 下面是一些基本的动作函数: void Angle (Robot *robot ,int desired_angle) /该动作可以让机器人转到任意指定的角度 int theta_e, vl,

16、 vr; theta_e = desired_angle (int) robot -> rotation; while( theta_e >180) theta_e -= 360; while(theta_e <-180) theta_e +=360; if (theta_e < -90) theta_e +=180; else if (theta_e>90) theta_e -= 180;if (abs(theta_e) > 50) vl = ( int ) (-9.0/90.0 * (double) theta_e); vr= (int ) (9.0/9

17、0.0 * (double) theta_e);else if(abs(theta_e) > 20) vl = (int ) (-11.0/90.0*(double)theta_e); vr=(int ) (11.0/90.0 *(double) theta_e);Velocity (robot, vl, vr);void Attack (Robot * robot, Environment *env)/ 机器人向小球的位置移动的方法 PredictBall (env); /估计小球的位置 Position( robot , env-> predictedBall.pos.x, e

18、nv->predictedBall.pos.y); /移动机器人到小球的位置void PredictBall( Environment *env) /预估小球的位置 double dx = env ->currentBall.pos.x env->lastBall.pos.x; double dy = env ->currentBall.pos.y env ->lastBall.pos.y; env->predictedBall.pos.x = env->currentBall.pos.x + dx; env->predictedBall.pos

19、.y = env->currentBall.pos.y + dy;void Position( Robot *robot, double x, double y )/该动作使移动小车到指定位置int desired_angle = 0, theta_e = 0, d_angle = 0, vl, vr, vc = 70;double dx, dy, d_e, Ka = 10.0/90.0;dx = x - robot->pos.x; /计算当前位置与目标的相对位移dy = y - robot->pos.y;d_e = sqrt(dx * dx + dy * dy); /计算机

20、器人到目标位置的直线距离if (dx = 0 && dy = 0) /计算当前位置到目标点的角度desired_angle = 90;elsedesired_angle = (int)(180. / PI * atan2(double)(dy), (double)(dx);theta_e = desired_angle - (int)robot->rotation;/ 当前机器人的角度与机器人到目标连线角度的夹角while (theta_e > 180) theta_e -= 360;while (theta_e < -180) theta_e += 360;

21、if (d_e > 100.) Ka = 17. / 90.;else if (d_e > 50)Ka = 19. / 90.;else if (d_e > 30)Ka = 21. / 90.;else if (d_e > 20)Ka = 23. / 90.;else Ka = 25. / 90.;if (theta_e > 95 | theta_e < -95)theta_e += 180;if (theta_e > 180) theta_e -= 360;if (theta_e > 80)theta_e = 80;if (theta_e &l

22、t; -80)theta_e = -80;if (d_e < 5.0 && abs(theta_e) < 40)Ka = 0.1;vr = (int)(-vc * (1.0 / (1.0 + exp(-3.0 * d_e) - 0.3) + Ka * theta_e);vl = (int)(-vc * (1.0 / (1.0 + exp(-3.0 * d_e) - 0.3) - Ka * theta_e);else if (theta_e < 85 && theta_e > -85)if (d_e < 5.0 &&

23、abs(theta_e) < 40)Ka = 0.1;vr = (int)( vc * (1.0 / (1.0 + exp(-3.0 * d_e) - 0.3) + Ka * theta_e);vl = (int)( vc * (1.0 / (1.0 + exp(-3.0 * d_e) - 0.3) - Ka * theta_e);elsevr = (int)(+.17 * theta_e);vl = (int)(-.17 * theta_e);Velocity(robot, vl, vr);2.7 在策略中调用动作的基本方法1 让小车沿直线跑到指定的点switch ( env->

24、gameState) case 0: Position (&env->home1,env->Home1.pos.x, 60); /让小车1沿着直线跑到X轴与机器人位置相等Y轴为60这个点去 Position (&env->home2,env->Home2.pos.y, 60); /让小车2沿着直线跑到Y轴与机器人位置相等X轴为60这个点去 break; case FREE_BALL: break; case PLACE_KICK: break; case PENALTY_KICK: break;case FREE_KICK: break; case GO

25、AL_KICK: break;让小车跑到指定的点对球员之间的配合有很大的关系,对于策略的配合极其重要。2 让小车转弯跑 switch (env->gameState) case 0: Position( &env->home1, 50, 60); /让小车跑到指定的坐标(50 ,60) break; case FREE_BALL: break; case PLACE_KICK: break; case PENALTY_KICK: break; case FREE_KICK: break; case GOAL_KICK: break;3 让小车跟着球跑switch (env-

26、>gameState) case 0: Position(&env->home1, env-> currentBall.pos.x, env-> currentBall.pos.y); /让小车1跟着球跑 break; case FREE_BALL: break; case PLACE_KICK: break; case PENALTY_KICK: break; case FREE_KICK: break; case GOAL_KICK: break;让小车跟着球跑也是一种进攻方法,这适合初学开发者。但这有一个毛病,容易犯规或造成乌龙球。4 让守门员根据球的Y轴

27、的移动而移动switch (env->gameState) case 0: Position(&env->home1, 91.0000, env->currentBall.pos.y); /让小车1守门,并且根据球的位置的移动而移动 break; case FREE_BALL: break; case PLACE_KICK: break; case PENALTY_KICK: break; case FREE_KICK: break; case GOAL_KICK: break;让守门员跟随着球的Y轴和移动是一种很有效的守门办法,但守门员又不能离球门太远,所以守门员的

28、移动还得在一定范围之内。5让小车以最快的速度到达指定的点 switch (env->gameState) case 0: Position(&env->home1, 60, env->currentBall.pos.x); /让小车1沿直线跑到X轴与机器人位置相等Y轴为60这个点去 break; Position(&env->home2, 60, env->currentBall.pos.y); /让小车2沿直线跑到Y轴与机器人位置相等X轴为60这个点去 Velocity(& env->home1,125,125); /让小车1以最快

29、的速度移动,125为左右轮最大的速度 Velocity(& env->home2,125,125); /让小车2以最快的速度移动,125为左右轮最大的速度 break; case FREE_BALL: break; case PLACE_KICK: break; case PENALTY_KICK: break; case FREE_KICK: break; case GOAL_KICK: break;2.8简单策略开发 程序主要是在接口Strategy中按照当前的状态处理比赛时的信息,通过分支-选择结构来分别处理各种不同的状况 switch(env->gameState)

30、 case 0: /default 却省情况下的策略(即没有选择任何比赛模式) /三个机器人进行追逐对方的策略 MoonFollowOpponent(&env->home1, &env->opponent2); MoonFollowOpponent(&env->home2, &env->opponent3); MoonFollowOpponent(&env->home3, &env->opponent4); /第四个抢球 MoonAttack( &env->home 4,env); Goaliel

31、 (&env->home 0, env); /守门员守门 break; case FREE_BALL: /发球坠球(自由球)时的策略 /跟随对方 MoonFollowOpponent(&env->home1, &env->opponent2); MoonFollowOpponent(&env->home2, &env->opponent3); MoonFollowOpponent(&env->home3, &env->opponent4); MoonAttack( &env->hom

32、e 4,env); /第四个抢球 Goaliel (&env->home 0, env); /守门员守门 break; case PLACE_KICK: /开球时的策略 MoonAttack( &env->home 2,env); /由二号小车发球 break; case PENALTY_KICK: /发生罚球(点球)时的策略 switch (env->whosBall) case ANYONES_BALL: MoonAttack( &env->home 1,env); break; case BLUE_BALL: MoonAttack( &env->home 4,env); break; case YELLOW_BALL: MoonAttack( &env->home 0,env); break; brea

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论