UnderAutomation.UniversalRobots 9.5.0

dotnet add package UnderAutomation.UniversalRobots --version 9.5.0
                    
NuGet\Install-Package UnderAutomation.UniversalRobots -Version 9.5.0
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="UnderAutomation.UniversalRobots" Version="9.5.0" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="UnderAutomation.UniversalRobots" Version="9.5.0" />
                    
Directory.Packages.props
<PackageReference Include="UnderAutomation.UniversalRobots" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add UnderAutomation.UniversalRobots --version 9.5.0
                    
#r "nuget: UnderAutomation.UniversalRobots, 9.5.0"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package UnderAutomation.UniversalRobots@9.5.0
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=UnderAutomation.UniversalRobots&version=9.5.0
                    
Install as a Cake Addin
#tool nuget:?package=UnderAutomation.UniversalRobots&version=9.5.0
                    
Install as a Cake Tool

Universal Robots Communication SDK for .NET

UnderAutomation Universal Robots communication SDK

NuGet NuGet downloads .NET Framework .NET Standard .NET License

UnderAutomation.UniversalRobots is a fully managed .NET SDK that communicates with Universal Robots cobots (CB-Series, e-Series and the newer models, PolyScope and PolyScope X) through the standard interfaces of the controller: RTDE, Primary Interface, Dashboard Server, REST API, XML-RPC, sockets, Interpreter Mode, SSH and SFTP. It also computes the forward and inverse kinematics offline. No URCap and no option is needed on the robot.

It works with real robots and with the URSim simulator.

Introduction video:

https://user-images.githubusercontent.com/47540360/143318635-6d6aaaf4-5642-457a-8ff1-4322f2defe82.mp4

What you can do

  • RTDE: read the robot data and write inputs and registers, at up to 500 Hz. Read the software version, the control box and the tool flange of the controller.
  • Primary Interface: send URScript commands, read the robot state about 10 times per second, read the global variables of the program.
  • Dashboard Server (PolyScope) and REST API (PolyScope X): power, brakes, programs, robot and safety modes, popups. One interface, IRobotDashboard, for both. Program files of PolyScope X: list, upload and download.
  • XML-RPC: answer the function calls of a URScript program from your .NET code.
  • Socket communication: exchange messages with a URScript program.
  • Interpreter Mode: send URScript lines to a running program.
  • SSH and SFTP: run commands on the controller, upload, download and delete files.
  • Kinematics: forward and inverse kinematics for every UR model, without connection.
  • Files: read .urp programs, .installation files and archives.

Example applications

The release page of this repository gives ready-to-run applications. Their source code is in this repository.

Windows Forms application

UnderAutomation.UniversalRobots.Showcase.Forms shows every feature of the SDK. A Visual Basic version is in UnderAutomation.UniversalRobots.Showcase.Forms.vb.

Download: UnderAutomation.UniversalRobots.Showcase.Forms.exe (all releases)

Windows Forms application

Console application for Linux, macOS and Windows

UnderAutomation.UniversalRobots.Showcase.Console is built for 6 platforms. Each file runs alone, without the .NET runtime installed. Use it to try the SDK on Linux, macOS or an ARM board without writing code.

OS Architecture Download
Linux ARM UnderAutomation.UniversalRobots.Showcase.Console.linux-arm
Linux x64 UnderAutomation.UniversalRobots.Showcase.Console.linux-x64
macOS ARM64 UnderAutomation.UniversalRobots.Showcase.Console.osx-arm64
macOS x64 UnderAutomation.UniversalRobots.Showcase.Console.osx-x64
Windows x64 UnderAutomation.UniversalRobots.Showcase.Console.win-x64.exe
Windows x86 UnderAutomation.UniversalRobots.Showcase.Console.win-x86.exe

On Linux and macOS, make the file executable first (chmod +x <file>).

Console application

Installation

dotnet add package UnderAutomation.UniversalRobots

Or with the NuGet Package Manager console:

Install-Package UnderAutomation.UniversalRobots

You can also download UnderAutomation.UniversalRobots.zip from the releases page. It contains one folder per target framework. On Windows, unblock the zip file before you extract it (right-click, "Properties", "Unblock"), then reference the DLL of your framework.

Getting started

using UnderAutomation.UniversalRobots;

// The SDK runs in trial mode for 30 days. Register your key to remove the trial limit.
UR.RegisterLicense("Your Company", "your-license-key");

var robot = new UR();

var parameters = new ConnectParameters("192.168.0.1");
parameters.Dashboard.Enable = true;
parameters.PrimaryInterface.Enable = true;

robot.Connect(parameters);

Console.WriteLine(robot.Dashboard.GetRobotMode().Value);

robot.Disconnect();

Enable only the interfaces you need in ConnectParameters: Rtde, PrimaryInterface, Dashboard, Rest, XmlRpc, SocketCommunication, InterpreterMode, Ssh.

Features

Real-Time Data Exchange (RTDE)

Read the robot data and write inputs at up to 500 Hz.

var robot = new UR();

var parameters = new ConnectParameters("192.168.0.1");
parameters.Rtde.Enable = true;
parameters.Rtde.Frequency = 500; // Hz

