VLA Trajectory Preview
A robot arm outputs numbers — this is how you finally see them
- actions
- embodiment
- trajectory_plot
The first time you run a VLA (vision-language-action) policy, you get a shock: the model doesn't produce a video of a robot arm moving, it produces a wall of numbers - an action chunk of positions, rotations, gripper states, and occasionally a head pan. That's technically correct and completely unreadable. VLA Trajectory Preview is the node that turns those numbers into a plot you can actually look at, right in the ComfyUI graph.
It's part of the robotics layer of gokayfem's VLM_nodes pack. That layer is honest about what it is: these nodes build and inspect policy observations and actions, but they never send commands to robot hardware. The policy runs live in an isolated LeRobot/openpi/GR00T environment, and ComfyUI is the place where you look at what the policy decided. This node is the "looking at it" part.
How it works
You feed it a VLA_ACTIONS socket - the same typed action chunk that comes out of any of the pack's policy nodes (VLA Policy - Universal HTTP, the OpenPI WebSocket client, or the GR00T ZMQ client). It renders each predicted action dimension as its own series across the action horizon, drawing onto a canvas sized by width and height. The optional VLA_EMBODIMENT input gives it context about which action dimensions mean what, so the plot stays meaningful instead of just being raw channels.
The output is a single IMAGE socket called trajectory_plot - drop it into any image preview or save node. Nothing runs a model, nothing downloads weights, nothing touches hardware. It's pure rendering, which means it's instant and free to put in the loop.
Inputs and outputs that matter
Only three inputs to think about:
- actions (
VLA_ACTIONS, required) - the action chunk. This must come from one of the pack's VLA policy nodes; it isn't something you type in. - width / height - canvas size, defaulting to 960×480. Bigger plot = easier to read a noisy trajectory; you don't need 4K for this.
- embodiment (optional
VLA_EMBODIMENT) - wire it if you have one; it improves how the dimensions are labeled.
That's the whole thing. One image out, one image to look at.
Installing this pack
VLM_nodes is one pack, so install is identical for every node here. Easiest path is ComfyUI Manager - search for VLM_nodes (the repo title is ComfyUI_VLM_nodes) and hit install. Or clone it manually:
cd ComfyUI/custom_nodes
git clone https://github.com/gokayfem/ComfyUI_VLM_nodes
cd ComfyUI_VLM_nodes
python -m pip install -r requirements.txt
Run pip with ComfyUI's own Python, not a random venv. Note the robotics nodes are split: the universal HTTP client needs nothing extra, but the native openpi/GR00T clients pull from an optional extra:
python -m pip install -r ComfyUI/custom_nodes/ComfyUI_VLM_nodes/requirements-robotics-client.txt
For just this preview node, you need neither extra - it's pure plotting.
Common issues
The most common "problem" isn't a bug, it's a missing upstream: VLA_Trajectory Preview needs an actual VLA_ACTIONS socket, which means a policy node has to run first, which means you have a real VLA runtime available. If your graph errors with a type mismatch here, the issue is upstream, not in the plot. Also keep expectations realistic - this previews what the policy predicted, not what the robot actually did. For checking real-world execution, you'd compare it against recorded telemetry, not against this plot.
Inputs (4)
| Name | Type | Default | Description |
|---|---|---|---|
| actions | VLA_ACTIONS | — | |
| width | INT | 960320–2048 | — |
| height | INT | 480240–1536 | — |
| embodimentopt | VLA_EMBODIMENT | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| trajectory_plot | IMAGE | — |