| { |
| "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" |
| } |
|
|