前言

备注:大家可以看看“SOM v3.3.3 C++ DLL用户自定义技能实战”文章,DLL代码已经上传
前不久接触了这种新式的脚本语言LUA,和一些机器人二次开发的一些概念。很杂很乱,其实在开始学习这个杂七杂八的玩意儿之前,就已经暗自打算一定要写一写技术博客来记录自己的学习,然而时间不是很多,一直都没有写,甚至机器人的事情也被耽搁了下来。
网络上找不到类似这种ILOBOKE机器人开发的技术文章(技术太偏),很多问题就只能求助于社里经验丰富的前机器人足球队队员,或者靠自己看文档(说实话官方给的SOM二次开发手册真的不咋滴,没两下子就看完了,实操又各种奇怪问题),凭感觉,效率很低。
一方面,我希望记录自己学习的点点滴滴,写博客为自己日后作参考;另一方面,我也希望下一届的机器人足球队队员们的信息来源不再单一,能有我的一些博客作为参考。总的来说还是有益的。

SOM v3.3.3 二次开发环境配置

这里我只讲LUA的,不讲C++ dll那边的,稍后的实例也避开了C++,直接采用LUA控制机器人。
首先最基本的,你得拥有SOM v3.3.3这款软件,否则一切免谈
官方给的下载链接已经失效
我可以为你提供完整的SOM v3.3.3

解压完毕后,先不要急着打开软件,不然你会遇见各种问题

先把所有.exe以管理员身份运行(这在二次开发手册里面有,可以直接参照二次开发手册)

解压后,对根目录下的 SoccerPlanner3.exe应用程序右击属性,选 择兼容勾应用程序右击属性,以管理员身份运行此程序 ”,

lua语法分号_java


不出意外的话,也有这些玩意儿

lua语法分号_lua语法分号_02


打开 Team_BLUE 或 Team_YELLOW 文件夹,如图 文件夹

lua语法分号_lua_03


然后把这两个后台相关程序都以管理员身份运行。

也有一种最简单的办法,直接在根目录下搜索.exe

然后你会搜出这些玩意儿:

lua语法分号_lua语法分号_04


全部设为管理员权限即可!

记住,这很重要!千万记住!否则会出现很多奇奇怪怪的例如崩溃、卡死、按不动的问题。有时候点击开始测试,弹出窗口后会卡死,然后让你到“赛事裁判”里面退出比赛,然而死都退不了,就是管理员权限的问题

软件路径最好全英文且无特殊字符,否则也容易出问题!

中文路径改英文的时候,原本赋予管理员权限的.exe管理员权限会消失!需要重新赋予!!!(我当时就是卡在这里!!!)

编写LUA脚本

这里使用的LUA语言,同真正意义上的LUA开发不同,大多数麻烦的事情已经交由官方的代码处理,我们只需要借助模板,使用一些简单的函数进行二次开发即可。

在选择了LUA脚本之后(测试模式下只能选择一种LUA脚本),机器人控制程序会以60fps的速度执行此脚本。我们接下来看看应该怎么写这样的脚本

下面先提供一份官方的LUA模板:

lua语法分号_junit_05


我们的所有开发,基本都在如下框架中进行

战术框架主机构

gPlayTable.CreatePlay{

}

状态框架可以理解为一个函数,需要被调用,才可以起到作用。这个一会儿再说。
firstState是对初始状态框架的规定,因为一个LUA脚本被执行的时候,至少在这个程序里是不存在一个明确的入口函数的(入口函数就相当于C++中的main函数),所以使用firstState就等于是规定了入口函数是哪一个,
例如这里

firstState="doRef",

这样,LUA脚本被执行的时候就会先进入doRef函数。
进入函数之后,我们要做的是给机器人分配任务,一般比较常用的机器人球员的英文名有
Kicker 前锋
Receiver 后卫
Goalie 守门员

一方的机器人只会有一个Kicker这样的玩意儿,所以不必顾虑Kicker2这样的东西。

["getball"]={
    Kicker=task.GetBall("Kicker","Kicker"),
},

