机器人策略程序设计框架
当欧洲足球联赛踢的漫天飞舞的时候,当国人又为国足难过的时候,机器人足球比赛也在热火朝天的举行着,这是考虑的一个3对3机器人的策略!
建立一个机器人群体类,该类实现机器人群体对球场形式的感知和提炼,综合形式决定战略目标,角色分配和各机器人的运动规划;用基本动作实现当前运动规划。总之,机器人群体完成了形式分析――判断和决定――行动的三阶段任务,最终由动作控制命令实现整体意图。其作用时把策略库组织成一个自包容的参数,方法库,模拟一个智能群体的全部功能:感知――决定――行动
1.机器人群体类的头文件:
CRobot
{
//预处理数据
RAWDATA rawData;//原始数据(当前机器人 球的方向)
NXTDATA nxtData;;//预测的后几个时刻机器人和球的方位
REFDATA refData; //提炼的决策依据
//预处理函数
Void GerRawData();//从VisionView.cpp获取当前全局数据 设置rawData
Void Predict();//根据当前和以前的机器人,球方位预测 预测器
Void SetRefData();//预处理器 一次调用三个预处理函数
//协调层数据
#define KICK_OFF 10 //标准形式化
#define PENALTY_KICK 11
#define FREE_KICK 12
#define FREE_BALL 13
#define GOALIE_LICK 14
#define DEFENS15
#define GoalieDefend 0 //禁区防守,120阵型
#define DoubleDefend 1 //重叠防守,120阵型
#define PassiveAttack 2//保守进攻,111阵型
#define ActiveAttack 3 //积极进攻,102阵型
Int nSituation;//形式,取以上4种值之一
Int attacker1;//主攻角色
Int attacker2;//协攻角色
Int defender1;//主守角色
Int defender2;//协守角色
//协调层函数
Void JudgeSituation();//依据refData判断形式,对nSituation赋值
Void InitRole();//根据形势和refData分配角色,即各角色赋值相应机器人ID
//运动规划层数据
#define Shoot 100 //单人射门技术动作
#define ………….. //其它战术动作
#define 2pass1 200 //2过1战术动作
#define ………….. //其它战术动作
#define Move 00 //直走基本动作
#define Angle 01 //转角基本动作
#define Position 02 //移动基本动作
#define …………. //其它基本动作
PATH path; //规划路径结构(链表30)-2个机器人
BOOL bIfChange;//是否维持原路径
Int nTechAct;.//技术动作代号
Int nCorAct;//战术动作代号 不包含具体参数
ACT act; //当前动作结构(包含int nBaseAct1,double x1,y1,&1,v1
// int nBaseAct2,double x1,y1, &2,v2
// int nBaseAct3,x3,y3, &3,v3)
//运动规划层函数
Void Makedecision(); //根据形式,角色和refData规划路径,确定2个机器人的技术动作
Void IfchangeDecision();//是否改变当前路径
MakeDecision 的工作原理
No IfchangeDecision() Yes 形式判断
禁区防守 重叠防守 保守防守 积极进攻 用switch-case语句
分别根据角色 refData决定战术动作序号
决定3个机器人的战术动作序号
决定3个机器人的技术动作序号
决定3个机器人的当前基本动作,存入act结构
//动作控制层函数;
Void Velocity(whichrobot,Vl,Vr);
Move(whichrobot,v) //左右轮速度相同
Void Angle(whichrobot,cur_&,desired_&); 反馈控制机制精确控制
Void Position(whichrobot,x,y, &,dx,dy,d&);
Void MakeAction();
{
Switch act.nBaseAct1
{
Case Move:
Move(Home1,v1);
Break;
Case Angle:
Case Position:
}
Switch act.nBaseAct2
{
Case ……….
}
Switch act.nBaseAct2
{
Case ……….
}
}
说明:MakeActions()的输入是act结构