microduck-swing / manifest.json
HannesVonEssen's picture
Publish self-pumped swing policy
c4a2be7 verified
Raw
History Blame
3.87 kB
{
"schema_version": 3,
"model_api": 1,
"name": "microduck-swing",
"kind": "episodic",
"obs_len": 61,
"action_len": 14,
"action_scale": 0.7,
"entry_pose": "retained in swing seat at the bottom of the arc, motionless",
"duration_s": 36.0,
"status": "sim-only-hardware-candidate",
"description": "Self-pumped MicroDuck swing policy on two 380 mm elastic, tension-only cords.",
"observation": {
"layout": "base_ang_vel(3), projected_gravity(3), joint_pos(14), joint_vel(14), previous_actions(14), swing_plane_cue(3), zero_head(4), zero_body(6)",
"swing_plane_cue": "[0, body_y_axis_world.x, body_y_axis_world.z] from IMU orientation relative to the still-start frame",
"privileged_actor_inputs": false,
"normalizer_baked_into_onnx": true
},
"robot": {
"model": "microduck",
"hw_rev": 1,
"servos": "14x Dynamixel XL330",
"control_hz": 50,
"hardware_modifications_required": true
},
"mechanism": {
"cord_count": 2,
"cord_model": "independent elastic tension-only tendons",
"rest_length_m": 0.38,
"stiffness_n_m": 2000.0,
"simulation_limit_m": 0.395,
"anchor_height_m": 0.75,
"seat": "retained-seat generator and printable meshes in Vottivott/microduck-playground"
},
"training": {
"task_id": "Mjlab-SwingPump-MicroDuck",
"algorithm": "PPO (rsl_rl)",
"repo": "Vottivott/microduck-playground",
"source_commit": "5eec677cbf0e092523ee9b33bda57e81b9115817",
"upstream_base": "pollen-robotics/microduck_rl@1e79c29c97d8b38aee9eefde77a545860ba7658e",
"selection": "alpha 0.50 interpolation of all final actor-layer rows between frontier_source_3500.pt and planar_target_3600.pt",
"selected_checkpoint_sha256": "bd10d6b38eaa193dbde589cb9b51259b7469d3eef247cc9cbc121444a16ea2eb",
"source_checkpoint_sha256": "70e1e82b45b46a62c57943c1c528e26e724902fef76d1c2aa53b3256f2c08b04",
"target_checkpoint_sha256": "9c80750ad567c19d5183ada5bb98742a86798313a352ce37e36823a2d44be114",
"export": "scripts/export.py; observation normalizer baked into policy.onnx"
},
"eval": {
"sim_proxy": "mjlab / MuJoCo Warp with BAM XL330 M6 actuator model",
"seeds": 100,
"duration_s": 36.0,
"control_dt_s": 0.02,
"strict_full_horizon_passes": 71,
"geometry_debt_free_passes": 73,
"median_peak_to_peak_deg": 163.0279718838097,
"median_final_six_half_cycle_peak_to_peak_deg": 161.08761759344662,
"best_strict_seed": 27,
"best_strict_peak_to_peak_deg": 173.19988233166998,
"best_strict_final_six_half_cycle_peak_to_peak_deg": 171.67248924707994,
"best_strict_max_lateral_m": 0.010354727506637573,
"best_strict_max_attachment_alignment_penalty": 0.020374774932861328,
"best_strict_cord_envelope_m": [0.370378702878952, 0.392024964094162],
"strict_gates": {
"deep_slack_below_m": 0.37,
"overextension_above_m": 0.394,
"lateral_above_m": 0.02,
"alignment_penalty_above": 0.05
}
},
"sim2real": {
"retained": [
"BAM XL330 M6 voltage control, back-EMF, current limiting, battery variation, and load-dependent sag",
"control delay and actuator friction variation",
"encoder bias and IMU/encoder observation noise",
"two independent elastic tension-only cord dynamics"
],
"hardware_validated": false,
"known_limits": [
"cord knots and frame compliance",
"textile strap contact and seat padding",
"real collision geometry and assembly tolerance",
"servo temperature",
"still-start IMU frame calibration"
]
},
"media": {
"preview": "media/preview.mp4",
"preview_seed": 27,
"preview_duration_s": 36.0,
"audio": false,
"camera": "fixed",
"overlay": "running maximum full-span angle"
},
"source_artifact_sha256": "0caa869bcf46ac3ef9029ea73b3998cc86c3e7b4b3314717bd790474354b718d"
}