RoboCup智能机器人足球教程(三)

2023-05-16

RoboCup智能机器人足球教程(三)

实现守门员代码

守门员逻辑实现比较容易,但是最好开始的时候画好流程图,理顺逻辑,守门员一直盯着球,当球距离守门员够近的时候,守门员前去扑球,扑到球后朝对面射出,逻辑图为:
在这里插入图片描述
实现逻辑的办法就是定义状态变量,用if控制,在这里,我们定义如下几个重要的状态变量:
isCatchBall: 球是否在脚下

isMove: 是否进行了瞬移,守门员扑到球后是可以进行瞬移的,我们要利用好。

主要架构的伪代码为:

if isCatchBall == true
    search goal
    kick
else
    if ball_distance < 1
        catch ball
    else 
        look at ball

下面是完全的代码:

if(id == 1){
    if (std::strncmp(msg, "(see ", 5)==0){
        if(isCatchBall == 0){
            double ball_distance = 0; // 球的方向
            double ball_direction = 0; // 球的角度
            char *p; 
            p = strstr(msg, "(ball)"); 
            if (p == 0) { // 表示看不见球
                sprintf(command, "(turn 50)"); // 转50度
                sendMessage(command);
                return;
            }
            std::sscanf(p, "(ball) %lf %lf", &ball_distance, &ball_direction);
            // 如果与球的角度相差太大,转向球的方向
            if (ball_direction >5 || ball_direction < -5) { 
                sprintf(command, "(turn %lf)", ball_direction);
                sendMessage(command);
                return;
            }
            // 当球非常远的时候
            if(ball_distance > 13){
                isMove=0; isCatchBall = 0; // 这里是进行防错处理的
            }
            // 当球不近也不远的时候
            if(ball_distance>1 && ball_distance<13){
                sprintf(command, "(dash 200)"); // 冲向球的位置
                sendMessage(command);
                isMove=0; isCatchBall = 0; // 这里是进行防错处理的
                return;
            }
            // 当球很近的时候
            if (ball_distance<1) { // 如果与球的距离小于3
                sprintf(command, "(catch %lf)", ball_direction); //发送catch命令以捕获球
                sendMessage(command);
                isCatchBall = 1; // 抓住球的布尔变量
                return;
            }
        }
        // 抓住球的时候
        if(isCatchBall == 1)
        {   // 如果没有瞬移,先进行瞬移,catch球之后允许瞬移
            if(isMove == 0) // 这个布尔变量是为了防止二次瞬移的
            {  
                sprintf(command, "(move -50 0)");
                sendMessage(command);
                isMove = 1;
                return;
            }
            // 现在开始看门
            double goal_distance = 0; // 门距离
            double goal_dirction = 0; // 门方向
            char *p;
            if(side == 1) p = strstr(msg, "(goal r)"); // 找到门的字符串地址
            else p = strstr(msg, "(goal l)");
            if (p != 0) // 获取门的位置信息
            {
                if(side == 1) std::sscanf(p, "(goal r) %lf %lf", &goal_distance, &goal_dirction);
                else std::sscanf(p, "(goal l) %lf %lf", &goal_distance, &goal_dirction);
                // 踢球!
                sprintf(command, "(kick 100 %lf)", goal_dirction+20); // 朝门的方向踢球
                sendMessage(command);
                isCatchBall = 0;
                isMove = 0;
            }
            else{   // 没看到门,转身看门
                sprintf(command, "(turn 50)");
                sendMessage(command);
            }
            return;
        }
    }
}

RoboCup智能机器人足球教程(二)

RoboCup智能机器人足球教程(四)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

RoboCup智能机器人足球教程(三) 的相关文章

