fix knee action sign
This commit is contained in:
@@ -154,7 +154,7 @@ class WalkEnv(gym.Env):
|
||||
]
|
||||
)
|
||||
|
||||
self.scaling_factor = 0.3
|
||||
self.scaling_factor = 0.5
|
||||
# self.scaling_factor = 1
|
||||
|
||||
# Encourage a minimum lateral stance so the policy avoids feet overlap.
|
||||
@@ -221,6 +221,9 @@ class WalkEnv(gym.Env):
|
||||
self.reward_knee_explore_scale = 0.10
|
||||
self.reward_knee_explore_delta_scale = 0.12
|
||||
self.reward_knee_explore_cap = 0.55
|
||||
self.reward_hip_pitch_explore_scale = 0.14
|
||||
self.reward_hip_pitch_explore_delta_scale = 0.10
|
||||
self.reward_hip_pitch_explore_cap = 0.45
|
||||
|
||||
self.previous_action = np.zeros(len(self.Player.robot.ROBOT_MOTORS))
|
||||
self.last_action_for_reward = np.zeros(len(self.Player.robot.ROBOT_MOTORS))
|
||||
@@ -512,6 +515,9 @@ class WalkEnv(gym.Env):
|
||||
|
||||
left_ankle_roll = -float(joint_pos[16])
|
||||
right_ankle_roll = float(joint_pos[22])
|
||||
left_knee_flex = abs(float(joint_pos[14]))
|
||||
right_knee_flex = abs(float(joint_pos[20]))
|
||||
avg_knee_flex = 0.5 * (left_knee_flex + right_knee_flex)
|
||||
|
||||
max_leg_roll = 1 # 防止劈叉姿势
|
||||
split_penalty = -0.6 * max(0.0, (left_hip_roll + right_hip_roll - 2 * max_leg_roll) / max_leg_roll)
|
||||
@@ -532,14 +538,14 @@ class WalkEnv(gym.Env):
|
||||
ankle_roll_cross_penalty = -0.2 * max(0.0, -(left_ankle_roll * right_ankle_roll))
|
||||
|
||||
# 分别惩罚左右大腿过度转动
|
||||
max_hip_yaw = 1 # 最大允许的yaw角度
|
||||
max_hip_yaw = 0.5 # 最大允许的yaw角度
|
||||
left_hip_yaw_penalty = -0.25 * max(0.0, abs(left_hip_yaw) - max_hip_yaw)
|
||||
right_hip_yaw_penalty = -0.25 * max(0.0, abs(right_hip_yaw) - max_hip_yaw)
|
||||
|
||||
# Forward-progress reward (distance delta) with anti-stuck shaping.
|
||||
progress_reward = 18.0 * dist_delta
|
||||
survival_reward = 0.03
|
||||
smoothness_penalty = -0.025 * float(np.linalg.norm(action - self.last_action_for_reward))
|
||||
smoothness_penalty = -0.03 * float(np.linalg.norm(action - self.last_action_for_reward))
|
||||
step_displacement = float(np.linalg.norm(current_pos - previous_pos))
|
||||
if self.step_counter > 30 and step_displacement < 0.008 and self.target_distance_wp > 0.3:
|
||||
idle_penalty = -0.20
|
||||
@@ -547,8 +553,8 @@ class WalkEnv(gym.Env):
|
||||
idle_penalty = 0.0
|
||||
|
||||
# Encourage active/varied knee motions early in training without dominating progress reward.
|
||||
left_knee_act = -float(action[14])
|
||||
right_knee_act = float(action[20])
|
||||
left_knee_act = float(action[14])
|
||||
right_knee_act = -float(action[20])
|
||||
left_knee_delta = abs(left_knee_act - float(self.last_action_for_reward[14]))
|
||||
right_knee_delta = abs(right_knee_act - float(self.last_action_for_reward[20]))
|
||||
knee_action_mag = 0.5 * (abs(left_knee_act) + abs(right_knee_act))
|
||||
@@ -562,6 +568,29 @@ class WalkEnv(gym.Env):
|
||||
else:
|
||||
knee_explore_reward = 0.0
|
||||
|
||||
# Directly encourage observable knee flexion instead of only action exploration.
|
||||
knee_lift_ratio = min(1.0, avg_knee_flex / max(1e-6, self.reward_knee_lift_target))
|
||||
knee_lift_reward = self.reward_knee_lift_scale * knee_lift_ratio
|
||||
knee_lift_shortfall_penalty = -self.reward_knee_lift_shortfall_scale * max(
|
||||
0.0, self.reward_knee_lift_target - avg_knee_flex
|
||||
)
|
||||
|
||||
# Encourage hip-pitch exploration to improve forward stride generation.
|
||||
left_hip_pitch_act = float(action[11])
|
||||
right_hip_pitch_act = float(action[17])
|
||||
left_hip_pitch_delta = abs(left_hip_pitch_act - float(self.last_action_for_reward[11]))
|
||||
right_hip_pitch_delta = abs(right_hip_pitch_act - float(self.last_action_for_reward[17]))
|
||||
hip_pitch_action_mag = 0.5 * (abs(left_hip_pitch_act) + abs(right_hip_pitch_act))
|
||||
hip_pitch_action_delta = 0.5 * (left_hip_pitch_delta + right_hip_pitch_delta)
|
||||
if self.step_counter > 10:
|
||||
hip_pitch_explore_reward = min(
|
||||
self.reward_hip_pitch_explore_cap,
|
||||
self.reward_hip_pitch_explore_scale * hip_pitch_action_mag
|
||||
+ self.reward_hip_pitch_explore_delta_scale * hip_pitch_action_delta,
|
||||
)
|
||||
else:
|
||||
hip_pitch_explore_reward = 0.0
|
||||
|
||||
if curr_dist_to_target < 0.3:
|
||||
arrival_bonus = self.target_distance_wp * 8 ## 奖励到达目标点
|
||||
else:
|
||||
@@ -579,6 +608,9 @@ class WalkEnv(gym.Env):
|
||||
+ left_hip_yaw_penalty
|
||||
+ right_hip_yaw_penalty
|
||||
+ knee_explore_reward
|
||||
# + knee_lift_reward
|
||||
# + knee_lift_shortfall_penalty
|
||||
+ hip_pitch_explore_reward
|
||||
+ arrival_bonus
|
||||
)
|
||||
|
||||
@@ -600,7 +632,10 @@ class WalkEnv(gym.Env):
|
||||
f"ankle_roll_cross_penalty:{ankle_roll_cross_penalty:.4f},"
|
||||
f"left_hip_yaw_penalty:{left_hip_yaw_penalty:.4f},"
|
||||
f"right_hip_yaw_penalty:{right_hip_yaw_penalty:.4f},"
|
||||
f"knee_explore_reward:{knee_explore_reward:.4f},"
|
||||
# f"knee_explore_reward:{knee_explore_reward:.4f},"
|
||||
# f"knee_lift_reward:{knee_lift_reward:.4f},"
|
||||
f"knee_lift_shortfall_penalty:{knee_lift_shortfall_penalty:.4f},"
|
||||
f"hip_pitch_explore_reward:{hip_pitch_explore_reward:.4f},"
|
||||
f"arrival_bonus:{arrival_bonus:.4f},"
|
||||
f"total:{total:.4f}"
|
||||
)
|
||||
@@ -615,11 +650,19 @@ class WalkEnv(gym.Env):
|
||||
if self.previous_action is not None:
|
||||
action = np.clip(action, self.previous_action - max_action_delta, self.previous_action + max_action_delta)
|
||||
# Loosen upper-body constraints: keep motion bounded but no longer hard-lock head/arms/waist.
|
||||
action[0:2] = np.clip(action[0:2], -2.0, 2.0)
|
||||
action[2:10] = np.clip(action[2:10], -7.0, 7.0)
|
||||
action[10] = np.clip(action[10], -3.0, 3.0)
|
||||
action[11] = np.clip(action[11], -6, 6)
|
||||
action[17] = np.clip(action[17], -6, 6)
|
||||
action[0:2] = 0
|
||||
action[3] = np.clip(action[3], 3, 5)
|
||||
action[7] = np.clip(action[7], -5, -3)
|
||||
action[2] = np.clip(action[2], -6, 6)
|
||||
action[6] = np.clip(action[6], -6, 6)
|
||||
action[4] = 0
|
||||
action[5] = np.clip(action[5], -8, -2)
|
||||
action[8] = 0
|
||||
action[9] = np.clip(action[9], 8, 2)
|
||||
action[10] = np.clip(action[10], -0.6, 0.6)
|
||||
# Boost knee command range so policy can produce visible knee flexion earlier.
|
||||
# action[14] = np.clip(action[14] * 1.1, -10.0, 10.0)
|
||||
# action[20] = np.clip(action[20] * 1.1, -10.0, 10.0)
|
||||
# action[11] = 1
|
||||
# action[17] = 1
|
||||
# action[12] = -0.01
|
||||
@@ -694,7 +737,7 @@ class Train(Train_Base):
|
||||
minibatch_size = 512 # should be a factor of (n_steps_per_env * n_envs)
|
||||
total_steps = 30000000
|
||||
learning_rate = 2e-4
|
||||
ent_coef = 0.08
|
||||
ent_coef = 0.035
|
||||
clip_range = 0.2
|
||||
gamma = 0.97
|
||||
n_epochs = 3
|
||||
|
||||
Reference in New Issue
Block a user