仿人立起¶

此环境是 MuJoCo 环境的一部分,其中包含有关该环境的一般信息。
动作空间 |
|
观测空间 |
|
导入 |
|
描述¶
此环境基于 Tassa、Erez 和 Todorov 在 “通过在线轨迹优化合成和稳定复杂行为” 中介绍的环境。这个3D双足机器人旨在模拟人类。它有一个躯干(腹部),一对腿和手臂,以及一对连接髋部到膝盖的肌腱。每条腿由三个身体部分(大腿、小腿、脚)组成,手臂由两个身体部分(上臂、前臂)组成。环境开始时,仿人机器人躺在地上,然后环境的目标是通过对各个铰链施加扭矩,使仿人机器人站立起来并保持站立。
动作空间¶

动作空间是一个 Box(-0.4, 0.4, (17,), float32)
。一个动作代表施加在铰链关节上的扭矩。
编号 |
动作 |
控制最小值 |
控制最大值 |
名称(在相应的 XML 文件中) |
关节 |
类型(单位) |
---|---|---|---|---|---|---|
0 |
施加在腹部y坐标铰链上的扭矩 |
-0.4 |
0.4 |
abdomen_y |
铰链 |
扭矩 (N m) |
1 |
施加在腹部z坐标铰链上的扭矩 |
-0.4 |
0.4 |
abdomen_z |
铰链 |
扭矩 (N m) |
2 |
施加在腹部x坐标铰链上的扭矩 |
-0.4 |
0.4 |
abdomen_x |
铰链 |
扭矩 (N m) |
3 |
施加在躯干/腹部与右髋部之间的转子上(x坐标)的扭矩 |
-0.4 |
0.4 |
right_hip_x (right_thigh) |
铰链 |
扭矩 (N m) |
4 |
施加在躯干/腹部与右髋部之间的转子上(z坐标)的扭矩 |
-0.4 |
0.4 |
right_hip_z (right_thigh) |
铰链 |
扭矩 (N m) |
5 |
施加在躯干/腹部与右髋部之间的转子上(y坐标)的扭矩 |
-0.4 |
0.4 |
right_hip_y (right_thigh) |
铰链 |
扭矩 (N m) |
6 |
施加在右髋部/大腿与右小腿之间的转子上的扭矩 |
-0.4 |
0.4 |
right_knee |
铰链 |
扭矩 (N m) |
7 |
施加在躯干/腹部与左髋部之间的转子上(x坐标)的扭矩 |
-0.4 |
0.4 |
left_hip_x (left_thigh) |
铰链 |
扭矩 (N m) |
8 |
施加在躯干/腹部与左髋部之间的转子上(z坐标)的扭矩 |
-0.4 |
0.4 |
left_hip_z (left_thigh) |
铰链 |
扭矩 (N m) |
9 |
施加在躯干/腹部与左髋部之间的转子上(y坐标)的扭矩 |
-0.4 |
0.4 |
left_hip_y (left_thigh) |
铰链 |
扭矩 (N m) |
10 |
施加在左髋部/大腿与左小腿之间的转子上的扭矩 |
-0.4 |
0.4 |
left_knee |
铰链 |
扭矩 (N m) |
11 |
施加在躯干与右上臂之间的转子上(坐标-1)的扭矩 |
-0.4 |
0.4 |
right_shoulder1 |
铰链 |
扭矩 (N m) |
12 |
施加在躯干与右上臂之间的转子上(坐标-2)的扭矩 |
-0.4 |
0.4 |
right_shoulder2 |
铰链 |
扭矩 (N m) |
13 |
施加在右上臂与右下臂之间的转子上的扭矩 |
-0.4 |
0.4 |
right_elbow |
铰链 |
扭矩 (N m) |
14 |
施加在躯干与左上臂之间的转子上(坐标-1)的扭矩 |
-0.4 |
0.4 |
left_shoulder1 |
铰链 |
扭矩 (N m) |
15 |
施加在躯干与左上臂之间的转子上(坐标-2)的扭矩 |
-0.4 |
0.4 |
left_shoulder2 |
铰链 |
扭矩 (N m) |
16 |
施加在左上臂与左下臂之间的转子上的扭矩 |
-0.4 |
0.4 |
left_elbow |
铰链 |
扭矩 (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坐标都将通过键 "x_position"
和 "y_position"
在 info
中返回。
然而,默认情况下,观测空间是一个 Box(-Inf, Inf, (348,), float64)
,其中位置和速度元素如下:
编号 |
观测 |
最小值 |
最大值 |
名称(在相应的 XML 文件中) |
关节 |
类型(单位) |
---|---|---|---|---|---|---|
0 |
躯干(中心)的z坐标 |
-Inf |
Inf |
根 |
自由 |
位置 (m) |
1 |
躯干(中心)的w方向 |
-Inf |
Inf |
根 |
自由 |
角度 (rad) |
2 |
躯干(中心)的x方向 |
-Inf |
Inf |
根 |
自由 |
角度 (rad) |
3 |
躯干(中心)的y方向 |
-Inf |
Inf |
根 |
自由 |
角度 (rad) |
4 |
躯干(中心)的z方向 |
-Inf |
Inf |
根 |
自由 |
角度 (rad) |
5 |
腹部的z角度(在lower_waist中) |
-Inf |
Inf |
abdomen_z |
铰链 |
角度 (rad) |
6 |
腹部的y角度(在lower_waist中) |
-Inf |
Inf |
abdomen_y |
铰链 |
角度 (rad) |
7 |
腹部的x角度(在pelvis中) |
-Inf |
Inf |
abdomen_x |
铰链 |
角度 (rad) |
8 |
骨盆和右髋部之间角度的x坐标(在right_thigh中) |
-Inf |
Inf |
right_hip_x |
铰链 |
角度 (rad) |
9 |
骨盆和右髋部之间角度的z坐标(在right_thigh中) |
-Inf |
Inf |
right_hip_z |
铰链 |
角度 (rad) |
10 |
骨盆和右髋部之间角度的y坐标(在right_thigh中) |
-Inf |
Inf |
right_hip_y |
铰链 |
角度 (rad) |
11 |
右髋部与右小腿之间的角度(在right_knee中) |
-Inf |
Inf |
right_knee |
铰链 |
角度 (rad) |
12 |
骨盆和左髋部之间角度的x坐标(在left_thigh中) |
-Inf |
Inf |
left_hip_x |
铰链 |
角度 (rad) |
13 |
骨盆和左髋部之间角度的z坐标(在left_thigh中) |
-Inf |
Inf |
left_hip_z |
铰链 |
角度 (rad) |
14 |
骨盆和左髋部之间角度的y坐标(在left_thigh中) |
-Inf |
Inf |
left_hip_y |
铰链 |
角度 (rad) |
15 |
左髋部与左小腿之间的角度(在left_knee中) |
-Inf |
Inf |
left_knee |
铰链 |
角度 (rad) |
16 |
躯干与右臂之间的坐标-1(多轴)角度(在right_upper_arm中) |
-Inf |
Inf |
right_shoulder1 |
铰链 |
角度 (rad) |
17 |
躯干与右臂之间的坐标-2(多轴)角度(在right_upper_arm中) |
-Inf |
Inf |
right_shoulder2 |
铰链 |
角度 (rad) |
18 |
右上臂与右下臂之间的角度 |
-Inf |
Inf |
right_elbow |
铰链 |
角度 (rad) |
19 |
躯干与左臂之间的坐标-1(多轴)角度(在left_upper_arm中) |
-Inf |
Inf |
left_shoulder1 |
铰链 |
角度 (rad) |
20 |
躯干与左臂之间的坐标-2(多轴)角度(在left_upper_arm中) |
-Inf |
Inf |
left_shoulder2 |
铰链 |
角度 (rad) |
21 |
左上臂与左下臂之间的角度 |
-Inf |
Inf |
left_elbow |
铰链 |
角度 (rad) |
22 |
躯干(中心)的x坐标速度 |
-Inf |
Inf |
根 |
自由 |
速度 (m/s) |
23 |
躯干(中心)的y坐标速度 |
-Inf |
Inf |
根 |
自由 |
速度 (m/s) |
24 |
躯干(中心)的z坐标速度 |
-Inf |
Inf |
根 |
自由 |
速度 (m/s) |
25 |
躯干(中心)的x坐标角速度 |
-Inf |
Inf |
根 |
自由 |
角速度 (rad/s) |
26 |
躯干(中心)的y坐标角速度 |
-Inf |
Inf |
根 |
自由 |
角速度 (rad/s) |
27 |
躯干(中心)的z坐标角速度 |
-Inf |
Inf |
根 |
自由 |
角速度 (rad/s) |
28 |
腹部的z坐标角速度(在lower_waist中) |
-Inf |
Inf |
abdomen_z |
铰链 |
角速度 (rad/s) |
29 |
腹部的y坐标角速度(在lower_waist中) |
-Inf |
Inf |
abdomen_y |
铰链 |
角速度 (rad/s) |
30 |
腹部的x坐标角速度(在pelvis中) |
-Inf |
Inf |
abdomen_x |
铰链 |
角速度 (rad/s) |
31 |
骨盆和右髋部之间角度的x坐标角速度(在right_thigh中) |
-Inf |
Inf |
right_hip_x |
铰链 |
角速度 (rad/s) |
32 |
骨盆和右髋部之间角度的z坐标角速度(在right_thigh中) |
-Inf |
Inf |
right_hip_z |
铰链 |
角速度 (rad/s) |
33 |
骨盆和右髋部之间角度的y坐标角速度(在right_thigh中) |
-Inf |
Inf |
right_hip_y |
铰链 |
角速度 (rad/s) |
34 |
右髋部与右小腿之间角度的角速度(在right_knee中) |
-Inf |
Inf |
right_knee |
铰链 |
角速度 (rad/s) |
35 |
骨盆和左髋部之间角度的x坐标角速度(在left_thigh中) |
-Inf |
Inf |
left_hip_x |
铰链 |
角速度 (rad/s) |
36 |
骨盆和左髋部之间角度的z坐标角速度(在left_thigh中) |
-Inf |
Inf |
left_hip_z |
铰链 |
角速度 (rad/s) |
37 |
骨盆和左髋部之间角度的y坐标角速度(在left_thigh中) |
-Inf |
Inf |
left_hip_y |
铰链 |
角速度 (rad/s) |
38 |
左髋部与左小腿之间角度的角速度(在left_knee中) |
-Inf |
Inf |
left_knee |
铰链 |
角速度 (rad/s) |
39 |
躯干与右臂之间角度的坐标-1(多轴)角速度(在right_upper_arm中) |
-Inf |
Inf |
right_shoulder1 |
铰链 |
角速度 (rad/s) |
40 |
躯干与右臂之间角度的坐标-2(多轴)角速度(在right_upper_arm中) |
-Inf |
Inf |
right_shoulder2 |
铰链 |
角速度 (rad/s) |
41 |
右上臂与右下臂之间角度的角速度 |
-Inf |
Inf |
right_elbow |
铰链 |
角速度 (rad/s) |
42 |
躯干与左臂之间角度的坐标-1(多轴)角速度(在left_upper_arm中) |
-Inf |
Inf |
left_shoulder1 |
铰链 |
角速度 (rad/s) |
43 |
躯干与左臂之间角度的坐标-2(多轴)角速度(在left_upper_arm中) |
-Inf |
Inf |
left_shoulder2 |
铰链 |
角速度 (rad/s) |
44 |
左上臂与左下臂之间角度的角速度 |
-Inf |
Inf |
left_elbow |
铰链 |
角速度 (rad/s) |
排除 |
躯干(中心)的x坐标 |
-Inf |
Inf |
根 |
自由 |
位置 (m) |
排除 |
躯干(中心)的y坐标 |
-Inf |
Inf |
根 |
自由 |
位置 (m) |
身体部位是
身体部位 |
ID(适用于 |
ID(适用于 |
---|---|---|
世界体(注意:所有值均为常数0) |
0 |
排除 |
躯干 |
1 |
0 |
lwaist |
2 |
1 |
骨盆 |
3 |
2 |
右大腿 |
4 |
3 |
右小腿 |
5 |
4 |
右脚 |
6 |
5 |
左大腿 |
7 |
6 |
左小腿 |
8 |
7 |
左脚 |
9 |
8 |
右上臂 |
10 |
9 |
右下臂 |
11 |
10 |
左上臂 |
12 |
11 |
左下臂 |
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_hiz_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_elfbow |
22 |
16 |
(x,y,z) 坐标是平移自由度,而方向是表示为四元数的旋转自由度。可以在 MuJoCo 文档 中阅读更多关于自由关节的信息。
注意: 当使用 HumanoidStandup-v3 或更早版本时,据报道使用 mujoco-py
版本 > 2.0 会出现问题,导致接触力始终为0。因此,如果您希望报告包含接触力的结果,建议在使用 HumanoidStandup 环境时使用 mujoco-py
版本 < 2.0(如果您的实验中不使用接触力,则可以使用版本 > 2.0)。
奖励¶
总奖励为: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
的cinert
、cvel
和cfrc_ext
以及root
/freejoint
的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 中的 MuJoCo 绑定。
v3: 此环境没有 v3 版本。已移至 gymnasium-robotics 仓库。
v2: 所有连续控制环境现在都使用 mujoco-py >= 1.50。已移至 gymnasium-robotics 仓库。
v1: 基于机器人的任务的最大时间步数提高到1000。向环境添加了 reward_threshold。
v0: 初始版本发布。