• 主页 > 体育问答
  • 足球机器人4V4对抗赛:normalplay作用及相关代码技巧

    冬天

    之前写过关于这次足球机器人4V4比赛的大致思路。详细信息请参见以下链接:

    它包括我的程序的开源代码,包括任务和技能。

    足球机器人大赛4V4比赛*

    那么在这篇文章中,我将分享NormalPlay在足球机器人比赛中的作用,以及我在代码中的NormalPlay技巧和前向实现原理。

    正常播放状态

    足球队的规则和竞赛规则_足球团队比赛规则有哪些_足球规则比赛团队有哪些

    让我用一个流程图来表示正常比赛在正常足球机器人比赛中的作用。

    如果整个足球机器人比赛规则中没有发生犯规,SOM软件将始终执行正常比赛脚本。事实上,在正常的比赛中,由于小型机器人的智能程度不如人类,人类会最大程度地自主避免犯规,但机器不会。即使在一小时的比赛中,所有犯规仍然很常见。 ,SOM软件执行了半个小时甚至半个小时以上。犯规的脚本,所以正常发挥很重要,但是我们也要注意其他场景的脚本(尤其是角球脚本,我会在我的另一篇博客中解释)。接下来我将从任务层和技能层开始。介绍正常播放场景。

    任务层

    任务脚本是一个有限状态机。任务层可以形象地比喻为策略游戏中玩家的对抗方式。这是我正常播放任务的内容。

    gPlayTable.CreatePlay{--该脚本已经转换为比赛脚本firstState = "initState", ["initState"] = {  switch = function()    if CIsGetBall("Kicker") then      return "initState"    end  end,  Kicker  = task.KickerTask("superforward"),  Receiver = task.ReceiverTask("receiverdef"),--预判球运动的位置  Tier = task.TierTask("tierdef"),--预判球运动的位置  Goalie  = task.GoalieTask("goalie")}, name = "normalplay_1"}

    事实上,如果你看一下我的正常玩法脚本,你会发现我在这个场景中的策略非常简单。从这个有限状态机中,您可以看到这个场景始终在一种状态下循环。如果你仔细观察,你可以看到我的前锋(踢球者)、中场球员(接球手)、后卫(梯队)和守门员(守门员)一直在执行单一动作。那么这些动作到底是什么?我画个图来帮助大家理解。

    足球规则比赛团队有哪些_足球团队比赛规则有哪些_足球队的规则和竞赛规则

    用语言来表达就是,守门员充当禁区的最后一道防线,而中场和后卫则始终布署在禁区线外。作为对抗中的第二道防线,门将、中场、后卫都会跟着前锋不断往外抢球->射门。因为门将、中场、后卫的动作比较相似,我会在我的另一篇博客中重点讲解,所以接下来我主要讲解前锋的技术。想法和实施。

    技能层

    足球团队比赛规则有哪些_足球队的规则和竞赛规则_足球规则比赛团队有哪些

    转发的主要技术点有两个: 1. 接收路由; 2.接球速度和投篮动作。我们来一一谈谈。

    接收路线

    第一个是接收路径。我先画一个示意图。

    足球队的规则和竞赛规则_足球规则比赛团队有哪些_足球团队比赛规则有哪些

    首先,我们可以获取球场上的几帧中的“足球”(也就是高尔夫球,我们接下来就叫高尔夫球)。获得这些高尔夫球的位置后,我们可以基于最小二乘法来拟合这些足球。高尔夫球的运动轨迹也是直线的,所以这就是高尔夫球所经过的路径。

    足球团队比赛规则有哪些_足球队的规则和竞赛规则_足球规则比赛团队有哪些

    那么得到这个运行路径有什么用呢?再看一下上面前锋的照片。我们已经获得了球的预期运动轨迹,并且可以根据图像帧之间的时间差得到球的运动方向。现在我们有了球的运动。轨迹和方向,接下来我们只需要把前锋的目标位置设置为球的轨迹,并将持球装置指向球的方向即可。接下来我就来解释一下技能代码。

    代码解释

    这两个函数用于求直线y=kx+b中的k和b参数

    足球团队比赛规则有哪些_足球队的规则和竞赛规则_足球规则比赛团队有哪些

    捕捉速度和射击动作

    经过实际测试,发现足球机器人在即将击球时会减速。与机器人公司工作人员沟通后,确认是下载到板子上的程序限制了这个动作,我们用户无法更改。的。但我们队的一位同学发现,当足球机器人的球门点设置在实际球门点前方一段距离时,足球机器人的运行速度会有质的提升!拿到球后,就是射门动作。这个射击动作也比较简单。当前锋拿到球的时候,他总是会判断自己是否拿到球。如果他拿到球,他就会执行投篮动作。射击动作是这样的。持球后改变足球机器人的方向到敌方球门。当足球机器人转向敌方球门中点与持球装置的方向几乎一致时,就会射门。我画了一个示意图。

    足球队的规则和竞赛规则_足球规则比赛团队有哪些_足球团队比赛规则有哪些

    代码解释

    足球队的规则和竞赛规则_足球规则比赛团队有哪些_足球团队比赛规则有哪些

    这就是我的前锋技能的主要作用。

    PlayerTask player_plan(const WorldModel* model, int robot_id){  PlayerTask task;  const float& dir = model->get_our_player_dir(robot_id);  const point2f& vel = model->get_ball_vel();  const point2f& ball = model->get_ball_pos();  const point2f& last_ball = model->get_ball_pos(1);  const point2f& runner = model->get_our_player_pos(robot_id);  const point2f opp_right(300,25);  const point2f opp_left(300, -25);  point2f opp_goal = -FieldPoint::Goal_Center_Point;  const point2f& goalie_pos = model->get_our_player_pos(model->get_our_goalie());  point2f temp(0, 0);  vector ball_points;  float b_interrupt(0);  float k_slope(0);  float angle (0);//小球运动的角度  bool ismove = (ball - last_ball).length() > ball_movingdist ? true : false;  float r2b_dist = (runner - ball).length();  float change_track = (ball-last_ball).length();   get_k_b(model, b_interrupt, k_slope, ball_points);  get_angle(angle , k_slope, vel);  //get_cross(temp, runner, b_interrupt, k_slope);   if (is_getball(ball,runner, dir) ){    if (dir > (opp_left-runner).angle() && dir < (opp_right-runner).angle()){      task.needKick = true;      task.kickPower = 127;    }    task.target_pos = runner + Maths::vector2polar(runcircle, dir);    task.orientate = (opp_goal-runner).angle();  }  else{    if (ismove){      if (is_ready_pass(ball, runner, opp_goal,angle) && r2b_dist < 60 ){        task.target_pos = runner;        task.orientate = (ball-runner).angle();      }      else{        task.target_pos = ball + Maths::vector2polar(change_track*magnification, angle);        task.orientate = (ball - runner).angle();      }    }    else{      task.orientate = (ball - runner).angle();      task.target_pos = ball;    }  }   if (r2b_dist<50){    task.needCb = true;  }   return task;}

    下面的函数是用来判断球是否在本帧图像中足球机器人方向的延长线上的函数函数。示意图如下。可以用在接球、追球、守门员等很多地方。

    足球队的规则和竞赛规则_足球团队比赛规则有哪些_足球规则比赛团队有哪些

    bool is_getball(const point2f& ball, const point2f& runner, const float& dir){  //miss参数需要在比赛时实地调试  cout << "进入is_getball的判断" << endl;  bool get_ball = (ball - runner).length() < miss && (fabs(anglemod(dir - (ball - runner).angle())) < getangle);  cout << "前锋里的(ball - runner).length()   " << (ball - runner).length() << endl;  cout << "前锋里的fabs(anglemod(dir - (ball - runner).angle())   " << fabs(anglemod(dir - (ball - runner).angle())) << endl;  if (get_ball){    return true;  }  else{    return false;  }}

    在技​​能的main函数中,这个条件判断一直是运行的,所以要离开追球状态,就需要拿球,所以if判断下面就是拿球后的操作。

    足球团队比赛规则有哪些_足球队的规则和竞赛规则_足球规则比赛团队有哪些

    下面是追球的具体动作设计(“嘴”就是小车的持球装置)

    足球规则比赛团队有哪些_足球队的规则和竞赛规则_足球团队比赛规则有哪些

    《四足机器人控制与仿真概论》课程将采用CoppeliaSim(V-rep)作为物理仿真引擎,Matlab作为编程语言,实现12自由度四足机器人的基本运动仿真。

    (扫描二维码查看课程详情)

    版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请联系本站,一经查实,本站将立刻删除。如若转载,请注明出处:https://www.fxk666.com/html/tiyuwenda/20937.html

    加载中~

    相关推荐

    加载中~