睿抗足球机器人Day6

一、传球机器人基本位置代码分析

1.最基本代码现象

 此时的lua脚本里面只有调用前锋的代码,没有调用中场机器人的代码,所以此时我场上的中场机器人是不懂得。但是我的C++函数里面写了关于中场机器人的坐标和朝向,所以我的仿真软件里面的现象就是,前锋机器人根据我场上中场机器人(中场机器人不动,但是依然具有坐标和朝向)来找他的位置。

#include "utils/ball.h"
#include "utils/basevision.h"
#include "utils/constants.h"
#include "utils/FilteredObject.h"
#include "utils/game_state.h"
#include "utils/historylogger.h"
#include "utils/matchstate.h"
#include "utils/maths.h"
#include "utils/PlayerTask.h"
#include "utils/referee_commands.h"
#include "utils/robot.h"
#include "utils/singleton.h"
#include "utils/util.h"
#include "utils/vector.h"
#include "utils/worldmodel.h"

//用户注意;接口需要如下声明
extern "C"_declspec(dllexport) PlayerTask player_plan(const WorldModel* model, int robot_id);
//创非凡demol1
PlayerTask player_plan(const WorldModel*model, int robot_id)
{
PlayerTask task;


int receiver_id = -7;
for (int i = 0; i < 6; i++)
{
	if (i == robot_id || i == model->get_our_goalie())
	{
		continue;
	}
	if (model->get_our_exist_id()[i])
	{
		receiver_id = i;
	}
}
//获取中场机器人的向量坐标
const point2f& receiver_pos = model->get_our_player_pos(receiver_id);
//获取中场球员的朝向
const float&receiver_dir = model->get_our_player_dir(receiver_id);
//获取前锋机器人的向量坐标
const point2f& kicker_pos = model->get_our_player_pos(robot_id);
//获取前锋球员的朝向
const float&kicker_dir = model->get_our_player_dir(robot_id);
//获取球的向量坐标 
const point2f&ball_pos = model->get_ball_pos();
//这里设定face_dir是前锋传球机器人朝向球的方向
const float&face_dir = (receiver_pos - ball_pos).angle();
//到达目标点朝向:队员正对球
task.orientate = face_dir;
//需要到达目标点的坐标=球的位置+向量偏移距离fac_dir反方向偏移10
task.target_pos = ball_pos - Maths::vector2polar(100, face_dir);



return task;
}

如果球员配置里面是以下这种配置,其lua函数还有c++函数不变的情况下,现象就是前锋只有对着球的一个朝向,距离球只有100,球在哪里前锋都是这个状态,相当于是一个根据球而它自身的位置相比前一个是平移的状态

2.最基本代码结论

这个是最简单的一个传球机器人位置判断的一个C++程序,但是用这个在一个完整的二次传球函数中,它的找球代码往往会因为其它程序冲突所以可能导致我们第一步的找球程序都实现不了,所以我们对这个代码不断地加更加精确的判断,让它在找球的时候更加的高效

二、优化版一代码分析

1.优化版一代码
#include "utils/ball.h"
#include "utils/basevision.h"
#include "utils/constants.h"
#include "utils/FilteredObject.h"
#include "utils/game_state.h"
#include "utils/historylogger.h"
#include "utils/matchstate.h"
#include "utils/maths.h"
#include "utils/PlayerTask.h"
#include "utils/referee_commands.h"
#include "utils/robot.h"
#include "utils/singleton.h"
#include "utils/util.h"
#include "utils/vector.h"
#include "utils/worldmodel.h"

//用户注意;接口需要如下声明
extern "C"_declspec(dllexport) PlayerTask player_plan(const WorldModel* model, int robot_id);
//创非凡demol1
PlayerTask player_plan(const WorldModel*model, int robot_id)
{
PlayerTask task;

/*point2f we_pos(-30, 10);
task.target_pos = we_pos;*/


int receiver_id = -7;
for (int i = 0; i < 6; i++)
{
	if (i == robot_id || i == model->get_our_goalie())
	{
		continue;
	}
	if (model->get_our_exist_id()[i])
	{
		receiver_id = i;
	}
}
//获取中场机器人的向量坐标
const point2f& receiver_pos = model->get_our_player_pos(receiver_id);
//获取中场球员的朝向
const float&receiver_dir = model->get_our_player_dir(receiver_id);
//获取前锋机器人的向量坐标
const point2f& kicker_pos = model->get_our_player_pos(robot_id);
//获取前锋球员的朝向
const float&kicker_dir = model->get_our_player_dir(robot_id);
//获取球的向量坐标 
const point2f&ball_pos = model->get_ball_pos();
//这里设定face_dir是前锋传球机器人朝向球的方向
const float&face_dir = (receiver_pos - ball_pos).angle();
//到达目标点朝向:队员正对球
task.orientate = face_dir;
//需要到达目标点的坐标=球的位置+向量偏移距离fac_dir反方向偏移10
task.target_pos = ball_pos - Maths::vector2polar(10, face_dir);

const float&receiver_to_ball = (ball_pos - receiver_pos).angle();
const float&ball_to_passer = (kicker_pos - ball_pos).angle();
bool pass = fabs(receiver_to_ball - ball_to_passer) < 0.5;
if (pass)
{
	
	task.kickPower = 127;
	task.needKick = true;
}


return task;
}

 此时的仿真软件里面的人员配置是前锋和中场,所以C++里面所需要的数据是能够提供上去的。lua脚本里面暂时是没有写中场机器人执行的任务的,这样可以更好的观察前锋机器人的代码执行情况。

2.现象

(1)中场机器人不会动,点开执行代码之后,前锋机器人首先是执行接球位置的代码,就是先去到它的点位上,但是因为距离设置的是10,所以我会担心到时候会不会因为距离太近然后碰到球

(2)加了一个判断是否踢球的代码,也就是我第一个优化我代码的地方

优化部分的判断代码

这个代码的现象就是,会在我的前锋机器人到达点位之后,它会判断是否执行踢球条件,它只能判断,如果没有到达它判断的条件的话,他就不会执行它踢球的代码,那么他就会一直在我的球位置附近转圈圈。我的想法就是,如果它没有符合我的踢球条件的话,我的机器人就再一次找它合适的位置,然后再进行判断再进行踢球

(3)这个lua脚本还是要写中场机器人的接球位置代码,因为如果不写的话,我中场的位置在我点执行前就已经确定好了,但我的前锋不是每一次都能够准确去到我的指定位置,这个时候我前锋的朝向会变但是我中场机器人的朝向不会变,而此时的判断又正好成立,那么我的机器人就直接踢球了,这样的错误率就比较高

  • 6
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值