Ant (螞蟻)¶

此環境是 Mujoco 環境的一部分,其中包含關於環境的通用資訊。
Action Space (動作空間) |
|
Observation Space (觀測空間) |
|
import (導入) |
|
Description (描述)¶
此環境基於 Schulman、Moritz、Levine、Jordan 和 Abbeel 在“使用廣義優勢估計進行高維連續控制”中介紹的環境。 螞蟻是一個 3D 四足機器人,由一個軀幹(自由旋轉體)和附在其上的四條腿組成,每條腿有兩個身體部件。 目標是通過將扭矩應用於連接每條腿的兩個身體部件和軀幹的八個鉸鏈(九個身體部件和八個鉸鏈)來協調四條腿以向前(向右)方向移動。
注意:雖然機器人被稱為“螞蟻”,但實際上它高 75 厘米,重 910.88 克,其中軀幹重 327.25 克,每條腿重 145.91 克。
Action Space (動作空間)¶

動作空間是 Box(-1, 1, (8,), float32)
。 動作表示在鉸鏈關節處施加的扭矩。
Num (編號) |
Action (動作) |
Control Min (控制最小值) |
Control Max (控制最大值) |
Name (in corresponding XML file) (名稱(在對應的 XML 檔案中)) |
Joint (關節) |
Type (Unit) (類型(單位)) |
---|---|---|---|---|---|---|
0 |
施加在軀幹和後右髖部之間的轉子上的扭矩 |
-1 |
1 |
hip_4 (right_back_leg) (髖部 4(右後腿)) |
hinge (鉸鏈) |
torque (N m) (扭矩 (N m)) |
1 |
施加在後右腿兩個連桿之間的轉子上的扭矩 |
-1 |
1 |
angle_4 (right_back_leg) (角度 4(右後腿)) |
hinge (鉸鏈) |
torque (N m) (扭矩 (N m)) |
2 |
施加在軀幹和前左髖部之間的轉子上的扭矩 |
-1 |
1 |
hip_1 (front_left_leg) (髖部 1(前左腿)) |
hinge (鉸鏈) |
torque (N m) (扭矩 (N m)) |
3 |
施加在前左腿兩個連桿之間的轉子上的扭矩 |
-1 |
1 |
angle_1 (front_left_leg) (角度 1(前左腿)) |
hinge (鉸鏈) |
torque (N m) (扭矩 (N m)) |
4 |
施加在軀幹和前右髖部之間的轉子上的扭矩 |
-1 |
1 |
hip_2 (front_right_leg) (髖部 2(前右腿)) |
hinge (鉸鏈) |
torque (N m) (扭矩 (N m)) |
5 |
施加在前右腿兩個連桿之間的轉子上的扭矩 |
-1 |
1 |
angle_2 (front_right_leg) (角度 2(前右腿)) |
hinge (鉸鏈) |
torque (N m) (扭矩 (N m)) |
6 |
施加在軀幹和後左髖部之間的轉子上的扭矩 |
-1 |
1 |
hip_3 (back_leg) (髖部 3(後腿)) |
hinge (鉸鏈) |
torque (N m) (扭矩 (N m)) |
7 |
施加在後左腿兩個連桿之間的轉子上的扭矩 |
-1 |
1 |
angle_3 (back_leg) (角度 3(後腿)) |
hinge (鉸鏈) |
torque (N m) (扭矩 (N m)) |
Observation Space (觀測空間)¶
觀測空間由以下部分組成(依序)
qpos (預設為 13 個元素): 機器人身體部位的位置值。
qvel (14 個元素): 這些個別身體部位的速度(它們的導數)。
cfrc_ext (78 個元素): 這是基於質心的身體部位上的外力。 它的形狀為 13 * 6 (nbody * 6),因此在狀態空間中增加了另外 78 個元素。 (外力 - 力 x、y、z 和扭矩 x、y、z)
預設情況下,觀測不包括軀幹的 x 和 y 坐標。 這些可以通過在建構期間傳遞 exclude_current_positions_from_observation=False
來包含在內。 在這種情況下,觀測空間將是一個 Box(-Inf, Inf, (107,), float64)
,其中前兩個觀測是軀幹的 x 和 y 坐標。 無論 exclude_current_positions_from_observation
設定為 True
還是 False
,x 和 y 坐標都會在 info
中返回,鍵分別為 "x_position"
和 "y_position"
。
但是,預設情況下,觀測空間是一個 Box(-Inf, Inf, (105,), float64)
,其中位置和速度元素如下
Num (編號) |
Observation (觀測) |
Min (最小值) |
Max (最大值) |
Name (in corresponding XML file) (名稱(在對應的 XML 檔案中)) |
Joint (關節) |
Type (Unit) (類型(單位)) |
---|---|---|---|---|---|---|
0 |
軀幹(中心)的 z 坐標 |
-Inf |
Inf |
root (根) |
free (自由) |
position (m) (位置 (m)) |
1 |
軀幹(中心)的 w 方向 |
-Inf |
Inf |
root (根) |
free (自由) |
angle (rad) (角度 (rad)) |
2 |
軀幹(中心)的 x 方向 |
-Inf |
Inf |
root (根) |
free (自由) |
angle (rad) (角度 (rad)) |
3 |
軀幹(中心)的 y 方向 |
-Inf |
Inf |
root (根) |
free (自由) |
angle (rad) (角度 (rad)) |
4 |
軀幹(中心)的 z 方向 |
-Inf |
Inf |
root (根) |
free (自由) |
angle (rad) (角度 (rad)) |
5 |
軀幹與前左側第一個連桿之間的角度 |
-Inf |
Inf |
hip_1 (front_left_leg) (髖部 1(前左腿)) |
hinge (鉸鏈) |
angle (rad) (角度 (rad)) |
6 |
前左側兩個連桿之間的角度 |
-Inf |
Inf |
ankle_1 (front_left_leg) (腳踝 1(前左腿)) |
hinge (鉸鏈) |
angle (rad) (角度 (rad)) |
7 |
軀幹與前右側第一個連桿之間的角度 |
-Inf |
Inf |
hip_2 (front_right_leg) (髖部 2(前右腿)) |
hinge (鉸鏈) |
angle (rad) (角度 (rad)) |
8 |
前右側兩個連桿之間的角度 |
-Inf |
Inf |
ankle_2 (front_right_leg) (腳踝 2(前右腿)) |
hinge (鉸鏈) |
angle (rad) (角度 (rad)) |
9 |
軀幹與後左側第一個連桿之間的角度 |
-Inf |
Inf |
hip_3 (back_leg) (髖部 3(後腿)) |
hinge (鉸鏈) |
angle (rad) (角度 (rad)) |
10 |
後左側兩個連桿之間的角度 |
-Inf |
Inf |
ankle_3 (back_leg) (腳踝 3(後腿)) |
hinge (鉸鏈) |
angle (rad) (角度 (rad)) |
11 |
軀幹與後右側第一個連桿之間的角度 |
-Inf |
Inf |
hip_4 (right_back_leg) (髖部 4(右後腿)) |
hinge (鉸鏈) |
angle (rad) (角度 (rad)) |
12 |
後右側兩個連桿之間的角度 |
-Inf |
Inf |
ankle_4 (right_back_leg) (腳踝 4(右後腿)) |
hinge (鉸鏈) |
angle (rad) (角度 (rad)) |
13 |
軀幹的 x 坐標速度 |
-Inf |
Inf |
root (根) |
free (自由) |
velocity (m/s) (速度 (m/s)) |
14 |
軀幹的 y 坐標速度 |
-Inf |
Inf |
root (根) |
free (自由) |
velocity (m/s) (速度 (m/s)) |
15 |
軀幹的 z 坐標速度 |
-Inf |
Inf |
root (根) |
free (自由) |
velocity (m/s) (速度 (m/s)) |
16 |
軀幹的 x 坐標角速度 |
-Inf |
Inf |
root (根) |
free (自由) |
angular velocity (rad/s) (角速度 (rad/s)) |
17 |
軀幹的 y 坐標角速度 |
-Inf |
Inf |
root (根) |
free (自由) |
angular velocity (rad/s) (角速度 (rad/s)) |
18 |
軀幹的 z 坐標角速度 |
-Inf |
Inf |
root (根) |
free (自由) |
angular velocity (rad/s) (角速度 (rad/s)) |
19 |
軀幹與前左連桿之間的角度的角速度 |
-Inf |
Inf |
hip_1 (front_left_leg) (髖部 1(前左腿)) |
hinge (鉸鏈) |
angle (rad) (角度 (rad)) |
20 |
前左連桿之間角度的角速度 |
-Inf |
Inf |
ankle_1 (front_left_leg) (腳踝 1(前左腿)) |
hinge (鉸鏈) |
angle (rad) (角度 (rad)) |
21 |
軀幹與前右連桿之間的角度的角速度 |
-Inf |
Inf |
hip_2 (front_right_leg) (髖部 2(前右腿)) |
hinge (鉸鏈) |
angle (rad) (角度 (rad)) |
22 |
前右連桿之間角度的角速度 |
-Inf |
Inf |
ankle_2 (front_right_leg) (腳踝 2(前右腿)) |
hinge (鉸鏈) |
angle (rad) (角度 (rad)) |
23 |
軀幹與後左連桿之間的角度的角速度 |
-Inf |
Inf |
hip_3 (back_leg) (髖部 3(後腿)) |
hinge (鉸鏈) |
angle (rad) (角度 (rad)) |
24 |
後左連桿之間角度的角速度 |
-Inf |
Inf |
ankle_3 (back_leg) (腳踝 3(後腿)) |
hinge (鉸鏈) |
angle (rad) (角度 (rad)) |
25 |
軀幹與後右連桿之間的角度的角速度 |
-Inf |
Inf |
hip_4 (right_back_leg) (髖部 4(右後腿)) |
hinge (鉸鏈) |
angle (rad) (角度 (rad)) |
26 |
後右連桿之間角度的角速度 |
-Inf |
Inf |
ankle_4 (right_back_leg) (腳踝 4(右後腿)) |
hinge (鉸鏈) |
angle (rad) (角度 (rad)) |
excluded (排除) |
軀幹(中心)的 x 坐標 |
-Inf |
Inf |
root (根) |
free (自由) |
position (m) (位置 (m)) |
excluded (排除) |
軀幹(中心)的 y 坐標 |
-Inf |
Inf |
root (根) |
free (自由) |
position (m) (位置 (m)) |
身體部位是
body part (身體部位) |
id (for |
id (for |
---|---|---|
worldbody (注意:所有值都是常數 0) |
0 |
excluded (排除) |
torso (軀幹) |
1 |
0 |
front_left_leg (前左腿) |
2 |
1 |
aux_1 (front left leg) (輔助 1(前左腿)) |
3 |
2 |
ankle_1 (front left leg) (腳踝 1(前左腿)) |
4 |
3 |
front_right_leg (前右腿) |
5 |
4 |
aux_2 (front right leg) (輔助 2(前右腿)) |
6 |
5 |
ankle_2 (front right leg) (腳踝 2(前右腿)) |
7 |
6 |
back_leg (back left leg) (後腿(後左腿)) |
8 |
7 |
aux_3 (back left leg) (輔助 3(後左腿)) |
9 |
8 |
ankle_3 (back left leg) (腳踝 3(後左腿)) |
10 |
9 |
right_back_leg (右後腿) |
11 |
10 |
aux_4 (back right leg) (輔助 4(後右腿)) |
12 |
11 |
ankle_4 (back right leg) (腳踝 4(後右腿)) |
13 |
12 |
(x,y,z) 坐標是平移自由度,而方向是旋轉自由度,表示為四元數。 可以在MuJoCo 文件中閱讀更多關於自由關節的資訊。
注意: 使用 Ant-v3 或更早版本時,已報告在使用 mujoco-py
版本 > 2.0 時出現問題,導致接觸力始終為 0。 因此,建議在使用 Ant 環境時使用 mujoco-py
版本 < 2.0,如果您想報告包含接觸力的結果(如果您的實驗中未使用接觸力,則可以使用版本 > 2.0)。
Rewards (獎勵)¶
總獎勵為reward = healthy_reward + forward_reward - ctrl_cost - contact_cost。
healthy_reward:螞蟻健康的每個時間步(請參閱“Episode End”部分中的定義),它都會獲得固定值
healthy_reward
的獎勵(預設為 \(1\))。forward_reward:向前移動的獎勵,如果螞蟻向前移動(在正 \(x\) 方向 / 向右方向),則此獎勵將為正值。 \(w_{forward} \times \frac{dx}{dt}\),其中 \(dx\) 是
main_body
的位移(\(x_{after-action} - x_{before-action}\)),\(dt\) 是動作之間的時間,這取決於frame_skip
參數(預設為 \(5\))和frametime
,即 \(0.01\) - 因此預設值為 \(dt = 5 \times 0.01 = 0.05\),\(w_{forward}\) 是forward_reward_weight
(預設為 \(1\))。ctrl_cost:負獎勵,用於懲罰螞蟻採取過大的動作。 \(w_{control} \times \|action\|_2^2\),其中 \(w_{control}\) 是
ctrl_cost_weight
(預設為 \(0.5\))。contact_cost:負獎勵,如果外部接觸力太大,則懲罰螞蟻。 \(w_{contact} \times \|F_{contact}\|_2^2\),其中 \(w_{contact}\) 是
contact_cost_weight
(預設為 \(5\times10^{-4}\)),\(F_{contact}\) 是由contact_force_range
裁剪的外部接觸力(請參閱“Observation Space”上的cfrc_ext
部分)。
info
包含個別的獎勵項。
但是,如果在 v4
上 use_contact_forces=False
,則返回的總獎勵為reward = healthy_reward + forward_reward - ctrl_cost。
Starting State (起始狀態)¶
初始位置狀態為 \([0.0, 0.0, 0.75, 1.0, 0.0, ... 0.0] + \mathcal{U}_{[-reset\_noise\_scale \times I_{15}, reset\_noise\_scale \times I_{15}]}\)。 初始速度狀態為 \(\mathcal{N}(0_{14}, reset\_noise\_scale^2 \times I_{14})\)。
其中 \(\mathcal{N}\) 是多元常態分佈,\(\mathcal{U}\) 是多元均勻連續分佈。
請注意,z 和 x 坐標是非零的,因此螞蟻可以立即站起來並面向前方(x 軸)。
Episode End (回合結束)¶
Termination (終止)¶
如果 terminate_when_unhealthy is True
(預設值),則當螞蟻不健康時,環境將終止。 如果發生以下任何一種情況,則螞蟻是不健康的
任何狀態空間值不再是有限的。
軀幹(高度)的 z 坐標不在由
healthy_z_range
參數給出的閉區間內(預設值為 \([0.2, 1.0]\))。
Truncation (截斷)¶
回合的預設持續時間為 1000 個時間步。
Arguments (參數)¶
Ant (螞蟻) 提供了各種參數來修改觀測空間、獎勵函數、初始狀態和終止條件。 這些參數可以在 gymnasium.make
中以以下方式應用
import gymnasium as gym
env = gym.make('Ant-v5', ctrl_cost_weight=0.5, ...)
Parameter (參數) |
Type (類型) |
Default (預設) |
Description (描述) |
---|---|---|---|
|
str |
|
MuJoCo 模型的路徑 |
|
float |
|
forward_reward 項的權重(請參閱 |
|
float |
|
ctrl_cost 項的權重(請參閱 |
|
float |
|
contact_cost 項的權重(請參閱 |
|
float |
|
healthy_reward 項的權重(請參閱 |
|
str|int |
|
用於計算 dx/forward_reward 的身體的名稱或 ID(適用於自訂 MuJoCo 模型)(請參閱 |
|
bool |
|
如果 |
|
tuple |
|
如果軀幹的 z 坐標在此範圍內,則螞蟻被認為是健康的(請參閱 |
|
tuple |
|
在 contact_cost 的計算中,接觸力被裁剪到此範圍(請參閱 |
|
float |
|
初始位置和速度的隨機擾動的比例(請參閱 |
|
bool |
|
是否從觀測中省略 x 和 y 坐標。 排除位置可以作為歸納偏見,以誘導策略中與位置無關的行為(請參閱 |
|
bool |
|
是否在觀測中包含 cfrc_ext 元素(請參閱 |
|
bool |
|
如果 |
Version History (版本歷史)¶
v5
最低
mujoco
版本現在為 2.3.3。增加了對使用
xml_file
參數的完全自訂/第三方mujoco
模型的支援(以前只能對現有模型進行少量更改)。新增了
default_camera_config
參數,這是一個用於設定mj_camera
屬性的字典,主要用於自訂環境。新增了
env.observation_structure
,這是一個用於指定觀測空間組成的字典(例如qpos
、qvel
),對於為 MuJoCo 環境建立工具和封裝器非常有用。返回一個非空的
info
和reset()
,以前返回的是一個空字典,新鍵與step()
的狀態資訊相同。新增了
frame_skip
參數,用於配置dt
(step()
的持續時間),預設值因環境而異,請查看環境文件頁面。修復錯誤:
healthy_reward
在每個步驟都給出(即使螞蟻不健康),現在僅在螞蟻健康時才給出。info["reward_survive"]
已使用此更改進行更新(相關的 GitHub 問題)。獎勵函數現在始終包含
contact_cost
,之前僅在use_contact_forces=True
時才包含(可以使用contact_cost_weight=0
設定為0
)。從觀測空間中排除了
worldbody
的cfrc_ext
,因為它始終為 0,因此沒有向代理提供有用的資訊,從而實現了稍快的訓練(相關的 GitHub 問題)。新增了
main_body
參數,該參數指定用於計算向前獎勵的身體(主要用於自訂 MuJoCo 模型)。新增了
forward_reward_weight
參數,預設值為1
(實際上與v4
中的行為相同)。新增了
include_cfrc_ext_in_observation
參數,以前在v4
中,cfrc_ext
觀測的包含由use_contact_forces
控制,後者預設為False
,而include_cfrc_ext_in_observation
預設為True
。移除了
use_contact_forces
參數(注意:其功能已被include_cfrc_ext_in_observation
和contact_cost_weight
取代)(相關的 GitHub 問題)。修復了
info["reward_ctrl"]
有時包含contact_cost
而不是ctrl_cost
的問題。修復了
info["x_position"]
&info["y_position"]
&info["distance_from_origin"]
給出xpos
而不是qpos
觀測的問題(xpos
觀測落後 1 個mj_step()
更多資訊請參閱 這裡)(相關的 GitHub 問題 #1 & GitHub 問題 #2)。移除了
info["forward_reward"]
,因為它等效於info["reward_forward"]
。
v4:所有 MuJoCo 環境現在都使用 mujoco >= 2.1.3 中的 MuJoCo 綁定,也從預設觀測空間中移除了接觸力(新變數
use_contact_forces=True
可以恢復它們)。v3:支援
gymnasium.make
kwargs,例如xml_file
、ctrl_cost_weight
、reset_noise_scale
等。 rgb 渲染來自追蹤相機(因此代理不會從螢幕上跑掉)。v2:所有連續控制環境現在都使用 mujoco-py >= 1.50。
v1:機器人基礎任務的最大時間步數提高到 1000。 為環境新增了 reward_threshold。
v0:初始版本發佈