跳至主要內容

机器人 (player & enemy)

umbrella大约 4 分钟

写在前面

  • player.luaenemy.lua分别为我方机器人和敌方机器人的方法文件,这两个文件大部分相同,下面列举的主要函数主要以 player 为例。

  • 在 lua 方法中,参数role所选角色(机器人车号或者匹配的名字,两者均可)。

  • 在 cpp 函数中,需要调用视觉模块pVision来获取信息,其中

    • 任一机器人用pVision->allPlayer()表示
    • 我方机器人用pVision->ourPlayer()表示
    • 敌方机器人用pVision->theirPlayer()表示

    注意

    对于机器人的定义是const PlayerVisionT& ourPlayer(int num),所以实际使用中别忘了填入机器人编号参数,为了方便美观,下文中省略。

    例如:要获取我方编号 1 的机器人的位置,应该写:

    pVision->ourPlayer(1).Pos()
    

    因为这些不同机器人的方法大部分相同[1],以下统一使用ourPlayer()演示。

  • 在文档中不会特意区分不同语言的语法,能看懂即可,如 cpp 中的int与 lua 中的interger;需要注意时会特别标注。

属性相关

车号

  • 返回机器人的车号 (int)
lua
player.num(role)

存在性

  • 返回机器人是否存在 (bool)
lua
player.vaild(role)

红外是否触发

  • 返回机器人的红外是否触发 (bool)
lua
player.infrareOn(role)

红外触发的帧数

  • 返回机器人的红外触发的帧数 (int)
lua
player.infraredCount(role)

是否踢球

  • 返回机器人是否踢球 (bool)
lua
player.kickBall(role)

位置相关

位置

  • 返回机器人的位置 (CGeoPoint)
lua
player.pos(role)

位置 X 值

  • 返回机器人的位置的 X 坐标 (double)
lua
player.posX(role)

位置 Y 值

  • 返回机器人的位置的 Y 坐标 (double)
lua
player.posY(role)

方向相关

角度

  • 返回机器人角度信息(弧度制) (double)
lua
player.dir(role)

旋转速度

  • 返回机器人的旋转速度 (double)
lua
player.rotVel(role)

速度相关

速度

  • 返回机器人的速度 (vector)
lua
player.vel(role)

速度方向

  • 返回机器人的速度方向 (double)
lua
player.velDir(role)

速度大小

  • 返回机器人的速度大小 (double)
lua
player.velMod(role)

真实速度

  • 返回机器人的真实速度 (double)
lua
player.rawVel(role)

真实速度大小

  • 返回机器人的真实速度大小 (double)
lua
player.rawVelMod(role)

  1. 简单解释一下这个“大部分相同”:

    allPlayer()ourPlayer()theirPlayer()都是类CVisionModule中的成员函数。

    我们会发现他们的类型都是PlayerVisionT,如果再往前找会发现这个类继承自三个父类。

    这里拿bool Valid()举例,它其实是ObjectPoseT下的一个成员函数,这意味着“结构上差不多的”这三个成员函数可使用的大部分成员函数都是相同的。

    所以根据文档中演示的返回我方球员位置的代码pVision->ourPlayer().Pos(),要获取对方某球员的位置,可以写成pVision->theirPlayer().Pos()

    提示

    其实根据上述内容可以推测出一些其他内容。
    比如机器人属性里面的Vel(),有一个Vel().mod()的函数;那么rawVel().mod()也存在(它们俩都表示 “速度”,都有 “大小” 这一属性)。这点可以自己去查一下定义来确认。

    因此,可以根据代码编辑器的代码补全功能和对相似的变量含义的猜想,来快速调用或是写出一些你所想要的功能,减少翻看帮助文档、浏览定义的次数,编码更顺畅。

    像 VSC 等代码编辑器可以通过F12来速览定义。

    ↩︎