观察一下:        TestDribbleAndKick(吸球射门)

语义

FPS 帧率

DeviceMsg        //黄一排

DrawObst          //障碍物信息

快捷键:ctrl+p打开
配置一个play:  在   config.lua
简单框架

local testPos = {CGeoPoint:new_local(0,0)
}gPlayTable.CreatePlay{firstState = "run1",["run1"] = {switch = function()    //是否要切换状态    end,Kicker = task.goCmuRush(testPos[1],0),match = ""
},name = "MyTestRun",
applicable ={exp = "a",a = true
},
attribute = "attack",
timeout = 99999
}

 报错

语法没问题,语义有问题,报错会在其他地方

一、如何使用switch函数

player.lua

enemy.lua        //针对敌方

ball.lua        //球速、球的位置、球的朝向

pos.lua        //位置相关

bufcnt.lua

...

1、!!延长时间(bufcnt.lua)

bufcnt(cond,buf,cnt) 

if bufcnt(true,200) then        //当true条件持续满足200帧再执行

        return "run2"

2、player.lua(升级)

if bufcnt(player.toTargetDist('Kicker')<10,10) then       

        return "run2"

二、match        就近匹配     

{ } :不匹配,维持状态

[ ] :实时匹配

( ) :每当进行一次states的切换时进行一次匹配

机器人名字:

Assister        Special        Defender        Middle

Leader          Breaker       Fronter           Center        ...abcd...

task.lua

框架

task function - skill.lua - skill from c++

task function 中的内容只执行一遍

Play 调试

录制        第四栏中的        DeviceMsg        ;点击第三栏中的文件夹

查看

FRAREDOFF

FRAREDON        吸球吸了多久

CHIPKICK

FLATKICK

INFRARED        红外触发变1

 来回跳动的简单框架

local testPos = {CGeoPoint:new_local(0,0)CGeoPoint:new_local(1000,1000)
}local DEBUG_SWITCH = true;gPlayTable.CreatePlay{firstState = "run1",["run1"] = {switch = function()  if bufcnt(player.toTargetDist("Leader")<5,time) thenreturn "run2"end    end,Leader = task.goCmuRush(testPos[1],0),match = "{L}"
},["run2"] = {switch = function()  if DEBUG_SWITCH thenendif bufcnt(player.toTargetDist("Leader")<5,time) thenreturn "run1"end    end,Leader = task.goCmuRush(testPos[2],0),match = "{L}"
},name = "MyTestRun",
applicable ={exp = "a",a = true
},
attribute = "attack",
timeout = 99999
}

debugEngine.pkg        //连接lua和c++

: 表示隐式指针

debugEngine:gui_debug_x(CGeoPoint:new_local(1000,1000))

Yourplay.lua/task.lua/play.lua

小车绕球旋转代码实现 

