Add closed-loop DreamWaQ stair validation
This commit is contained in:
@@ -1,7 +1,8 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Generate box-geom stairs XML for MuJoCo sim2sim.
|
||||
"""Generate symmetric box-geom stairs XML for MuJoCo sim2sim.
|
||||
|
||||
Each step is a separate box with vertical rises — much steeper than hfield.
|
||||
The course is a flat approach, ascending stairs, a top platform, and matching
|
||||
descending stairs. Each tread is a solid box rising from the ground.
|
||||
|
||||
Usage:
|
||||
uv run scripts/gen_stairs_box.py # default: 10 steps × 6cm = 60cm
|
||||
@@ -31,15 +32,12 @@ TPL = '''<mujoco model="go1 box stairs scene">
|
||||
material="motphys-ground" contype="1" conaffinity="0" priority="0" friction="0.6" />
|
||||
|
||||
{steps}
|
||||
|
||||
<!-- Fill under stairs -->
|
||||
<geom name="fill" type="box" size="{fill_sx} 10 {fill_sz}" pos="{fill_x} 0 {fill_z}" rgba="0.5 0.4 0.3 1" friction="0.8 0.3 0.3"/>
|
||||
</worldbody>
|
||||
</mujoco>
|
||||
'''
|
||||
|
||||
STEP_TPL = ' <geom name="step{n}" type="box" size="{sx} 10 {sz}" pos="{x} 0 {z}" rgba="0.6 0.5 0.4 1" friction="0.8 0.3 0.3"/>\n'
|
||||
PLAT_TPL = ' <geom name="platform" type="box" size="{sx} 10 {sz}" pos="{x} 0 {z}" rgba="0.6 0.5 0.4 1" friction="0.8 0.3 0.3"/>\n'
|
||||
STEP_TPL = ' <geom name="{name}" type="box" size="{sx:.6g} 10 {sz:.6g}" pos="{x:.6g} 0 {z:.6g}" rgba="0.6 0.5 0.4 1" friction="0.8 0.3 0.3"/>\n'
|
||||
PLAT_TPL = ' <geom name="platform" type="box" size="{sx:.6g} 10 {sz:.6g}" pos="{x:.6g} 0 {z:.6g}" rgba="0.6 0.5 0.4 1" friction="0.8 0.3 0.3"/>\n'
|
||||
|
||||
|
||||
def main():
|
||||
@@ -47,36 +45,41 @@ def main():
|
||||
p.add_argument("--step-height", type=float, default=0.06, help="rise per step [m]")
|
||||
p.add_argument("--step-depth", type=float, default=0.30, help="tread depth per step [m]")
|
||||
p.add_argument("--num-steps", type=int, default=10, help="number of steps")
|
||||
p.add_argument("--box-thickness", type=float, default=0.03, help="box half-height [m]")
|
||||
p.add_argument("--platform-depth", type=float, default=1.0, help="top platform depth [m]")
|
||||
args = p.parse_args()
|
||||
|
||||
h = args.step_height
|
||||
d = args.step_depth
|
||||
n = args.num_steps
|
||||
sz = args.box_thickness # half-height of each box
|
||||
platform_depth = args.platform_depth
|
||||
|
||||
steps_xml = ""
|
||||
for i in range(n):
|
||||
x = i * d
|
||||
z = i * h + sz # center of box = step top surface - sz
|
||||
steps_xml += STEP_TPL.format(n=i, sx=d/2, sz=sz, x=x, z=z)
|
||||
top = (i + 1) * h
|
||||
steps_xml += STEP_TPL.format(
|
||||
name=f"step_up_{i}", sx=d / 2, sz=top / 2,
|
||||
x=(i + 0.5) * d, z=top / 2,
|
||||
)
|
||||
|
||||
# Platform at top
|
||||
plat_x = n * d + 0.5
|
||||
plat_z = n * h + sz
|
||||
steps_xml += PLAT_TPL.format(sx=0.5, sz=sz, x=plat_x, z=plat_z)
|
||||
|
||||
# Fill box under stairs
|
||||
total_depth = n * d
|
||||
total_height = n * h
|
||||
fill_sx = total_depth / 2
|
||||
fill_sz = total_height / 2
|
||||
fill_x = total_depth / 2
|
||||
fill_z = -fill_sz
|
||||
platform_start = n * d
|
||||
platform_end = platform_start + platform_depth
|
||||
steps_xml += PLAT_TPL.format(
|
||||
sx=platform_depth / 2, sz=total_height / 2,
|
||||
x=platform_start + platform_depth / 2, z=total_height / 2,
|
||||
)
|
||||
|
||||
out = TPL.format(steps=steps_xml.rstrip(),
|
||||
fill_sx=fill_sx, fill_sz=fill_sz,
|
||||
fill_x=fill_x, fill_z=fill_z)
|
||||
for i in range(n):
|
||||
top = (n - i - 1) * h
|
||||
if top <= 0:
|
||||
continue
|
||||
steps_xml += STEP_TPL.format(
|
||||
name=f"step_down_{i}", sx=d / 2, sz=top / 2,
|
||||
x=platform_end + (i + 0.5) * d, z=top / 2,
|
||||
)
|
||||
|
||||
out = TPL.format(steps=steps_xml.rstrip())
|
||||
|
||||
out_dir = os.path.join(os.path.dirname(__file__), "..",
|
||||
"motrix_envs", "src", "motrix_envs", "locomotion",
|
||||
@@ -86,8 +89,10 @@ def main():
|
||||
f.write(out)
|
||||
|
||||
max_h = n * h
|
||||
print(f"Generated {n} steps × {h*100:.0f}cm = {max_h*100:.0f}cm total")
|
||||
print(f" step depth: {d*100:.0f}cm box thickness: {sz*200:.0f}cm")
|
||||
finish_x = platform_end + n * d
|
||||
print(f"Generated {n} steps up/down x {h*100:.0f}cm = {max_h*100:.0f}cm total")
|
||||
print(f" step depth: {d*100:.0f}cm platform: {platform_depth:.2f}m")
|
||||
print(f" course: x=0.00m to x={finish_x:.2f}m")
|
||||
print(f" saved: {out_path}")
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user