Repository navigation
Conversation
Gate the per-step limb slew clamp behind a flag (default True, preserving existing always-on behavior). Set False to replay raw absolute/EE targets open-loop, e.g. demos collected without velocity limits.
DemoConverter gains: - clamp_absolute_joint_velocity: offline per-step slew limiter (same length) - max_limb_discrepancy_after_velocity_clamp: infeasibility metric - retime_absolute_joint_velocity: time-stretch that inserts intermediate waypoints so each target is reachable under the velocity limit while keeping both arms synchronized Covered by tests in tests/test_demo_converter_velocity_clamp.py.
Exposes the versioned cache root so tooling no longer reaches into the private _cache_path attribute.
- demo_store_tasks: task registry + joint-absolute metadata helper - clamp_demo_joint_velocity: --retime (time-stretch) and --resim (re-simulate feasible targets in an enforcing env for self-consistent observations) - process_downloaded_demos_joint_velocity: batch feasibility processing with --retime - visualize_cube_handover: replay demos to MP4 for inspection - replay_* scripts: replay/success-check helpers
- ci.yml: installs RoboEval and runs the pytest suite (import smoke, one env per task family, demo-converter unit tests) on every push/PR - test_smoke.py: fast network-free env build/reset/step checks across all 7 task families - demo-replay.yml: heavier per-task demo replay + success regression
git submodule sync was restoring the SSH URL from .gitmodules, so the runner (no SSH key) failed to clone mujoco_menagerie. Use a global url.insteadOf rewrite before the update instead.
Open-loop replay drifts when the installed mujoco (pyproject: 3.3.3) differs from the demos' recorded version (3.1.5), causing spurious regression failures. Pin 3.1.5 for the replay job so it measures real divergence, not version skew.
Pinning mujoco 3.1.5 broke env creation (dm_control 1.0.31 needs >=3.2's cam_orthographic), so the supported runtime is 3.3.x where demos recorded on 3.1.5 drift and ~1/3 of open-loop replays miss success. Add --min-pass-rate to replay_sample_check_success.py and gate CI at 0.50 to catch real regressions without red-walling on known version drift.
It's a ~30 min job; the fast pytest gate (ci.yml) covers every push/PR. Move to a nightly cron + workflow_dispatch. The pass-rate threshold still applies when it runs.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Makes demos collected without velocity limits replayable under the joint velocity limit, and adds tooling to produce a velocity-feasible demo set.
Targets dev (not main): this builds on the joint-position control + velocity-clamp infrastructure that only exists on dev (
MAX_JOINT_VELclamp,block_until_reached,DemoConverter.create_demo_in_new_env/decimate). It cannot land on main until dev does.Changes
JointPositionActionMode.enforce_joint_velocity_limits(defaultTrue, backward-compatible): gates the per-step limb slew clamp. SetFalseto replay raw absolute/EE targets open-loop.DemoConvertervelocity-feasibility methods:clamp_absolute_joint_velocity— offline per-step slew limiter (same length)max_limb_discrepancy_after_velocity_clamp— infeasibility metricretime_absolute_joint_velocity— time-stretch that inserts intermediate waypoints so each target is reachable under the limit, keeping both arms synchronizedDemoStore.cache_path— public accessor for the versioned cache root (was a latent crash in the scripts, which referenced a non-existent attribute).clamp_demo_joint_velocity.pygains--retimeand--resim(re-simulate feasible targets in an enforcing env for self-consistent observations);process_downloaded_demos_joint_velocity.pygains--retime; plusvisualize_cube_handover.py, replay helpers, and thedemo_store_tasksregistry.Verification
tests/test_demo_converter_velocity_clamp.py— 9 passed (clamp, discrepancy, and retime feasibility/waypoint/gripper behavior).--retime --resimon 3 CubeHandover demos; all 3 persisted demos replay to SUCCESS underenforce_joint_velocity_limits=True, block_until_reached=False.Notes
block_until_reached=Trueover-dwelling (desyncing the bimanual handover), not the velocity enforcement itself.