🎲 域随机化#
随机化物理和视觉属性以实现鲁棒的强化学习训练。
物理随机化#
在 scene.build() 之后应用:
import genesis as gs
import torch
scene.build(n_envs=64)
# 摩擦随机化
robot.set_friction_ratio(
friction_ratio=0.5 + torch.rand(scene.n_envs, robot.n_links),
links_idx_local=range(robot.n_links),
)
# 质量随机化
robot.set_mass_shift(
mass_shift=-0.5 + torch.rand(scene.n_envs, robot.n_links),
links_idx_local=range(robot.n_links),
)
# 质心随机化
robot.set_COM_shift(
com_shift=-0.05 + 0.1 * torch.rand(scene.n_envs, robot.n_links, 3),
links_idx_local=range(robot.n_links),
)
控制参数随机化#
import numpy as np
# 每环境的刚度 (Kp)
kp_values = 4000 + 1000 * np.random.rand(scene.n_envs, robot.n_dofs)
robot.set_dofs_kp(kp_values, motors_dof)
# 每环境的阻尼 (Kv)
kv_values = 400 + 100 * np.random.rand(scene.n_envs, robot.n_dofs)
robot.set_dofs_kv(kv_values, motors_dof)
物体位置随机化(每回合)#
def reset_idx(self, envs_idx):
num_reset = len(envs_idx)
# 随机物体位置
random_x = torch.rand(num_reset, device=gs.device) * 0.4 + 0.2
random_y = (torch.rand(num_reset, device=gs.device) - 0.5) * 0.5
random_z = torch.ones(num_reset, device=gs.device) * 0.025
random_pos = torch.stack([random_x, random_y, random_z], dim=-1)
self.object.set_pos(random_pos, envs_idx=envs_idx)
指令随机化#
def gs_rand(lower, upper, shape):
"""在 [lower, upper] 范围内的均匀随机"""
return (upper - lower) * torch.rand(shape, device=gs.device) + lower
# 随机化速度指令
commands = gs_rand(
lower=torch.tensor([-1.0, -0.5, -0.5]),
upper=torch.tensor([1.0, 0.5, 0.5]),
shape=(self.num_envs, 3),
)
可用方法#
方法 |
形状 |
描述 |
|---|---|---|
|
(n_envs, n_links) |
摩擦缩放 |
|
(n_envs, n_links) |
质量偏移 |
|
(n_envs, n_links, 3) |
质心偏移 |
|
(n_envs, n_dofs) |
位置增益 |
|
(n_envs, n_dofs) |
速度增益 |
|
(n_envs, n_dofs) |
电机惯量 |
所需选项#
为物理随机化启用批处理:
scene = gs.Scene(
rigid_options=gs.options.RigidOptions(
batch_dofs_info=True,
batch_links_info=True,
),
)
最佳实践#
在
scene.build()后应用一次物理 DR在每个回合重置时应用位置/指令 DR
使用
envs_idx参数进行选择性随机化确保张量形状匹配
(n_envs, ...)