// Data written to the controller
parameters.Rtde.InputSetup.Add(RtdeInputData.StandardAnalogOutput0);
parameters.Rtde.InputSetup.Add(RtdeInputData.InputIntRegisters, 0);

// Data sent by the robot
parameters.Rtde.OutputSetup.Add(RtdeOutputData.ActualTcpPose);
parameters.Rtde.OutputSetup.Add(RtdeOutputData.ToolOutputVoltage);
parameters.Rtde.OutputSetup.Add(RtdeOutputData.OutputDoubleRegisters, 10);

robot.Connect(parameters);

// Raised for each sample
robot.Rtde.OutputDataReceived += (sender, e) =>
    Console.WriteLine(robot.Rtde.OutputDataValues.ActualTcpPose);

// Write inputs
var inputValues = new RtdeInputValues();
inputValues.StandardAnalogOutput0 = 0.2;
inputValues.InputIntRegisters.X0 = 12;
robot.Rtde.WriteInputs(inputValues);

Primary Interface

Send URScript commands and read the robot state about 10 times per second.

robot.PrimaryInterface.Script.Send("movej([-1.5,-1.5,-2,-0.5,1.8,0], a=1.4, v=1.05)");

double x = robot.PrimaryInterface.CartesianInfo.TCPOffsetX;
double shoulderSpeed = robot.PrimaryInterface.JointData.Shoulder.ActualSpeed;

// Global variables of the running program
GlobalVariable myVar = robot.PrimaryInterface.GlobalVariables.GetByName("myVar");
GlobalVariable[] variables = robot.PrimaryInterface.GlobalVariables.GetAll();

Remote control

Power, brakes, programs, robot and safety modes.

// PolyScope: Dashboard Server
robot.Dashboard.PowerOn();
robot.Dashboard.ReleaseBrake();
robot.Dashboard.LoadProgram("prg1.urp");
robot.Dashboard.Play();

// PolyScope X: REST API
robot.Rest.PowerOn();
robot.Rest.BrakeRelease();
robot.Rest.LoadProgram("prg1");
robot.Rest.Play();

The two clients implement IRobotDashboard. Write the code once for PolyScope and PolyScope X:

using UnderAutomation.UniversalRobots;
using UnderAutomation.UniversalRobots.Common;

bool isPolyScopeX = true;

var robot = new UR();
var parameters = new ConnectParameters("192.168.0.1");
parameters.Dashboard.Enable = !isPolyScopeX;
parameters.Rest.Enable = isPolyScopeX;
robot.Connect(parameters);

IRobotDashboard dashboard = isPolyScopeX ? (IRobotDashboard)robot.Rest : robot.Dashboard;

dashboard.PowerOn();
dashboard.ReleaseBrake();
dashboard.LoadProgram("prg1");
dashboard.Play();

RobotDashboardResponse<SafetyModes> safety = dashboard.GetSafetyMode();
Console.WriteLine(safety.Value);

robot.Disconnect();

On PolyScope X, the REST API client also reads and writes the program files:

foreach (RestProgramInfo program in robot.Rest.GetPrograms().Value)
    Console.WriteLine(program.Name);

robot.Rest.UploadProgramFile(@"C:\programs\pick_and_place.urpx");
robot.Rest.DownloadProgramToFile("pick_and_place", @"C:\backup\pick_and_place.urpx");

Forward and inverse kinematics

Computes the joint positions of a Cartesian pose, and the reverse, with an analytical algorithm. No connection is needed.

// Default DH parameters of a UR3e
IUrDhParameters dhParameters = KinematicsUtils.GetDhParametersFromModel(RobotModelsExtended.UR3e);

// Forward kinematics, joint angles in radians
KinematicsResult fkResult = KinematicsUtils.ForwardKinematics(new double[] { 0, -1.57, 1.57, 0, 0, 0 }, dhParameters);

// Inverse kinematics of a pose (x, y, z in m, rotation vector in rad)
var pose = new Pose(0.3, 0.1, 0.4, 0, 3.14, 0);
double[][] ikSolutions = KinematicsUtils.InverseKinematics(pose.FromRotationVectorTo4x4Matrix(), dhParameters);

XML-RPC: call .NET functions from URScript

The URScript program calls a function:

rpc := rpc_factory("xmlrpc", "http://192.168.0.10:50000")
answer := rpc.GetPose(100)

Your .NET code answers:

robot.XmlRpc.XmlRpcServerRequest += (o, request) =>
{
    if (request.MethodName == "GetPose") request.Answer = new Pose(request.Arguments[0], 200, 100, 0, 0, 0);
};

Socket communication

Exchange messages with a URScript program.

robot.SocketCommunication.SocketWrite("Hello, Robot!");
robot.SocketCommunication.SocketRequest += (sender, e) => Console.WriteLine(e.Message);

SFTP

Upload, download and delete files on the controller.

robot.Sftp.UploadFile("my-program.urp", "/programs/my-program.urp");
robot.Sftp.Delete("/programs/old-program.urp");

SSH

Run shell commands on the controller.

