Skip to content

Add robot-specific observation & action adapters for VLM policies - #1482

Merged
xyao-nv merged 72 commits into
mainfrom
xyao/feature/droid-vlm-adapters
Oct 23, 2026
Merged

xyao-nv merged 72 commits into
mainfrom
xyao/feature/droid-vlm-adapters

Conversation

@xyao-nv

@xyao-nv xyao-nv commented Oct 20, 2026 •

Copy link
Copy Markdown
Collaborator

Add robot-specific-configured VLM observation and action adapters with DROID. Provide default absolute-pose goal execution using measured pose and gripper state.

Why this change?

The upstream VLM policy provides step, chunk, and goal execution interfaces, but callers must implement observation selection, command decoding, and motion generation. Add reusable implementations so it can use these interfaces directly to control specific robot, like DROID.

What changes?

  • Add state, image, and combined image/state observation adapters configured from the embodiment.

  • Add concrete step, chunk, and goal action adapters with command schemas.

  • Define explicit ABS_EE_POSE and ABS_JOINT_POSITION command types.

  • Default VLMGoalPolicy to PoseTargetMotionGenerator for absolute pose goals. PoseTargetMotionGenerator holds targets until measured translation, rotation, and gripper closure meet their tolerances.

Usage examples

Step: Request one command from the VLM and execute it for one environment step.

  step_policy = VLMStepPolicy(
      config=config,
      inference_backend=backend,
      observation_adapter=ImageStateObservationAdapter(embodiment),
      action_adapter=StepActionAdapter(embodiment, CommandType.ABS_EE_POSE),
  )

Goal: Request a target and execute it until measured state reaches it or the step limit is reached; then request another target.

  goal_policy = VLMGoalPolicy(
      config=config,
      inference_backend=backend,
      observation_adapter=ImageStateObservationAdapter(embodiment),
      action_adapter=GoalActionAdapter(
          embodiment,
          CommandType.ABS_EE_POSE,
          motion_generator=PoseTargetMotionGenerator(embodiment),
      ),
      max_steps_per_goal=50,
  )

Chunk: Request N=8 commands together and execute one per environment step before requesting another chunk.

  chunk_policy = VLMChunkPolicy(
      config=config,
      inference_backend=backend,
      observation_adapter=ImageStateObservationAdapter(embodiment),
      action_adapter=ChunkActionAdapter(
          embodiment, CommandType.ABS_EE_POSE, chunk_size=8,
      ),
  )

Migrate only the VLM policy changes from PR #1278 onto main. Include goal and action-chunk policies, calibrated DROID adapters, Astra experiment configurations, focused tests, and usage documentation.

Signed-off-by: Xinjie Yao <xyao@nvidia.com>
Signed-off-by: Xinjie Yao <xyao@nvidia.com>
Signed-off-by: Xinjie Yao <xyao@nvidia.com>
Defer DROID integration and multi-step EEF controllers. Keep one stateless policy that consumes adapter-defined observations and returns adapter-defined native actions, with focused robot-independent tests.

Signed-off-by: Xinjie Yao <xyao@nvidia.com>
Require caller-provided adapters and the environment-generation inference backend. Defer class-path loading and config-only registration, and leave backend lifecycle ownership with the caller.

Signed-off-by: Xinjie Yao <xyao@nvidia.com>
Signed-off-by: Xinjie Yao <xyao@nvidia.com>
Signed-off-by: Xinjie Yao <xyao@nvidia.com>
Signed-off-by: Xinjie Yao <xyao@nvidia.com>
Signed-off-by: Xinjie Yao <xyao@nvidia.com>
Signed-off-by: Xinjie Yao <xyao@nvidia.com>
@xyao-nv
xyao-nv changed the base branch from main to xyao/feature/vlm-policy-main October 20, 2026 05:09
Signed-off-by: Xinjie Yao <xyao@nvidia.com>
Signed-off-by: Xinjie Yao <xyao@nvidia.com>
Migrate only the VLM policy changes from PR #1278 onto main. Include goal and action-chunk policies, calibrated DROID adapters, Astra experiment configurations, focused tests, and usage documentation.

Signed-off-by: Xinjie Yao <xyao@nvidia.com>
Signed-off-by: Xinjie Yao <xyao@nvidia.com>
Signed-off-by: Xinjie Yao <xyao@nvidia.com>
Defer DROID integration and multi-step EEF controllers. Keep one stateless policy that consumes adapter-defined observations and returns adapter-defined native actions, with focused robot-independent tests.

