哈尔滨工程大学--人工智能大作业 - 图文

更新时间:2023-11-15 09:40:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

人工智能课程大作业

水中鱼-花样游泳

2013201411,宋梓瑚

摘要:水中鱼花样游泳比赛采用水中机器人水球比赛仿真器 2D 版(Underwater Robot Water Polo Game Simulator 2D Edition, 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 用于解决机器人软件开 发中异步问题的技术和基础软件库。

Simulation Mission仿真使命,即仿真比赛或实验项目,模拟机器鱼比赛或 实验项目的对象。

1

人工智能课程大作业

Simulation Environment仿真环境是指仿真使命运行所处的虚拟环境, 其中包括仿真场地(模拟比赛或实验用水池的对象)、零个或多个仿真水球(模拟比赛 或实验用水球的对象)、零个或多个仿真方形障碍物(模拟比赛或实验用方形障碍物的 对象)、零个或多个仿真圆形障碍物(模拟比赛或实验用圆形障碍物的对象)。

1.3水中鱼简介

Simulation RoboFish是仿真机器鱼,模拟比赛或实验用机器鱼的对象。Simulation Loop仿真循环是指仿真使命运行过程中所有仿真动作顺序执行一遍的过程。Simulation Cycle仿真周期,理论上考虑为比单个仿真循环所耗时间(与运行软硬件环 境有关,不能精确确定,在相同环境下,每次运行也不精确相同)预估大值稍大的确 定时间间隔(如 100 毫秒)。当前(2011325)平台仿真循环在推荐的软硬件配置(见2开 发环境)下所耗时间大约在 10-20 毫秒之间,为简化线程同步,在仿真使命的公共参数 类中设置了一个成员MsPerCycle,保存一个初始化仿真使命时传入的整数值,称为“每 周期毫秒数”,实际运行时的仿真周期值不确定,为MsPerCycle值加上当前周期仿真循 环所耗时间,通常MsPerCycle都取 100 毫秒,仿真周期值大约在 110-120 毫秒之间。仿 真使命倒计时以根据MsPerCycle计算出来的总周期数递减的方式进行,故界面上显示的 倒计时牌并不是按精确的世界时间递减。Simulation Action仿真动作包括将策略计算出来的决策命令拷贝到每支队伍每条仿 真机器鱼对象本身的决策字段(后续计算都是直接使用仿真机器鱼对象自身的决策命 令)、对所有动态对象(目前包括每支队伍的所有仿真机器鱼、仿真环境中仿真水球列 表的所有仿真水球)进行运动学计算、对所有对象(包括每支队伍的所有仿真机器鱼、 仿真环境中所有对象)相互进行碰撞处理(包括碰撞检测和碰撞响应)。

URWPGSim2D在PC机或工作站上进行开发,其硬件配置要求如下表所示。 表1.1 URWPGSim2D 运行硬件配置表 核心配件 CPU 内存 显卡 硬盘 低配置 Intel P4 2.0GHz 或同档次 AMD CPU 256MB 推荐配置 Intel E7300 2.66GHz 或以上 2GB 或以上 支持 DirectX 9.0,Pixel Shader 3.0,显存 128M 或以上 10GB 80GB 或以上 表1.1 URWPGSim2D 运行硬件配置表

搭建开发环境所需软件(PC 机或工作站)要安装 Windows XP Professional SP3 操作系统。按照默认设置安装DotNet3.5SP1(该软件包集成了SP1,且安装时不需要联网,官方网 站提供的安装包安装时需要联网)和XNA3.1。按照至少保留C#开发相关组件的要求安装(建议除SQL Server数据库外的部分完全安 装)Microsoft Visual Studio Team System 2008 Team Suite中文版with SP1并破解。 按照默认设置安装TortoiseSVN1.6.5和VS2008 的VisualSVN插件并破解。

2 算法原理与系统设计 2.1水中鱼平台坐标

场地坐标系及点和向量定义。以矩形场地中心为坐标原点,正右为正 X 轴,正下为正12 Z 轴;从正 X 到负 X 轴,顺时针为 0~π,逆时针为 0~-π。考虑与 MRDS 中的三维坐 标系一致,水平面用 XOZ 表示,Y 轴作为第三维。程序中涉及向量和点的定义,都使 用 XNA 库中的 Vector3 类型,用到其中的 X 和 Z 维,Y 维均置为 0。二维点和向量与 三位点和向量之间的转换,二维的 X 与三维的 X 对应,二维的 Y 与三维的 Z 对应。

2

人工智能课程大作业

2.2水中鱼定点的实现

(1)PoseToPose函数

PoseToPose 函数,也称作位姿到位姿控制函数,其作用是实现仿真机器鱼从当前位姿 到目标位姿的精确控制。位姿到位姿的控制分为两个阶段:第一阶段,控制仿真机器鱼快速 游动到临时目标点;第二阶段,控制仿真机器鱼游动至目标点。其中,临时目标点为终目 标位姿反向延长线上的某一点,其距离阈值可以调节。

在整个鱼类的编写中我们都使用了PoseToPose()函数,其主要功能就是函数的调用问题,在函数的调用过程中,其函数变量为

public static void PoseToPose(ref Decision decision, RoboFish fish, xna.Vector3 destPtMm, float destDirRad, float angThreshold, float disThreshold, int msPerCycle, ref int times)

函数参数表见表2.1 参数名称 decision fish destPtMm angThreshold disThreshold msPerCycle 参数类型 ref Decision RoboFish xna.Vector3 float float int 参数说明 PoseToPose 计算得到的决策变量值(输出参数) 执行 PoseToPose 的仿真机器鱼对象 目标位置坐标(目标点destDirRad float 目标方向弧度值(目标方向) 关键调节参数(中间方向与鱼体方向度数差值绝对值)上限,默认 30 度 关键调节参数(临时目标点与终目标点距离)阈值 每个仿真周期的毫秒数,即 mission.CommonPara.MsPerCycle times ref int 参见5.1.3(输出参数) 表2.1 函数参数表

(2)函数调用方法

A. 在策略代码 Strategy 类中添加整型成员变量,并初始化为 0,作为调用 PoseToPose 函数 的后一个参数 times 的输入,如 int times;。该变量用于记录算法进入第二阶段的时间。

B. 在策略代码 Strategy 类的成员函数(方法)中调用 PoseToPose。使用推荐参数的调用代 码如下,可根据实际调试情况进行调整。

StrategyHelper.Helpers.PoseToPose(ref decisions[i], mission.TeamsRef[teamId].Fishes[i], targetPoint, targetDirection, 30.0f, 8 * b.RadiusMm, mission.CommonPara.MsPerCycle, ref times);

C. 需要调用者自行判断是否已经完成位姿控制目标。完成一次位姿控制目标后,若需要再 次调用PoseToPose进行新的位姿到位姿控制,需要将第1步中定义的times参数的输入变 量(Strategy类的成员变量)清零。

(3)基本程序框架 using System;

using System.Collections.Generic; using System.Linq; using System.Text;

Using xna = Microsoft.Xna.Framework;

using URWPGSim2D.Common; using URWPGSim2D.StrategyLoader; namespace URWPGSim2D.Strategy {

public class Strategy : MarshalByRefObject, IStrategy {

#region reserved code never be changed or removed ///

/// override the InitializeLifetimeService to return null instead of a valid /// to ensure this type of remote object never dies

3

人工智能课程大作业

///

/// null

public override object InitializeLifetimeService(){ return null;

// makes the object live indefinitely } #endregion

///

/// 决策类当前对象对应的仿真使命参与队伍的决策数组引用 第一次调用GetDecision时分配空间

///

private Decision[] decisions = null; ///

/// 获取队伍名称 在此处设置参赛队伍的名称 ///

/// 队伍名称字符串 public string GetTeamName(){

return \Test Team\ }

///

/// 获取当前仿真使命(比赛项目)当前队伍所有仿真机器鱼的决策数据构成的数组 ///

/// /// 当前队伍所有仿真机器鱼的决策数据构成的 Decision 数组对象 public Decision[] GetDecision(Mission mission, int teamId){

// 决策类当前对象第一次调用 GetDecision 时 Decision 数组引用为 null if (decisions == null){

// 根据决策类当前对象对应的仿真使命参与队伍仿真机器鱼的数量分配决策数组空间 decisions = new Decision[mission.CommonPara.FishCntPerTeam]; }

#region 决策计算过程 需要各参赛队伍实现的部分 #endregion

// 请从这里开始编写代码 #endregion

return decisions; } } }

4

人工智能课程大作业

3 系统实现

3.1水中鱼寻找目标点

(1)水中鱼代码实现

我们通过调用PoToPose()方法对个各个鱼儿的目标点进行定位,由于其实位置的坐标都是不固定的,所以我们采用水中鱼的目标点固定的方式,对于鱼的头部设置目标点,由于两个坐标点的指引,采用矢量坐标和角度固定的方式进行调整。

① PoseToPose(ref this.decisions[0], mission.TeamsRef[teamId].Fishes[0], position_Origin_0_right, 3.141593f, 0.05235988f, 0.5235988f);

② PoseToPose(ref this.decisions[1], mission.TeamsRef[teamId].Fishes[1], position_Origin_1_right, 3.141593f, 0.05235988f, 0.5235988f);

③ xna.Vector3 positionSafe = new Vector3(-1230, 0, -544);

PoseToPose(ref this.decisions[1], mission.TeamsRef[teamId].Fishes[1], positionSafe, 3.141593f, 0.05235988f, 0.5235988f);

④ xna.Vector3 positionSafe = new Vector3(-1230, 0, 544);

PoseToPose(ref this.decisions[1], mission.TeamsRef[teamId].Fishes[1], positionSafe, 3.141593f, 0.05235988f, 0.5235988f);

(2)图形解释

港湾才刚刚睁开惺忪的睡眼,却看见我们的队伍已然开始集结。列阵,乏味的队列训练不仅仅在陆地,也在海面。这种海军最原始的操练方式,时至今日依然是训练的重要科目,无论是直线序列还是前后编队,都需要精湛的船艺去实现,即使日复一日的训练,,风向,海浪在众多不确定因素的影响下,失误也在所难免,唯有刻苦训练,才能在这片充满未知的海域中无所畏惧。

5

本文来源:https://www.bwwdw.com/article/etjv.html

Top