RoboCup仿真3D中文教程-第4章
Published:
介绍机器人关节、铰链、动作、ODE运动模型、状态空间,五种机器人的变体、各关节所在位置、属性
4.1 机器人的核心组成
4.1.1 实体机器人
一个实体机器人的核心组成通常包括感知系统(传感器)、控制系统(算法与处理器)、执行机构(电机/驱动装置)、动力系统(能源)、软件框架(决策与交互逻辑)以及机械结构,这些模块协同实现环境感知、决策、行动和交互功能。实体机器人依赖物理硬件(如传感器、电机、电池),需应对真实环境的噪声、磨损和不确定性;而仿真机器人通过虚拟模型模拟硬件行为,依赖算法和计算资源,无需物理实体。在此方面下,通过对实体机器人的建模可以帮助快速测试和验证控制算法。

Aldebaran Robotics 制造的 Nao 人形机器人。它的高度约为 57 厘米,体重约为 4.5 公斤。其具有 22 个自由度的 Biped 架构使 Nao 具有极好的机动性。下图展示了Nao机器人外观和所包含的传感器:

它拥有一个圆形的头部,上面安装了两个摄像头和一个麦克风,用于感知周围环境。Nao机器人的身体由多个关节组成,可以自由移动和旋转,使其能够完成各种动作。它的双手和双脚也是可控制的,可以用来抓取物体或行走。Nao机器人内置了多种传感器,包括触觉传感器、力觉传感器、红外传感器、超声波传感器等,这些传感器可以帮助Nao机器人感知周围环境,并做出相应的反应。此外,Nao机器人还配备了多种执行器,如电机、舵机等,用于控制其关节和动作,实体的Nao机器人包括25个自由度。
4.1.2 仿真机器人

对于仿真的Nao机器人,相比于实体机器人做出了一定的改变。从外观上,模拟的Nao机器人很好地还原了实体机器人,包括关节、躯干、传感器的分布等。不过,为适用于仿真足球比赛,建模时取消了对手部的模拟,仅保留了手臂部分。同时,对于一些不必要的传感器,如LED、红外线、超声波等也选择放弃建模。在机器人控制过程中,这些传感器对其影响并非决定性的。对于仿真的Nao机器人(一般类型)全身一共有22个铰链关节。在每一个关节处均设置了铰链关节感知器和铰链关节效应器,从而可以精确地感知关节状态和执行关节命令。当然现实世界中,电机有着最大扭矩和转速的物理限制,为模拟这一情况,机器人中的铰链关节均有着最大角度限制和转速限制。
仿真机器人中包含了23个身体部件,每个身体部件均包含一定的质量(单位:千克),详细信息如下所示:
- head: 头部,质量为: 0.35
- neck: 脖子,质量为: 0.05
- torso: 躯干,质量为: 1.2171
- lshoulder: 左肩,质量为: 0.07
- rshoulder: 右肩,质量为: 0.07
- lupperarm: 左上臂,质量为: 0.15
- rupperarm: 右上臂,质量为: 0.15
- lelbow: 左肘,质量为: 0.035
- relbow: 右肘,质量为: 0.035
- llowerarm: 左下臂,质量为: 0.2
- rlowerarm: 右下臂,质量为: 0.2
- lhip1: 左髋部1,质量为: 0.09
- rhip1: 右髋部1,质量为: 0.09
- lhip2: 左髋部2,质量为: 0.125
- rhip2: 右髋部2,质量为: 0.125
- lthigh: 左大腿,质量为: 0.275
- rthigh: 右大腿,质量为: 0.275
- lshank: 左小腿,质量为: 0.225
- rshank: 右小腿,质量为: 0.225
- lankle: 左脚踝,质量为: 0.125
- rankle: 右脚踝,质量为: 0.125
- lfoot: 左脚,质量为: 0.2
- rfoot: 右脚,质量为: 0.2
4.1.3 关节限制