Signed-off-by: Xinjie Yao <xyao@nvidia.com>
Require caller-provided adapters and the environment-generation inference backend. Defer class-path loading and config-only registration, and leave backend lifecycle ownership with the caller.

Signed-off-by: Xinjie Yao <xyao@nvidia.com>
Signed-off-by: Xinjie Yao <xyao@nvidia.com>
Signed-off-by: Xinjie Yao <xyao@nvidia.com>
Signed-off-by: Xinjie Yao <xyao@nvidia.com>
Signed-off-by: Xinjie Yao <xyao@nvidia.com>
Signed-off-by: Xinjie Yao <xyao@nvidia.com>
Signed-off-by: Xinjie Yao <xyao@nvidia.com>
@xyao-nv
xyao-nv force-pushed the xyao/feature/vlm-policy-main branch from ab57b25 to 8a98145 Compare October 20, 2026 23:38
Adopt the updated step, chunk, and goal policy interfaces and keep
DROID unit tests alongside the upstream VLM tests. Remove superseded
policy and image helpers from their old locations.

Signed-off-by: Xinjie Yao <xyao@nvidia.com>
Signed-off-by: Xinjie Yao <xyao@nvidia.com>
Signed-off-by: Xinjie Yao <xyao@nvidia.com>
Signed-off-by: Xinjie Yao <xyao@nvidia.com>
Signed-off-by: Xinjie Yao <xyao@nvidia.com>
Signed-off-by: Xinjie Yao <xyao@nvidia.com>
Signed-off-by: Xinjie Yao <xyao@nvidia.com>
Signed-off-by: Xinjie Yao <xyao@nvidia.com>
Signed-off-by: Xinjie Yao <xyao@nvidia.com>
Signed-off-by: Xinjie Yao <xyao@nvidia.com>
Signed-off-by: Xinjie Yao <xyao@nvidia.com>
Signed-off-by: Xinjie Yao <xyao@nvidia.com>
Signed-off-by: Xinjie Yao <xyao@nvidia.com>
Signed-off-by: Xinjie Yao <xyao@nvidia.com>
Signed-off-by: Xinjie Yao <xyao@nvidia.com>
Signed-off-by: Xinjie Yao <xyao@nvidia.com>
Signed-off-by: Xinjie Yao <xyao@nvidia.com>
Signed-off-by: Xinjie Yao <xyao@nvidia.com>
Signed-off-by: Xinjie Yao <xyao@nvidia.com>
Signed-off-by: Xinjie Yao <xyao@nvidia.com>
Signed-off-by: Xinjie Yao <xyao@nvidia.com>
Signed-off-by: Xinjie Yao <xyao@nvidia.com>
Signed-off-by: Xinjie Yao <xyao@nvidia.com>
Signed-off-by: Xinjie Yao <xyao@nvidia.com>
Signed-off-by: Xinjie Yao <xyao@nvidia.com>
@xyao-nv
xyao-nv force-pushed the xyao/feature/droid-vlm-adapters branch from 5fab007 to dad0186 Compare October 22, 2026 20:07
@xyao-nv

xyao-nv commented Oct 22, 2026

Copy link
Copy Markdown
Collaborator Author

/review

Comment thread isaaclab_arena_vlm_agent/action_adapter.py Outdated
Comment thread isaaclab_arena_vlm_agent/observation_adapter.py Outdated
Comment thread isaaclab_arena_vlm_agent/action_adapter.py Outdated

@cvolkcvolk cvolkcvolk left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Left some suggestions. Feel free to pass to your agent.

Comment thread isaaclab_arena/embodiments/droid/droid.py Outdated
Comment thread isaaclab_arena_vlm_agent/action_adapter.py Outdated
Comment thread isaaclab_arena_vlm_agent/action_adapter.py Outdated
Comment thread isaaclab_arena_vlm_agent/pose_target_motion_generator.py
Comment thread isaaclab_arena/embodiments/gripper.py Outdated
Comment thread isaaclab_arena_vlm_agent/observation_adapter.py Outdated
Comment thread isaaclab_arena_vlm_agent/action_adapter.py Outdated
Signed-off-by: Xinjie Yao <xyao@nvidia.com>
Signed-off-by: Xinjie Yao <xyao@nvidia.com>
Comment thread isaaclab_arena_vlm_agent/pose_target_motion_generator.py Outdated
Comment thread isaaclab_arena_vlm_agent/observation_adapter.py Outdated
Signed-off-by: Xinjie Yao <xyao@nvidia.com>
@xyao-nv
xyao-nv merged commit 276d973 into main Oct 23, 2026
13 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants