小型足球机器人角球脚本中稳定接球的实现
Posted AIplusX
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了小型足球机器人角球脚本中稳定接球的实现相关的知识,希望对你有一定的参考价值。
主要内容
主要内容在我的古月居博客:
小型足球机器人角球脚本中稳定接球的实现
场景分析
如上图所示,中场会在上半边的场内绕某点做公转的同时进行自转的操作,前锋会过去拿球,前锋拿到球过一段时间之后会将高尔夫球挑射到对面去,在前锋挑球之后,中场会根据最小二乘法拟合出来的直线去接球,接到球之后会直接射门,因此在这个场景中的中场接球动作就十分重要了,因为他要是接不到或者说接不稳球的话就会直接导致角球失误。
思路分析
具体程序是这个:
void get_k_b(const WorldModel* model, float& b_interrupt, float &k_slope, vector<point2f>& ball_points){
const int nCount = 4;//取帧数作为依据
vector<float> vResult;
float data_x[nCount];
float data_y[nCount];
for (int i = 0; i<nCount; i++){
ball_points.push_back(model->get_ball_pos(i));
data_x[i] = ball_points[i].x;
data_y[i] = ball_points[i].y;
cout << "ball_points[" << i << "]的坐标是" << ball_points[i] << endl;
}
Min2Method(data_x, data_y, nCount, vResult);//获得曲线的斜率和截距
k_slope = vResult[0];
cout << "k_slope的大小是" << k_slope << endl;
}
void get_angle(float& angle, const float& k_slope, const point2f& vel){
if (vel.angle() <= PI / 2 && vel.angle() >= (-PI / 2)){//在1,4象限
angle = atan(k_slope);
}
else if (vel.angle() >= PI / 2 && vel.angle() <= PI){//在第2象限
angle = atan(k_slope) + PI;
}
else if (vel.angle() <= (-PI / 2) && vel.angle() >= -PI){//在第3象限
angle = atan(k_slope) - PI;
}
cout << "vel.angle()的大小是" << vel.angle() << endl;
cout << "angle的大小是" << angle << endl;
}
//离球距离小于200才开始接球,否则保持静止
if (r2b_dist < 200){
//变动x坐标接球
if (x_dist<y_dist){
task.target_pos.y = runner.y ;
task.target_pos.x = target.x;
if (r2b_dist < 10){
task.target_pos = runner;
}
}
//变动y坐标接球
else{
task.target_pos.x = runner.x;
task.target_pos.y = target_x.y;
if (r2b_dist < 10){
task.target_pos = runner;
}
}
}
else
{
task.target_pos = runner;
}
task.orientate = ((opp_goal - runner).angle() );
以上这段程序在我的公众号AIplusX里面的程序资料的robot_soccer
文件夹里,具体位置看这个:
主要内容
主要内容在我的古月居博客:
小型足球机器人角球脚本中稳定接球的实现
以上是关于小型足球机器人角球脚本中稳定接球的实现的主要内容,如果未能解决你的问题,请参考以下文章