diff --git a/deploy/deploy_mujoco/deploy_go2.py b/deploy/deploy_mujoco/deploy_go2.py
index 38d4ed8..dfd1fdb 100644
--- a/deploy/deploy_mujoco/deploy_go2.py
+++ b/deploy/deploy_mujoco/deploy_go2.py
@@ -27,6 +27,15 @@ def get_gravity_orientation(quaternion):
return gravity_orientation
+def quat_rotate_inverse(q, v):
+ q = np.array(q, np.float32)
+ v = np.array(v, np.float32)
+ q_w = q[0]
+ q_vec = q[1:]
+ a = v * (2.0 * q_w ** 2 - 1.0)
+ b = np.cross(q_vec, v) * q_w * 2.0
+ c = q_vec * np.dot(q_vec, v) * 2.0
+ return a - b + c
def pd_control(target_q, q, kp, target_dq, dq, kd):
"""Calculates torques from position commands"""
@@ -162,11 +171,17 @@ if __name__ == "__main__":
# Close the viewer automatically after simulation_duration wall-seconds.
start = time.time()
while viewer.is_running() and time.time() - start < simulation_duration:
+ vel = d.qvel[:3]
+ ang_vel = d.qvel[3:6]
+ local_vel = quat_rotate_inverse(d.qpos[3:7], vel)
+ local_ang_vel = quat_rotate_inverse(d.qpos[3:7], ang_vel)
+ show_str = f"Speed: Vx={local_vel[0]:.2f}, Vy={local_vel[1]:.2f}, Wz={local_ang_vel[2]:.2f}, "
step_start = time.time()
if use_joystick and counter % control_decimation == 0:
cmd = get_xbox_command(joystick, config["max_cmd"])
- print(f"Cmd: Vx={cmd[0]:.2f}, Vy={cmd[1]:.2f}, Wz={cmd[2]:.2f}", end='\r')
+ show_str += f"Cmd: Vx={cmd[0]:.2f}, Vy={cmd[1]:.2f}, Wz={cmd[2]:.2f}"
+ print(show_str, end='\r')
tau = pd_control(target_dof_pos, d.qpos[7:], kps, np.zeros_like(kds), d.qvel[6:], kds)
d.ctrl[:] = tau
diff --git a/deploy/deploy_mujoco/deploy_go2_moe.py b/deploy/deploy_mujoco/deploy_go2_moe.py
index 0f86541..78b9aed 100644
--- a/deploy/deploy_mujoco/deploy_go2_moe.py
+++ b/deploy/deploy_mujoco/deploy_go2_moe.py
@@ -243,7 +243,7 @@ if __name__ == "__main__":
# 处理 MoE 和 绘图
if isinstance(result, tuple):
- action, weights = result # moe
+ action, (weights, latent) = result # moe
action = action.detach().numpy().squeeze()[idx_model2mj]
weights = weights.detach().numpy().squeeze()
diff --git a/legged_gym/envs/base/legged_robot.py b/legged_gym/envs/base/legged_robot.py
index 429fdb5..5ffed46 100644
--- a/legged_gym/envs/base/legged_robot.py
+++ b/legged_gym/envs/base/legged_robot.py
@@ -1417,13 +1417,6 @@ class LeggedRobot(BaseTask):
# Penalize joint poses far away from default pose
return torch.sum(torch.abs(self.dof_pos - self.default_dof_pos), dim=1)
- def _reward_hip_to_default(self):
- hip_dof_names = ['FL_hip_joint', 'FR_hip_joint', 'RL_hip_joint', 'RR_hip_joint']
- hip_dof_indices = [0, 3, 6, 9]
- hip_pos = self.dof_pos[:, hip_dof_indices]
- default_hip_pos = self.default_dof_pos[:, hip_dof_indices]
- return torch.sum(torch.abs(hip_pos - default_hip_pos), dim=1)
-
def _reward_upright(self):
return (-1 - self.projected_gravity[:, 2]) / 2
diff --git a/legged_gym/envs/go2/go2_config.py b/legged_gym/envs/go2/go2_config.py
index d49478f..be7c85c 100644
--- a/legged_gym/envs/go2/go2_config.py
+++ b/legged_gym/envs/go2/go2_config.py
@@ -176,32 +176,6 @@ class GO2Cfg(LeggedRobotCfg):
}
min_legs_distance = 0.1 # min distance between legs to not be considered stumbling
class scales:
- # tracking_lin_vel = 1.0
- # tracking_ang_vel = 0.2
- # lin_vel_z = -10.0
- # base_height = -50.0
- # action_rate = -0.005
- # similar_to_default = -0.1
- # dof_power = -1e-3 # 能够明显抑制跳跃
- # dof_acc = -3e-7
-
- # tracking_lin_vel = 1.0
- # tracking_ang_vel = 0.5
- # lin_vel_z = -2.0
- # ang_vel_xy = -0.05
- # dof_acc = -2.5e-7
- # dof_power = -1e-3 # 能够明显抑制跳跃
- # # torques = -1e-4 # 无用会走着走着倒了
- # correct_base_height = -10.0
- # action_rate = -0.01
- # action_smoothness = -0.01
- # collision = -1.0
- # dof_pos_limits = -2.0
- # feet_regulation = -0.05
- # hip_to_default = -0.1
- # similar_to_default = -0.05
-
- # CTS reward
tracking_lin_vel = 1.0
tracking_ang_vel = 0.5
lin_vel_z = -2.0
@@ -215,11 +189,12 @@ class GO2Cfg(LeggedRobotCfg):
collision = -1.0
dof_pos_limits = -2.0
feet_regulation = -0.05
- # CTS奖励训出来双脚距离非常近, 真机效果很差, 但是sim2sim能上20cm楼梯, 尝试加入hip_to_default奖励或similar_to_default奖励
- hip_to_default = -0.05 # 在训练到y=1.5时, 双脚会明显碰撞, 为避免该问题提升hip, 效果更差, 还是保持0.05 (y最大也只到0.1了)
- # legs_distance = -1.5 # 奖励双脚距离, 避免CTS训练出来双脚距离过近, 尝试加入后robogauge flat验证效果变差, 删除
+ # CTS reward trains to have very close feet distance, real robot performance is poor, but sim2sim can climb 20cm stairs, try to add hip_to_default reward or similar_to_default reward
+ # training to y=1.5, font feet will collide noticeably, max y=1.0
+ hip_to_default = -0.05
+ # legs_distance = -1.5 # not good performance, avoid leg collision
# similar_to_default = -0.01
- # feet_contact_forces = -1.0 # 尝试加入但并没有起到任何效果, 删除
+ # feet_contact_forces = -1.0 # try to add but no effect, remove
turn_over_roll_threshold = math.pi / 4 # threshold on roll to use turn over rewards
class turn_over_scales:
@@ -238,7 +213,7 @@ class GO2CfgPPO(LeggedRobotCfgPPO):
class runner(LeggedRobotCfgPPO.runner):
run_name = ''
experiment_name = 'go2_ppo'
- max_iterations = 120000
+ max_iterations = 150000
save_interval = 500
class GO2CfgCTS(LeggedRobotCfgCTS):
@@ -246,7 +221,7 @@ class GO2CfgCTS(LeggedRobotCfgCTS):
num_steps_per_env = 24
run_name = ''
experiment_name = 'go2_cts'
- max_iterations = 120000
+ max_iterations = 150000
save_interval = 500
class policy(LeggedRobotCfgCTS.policy):
@@ -264,7 +239,7 @@ class GO2CfgMoECTS(LeggedRobotCfgMoECTS):
class runner(LeggedRobotCfgMoECTS.runner):
run_name = ''
experiment_name = 'go2_moe_cts'
- max_iterations = 120000
+ max_iterations = 150000
save_interval = 500
class GO2CfgMCPCTS(LeggedRobotCfgMCPCTS):
@@ -275,7 +250,7 @@ class GO2CfgMCPCTS(LeggedRobotCfgMCPCTS):
class runner(LeggedRobotCfgMCPCTS.runner):
run_name = ''
experiment_name = 'go2_mcp_cts'
- max_iterations = 120000
+ max_iterations = 150000
save_interval = 500
class GO2CfgACMoECTS(LeggedRobotCfgACMoECTS):
@@ -285,7 +260,7 @@ class GO2CfgACMoECTS(LeggedRobotCfgACMoECTS):
class runner(LeggedRobotCfgACMoECTS.runner):
run_name = ''
experiment_name = 'go2_ac_moe_cts'
- max_iterations = 120000
+ max_iterations = 150000
save_interval = 500
class GO2CfgDualMoECTS(LeggedRobotCfgDualMoECTS):
@@ -295,7 +270,7 @@ class GO2CfgDualMoECTS(LeggedRobotCfgDualMoECTS):
class runner(LeggedRobotCfgDualMoECTS.runner):
run_name = ''
experiment_name = 'go2_dual_moe_cts'
- max_iterations = 120000
+ max_iterations = 150000
save_interval = 500
class GO2CfgREMCTS(LeggedRobotCfgREMCTS):
@@ -305,5 +280,5 @@ class GO2CfgREMCTS(LeggedRobotCfgREMCTS):
class runner(LeggedRobotCfgREMCTS.runner):
run_name = ''
experiment_name = 'go2_rem_cts'
- max_iterations = 120000
+ max_iterations = 150000
save_interval = 500
diff --git a/legged_gym/envs/go2/go2_config_fast_flat_move.py b/legged_gym/envs/go2/go2_config_fast_flat_move.py
index a00ab8d..b16abae 100644
--- a/legged_gym/envs/go2/go2_config_fast_flat_move.py
+++ b/legged_gym/envs/go2/go2_config_fast_flat_move.py
@@ -117,7 +117,7 @@ class GO2Cfg(LeggedRobotCfg):
limit_ang_vel_at_zero_command_prob = 0.2 # probability of add limiting angular velocity commands when zero command is sampled
limit_vel_prob = 0.2 # probability of limiting linear velocity command
limit_vel_invert_when_continuous = True # invert the limit logic when using continuous sample limit velocity commands
- limit_vel = {"lin_vel_x": [-1, 1], "lin_vel_y": [-1, 1], "ang_vel_yaw": [-1, 0, 1]} # sample vel commands from min [-1] or zero [0] or max [1] range only
+ limit_vel = {"lin_vel_x": [-1, 1], "lin_vel_y": [0], "ang_vel_yaw": [-1, 0, 1]} # sample vel commands from min [-1] or zero [0] or max [1] range only
stop_heading_at_limit = True # stop heading updates when vel is limited
dynamic_resample_commands = True # sample commands with low bounds
command_range_curriculum = [ { # list for command range curriculums at specific training iterations
@@ -134,21 +134,21 @@ class GO2Cfg(LeggedRobotCfg):
'heading': [-1.57, 1.57], # min max [rad]
}, { # list for command range curriculums at specific training iterations
'iter': 20000, # training iteration at which the command ranges are updated
- 'lin_vel_x': [-3.5, 3.5], # min max [m/s]
+ 'lin_vel_x': [-2.0, 3.5], # min max [m/s]
'lin_vel_y': [-0.5, 0.5], # min max [m/s]
'ang_vel_yaw': [-1.0, 1.0], # min max [rad/s]
'heading': [-1.57, 1.57], # min max [rad]
}, { # list for command range curriculums at specific training iterations
'iter': 30000, # training iteration at which the command ranges are updated
- 'lin_vel_x': [-4.0, 4.0], # min max [m/s]
- 'lin_vel_y': [-0.0, 0.0], # min max [m/s]
- 'ang_vel_yaw': [-0.0, 0.0], # min max [rad/s]
+ 'lin_vel_x': [-2.0, 4.0], # min max [m/s]
+ 'lin_vel_y': [-0.5, 0.5], # min max [m/s]
+ 'ang_vel_yaw': [-1.0, 1.0], # min max [rad/s]
'heading': [-1.57, 1.57], # min max [rad]
}, { # list for command range curriculums at specific training iterations
'iter': 40000, # training iteration at which the command ranges are updated
- 'lin_vel_x': [-4.5, 4.5], # min max [m/s]
- 'lin_vel_y': [-0.0, 0.0], # min max [m/s]
- 'ang_vel_yaw': [-0.0, 0.0], # min max [rad/s]
+ 'lin_vel_x': [-2.0, 4.2], # min max [m/s]
+ 'lin_vel_y': [-0.5, 0.5], # min max [m/s]
+ 'ang_vel_yaw': [-1.0, 1.0], # min max [rad/s]
'heading': [-1.57, 1.57], # min max [rad]
}
]
@@ -185,10 +185,10 @@ class GO2Cfg(LeggedRobotCfg):
class rewards(LeggedRobotCfg.rewards):
soft_dof_pos_limit = 0.9
- base_height_target = 0.38
+ base_height_target = 0.33
only_positive_rewards = False
max_contact_force = 147. # forces above this value are penalized, go2 weight 15kg
- curriculum_rewards = [
+ curriculum_rewards = [ # reward scalars are linearly interpolated between start and end iters
{'reward_name': 'lin_vel_z', 'start_iter': 0, 'end_iter': 1500, 'start_value': 1.0, 'end_value': 0.0},
{'reward_name': 'correct_base_height', 'start_iter': 0, 'end_iter': 5000, 'start_value': 1.0, 'end_value': 10.0},
# {'reward_name': 'dof_power', 'start_iter': 0, 'end_iter': 3000, 'start_value': 1.0, 'end_value': 0.1},
@@ -206,33 +206,7 @@ class GO2Cfg(LeggedRobotCfg):
}
min_legs_distance = 0.1 # min distance between legs to not be considered stumbling
class scales:
- # tracking_lin_vel = 1.0
- # tracking_ang_vel = 0.2
- # lin_vel_z = -10.0
- # base_height = -50.0
- # action_rate = -0.005
- # similar_to_default = -0.1
- # dof_power = -1e-3 # 能够明显抑制跳跃
- # dof_acc = -3e-7
-
- # tracking_lin_vel = 1.0
- # tracking_ang_vel = 0.5
- # lin_vel_z = -2.0
- # ang_vel_xy = -0.05
- # dof_acc = -2.5e-7
- # dof_power = -1e-3 # 能够明显抑制跳跃
- # # torques = -1e-4 # 无用会走着走着倒了
- # correct_base_height = -10.0
- # action_rate = -0.01
- # action_smoothness = -0.01
- # collision = -1.0
- # dof_pos_limits = -2.0
- # feet_regulation = -0.05
- # hip_to_default = -0.1
- # similar_to_default = -0.05
-
- # CTS reward
- tracking_lin_vel = 1.0
+ tracking_lin_vel = 2.0 # Increase for faster running
tracking_ang_vel = 0.5
lin_vel_z = -2.0
ang_vel_xy = -0.05
@@ -245,11 +219,13 @@ class GO2Cfg(LeggedRobotCfg):
collision = -1.0
dof_pos_limits = -2.0
feet_regulation = -0.05
- # CTS奖励训出来双脚距离非常近, 真机效果很差, 但是sim2sim能上20cm楼梯, 尝试加入hip_to_default奖励或similar_to_default奖励
- hip_to_default = -0.05 # 在训练到y=1.5时, 双脚会明显碰撞, 为避免该问题提升hip, 效果更差, 还是保持0.05 (y最大也只到0.1了)
- # legs_distance = -1.5 # 奖励双脚距离, 避免CTS训练出来双脚距离过近, 尝试加入后robogauge flat验证效果变差, 删除
+ # CTS reward trains to have very close feet distance, real robot performance is poor, but sim2sim can climb 20cm stairs, try to add hip_to_default reward or similar_to_default reward
+ # training to y=1.5, font feet will collide noticeably, max y=1.0
+ hip_to_default = -0.05
+ # legs_distance = -1.5 # not good performance, avoid leg collision
# similar_to_default = -0.01
- # feet_contact_forces = -1.0 # 尝试加入但并没有起到任何效果, 删除
+ # feet_contact_forces = -1.0 # try to add but no effect, remove
+ x_command_hip_regular = -0.5 # when x command exists, encourage symmetrical hip positions
turn_over_roll_threshold = math.pi / 4 # threshold on roll to use turn over rewards
class turn_over_scales:
@@ -268,7 +244,7 @@ class GO2CfgPPO(LeggedRobotCfgPPO):
class runner(LeggedRobotCfgPPO.runner):
run_name = ''
experiment_name = 'go2_ppo'
- max_iterations = 120000
+ max_iterations = 150000
save_interval = 500
class GO2CfgCTS(LeggedRobotCfgCTS):
@@ -276,7 +252,7 @@ class GO2CfgCTS(LeggedRobotCfgCTS):
num_steps_per_env = 24
run_name = ''
experiment_name = 'go2_cts'
- max_iterations = 120000
+ max_iterations = 150000
save_interval = 500
class policy(LeggedRobotCfgCTS.policy):
@@ -294,7 +270,7 @@ class GO2CfgMoECTS(LeggedRobotCfgMoECTS):
class runner(LeggedRobotCfgMoECTS.runner):
run_name = ''
experiment_name = 'go2_moe_cts'
- max_iterations = 120000
+ max_iterations = 150000
save_interval = 500
class GO2CfgMCPCTS(LeggedRobotCfgMCPCTS):
@@ -305,7 +281,7 @@ class GO2CfgMCPCTS(LeggedRobotCfgMCPCTS):
class runner(LeggedRobotCfgMCPCTS.runner):
run_name = ''
experiment_name = 'go2_mcp_cts'
- max_iterations = 120000
+ max_iterations = 150000
save_interval = 500
class GO2CfgACMoECTS(LeggedRobotCfgACMoECTS):
@@ -315,7 +291,7 @@ class GO2CfgACMoECTS(LeggedRobotCfgACMoECTS):
class runner(LeggedRobotCfgACMoECTS.runner):
run_name = ''
experiment_name = 'go2_ac_moe_cts'
- max_iterations = 120000
+ max_iterations = 150000
save_interval = 500
class GO2CfgDualMoECTS(LeggedRobotCfgDualMoECTS):
@@ -325,7 +301,7 @@ class GO2CfgDualMoECTS(LeggedRobotCfgDualMoECTS):
class runner(LeggedRobotCfgDualMoECTS.runner):
run_name = ''
experiment_name = 'go2_dual_moe_cts'
- max_iterations = 120000
+ max_iterations = 150000
save_interval = 500
class GO2CfgREMCTS(LeggedRobotCfgREMCTS):
@@ -335,5 +311,5 @@ class GO2CfgREMCTS(LeggedRobotCfgREMCTS):
class runner(LeggedRobotCfgREMCTS.runner):
run_name = ''
experiment_name = 'go2_rem_cts'
- max_iterations = 120000
+ max_iterations = 150000
save_interval = 500
diff --git a/legged_gym/envs/go2/go2_config_vanilla.py b/legged_gym/envs/go2/go2_config_vanilla.py
index 606385e..5937541 100644
--- a/legged_gym/envs/go2/go2_config_vanilla.py
+++ b/legged_gym/envs/go2/go2_config_vanilla.py
@@ -191,32 +191,6 @@ class GO2Cfg(LeggedRobotCfg):
# }
min_legs_distance = 0.1 # min distance between legs to not be considered stumbling
class scales:
- # tracking_lin_vel = 1.0
- # tracking_ang_vel = 0.2
- # lin_vel_z = -10.0
- # base_height = -50.0
- # action_rate = -0.005
- # similar_to_default = -0.1
- # dof_power = -1e-3 # 能够明显抑制跳跃
- # dof_acc = -3e-7
-
- # tracking_lin_vel = 1.0
- # tracking_ang_vel = 0.5
- # lin_vel_z = -2.0
- # ang_vel_xy = -0.05
- # dof_acc = -2.5e-7
- # dof_power = -1e-3 # 能够明显抑制跳跃
- # # torques = -1e-4 # 无用会走着走着倒了
- # correct_base_height = -10.0
- # action_rate = -0.01
- # action_smoothness = -0.01
- # collision = -1.0
- # dof_pos_limits = -2.0
- # feet_regulation = -0.05
- # hip_to_default = -0.1
- # similar_to_default = -0.05
-
- # CTS reward
tracking_lin_vel = 1.0
tracking_ang_vel = 0.5
lin_vel_z = -2.0
@@ -230,11 +204,12 @@ class GO2Cfg(LeggedRobotCfg):
collision = -1.0
dof_pos_limits = -2.0
feet_regulation = -0.05
- # CTS奖励训出来双脚距离非常近, 真机效果很差, 但是sim2sim能上20cm楼梯, 尝试加入hip_to_default奖励或similar_to_default奖励
- hip_to_default = -0.05 # 在训练到y=1.5时, 双脚会明显碰撞, 为避免该问题提升hip, 效果更差, 还是保持0.05 (y最大也只到0.1了)
- # legs_distance = -1.5 # 奖励双脚距离, 避免CTS训练出来双脚距离过近, 尝试加入后robogauge flat验证效果变差, 删除
+ # CTS reward trains to have very close feet distance, real robot performance is poor, but sim2sim can climb 20cm stairs, try to add hip_to_default reward or similar_to_default reward
+ # training to y=1.5, font feet will collide noticeably, max y=1.0
+ hip_to_default = -0.05
+ # legs_distance = -1.5 # not good performance, avoid leg collision
# similar_to_default = -0.01
- # feet_contact_forces = -1.0 # 尝试加入但并没有起到任何效果, 删除
+ # feet_contact_forces = -1.0 # try to add but no effect, remove
turn_over_roll_threshold = math.pi / 4 # threshold on roll to use turn over rewards
class turn_over_scales:
@@ -253,7 +228,7 @@ class GO2CfgPPO(LeggedRobotCfgPPO):
class runner(LeggedRobotCfgPPO.runner):
run_name = ''
experiment_name = 'go2_ppo'
- max_iterations = 120000
+ max_iterations = 150000
save_interval = 500
class GO2CfgCTS(LeggedRobotCfgCTS):
@@ -261,7 +236,7 @@ class GO2CfgCTS(LeggedRobotCfgCTS):
num_steps_per_env = 24
run_name = ''
experiment_name = 'go2_cts'
- max_iterations = 120000
+ max_iterations = 150000
save_interval = 500
class policy(LeggedRobotCfgCTS.policy):
@@ -279,7 +254,7 @@ class GO2CfgMoECTS(LeggedRobotCfgMoECTS):
class runner(LeggedRobotCfgMoECTS.runner):
run_name = ''
experiment_name = 'go2_moe_cts'
- max_iterations = 120000
+ max_iterations = 150000
save_interval = 500
class GO2CfgMCPCTS(LeggedRobotCfgMCPCTS):
@@ -290,7 +265,7 @@ class GO2CfgMCPCTS(LeggedRobotCfgMCPCTS):
class runner(LeggedRobotCfgMCPCTS.runner):
run_name = ''
experiment_name = 'go2_mcp_cts'
- max_iterations = 120000
+ max_iterations = 150000
save_interval = 500
class GO2CfgACMoECTS(LeggedRobotCfgACMoECTS):
@@ -300,7 +275,7 @@ class GO2CfgACMoECTS(LeggedRobotCfgACMoECTS):
class runner(LeggedRobotCfgACMoECTS.runner):
run_name = ''
experiment_name = 'go2_ac_moe_cts'
- max_iterations = 120000
+ max_iterations = 150000
save_interval = 500
class GO2CfgDualMoECTS(LeggedRobotCfgDualMoECTS):
@@ -310,7 +285,7 @@ class GO2CfgDualMoECTS(LeggedRobotCfgDualMoECTS):
class runner(LeggedRobotCfgDualMoECTS.runner):
run_name = ''
experiment_name = 'go2_dual_moe_cts'
- max_iterations = 120000
+ max_iterations = 150000
save_interval = 500
class GO2CfgREMCTS(LeggedRobotCfgREMCTS):
@@ -320,5 +295,5 @@ class GO2CfgREMCTS(LeggedRobotCfgREMCTS):
class runner(LeggedRobotCfgREMCTS.runner):
run_name = ''
experiment_name = 'go2_rem_cts'
- max_iterations = 120000
+ max_iterations = 150000
save_interval = 500
diff --git a/legged_gym/envs/go2/go2_config_vanilla2.py b/legged_gym/envs/go2/go2_config_vanilla2.py
index c49d95a..0b38c12 100644
--- a/legged_gym/envs/go2/go2_config_vanilla2.py
+++ b/legged_gym/envs/go2/go2_config_vanilla2.py
@@ -191,32 +191,6 @@ class GO2Cfg(LeggedRobotCfg):
# }
min_legs_distance = 0.1 # min distance between legs to not be considered stumbling
class scales:
- # tracking_lin_vel = 1.0
- # tracking_ang_vel = 0.2
- # lin_vel_z = -10.0
- # base_height = -50.0
- # action_rate = -0.005
- # similar_to_default = -0.1
- # dof_power = -1e-3 # 能够明显抑制跳跃
- # dof_acc = -3e-7
-
- # tracking_lin_vel = 1.0
- # tracking_ang_vel = 0.5
- # lin_vel_z = -2.0
- # ang_vel_xy = -0.05
- # dof_acc = -2.5e-7
- # dof_power = -1e-3 # 能够明显抑制跳跃
- # # torques = -1e-4 # 无用会走着走着倒了
- # correct_base_height = -10.0
- # action_rate = -0.01
- # action_smoothness = -0.01
- # collision = -1.0
- # dof_pos_limits = -2.0
- # feet_regulation = -0.05
- # hip_to_default = -0.1
- # similar_to_default = -0.05
-
- # CTS reward
tracking_lin_vel = 1.0
tracking_ang_vel = 0.5
lin_vel_z = -2.0
@@ -230,11 +204,12 @@ class GO2Cfg(LeggedRobotCfg):
collision = -1.0
dof_pos_limits = -2.0
feet_regulation = -0.05
- # CTS奖励训出来双脚距离非常近, 真机效果很差, 但是sim2sim能上20cm楼梯, 尝试加入hip_to_default奖励或similar_to_default奖励
- hip_to_default = -0.05 # 在训练到y=1.5时, 双脚会明显碰撞, 为避免该问题提升hip, 效果更差, 还是保持0.05 (y最大也只到0.1了)
- # legs_distance = -1.5 # 奖励双脚距离, 避免CTS训练出来双脚距离过近, 尝试加入后robogauge flat验证效果变差, 删除
+ # CTS reward trains to have very close feet distance, real robot performance is poor, but sim2sim can climb 20cm stairs, try to add hip_to_default reward or similar_to_default reward
+ # training to y=1.5, font feet will collide noticeably, max y=1.0
+ hip_to_default = -0.05
+ # legs_distance = -1.5 # not good performance, avoid leg collision
# similar_to_default = -0.01
- # feet_contact_forces = -1.0 # 尝试加入但并没有起到任何效果, 删除
+ # feet_contact_forces = -1.0 # try to add but no effect, remove
turn_over_roll_threshold = math.pi / 4 # threshold on roll to use turn over rewards
class turn_over_scales:
@@ -253,7 +228,7 @@ class GO2CfgPPO(LeggedRobotCfgPPO):
class runner(LeggedRobotCfgPPO.runner):
run_name = ''
experiment_name = 'go2_ppo'
- max_iterations = 120000
+ max_iterations = 150000
save_interval = 500
class GO2CfgCTS(LeggedRobotCfgCTS):
@@ -261,7 +236,7 @@ class GO2CfgCTS(LeggedRobotCfgCTS):
num_steps_per_env = 24
run_name = ''
experiment_name = 'go2_cts'
- max_iterations = 120000
+ max_iterations = 150000
save_interval = 500
class policy(LeggedRobotCfgCTS.policy):
@@ -279,7 +254,7 @@ class GO2CfgMoECTS(LeggedRobotCfgMoECTS):
class runner(LeggedRobotCfgMoECTS.runner):
run_name = ''
experiment_name = 'go2_moe_cts'
- max_iterations = 120000
+ max_iterations = 150000
save_interval = 500
class GO2CfgMCPCTS(LeggedRobotCfgMCPCTS):
@@ -290,7 +265,7 @@ class GO2CfgMCPCTS(LeggedRobotCfgMCPCTS):
class runner(LeggedRobotCfgMCPCTS.runner):
run_name = ''
experiment_name = 'go2_mcp_cts'
- max_iterations = 120000
+ max_iterations = 150000
save_interval = 500
class GO2CfgACMoECTS(LeggedRobotCfgACMoECTS):
@@ -300,7 +275,7 @@ class GO2CfgACMoECTS(LeggedRobotCfgACMoECTS):
class runner(LeggedRobotCfgACMoECTS.runner):
run_name = ''
experiment_name = 'go2_ac_moe_cts'
- max_iterations = 120000
+ max_iterations = 150000
save_interval = 500
class GO2CfgDualMoECTS(LeggedRobotCfgDualMoECTS):
@@ -310,7 +285,7 @@ class GO2CfgDualMoECTS(LeggedRobotCfgDualMoECTS):
class runner(LeggedRobotCfgDualMoECTS.runner):
run_name = ''
experiment_name = 'go2_dual_moe_cts'
- max_iterations = 120000
+ max_iterations = 150000
save_interval = 500
class GO2CfgREMCTS(LeggedRobotCfgREMCTS):
@@ -320,5 +295,5 @@ class GO2CfgREMCTS(LeggedRobotCfgREMCTS):
class runner(LeggedRobotCfgREMCTS.runner):
run_name = ''
experiment_name = 'go2_rem_cts'
- max_iterations = 120000
+ max_iterations = 150000
save_interval = 500
diff --git a/legged_gym/envs/go2/go2_env.py b/legged_gym/envs/go2/go2_env.py
index 93e1694..ac0f5ee 100644
--- a/legged_gym/envs/go2/go2_env.py
+++ b/legged_gym/envs/go2/go2_env.py
@@ -50,4 +50,19 @@ class Go2Robot(LeggedRobot):
# print(f"acc: {self.privileged_obs_buf[:,48+4+12:48+4+12+12].min(), self.privileged_obs_buf[:,48+4+12:48+4+12+12].max()}")
if self.add_noise:
- self.obs_buf += (2 * torch.rand_like(self.obs_buf) - 1) * self.noise_scale_vec
\ No newline at end of file
+ self.obs_buf += (2 * torch.rand_like(self.obs_buf) - 1) * self.noise_scale_vec
+
+ def _reward_hip_to_default(self):
+ hip_dof_names = ['FL_hip_joint', 'FR_hip_joint', 'RL_hip_joint', 'RR_hip_joint']
+ hip_dof_indices = [0, 3, 6, 9]
+ hip_pos = self.dof_pos[:, hip_dof_indices]
+ default_hip_pos = self.default_dof_pos[:, hip_dof_indices]
+ return torch.sum(torch.abs(hip_pos - default_hip_pos), dim=1)
+
+ def _reward_x_command_hip_regular(self):
+ hip_dof_names = ['FL_hip_joint', 'FR_hip_joint', 'RL_hip_joint', 'RR_hip_joint']
+ hip_dof_indices = [0, 3, 6, 9]
+ hip_pos = self.dof_pos[:, hip_dof_indices]
+ x_command_ratio = torch.abs(self.commands[:,0]) / torch.norm(self.commands[:,:3], dim=1)
+ rew = torch.abs(hip_pos[:,0]+hip_pos[:,1]) + torch.abs(hip_pos[:,2]+hip_pos[:,3])
+ return rew * x_command_ratio
diff --git a/resources/robots/go2/race_track.xml b/resources/robots/go2/race_track.xml
index 3121011..6cdeacb 100644
--- a/resources/robots/go2/race_track.xml
+++ b/resources/robots/go2/race_track.xml
@@ -13,7 +13,7 @@
-
+
diff --git a/resources/robots/go2/terrain_generator.py b/resources/robots/go2/race_track_generator.py
similarity index 97%
rename from resources/robots/go2/terrain_generator.py
rename to resources/robots/go2/race_track_generator.py
index 2ce66cd..e84c22c 100644
--- a/resources/robots/go2/terrain_generator.py
+++ b/resources/robots/go2/race_track_generator.py
@@ -6,8 +6,8 @@ import noise
import os
ROBOT = "go2"
-INPUT_SCENE_PATH = os.path.join(os.path.dirname(__file__), "scene.xml")
-OUTPUT_SCENE_PATH = os.path.join(os.path.dirname(__file__), "scene_terrain.xml")
+INPUT_SCENE_PATH = os.path.join(os.path.dirname(__file__), "flat.xml")
+OUTPUT_SCENE_PATH = os.path.join(os.path.dirname(__file__), "race_track_tmp.xml")
PATH_DIR = Path(__file__).parent.absolute()
# zyx euler angle to quaternion
def euler_to_quat(roll, pitch, yaw):
@@ -114,7 +114,8 @@ class TerrainGenerator:
tex.attrib["name"] = "sponge_tex"
tex.attrib["type"] = "2d"
tex.attrib["builtin"] = "flat" # 使用内置平面纹理,不需要 file 路径
- tex.attrib["rgb1"] = "1.0 0.7 0.7" # 设置颜色:粉色 (参考图片颜色)
+ # tex.attrib["rgb1"] = "1.0 0.7 0.7" # 设置颜色:粉色 (参考图片颜色)
+ tex.attrib["rgb1"] = "0.90196 0.83922 0.56471" # 设置颜色:黄色
tex.attrib["width"] = "512"
tex.attrib["height"] = "512"
diff --git a/tools/logs_compress.py b/tools/logs_compress.py
index feffd6d..d4ac00a 100644
--- a/tools/logs_compress.py
+++ b/tools/logs_compress.py
@@ -1,12 +1,3 @@
-# -*- coding: utf-8 -*-
-'''
-@File : batch_compress.py
-@Time : 2026/01/09 17:49:54
-@Author : wty-yy, Gemini 3
-@Version : 1.0
-@Blog : https://wty-yy.github.io/
-@Desc : None
-'''
import os
import subprocess
from pathlib import Path
@@ -14,66 +5,53 @@ from pathlib import Path
def smart_compress(logs_root):
logs_path = Path(logs_root).resolve()
if not logs_path.exists():
- print(f"❌ 找不到目录: {logs_root}")
+ print(f"❌ Can't find directory: {logs_root}")
return
- # 遍历 logs 下的第一层子目录 (cts_vanilla, go2_moe_cts 等)
projects = [d for d in logs_path.iterdir() if d.is_dir()]
for project in projects:
project_name = project.name
- print(f"\n🚀 正在处理项目: {project_name}")
+ print(f"\n🚀 Processing project: {project_name}")
- # 1. 搜寻需要包含的内容
include_items = []
- # 检查是否存在 exported 文件夹
if (project / "exported").exists():
include_items.append("exported")
- # 搜寻所有包含 tfevents 的文件夹 (如 Jan04_15-55-59_)
- # 我们寻找 events 文件,然后取其父目录名(相对于项目根目录)
event_folders = set()
for event_file in project.rglob("events.out.tfevents*"):
- # 计算相对于项目根目录的路径
relative_folder = event_file.parent.relative_to(project)
event_folders.add(str(relative_folder))
include_items.extend(list(event_folders))
if not include_items:
- print(f"⚠️ 跳过 {project_name}: 未发现符合条件的训练数据或 exported 文件夹")
+ print(f"⚠️ Skipping {project_name}: No eligible training data or exported folder found")
continue
- # 2. 构造压缩命令
output_zst = logs_path / f"{project_name}.tar.zst"
- # 命令解释:
- # -C: 切换到项目所在目录,这样压缩包内的路径不会带一堆无用的父级前缀
- # --exclude='*.pt': 显式排除所有模型权重文件
- # -T0: zstd 开启全核并行
tar_cmd = [
"tar",
"-I", "zstd -T0 -3",
"-C", str(project),
"--exclude=*.pt",
- "--exclude=*.pth", # 预防万一有 .pth
+ "--exclude=*.pth",
"-cf", str(output_zst)
] + include_items
- print(f"📦 正在打包 (已排除 .pt 文件)...")
+ print(f"📦 Packaging (excluding .pt files and .pth files)...")
try:
- # 执行压缩
subprocess.run(tar_cmd, check=True)
- # 统计结果
final_size = output_zst.stat().st_size / (1024 * 1024)
- print(f"✅ 完成! 压缩包: {output_zst.name} ({final_size:.2f} MB)")
+ print(f"✅ Done! Archive: {output_zst.name} ({final_size:.2f} MB)")
except subprocess.CalledProcessError as e:
- print(f"❌ {project_name} 压缩失败: {e}")
+ print(f"❌ {project_name} Compression failed: {e}")
if __name__ == "__main__":
- # 执行目录
+ # Execution directory
TARGET_LOGS_DIR = "./logs"
smart_compress(TARGET_LOGS_DIR)