人工智能课程大作业1水中鱼-花样游泳2013201411,宋梓瑚摘要:水中鱼花样游泳比赛采用水中机器人水球比赛仿真器2D版(UnderwaterRobotWaterPoloGameSimulator2DEdition,URWPGSim2D)软件作为比赛平台。仿真器包括服务端(URWPGSim2DServer)和客户端(URWPGSim2DClient)。服务端模拟水中比赛环境,控制和呈现比赛过程及结果,向客户端发送实时比赛环境和过程信息;半分布式客户端模拟比赛队伍,加载比赛策略,完成计算决策过程,向服务端发送决策结果。关键词:水中鱼花样游泳;计算平台;比赛服务器本组成员:宋梓瑚,陈宣宇,王炜镝,张浩然本人分工:水中鱼姿态编写、水中鱼代码设计1引言1.1水中鱼比赛规则2D仿真花样游泳是由1支队伍参与,每支队伍10条仿真机器鱼,不规定仿真水球和仿真障碍物的非对抗性比赛项目。2D仿真花样游泳比赛项目采用标准仿真场地(3000mm*2000mm)1.5倍尺寸的场地。比赛过程:初始状态是1支队伍的10条仿真机器鱼,位置和方向均随机分布在仿真场地上。比赛开始后,1号仿真机器鱼在比赛场地内随机游动,不受参赛队伍的策略控制;其他9条仿真机器鱼由参赛队伍编写策略进行控制,配合1号仿真机器鱼进行表演,依次完成标准动作和自由动作。(1)标准动作阶段:在标准动作阶段参赛队伍按照规则完成标准动作。标准动作为:1个包含阿拉伯数字的造型、1个封闭几何图形、保持所有鱼相同造型和动作5秒以上、两个造型之间5秒的画面静止。标准动作顺序不限,可以同时出现。(2)自由动作阶段:在自由动作阶段参赛队伍自行设计动作进行表演。比赛时间递减到零之前,如果队伍表演完成,由参赛队伍向裁判说明,比赛结束,并由裁判根据计分规则给出得分。比赛时间递减到零,如果队伍表演未完成,比赛结束,由裁判根据可观赏性和协作性给出得分。本项目旨在考察策略运行结果的可观赏性和协作性。平台提供有背景音乐加载功能,可通过服务端背景音乐加载界面加入背景音乐。比赛时间为5分钟,其中标准动作阶段3分钟,自由动作阶段2分钟,比赛只进行一次,比赛过程中不得暂停。1.2水中鱼设计思想URWPGSim2D的设计采用面向对象思想。从对象建模的角度看,包括仿真机器鱼、仿真环境和仿真使命(比赛或实验项目)三类模型,以仿真使命模型为中心。仿真使命包括仿真机器鱼队伍列表和仿真环境。仿真使命启动运行后,仿真循环将周期性地持续进行,直到设定的仿真时间耗完、人为/程序决定暂停/停止。并发协调运行时,MRDS用于解决机器人软件开发中并发问题的技术和基础软件库。分布式软件服务,MRDS用于解决机器人软件开发中异步问题的技术和基础软件库。SimulationMission仿真使命,即仿真比赛或实验项目,模拟机器鱼比赛或实验项目的对象。人工智能课程大作业2SimulationEnvironment仿真环境是指仿真使命运行所处的虚拟环境,其中包括仿真场地(模拟比赛或实验用水池的对象)、零个或多个仿真水球(模拟比赛或实验用水球的对象)、零个或多个仿真方形障碍物(模拟比赛或实验用方形障碍物的对象)、零个或多个仿真圆形障碍物(模拟比赛或实验用圆形障碍物的对象)。1.3水中鱼简介SimulationRoboFish是仿真机器鱼,模拟比赛或实验用机器鱼的对象。SimulationLoop仿真循环是指仿真使命运行过程中所有仿真动作顺序执行一遍的过程。SimulationCycle仿真周期,理论上考虑为比单个仿真循环所耗时间(与运行软硬件环境有关,不能精确确定,在相同环境下,每次运行也不精确相同)预估大值稍大的确定时间间隔(如100毫秒)。当前(2011325)平台仿真循环在推荐的软硬件配置(见2开发环境)下所耗时间大约在10-20毫秒之间,为简化线程同步,在仿真使命的公共参数类中设置了一个成员MsPerCycle,保存一个初始化仿真使命时传入的整数值,称为“每周期毫秒数”,实际运行时的仿真周期值不确定,为MsPerCycle值加上当前周期仿真循环所耗时间,通常MsPerCycle都取100毫秒,仿真周期值大约在110-120毫秒之间。仿真使命倒计时以根据MsPerCycle计算出来的总周期数递减的方式进行,故界面上显示的倒计时牌并不是按精确的世界时间递减。SimulationAction仿真动作包括将策略计算出来的决策命令拷贝到每支队伍每条仿真机器鱼对象本身的决策字段(后续计算都是直接使用仿真机器鱼对象自身的决策命令)、对所有动态对象(目前包括每支队伍的所有仿真机器鱼、仿真环境中仿真水球列表的所有仿真水球)进行运动学计算、对所有对象(包括每支队伍的所有仿真机器鱼、仿真环境中所有对象)相互进行碰撞处理(包括碰撞检测和碰撞响应)。URWPGSim2D在PC机或工作站上进行开发,其硬件配置要求如下表所示。表1.1URWPGSim2D运行硬件配置表核心配件低配置推荐配置CPUIntelP42.0GHz或同档次AMDCPUIntelE73002.66GHz或以上内存256MB2GB或以上显卡支持DirectX9.0,PixelShader3.0,显存128M或以上硬盘10GB80GB或以上表1.1URWPGSim2D运行硬件配置表搭建开发环境所需软件(PC机或工作站)要安装WindowsXPProfessionalSP3操作系统。按照默认设置安装DotNet3.5SP1(该软件包集成了SP1,且安装时不需要联网,官方网站提供的安装包安装时需要联网)和XNA3.1。按照至少保留C#开发相关组件的要求安装(建议除SQLServer数据库外的部分完全安装)MicrosoftVisualStudioTeamSystem2008TeamSuite中文版withSP1并破解。按照默认设置安装TortoiseSVN1.6.5和VS2008的VisualSVN插件并破解。2算法原理与系统设计2.1水中鱼平台坐标场地坐标系及点和向量定义。以矩形场地中心为坐标原点,正右为正X轴,正下为正12Z轴;从正X到负X轴,顺时针为0~π,逆时针为0~-π。考虑与MRDS中的三维坐标系一致,水平面用XOZ表示,Y轴作为第三维。程序中涉及向量和点的定义,都使用XNA库中的Vector3类型,用到其中的X和Z维,Y维均置为0。二维点和向量与三位点和向量之间的转换,二维的X与三维的X对应,二维的Y与三维的Z对应。人工智能课程大作业32.2水中鱼定点的实现(1)PoseToPose函数PoseToPose函数,也称作位姿到位姿控制函数,其作用是实现仿真机器鱼从当前位姿到目标位姿的精确控制。位姿到位姿的控制分为两个阶段:第一阶段,控制仿真机器鱼快速游动到临时目标点;第二阶段,控制仿真机器鱼游动至目标点。其中,临时目标点为终目标位姿反向延长线上的某一点,其距离阈值可以调节。在整个鱼类的编写中我们都使用了PoseToPose()函数,其主要功能就是函数的调用问题,在函数的调用过程中,其函数变量为publicstaticvoidPoseToPose(refDecisiondecision,RoboFishfish,xna.Vector3destPtMm,floatdestDirRad,floatangThreshold,floatdisThreshold,intmsPerCycle,refinttimes)函数参数表见表2.1参数名称参数类型参数说明decisionrefDecisionPoseToPose计算得到的决策变量值(输出参数)fishRoboFish执行PoseToPose的仿真机器鱼对象destPtMmxna.Vector3目标位置坐标(目标点destDirRadfloat目标方向弧度值(目标方向)angThresholdfloat关键调节参数(中间方向与鱼体方向度数差值绝对值)上限,默认30度disThresholdfloat关键调节参数(临时目标点与终目标点距离)阈值msPerCycleint每个仿真周期的毫秒数,即mission.CommonPara.MsPerCycletimesrefint参见5.1.3(输出参数)表2.1函数参数表(2)函数调用方法A.在策略代码Strategy类中添加整型成员变量,并初始化为0,作为调用PoseToPose函数的后一个参数times的输入,如inttimes;。该变量用于记录算法进入第二阶段的时间。B.在策略代码Strategy类的成员函数(方法)中调用PoseToPose。使用推荐参数的调用代码如下,可根据实际调试情况进行调整。StrategyHelper.Helpers.PoseToPose(refdecisions[i],mission.TeamsRef[teamId].Fishes[i],targetPoint,targetDirection,30.0f,8*b.RadiusMm,mission.CommonPara.MsPerCycle,reftimes);C.需要调用者自行判断是否已经完成位姿控制目标。完成一次位姿控制目标后,若需要再次调用PoseToPose进行新的位姿到位姿控制,需要将第1步中定义的times参数的输入变量(Strategy类的成员变量)清零。(3)基本程序框架usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;Usingxna=Microsoft.Xna.Framework;usingURWPGSim2D.Common;usingURWPGSim2D.StrategyLoader;namespaceURWPGSim2D.Strategy{publicclassStrategy:MarshalByRefObject,IStrategy{#regionreservedcodeneverbechangedorremoved///summary///overridetheInitializeLifetimeServicetoreturnnullinsteadofavalid///toensurethistypeofremoteobjectneverdies人工智能课程大作业4////summary///returnsnull/returnspublicoverrideobjectInitializeLifetimeService(){returnnull;//makestheobjectliveindefinitely}#endregion///summary///决策类当前对象对应的仿真使命参与队伍的决策数组引用第一次调用GetDecision时分配空间////summaryprivateDecision[]decisions=null;///summary///获取队伍名称在此处设置参赛队伍的名称////summary///returns队伍名称字符串/returnspublicstringGetTeamName(){return3VS3TestTeam;}///summary///获取当前仿真使命(比赛项目)当前队伍所有仿真机器鱼的决策数据构成的数组////summary///paramname=mission服务端当前运行着的仿真使命Mission对象/param///paramname=teamId当前队伍在服务端运行着的仿真使命中所处的编号///用于作为索引访问Mission对象的TeamsRef队伍列表中代表当前队伍的元素///returns当前队伍所有仿真机器鱼的决策数据构成的Decision数组对象/returnspublicDecision[]GetDecision(Missionmission,intteamId){//决策类当前对象第一次调用GetDecision时Decision数组引用为nullif(decisio