ChinaOpenSSL系列笔记足球机器人

观察一下:        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) then
            return "run2"
        end    
    end,
    Leader = task.goCmuRush(testPos[1],0),
    match = "{L}"
},

["run2"] = {
    switch = function()  
        if DEBUG_SWITCH then
        end
        if bufcnt(player.toTargetDist("Leader")<5,time) then
            return "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 = 500

local 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*speed
    end,
    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 = pos
        if type(pos) == 'function' then
            ipos = pos()
        else
            ipos = pos
        end
        local 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*speed
    end,
    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 = 0
    local 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)
    end
    local checkNum = function()
        local between = function(a,min,max)
            if a>min and a<max then
                return true
            end
            return false
        end
        local num = -1
        for i=0,param.maxPlayer-1 do
            if enemy.valid(i) and between(enemy.posX(i),xmin,xmax) and                     
            between(enemy.posY(i),ymin,ymax)
            return i
        end
        return num
    end
    local ipos = function()
        local num =checkNum()
        local enemyPos = enemy.pos(num)
        if num < 0 then
            enemyPos=CGeoPoint:new_local((xmin+xmax)/2.0,(ymin+ymax)/2.0)
        end

        local res
        local l = (outGoal - enemy.pos(num)):mod()*0.3
        res = enemy.pos(num) + Util.Polar2Vector(l,(ourGoal - enemy.pos(num)):dir())
        return res
    end
    local idir = function(runner)
        local num = checkNum()
        local enemyPos = enemy.pos(num)
        if num < 0 then
            enemyPos=CGeoPoint:new_local((xmin+xmax)/2.0,(ymin+ymax)/2.0)
        end

        local res
        res = (enemyPos - ourGoal):dir()
        return res
    end
    local 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 do
            local dis = (ball.pos() - player.pos(i)):mod
            if player.valid(i) and dis <1000 and i~= runner then
                debugEngine:gui_debug_msg(CGeoPoint:new_local(0,i*200),i..(player.valid(i) and 'T' or 'F')..dis)
                rerurn i
            end
        end
        return -1
    end
    local ipos = function(runner)
        local num = checkAttacker(runner)
        local x = player.posX(num)
        local y = player.posY(num)
        local length = param.pitchLength/2
        return CGeoPoint:new_local(length - x ,-y)
    end
    local idir = function(runner)
        return player.toTheiGoalDir(runner)
    end
    local 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

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值