为连接各个身体部件,每个铰链关节均连接着两个身体部件,从而将23个身体部件组合成一个完整的机器人。每一个关节中均包含与之对应的感知器和效应器,并规定限制了该关节的活动范围。详细信息如下:
- head1: 感知器名称:hj1,效应器名称:he1,关节最小角度:-120,关节最大角度:120
- head2: 感知器名称:hj2,效应器名称:he2,关节最小角度:-45,关节最大角度:45
- larm1: 感知器名称:laj1,效应器名称:lae1,关节最小角度:-120,关节最大角度:120
- rarm1: 感知器名称:raj1,效应器名称:rae1,关节最小角度:-120,关节最大角度:120
- larm2: 感知器名称:laj2,效应器名称:lae2,关节最小角度:-1,关节最大角度:95
- rarm2: 感知器名称:raj2,效应器名称:rae2,关节最小角度:-95,关节最大角度:1
- larm3: 感知器名称:laj3,效应器名称:lae3,关节最小角度:-120,关节最大角度:120
- rarm3: 感知器名称:raj3,效应器名称:rae3,关节最小角度:-120,关节最大角度:120
- larm4: 感知器名称:laj4,效应器名称:lae4,关节最小角度:-90,关节最大角度:1
- rarm4: 感知器名称:raj4,效应器名称:rae4,关节最小角度:-1,关节最大角度:90
- lleg1: 感知器名称:llj1,效应器名称:lle1,关节最小角度:-90,关节最大角度:1
- rleg1: 感知器名称:rlj1,效应器名称:rle1,关节最小角度:-90,关节最大角度:1
- lleg2: 感知器名称:llj2,效应器名称:lle2,关节最小角度:-25,关节最大角度:45
- rleg2: 感知器名称:rlj2,效应器名称:rle2,关节最小角度:-45,关节最大角度:25
- lleg3: 感知器名称:llj3,效应器名称:lle3,关节最小角度:-25,关节最大角度:100
- rleg3: 感知器名称:rlj3,效应器名称:rle3,关节最小角度:-25,关节最大角度:100
- lleg4: 感知器名称:llj4,效应器名称:lle4,关节最小角度:-130,关节最大角度:1
- rleg4: 感知器名称:rlj4,效应器名称:rle4,关节最小角度:-130,关节最大角度:1
- lleg5: 感知器名称:llj5,效应器名称:lle5,关节最小角度:-45,关节最大角度:75
- rleg5: 感知器名称:rlj5,效应器名称:rle5,关节最小角度:-45,关节最大角度:75
- lleg6: 感知器名称:llj6,效应器名称:lle6,关节最小角度:-45,关节最大角度:25
- rleg6: 感知器名称:rlj6,效应器名称:rle6,关节最小角度:-25,关节最大角度:45
- lleg7: 感知器名称:llj7,效应器名称:lle7,关节最小角度:-1,关节最大角度:70(仅适用脚趾)
- rleg7: 感知器名称:rlj7,效应器名称:rle7,关节最小角度:-1,关节最大角度:70(仅适用脚趾)
对于关节的速度限制,机器人中大部分的铰链关节的旋转速度为351.77度每秒(6.1395弧度每秒),而对于类型2的机器人中,在左侧和右侧有两个关节(脚踝和脚),速度不同,分别是504.59度每秒(8.80667弧度每秒)和198.95度每秒(3.47234弧度每秒)。更多信息将在下文介绍。
4.2 异构形态的Nao机器人
4.2.1 类型0机器人

类型0为标准的Nao机器人,其大小和部件分布与实体的Nao机器人最为相近,拥有较为灵活的自由度和轻盈的身形,与其余类型机器人不同的身体参数详情如下:
- 髋部1相对于躯干的X轴位置:0.055 m
- 髋部1相对于躯干的Z轴位置:-0.115 m
- 大腿相对于髋部2的Z轴位置:-0.04 m
- 脚踝相对于小腿的Z轴位置:-0.055 m
- 左脚踝关节的最大绝对速度:6.1395 rad/s
- 左脚踝关节的最大绝对速度:6.1395 rad/s
- 肘部相对于上臂的Y轴位置:0.07 m
- 是否使用脚趾模型:否
4.2.2 类型1机器人

