当前位置:文档之家› 足球机器人实验报告

足球机器人实验报告

机器人足球实验报告专业:计算机科学与技术课程名称:足球机器人理论与实践指导老师:刘钊学号: 200813137197学生姓名:顾伟1.实验目的1)逐步掌握FIRA平台的使用2)掌握FIRA客户端智能体的编写3)完成指定的智能体功能与动作2.程序清单:#ifndef_AFX_NO_DAO_SUPPORT_5V5_PARAMETER#include<math.h>#define PI 3.14159265typedef struct {double x, y,z;} Vector3D;typedef struct {long left, right, top, bottom;} Bounds;typedef struct {Vector3D pos;} Ball;typedef struct {Vector3D pos;double rotation;} OpponentRobot;typedef struct {Vector3D pos; double rotation,velocityLeft, velocityRight;} Robot; typedef struct {Robot home[5];OpponentRobot opponent[5];Ball currentBall, lastBall, predictedBall;Bounds fieldBound, goalBound;long gameState;long whosBall;void *userData;} Environment;//基本数据处理函数组double angle(Vector3D p,Vector3D p0);double angle(double x,double y,double x0,double y0);double angle(Vector3D p0,Vector3D p);double dist(double x1,double y1,double x2,double y2);double dist(Vector3D p1,Vector3D p2);double differ_two_angle(double a1,double a2);Vector3D turn_blue(Vector3D p);Vector3D turn_yellow(Vector3D p);double turn_blue(double rotate);double turn_yellow(double rotate);//策略函数组void act_v(int no,double vl,double vr,Environment* env);void rotation_to(int po,double rotation,Environment* env);//po号机器人面向rotation 角度,基于坐标变换后的角度值void run_to_pos(int po,Vector3D pos,Environment* env);//po号机器人跑到pos位置void run_to_pos2(int po,Vector3D pos,Environment*env);#endif3在stdfx.cpp中添加基础数据处理函数实现过程#include"math.h"double differ_two_angle(double a1,double a2){double a=fabs(a1-a2);if(a>180) a=360-a;return a;}Vector3D turn_blue(Vector3D p){Vector3D pp;pp.x=p.y-41.8061;pp.y=93.4259-p.x;return pp;}Vector3D turn_yellow(Vector3D p){Vector3D pp;pp.x=41.8061-p.y;pp.y=p.x-6.8118;//6.8118Field Left x coordinatereturn pp;}double turn_blue(double rotate){if(rotate<0) rotate+=360;rotate-=90;if(rotate<0) rotate+=360;return rotate;}double turn_yellow(double rotate)//将系统的角度转换成黄队方坐标的角度{if(rotate<0) rotate+=360;//矫正角度rotate+=90;if(rotate>=360) rotate-=360;//再次矫正角度return rotate;}double angle(Vector3D p,Vector3D p0){return(angle(p.x,p.y,p0.x,p0.y));}double angle(double x,double y,double x0,double y0) //x,y为目的点,x0,y0为源点{//(x,y)(x0,y0)两点连线与x轴的夹角double dx,dy,dr;dx=x-x0;dy=y-y0;dr=dist(x,y,x0,y0);if(dr<0.0001) return 0;if(dy>=0) return(180*acos(dx/dr)/PI); //避免dy很小else return(360-180*acos(dx/dr)/PI);}Vector3D sub(Vector3D p1,Vector3D p2){Vector3D p;p.x=p1.x-p2.x;p.y=p1.y-p2.y;return p;}Vector3D add(Vector3D p1,Vector3D p2){ Vector3D p;p.x=p1.x+p2.x;p.y=p1.y+p2.y;return p;}double dist(Vector3D p1,Vector3D p2){return dist(p1.x,p1.y,p2.x,p2.y);}double dist(double x1,double y1,double x2,double y2){//(x1,y1) 和(x2,y2)两点间的距离double r;r=(x1-x2)*(x1-x2)+(y1-y2)*(y1-y2);return(sqrt(r));}bool is_in_rect(Bounds bd, Vector3D p){if(p.x>=bd.left&&p.x<=bd.right&&p.y>=bd.bottom&&p.y<=bd.top) return true;else return false;}4.添加dll文件入口函数和策略函数实现extern"C"void Create ( Environment *env ){}extern"C"void Strategy ( Environment *env ){//获得位置方向信息与坐标变换;机器人面向到指定角度;机器人追球;int Game_Side=0;if(env->home[0].pos.x>50)Game_Side = RIGHT;else Game_Side = LEFT;if(Game_Side==RIGHT){for(int i=0;i<5;i++)//获得位置信息且完成坐标转换{env->home[i].pos=turn_blue(env->home[i].pos);env->home[i].rotation=turn_blue(env->home[i].rotation);env->opponent[i].pos=turn_blue(env->opponent[i].pos);env->opponent[i].rotation=turn_blue(env->opponent[i].rotation);env->currentBall.pos=turn_blue(env->currentBall.pos);}}else//LEFT{for(int i=0;i<5;i++)//获得位置信息且完成坐标转换{env->home[i].pos=turn_yellow(env->home[i].pos);env->home[i].rotation=turn_yellow(env->home[i].rotation);env->opponent[i].pos=turn_yellow(env->opponent[i].pos);env->opponent[i].rotation=turn_yellow(env->opponent[i].rotation);env->currentBall.pos=turn_yellow(env->currentBall.pos);}}//机器人面向到指定角度rotation_to(1,60,env);//转到指定角run_to_pos(2,env->currentBall.pos,env); //追逐球}extern"C"void Destroy ( Environment *env ){}//策略组函数实现void act_v(int no,double vl,double vr,Environment* env){if(vl>125) vl= 125;if(vl<-125) vl=-125;if(vr>125) vr= 125;if(vr<-125) vr=-125;env->home[no].velocityLeft=vl;env->home[no].velocityRight=vr;}void rotation_to(int no,double jiao,Environment* env)//po号机器人面向rotation角度,基于坐标变换后的角度值{double vl,vr;int turn_left=jiao-env->home[no].rotation<=180?1:-1;double curr_ro=env->home[no].rotation;int qujian=0;double r=5.5;double jiaozhen_rot=jiao-env->home[no].rotation;jiaozhen_rot-=90;double jiaozhen_v=jiaozhen_rot*r;static double last_add_r=env->home[no].velocityRight;static double last_add_l=env->home[no].velocityLeft;static double last_ro=curr_ro;double k1=curr_ro-last_ro;if(k1>180) k1-=360;else if(k1<-180) k1+=360;double k2 = last_add_r - last_add_l;double k3 = 6.7*k1 + 0.7*k2;if(jiao-curr_ro>0 && jiao-curr_ro<=90)qujian=2;else if(jiao-curr_ro>90 &&jiao-curr_ro<=180)qujian=3;else if(jiao-curr_ro>180 &&jiao-curr_ro<=270)qujian=4;elsequjian=1;if(1==qujian || 2==qujian)vl=-jiaozhen_v*turn_left+k3;elsevl=jiaozhen_v*turn_left+k3;vl*=1.5;vr=-vl;act_v(no,vl,vr,env);last_ro=curr_ro;//做好历史记录last_add_r=env->home[no].velocityRight;last_add_l=env->home[no].velocityLeft;}void run_to_pos(int no,Vector3D pos,Environment*env)//po号机器人跑到pos位置{double vl,vr;double jiao=angle(pos,env->home[no].pos);int turn_left=jiao-env->home[no].rotation<=180?1:-1;double curr_ro=env->home[no].rotation;int qujian=0;double r=5.5;double jiaozhen_rot=jiao-env->home[no].rotation;jiaozhen_rot-=90;double jiaozhen_v=jiaozhen_rot*r;static double last_add_r=env->home[no].velocityRight;static double last_add_l=env->home[no].velocityLeft;static double last_ro=curr_ro;double k1=curr_ro-last_ro;if(k1>180) k1-=360;else if(k1<-180) k1+=360;double k2 = last_add_r - last_add_l;double k3 = 6.7*k1 + 0.7*k2;if(jiao-curr_ro>0 && jiao-curr_ro<=90)qujian=2;else if(jiao-curr_ro>90 &&jiao-curr_ro<=180)qujian=3;else if(jiao-curr_ro>180 &&jiao-curr_ro<=270)qujian=4;elsequjian=1;if(1==qujian || 2==qujian)vl=-jiaozhen_v*turn_left+k3;elsevl=jiaozhen_v*turn_left+k3;vl*=1.5;vr=-vl;vl+=125*turn_left;vr+=125*turn_left;act_v(no,vl,vr,env);last_ro=curr_ro;//做好历史记录last_add_r=env->home[no].velocityRight;last_add_l=env->home[no].velocityLeft;}void run_to_pos2(int no,Vector3D pos,Environment*env){}5:在Strategy.cpp里添加:extern "C" void Create ( Environment *env ){}extern "C" void Strategy ( Environment *env ){}extern "C" void Destroy ( Environment *env ){}6.编译,链接后就可生成相应的dll文件,在工程目录的DEBUG目录下,也可以改编译选项,将dll文件直接生成到指定目录下实验结果:实验心得:通过本次实践,体验了足球机器人的开发流程,不仅锻炼了我们编写代码的能力,也提高了我的计算机应用能力以及对计算机的学习兴趣。

相关主题