RTDE allows you to exchange data and measurements with the robot at high speed, up to 500Hz on the latest cobots.
For more information about RTDE, see : https://www.universal-robots.com/articles/ur/interface-communication/real-time-data-exchange-rtde-guide/
RTDE allows you to receive and send certain data between the robot and your application.
When connecting, you must specify the list of data that will be exchanged, as well as the frequency at which the robot should send you data. Data sent by the robot to your application is called "Outputs" and data sent by your application to the robot is called "Inputs". The name is given from the point of view of the robot.
In operation, data is received and the OutputDataReceived event is periodically raised when data arrives.
Other events are used to be notified of RTDE link activities.
You can asynchronously write data to the robot controller.
It is also possible to pause and resume the streaming of measurements.
var robot = new UR();var param = new ConnectParameters("192.168.0.1");// Enable RTDEparam.Rtde.Enable = true;// Exchange data at 500Hzparam.Rtde.Frequency = 500;// Select data you want to write in robot controllerparam.Rtde.InputSetup.Add(RtdeInputData.StandardAnalogOutput0);param.Rtde.InputSetup.Add(RtdeInputData.InputIntRegisters, 0);// Select data you want the robot to sendparam.Rtde.OutputSetup.Add(RtdeOutputData.ActualTcpPose);param.Rtde.OutputSetup.Add(RtdeOutputData.ToolOutputVoltage);param.Rtde.OutputSetup.Add(RtdeOutputData.OutputDoubleRegisters, 10);// Connect to robotrobot.Connect(param);// Be notified at 500Hz when data is receivedrobot.Rtde.OutputDataReceived += Rtde_OutputDataReceived;//...// Get last received data in cachePose actualTcpPose = robot.Rtde.OutputDataValues.ActualTcpPose;int toolOutputVoltage = robot.Rtde.OutputDataValues.ToolOutputVoltage;double outputDoubleRegisters10 = robot.Rtde.OutputDataValues.OutputDoubleRegisters.X10;//...// Write input values in robotvar inputValues = new RtdeInputValues();inputValues.StandardAnalogOutput0 = 0.2;inputValues.InputIntRegisters.X0 = 12;robot.Rtde.WriteInputs(inputValues);// Disconnect only Dashboard communicationrobot.Rtde.Disconnect();// Disconnect every interfaces (Primary Interface, Dashboard, RTDE, ...)robot.Disconnect();private static void Rtde_OutputDataReceived(object sender, RtdeDataPackageEventArgs e){// Get frequency of received message (OutputSetup contains Timestamp by default)var realMessageFrequency = e.MeasuredFrequency;// Get the value of the data you have selected in the setupPose actualTcpPose = e.OutputDataValues.ActualTcpPose;int toolOutputVoltage = e.OutputDataValues.ToolOutputVoltage;double outputDoubleRegisters10 = e.OutputDataValues.OutputDoubleRegisters.X10;// Write inputs at 500Hzvar inputValues = new RtdeInputValues();inputValues.StandardAnalogOutput0 = 0.5;inputValues.InputIntRegisters.X0 = -10;(sender as RtdeClientBase)?.WriteInputs(inputValues);}
It is possible to create a RTDE client outside an instance of UR
.
To do this, you just need to instantiate a RtdeClient
object.
// Create a dashboard client alone, outside any UR instancevar client = new RtdeClient();// Select output data to receive from the robotvar outputSetup = new RtdeOutputSetup();outputSetup.Add(RtdeOutputData.ActualCurrent);// Select input data to send to the robotvar inputSetup = new RtdeInputSetup();inputSetup.Add(RtdeInputData.InputIntRegisters, 4);inputSetup.Add(RtdeInputData.StandardAnalogOutput0);// Connect at 500Hzclient.Connect("192.168.0.1", outputSetup, inputSetup, RtdeVersions.V2, frequency: 500);//...// Receive data at 500Hzclient.OutputDataReceived += (o, e) =>{JointsDoubleValues actualCurrent = e.OutputDataValues.ActualCurrent;};//...// Write input values in robotvar inputValues = new RtdeInputValues();inputValues.InputIntRegisters.X4 = 12;inputValues.StandardAnalogOutput0 = 0.2;client.WriteInputs(inputValues);//...// Close connection to the robotclient.Disconnect();
RTDE is not activated by default when connecting to the robot. You must set the Enable
property in the connection settings.
In this same object, you must add the inputs and outputs you want to exchange with the robot.
To do this, use the Add
function on InputSetup
and OutputSetup
to add the data to exchange. This function takes as parameter an enum RtdeOutputData
or RtdeInputData
.
In the case of array registers, e.g. RtdeOutputData.OutputDoubleRegisters
or RtdeInputData.InputIntRegisters
, it is necessary to additionally specify the register number as the second parameter of Add
. Please refer to the register comment for the register size and the upper and lower range.
You can also specify a frequency of data reception. By default, if nothing is set, the communication is at 10Hz. The Frequency
property of the setup parameters allows you to change the frequency up to 500Hz.
If the frequency is set to 0, the communication will be done at the maximum frequency allowed by the robot.
You can also specify the RTDE protocol version. Version 2 allows frequency to be taken into account. If your robot is not compatible with version 2, version 1 is automatically selected. If you do not set the version, version 2 is automatically selected.
At runtime, you can control the version actually used via the property Rtde.Version
.
var param = new ConnectParameters("192.168.0.1");// Enable RTDEparam.Rtde.Enable = true;// Exchange data at 500Hzparam.Rtde.Frequency = 500;// Set RTDE versionparam.Rtde.Version = RtdeVersions.V2;// Select data you want to write in robot controllerparam.Rtde.InputSetup.Add(RtdeInputData.StandardDigitalOutput);param.Rtde.InputSetup.Add(RtdeInputData.ExternalForceTorque);param.Rtde.InputSetup.Add(RtdeInputData.StandardAnalogOutput1);param.Rtde.InputSetup.Add(RtdeInputData.InputBitRegisters, 64);// Select data you want the robot to sendparam.Rtde.OutputSetup.Add(RtdeOutputData.ActualTcpPose);param.Rtde.OutputSetup.Add(RtdeOutputData.ToolOutputVoltage);param.Rtde.OutputSetup.Add(RtdeOutputData.OutputDoubleRegisters, 10);// Connect to robotrobot.Connect(param);
The OutputDataReceived
event is raised at the frequency of data reception from the robot. It contains the received data, the connection ID and the frequency of data reception estimated from the timestamp if this data is part of the output.
It is possible to access the last received values with the property OutputDataValues
.
// Get latest received dataPose actualTcpPose = robot.Rtde.OutputDataValues.ActualTcpPose;double x = actualTcpPose.X;double y = actualTcpPose.Y;double z = actualTcpPose.Z;int toolOutputVoltage = robot.Rtde.OutputDataValues.ToolOutputVoltage;double outputDoubleRegisters10 = robot.Rtde.OutputDataValues.OutputDoubleRegisters.X10;// Subscribe to event to receive data is real timerobot.Rtde.OutputDataReceived += (o, e) =>{double realFreq = e.MeasuredFrequency;Pose pose = robot.Rtde.OutputDataValues.ActualTcpPose;int voltage = robot.Rtde.OutputDataValues.ToolOutputVoltage;double register10 = robot.Rtde.OutputDataValues.OutputDoubleRegisters.X10;};
To write data, simply instantiate an RtdeInputValues
list and fill the fields with your values.
Then call the WriteInputs
function to send these values to the robot.
var inputs = new RtdeInputValues();inputs.StandardDigitalOutput = 128;inputs.ExternalForceTorque = new CartesianCoordinates(0, 0, 1, 0, 0, 0.1);inputs.StandardAnalogOutput1 = 0.1;inputs.InputBitRegisters.X64 = true;// Send data to robotrobot.Rtde.WriteInputs(inputs);
The Pause
method allow the connection to be paused without being closed, so no data is received. It is possible to resume the stream with the Resume
function.
// Pause RTDE data streaming from robotrobot.Rtde.Pause();// Event triggered when RTDE is pausedrobot.Rtde.PauseReceived += Rtde_PauseReceived;// Resume RTDE after a pauserobot.Rtde.Resume();// RTDE streaming started or resumedrobot.Rtde.StartReceived += Rtde_StartReceived;
The state of the connection can be controlled via the Connected
and State
properties.
Text messages can be received to describe an error in connection or operation. The last message is stored in LastTextMessage
and the TextMessageReceived
event is raised when a text message is received.
Likewise, if an internal library error occurs, the InternalErrorOccured
event is raised.
// Frequency requested in connect parameters for V2 protocoldouble appliedFrequency = robot.Rtde.AppliedFrequency;// RTDE TCP/IP connection is still activebool isConnected = robot.Rtde.Connected;// Unique ID of the RTDE connection for writing data to the robotbyte inputRecipe = robot.Rtde.InputRecipeId;// Unique ID of the RTDE connection for receiving data from robotbyte outputRecipe = robot.Rtde.OutputRecipeId;// State property has current RTDE state (paused, disabled, started, ...)bool isPaused = robot.Rtde.State == RTDEStates.Paused;// Special warning text messages sent by the robotrobot.Rtde.TextMessageReceived += Rtde_TextMessageReceived;// Event raised by the library when something went wrongrobot.Rtde.InternalErrorOccured += Rtde_InternalErrorOccured;
public abstract class RtdeClientBase : URServiceBase {// Output data frequency requested to the robot, only for RTDE version 2public double AppliedFrequency { get; }// Gets a value indicating if RTDE client is connected to the robotpublic bool Connected { get; }protected void ConnectInternal(string ip, int port, RtdeOutputSetup outputSetup, RtdeInputSetup inputSetup, RtdeVersions preferedVersion, double frequency)// Close the RTDE connection to the robotpublic void Disconnect()// Recipe Identifier of input sent datapublic byte InputRecipeId { get; }// Indicates that the recipe is valid, i.e. that all the registers have been found and are not already reserved for writing by another RTDE client.// Check event SetupInputsReceived to see which registers are NOT_FOUND or IN_USEpublic bool InputRecipeIsValid { get; }// List of all data the PC can write to the robot (robot point of view)public RtdeInputSetupItem[] InputSetup { get; }// IP address of the robotpublic string IP { get; }// Last text received from the robotpublic RtdeTextMessageEventArgs LastTextMessage { get; }// Measured output data packet frequency. "Timestamp" output data shoud be part of output setup to measure frequency.public double MeasuredFrequency { get; }// Event raised when data from the robot is comming at specified frequencypublic event EventHandler<RtdeDataPackageEventArgs> OutputDataReceived// Last data received from the robotpublic RtdeOutputValues OutputDataValues { get; }// Recipe Identifier of output received datapublic byte OutputRecipeId { get; }// List of all data sent from the robot to the PC (robot point of view)public RtdeOutputSetupItem[] OutputSetup { get; }// Generic event raised each time a RTDE package is receivedpublic event EventHandler<PackageEventArgs> PackageReceived// Pause data streaming without disconnecting clientpublic void Pause()// Event raised when streaming is pausedpublic event EventHandler<RtdeBasicRequestEventArgs> PauseReceived// Event raised during connection when the robot specifies if asked protocol version is supportedpublic event EventHandler<RtdeProtocolVersionEventArgs> ProtocolVersionReceived// Restart data streaming after a Pausepublic void Resume()// Event raised during connection when the robot acknowledges input setuppublic event EventHandler<RtdeControlPackageSetupInputsEventArgs> SetupInputsReceived// Event raised during connection when the robot acknowledges output setuppublic event EventHandler<RtdeControlPackageSetupOutputsEventArgs> SetupOutputsReceived// Event raised as soon as data streaming startspublic event EventHandler<RtdeBasicRequestEventArgs> StartReceived// Current RTDE statepublic RTDEStates State { get; }// Event raised when a RTDE message is receivedpublic event EventHandler<RtdeTextMessageEventArgs> TextMessageReceived// Current protocol version used to stream datapublic RtdeVersions Version { get; }// Write data to controller. Data must be those selected in connect parameterspublic void WriteInputs(RtdeInputValues inputValues)}
public abstract class RtdeParametersBase {// Default RTDE TCP port used (30004)public const int DEFAULT_PORT = 30004// For RTDE version 2, you can specify a frequency for output received data. Maximum frequency depends on your robot version.// If you set frequency to 0, maximum frequency will be choosen// Default value is 10Hzpublic double Frequency { get; set; }// List of all input data you can send to the robotpublic RtdeInputSetup InputSetup { get; set; }// List of all output data the robot will send to your applicationpublic RtdeOutputSetup OutputSetup { get; set; }// TCP port used for RTDE connection. Default : 30004public int Port { get; set; }// RTDE version. If set to Auto, the most recent version will be choosen according to your robot version// Default value is V2public RtdeVersions Version { get; set; }}
public enum RtdeVersions {// Rtde version 1V1 = 1// Rtde version 2V2 = 2}
public enum RtdeOutputData {// Actual joint currentsActualCurrent = 8// Current state of the digital inputs.�0-7: Standard, 8-15: Configurable, 16-17: ToolActualDigitalInputBits = 15// Current state of the digital outputs.�0-7: Standard, 8-15: Configurable, 16-17: ToolActualDigitalOutputBits = 30// Controller real-time thread execution timeActualExecutionTime = 17// Actual joint voltagesActualJointVoltage = 29// Safety Control Board: Main voltageActualMainVoltage = 26// Norm of Cartesian linear momentumActualMomentum = 25// Actual joint positionsActualQ = 6// Actual joint velocitiesActualQd = 7// Safety Control Board: Robot currentActualRobotCurrent = 28// Safety Control Board: Robot voltage (48V)ActualRobotVoltage = 27// Generalized forces in the TCP. It compensates the measurement for forces and torques generated by the�payloadActualTcpForce = 12// Actual Cartesian coordinates of the tool: (x,y,z,rx,ry,rz), where rx, ry and rz is a rotation vector representation of the tool orientationActualTcpPose = 10// Actual speed of the tool given in Cartesian coordinates. The speed is given in [m/s] and the rotational part of the TCP speed (rx, ry, rz) is the angular velocity given in [rad/s]ActualTcpSpeed = 11// Tool x, y and z accelerometer valuesActualToolAccelerometer = 22// Bits 0-3: analog input 0 | analog input 1 | analog output 0 |�analog output 1, {0=current[mA], 1=voltage[V]}AnalogIOTypes = 36// Position of robot elbow in Cartesian Base CoordinatesElbowPosition = 32// Velocity of robot elbow in Cartesian Base CoordinatesElbowVelocity = 33// Euromap 24V current [mA]Euromap67_24VCurrent = 45// Euromap 24V voltage [V]Euromap67_24VVoltage = 44// Euromap67 input bitsEuromap67InputBits = 42// Euromap67 output bitsEuromap67OutputBits = 43// Raw force and torque measurement, not compensated for forces and torques caused by the�payloadFTRawWrench = 71// �64 general purpose bits, X: [64..127] - The upper range of the boolean output registers can be used by external RTDE clients (i.e URCAPS).InputBitRegisters = 61// General purpose bits (input read back). This range of the boolean output registers is reserved for FieldBus/PLC interface usage.InputBitRegisters0To31 = 59// General purpose bits (input read back), This range of the boolean output registers is reserved for FieldBus/PLC interface usage.InputBitRegisters32To63 = 60// �48 general purpose double registers. X: [0..23] - The lower range of the double input registers is reserved for FieldBus/PLC interface usage. X: [24..47] - The upper range of the double input registers can be used by external RTDE clients (i.e URCAPS).InputDoubleRegisters = 63// 48 general purpose integer registers. X: [0..23] - The lower range of the integer input registers is reserved for FieldBus/PLC interface usage. X: [24..47] - The upper range of the integer input registers can be used by external RTDE clients (i.e URCAPS).InputIntRegisters = 62// I/O current [mA]IOCurrent = 41// Joint control currentsJointControlOutput = 9// Joint control modesJointMode = 19// Temperature of each joint in degrees CelsiusJointTemperatures = 16// 64 general purpose bits. X: [64..127] - The upper range of the boolean output registers can be used by external RTDE clients (i.e URCAPS).OutputBitRegisters = 56// General purpose bitsOutputBitRegisters0To31 = 54// General purpose bitsOutputBitRegisters32To63 = 55// 48 general purpose double registers. X: [0..23] - The lower range of the double output registers is reserved for FieldBus/PLC interface usage. X: [24..47] - The upper range of the double output registers can be used by external RTDE clients (i.e URCAPS).OutputDoubleRegisters = 58// 48 general purpose integer registers. X: [0..23] - The lower range of the integer output registers is reserved for FieldBus/PLC interface usage. X: [24..47] - The upper range of the integer output registers can be used by external RTDE clients (i.e URCAPS).OutputIntRegisters = 57// Payload mass KgPayload = 67// Payload Center of Gravity (CoGx, CoGy, CoGz) mPayloadCOG = 68// Payload inertia matrix elements (Ixx,Iyy,Izz,Ixy,Ixz,Iyz] expressed in kg*m^2PayloadInertia = 69// Robot modeRobotMode = 18// Bits 0-3:� Is power on | Is program running | Is teach button pressed | Is power button pressedRobotStatusBits = 34// Program stateRuntimeState = 31// Safety modeSafetyMode = 20// Safety statusSafetyStatus = 21// Bits 0-10: Is normal mode | Is reduced mode | Is protective stopped | Is recovery mode |�Is safeguard stopped |�Is system emergency stopped |�Is robot emergency stopped |�Is emergency stopped |�Is violation |�Is fault |�Is stopped due to safetySafetyStatusBits = 35// Script line number that is actually in control of the robot given the robot is locked by one of the threads in the script. If no thread is locking the robot this field is set to '0'. Script line number should not be confused with program tree line number displayed on polyscope.ScriptControlLine = 70// Speed scaling of the trajectory limiterSpeedScaling = 23// Standard analog input 0 [mA or V]StandardAnalogInput0 = 37// Standard analog input 1 [mA or V]StandardAnalogInput1 = 38// Standard analog output 0 [mA or V]StandardAnalogOutput0 = 39// Standard analog output 1 [mA or V]StandardAnalogOutput1 = 40// Target joint currentsTargetCurrent = 4// Target joint moments (torques)TargetMoment = 5// Target joint positionsTargetQ = 1// Target joint velocitiesTargetQd = 2// Target joint accelerationsTargetQdd = 3// Target speed fractionTargetSpeedFraction = 24// Target Cartesian coordinates of the tool: (x,y,z,rx,ry,rz), where rx, ry and rz is a rotation vector representation of the tool orientationTargetTcpPose = 13// Target speed of the tool given in Cartesian coordinates.�The speed is given in [m/s] and the rotational part of the TCP speed (rx, ry, rz) is the angular velocity given in [rad/s]TargetTcpSpeed = 14// TCP force scalar [N]TcpForceScalar = 53// Time elapsed since the controller was started [s]Timestamp = 0// Tool analog input 0 [mA or V]ToolAnalogInput0 = 48// Tool analog input 1 [mA or V]ToolAnalogInput1 = 49// Output domain {0=current[mA], 1=voltage[V]} Bits 0-1: tool_analog_input_0 | tool_analog_input_1ToolAnalogInputTypes = 47// The current mode of digital output 0ToolDigitalOutput0mode = 65// The current mode of digital output 1ToolDigitalOutput1Mode = 66// Tool modeToolMode = 46// Tool current [mA]ToolOutputCurrent = 51// The current output modeToolOutputMode = 64// Tool output voltage [V]ToolOutputVoltage = 50// Tool temperature in degrees CelsiusToolTemperature = 52}
public enum RtdeInputData {// Configurable digital outputsConfigurableDigitalOutput = 5// Configurable digital output bit maskConfigurableDigitalOutputMask = 3// Input external wrench when using ft_rtde_input_enable builtin.ExternalForceTorque = 15// 64 general purpose bits. X: [64..127] - The upper range of the boolean input registers can be used by external RTDE clients (i.e URCAPS).InputBitRegisters = 12// General purpose bits. This range of the boolean input registers is reserved for FieldBus/PLC interface usage.InputBtRegisters0To31 = 10// General purpose bits. This range of the boolean input registers is reserved for FieldBus/PLC interface usage.InputBtRegisters32To63 = 11// 48 general purpose double registers. X: [0..23] - The lower range of the double input registers is reserved for FieldBus/PLC interface usage. X: [24..47] - The upper range of the double input registers can be used by external RTDE clients (i.e URCAPS).InputDoubleRegisters = 14// 48 general purpose integer registers. X: [0..23] - The lower range of the integer input registers is reserved for FieldBus/PLC interface usage. X: [24..47] - The upper range of the integer input registers can be used by external RTDE clients (i.e URCAPS).InputIntRegisters = 13// new speed slider valueSpeedSliderFraction = 1// 0 = don't change speed slider with this input, 1 = use speed_slider_fraction to set speed slider valueSpeedSliderMask = 0// Standard analog output 0 (ratio) [0..1]StandardAnalogOutput0 = 8// Standard analog output 1 (ratio) [0..1]StandardAnalogOutput1 = 9// Standard analog output maskStandardAnalogOutputMask = 6// Output domain {0=current[mA], 1=voltage[V]}. Bits 0-1: standard_analog_output_0 | standard_analog_output_1StandardAnalogOutputType = 7// Standard digital outputsStandardDigitalOutput = 4// Standard digital output bit maskStandardDigitalOutputMask = 2}
public class RtdeInputValues : RtdeBaseValues<RtdeInputData> {public RtdeInputValues()// Configurable digital outputspublic byte ConfigurableDigitalOutput { get; set; }// Configurable digital output bit maskpublic byte ConfigurableDigitalOutputMask { get; set; }// Input external wrench when using ft_rtde_input_enable builtin.public CartesianCoordinates ExternalForceTorque { get; set; }public object GetValue(RtdeInputSetupItem item)// 64 general purpose bits. X: [64..127] - The upper range of the boolean input registers can be used by external RTDE clients (i.e URCAPS).public RtdeBitRegistersValue InputBitRegisters { get; }// General purpose bits. This range of the boolean input registers is reserved for FieldBus/PLC interface usage.public uint InputBtRegisters0To31 { get; set; }// General purpose bits. This range of the boolean input registers is reserved for FieldBus/PLC interface usage.public uint InputBtRegisters32To63 { get; set; }// 48 general purpose double registers. X: [0..23] - The lower range of the double input registers is reserved for FieldBus/PLC interface usage. X: [24..47] - The upper range of the double input registers can be used by external RTDE clients (i.e URCAPS).public RtdeDoubleRegistersValue InputDoubleRegisters { get; }// 48 general purpose integer registers. X: [0..23] - The lower range of the integer input registers is reserved for FieldBus/PLC interface usage. X: [24..47] - The upper range of the integer input registers can be used by external RTDE clients (i.e URCAPS).public RtdeIntRegistersValue InputIntRegisters { get; }protected override RtdeValue InternaleGetValue(RtdeInputData data)protected override RtdeValue[] InternalValues { get; }public void Reset()public void SetValue(RtdeInputData data, int index, object value)public void SetValue(RtdeInputData data, object value)public void SetValue(RtdeInputSetupItem item, object value)// new speed slider valuepublic double SpeedSliderFraction { get; set; }// 0 = don't change speed slider with this input, 1 = use speed_slider_fraction to set speed slider valuepublic uint SpeedSliderMask { get; set; }// Standard analog output 0 (ratio) [0..1]public double StandardAnalogOutput0 { get; set; }// Standard analog output 1 (ratio) [0..1]public double StandardAnalogOutput1 { get; set; }// Standard analog output maskpublic byte StandardAnalogOutputMask { get; set; }// Output domain {0=current[mA], 1=voltage[V]}. Bits 0-1: standard_analog_output_0 | standard_analog_output_1public byte StandardAnalogOutputType { get; set; }// Standard digital outputspublic byte StandardDigitalOutput { get; set; }// Standard digital output bit maskpublic byte StandardDigitalOutputMask { get; set; }}
public class RtdeOutputValues : RtdeBaseValues<RtdeOutputData> {// Actual joint currentspublic JointsDoubleValues ActualCurrent { get; set; }// Current state of the digital inputs.�0-7: Standard, 8-15: Configurable, 16-17: Toolpublic ulong ActualDigitalInputBits { get; set; }// Current state of the digital outputs.�0-7: Standard, 8-15: Configurable, 16-17: Toolpublic ulong ActualDigitalOutputBits { get; set; }// Controller real-time thread execution timepublic double ActualExecutionTime { get; set; }// Actual joint voltagespublic JointsDoubleValues ActualJointVoltage { get; set; }// Safety Control Board: Main voltagepublic double ActualMainVoltage { get; set; }// Norm of Cartesian linear momentumpublic double ActualMomentum { get; set; }// Actual joint positionspublic JointsDoubleValues ActualQ { get; set; }// Actual joint velocitiespublic JointsDoubleValues ActualQd { get; set; }// Safety Control Board: Robot currentpublic double ActualRobotCurrent { get; set; }// Safety Control Board: Robot voltage (48V)public double ActualRobotVoltage { get; set; }// Generalized forces in the TCP. It compensates the measurement for forces and torques generated by the�payloadpublic CartesianCoordinates ActualTcpForce { get; set; }// Actual Cartesian coordinates of the tool: (x,y,z,rx,ry,rz), where rx, ry and rz is a rotation vector representation of the tool orientationpublic Pose ActualTcpPose { get; set; }// Actual speed of the tool given in Cartesian coordinates. The speed is given in [m/s] and the rotational part of the TCP speed (rx, ry, rz) is the angular velocity given in [rad/s]public Pose ActualTcpSpeed { get; set; }// Tool x, y and z accelerometer valuespublic Vector3D ActualToolAccelerometer { get; set; }// Bits 0-3: analog input 0 | analog input 1 | analog output 0 |�analog output 1, {0=current[mA], 1=voltage[V]}public uint AnalogIOTypes { get; set; }// Position of robot elbow in Cartesian Base Coordinatespublic Vector3D ElbowPosition { get; set; }// Velocity of robot elbow in Cartesian Base Coordinatespublic Vector3D ElbowVelocity { get; set; }// Euromap 24V current [mA]public double Euromap67_24VCurrent { get; set; }// Euromap 24V voltage [V]public double Euromap67_24VVoltage { get; set; }// Euromap67 input bitspublic uint Euromap67InputBits { get; set; }// Euromap67 output bitspublic uint Euromap67OutputBits { get; set; }// Raw force and torque measurement, not compensated for forces and torques caused by the�payloadpublic CartesianCoordinates FTRawWrench { get; set; }public object GetValue(RtdeOutputSetupItem item)// �64 general purpose bits, X: [64..127] - The upper range of the boolean output registers can be used by external RTDE clients (i.e URCAPS).public RtdeBitRegistersValue InputBitRegisters { get; }// General purpose bits (input read back). This range of the boolean output registers is reserved for FieldBus/PLC interface usage.public uint InputBitRegisters0To31 { get; set; }// General purpose bits (input read back), This range of the boolean output registers is reserved for FieldBus/PLC interface usage.public uint InputBitRegisters32To63 { get; set; }// �48 general purpose double registers. X: [0..23] - The lower range of the double input registers is reserved for FieldBus/PLC interface usage. X: [24..47] - The upper range of the double input registers can be used by external RTDE clients (i.e URCAPS).public RtdeDoubleRegistersValue InputDoubleRegisters { get; }// 48 general purpose integer registers. X: [0..23] - The lower range of the integer input registers is reserved for FieldBus/PLC interface usage. X: [24..47] - The upper range of the integer input registers can be used by external RTDE clients (i.e URCAPS).public RtdeIntRegistersValue InputIntRegisters { get; }protected override RtdeValue InternaleGetValue(RtdeOutputData data)protected override RtdeValue[] InternalValues { get; }// I/O current [mA]public double IOCurrent { get; set; }// Joint control currentspublic JointsDoubleValues JointControlOutput { get; set; }// Joint control modespublic JointsIntValues JointMode { get; set; }// Temperature of each joint in degrees Celsiuspublic JointsDoubleValues JointTemperatures { get; set; }// 64 general purpose bits. X: [64..127] - The upper range of the boolean output registers can be used by external RTDE clients (i.e URCAPS).public RtdeBitRegistersValue OutputBitRegisters { get; }// General purpose bitspublic uint OutputBitRegisters0To31 { get; set; }// General purpose bitspublic uint OutputBitRegisters32To63 { get; set; }// 48 general purpose double registers. X: [0..23] - The lower range of the double output registers is reserved for FieldBus/PLC interface usage. X: [24..47] - The upper range of the double output registers can be used by external RTDE clients (i.e URCAPS).public RtdeDoubleRegistersValue OutputDoubleRegisters { get; }// 48 general purpose integer registers. X: [0..23] - The lower range of the integer output registers is reserved for FieldBus/PLC interface usage. X: [24..47] - The upper range of the integer output registers can be used by external RTDE clients (i.e URCAPS).public RtdeIntRegistersValue OutputIntRegisters { get; }// Payload mass Kgpublic double Payload { get; set; }// Payload Center of Gravity (CoGx, CoGy, CoGz) mpublic Vector3D PayloadCOG { get; set; }// Payload inertia matrix elements (Ixx,Iyy,Izz,Ixy,Ixz,Iyz] expressed in kg*m^2public CartesianCoordinates PayloadInertia { get; set; }// Robot modepublic int RobotMode { get; set; }// Bits 0-3:� Is power on | Is program running | Is teach button pressed | Is power button pressedpublic uint RobotStatusBits { get; set; }// Program statepublic uint RuntimeState { get; set; }// Safety modepublic int SafetyMode { get; set; }// Safety statuspublic int SafetyStatus { get; set; }// Bits 0-10: Is normal mode | Is reduced mode | Is protective stopped | Is recovery mode |�Is safeguard stopped |�Is system emergency stopped |�Is robot emergency stopped |�Is emergency stopped |�Is violation |�Is fault |�Is stopped due to safetypublic uint SafetyStatusBits { get; set; }// Script line number that is actually in control of the robot given the robot is locked by one of the threads in the script. If no thread is locking the robot this field is set to '0'. Script line number should not be confused with program tree line number displayed on polyscope.public uint ScriptControlLine { get; set; }// Speed scaling of the trajectory limiterpublic double SpeedScaling { get; set; }// Standard analog input 0 [mA or V]public double StandardAnalogInput0 { get; set; }// Standard analog input 1 [mA or V]public double StandardAnalogInput1 { get; set; }// Standard analog output 0 [mA or V]public double StandardAnalogOutput0 { get; set; }// Standard analog output 1 [mA or V]public double StandardAnalogOutput1 { get; set; }// Target joint currentspublic JointsDoubleValues TargetCurrent { get; set; }// Target joint moments (torques)public JointsDoubleValues TargetMoment { get; set; }// Target joint positionspublic JointsDoubleValues TargetQ { get; set; }// Target joint velocitiespublic JointsDoubleValues TargetQd { get; set; }// Target joint accelerationspublic JointsDoubleValues TargetQdd { get; set; }// Target speed fractionpublic double TargetSpeedFraction { get; set; }// Target Cartesian coordinates of the tool: (x,y,z,rx,ry,rz), where rx, ry and rz is a rotation vector representation of the tool orientationpublic Pose TargetTcpPose { get; set; }// Target speed of the tool given in Cartesian coordinates.�The speed is given in [m/s] and the rotational part of the TCP speed (rx, ry, rz) is the angular velocity given in [rad/s]public Pose TargetTcpSpeed { get; set; }// TCP force scalar [N]public double TcpForceScalar { get; set; }// Time elapsed since the controller was started [s]public double Timestamp { get; set; }// Tool analog input 0 [mA or V]public double ToolAnalogInput0 { get; set; }// Tool analog input 1 [mA or V]public double ToolAnalogInput1 { get; set; }// Output domain {0=current[mA], 1=voltage[V]} Bits 0-1: tool_analog_input_0 | tool_analog_input_1public uint ToolAnalogInputTypes { get; set; }// The current mode of digital output 0public byte ToolDigitalOutput0mode { get; set; }// The current mode of digital output 1public byte ToolDigitalOutput1Mode { get; set; }// Tool modepublic uint ToolMode { get; set; }// Tool current [mA]public double ToolOutputCurrent { get; set; }// The current output modepublic byte ToolOutputMode { get; set; }// Tool output voltage [V]public int ToolOutputVoltage { get; set; }// Tool temperature in degrees Celsiuspublic double ToolTemperature { get; set; }}