类型1机器人是标准Nao机器人的异构,相对于类型0机器人,它拥有更长的腿部和手臂。因此在行走时其往往拥有更高的速度,比较使用于作为跑位型角色。下面是该类型1机器人异构的相关参数:
- 髋部1相对于躯干的X轴位置:0.055 m
- 髋部1相对于躯干的Z轴位置:-0.115 m
- 大腿相对于髋部2的Z轴位置:-0.05832 m
- 脚踝相对于小腿的Z轴位置:-0.07332 m
- 左脚踝关节1的最大绝对速度:6.1395 rad/s
- 左脚踝关节2的最大绝对速度:6.1395 rad/s
- 肘部相对于上臂的Y轴位置:0.10664 m
- 是否使用脚趾模型:否
4.2.3 类型2机器人

类型2机器人是标准Nao机器人的异构,相对于类型0机器人,它的脚踝关节的前后俯仰速度更快,而左右滚动的速度更慢的。由于此特性,该类型机器人在执行踢球任务时,脚踝处能够达到更高的速度,实现更快更远距离的踢球,常用于射门行为。下面是该类型2机器人异构的相关参数:
- 髋部1相对于躯干的X轴位置:0.055 m
- 髋部1相对于躯干的Z轴位置:-0.115 m
- 大腿相对于髋部2的Z轴位置:-0.04 m
- 脚踝相对于小腿的Z轴位置:-0.055 m
- 左脚踝关节1的最大绝对速度:8.80667 rad/s
- 左脚踝关节2的最大绝对速度:3.47234 rad/s
- 肘部相对于上臂的Y轴位置:0.07 m
- 是否使用脚趾模型:否
4.2.4 类型3机器人

类型3机器人是标准Nao机器人的异构,相较于类型0机器人,它拥有更长的腿部和手臂以及更宽的髋部。这使得它拥有五种机器人中最高的身高和最庞大的身形,髋部的特性也使得其移动更为灵活。因此,该类型机器人能够快速地做出行动,常用于担任守门员的角色,发挥其身形庞大的优势。下面是该类型3机器人异构的相关参数:
- 髋部1相对于躯干的X轴位置:0.072954143 m
- 髋部1相对于躯干的Z轴位置:-0.115 m
- 大腿相对于髋部2的Z轴位置:-0.067868424 m
- 脚踝相对于小腿的Z轴位置:-0.082868424 m
- 左脚踝关节1的最大绝对速度:6.1395 rad/s
- 左脚踝关节2的最大绝对速度:6.1395 rad/s
- 肘部相对于上臂的Y轴位置:0.125736848 m
- 是否使用脚趾模型:否
4.2.5 类型4机器人

类型4机器人是标准Nao机器人的异构,相较于类型0机器人,其最大的特点是在左右脚部增加了脚趾模型。这使得其脚部于地面拥有了更大的接触面积,有利于机器人保持自身平衡。脚趾关节的加入,也是得其在踢球和行走任务表现的更加出色(能够将球踢到更高的高度)。下面是该类型4机器人异构的相关参数:
- 髋部1相对于躯干的X轴位置:0.055 m
- 髋部1相对于躯干的Z轴位置:-0.115 m
- 大腿相对于髋部2的Z轴位置:-0.04 m
- 脚踝相对于小腿的Z轴位置:-0.055 m
- 左脚踝关节1的最大绝对速度:6.1395 rad/s
- 左脚踝关节2的最大绝对速度:6.1395 rad/s
- 肘部相对于上臂的Y轴位置:0.07 m
- 是否使用脚趾模型:是
- 脚趾的长度:0.035517656 m
4.2.6 RoboCup仿真比赛中的限制
由于不同的机器人类型在不同的任务方面能够获取一定程度的帮助,参与比赛的团队可能会针对某一种机器人进行优化。为促进相关研究,比赛规定团队必须使用至少三种不同的机器人类型,任何一种机器人类型不超过七个代理,并且任何两种机器人类型不超过九个代理。基于这种限制,比较适合的组合有:4-3-3、4-4-2、2-2-2-2-3等。
还需注意的是,比赛时规定一号球员必须是守门员,并且在一号球员的躯干上会添加一层透明泡沫,以表示为其为守门员,在队伍进行初始化时需要额外注意。下图是机器人类型为3的一号球员在尝试倒地进行扑球动作:

