470 likes | 615 Views
0. 概述. 讲师:黄俊. 0.1 实物半自主足球机器人. 01. 0.2 仿真机器人足球比赛. 02. 0.3 仿真比赛的特点. 03. 仿真实物半自主机器人足球比赛; 所有的硬件设备均由计算机模拟实现; 简化比赛系统复杂度,减少硬件需求 ; 可控性好、无破坏性、可重复使用,不受硬件条件和场地环境的限制; 研究人工智能的绝佳平台 ;. 0.4 仿真比赛的开发基础. 04. 对 c 语言有一定的了解; 对 vc 开发环境比较熟悉; 有创造性思维和充分的想象力; 有克服困难的能力;. 1. 仿真平台使用介绍. 1.1 演示一场比赛. 01. 黄队.
E N D
0.概述 讲师:黄俊
0.2仿真机器人足球比赛 02
0.3仿真比赛的特点 03 • 仿真实物半自主机器人足球比赛; • 所有的硬件设备均由计算机模拟实现; • 简化比赛系统复杂度,减少硬件需求 ; • 可控性好、无破坏性、可重复使用,不受硬件条件和场地环境的限制; • 研究人工智能的绝佳平台;
0.4仿真比赛的开发基础 04 • 对c语言有一定的了解; • 对vc开发环境比较熟悉; • 有创造性思维和充分的想象力; • 有克服困难的能力;
1.1演示一场比赛 01 黄队 蓝队 武汉工程大学代表队 千人工程代表队 VS
opp1 opp3 home4 home2 opp0 home0 opp2 opp4 home3 home1 1.2机器人的编号 02 • Home代表己方机器人 • Opp 代表对方机器人 • 箭头所指的方向为机器人当前的正方向
1.3 机器人的辨认 03 • 每方队员有五名,分别用不同的颜色来标示,中间是代表队伍的颜色,在左下角是区分不同队员的标识: • 0号一般是守门员,用大红色表示; • 1号用紫色表示,2号用紫红色表示; • 3号用绿色表示,4号用蓝绿色表示;
1.4 MLS平台系统特点 04 • 机器人模型: Yujin机器人的物理模型。 • 模拟精确: 碰撞检测完全,碰撞处理准确仿真极为真实 (采用商业游戏引擎公司Havok的碰撞处理引擎 作品 帝国时代、CS等)。 • 系统界面: 3维(采用Director设计界面,3D Max建模)。
1.5 MLS平台系统需求 05 • 硬件需求: Pentium III 600 MHz或与其性能相当的CPU; 256M系统内存; 具有32M显存的TNT2或其以上级别的显示卡; 至少可以实现800×600分辨率的显示器; • 软件需求: Windows98或以上版本的操作系统; DirectX 8.0或以上版本;
1.6 软件开发环境 06 × • Lingo • Microsoft Visual C++6.0 • Microsoft Visual C++.NET 2003 • Microsoft Visual C++.NET 2005 √ √ √
1.7 MLS平台模板程序 07 • 平台提供了基本的策略开发框架,见安装目录下的Strategy Source目录 如:C:\Program Files\Robot Soccer v1.5a\Strategy Source)。 • 其模板程序为DLL动态联接库。
2.1 什么是策略程序? 01 • 定义: 策略程序就是自己编写的能够使仿真平台中机器人按照预定方式运动的程序。 • 通俗的来说,就是能够打比赛的程序。
2.2 仿真平台与程序的通讯方式 02 策略程序将接受的数据进行处理 策略程序接受数据 策略程序发送数据 MLS平台 MLS策略程序
2.3 场地信息介绍 03 (6.8118, 77.2392) (93.4259, 77.2392) (单位:英寸) (93.4259, 6.3730) (6.8118, 6.3730) (0,0) 说明:1英寸= 2.54厘米
2.4 场地的各种标志及尺寸 04 (单位:厘米)
2.5 球与车的长度尺寸 05 Y 约4.318 (单位:厘米) 球 转角方向 0° 前 机器人 转角方向 -179° 约7.9756 (0.0 ,0.0) X
2.6 程序每周期接受的数据 06 仿真平台传递给策略程序的数据: • 己方、对方机器人坐标、角度(当前周期,上一周期)。 • 球的坐标(当前周期,上一周期)。 • 场地数据。 • 控球方。
2.7 程序每周期发送的数据 07 策略程序发送给仿真平台的数据: • 己方( home[i] )每个机器人的左轮速度(vl)和右轮速度(vr) • 注: 当前发送的数据要到下一周期才能执行。
3.1 Velocity 动作函数 • 该动作可以给机器人自由的发轮速(在该程序中可以简单的认为轮速就是机器人的推进力)。 • 小车速度被限制为 – 125~ 125之间。 //形参robot 指定小车号 //形参vl 左轮速, vr 右轮速 void Velocity( Robot *robot, int vl, int vr );
3.1.1 机器人的运动控制 02 左轮速vl 右轮速vr 注: vl > vr 机器人顺时针旋转 vl < vr 机器人逆时针旋转 当轮速为负时, 机器人反向运动
3.12 Velocity 例子 03 // 一般动作 void NormalVelocity(Environment* env) { //让2号机器人两个轮子都以10的轮速前进 Velocity(&env->home[2], 20, 20); //让1号机器人左轮子都以-20的轮速后退 Velocity(&env-> home[1], -20, -20); //给3号机器人左轮发100, 右轮发20 Velocity(&env-> home[3], 100, 20); }
3.2 Angle 动作函数 04 • 该动作可以让机器人转到指定的任意角度。并做直线运动。 //形参robot 指定小车号 //形参desired_angle为转角度数 void Angle(Robot *robot,int desired_angle);
3.2.1 机器人的转角控制 05 当角度为负时, 机器人反向运动 左轮速vl 30度 +180度 右轮速vr - 180度 左轮速vl -60度 右轮速vr
3.2.2 Angle例子 06 void NormalAngle( Environment* env) { //让1号机器人转到30度角 Angle(&env->home[1], 30); //让3号机器人转到-60度角 Angle(&env->home[3], -60); }
3.3 Position 动作函数 07 • 该动作可以让机器人跑到场地上指定的任何地点。 //形参robot 指定小车号 /形参 x 目标位置X坐标 y 目标位置Y坐标 void Position( Robot *robot, double x,\double y );
3.3.1 机器人的指定点运动 08 球位置2 左轮速vl ?度 球位置1 右轮速vr Position 函数 根据目标位置可进行转角的控制。
3.3.2 Position例子 09 void NormalPosition( Environment* env ) { //让2号机器人追着球跑 Position( &env->home[2], env->lastBall.pos.x, \ env->lastBall.pos.y); //让2号机器人跑到场地中心 double x = ( env->fieldBounds.left + env- \ >fieldBounds.right ) / 2; double y = ( env->fieldBounds.bottom + env- \ >fieldBounds.top ) / 2; Position(&env->home[2], x, y); }
3.4 三个动作函数组合使用 10 void Normal( Environment* env ) { Position(&env->home[0], \ env->goalBounds.left + 10, \ env->currentBall.pos.y); //让0号机器人在球门附近跟着球 的y坐标跑 Velocity(&env->home[1], 10 , 70 ); //让1号机器人逆时针转圈 Position(&env->home[2], \ env->currentBall.pos.x, \ env->currentBall.pos.y ); //让2号机器人追着球跑 Angle(&env->home[3], -60); //让3号机器人追着球跑 Velocity(&env->home[4], 5 , 5 ); //让1号机器人逆时针转圈 }
3.5 注意事项 11 • 轮数速度限制为 -125~ 125 • 平台原始接口中提供了比赛状态(GameState)以及控球方(WhosBall)两个参数,但经过实际开发时发展他们毫无任何用处,故需要自己判断。 • 开发时发现他们毫无任何用处,故需要自己判断 • 场地度量单位为英寸,1英寸 = 2.54厘米 • 机器人角度的单位为角度(不是弧度) • 如果场地不同,队伍需要转换左右半场坐标
4.1 策略文件组成 01
4.2 策略类视图 02
4.3 InterFace.h接口文件 03 这个文件有与仿真平台通讯的一个结构Environment和三个函数的声明 //比赛开始时系统调用一次 extern "C" STRATEGY_API void Create ( Environment *env ); //比赛过程中由系统循环调用(策略都放在里面)。 extern "C" STRATEGY_API void Strategy ( Environment *env ); //比赛结束时系统调用一次 extern "C" STRATEGY_API void Destroy ( Environment *env );
4.3.1Strategy接口函数解析 04 • 函数接口Strategy是程序的主要执行逻辑,由系统反复调用,每次调用时系统通过Environment* env这个指针向我们传递当前周期系统提供信息,在这里,我们必须处理针对赛场上每一时刻的对策,通过策略运算设置己方小车的左右轮转速,来控制机器人进行足球比赛。 • 每秒调用次数依靠机器能力来定,默认为60次,即仿真的一个周期为1/60秒。 • extern "C" STRATEGY_API void Strategy ( Environment *env );
4.3.2 InterFace.h 05 • //主要的定义,包含所有运行时的的信息,由系统刷新 • typedef struct • { • Robot home[PLAYERS_PER_SIDE]; //我方机器人数组 • OpponentRobot opp [PLAYERS_PER_SIDE];//敌方机器人数组 • Ball currentBall, //当前小球的位置 • lastBall, //上一次小球的位置 • predictedBall; //预计的小球的位置 • Bounds fieldBounds, //场地范围 • goalBounds; //球门的位置与范围 • long gameState; //当前游戏的状态 • long whosBall; //由谁控制球 • void *userData; //用户自定义信息 • } Environment;
4.3.3 InterFace.h 06 //位置向量定义 typedef struct { double x, y, z; // x 和 y 为坐标值 } Vector3D;
4.3.4 InterFace.h 07 //己方机器人的信息定义 typedef struct { Vector3D pos; //机器人坐标 double rotation; //机器人方向角 double velocityLeft, velocityRight; //机器人左右轮速度 } Robot;
4.3.5 InterFace.h 08 //敌方机器人的信息的定义 typedef struct { Vector3D pos;//机器人的坐标位置 double rotation;//机器人当前的转角 } OpponentRobot;
4.3.6 InterFace.h 09 //小球的位置定义 typedef struct { Vector3D pos; //小球的坐标位置 } Ball;
4.3.7 InterFace.h 10 • // 场地区域范围 • typedef struct • { • long left, //场地左边界 • right, //场地右边界 • top, //场地上边界 • bottom; //场地下边界 • } Bounds;
4.4 Strategy.h 简单策略函数 11 • // 防守球门 • void Goalie1 ( Robot *robot, Environment *env ); • // 控制小车在球场边线的控制 • void NearBound2 ( Robot *robot, double vl, double vr, Environment *env ); • // 抢球 • void Attack2 ( Robot *robot, Environment *env ); • // 防守 • void Defend ( Robot *robot, Environment *env, double low, double high );
Strategy.h 简单策略函数 12 • // 机器人向小球的位置移动的方法 • void MoonAttack (Robot *robot, Environment *env ); • // 对敌方的跟踪 • void MoonFollowOpponent ( Robot *robot, OpponentRobot *opponent ); • // 预估小球的位置 • void PredictBall ( Environment *env );
4.5 Action.h 基本动作函数 13 • //设置小车轮子速度 • void Velocity ( Robot *robot, int vl, int vr ); • // 小车转角控制 • void Angle ( Robot *robot, int desired_angle); • //移动小车到指定位置 • void Position( Robot *robot, double x, double y );