local testPos = {CGeoPoint:new_local(0,0),
}
local TOTAL = 4
local speed = 1/4.0
local angle = 0
local radius = 500local p = function(n,TOTAL)return function()local centerX = ball.posX()local centerY = ball.posY()return CGeoPoint:new_local(centerX + radius * math.cos(angle + n*math.pi*2/TOTAL)end
end
gPlayTable.CreatPlay{
fristStates = "tun",
["run"] = {switch = function()angle = angle +math.pi*2/60*speedend,Leader = task.goCmuRush(p(1,TOTAL)),Assister = task.goCmuRush(p(2,TOTAL)),Middle = task.goCmuRush(p(3,TOTAL)),Special = task.goCmuRush(p(4,TOTAL)),math = "{LAMS}"
},name = "MyRun",
applicable = {exp = "a",a = true
},
attribute = "attack",
timeout = 99999
}

绕敌对机器人旋转代码片段实现

local enemeyPos = function(num)return function()return enemy.pos(num)end
end
local p = function(n,TOTAL,pos)return function()ipos = posif type(pos) == 'function' thenipos = pos()elseipos = posendlocal centerX = ipos:x()local centerY = ipos:y()return CGeoPoint:new_local(centerX + radius*math.cos(angle + n*math.pi*2/TOTAL)end
end
gPlayTable.CreatePlay{
firstState = "run",
["run"] = {switch = function()angle = angle +math.pi*2/60*speedend,Leader = task.goCmuRush(p(1,2,enemyPos(1))),Assister = task.goCmuRush(p(2,2,enemyPos(1))),Middle = task.goCmuRush(p(1,2,enemyPos(0))),Special = task.goCmuRush(p(2,2,enemyPos(0))),match = "(LA)(MS)"
},
...

 Task.lua  的封装

TestSkill.lua

gPlayTable.CreatePlay{
fristState = "test",
["test"] = {switch = function()end,Leader = task.marking(-3500,0,-2000,2000),match = "{L}"
},name = "TestSkill",
applicable = {exp = "a",a = true
},
attribute = "attack",
timeout = 99999
}

test.lua

function marking(xmin,xmax,ymin,ymax)local num = 0local ourGoal = CGeoPoint:new_local(-param.pitchLength/2.0,0)local drawDebug = function()local p1 = CGeoPoint:new_local(xmin,ymin)local p2 = CGeoPoint:new_local(xmin,ymax)local p3 = CGeoPoint:new_local(xmax,ymin)local p4 = CGeoPoint:new_local(xmax,ymax)debugEngine:gui_debug_line(p1,p2,4)debugEngine:gui_debug_line(p2,p4,4)debugEngine:gui_debug_line(p3,p4,4)debugEngine:gui_debug_line(p1,p3,4)endlocal checkNum = function()local between = function(a,min,max)if a>min and a<max thenreturn trueendreturn falseendlocal num = -1for i=0,param.maxPlayer-1 doif enemy.valid(i) and between(enemy.posX(i),xmin,xmax) and                     between(enemy.posY(i),ymin,ymax)return iendreturn numendlocal ipos = function()local num =checkNum()local enemyPos = enemy.pos(num)if num < 0 thenenemyPos=CGeoPoint:new_local((xmin+xmax)/2.0,(ymin+ymax)/2.0)endlocal reslocal l = (outGoal - enemy.pos(num)):mod()*0.3res = enemy.pos(num) + Util.Polar2Vector(l,(ourGoal - enemy.pos(num)):dir())return resendlocal idir = function(runner)local num = checkNum()local enemyPos = enemy.pos(num)if num < 0 thenenemyPos=CGeoPoint:new_local((xmin+xmax)/2.0,(ymin+ymax)/2.0)endlocal resres = (enemyPos - ourGoal):dir()return resendlocal mexe,mpos = GoCmuRush{pos = ipos,dir = idir,acc = a,flag = f,rec =return {mexe,mpos}
end

盯防配合代码简单实现(需修改)

function waitForAttack()local checkAttacker = function(runner)for i=0,param.maxPlayer-1 dolocal dis = (ball.pos() - player.pos(i)):modif player.valid(i) and dis <1000 and i~= runner thendebugEngine:gui_debug_msg(CGeoPoint:new_local(0,i*200),i..(player.valid(i) and 'T' or 'F')..dis)rerurn iendendreturn -1endlocal ipos = function(runner)local num = checkAttacker(runner)local x = player.posX(num)local y = player.posY(num)local length = param.pitchLength/2return CGeoPoint:new_local(length - x ,-y)endlocal idir = function(runner)return player.toTheiGoalDir(runner)endlocal mexe,mpos = GoCmuRush{pos = ipos,dir = idir ,acc = a,flag=f,rec=r,vel=v}return {mexe,mpos}
end

除了switch、match的,和机器人名称有关的才是table

task有8个参数,

if roleNum ~= -1 then

if task[3] ~= nil then

local mkick = task[3](roleNum)        //踢球模式

local mdir = task[4](roleNum)        //踢球方向

local mpre = task[5](roleNum)        //踢球精度

local mkp = task[6](roleNum)        //平射力度

local mcp = task[7](roleNum)        //挑射力度

local mflag = task[8]

local isDirOk = world :KickDirArrived(vision:getCycle(),mdir,mpre...

kick.flat 平射

function speed (vx,vy,vdir)

//function speed(vx,vy,vdir,p,f)

local ikick = kick.flat

//local ikick = kick.none

local idir = dir.specified(0)

local ipre = pre.specified(10)

local ikp = kp.specified(2000)

//local ikp = kp.specified(p)

local icp = cp.specified(1000)

local iflag = flag.nothing

local spdX = function()

return vx

local spdY = function()

return vy

local spdW = function()

return vdir

end

local mexe,mpos = Speed{speedX = spdX,

return {mexe,mpos,ikick,idir,ipre,ikp,icp,iflag,

end

机器人控制对比

队伍              路径                   避障              速度                性能           性能

ZJUNlict        RRT*                 DSS              Bangbang         3                 1

Tigers            Topo+Bspline   capsule          2D-Bang           1                 2

Immortals      NOK-RRT         DSS               -                        1                 3

ER-Force       RRT                 -                     2D-Bang

Other.lua        对手配置

gOppoConfig = {

CornerKick = {1},

...

KickOff = "..."        //开球脚本

...        //防守

...        //捡球

...        //点球

}

 lua的流程        selectPlay.lua选出当前需要的play

ChinaOpenSSL系列笔记足球机器人相关推荐

  1. <笔记>机器人操作系统ROS理论与实践--第一讲:认识ROS

    <笔记>机器人操作系统ROS理论与实践--第一讲:认识ROS 前言 一.为什么需要ROS 二.ROS的总体设计 1.一个目标 2.五个特点 3.四位一体 三.ROS的系统实现--三个层次 ...

  2. Cocos2dx游戏开发系列笔记6:怎样让《萝莉快跑》的例子运行在vs和手机上

    2019独角兽企业重金招聘Python工程师标准>>> 感谢听D同学赞助的Demo. 那怎样让它运行在vs中呢: 1 使用cocos2d-x-2.2\tools\project-cr ...

  3. Java系列笔记(1) - Java 类加载与初始化

    2019独角兽企业重金招聘Python工程师标准>>> 目录 类加载器 动态加载 链接 初始化 示例 类加载器 在了解Java的机制之前,需要先了解类在JVM(Java虚拟机)中是如 ...

  4. V-rep学习笔记:机器人模型创建2—添加关节

    下面接着之前经过简化并调整好视觉效果的模型继续工作流,为了使模型能受控制运动起来必须在合适的位置上添加相应的运动副/关节.一般情况下我们可以查阅手册或根据设计图纸获得这些关节的准确位置和姿态,知道这些 ...

  5. 跟着鸟哥学Linux系列笔记1

    跟着鸟哥学Linux系列笔记0-扫盲之概念 跟着鸟哥学Linux系列笔记0-如何解决问题 装完linux之后,接下来一步就是进行相关命令的学习了 第五章:首次登录与在线求助man page 1. X ...

  6. 系列笔记 | 深度学习连载(6):卷积神经网络基础

    点击上方"AI有道",选择"星标"公众号 重磅干货,第一时间送达 卷积神经网络其实早在80年代,就被神经网络泰斗Lecun 提出[LeNet-5, LeCun ...

  7. 系列笔记 | 深度学习连载(5):优化技巧(下)

    点击上方"AI有道",选择"星标"公众号 重磅干货,第一时间送达 深度学习中我们总结出 5 大技巧: 本节继续从第三个开始讲起. 3. Early stoppi ...

  8. 系列笔记 | 深度学习连载(4):优化技巧(上)

    点击上方"AI有道",选择"星标"公众号 重磅干货,第一时间送达 深度学习中我们总结出 5 大技巧: 1. Adaptive Learning Rate 我们先 ...

  9. 系列笔记 | 深度学习连载(2):梯度下降

    点击上方"AI有道",选择"星标"公众号 重磅干货,第一时间送达 我们回忆深度学习"三板斧": 1. 选择神经网络 2. 定义神经网络的好坏 ...

最新文章

  1. python代码找到链表的倒数第K个节点并打印
  2. 利用nginx泛域名解析配置二级域名和多域名
  3. win10_x64更新错误解决: 安装一些更新时出现问题,但我们稍后会重试。如果持续出现这些问题,并且你想要搜索Web或联系支持人员以获取相关信息,以下信息可能会对你有帮助:
  4. 基于MATLAB的IIR滤波器设计与实现
  5. 不属于计算机常用软件日常应用的是,综合技能实践+计算机常用应用软件的安装和使用指导 (1)...
  6. Scrapy实战篇(一)之爬取链家网成交房源数据(上)
  7. MybatisPlus实现逻辑删除
  8. Angular ngcc和ivy
  9. java api限流_Java 9:流API的增强
  10. xamppmysql访问被拒绝_XAMPP中无法开始MySQL的问题
  11. svg如何平铺 html5,如何在HTML5中使用SVG
  12. HtmlHelper类在View中替代了纯HTML代码
  13. hdu-2602POJ-3624---01背包裸题
  14. 38译码器和416译码器
  15. 苹果手机微信声音小怎么调大声_【泽云广场|好声音KTV】19.9元畅享门市价198元下午场欢唱+茶水!79.9元尊享全天场欢唱+酒水小吃附带纸巾!越夜越时尚!...
  16. 802.11ac知识整合
  17. 计算机成绩分数段,用FreQuency函数统计学生成绩分数段的技巧-excel技巧-电脑技巧收藏家...
  18. CSS 悬停的用法
  19. shell sed(流编辑器)的基本使用
  20. C#与Halcon联合编程 1

热门文章

  1. 树莓派(Raspberry Pi) Pico usb输出(Hello World!)
  2. Java简单思维导图
  3. Flutter——在Android平台上的启动流程浅析,2021Android常见面试题
  4. JVM从跨平台到跨专业 Ⅲ --编译期处理、类加载、JVM调优
  5. PCB电路板发展史简介
  6. 拉伯证券|芯片半导体迎来“行业底部出清”,大资金进场迹象明显
  7. windows7中文改成英文
  8. 日本的feature phone版twitter的follow链接
  9. 搭建自己私人网盘-Nextcloud
  10. 一对一辅导价格表初中_初中一对一辅导多少钱一小时