Uh oh!
There was an error while loading. Please reload this page.
feat(expert-program): validate parallel joint segments - #482
Conversation
Make endpoint bindings, timed command frames, transports, routing, safe holds, and profile lowering controller-agnostic. Preserve joint trajectories as optional feedback artifacts and add staged, same-address invocation revision semantics for mobile and whole-body safety.
a271c5a to
a41a4cdCompareGreptile SummaryThis PR adds a cuRobo-backed safety gate for synchronized joint-position branches.
Confidence Score: 5/5The PR appears safe to merge. No blocking failure remains.
|
| Filename | Overview |
|---|---|
| embodichain/lab/gym/envs/expert_program/simulation_parallel_safety.py | Adds the cuRobo-backed parallel-command validator, runtime-bound factory, interpolation, and fail-closed validation. |
| embodichain/lab/gym/envs/expert_program/catalog.py | Binds validator creation to the exact scene registry, action engine, and robot owned by the runtime assembly. |
| embodichain/lab/gym/envs/expert_program/simulation_environment.py | Passes the assembled scene registry and action engine into registration-owned validator creation. |
| embodichain/lab/sim/planners/curobo/curobo_planner.py | Adds cuRobo trajectory-validation behavior used by the parallel safety gate. |
| embodichain/lab/sim/planners/motion_generator.py | Exposes planner trajectory-validation capability through the motion-generator boundary. |
| tests/gym/envs/expert_program/test_simulation_parallel_safety.py | Covers synchronized sampling, interpolation, collision handling, live world updates, and fail-closed configuration. |
Flowchart
%%{init: {'theme': 'neutral'}}%%
flowchart LR
A[Parallel branch frames] --> B[Merge joint commands]
B --> C[Combine with measured robot state]
C --> D[Densify joint segment]
D --> E[Validate joint bounds]
E --> F[Validate self-collision]
F --> G[Validate live world collision]
G --> H{All samples safe?}
H -->|Yes| I[Dispatch merged command]
H -->|No| J[Reject command]
Reviews (5): Last reviewed commit: "Merge branch 'main' into feat/production..." | Re-trigger Greptile
| from .simulation_parallel_safety import ( | ||
| CuroboParallelCommandSafetyValidator, | ||
| CuroboParallelSafetyValidatorFactory, | ||
| ) |
There was a problem hiding this comment.
Document the public safety APIs
These exports add public validator and factory APIs without documenting their required aggregate control-part configuration, interpolation limits, runtime dependencies, or integration procedure, leaving users without the repository's required public API guidance.
Context Used: AGENTS.md (source)
Prompt To Fix With AI
This is a comment left during a code review.
Path: embodichain/lab/gym/envs/expert_program/__init__.py
Line: 158-161
Comment:
**Document the public safety APIs**
These exports add public validator and factory APIs without documenting their required aggregate control-part configuration, interpolation limits, runtime dependencies, or integration procedure, leaving users without the repository's required public API guidance.
**Context Used:** AGENTS.md ([source](https://github.com/dexforce/embodichain/blob/main/AGENTS.md))
---
For each issue above, determine whether it is valid and should be fixed. If so, fix it directly.Note: If this suggestion doesn't match your team's coding style, reply to this and let me know. I'll remember it for next time!
a41a4cd to
ba13943Compareba13943 to
a41a4cdCompare…alog # Conflicts: # agent_context/MAP.yaml # agent_context/topics/atomic-actions/atomic-actions.md # agent_context/topics/motion-planning/motion-planning.md # docs/design/declarative_expert_program_plan.md # docs/design/expert_program_rollout_report.md # docs/source/api_reference/embodichain/embodichain.lab.gym.envs.expert_program.rst # docs/source/api_reference/embodichain/embodichain.lab.sim.atomic_actions.rst # docs/source/api_reference/embodichain/embodichain.lab.sim.skills.rst # docs/source/overview/sim/atomic_actions/builtin_actions.md # docs/source/overview/sim/atomic_actions/expert_programs.md # docs/source/overview/sim/atomic_actions/index.md # docs/source/overview/sim/atomic_actions/robot_skill_profiles.md # docs/source/overview/sim/index.rst # docs/source/overview/sim/scene_registry.md # docs/source/tutorial/atomic_actions.rst # embodichain/agents/mllm/expert_program.py # embodichain/lab/gym/envs/__init__.py # embodichain/lab/gym/envs/demo.py # embodichain/lab/gym/envs/embodied_env.py # embodichain/lab/gym/envs/expert_program/__init__.py # embodichain/lab/gym/envs/expert_program/bridge.py # embodichain/lab/gym/envs/expert_program/cfg.py # embodichain/lab/gym/envs/expert_program/compiler.py # embodichain/lab/gym/envs/expert_program/decoder.py # embodichain/lab/gym/envs/expert_program/environment.py # embodichain/lab/gym/envs/expert_program/loader.py # embodichain/lab/gym/envs/expert_program/simulation.py # embodichain/lab/gym/envs/expert_program/simulation_environment.py # embodichain/lab/gym/envs/expert_program/simulation_policies.py # embodichain/lab/gym/envs/managers/_event_functors/dynamic_settling.py # embodichain/lab/gym/utils/gym_utils.py # embodichain/lab/sim/atomic_actions/__init__.py # embodichain/lab/sim/atomic_actions/affordance.py # embodichain/lab/sim/atomic_actions/bindings.py # embodichain/lab/sim/atomic_actions/core.py # embodichain/lab/sim/atomic_actions/engine.py # embodichain/lab/sim/atomic_actions/execution.py # embodichain/lab/sim/atomic_actions/goals.py # embodichain/lab/sim/atomic_actions/plans.py # embodichain/lab/sim/atomic_actions/primitives/_helpers.py # embodichain/lab/sim/atomic_actions/primitives/coordinated_pickment.py # embodichain/lab/sim/atomic_actions/primitives/coordinated_placement.py # embodichain/lab/sim/atomic_actions/primitives/hand_over.py # embodichain/lab/sim/atomic_actions/primitives/move_end_effector.py # embodichain/lab/sim/atomic_actions/primitives/move_held_object.py # embodichain/lab/sim/atomic_actions/primitives/move_joints.py # embodichain/lab/sim/atomic_actions/primitives/pick_up.py # embodichain/lab/sim/atomic_actions/primitives/place.py # embodichain/lab/sim/atomic_actions/primitives/press.py # embodichain/lab/sim/atomic_actions/runtime.py # embodichain/lab/sim/atomic_actions/state.py # embodichain/lab/sim/planners/base_planner.py # embodichain/lab/sim/planners/curobo/curobo_planner.py # embodichain/lab/sim/planners/curobo/curobo_yaml.py # embodichain/lab/sim/planners/motion_generator.py # embodichain/lab/sim/skills/__init__.py # embodichain/lab/sim/skills/calls.py # embodichain/lab/sim/skills/compiler.py # embodichain/lab/sim/skills/integration.py # embodichain/lab/sim/skills/parallel_runtime.py # embodichain/lab/sim/skills/profiles.py # embodichain/lab/sim/skills/runtime.py # embodichain/lab/sim/skills/scene.py # embodichain_tasks/configs/gym/expert_program/repeated_pick_place.json # embodichain_tasks/configs/gym/open_drawer/cobot_magic_3cam.json # embodichain_tasks/embodichain_tasks/multi_segments/cube_pick_place.py # embodichain_tasks/embodichain_tasks/tableware/open_drawer.py # scripts/benchmark/atomic_action/press_benchmark.py # scripts/tools/expert_program_rollout_report.py # scripts/tutorials/atomic_action/assemble.py # scripts/tutorials/atomic_action/coordinated_pickment.py # scripts/tutorials/atomic_action/coordinated_placement.py # scripts/tutorials/atomic_action/dynamic_obstacle_recovery.py # scripts/tutorials/atomic_action/hand_over.py # scripts/tutorials/atomic_action/move_end_effector.py # scripts/tutorials/atomic_action/move_held_object.py # scripts/tutorials/atomic_action/move_joints.py # scripts/tutorials/atomic_action/moving_target_recovery.py # scripts/tutorials/atomic_action/pickup.py # scripts/tutorials/atomic_action/place.py # scripts/tutorials/atomic_action/press.py # tests/agents/mllm/test_expert_program.py # tests/benchmark/expert_program/test_demo_success_open_drawer_sim.py # tests/gym/envs/expert_program/test_bridge.py # tests/gym/envs/expert_program/test_compiler.py # tests/gym/envs/expert_program/test_completion_metadata.py # tests/gym/envs/expert_program/test_decoder.py # tests/gym/envs/expert_program/test_environment.py # tests/gym/envs/expert_program/test_loader.py # tests/gym/envs/expert_program/test_parallel_compiler.py # tests/gym/envs/expert_program/test_parallel_schema.py # tests/gym/envs/expert_program/test_simulation.py # tests/gym/envs/expert_program/test_simulation_environment.py # tests/gym/envs/expert_program/test_simulation_policies.py # tests/gym/envs/expert_program/test_task_vertical_slices.py # tests/gym/envs/tasks/test_multi_segments_cube_pick_place.py # tests/gym/envs/test_demo.py # tests/gym/envs/test_embodied_env_expert_program.py # tests/gym/utils/test_gym_utils.py # tests/lab/scripts/test_run_env.py # tests/scripts/tools/test_expert_program_rollout_report.py # tests/sim/atomic_actions/test_actions.py # tests/sim/atomic_actions/test_affordance.py # tests/sim/atomic_actions/test_control.py # tests/sim/atomic_actions/test_core.py # tests/sim/atomic_actions/test_endpoint_runtime_e2e.py # tests/sim/atomic_actions/test_engine.py # tests/sim/atomic_actions/test_engine_per_env.py # tests/sim/atomic_actions/test_runner.py # tests/sim/atomic_actions/test_trajectory_ops.py # tests/sim/planners/test_curobo_planner.py # tests/sim/planners/test_motion_generator_batched.py # tests/sim/skills/test_calls.py # tests/sim/skills/test_compiler.py # tests/sim/skills/test_curobo_semantic_runtime_dynamic_recovery_gpu.py # tests/sim/skills/test_effects.py # tests/sim/skills/test_evidence.py # tests/sim/skills/test_integration.py # tests/sim/skills/test_parallel_runtime.py # tests/sim/skills/test_profiles.py # tests/sim/skills/test_runtime.py # tests/sim/skills/test_scene.py # tests/test_expert_program_package_data.py
…feat/workflow-reacquisition # Conflicts: # agent_context/topics/atomic-actions/atomic-actions.md # docs/design/declarative_expert_program_plan.md # docs/source/api_reference/embodichain/embodichain.lab.sim.atomic_actions.rst # docs/source/overview/sim/atomic_actions/index.md # embodichain/lab/gym/envs/expert_program/catalog.py # embodichain/lab/gym/envs/expert_program/simulation_environment.py # embodichain/lab/sim/atomic_actions/execution.py # embodichain/lab/sim/atomic_actions/invocation.py # embodichain/lab/sim/skills/compiler.py # embodichain/lab/sim/skills/runtime.py # embodichain_tasks/embodichain_tasks/multi_segments/cube_pick_place.py # embodichain_tasks/embodichain_tasks/tableware/__init__.py # tests/gym/envs/expert_program/test_simulation_environment.py # tests/gym/envs/tasks/test_multi_segments_cube_pick_place.py # tests/gym/envs/tasks/test_open_drawer.py # tests/sim/atomic_actions/test_engine_per_env.py # tests/sim/skills/test_compiler.py # tests/sim/skills/test_profiles.py # tests/sim/skills/test_runtime.py
…on-bindings # Conflicts: # embodichain/lab/gym/envs/expert_program/__init__.py # embodichain/lab/gym/envs/expert_program/catalog.py # embodichain/lab/gym/envs/expert_program/simulation.py # embodichain/lab/sim/skills/__init__.py # embodichain/lab/sim/skills/compiler.py # tests/gym/envs/expert_program/test_simulation.py
…parallel-safety # Conflicts: # embodichain/lab/gym/envs/expert_program/__init__.py # embodichain/lab/sim/planners/base_planner.py # embodichain/lab/sim/planners/curobo/curobo_planner.py # tests/gym/envs/expert_program/test_catalog.py # tests/gym/envs/expert_program/test_simulation_environment.py
# Conflicts: # docs/design/declarative_expert_program_plan.md # docs/source/api_reference/embodichain/embodichain.lab.gym.envs.expert_program.rst # docs/source/api_reference/public_api.rst # embodichain/lab/gym/envs/expert_program/__init__.py # embodichain/lab/gym/envs/expert_program/catalog.py # embodichain/lab/gym/envs/expert_program/environment.py # embodichain/lab/gym/envs/expert_program/extensions.py # embodichain/lab/gym/envs/expert_program/simulation.py # embodichain/lab/gym/envs/expert_program/simulation_environment.py # embodichain/lab/sim/atomic_actions/execution.py # embodichain/lab/sim/skills/runtime.py # embodichain_tasks/configs/expert_program/hand_over.yaml # embodichain_tasks/configs/gym/expert_program/hand_over.json # embodichain_tasks/embodichain_tasks/expert_program/hand_over.py # embodichain_tasks/embodichain_tasks/expert_program/open_drawer.py # tests/gym/envs/expert_program/test_catalog.py # tests/gym/envs/expert_program/test_extensions.py # tests/gym/envs/expert_program/test_simulation_environment.py # tests/gym/envs/expert_program/test_task_hand_over.py # tests/sim/atomic_actions/test_engine_per_env.py # tests/sim/skills/test_runtime.py
Uh oh!
There was an error while loading. Please reload this page.
Description
Stack
feat/placement-relation-bindingsAdd a production cuRobo-backed safety validator for synchronized joint-position branches. The validator combines the merged command with measured full-robot state, requires an aggregate control part covering every commanded joint, and densifies the exact segment under a configured maximum joint step.
Every supplied sample is checked against cuRobo joint bounds, self-collision, and the registry-backed live static/dynamic world. Uncovered joints, overlapping commands, collision rows, and sample-cap under-sampling fail closed. The gate validates the command as written; it neither replans nor replaces the trajectory.
Refs #471
Refs #474
Type of change
Screenshots
Not applicable.
Validation
pytest -q tests/gym/envs/expert_program/test_simulation_parallel_safety.py tests/sim/planners/test_curobo_planner.py tests/gym/envs/expert_program/test_catalog.py tests/gym/envs/expert_program/test_extensions.py tests/gym/envs/expert_program/test_simulation_environment.py— 164 passed, 1 skipped, 2 deselectedChecklist