Skip to content

Add vla_sim: prompt-driven cube stacking with a vision-language-action policy - #815

Merged
JWhitleyWork merged 3 commits into
mainfrom
20588-vla-sim
Aug 6, 2026
Merged

Add vla_sim: prompt-driven cube stacking with a vision-language-action policy#815
JWhitleyWork merged 3 commits into
mainfrom
20588-vla-sim

Conversation

@fdavulcu

@fdavulcu fdavulcu commented Jul 28, 2026

Copy link
Copy Markdown

[written (mostly) by AI]

Motivation

Adds vla_sim: prompt-driven color cube stacking on a simulated Kinova Gen3, executed by a vision-language-action policy. Closes PickNikRobotics/moveit_pro#20588 and PickNikRobotics/moveit_pro#20587, part of epic PickNikRobotics/moveit_pro#20583. Requires the paired launcher change, which starts and stops the inference server with the stack. Both target 10.0.0.

How it works

The policy is served by a LeRobot inference server in its own container (src/vla_sim/docker/). Keeping it separate keeps torch and LeRobot out of the product image, lets the ML stack be pinned and upgraded on its own schedule, and avoids real conflicts. One concrete example: the product image needs numpy 1.x while LeRobot needs numpy 2.

A small ROS node serves /get_action_chunk and forwards requests to the server over HTTP. ExecutePolicy only sees the ROS service, named by its policy_service_name port, so any node implementing GetActionChunk can back it, including one you write yourself. The adapter that ships here requires the server to be on the same machine: requests carry the deployment's shared key over plain HTTP, so it validates infer_url at startup and accepts only a loopback address. Serving from another machine comes after the MVP.

Model settings live in one file, src/vla_sim/config/vla_serving.yaml: checkpoint, rate, device, RTC. Edits apply on the next moveit_pro run, with no rebuild. Checkpoints can be Hugging Face repos, cached under src/vla_sim/hf_cache/, or local folders dropped into src/vla_sim/models/. On NVIDIA machines the server uses the GPU automatically.

The objective's image_names are the checkpoint's trained camera names, and there is no remapping layer. If the request's camera names don't exactly match the checkpoint's, the server rejects it and the objective shows a message listing the expected names. Loading, ready, and load errors surface the same way.

@fdavulcu fdavulcu added this to the 10.0.0 milestone Jul 28, 2026
@coderabbitai

coderabbitai Bot commented Jul 28, 2026

Copy link
Copy Markdown

Review Change Stack

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Summary by CodeRabbit

  • New Features

    • Added a MuJoCo simulation for Kinova Gen3 cube stacking with a Robotiq gripper.
    • Added vision-language-action policy execution through an inference server, including health status and error reporting.
    • Added configurable model checkpoints, hardware acceleration, camera inputs, action timing, and real-time control settings.
    • Added the “Stack Cubes with the VLA Policy” objective and Home waypoint.
  • Documentation

    • Added setup, usage, configuration, and troubleshooting guidance for simulation and inference.
  • Chores

    • Improved handling of large model files, local caches, environment files, and simulation assets.

Walkthrough

Adds a complete vla_sim ROS 2 package with Kinova Gen3 MuJoCo assets, cube-stacking configuration, a containerized VLA inference server, a ROS action-chunk adapter, ExecutePolicy objective, documentation, and automated tests.

Changes

VLA simulation rollout

