Example setup and workflow for controlling a Vention linear rail with a Universal Robot using the Vention URCap and Grasshopper Robots plugin.
This repo demonstrates how to control a Vention linear rail with a Universal Robot using custom URCap init commands, enabling positional shifts along the rail without treating it as a true 7th axis. The rail movement is embedded directly inside the generated .URP program, meaning each program automatically drives the rail to the required position before execution.
A URCap is Universal Robots’ pluggable extension framework—custom software that adds features to Polyscope (UI panels, commands, drivers, hardware integrations). In this case, the Vention URCap exposes rail-control commands that can be injected into the robot program.
Instead of adding an external axis to the full kinematic solution, this workflow splits the toolpath into sequential programs (target groups). For each target group, the closest point on the rail is calculated in Rhino, and this position is used to generate a URCap rail-move command embedded directly inside the .URP program. This ensures that each program automatically repositions the rail, enabling continuous milling across a long work area.
Target Group ⟶ Compute Closest Rail Pos ⟶ Embed Rail Move Cmd ⟶ Upload Program ⟶ Execute ⟶ Next Target Group
Because UR kinematics does not track TCP motion during rail travel (the rail is not part of the robot model), the rail must reposition first—then the motion plan starts relative to the new base frame. This method effectively simulates external axis capability.
As noted in the Robots plugin discussion, UR robots currently do not support a native 7th-axis kinematic integration. Reference: Robots Issue #106
For automatic execution of consecutive programs, see the companion repo: 👉 UR RTDE Program Cue Loop in Grasshopper
- Vention Linear Rails — Product Page
- Vention MachineMotion Controller — Product Page
- Vention URCap — Product Page
Documentation for the controller and URCap: Online Documentation | PDFs
⚠️ The workflow has been tested with MachineMotion Controller V1 (supports up to 3 drives simultaneously), which is now discontinued.
- Robots (by visose) — Core plugin for generating UR programs and controlling robot motion.
- Heteroptera (by Amin Bahrami) — Manages data flow and event triggers within Grasshopper.
- Pufferfish (by ekimroyrp) — Provides additional workflow logic and utility components.
To extract a URCap command, first create a program on the teaching pendant by adding the URCap function you want to isolate. Save the program, then open it on your computer with a text editor to identify the relevant command lines.
A detailed guide by Robin Godwyll explains this process:
YouTube Video: UR Robot Grippers and URCaps in Grasshopper
-
Always include the Installation section of the URCap as the first custom command in your program. Without it, the connected device may misbehave because certain initialization requirements are missing.
-
From our experience:
- The Move command works correctly without the installation node.
- The Home command fails without it—it keeps homing indefinitely and does not detect the end-stop switch, leaving the rail position unzeroed.
This Grasshopper file lists existing commands (currently basic; will be updated over time):
📂 URCap_VentionRail_CustomCommands.gh
The Move and Home commands are made parametric via a simple GH Python script component. Inputs include:
- Axis selection – The controller supports up to 3 axes.
- Speed (mm/s)
- Acceleration (mm/s²)
- Position (mm along the rail; absolute from home point 0mm)
🐍 Python scripts:
📂 Grasshopper file:
URCap_VentionRail_Basic.gh
This example demonstrates a basic strategy for following a continuous toolpath while moving the robot’s base along the rail, successfully working around the lack of 7th-axis kinematic integration.
It illustrates:
- Sequential program playback: splitting the toolpath into target groups.
- URCap move command embedded as an init custom command in the "Create Program" component of the Robots plugin.
⚠️ Note: This simple example does not include retracting targets. It only demonstrates the basic principle of continuous motion along the rail.
📂 Grasshopper file:
URCap_VentionRail_Advanced.gh
This advanced example adds homing and retraction to the workflow:
- Begins with a homing sequence for the rail and TCP pose.
- Proceeds through multiple target groups with complex toolpaths.
- Supports upside-down milling and maximizes the robot arm’s reach over a larger workpiece.
Key concept: Since the TCP cannot track continuous motion along a non-existent 7th axis, each program segment begins with a rail reposition. The TCP is safely retracted before moving to a new segment to avoid collisions, ensuring proper alignment for the next target group.
target group ⟶ retract TCP ⟶ move rail ⟶ update base ⟶ execute toolpath ⟶ next target
URCap_VentionRail_Advanced.mp4
Demo_Rail_RDFLab.mp4
UR_Milling_Cue_Loop.mp4
Contributions and suggestions are welcome. Please submit a pull request or open an issue to discuss improvements.
This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.
This project was developed in close collaboration with research assistant Sujay Kumarji at the FIU RDFlab.
I am grateful to Luigi Pacheco, director of the Interactive Machines Lab at the School of Architecture, Florida Atlantic University, for granting access to robotic equipment that provided additional support for this work.
Special thanks to Robin Godwyll for his extensive documentation on integrating Universal Robots with the Robots plugin. His expertise, particularly demonstrated in the 2025 Robotic Timber Studio Course at the IKON Institute at TU Braunschweig, was a key inspiration for this project.
Finally, I would like to acknowledge visose for developing, maintaining, and open-sourcing Robots for Grasshopper — a tool without which this workflow would not have been possible.