4.3 机器人的状态空间
机器人的状态空间(State Space)是其所有可能状态的数学描述,用于全面表征机器人在某一时刻的物理状态、动态行为及与环境的关系,状态空间的设计直接影响机器人算法的性能(如规划、控制、感知)。
4.3.1 状态空间的主要要素
状态空间是一个多维空间,每个维度对应一个状态变量,所有变量共同组成一个状态向量。一个完整的机器人状态空间应包含以下内容:
1. 基本状态变量
几何状态 描述机器人的空间位置和姿态:
- 位置:如二维平面中的 (x,y),三维空间中的 (x,y,z)。
- 姿态:如航向角 θ(移动机器人)、欧拉角 (ϕ,θ,ψ)(无人机)、关节角度 (θ1,θ2,…,θn)(机械臂)。
在底层代码中,为仿真机器人在空间中的姿态,采用了6个自由度的集合表示机器人的集合状态(XYZ三维空间、ϕθψ欧拉空间)。
动态状态 描述机器人的运动状态:
- 速度:线速度 (vx,vy,vz)或角速度 (ωx,ωy,ωz)。
- 加速度:线加速度 a 或角加速度 α(高阶动态系统需要)。
- 动量或能量(某些复杂系统可能需要)。
在足球比赛中,仅仅知道机器人所处的空间位置是不够的,因为机器人是运动的。通过记录机器人的运动状态,可以帮助观测和判断机器人所处的情景,尤其是在判断机器人碰撞后是否跌倒,跌倒后是否成功起身方面有着帮助作用。
2. 环境交互参数
感知信息 与环境交互相关的状态变量:
- 传感器数据:如视觉相机获取的图像、相机的特征点坐标、IMU的加速度计或陀螺仪读数。
- 地图信息:若机器人构建了环境地图,可能将地图特征(如路标位置)纳入状态空间。
在RoboCup仿真环境中,Nao机器人均配备了多种传感器,如:能够精确感知关节角度的铰链关节感知器、能够获取有限视角内的视觉感知器、能够获取队友广播信息的听觉感知器、能够记录机器人三维方向上的加速度计等等。这些传感器能够帮助机器人感知物理世界,从而帮助机器人构建出世界模型,进一步依靠此做出合适的决策。
在足球仿真比赛中,地图的信息是确定的,包含固定的标识。但由于场内存在可移动的机器人和球体,造成了地图环境的动态变化。在进行机器人路径规划时,可将除自身之外的机器人看作障碍物,为到达目标位置,规划合适的路径,也是一个具有挑战性的任务。
外部扰动 如风阻、摩擦力、地面坡度等(动态建模中需考虑的外部因素)。在目前仿真环境中,还暂未考虑动态的环境因素。但在实际的机器人任务中,环境总是变化的(地面材质、空气、温度等)。因此需要考虑机器人在不同环境下的运行状况,比如在马路上与在沙地上的行走步态,需要根据脚部的感知动态改变,这也是未来机器人仿真领域需要加强的方向。
3. 任务相关参数
目标状态 若任务需要实时跟踪目标(如跟踪移动物体),目标的位置或速度可能被纳入状态空间。
在RoboCup仿真比赛过程中,在球场上会出现双方球员的对抗。通过各自球员的传球配合,能够使足球向对方球门迅速靠近。尤其是在对方球员附近无我方防守队员时,极有可能一次射门就产生了进球。因此,在球队的高层决策中,对存在威胁的对方球员进行盯防是具有重要意义的。通过统计对方各个球员的位置与速度,可以帮助我方及时得防守和补位。在进攻方面,通过敌我双方的位置,计算出最适合的传球点,并控制球员接应射门,是目前实现得分的最佳策略。
任务进度 如剩余路径点、执行时间等(适用于时序敏感任务)。
目前的比赛状况,一个高级的技能往往能决定一直球队的实力。例如,对于球员移动任务,奔跑能够实现更快的速度,行走能够实现更良好的稳定性。在奔跑任务中为提高稳定性,一般将过程分为三部分:起步、途中跑、停止。为实现不同距离的跑步,便需要实时记录奔跑的时间,以及和目标点的距离,以保留足够的距离进行停止操作。2022年FC Portugal团队首次采用深度强化学习技术,为机器人创建了稳定且快速的带球技能,被认为是其夺冠的主要因素。
4. 约束与限制
物理约束 如关节角度范围、最大速度/加速度限制。
正如上文所介绍,现实世界中电机角度无法发生突变并且有最大速度的限制。为实现这一特性,在RoboCup仿真环境针对该方面进行了设计,详细内容在上文已经介绍,不再赘述。
能量约束 如电池剩余电量(无人机或移动机器人需考虑)。
在现实中,机器人的作业时长是衡量机器人水平的标准。在RoboCup仿真2D比赛中,每一个智能体都含有一定的“体力值”,当发生射门或冲刺行为时,会消耗一定的“体力”,而“体力”较低时将会影响智能体的移动速度。在此约束下,便需要考虑全局,做出决策选择合适的技能,是多智能体合作的一大任务。而在仿真3D比赛中,虽然机器人也包含温度和电量物理特性,但考虑到目前仿真3D主要研究侧重于高级动作设计与算法控制,暂时未启用电量约束。在未来的阶段中,会考虑启用该特性,来更好地模拟现实。
4.3.2 仿真机器人状态空间的设计
在球队代码中的机器人状态空间主要在bodymodel类中所实现的,其中包含了机器人的几何状态、动态状态、感知信息、任务状态与物理约束。
1.空间姿态信息
为详细地表示机器人的空间状态,代码设计中采用了一个名为Pos6DOF的结构体来存储相关信息,该结构体声明如下:
struct Pos6DOF
{
VecPosition xyz; //空间状态的三维坐标
VecPosition rpy; //空间状态的欧拉角
Pos6DOF reflect() const;
};
如上述所示,Pos6DOF结构体中包含了两个VecPosition(三维向量)变量,分别表示空间状态的三维坐标(XYZ)和表示空间姿态的欧拉角(ϕ,θ,ψ)。同时,基于双足机器人的对称性,分别以两只支撑腿作为参考时,坐标系成镜面对称。为便于实现两支撑腿间的转换,reflect函数能够将在一支支撑腿的坐标系下的相应姿态转换为另一支撑腿的数据,在实现反射技能(根据镜像对称,将动作镜像为另一对称动作)时,能够便于坐标系的转换。
2.关节状态信息
为模拟关节状态,代码设计中采用一个名为SIMJoint的结构体来存储当前关节的角度信息,该结构体声明如下:
struct SIMJoint {
double angle;
SIMJoint() {
angle = 0;
}
};
上述结构体定义了一个SIMJoint的结构,其中包含了一个double类型的angle数据,来表示当前关节的角度。同时定义了默认的构造函数,用于初始化关节角度。当然,机器人全身包含22个关节(类型4机器人有24个),仅用一个关节表示是不够的。在bodymodel中,使用容器,包含了机器人全身所有的关节角度,该数据声明如下:std::vector
为便于记录和控制关节以及存储各关节物理特性,代码中设计了Effector结构体来模拟效应器的概念。与关节一一对应,效应器包含可移动角度范围(与上文关节最大角度和最小角度对应)。同时为实现运动过程中的关节控制,结构体中添加目标角度(targetAngle)与当前角度(currentAngle),来为效应器设置目标。为保证关节到达目标角度,结构体中加入了PID控制参数,便于产生关节控制指令。Effector结构体的相关定义已经在上一章节中给出,在此不再介绍。同样地,一个机器人包含22关节,也就是22个效应器。在bodymodel中使用容器存储,该数据声明如下:std::vector
enum Effectors {
//头部
EFF_H1,
EFF_H2,
//左手臂
EFF_LA1,
EFF_LA2,
EFF_LA3,
EFF_LA4,
//右手臂
EFF_RA1,
EFF_RA2,
EFF_RA3,
EFF_RA4,
//左腿
EFF_LL1,
EFF_LL2,
EFF_LL3,
EFF_LL4,
EFF_LL5,
EFF_LL6,
EFF_LL7,
//右腿
EFF_RL1,
EFF_RL2,
EFF_RL3,
EFF_RL4,
EFF_RL5,
EFF_RL6,
EFF_RL7,
//效应器总数(24)
EFF_NUM
};
下面给出代码中关于效应器的初始化信息:
// PID controller parameters
double P = 0.15;
double I = 0.0;
double D = 0.01;
double ET = 2.0;
// minAng maxAng
effector[EFF_H1] = Effector(-120.0, 120.0, P, I, D, ET);//NECK
effector[EFF_H2] = Effector(-45.0, 45.0, P, I, D, ET);//HEAD
effector[EFF_LA1] = Effector(-120.0, 120.0, P, I, D, ET);//SHOULDER (-y)
effector[EFF_LA2] = Effector(-1.0, 95.0, P, I, D, ET);//UPPERARM (z)
effector[EFF_LA3] = Effector(-120.0, 120.0, P, I, D, ET);//LOWERARM (x)
effector[EFF_LA4] = Effector(-90.0, 1.0, P, I, D, ET);//ELBOW (z)
effector[EFF_RA1] = Effector(-120.0, 120.0, P, I, D, ET);//SHOULDER (-y)
effector[EFF_RA2] = Effector(-95.0, 1.0, P, I, D, ET);//UPPERARM (z)
effector[EFF_RA3] = Effector(-120.0, 120.0, P, I, D, ET);//LOWERARM (x)
effector[EFF_RA4] = Effector(-1.0, 90.0, P, I, D, ET);//ELBOW (z)
effector[EFF_LL1] = Effector(-90.0, 1.0, P, I, D, ET);//HIP1 (y, -z)
effector[EFF_LL2] = Effector(-25.0, 45.0, P, I, D, ET);//HIP2 (x)
effector[EFF_LL3] = Effector(-25.0, 100.0, P, I, D, ET);//HIP3 (-y)
effector[EFF_LL4] = Effector(-130.0, 1.0, P, I, D, ET);//KNEE (-y)
effector[EFF_LL5] = Effector(-45.0, 75.0, P, I, D, ET);//ANKLE PITCH (-y)
effector[EFF_LL6] = Effector(-45.0, 25.0, P, I, D, ET);//ANKLE ROLL (x)
effector[EFF_LL7] = Effector(-1.0, 70.0, P, I, D, ET);//TOE
effector[EFF_RL1] = Effector(-90.0, 1.0, P, I, D, ET);//HIP1 (y, z)
effector[EFF_RL2] = Effector(-45.0, 25.0, P, I, D, ET);//HIP2 (x)
effector[EFF_RL3] = Effector(-25.0, 100.0, P, I, D, ET);//HIP3 (-y)
effector[EFF_RL4] = Effector(-130.0, 1.0, P, I, D, ET);//KNEE (-y)
effector[EFF_RL5] = Effector(-45.0, 75.0, P, I, D, ET);//ANKLE PITCH (-y)
effector[EFF_RL6] = Effector(-25.0, 45.0, P, I, D, ET);//ANKLE ROLL (x)
effector[EFF_RL7] = Effector(-1.0, 70.0, P, I, D, ET);//TOE
上述中的PID参数依然可以进行调整,达到更好的控制效果,各效应器的关节范围与上文关节范围一致。
3.身体部件状态信息
机器人由一系列身体部件和关节连接组成,身体部件含有一定质量,而关节没有质量,为衡量机器人每一个身体部件的状态,底层代码中设计了身体部件Component结构体,用于表示各部件的相关信息。Component结构体可以用于构建复杂的系统,通过组合多个Component对象,可以构建出完整的机器人。有关Component结构体的定义在上一章节已经给出,不再介绍。为便于表示各部件,代码中采用宏定义,将各身体部件编号,定义如下:
//身体部件
#define COMP_TORSO 0
#define COMP_NECK 1
#define COMP_HEAD 2
#define COMP_LSHOULDER 3
#define COMP_LUPPERARM 4
#define COMP_LELBOW 5
#define COMP_LLOWERARM 6
#define COMP_RSHOULDER 7
#define COMP_RUPPERARM 8
#define COMP_RELBOW 9
#define COMP_RLOWERARM 10
#define COMP_LHIP1 11
#define COMP_LHIP2 12
#define COMP_LTHIGH 13
#define COMP_LSHANK 14
#define COMP_LANKLE 15
#define COMP_LFOOT 16
#define COMP_RHIP1 17
#define COMP_RHIP2 18
#define COMP_RTHIGH 19
#define COMP_RSHANK 20
#define COMP_RANKLE 21
#define COMP_RFOOT 22
#define COMP_NUM 23
一共23个身体部件,同样与上文中对仿真机器人的介绍一致。
为将各部件组合成相应类型的机器人模型,需要确定各部件的连接位置和固定点,下面是对身体部件进行连接的示例:
//颈部
index = COMP_NECK;//部件名称
parent = COMP_TORSO;//父部件名称
mass = 0.05;//质量
translation = VecPosition(0, 0, 0.09);//相对父部件偏移位置
anchor = VecPosition(0, 0, 0);//锚定点(旋转或移动过程中不动的点)
axis = VecPosition(0, 0, 1.0);//旋转轴
component[index] = Component(parent, mass, translation, anchor, axis);//初始化身体部件
上述为颈部部件的连接过程,首先定义该部件名称为“COMP_NECK”(即颈部),其父组件为“COMP_TORSO”(即躯干)。该部件质量为
0.05千克,相对于躯干的位置为(0,0,0.09),即颈部在躯干上方0.09米处。锚定点为(0,0,0),即在关节旋转过程中,该部件的锚定点距离父部件距离为0。旋转轴为(0,0,1),即该部件可绕Z轴旋转,且逆时针旋转为正方向。下图展示了颈部与躯干的连接:

其余身体部件的连接与之类似,将23个身体部件全部连接,便组成了仿真环境中的Nao机器人,其余部件的连接方法在此不再介绍。
4.任务相关状态信息
在比赛环境中,为实现一定的策略与高级行为技能,往往需要实时关注场上球员分布和球的位置。这需要对实时的感知信息进行处理和分析,计算出相应的状态并记录。该部分一般是用于构建机器人世界模型,来帮助机器人分析自身所处的环境状态,关于该部分会在后续章节进行更加详细的介绍。同时,身体模型bodymodel中也包含了世界模型worldmodel,通过这样的设计将感知的信息赋予带有物理特性的身体,实现了“软件和硬件的结合”。两者共同为更高级的抽象行为或自主决策提供坚实的基础。
4.3.3 状态空间的应用
1.路径规划
在机器人移动过程中,为避免或减少产生碰撞的可能性,往往采用路径规划算法避开对手。在该任务中便需要根据状态空间中的变量进行分析。一般情况下,该状态空间应该包含需要避让的障碍物(对手)位置以及避让半径、目标位置、起始位置、地图信息。

上图是FCPortugal团队实现的路径规划算法,图中圆圈代表障碍物,球员位于左上角,球位于右下角,深绿色的线代表从球员出发寻找球,浅绿色的线代表从球出发寻找球员,可以看出该方法能够很好地避开障碍物并实现较短的路径。
2.角色分配
在足球机器人比赛中,往往需要团队的配合来实现传球或进球。为将机器人合理地分配到最有效的位置,采用角色分配是比较好的方法。角色分配的最基本的想法是将一个设定好的阵型角色,随着球的移动进行改变,同时给每一个机器人分配能够最快到达预定位置的角色。但单一的阵型在某些情况下无法达到合适的效果,因此,实际比赛时所采用的阵型一般是随场上情况动态改变的。一般情况下,该状态空间应该包含需要分配的角色位置、足球位置、当前我方球员位置、当前敌方球员位置(如果需要)。

上图是UT Austin Villa团队所实现的角色分配策略,其中白色的点代表球的位置,绿色的点和蓝色的线代表己方球员所分配的位置和行走的路径,橙色的点和线代表为进行盯防敌方队员,我方所进行的角色的分配的目标位置。由此可见,其角色分配的策略不仅很好地将我方的球员进行合理的分布,还很好地针对敌方存在潜在威胁的球员进行了盯防。
3.传球协作
传球作为一项进攻和防守手段,在比赛中发挥着重要的作用。然而,如何选择合适的传球点是一个问题。如果传球点距离敌方太近,会对我方造成,距离我方太近可能无法实现较远的传球距离。因此需要评判场上各个可能传球点的好坏,选择更有利于我方的传球位置。该任务中的状态空间一般含有足球位置、当前我方球员位置、当前敌方球员位置、球门位置。

上图是UT Austin Villa团队所实现的一种选择传球位置的策略,其中对于传球队员,以其为中心,按照一定的距离间隔和角度间隔分配可能的传球位置,计算每一个传球位置的分数(越白代表分数越高,越黑代表分数越低)。上图中的情况,处于最上部位置的球员最适合接球,该位置的传球点(红色点)分数最高。