随机推荐

  • tcp 三次握手和四次挥手报文分析

    1 xff0c tcp 三次握手 报文抓取如下 xff1a 三段报文分析 xff1a 第一次 xff1a 26 gt 96报文交互 Seq num 61 567391014 ACK NUM 61 0 flags 61 SYN 第二次 xff
  • bootp引导程序协议

    bootp又称为引导程序协议 我们来简单了解一下这个协议以及他的用法 1 xff0c BOOTP 请求和应答均被封装在 U D P 数据报中 xff1b 2 xff0c B O O T P 使用 U D P xff0c 且通常需与 T F
  • http请求学习

    GET xff1a 向Web服务器请求一个文件 POST xff1a 向Web服务器发送数据让Web服务器进行处理 PUT xff1a 向Web服务器发送数据并存储在Web服务器内部 HEAD xff1a 检查一个对象是否存在 DELETE
  • linux c语言全面学习json解析函数

    1 json结构的定义 typedef struct cJSON cJSON结构体 struct cJSON next prev 遍历数组或对象链的前向或后向链表指针 struct cJSON child 数组或对象的孩子节点 int ty
  • matlab的图片滤波处理

    椒盐噪声 高斯噪声 MATLAB自带函数 均值滤波 中值滤波 自编模版 读取图片并转换为灰度图片 I 61 imread 39 1 jpg 39 imshow I I1 61 rgb2gray I imshow I1 椒盐噪声 I2 61
  • Linux 动态库的编译和执行

    静态库生成及测试 编码myccso脚本 gcc c Wall I inc src myadd c o myadd o ar rcs libmyadd a myadd o rm o mv libmyadd a lib gcc Wall g I
  • matlab中函数的定义和使用

    在matlab的选择框中的的新建中选择新建函数 xff0c 一般是以 m的文本文件 xff0c 新建后我们可以在里面写入我们的实现函数 xff0c 现在我们给出两个实例看一下 xff0c 分别是简单的求和和Fibonacci sequenc
  • matlab简单绘图plot,subplot

    a1 二维绘图plot的实现 subplot n m x 建立一个m n的绘图区域 xff0c 然后分别在其x 61 1 xff0c 2 xff0c 3 xff0c 4 区域绘制图像 function 61 plot1 x 61 0 0 3
  • python 函数的定义和应用

    1 xff0c 函数定义和使用 xff1a def substract sub a sub b sub res 61 sub a sub b return sub res sub test 61 substract 10 20 print
  • Linux shell中的-d,-f,-e,-n的作用

    1 xff0c d gt dirtionnary 判断目录是否存在 例 xff1a d tmp 返回为真便是 tmp是文件夹目录 2 xff0c e gt exist 判断是否存在 例 xff1a e filename 返回为真表示file
  • 「第四范式」2023届-秋季校园招聘正式启动!

  • Linux下用nginx和naxsi搭建web防火墙

    Linux下用nginx和naxsi搭建web防火墙 Naxsi Naxsi是一个开源 xff0c 高性能 xff0c 地位会规则 xff0c nginx的web应用程序防火墙模块 xff0c 著名的web服务器和反向代理 xff0c 它的
  • 【语义分割】类别不平衡损失函数合集

    在语义分割领域 xff0c 我们会常常遇到类别不平衡的问题 比如要分割的目标 xff08 前景 xff09 可能只占图像的一小部分 xff0c 因此负样本的比重很大 xff0c 导致网络倾向于将所有样本判断为负样本 本文介绍了在数据不平衡时
  • 小张学linux内核:十四. elf文件的加载和进程切换寄存器的保存

    重点关注虚拟内存的切换 xff0c pgd xff0c mm struct start code xff1b 理清楚这三个概念 pgd不是在这里设置的遵循COW xff0c 是在写时缺页中断填充的 start code只是一个段开始的标记
  • linux软中断和系统调用深入研究

    arm软中断模式 arm7种模式 有中断模式 xff0c 但是并没有软中断模式 那么arm的软中断是什么呢 xff1f arm的软中断是arm从用户模式切换到特权模式 xff0c 也就是linux中从用户态切换到内核态的过程 swi命令触发
  • 进程proc文件介绍

    进程proc文件 proc pid 下是每个进程的proc信息 xff0c proc self比较特殊 xff0c 哪个进程打开 xff0c 对应链接到哪个进程 1 xff09 内存相关 status xff1a 进程使用虚拟内存和物理内存
  • Win10系统下安装CAA二次开发程序,VS界面上不出现CAA菜单栏或菜单栏为灰色的

    问题描述 xff1a Win10系统下安装了CATIA CAA V5R19和V4R24两个版本 xff0c 其中V5R19版本安装完成后VS2005中没有出现CAA菜单栏 xff0c V5R24安装完成后VS2008中出现部分集成菜单且为灰
  • 基于Stm32的4G模块实现内网透传通信(代码后附)

    基于Stm32的4G模块实现内网透传通信 一 内网透传即内网映射 xff0c 内网IP端口映射外网连接访问过程的实现 内网透传通信实现过程又有以下几种区别 xff1a 1 xff09 路由器映射 适合自己本地路由有公网IP网络环境 xff0
  • RoboCup智能机器人足球教程(二)

    RoboCup智能机器人足球教程 xff08 二 xff09 运行方式 RoboCup2D仿真平台通过一个服务端 xff0c 若干客户端联系而成 xff0c 同时通过监视器进行画面播放 当启动服务端后 xff0c 客户端通过改写程序内部的c
  • RoboCup智能机器人足球教程(三)

    RoboCup智能机器人足球教程 xff08 三 xff09 实现守门员代码 守门员逻辑实现比较容易 xff0c 但是最好开始的时候画好流程图 xff0c 理顺逻辑 xff0c 守门员一直盯着球 xff0c 当球距离守门员够近的时候 xff