robot.Ssh.RunCommand("echo 'Hello' > /home/ur/Desktop/NewFile.txt");

Shell sources

The folder UnderAutomation.UniversalRobots.ObfuscatedSources contains every public type and member of the SDK, with its XML documentation. The bodies of the methods are replaced by "Source is hidden". Use it to:

  • browse the public API and its documentation on GitHub;
  • jump to a definition from your code editor;
  • see the structure of the code that is delivered with a source license.

The source license gives the complete source code of the library, with the Visual Studio solution. See the license page of the documentation.

Compatibility

Target framework Supported
.NET 10.0 / 9.0 / 8.0 / 6.0 / 5.0 yes
.NET Core 3.0 yes
.NET Standard 2.1 / 2.0 yes
.NET Framework 4.0 to 4.8 yes
.NET Framework 3.5 yes
  • Operating systems: Windows, Linux, macOS.
  • No native dependency, no NuGet dependency (except System.Text.Encoding.CodePages for .NET Standard 2.0).
  • Robots: UR3, UR5, UR10 (CB-Series), UR3e, UR5e, UR7e, UR10e, UR12e, UR16e (e-Series), UR8 Long, UR15, UR18, UR20, UR30, with PolyScope or PolyScope X, and URSim.

License

This SDK needs a commercial license. A 30-day trial starts at the first use, no key needed.

Support

Product Compatible and additional computed target framework versions.
.NET net5.0 is compatible.  net5.0-windows was computed.  net6.0 is compatible.  net6.0-android was computed.  net6.0-ios was computed.  net6.0-maccatalyst was computed.  net6.0-macos was computed.  net6.0-tvos was computed.  net6.0-windows was computed.  net7.0 was computed.  net7.0-android was computed.  net7.0-ios was computed.  net7.0-maccatalyst was computed.  net7.0-macos was computed.  net7.0-tvos was computed.  net7.0-windows was computed.  net8.0 is compatible.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed.  net9.0 is compatible.  net9.0-android was computed.  net9.0-browser was computed.  net9.0-ios was computed.  net9.0-maccatalyst was computed.  net9.0-macos was computed.  net9.0-tvos was computed.  net9.0-windows was computed.  net10.0 is compatible.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed. 
.NET Core netcoreapp2.0 was computed.  netcoreapp2.1 was computed.  netcoreapp2.2 was computed.  netcoreapp3.0 is compatible.  netcoreapp3.1 was computed. 
.NET Standard netstandard2.0 is compatible.  netstandard2.1 is compatible. 
.NET Framework net35 is compatible.  net40 is compatible.  net403 was computed.  net45 is compatible.  net451 is compatible.  net452 is compatible.  net46 is compatible.  net461 is compatible.  net462 is compatible.  net463 was computed.  net47 is compatible.  net471 is compatible.  net472 is compatible.  net48 is compatible.  net481 was computed. 
MonoAndroid monoandroid was computed. 
MonoMac monomac was computed. 
MonoTouch monotouch was computed. 
Tizen tizen40 was computed.  tizen60 was computed. 
Xamarin.iOS xamarinios was computed. 
Xamarin.Mac xamarinmac was computed. 
Xamarin.TVOS xamarintvos was computed. 
Xamarin.WatchOS xamarinwatchos was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.
  • .NETCoreApp 3.0

    • No dependencies.
  • .NETFramework 3.5

    • No dependencies.
  • .NETFramework 4.0

    • No dependencies.
  • .NETFramework 4.5

    • No dependencies.
  • .NETFramework 4.5.1

    • No dependencies.
  • .NETFramework 4.5.2

    • No dependencies.
  • .NETFramework 4.6

    • No dependencies.
  • .NETFramework 4.6.1

    • No dependencies.
  • .NETFramework 4.6.2

    • No dependencies.
  • .NETFramework 4.7

    • No dependencies.
  • .NETFramework 4.7.1

    • No dependencies.
  • .NETFramework 4.7.2

    • No dependencies.
  • .NETFramework 4.8

    • No dependencies.
  • .NETStandard 2.0

  • .NETStandard 2.1

    • No dependencies.
  • net10.0

    • No dependencies.
  • net5.0

    • No dependencies.
  • net6.0

    • No dependencies.
  • net8.0

    • No dependencies.
  • net9.0

    • No dependencies.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
9.5.0 149 10/28/2026
9.4.0 232 7/13/2026
9.3.0 218 3/26/2026
9.2.0 198 2/9/2026
9.1.0 183 1/27/2026
9.0.1 186 1/27/2026
8.2.0 436 12/29/2025
8.1.0 628 10/13/2025
8.0.2 471 9/25/2025
7.13.1 349 9/22/2025
7.12.0 2,268 4/8/2025
7.11.0 333 3/27/2025
7.10.0 776 3/17/2025
7.9.9 957 2/4/2025
7.9.8 310 2/4/2025
7.9.1 719 11/13/2024
7.8.22 584 9/4/2024
7.8.0 416 8/1/2024
7.7.3 378 7/22/2024
7.6.3 384 7/3/2024
Loading failed