Views
No views yet
trunk_z = 0.18 m with random orientation (full quaternion sampled by reset_root_state_with_random_orientation)Z1_FOLDED_DEFAULT pose, sparse +10 success bonus when all three are satisfiedtrunk_z < 0.05 m (collapsed) or time-outstandup_success sparse bonus reaches 8.6 / episode (≈86 % of timesteps satisfy the success criterion)trunk_collapsed termination rate ≈ 0 — robot does not give up1trunk_height_reward weight +5.0 # clamp(z / 0.32, 0, 1)
2upright_alignment weight +3.0 # clamp(-projected_gravity_b[2], 0, 1)
3z1_fold weight +2.0 # exp(-||z1_pos - Z1_FOLDED_DEFAULT||)
4standup_success (sparse) weight +10.0 # 1 if z>0.28 ∧ upright>0.92 ∧ fold_err<0.3
5action_rate_l2 weight -0.005
6joint_acc_l2 weight -2.5e-7
7joint_torques_l2 weight -1e-5standup_v1.pt — rsl-rl OnPolicyRunner checkpoint1import torch, torch.nn as nn
2
3state = torch.load("standup_v1.pt", map_location="cuda:0", weights_only=False)
4sd = state["actor_state_dict"]
5h, obs_dim = sd["mlp.0.weight"].shape[0], sd["mlp.0.weight"].shape[1]
6act_dim = sd["mlp.6.weight"].shape[0] # 18 for full-body recovery
7actor = nn.Sequential(
8 nn.Linear(obs_dim, h), nn.ELU(),
9 nn.Linear(h, h), nn.ELU(),
10 nn.Linear(h, h), nn.ELU(),
11 nn.Linear(h, act_dim),
12).cuda().eval()
13actor.load_state_dict({k.replace("mlp.", ""): v for k, v in sd.items() if k.startswith("mlp.")})stage4_joint_eval/standup_recovery.py.Isaac-Standup-Go2Z1-v0 and lives at:go2_z1_warehouse/stage5_standup/standup_env_cfg.pygo2_z1_warehouse/stage5_standup/train_launcher.py1@misc{go2z1-standup-v1,
2 title = {Go2+Z1 Standup Recovery Policy (RL, full 18-DOF)},
3 author = {m3},
4 year = {2026},
5 url = {https://huggingface.co/m3/go2z1-standup-rl-v1}
6}