Humanoid Standup (人形机器人站立)¶
此环境是 Mujoco 环境的一部分,其中包含有关该环境的常规信息。
动作空间 |
|
观测空间 |
|
import |
|
描述¶
该环境基于 Tassa、Erez 和 Todorov 在 “通过在线轨迹优化实现复杂行为的合成与稳定” 中引入的环境。该 3D 双足机器人旨在模拟人类。它拥有一个躯干(腹部)、一对腿和手臂,以及一对连接臀部与膝盖的肌腱。每条腿由三个身体部分组成(大腿、小腿、脚),手臂由两个身体部分组成(上臂、前臂)。环境初始时人形机器人平躺在地,环境的目标是通过向不同的关节施加扭矩,使人形机器人站起来并保持站立状态。
动作空间¶
动作空间是一个 Box(-0.4, 0.4, (17,), float32)。动作表示施加在铰链关节上的扭矩。
编号 |
动作 |
控制最小值 |
控制最大值 |
名称(对应 XML 文件) |
关节 |
类型(单位) |
|---|---|---|---|---|---|---|
0 |
施加在腹部 y 坐标铰链上的扭矩 |
-0.4 |
0.4 |
abdomen_y |
铰链 (hinge) |
扭矩 (N m) |
1 |
施加在腹部 z 坐标铰链上的扭矩 |
-0.4 |
0.4 |
abdomen_z |
铰链 (hinge) |
扭矩 (N m) |
2 |
施加在腹部 x 坐标铰链上的扭矩 |
-0.4 |
0.4 |
abdomen_x |
铰链 (hinge) |
扭矩 (N m) |
3 |
施加在躯干/腹部与右髋之间转子上的扭矩(x 坐标) |
-0.4 |
0.4 |
right_hip_x (右大腿) |
铰链 (hinge) |
扭矩 (N m) |
4 |
施加在躯干/腹部与右髋之间转子上的扭矩(z 坐标) |
-0.4 |
0.4 |
right_hip_z (右大腿) |
铰链 (hinge) |
扭矩 (N m) |
5 |
施加在躯干/腹部与右髋之间转子上的扭矩(y 坐标) |
-0.4 |
0.4 |
right_hip_y (右大腿) |
铰链 (hinge) |
扭矩 (N m) |
6 |
施加在右髋/大腿与右小腿之间转子上的扭矩 |
-0.4 |
0.4 |
right_knee (右膝) |
铰链 (hinge) |
扭矩 (N m) |
7 |
施加在躯干/腹部与左髋之间转子上的扭矩(x 坐标) |
-0.4 |
0.4 |
left_hip_x (左大腿) |
铰链 (hinge) |
扭矩 (N m) |
8 |
施加在躯干/腹部与左髋之间转子上的扭矩(z 坐标) |
-0.4 |
0.4 |
left_hip_z (左大腿) |
铰链 (hinge) |
扭矩 (N m) |
9 |
施加在躯干/腹部与左髋之间转子上的扭矩(y 坐标) |
-0.4 |
0.4 |
left_hip_y (左大腿) |
铰链 (hinge) |
扭矩 (N m) |
10 |
施加在左髋/大腿与左小腿之间转子上的扭矩 |
-0.4 |
0.4 |
left_knee (左膝) |
铰链 (hinge) |
扭矩 (N m) |
11 |
施加在躯干与右上臂之间转子上的扭矩(坐标 -1) |
-0.4 |
0.4 |
right_shoulder1 |
铰链 (hinge) |
扭矩 (N m) |
12 |
施加在躯干与右上臂之间转子上的扭矩(坐标 -2) |
-0.4 |
0.4 |
right_shoulder2 |
铰链 (hinge) |
扭矩 (N m) |
13 |
施加在右上臂与右前臂之间转子上的扭矩 |
-0.4 |
0.4 |
right_elbow (右肘) |
铰链 (hinge) |
扭矩 (N m) |
14 |
施加在躯干与左上臂之间转子上的扭矩(坐标 -1) |
-0.4 |
0.4 |
left_shoulder1 |
铰链 (hinge) |
扭矩 (N m) |
15 |
施加在躯干与左上臂之间转子上的扭矩(坐标 -2) |
-0.4 |
0.4 |
left_shoulder2 |
铰链 (hinge) |
扭矩 (N m) |
16 |
施加在左上臂与左前臂之间转子上的扭矩 |
-0.4 |
0.4 |
left_elbow (左肘) |
铰链 (hinge) |
扭矩 (N m) |
观测空间¶
观测空间由以下部分组成(按顺序)
qpos (默认 22 个元素): 机器人身体各部分的姿态值。
qvel (23 个元素): 这些身体部分的运动速度(即其导数)。
cinert (130 个元素): 刚体部分相对于质心的质量和惯性(这是转换的中间结果)。它的形状为 13*10 (nbody * 10)。(cinert - 惯性矩阵、身体质量偏移和身体质量)
cvel (78 个元素): 基于质心的速度。它的形状为 13 * 6 (nbody * 6)。(质心速度 - 速度 x, y, z 和角速度 x, y, z)
qfrc_actuator (17 个元素): 在每个关节处作为执行器力产生的约束力。其形状为
(17,)(nv * 1)。cfrc_ext (78 个元素): 这是身体部分上基于质心的外部力。它的形状为 13 * 6 (nbody * 6),因此在观测空间中增加了 78 个元素。(外部力 - 力 x, y, z 和扭矩 x, y, z)
其中 nbody 是机器人中身体的数量,nv 是自由度数量 (= dim(qvel))。
默认情况下,观测不包含躯干的 x 和 y 坐标。可以通过在构建时传递 exclude_current_positions_from_observation=False 来包含这些坐标。在这种情况下,观测空间将是一个 Box(-Inf, Inf, (350,), float64),其中前两个观测值分别是躯干的 x 和 y 坐标。无论 exclude_current_positions_from_observation 设置为 True 还是 False,x 和 y 坐标都会通过 info 返回,键分别为 "x_position" 和 "y_position"。
然而,默认情况下,观测空间是一个 Box(-Inf, Inf, (348,), float64),其中位置和速度元素如下:
编号 |
观测值 |
最小值 |
最大值 |
名称(对应 XML 文件) |
关节 |
类型(单位) |
|---|---|---|---|---|---|---|
0 |
躯干 z 坐标(中心) |
-Inf |
Inf |
根节点 (root) |
自由 (free) |
位置 (m) |
1 |
躯干 w 方向(中心) |
-Inf |
Inf |
根节点 (root) |
自由 (free) |
角度 (rad) |
2 |
躯干 x 方向(中心) |
-Inf |
Inf |
根节点 (root) |
自由 (free) |
角度 (rad) |
3 |
躯干 y 方向(中心) |
-Inf |
Inf |
根节点 (root) |
自由 (free) |
角度 (rad) |
4 |
躯干 z 方向(中心) |
-Inf |
Inf |
根节点 (root) |
自由 (free) |
角度 (rad) |
5 |
腹部的 z 角度(在 lower_waist 中) |
-Inf |
Inf |
abdomen_z |
铰链 (hinge) |
角度 (rad) |
6 |
腹部的 y 角度(在 lower_waist 中) |
-Inf |
Inf |
abdomen_y |
铰链 (hinge) |
角度 (rad) |
7 |
腹部的 x 角度(在 pelvis 中) |
-Inf |
Inf |
abdomen_x |
铰链 (hinge) |
角度 (rad) |
8 |
骨盆与右髋之间角度的 x 坐标(在 right_thigh 中) |
-Inf |
Inf |
right_hip_x |
铰链 (hinge) |
角度 (rad) |
9 |
骨盆与右髋之间角度的 z 坐标(在 right_thigh 中) |
-Inf |
Inf |
right_hip_z |
铰链 (hinge) |
角度 (rad) |
10 |
骨盆与右髋之间角度的 y 坐标(在 right_thigh 中) |
-Inf |
Inf |
right_hip_y |
铰链 (hinge) |
角度 (rad) |
11 |
右髋与右小腿之间的角度(在 right_knee 中) |
-Inf |
Inf |
right_knee (右膝) |
铰链 (hinge) |
角度 (rad) |
12 |
骨盆与左髋之间角度的 x 坐标(在 left_thigh 中) |
-Inf |
Inf |
left_hip_x |
铰链 (hinge) |
角度 (rad) |
13 |
骨盆与左髋之间角度的 z 坐标(在 left_thigh 中) |
-Inf |
Inf |
left_hip_z |
铰链 (hinge) |
角度 (rad) |
14 |
骨盆与左髋之间角度的 y 坐标(在 left_thigh 中) |
-Inf |
Inf |
left_hip_y |
铰链 (hinge) |
角度 (rad) |
15 |
左髋与左小腿之间的角度(在 left_knee 中) |
-Inf |
Inf |
left_knee (左膝) |
铰链 (hinge) |
角度 (rad) |
16 |
躯干与右臂之间的坐标-1(多轴)角度(在 right_upper_arm 中) |
-Inf |
Inf |
right_shoulder1 |
铰链 (hinge) |
角度 (rad) |
17 |
躯干与右臂之间的坐标-2(多轴)角度(在 right_upper_arm 中) |
-Inf |
Inf |
right_shoulder2 |
铰链 (hinge) |
角度 (rad) |
18 |
右上臂与右前臂之间的角度 |
-Inf |
Inf |
right_elbow (右肘) |
铰链 (hinge) |
角度 (rad) |
19 |
躯干与左臂之间的坐标-1(多轴)角度(在 left_upper_arm 中) |
-Inf |
Inf |
left_shoulder1 |
铰链 (hinge) |
角度 (rad) |
20 |
躯干与左臂之间的坐标-2(多轴)角度(在 left_upper_arm 中) |
-Inf |
Inf |
left_shoulder2 |
铰链 (hinge) |
角度 (rad) |
21 |
左上臂与左前臂之间的角度 |
-Inf |
Inf |
left_elbow (左肘) |
铰链 (hinge) |
角度 (rad) |
22 |
躯干的 x 坐标速度(中心) |
-Inf |
Inf |
根节点 (root) |
自由 (free) |
速度 (m/s) |
23 |
躯干的 y 坐标速度(中心) |
-Inf |
Inf |
根节点 (root) |
自由 (free) |
速度 (m/s) |
24 |
躯干的 z 坐标速度(中心) |
-Inf |
Inf |
根节点 (root) |
自由 (free) |
速度 (m/s) |
25 |
躯干的 x 坐标角速度(中心) |
-Inf |
Inf |
根节点 (root) |
自由 (free) |
角速度 (rad/s) |
26 |
躯干的 y 坐标角速度(中心) |
-Inf |
Inf |
根节点 (root) |
自由 (free) |
角速度 (rad/s) |
27 |
躯干的 z 坐标角速度(中心) |
-Inf |
Inf |
根节点 (root) |
自由 (free) |
角速度 (rad/s) |
28 |
腹部的 z 坐标角速度(在 lower_waist 中) |
-Inf |
Inf |
abdomen_z |
铰链 (hinge) |
角速度 (rad/s) |
29 |
腹部的 y 坐标角速度(在 lower_waist 中) |
-Inf |
Inf |
abdomen_y |
铰链 (hinge) |
角速度 (rad/s) |
30 |
腹部的 x 坐标角速度(在 pelvis 中) |
-Inf |
Inf |
abdomen_x |
铰链 (hinge) |
角速度 (rad/s) |
31 |
骨盆与右髋之间角度的 x 坐标角速度(在 right_thigh 中) |
-Inf |
Inf |
right_hip_x |
铰链 (hinge) |
角速度 (rad/s) |
32 |
骨盆与右髋之间角度的 z 坐标角速度(在 right_thigh 中) |
-Inf |
Inf |
right_hip_z |
铰链 (hinge) |
角速度 (rad/s) |
33 |
骨盆与右髋之间角度的 y 坐标角速度(在 right_thigh 中) |
-Inf |
Inf |
right_hip_y |
铰链 (hinge) |
角速度 (rad/s) |
34 |
右髋与右小腿之间角度的角速度(在 right_knee 中) |
-Inf |
Inf |
right_knee (右膝) |
铰链 (hinge) |
角速度 (rad/s) |
35 |
骨盆与左髋之间角度的 x 坐标角速度(在 left_thigh 中) |
-Inf |
Inf |
left_hip_x |
铰链 (hinge) |
角速度 (rad/s) |
36 |
骨盆与左髋之间角度的 z 坐标角速度(在 left_thigh 中) |
-Inf |
Inf |
left_hip_z |
铰链 (hinge) |
角速度 (rad/s) |
37 |
骨盆与左髋之间角度的 y 坐标角速度(在 left_thigh 中) |
-Inf |
Inf |
left_hip_y |
铰链 (hinge) |
角速度 (rad/s) |
38 |
左髋与左小腿之间角度的角速度(在 left_knee 中) |
-Inf |
Inf |
left_knee (左膝) |
铰链 (hinge) |
角速度 (rad/s) |
39 |
躯干与右臂之间角度的坐标-1(多轴)角速度(在 right_upper_arm 中) |
-Inf |
Inf |
right_shoulder1 |
铰链 (hinge) |
角速度 (rad/s) |
40 |
躯干与右臂之间角度的坐标-2(多轴)角速度(在 right_upper_arm 中) |
-Inf |
Inf |
right_shoulder2 |
铰链 (hinge) |
角速度 (rad/s) |
41 |
右上臂与右前臂之间角度的角速度 |
-Inf |
Inf |
right_elbow (右肘) |
铰链 (hinge) |
角速度 (rad/s) |
42 |
躯干与左臂之间角度的坐标-1(多轴)角速度(在 left_upper_arm 中) |
-Inf |
Inf |
left_shoulder1 |
铰链 (hinge) |
角速度 (rad/s) |
43 |
躯干与左臂之间角度的坐标-2(多轴)角速度(在 left_upper_arm 中) |
-Inf |
Inf |
left_shoulder2 |
铰链 (hinge) |
角速度 (rad/s) |
44 |
左上臂与左前臂之间角度的角速度 |
-Inf |
Inf |
left_elbow (左肘) |
铰链 (hinge) |
角速度 (rad/s) |
已排除 |
躯干 x 坐标(中心) |
-Inf |
Inf |
根节点 (root) |
自由 (free) |
位置 (m) |
已排除 |
躯干 y 坐标(中心) |
-Inf |
Inf |
根节点 (root) |
自由 (free) |
位置 (m) |
身体部位为
身体部位 |
id (适用于 |
id (适用于 |
|---|---|---|
worldbody (注意:所有值均为常数 0) |
0 |
已排除 |
torso |
1 |
0 |
lwaist |
2 |
1 |
pelvis |
3 |
2 |
right_thigh |
4 |
3 |
right_shin |
5 |
4 |
right_foot |
6 |
5 |
left_thigh |
7 |
6 |
left_shin |
8 |
7 |
left_foot |
9 |
8 |
right_upper_arm |
10 |
9 |
right_lower_arm |
11 |
10 |
left_upper_arm |
12 |
11 |
left_lower_arm |
13 |
12 |
关节如下:
关节 |
id (适用于 |
id (适用于 |
|---|---|---|
根节点 (注意:所有值均为常数 0) |
0 |
已排除 |
根节点 (注意:所有值均为常数 0) |
1 |
已排除 |
根节点 (注意:所有值均为常数 0) |
2 |
已排除 |
根节点 (注意:所有值均为常数 0) |
3 |
已排除 |
根节点 (注意:所有值均为常数 0) |
4 |
已排除 |
根节点 (注意:所有值均为常数 0) |
5 |
已排除 |
abdomen_z |
6 |
0 |
abdomen_y |
7 |
1 |
abdomen_x |
8 |
2 |
right_hip_x |
9 |
3 |
right_hip_z |
10 |
4 |
right_hip_y |
11 |
5 |
right_knee (右膝) |
12 |
6 |
left_hip_x |
13 |
7 |
left_hip_z |
14 |
8 |
left_hip_y |
15 |
9 |
left_knee (左膝) |
16 |
10 |
right_shoulder1 |
17 |
11 |
right_shoulder2 |
18 |
12 |
right_elbow (右肘) |
19 |
13 |
left_shoulder1 |
20 |
14 |
left_shoulder2 |
21 |
15 |
left_elbow |
22 |
16 |
(x,y,z) 坐标是平移自由度 (DOF),而方向是表示为四元数的旋转自由度。您可以从 MuJoCo 文档中详细了解自由关节。
注意: 使用 HumanoidStandup-v3 或更早版本时,据报道使用 > 2.0 版本的 mujoco-py 会导致接触力始终为 0。因此,如果您希望报告涉及接触力的结果,建议在使用 HumanoidStandup 环境时使用 < 2.0 版本的 mujoco-py(如果您的实验中不使用接触力,则可以使用 > 2.0 版本)。
奖励(Rewards)¶
总奖励为: reward = uph_cost + 1 - quad_ctrl_cost - quad_impact_cost。
uph_cost:向上移动(尝试站立)的奖励。这并非相对奖励(衡量自上次时间步以来机器人向上移动了多少),而是衡量人形机器人总共向上移动了多少的绝对奖励。计算公式为 \(w_{uph} \times \frac{z_{after\_action} - 0}{dt}\),其中 \(z_{after\_action}\) 是采取动作后躯干的 z 坐标,\(dt\) 是动作之间的时间间隔,取决于
frame_skip参数(默认为 \(5\))和frametime(为 \(0.01\))——因此默认情况下 \(dt = 5 \times 0.01 = 0.05\),且 \(w_{uph}\) 是uph_cost_weight(默认为 \(1\))。quad_ctrl_cost:惩罚人形机器人采取过大动作的负奖励。\(w_{quad\_control} \times \|action\|_2^2\),其中 \(w_{quad\_control}\) 是
ctrl_cost_weight(默认为 \(0.1\))。impact_cost:如果外部接触力过大,则惩罚人形机器人的负奖励。\(w_{impact} \times clamp(impact\_cost\_range, \|F_{contact}\|_2^2)\),其中 \(w_{impact}\) 是
impact_cost_weight(默认为 \(5\times10^{-7}\)),\(F_{contact}\) 是外部接触力(参见观测空间中的cfrc_ext部分)。
info 包含各个奖励项。
起始状态¶
初始位置状态为 \([0.0, 0.0, 1.4, 1.0, 0.0, ... 0.0] + \mathcal{U}_{[-reset\_noise\_scale \times I_{24}, reset\_noise\_scale \times I_{24}]}\)。初始速度状态为 \(\mathcal{U}_{[-reset\_noise\_scale \times I_{23}, reset\_noise\_scale \times I_{23}]}\)。
其中 \(\mathcal{U}\) 是多元均匀连续分布。
注意,z 和 x 坐标非零,以便人形机器人立即平躺并面向前方(x 轴)。
回合结束¶
终止¶
人形机器人永不终止。
截断¶
一集的默认持续时间为 1000 个时间步。
参数¶
HumanoidStandup 提供了一系列参数来修改观测空间、奖励函数、初始状态和终止条件。这些参数可以在 gymnasium.make 时通过以下方式应用:
import gymnasium as gym
env = gym.make('HumanoidStandup-v5', impact_cost_weight=0.5e-6, ....)
参数 |
类型 |
默认值 |
描述 |
|---|---|---|---|
|
str |
|
MuJoCo 模型的路径 |
|
float |
|
uph_cost 项的权重(参见 |
|
float |
|
quad_ctrl_cost 项的权重(参见 |
|
float |
|
impact_cost 项的权重(参见 |
|
float |
|
限制 impact_cost(参见 |
|
float |
|
初始位置和速度的随机扰动比例(参见 |
|
bool |
|
是否从观测中省略 x 和 y 坐标。排除位置信息可以作为一种归纳偏置,以诱导策略具备位置无关性(参见 |
|
bool |
|
是否在观测中包含 cinert 元素(参见 |
|
bool |
|
是否在观测中包含 cvel 元素(参见 |
|
bool |
|
是否在观测中包含 qfrc_actuator 元素(参见 |
|
bool |
|
是否在观测中包含 cfrc_ext 元素(参见 |
版本历史¶
v5
最低
mujoco版本现为 2.3.3。添加了对使用
xml_file参数的完全自定义/第三方mujoco模型的支持(此前只能对现有模型进行少量更改)。添加了
default_camera_config参数,这是一个用于设置mj_camera属性的字典,主要对自定义环境有用。添加了
env.observation_structure,一个用于指定观测空间组成(例如qpos,qvel)的字典,对构建 MuJoCo 环境的工具和包装器很有用。使用
reset()返回非空的info,之前返回的是空字典;新键与step()的状态信息相同。添加了
frame_skip参数,用于配置dt(step()的持续时间),默认值因环境而异,请检查环境文档页面。从观测空间中排除了
worldbody和root/freejoint的cinert、cvel、cfrc_ext以及qfrc_actuator,因为它们始终为 0,不向智能体提供有用的信息,从而略微加快了训练速度(相关 GitHub 问题)。恢复了
xml_file参数(在v4中被移除)。添加了
xml_file参数。添加了
uph_cost_weight、ctrl_cost_weight、impact_cost_weight、impact_cost_range参数以配置奖励函数(默认值与v4基本相同)。添加了
reset_noise_scale参数以设置初始状态的范围。添加了
include_cinert_in_observation、include_cvel_in_observation、include_qfrc_actuator_in_observation、include_cfrc_ext_in_observation参数,允许从观测空间中排除观测元素。添加了
info["tendon_length"]和info["tendon_velocity"],包含人形机器人连接臀部到膝盖的 2 条肌腱的观测信息。添加了
info["x_position"]和info["y_position"],包含当exclude_current_positions_from_observation == True时被排除的观测信息。添加了
info["z_distance_from_origin"],即“躯干”身体距其初始位置的垂直距离。
v4:所有 MuJoCo 环境现在使用 mujoco >= 2.1.3 的绑定。
v3:此环境没有 v3 版本。已迁移至 gymnasium-robotics 仓库。
v2:所有连续控制环境现在都使用 mujoco-py >= 1.50。已移至 gymnasium-robotics 仓库。
v1:将机器人任务的 max_time_steps 提高到 1000。为环境添加了 reward_threshold。
v0:初始版本发布。