此时,我在getball函数中写入Kicker的任务——GetBall

注意大小写

这是官方给你的一个抓球函数

有关这一函数的用法,在二次开发手册中有描述,本人在此摘录一下:

lua语法分号_java_06


执行者是runner_role,放这里就是Kicker。意思就是拿球的是Kicker

然后,拿球的时候要朝向receive,如果你把它设为middle,那它拿到球的时候正面就会一直朝着middle机器人,就像这样:

lua语法分号_lua_07


二号是kicker,三号是友方middle,二号拿球的时候是朝向三号的。(甚至在往球的方向走的时候,也是一路朝着三号)

有时候这么做可以方便传球

当然,你也可以选择谁都不朝,那就也填Kicker,朝自己,那就是谁都不朝

测试执行后一切正常。

最后,就是name的用法

name后面的值必须等于你的脚本文件的名字

不能加后缀,例如

getball.lua的name=“getball”

如果name拼写有误,就会出现:

加载失败:战术名应与文件名相同的字样

如果直接不写name,就会脚本检测失败(过不了编译)

并提示table index is nil

这些信息都会在这个界面呈现:

lua语法分号_lua语法分号_08


下面提供完整的正确代码

gPlayTable.CreatePlay{

firstState="getball",

["getball"]={
    Kicker=task.GetBall("Kicker","Kicker"),
},


name="getball"
}

这只是最基本,最简单的写法,正常情况下,一场正规比赛的LUA脚本长度可达百行,动用函数数十个,这就需要我们的链接函数的利器:switch状态跳转函数
这是我们下一次的话题。
记住,官方给你的函数使用错误,它也是会归结为编译错误的!

导入LUA脚本测试

说了这么多,还没教你测试来着……
调试代码,绝对是作为coder的精髓,也是必须要掌握的东西
而这个测试不同于其他代码,它的测试结果全部都在这个绿绿的足球草坪上,我的意思是,你几乎没有办法对LUA做debugger调试。
所以,我们只能使用上帝赋予我们最高级的debugger——眼睛
通常这种debugger可以从你妈妈的肚子里解压出来,你系统自带的,没有的话从别人身上移植,收费的,很贵,附近的医院可能有,重点是你还找不到盗版或者绿色版的。
咳咳,进入正题:
首先,你把写好的LUA脚本放在指定的位置,
这里以黄队为例,
一般在这个目录下
\SOM v3.3.3\Team_YELLOW\lua_scripts\play
然后你会看见三个文件夹,
Nor,Ref和Test
测试脚本直接往Test里面塞
你在测试的时候会提示你是否转正,如果你觉得你的脚本跟你想的没有很大出入,就可以转正了
到时候会出现在Ref目录下。

然后点开程序

SoccerPlanner3.exe

lua语法分号_lua语法分号_09


选择测试模式

lua语法分号_junit_10


选择模拟训练

lua语法分号_lua语法分号_11


选择黄队(看你测试的是哪个队)

lua语法分号_lua_12


要几个队员就勾选几个,但是一定要出现LUA脚本里面分配到任务的队员

例如之前的脚本里面出现了Kicker,这里就一定要选择前锋

lua语法分号_lua_13


点击浏览,直接找到你的脚本位置,然后点击下面的导入。这个脚本就会出现在脚本选择区了,你也可以直接在脚本选择区选择你已经做过的脚本。

lua语法分号_junit_14


只有这样,你才可以点击“开始测试”按钮!!!

然后你就会看见机器人和它的足球场了

lua语法分号_lua语法分号_15


把鼠标放到足球场里戳一戳,就可以放置足球,机器人默认对准足球并保持一段距离

lua语法分号_junit_16


上方的蓝色机器人是添加敌方,你可以通过鼠标拖动自由放置敌人的位置。

点击执行,你就可以看见脚本的测试结果,点击停止,他就停止

一切无误后,转为正式脚本。当然,你也可以不选择转为正式脚本。

到此为止,你已经掌握了SOM v3.3.3二次开发中LUA脚本的基本用法和环境搭建