Layer / File(s) Summary
Simulation package and robot configuration
src/vla_sim/CMakeLists.txt, src/vla_sim/package.xml, src/vla_sim/config/..., src/vla_sim/description/picknik_kinova_gen3.xacro, src/vla_sim/waypoints/...
Defines the ROS 2 package, MoveIt and controller settings, Kinova/Robotiq robot description, MuJoCo ros2_control wiring, planning groups, limits, sensors, and the Home waypoint.
MuJoCo robot, scene, and mesh assets
src/vla_sim/description/mujoco/...
Adds the Kinova and Robotiq MuJoCo model, cube-stack scene, cameras, table, cubes, actuators, sensors, collision rules, material files, and Git LFS mesh pointers.
Containerized policy server
docker-compose.yaml, src/vla_sim/docker/*, src/vla_sim/config/vla_serving.yaml
Adds the inference container, serving configuration, checkpoint and device resolution, readiness/error states, authenticated HTTP endpoints, image and camera validation, inference execution, and server tests.
ROS action-chunk adapter and launch integration
src/vla_sim/launch/agent_bridge.launch.xml, src/vla_sim/script/get_action_chunk_adapter.py, src/vla_sim/test/test_get_action_chunk_adapter.py
Bridges /get_action_chunk requests to /infer, converts images and trajectories, forwards RTC fields and authorization, validates responses, and tests request, error, and carryover handling.
Objectives, documentation, and workspace support
src/vla_sim/objectives/..., src/vla_sim/README.md, .dockerignore, .gitignore
Adds the cube-stacking ExecutePolicy behavior, setup and troubleshooting documentation, and ignores for checkpoints, caches, bytecode, secrets, and Docker build artifacts.

Possibly related issues

  • #20583 — The PR adds the Kinova block-stacking VLA rollout, native policy serving, and ExecutePolicy integration described by this issue.

Suggested reviewers: jwhitleywork


Caution

Pre-merge checks failed

Please resolve all errors before merging. Addressing warnings is optional.

  • Ignore (reviewers only)

❌ Failed checks (1 error)

Check name Status Explanation Resolution
Human Review Check ❌ Error Adds authenticated inference-server/container deployment with HF_TOKEN and MOVEIT_FRONTEND_KEY handling, which hits the check’s auth and infra/deployment exclusions. This PR requires review by a requested human reviewer. After review, a non-author requested reviewer should override this pre-merge check.
✅ Passed checks (3 passed)
Check name Status Explanation
Linked Issues check ✅ Passed The changes add the shipped vla_sim package, Kinova block-stacking objective, inference server, and HTTP bridge needed for the golden-path rollout.
Out of Scope Changes check ✅ Passed The changes are focused on vla_sim runtime, assets, configs, and tests, with no clearly unrelated code introduced.
Description check ✅ Passed The description clearly explains the vla_sim cube-stacking simulation, inference server, ROS adapter, model configuration, and related changes.

Comment @coderabbitai help to get the list of available commands.

@github-actions

github-actions Bot commented Jul 28, 2026

Copy link
Copy Markdown

⚠️ This PR modifies 4 file(s) that also exist in PickNikRobotics/moveit_pro_empty_ws.

Consider whether the change should land upstream in moveit_pro_empty_ws first so downstream forks pick it up on the next sync.

Overlapping files
  • .dockerignore
  • .gitignore
  • README.md
  • docker-compose.yaml

@fdavulcu
fdavulcu force-pushed the 20588-vla-sim branch 2 times, most recently from 5d12643 to 1fae55a Compare July 28, 2026 15:05
@github-actions

Copy link
Copy Markdown

MoveIt Pro Example WS - Objectives Integration Test Report

  • lab_sim
    • jazzy: no report produced — see run logs
  • hangar_sim
    • jazzy: no report produced — see run logs

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 6

🧹 Nitpick comments (10)
src/vla_sim/docker/test_serve_policy.py (2)

311-315: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Also close the server socket in cleanup.

shutdown() stops the serve loop but leaves the listening socket open; each test in this class leaks one FD.

♻️ Suggested cleanup
         threading.Thread(target=httpd.serve_forever, daemon=True).start()
         self.addCleanup(httpd.shutdown)
+        self.addCleanup(httpd.server_close)
         return http.client.HTTPConnection("127.0.0.1", httpd.server_address[1])
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/vla_sim/docker/test_serve_policy.py` around lines 311 - 315, Update the
cleanup registered in _start to close the HTTP server socket as well as stopping
serve_forever, using the server’s existing shutdown and server_close lifecycle
methods so each test releases its listening file descriptor.

207-210: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

This test reaches the Hugging Face code path.

"/nonexistent/checkpoint" isn't a directory and contains /, so load_checkpoint_file routes it to hf_hub_download. It passes today only because the repo id fails client-side validation, so the except Exception branch produces the expected ValueError. A checkpoint string with no / (e.g. "nonexistent-checkpoint") exercises the same assertion without depending on hub-client behavior or risking a network call in CI.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/vla_sim/docker/test_serve_policy.py` around lines 207 - 210, Update
test_unresolvable_fps_raises to use a checkpoint identifier without a slash,
such as “nonexistent-checkpoint”, so resolve_fps exercises the local
missing-checkpoint path without invoking Hugging Face hub handling or
network-dependent behavior.
src/vla_sim/docker/serve_policy.py (2)

460-472: 🎯 Functional Correctness | 🔵 Trivial | 💤 Low value

state of a non-sequence type yields a 500, not a 400.

payload["state"] is used directly in len() and then torch.tensor(...). A scalar or string state is a caller error but escapes as TypeError → 500. A type check alongside the existing images check keeps the 4xx/5xx split honest.

🛡️ Suggested guard
     if not isinstance(payload["images"], dict):
         raise ValueError("/infer payload 'images' must map camera names to images")
+    if not isinstance(payload["state"], list):
+        raise ValueError("/infer payload 'state' must be a list of joint positions")
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/vla_sim/docker/serve_policy.py` around lines 460 - 472, Add an explicit
sequence-type validation for payload["state"] alongside the existing
payload["images"] check, before calling len() or converting it with
torch.tensor. Raise the endpoint’s existing ValueError-style client error for
scalar or string states, while preserving the expected-dimension validation for
valid sequences.

236-240: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Validate rtc_schedule with a message that names the valid values.

A typo (exp, Exp) surfaces as a bare KeyError: 'exp' in /health detail, which doesn't tell the operator what to write in vla_serving.yaml — unlike every other knob here, which fails with an actionable message.

♻️ Suggested validation
+        try:
+            schedule = RTCAttentionSchedule[rtc_schedule]
+        except KeyError:
+            valid = ", ".join(s.name for s in RTCAttentionSchedule)
+            raise ValueError(
+                f"rtc_schedule '{rtc_schedule}' is not a known RTC schedule; "
+                f"set rtc_schedule in vla_serving.yaml to one of: {valid}"
+            ) from None
         self.policy.config.rtc_config = RTCConfig(
             enabled=True,
-            prefix_attention_schedule=RTCAttentionSchedule[rtc_schedule],
+            prefix_attention_schedule=schedule,
         )
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/vla_sim/docker/serve_policy.py` around lines 236 - 240, Validate
rtc_schedule before indexing RTCAttentionSchedule in the policy initialization
flow, and raise an actionable error that includes the invalid value and the
valid RTCAttentionSchedule names. Keep valid schedule handling unchanged and
ensure the message directs operators to the expected vla_serving.yaml values.
src/vla_sim/launch/agent_bridge.launch.xml (1)

16-24: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Consider exposing http_timeout as a launch arg.

The adapter declares http_timeout (and service_name) as parameters, and its own comment says the timeout should be sized to ExecutePolicy's policy_call_timeout. As launched, it's pinned to the 10.0s built-in with no way to align the two without editing the script.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/vla_sim/launch/agent_bridge.launch.xml` around lines 16 - 24, Expose an
`http_timeout` launch argument in the launch configuration and pass it to the
`get_action_chunk_adapter` node as its parameter, using the adapter’s existing
default unless overridden. This should allow the timeout to be aligned with
`ExecutePolicy`’s `policy_call_timeout` without modifying the script.
src/vla_sim/docker/Dockerfile.serve_policy (1)

28-32: 🔒 Security & Privacy | 🔵 Trivial | 💤 Low value

No USER in the image (Trivy DS-0002).

The compose service sets user:, so the deployed path is non-root, but a bare docker run python serve_policy.py (documented in the README) runs as root. Adding USER 1000 keeps the default safe without affecting the compose override.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/vla_sim/docker/Dockerfile.serve_policy` around lines 28 - 32, Add a USER
1000 directive to the Dockerfile after the application setup and before
ENTRYPOINT, ensuring bare-container execution of serve_policy.py defaults to a
non-root user while preserving the compose service’s user override.

Source: Linters/SAST tools

src/vla_sim/script/get_action_chunk_adapter.py (2)

114-125: 🎯 Functional Correctness | 🔵 Trivial | ⚡ Quick win

Element count isn't checked against the declared layout.

The 2-dimension check passes, but dim[0].size * dim[1].size may not equal len(prev.data). The reshape then raises a raw ValueError, which falls through to the generic handler as adapter failed: ValueError: cannot reshape ... — losing the actionable framing the sibling layout error already has.

🛡️ Suggested check
             steps, width = prev.layout.dim[0].size, prev.layout.dim[1].size
+            if steps * width != len(prev.data):
+                raise RequestError(
+                    f"previous_action_chunk carries {len(prev.data)} values but "
+                    f"its layout declares {steps}x{width} = {steps * width}"
+                )
             payload["prev_chunk_left_over"] = (
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/vla_sim/script/get_action_chunk_adapter.py` around lines 114 - 125, In
the previous action-chunk handling within the request adapter, validate that
steps multiplied by width equals len(prev.data) after confirming the layout has
two dimensions. Raise RequestError with the same actionable layout-mismatch
framing before calling np.asarray(...).reshape(...), preserving the existing
valid-payload behavior.

199-215: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

response.success = True is set before the RTC echo is built.

If action_chunk_raw is malformed, the failure lands in _on_request's generic handler, which does reset success — so behavior is correct today, but it depends on that ordering. Building the echo before flipping success makes the invariant local rather than incidental.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/vla_sim/script/get_action_chunk_adapter.py` around lines 199 - 215, The
response success flag is set before constructing the RTC echo, allowing
malformed action_chunk_raw data to fail after marking success. In the
response-building method containing response.policy_action_chunk, move
response.success = True to after all raw echo validation and Float64MultiArray
construction complete, while preserving the existing success and failure
handling.
src/vla_sim/description/picknik_kinova_gen3.xacro (2)

23-23: 🎯 Functional Correctness | 🔵 Trivial | 💤 Low value

Default mujoco_model points to a file that doesn't exist in this package.

description/mujoco/scene.xml isn't shipped; only gen3_7dof.xml and cube_stack_scene.xml exist. config.yaml always overrides this to cube_stack_scene.xml in the shipped path, so this only bites a standalone/default xacro render.

🩹 Proposed fix
-    <xacro:arg name="mujoco_model" default="description/mujoco/scene.xml" />
+    <xacro:arg name="mujoco_model" default="description/mujoco/cube_stack_scene.xml" />
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/vla_sim/description/picknik_kinova_gen3.xacro` at line 23, Update the
mujoco_model argument default in the xacro configuration to reference the
shipped cube_stack_scene.xml file instead of the nonexistent
description/mujoco/scene.xml path, while preserving config.yaml overrides.

26-27: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Verify these macro includes are still needed.

gen3_macro.xacro and the gripper macro are included, but none of the following link/joint definitions (lines 41-707) appear to invoke them — everything is hand-written directly instead. If no macro from these includes is actually instantiated anywhere in this file, they're likely leftover from before the manual/inlined rewrite (consistent with the "picknik_accessories dropped" note nearby) and could be removed, also dropping the implicit runtime dependency on kortex_description's macro path resolving for the given arm/gripper args.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/vla_sim/description/picknik_kinova_gen3.xacro` around lines 26 - 27,
Verify whether the included arm and gripper macros are instantiated anywhere in
the xacro content; if neither include is used, remove both xacro:include
directives while preserving the manually defined links and joints.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@src/vla_sim/config/control/picknik_kinova_gen3.ros2_control.yaml`:
- Around line 72-79: Update the max_joint_velocity values for joints 5–7 in the
control configuration to stay within the declared 1.2218 rad/s joint limits used
by the selected PoseJog controller; preserve the existing limits for joints 1–4
and ensure the controller does not permit velocities above the MoveIt
configuration.

In `@src/vla_sim/description/picknik_kinova_gen3.xacro`:
- Around line 538-560: Update the world-fixed table geometry in the table_joint
definition to match the stacking scene’s table placement, specifically aligning
the table link with x=0.5 and y=0.0 while preserving its existing dimensions and
z placement unless the scene requires otherwise. Keep the table link name
unchanged so the SRDF disable_collisions references remain valid.

In `@src/vla_sim/docker/Dockerfile.serve_policy`:
- Around line 5-7: Update the apt installation command in the Dockerfile to
satisfy hadolint DL3008 by pinning libgl1 and libglib2.0-0 to explicit versions,
or add a narrowly scoped DL3008 ignore directive if stable pinning is
impractical for the Debian slim repository.
- Around line 17-26: Update the TORCH_VERSION used in the Dockerfile’s
dependency installation to a version below 2.11.0 that is supported by
lerobot==0.6.0, and align TORCHVISION_VERSION with the matching vision wheel.
Preserve the existing optional TORCH_INDEX installation flow and lerobot
dependency.

In `@src/vla_sim/docker/serve_policy.py`:
- Around line 1-23: Reformat all three new Python files with the repository’s
Black/pre-commit configuration: src/vla_sim/docker/serve_policy.py (lines 1-23),
src/vla_sim/docker/test_serve_policy.py (lines 1-36), and
src/vla_sim/test/test_get_action_chunk_adapter.py (lines 1-28). Run pre-commit
run --all-files from the workspace root and commit the resulting formatting
changes.

In `@src/vla_sim/objectives/execute_color_stack_policy.xml`:
- Line 35: Replace the approximate policy_call_timeout handling in the adapter
used by execute_color_stack_policy with an explicit hard wall-clock deadline for
/get_action_chunk, covering connection and response-read time together. Ensure
the single-threaded request path returns or aborts once the end-to-end limit is
reached rather than relying on requests’ separate timeout phases, while
preserving the configured 10.0-second budget.

---

Nitpick comments:
In `@src/vla_sim/description/picknik_kinova_gen3.xacro`:
- Line 23: Update the mujoco_model argument default in the xacro configuration
to reference the shipped cube_stack_scene.xml file instead of the nonexistent
description/mujoco/scene.xml path, while preserving config.yaml overrides.
- Around line 26-27: Verify whether the included arm and gripper macros are
instantiated anywhere in the xacro content; if neither include is used, remove
both xacro:include directives while preserving the manually defined links and
joints.

In `@src/vla_sim/docker/Dockerfile.serve_policy`:
- Around line 28-32: Add a USER 1000 directive to the Dockerfile after the
application setup and before ENTRYPOINT, ensuring bare-container execution of
serve_policy.py defaults to a non-root user while preserving the compose
service’s user override.

In `@src/vla_sim/docker/serve_policy.py`:
- Around line 460-472: Add an explicit sequence-type validation for
payload["state"] alongside the existing payload["images"] check, before calling
len() or converting it with torch.tensor. Raise the endpoint’s existing
ValueError-style client error for scalar or string states, while preserving the
expected-dimension validation for valid sequences.
- Around line 236-240: Validate rtc_schedule before indexing
RTCAttentionSchedule in the policy initialization flow, and raise an actionable
error that includes the invalid value and the valid RTCAttentionSchedule names.
Keep valid schedule handling unchanged and ensure the message directs operators
to the expected vla_serving.yaml values.

In `@src/vla_sim/docker/test_serve_policy.py`:
- Around line 311-315: Update the cleanup registered in _start to close the HTTP
server socket as well as stopping serve_forever, using the server’s existing
shutdown and server_close lifecycle methods so each test releases its listening
file descriptor.
- Around line 207-210: Update test_unresolvable_fps_raises to use a checkpoint
identifier without a slash, such as “nonexistent-checkpoint”, so resolve_fps
exercises the local missing-checkpoint path without invoking Hugging Face hub
handling or network-dependent behavior.

In `@src/vla_sim/launch/agent_bridge.launch.xml`:
- Around line 16-24: Expose an `http_timeout` launch argument in the launch
configuration and pass it to the `get_action_chunk_adapter` node as its
parameter, using the adapter’s existing default unless overridden. This should
allow the timeout to be aligned with `ExecutePolicy`’s `policy_call_timeout`
without modifying the script.

In `@src/vla_sim/script/get_action_chunk_adapter.py`:
- Around line 114-125: In the previous action-chunk handling within the request
adapter, validate that steps multiplied by width equals len(prev.data) after
confirming the layout has two dimensions. Raise RequestError with the same
actionable layout-mismatch framing before calling np.asarray(...).reshape(...),
preserving the existing valid-payload behavior.
- Around line 199-215: The response success flag is set before constructing the
RTC echo, allowing malformed action_chunk_raw data to fail after marking
success. In the response-building method containing
response.policy_action_chunk, move response.success = True to after all raw echo
validation and Float64MultiArray construction complete, while preserving the
existing success and failure handling.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: a4e824ca-dd74-4ccb-bc34-7b2433afec88

📥 Commits

Reviewing files that changed from the base of the PR and between 14ef4a1 and 33ab52b.

⛔ Files ignored due to path filters (14)
  • src/vla_sim/description/mujoco/assets/kinova/base_link.obj is excluded by !**/*.obj
  • src/vla_sim/description/mujoco/assets/kinova/bracelet_no_vision_link.obj is excluded by !**/*.obj
  • src/vla_sim/description/mujoco/assets/kinova/bracelet_with_vision_link.obj is excluded by !**/*.obj
  • src/vla_sim/description/mujoco/assets/kinova/forearm_link.obj is excluded by !**/*.obj
  • src/vla_sim/description/mujoco/assets/kinova/half_arm_1_link.obj is excluded by !**/*.obj
  • src/vla_sim/description/mujoco/assets/kinova/half_arm_2_link.obj is excluded by !**/*.obj
  • src/vla_sim/description/mujoco/assets/kinova/shoulder_link.obj is excluded by !**/*.obj
  • src/vla_sim/description/mujoco/assets/kinova/spherical_wrist_1_link.obj is excluded by !**/*.obj
  • src/vla_sim/description/mujoco/assets/kinova/spherical_wrist_2_link.obj is excluded by !**/*.obj
  • src/vla_sim/description/mujoco/assets/rafti_finger.obj is excluded by !**/*.obj
  • src/vla_sim/description/mujoco/assets/rafti_finger_collision_1.obj is excluded by !**/*.obj
  • src/vla_sim/description/mujoco/assets/rafti_finger_collision_2.obj is excluded by !**/*.obj
  • src/vla_sim/description/mujoco/assets/rafti_finger_collision_3.obj is excluded by !**/*.obj
  • src/vla_sim/description/mujoco/assets/rafti_finger_collision_4.obj is excluded by !**/*.obj
📒 Files selected for processing (62)
  • .dockerignore
  • .gitignore
  • docker-compose.yaml
  • src/vla_sim/CMakeLists.txt
  • src/vla_sim/README.md
  • src/vla_sim/config/config.yaml
  • src/vla_sim/config/control/picknik_kinova_gen3.ros2_control.yaml
  • src/vla_sim/config/initial_positions.yaml
  • src/vla_sim/config/moveit/joint_jog.yaml
  • src/vla_sim/config/moveit/joint_limits.yaml
  • src/vla_sim/config/moveit/picknik_kinova_gen3_base.srdf
  • src/vla_sim/config/moveit/pose_ik_distance.yaml
  • src/vla_sim/config/moveit/pose_jog.yaml
  • src/vla_sim/config/moveit/sensors_3d.yaml
  • src/vla_sim/config/vla_serving.yaml
  • src/vla_sim/description/mujoco/assets/kinova/base_link.STL
  • src/vla_sim/description/mujoco/assets/kinova/base_link.mtl
  • src/vla_sim/description/mujoco/assets/kinova/bracelet_no_vision_link.STL
  • src/vla_sim/description/mujoco/assets/kinova/bracelet_no_vision_link.mtl
  • src/vla_sim/description/mujoco/assets/kinova/bracelet_with_vision_link.STL
  • src/vla_sim/description/mujoco/assets/kinova/bracelet_with_vision_link.mtl
  • src/vla_sim/description/mujoco/assets/kinova/end_effector_link.STL
  • src/vla_sim/description/mujoco/assets/kinova/forearm_link.STL
  • src/vla_sim/description/mujoco/assets/kinova/forearm_link.mtl
  • src/vla_sim/description/mujoco/assets/kinova/half_arm_1_link.STL
  • src/vla_sim/description/mujoco/assets/kinova/half_arm_1_link.mtl
  • src/vla_sim/description/mujoco/assets/kinova/half_arm_2_link.STL
  • src/vla_sim/description/mujoco/assets/kinova/half_arm_2_link.mtl
  • src/vla_sim/description/mujoco/assets/kinova/shoulder_link.STL
  • src/vla_sim/description/mujoco/assets/kinova/shoulder_link.mtl
  • src/vla_sim/description/mujoco/assets/kinova/spherical_wrist_1_link.STL
  • src/vla_sim/description/mujoco/assets/kinova/spherical_wrist_1_link.mtl
  • src/vla_sim/description/mujoco/assets/kinova/spherical_wrist_2_link.STL
  • src/vla_sim/description/mujoco/assets/kinova/spherical_wrist_2_link.mtl
  • src/vla_sim/description/mujoco/assets/rafti_finger.mtl
  • src/vla_sim/description/mujoco/assets/rafti_finger_collision_1.mtl
  • src/vla_sim/description/mujoco/assets/rafti_finger_collision_2.mtl
  • src/vla_sim/description/mujoco/assets/rafti_finger_collision_3.mtl
  • src/vla_sim/description/mujoco/assets/rafti_finger_collision_4.mtl
  • src/vla_sim/description/mujoco/assets/robotiq_2f85/base.stl
  • src/vla_sim/description/mujoco/assets/robotiq_2f85/finger_link.stl
  • src/vla_sim/description/mujoco/assets/robotiq_2f85/finger_tip_link.stl
  • src/vla_sim/description/mujoco/assets/robotiq_2f85/inner_knuckle_link.stl
  • src/vla_sim/description/mujoco/assets/robotiq_2f85/knuckle_link.stl
  • src/vla_sim/description/mujoco/assets/robotiq_2f85/pad.stl
  • src/vla_sim/description/mujoco/assets/robotiq_2f85/silicone_pad.stl
  • src/vla_sim/description/mujoco/cube_stack_scene.xml
  • src/vla_sim/description/mujoco/gen3_7dof.xml
  • src/vla_sim/description/picknik_kinova_gen3.xacro
  • src/vla_sim/docker/Dockerfile.serve_policy
  • src/vla_sim/docker/README.md
  • src/vla_sim/docker/serve_policy.py
  • src/vla_sim/docker/test_serve_policy.py
  • src/vla_sim/hf_cache/.gitkeep
  • src/vla_sim/launch/agent_bridge.launch.xml
  • src/vla_sim/models/.gitkeep
  • src/vla_sim/objectives/execute_color_stack_policy.xml
  • src/vla_sim/objectives/reset_simulation.xml
  • src/vla_sim/package.xml
  • src/vla_sim/script/get_action_chunk_adapter.py
  • src/vla_sim/test/test_get_action_chunk_adapter.py
  • src/vla_sim/waypoints/waypoints.yaml

Comment thread src/vla_sim/config/control/picknik_kinova_gen3.ros2_control.yaml Outdated
Comment thread src/vla_sim/description/picknik_kinova_gen3.xacro Outdated
Comment thread src/vla_sim/docker/Dockerfile.vla_inference_server
Comment thread src/vla_sim/docker/Dockerfile.vla_inference_server
Comment thread src/vla_sim/docker/vla_inference_server.py
Comment thread src/vla_sim/objectives/stack_cubes_with_the_vla_policy.xml
@github-actions

Copy link
Copy Markdown

MoveIt Pro Example WS - Objectives Integration Test Report

@github-actions

Copy link
Copy Markdown

MoveIt Pro Example WS - Objectives Integration Test Report

@github-actions

Copy link
Copy Markdown

MoveIt Pro Example WS - Objectives Integration Test Report

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@src/vla_sim/docker/vla_inference_server.py`:
- Around line 528-530: Update the image decoding flow around decode_image_b64 so
TypeError from non-string image values is handled alongside ValueError as a
malformed-request condition, returning HTTP 400; preserve the existing
binascii.Error handling for invalid base64 and avoid treating these client input
errors as server faults.

In `@src/vla_sim/script/get_action_chunk_adapter.py`:
- Around line 123-130: Update _build_payload to validate that
request.robot_state.name and request.robot_state.position have equal lengths
before constructing the payload, and raise the established validation error
identifying the mismatched state arrays. Keep the existing state serialization
and _validate_chunk behavior unchanged once the upfront validation passes.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 511d366a-b889-4385-80dd-f8daaa40323e

📥 Commits

Reviewing files that changed from the base of the PR and between 33ab52b and 0ecabe6.

⛔ Files ignored due to path filters (14)
  • src/vla_sim/description/mujoco/assets/kinova/base_link.obj is excluded by !**/*.obj
  • src/vla_sim/description/mujoco/assets/kinova/bracelet_no_vision_link.obj is excluded by !**/*.obj
  • src/vla_sim/description/mujoco/assets/kinova/bracelet_with_vision_link.obj is excluded by !**/*.obj
  • src/vla_sim/description/mujoco/assets/kinova/forearm_link.obj is excluded by !**/*.obj
  • src/vla_sim/description/mujoco/assets/kinova/half_arm_1_link.obj is excluded by !**/*.obj
  • src/vla_sim/description/mujoco/assets/kinova/half_arm_2_link.obj is excluded by !**/*.obj
  • src/vla_sim/description/mujoco/assets/kinova/shoulder_link.obj is excluded by !**/*.obj
  • src/vla_sim/description/mujoco/assets/kinova/spherical_wrist_1_link.obj is excluded by !**/*.obj
  • src/vla_sim/description/mujoco/assets/kinova/spherical_wrist_2_link.obj is excluded by !**/*.obj
  • src/vla_sim/description/mujoco/assets/rafti_finger.obj is excluded by !**/*.obj
  • src/vla_sim/description/mujoco/assets/rafti_finger_collision_1.obj is excluded by !**/*.obj
  • src/vla_sim/description/mujoco/assets/rafti_finger_collision_2.obj is excluded by !**/*.obj
  • src/vla_sim/description/mujoco/assets/rafti_finger_collision_3.obj is excluded by !**/*.obj
  • src/vla_sim/description/mujoco/assets/rafti_finger_collision_4.obj is excluded by !**/*.obj
📒 Files selected for processing (61)
  • .dockerignore
  • .gitignore
  • docker-compose.yaml
  • src/vla_sim/CMakeLists.txt
  • src/vla_sim/README.md
  • src/vla_sim/config/config.yaml
  • src/vla_sim/config/control/picknik_kinova_gen3.ros2_control.yaml
  • src/vla_sim/config/moveit/joint_jog.yaml
  • src/vla_sim/config/moveit/joint_limits.yaml
  • src/vla_sim/config/moveit/picknik_kinova_gen3_base.srdf
  • src/vla_sim/config/moveit/pose_ik_distance.yaml
  • src/vla_sim/config/moveit/pose_jog.yaml
  • src/vla_sim/config/moveit/sensors_3d.yaml
  • src/vla_sim/config/vla_serving.yaml
  • src/vla_sim/description/mujoco/assets/kinova/base_link.STL
  • src/vla_sim/description/mujoco/assets/kinova/base_link.mtl
  • src/vla_sim/description/mujoco/assets/kinova/bracelet_no_vision_link.STL
  • src/vla_sim/description/mujoco/assets/kinova/bracelet_no_vision_link.mtl
  • src/vla_sim/description/mujoco/assets/kinova/bracelet_with_vision_link.STL
  • src/vla_sim/description/mujoco/assets/kinova/bracelet_with_vision_link.mtl
  • src/vla_sim/description/mujoco/assets/kinova/end_effector_link.STL
  • src/vla_sim/description/mujoco/assets/kinova/forearm_link.STL
  • src/vla_sim/description/mujoco/assets/kinova/forearm_link.mtl
  • src/vla_sim/description/mujoco/assets/kinova/half_arm_1_link.STL
  • src/vla_sim/description/mujoco/assets/kinova/half_arm_1_link.mtl
  • src/vla_sim/description/mujoco/assets/kinova/half_arm_2_link.STL
  • src/vla_sim/description/mujoco/assets/kinova/half_arm_2_link.mtl
  • src/vla_sim/description/mujoco/assets/kinova/shoulder_link.STL
  • src/vla_sim/description/mujoco/assets/kinova/shoulder_link.mtl
  • src/vla_sim/description/mujoco/assets/kinova/spherical_wrist_1_link.STL
  • src/vla_sim/description/mujoco/assets/kinova/spherical_wrist_1_link.mtl
  • src/vla_sim/description/mujoco/assets/kinova/spherical_wrist_2_link.STL
  • src/vla_sim/description/mujoco/assets/kinova/spherical_wrist_2_link.mtl
  • src/vla_sim/description/mujoco/assets/rafti_finger.mtl
  • src/vla_sim/description/mujoco/assets/rafti_finger_collision_1.mtl
  • src/vla_sim/description/mujoco/assets/rafti_finger_collision_2.mtl
  • src/vla_sim/description/mujoco/assets/rafti_finger_collision_3.mtl
  • src/vla_sim/description/mujoco/assets/rafti_finger_collision_4.mtl
  • src/vla_sim/description/mujoco/assets/robotiq_2f85/base.stl
  • src/vla_sim/description/mujoco/assets/robotiq_2f85/finger_link.stl
  • src/vla_sim/description/mujoco/assets/robotiq_2f85/finger_tip_link.stl
  • src/vla_sim/description/mujoco/assets/robotiq_2f85/inner_knuckle_link.stl
  • src/vla_sim/description/mujoco/assets/robotiq_2f85/knuckle_link.stl
  • src/vla_sim/description/mujoco/assets/robotiq_2f85/pad.stl
  • src/vla_sim/description/mujoco/assets/robotiq_2f85/silicone_pad.stl
  • src/vla_sim/description/mujoco/cube_stack_scene.xml
  • src/vla_sim/description/mujoco/gen3_7dof.xml
  • src/vla_sim/description/picknik_kinova_gen3.xacro
  • src/vla_sim/docker/Dockerfile.vla_inference_server
  • src/vla_sim/docker/README.md
  • src/vla_sim/docker/test_vla_inference_server.py
  • src/vla_sim/docker/vla_inference_server.py
  • src/vla_sim/hf_cache/.gitkeep
  • src/vla_sim/launch/agent_bridge.launch.xml
  • src/vla_sim/models/.gitkeep
  • src/vla_sim/objectives/execute_color_stack_policy.xml
  • src/vla_sim/objectives/reset_simulation.xml
  • src/vla_sim/package.xml
  • src/vla_sim/script/get_action_chunk_adapter.py
  • src/vla_sim/test/test_get_action_chunk_adapter.py
  • src/vla_sim/waypoints/waypoints.yaml
🚧 Files skipped from review as they are similar to previous changes (43)
  • src/vla_sim/description/mujoco/assets/robotiq_2f85/finger_link.stl
  • src/vla_sim/description/mujoco/assets/robotiq_2f85/inner_knuckle_link.stl
  • src/vla_sim/description/mujoco/assets/kinova/bracelet_no_vision_link.STL
  • src/vla_sim/description/mujoco/assets/kinova/half_arm_2_link.mtl
  • src/vla_sim/description/mujoco/assets/rafti_finger_collision_1.mtl
  • src/vla_sim/description/mujoco/assets/kinova/shoulder_link.mtl
  • src/vla_sim/description/mujoco/assets/robotiq_2f85/silicone_pad.stl
  • src/vla_sim/description/mujoco/assets/rafti_finger_collision_3.mtl
  • src/vla_sim/description/mujoco/assets/kinova/shoulder_link.STL
  • src/vla_sim/description/mujoco/assets/kinova/spherical_wrist_1_link.STL
  • src/vla_sim/description/mujoco/assets/kinova/bracelet_no_vision_link.mtl
  • src/vla_sim/description/mujoco/assets/kinova/forearm_link.STL
  • src/vla_sim/description/mujoco/assets/kinova/end_effector_link.STL
  • src/vla_sim/description/mujoco/assets/kinova/base_link.mtl
  • .dockerignore
  • src/vla_sim/description/mujoco/assets/robotiq_2f85/base.stl
  • src/vla_sim/config/moveit/joint_limits.yaml
  • src/vla_sim/CMakeLists.txt
  • src/vla_sim/description/mujoco/assets/kinova/spherical_wrist_2_link.mtl
  • src/vla_sim/launch/agent_bridge.launch.xml
  • src/vla_sim/description/mujoco/assets/kinova/half_arm_1_link.mtl
  • src/vla_sim/description/mujoco/assets/kinova/half_arm_2_link.STL
  • src/vla_sim/objectives/reset_simulation.xml
  • src/vla_sim/config/moveit/pose_jog.yaml
  • src/vla_sim/description/mujoco/assets/rafti_finger_collision_2.mtl
  • src/vla_sim/description/mujoco/assets/kinova/base_link.STL
  • src/vla_sim/description/mujoco/assets/robotiq_2f85/pad.stl
  • src/vla_sim/config/moveit/joint_jog.yaml
  • src/vla_sim/description/mujoco/assets/kinova/forearm_link.mtl
  • src/vla_sim/README.md
  • src/vla_sim/objectives/execute_color_stack_policy.xml
  • src/vla_sim/description/mujoco/assets/kinova/spherical_wrist_2_link.STL
  • src/vla_sim/description/mujoco/assets/kinova/bracelet_with_vision_link.mtl
  • src/vla_sim/config/moveit/picknik_kinova_gen3_base.srdf
  • src/vla_sim/description/mujoco/assets/rafti_finger.mtl
  • src/vla_sim/config/vla_serving.yaml
  • src/vla_sim/config/moveit/pose_ik_distance.yaml
  • src/vla_sim/description/mujoco/assets/kinova/bracelet_with_vision_link.STL
  • src/vla_sim/config/control/picknik_kinova_gen3.ros2_control.yaml
  • src/vla_sim/config/moveit/sensors_3d.yaml
  • src/vla_sim/description/mujoco/gen3_7dof.xml
  • .gitignore
  • src/vla_sim/description/mujoco/cube_stack_scene.xml

Comment thread src/vla_sim/docker/vla_inference_server.py Outdated
Comment thread src/vla_sim/script/get_action_chunk_adapter.py
@github-actions

Copy link
Copy Markdown

MoveIt Pro Example WS - Objectives Integration Test Report

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 3

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@src/vla_sim/description/mujoco/assets/robotiq_2f85/knuckle_link.stl`:
- Around line 1-3: Ensure the MuJoCo startup or installation flow fetches Git
LFS objects before loading gen3_7dof.xml, including the robotiq_2f85 mesh
assets. Add a check or fetch step that detects unresolved LFS pointers and runs
the project’s established Git LFS retrieval mechanism before launch.

In `@src/vla_sim/docker/vla_inference_server.py`:
- Around line 562-573: Update the request validation in do_POST around
inference_delay, guidance_horizon, and payload["task"] so malformed non-scalar
delay or horizon values and non-string tasks are rejected as client errors
(400), alongside the existing image-value validation. Normalize conversion
failures into the existing ValueError handling rather than allowing TypeError or
deep policy errors to escape, while preserving the non-negative checks for valid
numeric inputs.

In `@src/vla_sim/script/get_action_chunk_adapter.py`:
- Around line 208-228: Harden action_chunk validation before the width and
finiteness checks: validate that every row is a list-like numeric sequence,
catching scalar and non-numeric entries without allowing TypeError or ValueError
to escape. Raise RequestError messages that explicitly identify the invalid
action_chunk, matching the precise behavior of the action_chunk_raw path while
preserving existing width and non-finite value validation.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: be2038d3-e9f2-4c15-84b9-b404d03cd230

📥 Commits

Reviewing files that changed from the base of the PR and between 0ecabe6 and 6b540e4.

⛔ Files ignored due to path filters (14)
  • src/vla_sim/description/mujoco/assets/kinova/base_link.obj is excluded by !**/*.obj
  • src/vla_sim/description/mujoco/assets/kinova/bracelet_no_vision_link.obj is excluded by !**/*.obj
  • src/vla_sim/description/mujoco/assets/kinova/bracelet_with_vision_link.obj is excluded by !**/*.obj
  • src/vla_sim/description/mujoco/assets/kinova/forearm_link.obj is excluded by !**/*.obj
  • src/vla_sim/description/mujoco/assets/kinova/half_arm_1_link.obj is excluded by !**/*.obj
  • src/vla_sim/description/mujoco/assets/kinova/half_arm_2_link.obj is excluded by !**/*.obj
  • src/vla_sim/description/mujoco/assets/kinova/shoulder_link.obj is excluded by !**/*.obj
  • src/vla_sim/description/mujoco/assets/kinova/spherical_wrist_1_link.obj is excluded by !**/*.obj
  • src/vla_sim/description/mujoco/assets/kinova/spherical_wrist_2_link.obj is excluded by !**/*.obj
  • src/vla_sim/description/mujoco/assets/rafti_finger.obj is excluded by !**/*.obj
  • src/vla_sim/description/mujoco/assets/rafti_finger_collision_1.obj is excluded by !**/*.obj
  • src/vla_sim/description/mujoco/assets/rafti_finger_collision_2.obj is excluded by !**/*.obj
  • src/vla_sim/description/mujoco/assets/rafti_finger_collision_3.obj is excluded by !**/*.obj
  • src/vla_sim/description/mujoco/assets/rafti_finger_collision_4.obj is excluded by !**/*.obj
📒 Files selected for processing (61)
  • .dockerignore
  • .gitignore
  • docker-compose.yaml
  • src/vla_sim/CMakeLists.txt
  • src/vla_sim/README.md
  • src/vla_sim/config/config.yaml
  • src/vla_sim/config/control/picknik_kinova_gen3.ros2_control.yaml
  • src/vla_sim/config/moveit/joint_jog.yaml
  • src/vla_sim/config/moveit/joint_limits.yaml
  • src/vla_sim/config/moveit/picknik_kinova_gen3_base.srdf
  • src/vla_sim/config/moveit/pose_ik_distance.yaml
  • src/vla_sim/config/moveit/pose_jog.yaml
  • src/vla_sim/config/moveit/sensors_3d.yaml
  • src/vla_sim/config/vla_serving.yaml
  • src/vla_sim/description/mujoco/assets/kinova/base_link.STL
  • src/vla_sim/description/mujoco/assets/kinova/base_link.mtl
  • src/vla_sim/description/mujoco/assets/kinova/bracelet_no_vision_link.STL
  • src/vla_sim/description/mujoco/assets/kinova/bracelet_no_vision_link.mtl
  • src/vla_sim/description/mujoco/assets/kinova/bracelet_with_vision_link.STL
  • src/vla_sim/description/mujoco/assets/kinova/bracelet_with_vision_link.mtl
  • src/vla_sim/description/mujoco/assets/kinova/end_effector_link.STL
  • src/vla_sim/description/mujoco/assets/kinova/forearm_link.STL
  • src/vla_sim/description/mujoco/assets/kinova/forearm_link.mtl
  • src/vla_sim/description/mujoco/assets/kinova/half_arm_1_link.STL
  • src/vla_sim/description/mujoco/assets/kinova/half_arm_1_link.mtl
  • src/vla_sim/description/mujoco/assets/kinova/half_arm_2_link.STL
  • src/vla_sim/description/mujoco/assets/kinova/half_arm_2_link.mtl
  • src/vla_sim/description/mujoco/assets/kinova/shoulder_link.STL
  • src/vla_sim/description/mujoco/assets/kinova/shoulder_link.mtl
  • src/vla_sim/description/mujoco/assets/kinova/spherical_wrist_1_link.STL
  • src/vla_sim/description/mujoco/assets/kinova/spherical_wrist_1_link.mtl
  • src/vla_sim/description/mujoco/assets/kinova/spherical_wrist_2_link.STL
  • src/vla_sim/description/mujoco/assets/kinova/spherical_wrist_2_link.mtl
  • src/vla_sim/description/mujoco/assets/rafti_finger.mtl
  • src/vla_sim/description/mujoco/assets/rafti_finger_collision_1.mtl
  • src/vla_sim/description/mujoco/assets/rafti_finger_collision_2.mtl
  • src/vla_sim/description/mujoco/assets/rafti_finger_collision_3.mtl
  • src/vla_sim/description/mujoco/assets/rafti_finger_collision_4.mtl
  • src/vla_sim/description/mujoco/assets/robotiq_2f85/base.stl
  • src/vla_sim/description/mujoco/assets/robotiq_2f85/finger_link.stl
  • src/vla_sim/description/mujoco/assets/robotiq_2f85/finger_tip_link.stl
  • src/vla_sim/description/mujoco/assets/robotiq_2f85/inner_knuckle_link.stl
  • src/vla_sim/description/mujoco/assets/robotiq_2f85/knuckle_link.stl
  • src/vla_sim/description/mujoco/assets/robotiq_2f85/pad.stl
  • src/vla_sim/description/mujoco/assets/robotiq_2f85/silicone_pad.stl
  • src/vla_sim/description/mujoco/cube_stack_scene.xml
  • src/vla_sim/description/mujoco/gen3_7dof.xml
  • src/vla_sim/description/picknik_kinova_gen3.xacro
  • src/vla_sim/docker/Dockerfile.vla_inference_server
  • src/vla_sim/docker/README.md
  • src/vla_sim/docker/test_vla_inference_server.py
  • src/vla_sim/docker/vla_inference_server.py
  • src/vla_sim/hf_cache/.gitkeep
  • src/vla_sim/launch/agent_bridge.launch.xml
  • src/vla_sim/models/.gitkeep
  • src/vla_sim/objectives/execute_color_stack_policy.xml
  • src/vla_sim/objectives/reset_simulation.xml
  • src/vla_sim/package.xml
  • src/vla_sim/script/get_action_chunk_adapter.py
  • src/vla_sim/test/test_get_action_chunk_adapter.py
  • src/vla_sim/waypoints/waypoints.yaml
🚧 Files skipped from review as they are similar to previous changes (52)
  • src/vla_sim/description/mujoco/assets/rafti_finger.mtl
  • src/vla_sim/description/mujoco/assets/kinova/spherical_wrist_1_link.STL
  • src/vla_sim/description/mujoco/assets/kinova/forearm_link.mtl
  • src/vla_sim/config/moveit/pose_ik_distance.yaml
  • src/vla_sim/description/mujoco/assets/robotiq_2f85/base.stl
  • src/vla_sim/description/mujoco/assets/kinova/end_effector_link.STL
  • src/vla_sim/description/mujoco/assets/kinova/spherical_wrist_1_link.mtl
  • src/vla_sim/config/moveit/joint_limits.yaml
  • src/vla_sim/description/mujoco/assets/kinova/shoulder_link.STL
  • src/vla_sim/description/mujoco/assets/kinova/bracelet_with_vision_link.STL
  • src/vla_sim/description/mujoco/assets/kinova/half_arm_2_link.STL
  • src/vla_sim/description/mujoco/assets/kinova/half_arm_1_link.STL
  • src/vla_sim/package.xml
  • src/vla_sim/description/mujoco/assets/robotiq_2f85/silicone_pad.stl
  • src/vla_sim/description/mujoco/assets/kinova/forearm_link.STL
  • src/vla_sim/CMakeLists.txt
  • src/vla_sim/description/mujoco/assets/rafti_finger_collision_1.mtl
  • src/vla_sim/description/mujoco/assets/robotiq_2f85/inner_knuckle_link.stl
  • src/vla_sim/description/mujoco/assets/kinova/half_arm_2_link.mtl
  • src/vla_sim/description/mujoco/assets/kinova/base_link.STL
  • src/vla_sim/waypoints/waypoints.yaml
  • src/vla_sim/description/mujoco/assets/robotiq_2f85/finger_tip_link.stl
  • src/vla_sim/description/mujoco/assets/kinova/bracelet_with_vision_link.mtl
  • src/vla_sim/description/mujoco/assets/rafti_finger_collision_4.mtl
  • src/vla_sim/description/mujoco/assets/rafti_finger_collision_3.mtl
  • src/vla_sim/docker/Dockerfile.vla_inference_server
  • src/vla_sim/description/mujoco/assets/robotiq_2f85/pad.stl
  • src/vla_sim/README.md
  • src/vla_sim/description/mujoco/assets/kinova/bracelet_no_vision_link.STL
  • src/vla_sim/description/mujoco/assets/kinova/shoulder_link.mtl
  • .gitignore
  • src/vla_sim/description/mujoco/assets/kinova/spherical_wrist_2_link.mtl
  • src/vla_sim/description/mujoco/assets/robotiq_2f85/finger_link.stl
  • src/vla_sim/description/mujoco/assets/kinova/spherical_wrist_2_link.STL
  • .dockerignore
  • src/vla_sim/config/moveit/joint_jog.yaml
  • src/vla_sim/description/mujoco/assets/kinova/half_arm_1_link.mtl
  • src/vla_sim/config/moveit/sensors_3d.yaml
  • src/vla_sim/objectives/reset_simulation.xml
  • src/vla_sim/description/mujoco/assets/rafti_finger_collision_2.mtl
  • src/vla_sim/launch/agent_bridge.launch.xml
  • src/vla_sim/description/mujoco/assets/kinova/bracelet_no_vision_link.mtl
  • src/vla_sim/objectives/execute_color_stack_policy.xml
  • docker-compose.yaml
  • src/vla_sim/config/moveit/picknik_kinova_gen3_base.srdf
  • src/vla_sim/config/config.yaml
  • src/vla_sim/config/vla_serving.yaml
  • src/vla_sim/config/control/picknik_kinova_gen3.ros2_control.yaml
  • src/vla_sim/docker/README.md
  • src/vla_sim/description/picknik_kinova_gen3.xacro
  • src/vla_sim/description/mujoco/cube_stack_scene.xml
  • src/vla_sim/description/mujoco/gen3_7dof.xml

Comment thread src/vla_sim/description/mujoco/assets/robotiq_2f85/knuckle_link.stl
Comment thread src/vla_sim/docker/vla_inference_server.py
Comment thread src/vla_sim/script/get_action_chunk_adapter.py
@github-actions

Copy link
Copy Markdown

MoveIt Pro Example WS - Objectives Integration Test Report

@github-actions

Copy link
Copy Markdown

MoveIt Pro Example WS - Objectives Integration Test Report

@github-actions

Copy link
Copy Markdown

MoveIt Pro Example WS - Objectives Integration Test Report

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 2

🧹 Nitpick comments (6)
src/vla_sim/script/get_action_chunk_adapter.py (1)

90-92: 🩺 Stability & Availability | 🔵 Trivial | 💤 Low value

Non-numeric http_timeout override raises TypeError from np.isfinite, bypassing the intended message. If the parameter is declared/overridden as a string (e.g. from a launch value="fast"), resolve_http_timeout crashes with a numpy TypeError instead of the actionable ValueError. A type guard keeps the startup error self-explanatory.

🛡️ Proposed guard
 def resolve_http_timeout(value: float) -> float:
     """Reject a non-positive or non-finite http_timeout at startup, not per call."""
-    if not np.isfinite(value) or value <= 0.0:
+    if (
+        isinstance(value, bool)
+        or not isinstance(value, (int, float))
+        or not np.isfinite(value)
+        or value <= 0.0
+    ):
         raise ValueError(
             f"the http_timeout parameter must be a positive number of "
             f"seconds, got {value!r}"
         )
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/vla_sim/script/get_action_chunk_adapter.py` around lines 90 - 92, Update
the http_timeout initialization around resolve_http_timeout and
declare_parameter to validate that the resolved parameter value is numeric
before it reaches np.isfinite, raising the intended actionable ValueError for
string or other non-numeric overrides while preserving normal numeric timeout
handling.
src/vla_sim/docker/vla_inference_server.py (1)

347-362: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Warmup hardcodes 224x224 frames. If a checkpoint's image preprocessing does not resize (or expects a different native resolution), warmup fails and is only logged as a warning, so the first real request still pays the cold cost silently. Consider deriving the shape from policy.config.input_features[...].shape instead of the constant.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/vla_sim/docker/vla_inference_server.py` around lines 347 - 362, The
warmup implementation in warmup() hardcodes 224x224 image tensors, which can
mismatch the checkpoint’s configured input resolution. Derive each camera tensor
shape from the corresponding policy.config.input_features entry, preserving its
channel and spatial dimensions before calling infer().
src/vla_sim/description/picknik_kinova_gen3.xacro (1)

392-409: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Dead Gazebo/ODE <surface> blocks in a MuJoCo cell.

<surface>, <friction><ode>, and <contact><ode> are SDF elements, not URDF children of <collision>; URDF parsers ignore them (often with warnings). Contact behavior for this cell comes from description/mujoco/cube_stack_scene.xml, so these copy-paste artifacts have no effect and misleadingly suggest tuned fingertip friction. Consider dropping them.

Also applies to: 427-444

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/vla_sim/description/picknik_kinova_gen3.xacro` around lines 392 - 409,
Remove the unused Gazebo/ODE <surface> blocks, including their <friction><ode>
and <contact><ode> contents, from both affected collision cells in the
MuJoCo-related Xacro. Preserve the surrounding collision geometry and rely on
the existing cube_stack_scene.xml contact configuration.
src/vla_sim/CMakeLists.txt (1)

24-38: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

ament_lint_auto_find_test_dependencies() will find no linters.

package.xml only declares ament_lint_auto and ament_cmake_pytest as test deps, so no linter packages (e.g. ament_lint_common, or ament_cmake_flake8/ament_cmake_xmllint for this Python+XML package) are discoverable and the call is effectively a no-op. Either add the linter test deps or drop the call to avoid implying lint coverage.

♻️ Suggested package.xml addition
  <test_depend>ament_cmake_flake8</test_depend>
  <test_depend>ament_cmake_xmllint</test_depend>
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/vla_sim/CMakeLists.txt` around lines 24 - 38, Update the BUILD_TESTING
dependencies so ament_lint_auto_find_test_dependencies() discovers actual
linters: add the appropriate Python and XML linter test dependencies, such as
ament_cmake_flake8 and ament_cmake_xmllint, to package.xml. Keep the existing
lint-discovery call in CMakeLists.txt.
src/vla_sim/config/control/picknik_kinova_gen3.ros2_control.yaml (1)

8-14: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

twist_controller and fault_controller are declared but never spawned, and joint: tcp doesn't exist in this description.

Neither controller appears in controllers_active_at_startup, controllers_inactive_at_startup, nor controllers_not_managed in config/config.yaml, so these blocks are dead configuration. twist_controller's joint: tcp (Line 24) also references a frame absent from picknik_kinova_gen3.xacro (the EE frame here is grasp_link), so it would fail if anyone later loads it. Drop them or fix the frame and register them in config.yaml.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/vla_sim/config/control/picknik_kinova_gen3.ros2_control.yaml` around
lines 8 - 14, Remove the unused twist_controller and fault_controller
declarations from the ros2_control configuration, since neither is spawned or
managed in config.yaml. Do not retain the invalid twist_controller joint
reference to tcp; only keep or reintroduce these controllers if they are
explicitly registered in the appropriate config.yaml startup or management list
and the twist controller uses the existing grasp_link frame.
src/vla_sim/description/mujoco/gen3_7dof.xml (1)

183-187: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

rafti_finger* meshes appear unused. No geom in this model references these five meshes (the gripper uses the robotiq_85_* meshes). Dropping them removes five asset files from the load-time dependency set.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/vla_sim/description/mujoco/gen3_7dof.xml` around lines 183 - 187, Remove
the five unused rafti_finger mesh declarations—rafti_finger and
rafti_finger_collision_1 through rafti_finger_collision_4—from the model, and
remove their corresponding asset files so no unnecessary load-time dependencies
remain. Preserve the robotiq_85 mesh declarations and all referenced geometry.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@src/vla_sim/config/moveit/picknik_kinova_gen3_base.srdf`:
- Around line 15-26: Update the SRDF gripper group around the robotiq finger
joints to remove robotiq_85_left_finger_joint and robotiq_85_right_finger_joint
from the active joint list, marking them passive or defining them as
fixed/mimicked consistently with the robot description.

In `@src/vla_sim/description/mujoco/assets/kinova/end_effector_link.STL`:
- Around line 1-3: Replace the Git LFS pointer in end_effector_link.STL with the
actual valid STL mesh object, ensuring the file contains at least the required
80-byte header and 4-byte triangle count so the referenced MuJoCo asset loads
correctly.

---

Nitpick comments:
In `@src/vla_sim/CMakeLists.txt`:
- Around line 24-38: Update the BUILD_TESTING dependencies so
ament_lint_auto_find_test_dependencies() discovers actual linters: add the
appropriate Python and XML linter test dependencies, such as ament_cmake_flake8
and ament_cmake_xmllint, to package.xml. Keep the existing lint-discovery call
in CMakeLists.txt.

In `@src/vla_sim/config/control/picknik_kinova_gen3.ros2_control.yaml`:
- Around line 8-14: Remove the unused twist_controller and fault_controller
declarations from the ros2_control configuration, since neither is spawned or
managed in config.yaml. Do not retain the invalid twist_controller joint
reference to tcp; only keep or reintroduce these controllers if they are
explicitly registered in the appropriate config.yaml startup or management list
and the twist controller uses the existing grasp_link frame.

In `@src/vla_sim/description/mujoco/gen3_7dof.xml`:
- Around line 183-187: Remove the five unused rafti_finger mesh
declarations—rafti_finger and rafti_finger_collision_1 through
rafti_finger_collision_4—from the model, and remove their corresponding asset
files so no unnecessary load-time dependencies remain. Preserve the robotiq_85
mesh declarations and all referenced geometry.

In `@src/vla_sim/description/picknik_kinova_gen3.xacro`:
- Around line 392-409: Remove the unused Gazebo/ODE <surface> blocks, including
their <friction><ode> and <contact><ode> contents, from both affected collision
cells in the MuJoCo-related Xacro. Preserve the surrounding collision geometry
and rely on the existing cube_stack_scene.xml contact configuration.

In `@src/vla_sim/docker/vla_inference_server.py`:
- Around line 347-362: The warmup implementation in warmup() hardcodes 224x224
image tensors, which can mismatch the checkpoint’s configured input resolution.
Derive each camera tensor shape from the corresponding
policy.config.input_features entry, preserving its channel and spatial
dimensions before calling infer().

In `@src/vla_sim/script/get_action_chunk_adapter.py`:
- Around line 90-92: Update the http_timeout initialization around
resolve_http_timeout and declare_parameter to validate that the resolved
parameter value is numeric before it reaches np.isfinite, raising the intended
actionable ValueError for string or other non-numeric overrides while preserving
normal numeric timeout handling.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: e7ee4197-5e40-4e38-b4d2-c14645cdc5cb

📥 Commits

Reviewing files that changed from the base of the PR and between 6b540e4 and 42d3895.

⛔ Files ignored due to path filters (14)
  • src/vla_sim/description/mujoco/assets/kinova/base_link.obj is excluded by !**/*.obj
  • src/vla_sim/description/mujoco/assets/kinova/bracelet_no_vision_link.obj is excluded by !**/*.obj
  • src/vla_sim/description/mujoco/assets/kinova/bracelet_with_vision_link.obj is excluded by !**/*.obj
  • src/vla_sim/description/mujoco/assets/kinova/forearm_link.obj is excluded by !**/*.obj
  • src/vla_sim/description/mujoco/assets/kinova/half_arm_1_link.obj is excluded by !**/*.obj
  • src/vla_sim/description/mujoco/assets/kinova/half_arm_2_link.obj is excluded by !**/*.obj
  • src/vla_sim/description/mujoco/assets/kinova/shoulder_link.obj is excluded by !**/*.obj
  • src/vla_sim/description/mujoco/assets/kinova/spherical_wrist_1_link.obj is excluded by !**/*.obj
  • src/vla_sim/description/mujoco/assets/kinova/spherical_wrist_2_link.obj is excluded by !**/*.obj
  • src/vla_sim/description/mujoco/assets/rafti_finger.obj is excluded by !**/*.obj
  • src/vla_sim/description/mujoco/assets/rafti_finger_collision_1.obj is excluded by !**/*.obj
  • src/vla_sim/description/mujoco/assets/rafti_finger_collision_2.obj is excluded by !**/*.obj
  • src/vla_sim/description/mujoco/assets/rafti_finger_collision_3.obj is excluded by !**/*.obj
  • src/vla_sim/description/mujoco/assets/rafti_finger_collision_4.obj is excluded by !**/*.obj
📒 Files selected for processing (61)
  • .dockerignore
  • .gitignore
  • docker-compose.yaml
  • src/vla_sim/CMakeLists.txt
  • src/vla_sim/README.md
  • src/vla_sim/config/config.yaml
  • src/vla_sim/config/control/picknik_kinova_gen3.ros2_control.yaml
  • src/vla_sim/config/moveit/joint_jog.yaml
  • src/vla_sim/config/moveit/joint_limits.yaml
  • src/vla_sim/config/moveit/picknik_kinova_gen3_base.srdf
  • src/vla_sim/config/moveit/pose_ik_distance.yaml
  • src/vla_sim/config/moveit/pose_jog.yaml
  • src/vla_sim/config/moveit/sensors_3d.yaml
  • src/vla_sim/config/vla_serving.yaml
  • src/vla_sim/description/mujoco/assets/kinova/base_link.STL
  • src/vla_sim/description/mujoco/assets/kinova/base_link.mtl
  • src/vla_sim/description/mujoco/assets/kinova/bracelet_no_vision_link.STL
  • src/vla_sim/description/mujoco/assets/kinova/bracelet_no_vision_link.mtl
  • src/vla_sim/description/mujoco/assets/kinova/bracelet_with_vision_link.STL
  • src/vla_sim/description/mujoco/assets/kinova/bracelet_with_vision_link.mtl
  • src/vla_sim/description/mujoco/assets/kinova/end_effector_link.STL
  • src/vla_sim/description/mujoco/assets/kinova/forearm_link.STL
  • src/vla_sim/description/mujoco/assets/kinova/forearm_link.mtl
  • src/vla_sim/description/mujoco/assets/kinova/half_arm_1_link.STL
  • src/vla_sim/description/mujoco/assets/kinova/half_arm_1_link.mtl
  • src/vla_sim/description/mujoco/assets/kinova/half_arm_2_link.STL
  • src/vla_sim/description/mujoco/assets/kinova/half_arm_2_link.mtl
  • src/vla_sim/description/mujoco/assets/kinova/shoulder_link.STL
  • src/vla_sim/description/mujoco/assets/kinova/shoulder_link.mtl
  • src/vla_sim/description/mujoco/assets/kinova/spherical_wrist_1_link.STL
  • src/vla_sim/description/mujoco/assets/kinova/spherical_wrist_1_link.mtl
  • src/vla_sim/description/mujoco/assets/kinova/spherical_wrist_2_link.STL
  • src/vla_sim/description/mujoco/assets/kinova/spherical_wrist_2_link.mtl
  • src/vla_sim/description/mujoco/assets/rafti_finger.mtl
  • src/vla_sim/description/mujoco/assets/rafti_finger_collision_1.mtl
  • src/vla_sim/description/mujoco/assets/rafti_finger_collision_2.mtl
  • src/vla_sim/description/mujoco/assets/rafti_finger_collision_3.mtl
  • src/vla_sim/description/mujoco/assets/rafti_finger_collision_4.mtl
  • src/vla_sim/description/mujoco/assets/robotiq_2f85/base.stl
  • src/vla_sim/description/mujoco/assets/robotiq_2f85/finger_link.stl
  • src/vla_sim/description/mujoco/assets/robotiq_2f85/finger_tip_link.stl
  • src/vla_sim/description/mujoco/assets/robotiq_2f85/inner_knuckle_link.stl
  • src/vla_sim/description/mujoco/assets/robotiq_2f85/knuckle_link.stl
  • src/vla_sim/description/mujoco/assets/robotiq_2f85/pad.stl
  • src/vla_sim/description/mujoco/assets/robotiq_2f85/silicone_pad.stl
  • src/vla_sim/description/mujoco/cube_stack_scene.xml
  • src/vla_sim/description/mujoco/gen3_7dof.xml
  • src/vla_sim/description/picknik_kinova_gen3.xacro
  • src/vla_sim/docker/Dockerfile.vla_inference_server
  • src/vla_sim/docker/README.md
  • src/vla_sim/docker/test_vla_inference_server.py
  • src/vla_sim/docker/vla_inference_server.py
  • src/vla_sim/hf_cache/.gitkeep
  • src/vla_sim/launch/agent_bridge.launch.xml
  • src/vla_sim/models/.gitkeep
  • src/vla_sim/objectives/execute_color_stack_policy.xml
  • src/vla_sim/objectives/reset_simulation.xml
  • src/vla_sim/package.xml
  • src/vla_sim/script/get_action_chunk_adapter.py
  • src/vla_sim/test/test_get_action_chunk_adapter.py
  • src/vla_sim/waypoints/waypoints.yaml
🚧 Files skipped from review as they are similar to previous changes (19)
  • src/vla_sim/description/mujoco/assets/kinova/bracelet_with_vision_link.STL
  • src/vla_sim/description/mujoco/assets/robotiq_2f85/finger_link.stl
  • src/vla_sim/description/mujoco/assets/kinova/bracelet_no_vision_link.STL
  • src/vla_sim/description/mujoco/assets/robotiq_2f85/base.stl
  • src/vla_sim/description/mujoco/assets/kinova/spherical_wrist_1_link.STL
  • src/vla_sim/config/moveit/pose_ik_distance.yaml
  • src/vla_sim/description/mujoco/assets/rafti_finger_collision_4.mtl
  • src/vla_sim/description/mujoco/assets/kinova/bracelet_no_vision_link.mtl
  • src/vla_sim/description/mujoco/assets/robotiq_2f85/silicone_pad.stl
  • src/vla_sim/description/mujoco/assets/kinova/spherical_wrist_1_link.mtl
  • src/vla_sim/description/mujoco/assets/rafti_finger_collision_3.mtl
  • src/vla_sim/description/mujoco/assets/robotiq_2f85/inner_knuckle_link.stl
  • src/vla_sim/description/mujoco/assets/kinova/half_arm_1_link.mtl
  • src/vla_sim/description/mujoco/assets/kinova/half_arm_2_link.mtl
  • src/vla_sim/description/mujoco/assets/kinova/shoulder_link.mtl
  • src/vla_sim/README.md
  • src/vla_sim/docker/Dockerfile.vla_inference_server
  • src/vla_sim/description/mujoco/assets/kinova/base_link.mtl
  • .gitignore

Comment thread src/vla_sim/config/moveit/picknik_kinova_gen3_base.srdf
Comment thread src/vla_sim/description/mujoco/assets/kinova/end_effector_link.STL
@fdavulcu
fdavulcu marked this pull request as ready for review July 30, 2026 12:40

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🧹 Nitpick comments (8)
src/vla_sim/docker/README.md (1)

52-56: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Mention the USER/HOME env for the mapped-uid dev run.

The compose service sets USER=vla and HOME=/tmp precisely because the image only has a passwd entry for uid 1000 (getpass.getuser() in torch's cache-dir setup). A bare docker run --user $(id -u):$(id -g) per this section lacks both, so the documented dev path can fail where compose succeeds.

📝 Suggested doc addition
 For development without compose, run the image directly with
 `--user $(id -u):$(id -g)` (the image defaults to uid 1000, so bind-mounted
-files otherwise end up owned by that uid) and mount a Hugging Face cache
+files otherwise end up owned by that uid), add `-e USER=vla -e HOME=/tmp`
+(the image ships a passwd entry for uid 1000 only), and mount a Hugging Face cache
 (`-v "$PWD/../hf_cache:/hf" -e HF_HOME=/hf`) so multi-GB checkpoint downloads
 persist there instead of filling the container's writable layer.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/vla_sim/docker/README.md` around lines 52 - 56, Update the
direct-development docker command documentation to include the same USER=vla and
HOME=/tmp environment settings used by the compose service. Keep the existing
mapped-UID and Hugging Face cache mounts intact so getpass.getuser() and torch
cache setup work for non-default host UIDs.
src/vla_sim/CMakeLists.txt (1)

31-35: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Prefer CMAKE_CURRENT_SOURCE_DIR for the test working directory.

Equivalent today, but CMAKE_SOURCE_DIR breaks if this package is ever consumed via add_subdirectory.

♻️ Proposed tweak
   ament_add_pytest_test(test_get_action_chunk_adapter
     test/test_get_action_chunk_adapter.py
     TIMEOUT 60
-    WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
+    WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
   )
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/vla_sim/CMakeLists.txt` around lines 31 - 35, Update the
WORKING_DIRECTORY argument in the ament_add_pytest_test declaration for
test_get_action_chunk_adapter to use CMAKE_CURRENT_SOURCE_DIR instead of
CMAKE_SOURCE_DIR, preserving the existing test configuration.
src/vla_sim/config/config.yaml (1)

106-117: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

twist_controller and fault_controller are configured but never spawned.

Both are declared in config/control/picknik_kinova_gen3.ros2_control.yaml (lines 8-9, 13-14) yet appear in neither startup list nor controllers_not_managed, so their parameter blocks are dead config. Either list them as inactive-at-startup or drop them from the controller config.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/vla_sim/config/config.yaml` around lines 106 - 117, Update the controller
configuration so twist_controller and fault_controller are not left unspawned:
add both to controllers_inactive_at_startup if they should remain available for
later activation, or remove their parameter blocks from the controller
configuration if they are unused. Keep the startup and management lists
consistent with the intended controller lifecycle.
src/vla_sim/package.xml (1)

46-48: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

ament_lint_auto_find_test_dependencies() will find no linters.

CMakeLists.txt line 37 calls it, but no linter packages are declared here, so linting silently no-ops. Add ament_lint_common (or the specific linters you want) if lint coverage is intended.

♻️ Proposed addition
   <test_depend>ament_cmake_pytest</test_depend>
   <test_depend>ament_lint_auto</test_depend>
+  <test_depend>ament_lint_common</test_depend>
   <test_depend>python3-pytest</test_depend>
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/vla_sim/package.xml` around lines 46 - 48, Add a test dependency on
ament_lint_common in package.xml so ament_lint_auto_find_test_dependencies() in
CMakeLists.txt discovers the standard linters; keep the existing pytest
dependencies unchanged.
src/vla_sim/description/mujoco/gen3_7dof.xml (2)

363-363: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Unnamed body. The gripper mount body has no name, so it can only be referenced by index and shows up anonymously in TF/debug output. Naming it (e.g. gripper_mount) costs nothing and helps when inspecting the tree.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/vla_sim/description/mujoco/gen3_7dof.xml` at line 363, Add a descriptive
name attribute, such as gripper_mount, to the gripper mount body declaration
identified by childclass="2f85", preserving its existing hierarchy and
configuration.

184-188: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Unused mesh declarations. rafti_finger and rafti_finger_collision_1..4 are declared but no geom in worldbody references them; the gripper uses the robotiq_85_* meshes. Consider dropping them (and their .mtl assets) unless a downstream include consumes them.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/vla_sim/description/mujoco/gen3_7dof.xml` around lines 184 - 188, Remove
the unused mesh declarations rafti_finger and rafti_finger_collision_1 through
rafti_finger_collision_4 from the MuJoCo model, along with their corresponding
.mtl assets if they are not consumed by downstream includes. Preserve the
existing robotiq_85_* mesh declarations and references.
src/vla_sim/description/mujoco/cube_stack_scene.xml (1)

27-29: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Root-level geom solref also retunes the robot's contacts. This unnamed <default> merges with the root default from the included gen3_7dof.xml, so every robot geom that doesn't set solref (all the arm collision meshes) also gets .004 1, not just the scene geoms. If only the table/floor/cubes were meant to be stiff, set solref on those geoms directly (the cubes already do at Lines 161, 174, 187).

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/vla_sim/description/mujoco/cube_stack_scene.xml` around lines 27 - 29,
Remove the root-level default geom solref override and apply the intended .004 1
solref directly to the table and floor geoms, leaving the existing cube solref
settings unchanged. Ensure robot geoms inherited from gen3_7dof.xml retain their
original contact parameters.
src/vla_sim/launch/agent_bridge.launch.xml (1)

6-24: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Consider exposing http_timeout as a launch arg. The README's troubleshooting row tells operators to raise the adapter's http_timeout alongside policy_call_timeout, but the only way to do that today is editing this file (the node declares the parameter with a 9.0 default). An arg mirrors the infer_url pattern.

♻️ Proposed change
   <arg
     name="infer_url"
     default="$(env INFER_URL 'http://127.0.0.1:8973/infer')"
   />
+  <!-- Keep strictly below ExecutePolicy's policy_call_timeout. -->
+  <arg name="http_timeout" default="9.0" />
   <include
     file="$(find-pkg-share moveit_studio_agent)/launch/studio_agent_bridge.launch.xml"
   />
@@
     <param name="infer_url" value="$(var infer_url)" />
+    <param name="http_timeout" value="$(var http_timeout)" />
   </node>
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/vla_sim/launch/agent_bridge.launch.xml` around lines 6 - 24, Expose the
adapter’s http_timeout as a launch argument alongside infer_url, using the
adapter’s existing 9.0-second default. Pass that argument into the
get_action_chunk_adapter node as its http_timeout parameter so operators can
override it without editing the launch file.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@src/vla_sim/README.md`:
- Line 131: Update the timeout guidance in the README table to require the
adapter node’s http_timeout to be strictly below the objective’s
policy_call_timeout, matching get_action_chunk_adapter.py and preventing equal
budgets.

---

Nitpick comments:
In `@src/vla_sim/CMakeLists.txt`:
- Around line 31-35: Update the WORKING_DIRECTORY argument in the
ament_add_pytest_test declaration for test_get_action_chunk_adapter to use
CMAKE_CURRENT_SOURCE_DIR instead of CMAKE_SOURCE_DIR, preserving the existing
test configuration.

In `@src/vla_sim/config/config.yaml`:
- Around line 106-117: Update the controller configuration so twist_controller
and fault_controller are not left unspawned: add both to
controllers_inactive_at_startup if they should remain available for later
activation, or remove their parameter blocks from the controller configuration
if they are unused. Keep the startup and management lists consistent with the
intended controller lifecycle.

In `@src/vla_sim/description/mujoco/cube_stack_scene.xml`:
- Around line 27-29: Remove the root-level default geom solref override and
apply the intended .004 1 solref directly to the table and floor geoms, leaving
the existing cube solref settings unchanged. Ensure robot geoms inherited from
gen3_7dof.xml retain their original contact parameters.

In `@src/vla_sim/description/mujoco/gen3_7dof.xml`:
- Line 363: Add a descriptive name attribute, such as gripper_mount, to the
gripper mount body declaration identified by childclass="2f85", preserving its
existing hierarchy and configuration.
- Around line 184-188: Remove the unused mesh declarations rafti_finger and
rafti_finger_collision_1 through rafti_finger_collision_4 from the MuJoCo model,
along with their corresponding .mtl assets if they are not consumed by
downstream includes. Preserve the existing robotiq_85_* mesh declarations and
references.

In `@src/vla_sim/docker/README.md`:
- Around line 52-56: Update the direct-development docker command documentation
to include the same USER=vla and HOME=/tmp environment settings used by the
compose service. Keep the existing mapped-UID and Hugging Face cache mounts
intact so getpass.getuser() and torch cache setup work for non-default host
UIDs.

In `@src/vla_sim/launch/agent_bridge.launch.xml`:
- Around line 6-24: Expose the adapter’s http_timeout as a launch argument
alongside infer_url, using the adapter’s existing 9.0-second default. Pass that
argument into the get_action_chunk_adapter node as its http_timeout parameter so
operators can override it without editing the launch file.

In `@src/vla_sim/package.xml`:
- Around line 46-48: Add a test dependency on ament_lint_common in package.xml
so ament_lint_auto_find_test_dependencies() in CMakeLists.txt discovers the
standard linters; keep the existing pytest dependencies unchanged.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 45415e94-1020-4436-a510-12adccdcad0b

📥 Commits

Reviewing files that changed from the base of the PR and between 42d3895 and d997b28.

⛔ Files ignored due to path filters (14)
  • src/vla_sim/description/mujoco/assets/kinova/base_link.obj is excluded by !**/*.obj
  • src/vla_sim/description/mujoco/assets/kinova/bracelet_no_vision_link.obj is excluded by !**/*.obj
  • src/vla_sim/description/mujoco/assets/kinova/bracelet_with_vision_link.obj is excluded by !**/*.obj
  • src/vla_sim/description/mujoco/assets/kinova/forearm_link.obj is excluded by !**/*.obj
  • src/vla_sim/description/mujoco/assets/kinova/half_arm_1_link.obj is excluded by !**/*.obj
  • src/vla_sim/description/mujoco/assets/kinova/half_arm_2_link.obj is excluded by !**/*.obj
  • src/vla_sim/description/mujoco/assets/kinova/shoulder_link.obj is excluded by !**/*.obj
  • src/vla_sim/description/mujoco/assets/kinova/spherical_wrist_1_link.obj is excluded by !**/*.obj
  • src/vla_sim/description/mujoco/assets/kinova/spherical_wrist_2_link.obj is excluded by !**/*.obj
  • src/vla_sim/description/mujoco/assets/rafti_finger.obj is excluded by !**/*.obj
  • src/vla_sim/description/mujoco/assets/rafti_finger_collision_1.obj is excluded by !**/*.obj
  • src/vla_sim/description/mujoco/assets/rafti_finger_collision_2.obj is excluded by !**/*.obj
  • src/vla_sim/description/mujoco/assets/rafti_finger_collision_3.obj is excluded by !**/*.obj
  • src/vla_sim/description/mujoco/assets/rafti_finger_collision_4.obj is excluded by !**/*.obj
📒 Files selected for processing (60)
  • .dockerignore
  • .gitignore
  • docker-compose.yaml
  • src/vla_sim/CMakeLists.txt
  • src/vla_sim/README.md
  • src/vla_sim/config/config.yaml
  • src/vla_sim/config/control/picknik_kinova_gen3.ros2_control.yaml
  • src/vla_sim/config/moveit/joint_jog.yaml
  • src/vla_sim/config/moveit/joint_limits.yaml
  • src/vla_sim/config/moveit/picknik_kinova_gen3_base.srdf
  • src/vla_sim/config/moveit/pose_ik_distance.yaml
  • src/vla_sim/config/moveit/pose_jog.yaml
  • src/vla_sim/config/moveit/sensors_3d.yaml
  • src/vla_sim/config/vla_serving.yaml
  • src/vla_sim/description/mujoco/assets/kinova/base_link.STL
  • src/vla_sim/description/mujoco/assets/kinova/base_link.mtl
  • src/vla_sim/description/mujoco/assets/kinova/bracelet_no_vision_link.STL
  • src/vla_sim/description/mujoco/assets/kinova/bracelet_no_vision_link.mtl
  • src/vla_sim/description/mujoco/assets/kinova/bracelet_with_vision_link.STL
  • src/vla_sim/description/mujoco/assets/kinova/bracelet_with_vision_link.mtl
  • src/vla_sim/description/mujoco/assets/kinova/end_effector_link.STL
  • src/vla_sim/description/mujoco/assets/kinova/forearm_link.STL
  • src/vla_sim/description/mujoco/assets/kinova/forearm_link.mtl
  • src/vla_sim/description/mujoco/assets/kinova/half_arm_1_link.STL
  • src/vla_sim/description/mujoco/assets/kinova/half_arm_1_link.mtl
  • src/vla_sim/description/mujoco/assets/kinova/half_arm_2_link.STL
  • src/vla_sim/description/mujoco/assets/kinova/half_arm_2_link.mtl
  • src/vla_sim/description/mujoco/assets/kinova/shoulder_link.STL
  • src/vla_sim/description/mujoco/assets/kinova/shoulder_link.mtl
  • src/vla_sim/description/mujoco/assets/kinova/spherical_wrist_1_link.STL
  • src/vla_sim/description/mujoco/assets/kinova/spherical_wrist_1_link.mtl
  • src/vla_sim/description/mujoco/assets/kinova/spherical_wrist_2_link.STL
  • src/vla_sim/description/mujoco/assets/kinova/spherical_wrist_2_link.mtl
  • src/vla_sim/description/mujoco/assets/rafti_finger.mtl
  • src/vla_sim/description/mujoco/assets/rafti_finger_collision_1.mtl
  • src/vla_sim/description/mujoco/assets/rafti_finger_collision_2.mtl
  • src/vla_sim/description/mujoco/assets/rafti_finger_collision_3.mtl
  • src/vla_sim/description/mujoco/assets/rafti_finger_collision_4.mtl
  • src/vla_sim/description/mujoco/assets/robotiq_2f85/base.stl
  • src/vla_sim/description/mujoco/assets/robotiq_2f85/finger_link.stl
  • src/vla_sim/description/mujoco/assets/robotiq_2f85/finger_tip_link.stl
  • src/vla_sim/description/mujoco/assets/robotiq_2f85/inner_knuckle_link.stl
  • src/vla_sim/description/mujoco/assets/robotiq_2f85/knuckle_link.stl
  • src/vla_sim/description/mujoco/assets/robotiq_2f85/pad.stl
  • src/vla_sim/description/mujoco/assets/robotiq_2f85/silicone_pad.stl
  • src/vla_sim/description/mujoco/cube_stack_scene.xml
  • src/vla_sim/description/mujoco/gen3_7dof.xml
  • src/vla_sim/description/picknik_kinova_gen3.xacro
  • src/vla_sim/docker/Dockerfile.vla_inference_server
  • src/vla_sim/docker/README.md
  • src/vla_sim/docker/test_vla_inference_server.py
  • src/vla_sim/docker/vla_inference_server.py
  • src/vla_sim/hf_cache/.gitkeep
  • src/vla_sim/launch/agent_bridge.launch.xml
  • src/vla_sim/models/.gitkeep
  • src/vla_sim/objectives/stack_cubes_with_the_vla_policy.xml
  • src/vla_sim/package.xml
  • src/vla_sim/script/get_action_chunk_adapter.py
  • src/vla_sim/test/test_get_action_chunk_adapter.py
  • src/vla_sim/waypoints/waypoints.yaml
🚧 Files skipped from review as they are similar to previous changes (13)
  • src/vla_sim/description/mujoco/assets/robotiq_2f85/inner_knuckle_link.stl
  • src/vla_sim/config/moveit/joint_jog.yaml
  • src/vla_sim/description/mujoco/assets/robotiq_2f85/base.stl
  • src/vla_sim/description/mujoco/assets/kinova/bracelet_with_vision_link.mtl
  • src/vla_sim/description/mujoco/assets/rafti_finger_collision_3.mtl
  • src/vla_sim/description/mujoco/assets/kinova/bracelet_with_vision_link.STL
  • src/vla_sim/description/mujoco/assets/kinova/half_arm_1_link.STL
  • src/vla_sim/description/mujoco/assets/rafti_finger.mtl
  • src/vla_sim/description/mujoco/assets/kinova/shoulder_link.STL
  • src/vla_sim/description/mujoco/assets/kinova/base_link.mtl
  • .gitignore
  • src/vla_sim/description/mujoco/assets/kinova/spherical_wrist_1_link.mtl
  • src/vla_sim/description/mujoco/assets/kinova/half_arm_2_link.mtl

Comment thread src/vla_sim/README.md Outdated
@github-actions

Copy link
Copy Markdown

MoveIt Pro Example WS - Objectives Integration Test Report

@github-actions

Copy link
Copy Markdown

MoveIt Pro Example WS - Objectives Integration Test Report

@github-actions

Copy link
Copy Markdown

MoveIt Pro Example WS - Objectives Integration Test Report

@github-actions

github-actions Bot commented Aug 3, 2026

Copy link
Copy Markdown

MoveIt Pro Example WS - Objectives Integration Test Report

Comment thread docker-compose.yaml
@JWhitleyWork

Copy link
Copy Markdown
Member

Also, PR needs a rebase after we renamed agent_bridge to runtime.

@danwahl danwahl left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Tested and seems to be working well overall. Two small changes needed.

Comment thread src/vla_sim/description/picknik_kinova_gen3.xacro
Comment thread src/vla_sim/config/vla_serving.yaml Outdated
@github-actions

github-actions Bot commented Aug 4, 2026

Copy link
Copy Markdown

MoveIt Pro Example WS - Objectives Integration Test Report

1 similar comment
@github-actions

github-actions Bot commented Aug 4, 2026

Copy link
Copy Markdown

MoveIt Pro Example WS - Objectives Integration Test Report

@github-actions

github-actions Bot commented Aug 4, 2026

Copy link
Copy Markdown

MoveIt Pro Example WS - Objectives Integration Test Report

@danwahl danwahl left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

[written by AI]

Approving. I ran this branch end to end at da2ee41c against a freshly rebuilt core.

Two small things:

1. /joint_commands is only ever published by quest_oculus_teleop.

No controller publishes to it. I recorded 75 s of real arm motion driven by ExecutePolicy and the topic carried zero messages; a separate gripper-driven recording did the same.

2. The policy adapter only runs on the runtime path.

get_action_chunk_adapter.py is launched from launch/runtime.launch.xml, so /get_action_chunk is absent under agent_robot.app and Stack Cubes with the VLA Policy fails there until you start the adapter by hand.

One other small note on docker/README.md: the compose-free docker run fallback omits --gpus all, so following it verbatim on an NVIDIA machine gets you device: auto resolving to CPU.

danwahl

This comment was marked as duplicate.

@danwahl
danwahl dismissed their stale review August 5, 2026 19:47

Duplicate submission — see the identical approval above.

danwahl
danwahl previously approved these changes Aug 5, 2026
@github-actions

github-actions Bot commented Aug 6, 2026

Copy link
Copy Markdown

MoveIt Pro Example WS - Objectives Integration Test Report

@JWhitleyWork
JWhitleyWork enabled auto-merge August 6, 2026 16:49
@JWhitleyWork
JWhitleyWork merged commit f9f967b into main Aug 6, 2026
12 of 14 checks passed
@JWhitleyWork
JWhitleyWork deleted the 20588-vla-sim branch August 6, 2026 17:32
@github-actions

github-actions Bot commented Aug 6, 2026

Copy link
Copy Markdown

MoveIt Pro Example WS - Objectives Integration Test Report

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.

4 participants