Real-Time Data Exchange (RTDE)
The RTDE synchronize external executables with the UR controller, for instance Ethernet IP, without breaking any real-time properties.
Introduction
The synchronization is configurable and can for example involve the following data:
-
Output: robot-, joint-, tool- and safety status, analog and digital I/O's and general purpose output registers
-
Input: digital and analog outputs and general purpose input registers
The RTDE functionality is split in two stages: a setup procedure and a synchronization loop.
On connection to the RTDE interface, the client is responsible for setting up the variables to be synchronized. Any combination of input and output registers that the client needs to write and read, respectively, can be specified. To achieve this the client sends a setup list of named input and output fields that should be contained in the actual data synchronization packages. The definition of a synchronization data package format is referred to as a recipe. There is a maximum limit of 2048 bytes to represent the list of inputs/outputs field names a client would like to subscribe to. In return the RTDE interface replies with a list of the variable types or specifies that a specific variable has not been found. Each input recipe that has been successfully configured will get a unique recipe id. The list of supported field names and their associated data types can be found below. When the setup is complete the data synchronization can be started and paused.
When the synchronization loop is started, the RTDE interface sends the client the requested data in the same order it was requested by the client. Furthermore the client is expected to send updated inputs to the RTDE interface on a change of value. The data synchronization uses serialized data.
All packages share the same general structure with a header and a payload if applicable. The packages used for the setup procedure generate a return message. The synchronization loop packages do not. Both client and server may at any time send a text message, whereby the warning level specifies the severity of the problem. The RTDE is available on port number 30004.
To get started we recommend to use or modify the provided client sample written in Python.
Key features
- Real-time synchronization: The RTDE generally generates output messages on 125 Hz. However, the real-time loop in the controller has a higher priority than the RTDE interface. Therefore, if the controller lacks computational resources it will skip a number of output packages. The skipped packages will not be sent later, the controller will always send the most recent data. Input packages will always be processed in the control cycle they are received, so the load for the controller will vary depending on the number of received packages.
- Input messages: The updating of variables in the controller can be divided into multiple messages. One can have one message to update everything or a message per variable or any division in between. There is no need for a constant update rate; inputs keep their last received value. Note: Only one RTDE client is allowed to control a specific variable at any time.
- Runtime environment: An RTDE client may run on the UR Control Box PC or on any external PC. The advantage of running the RTDE client on the Control Box is no network latency. However, the RTDE client and UR controller will compete for computational resources. Please make sure that the RTDE client runs with standard operating system priority. Computationally intensive processes, e.g. image processing, should be run on an external PC.
- Protocol changes: The RTDE protocol might be updated at any time by UR. To guarantee maximum compatibility for your RTDE client, RTDE clients can request the RTDE interface to speak a specific protocol version. Protocol additions / changes are explicitly denoted, otherwise version 1 is assumed.
Field names and associated types
Robot controller inputs
| Name | Type | Comment | Introduced in version |
|---|---|---|---|
| speed_slider_mask | UINT32 |
0 = don't change speed slider with this input 1 = use speed_slider_fraction to set speed slider value |
|
| speed_slider_fraction | DOUBLE | new speed slider value |
|
| standard_digital_output_mask | UINT8 | Standard digital output bit mask |
|
| configurable_digital_output_mask | UINT8 |
Configurable digital output bit mask |
|
| standard_digital_output | UINT8 | Standard digital outputs |
|
| configurable_digital_output | UINT8 | Configurable digital outputs |
|
| standard_analog_output_mask | UINT8 |
Standard analog output mask Bits 0-1: standard_analog_output_0 | standard_analog_output_1 |
|
| standard_analog_output_type | UINT8 |
Output domain {0=current[mA], 1=voltage[V]} Bits 0-1: standard_analog_output_0 | standard_analog_output_1 |
|
| standard_analog_output_0 | DOUBLE | Standard analog output 0 (ratio) [0..1] |
|
| standard_analog_output_1 | DOUBLE | Standard analog output 1 (ratio) [0..1] |
|
| input_bit_registers0_to_31 | UINT32 |
General purpose bits This range of the boolean input registers is reserved for FieldBus/PLC interface usage. |
|
| input_bit_registers32_to_63 | UINT32 |
General purpose bits This range of the boolean input registers is reserved for FieldBus/PLC interface usage. |
|
| input_bit_register_X | BOOL |
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). |
3.9.0 / 5.3.0 |
| input_int_register_X | INT32 |
48 general purpose integer registers X: [24..47] - The upper range of the integer input registers can be used by external RTDE clients (i.e URCAPS). |
[0..23] 3.4.0 [24..47] 3.9.0 / 5.3.0 |
| input_double_register_X | DOUBLE |
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). |
[0..23] 3.4.0 [24..47] 3.9.0 / 5.3.0 |
| external_force_torque | VECTOR6D | Input external wrench when using ft_rtde_input_enable builtin. | 3.3 |
Robot controller outputs
| Name | Type | Comment |
Introduced in version |
|---|---|---|---|
| timestamp | DOUBLE | Time elapsed since the controller was started [s] |
|
| target_q | VECTOR6D | Target joint positions |
|
| target_qd | VECTOR6D | Target joint velocities |
|
| target_qdd | VECTOR6D | Target joint accelerations |
|
| target_current | VECTOR6D | Target joint currents |
|
| target_moment | VECTOR6D | Target joint moments (torques) |
|
| actual_q | VECTOR6D | Actual joint positions |
|
| actual_qd | VECTOR6D | Actual joint velocities |
|
| actual_current | VECTOR6D | Actual joint currents |
|
| joint_control_output | VECTOR6D | Joint control currents |
|
| actual_TCP_pose | VECTOR6D | 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 orientation |
|
| actual_TCP_speed | VECTOR6D | Actual speed of the tool given in Cartesian coordinates |
|
| actual_TCP_force | VECTOR6D | Generalized forces in the TCP |
|
| target_TCP_pose | VECTOR6D | 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 orientation |
|
| target_TCP_speed | VECTOR6D | Target speed of the tool given in Cartesian coordinates |
|
| actual_digital_input_bits | UINT64 | Current state of the digital inputs. |
|
| joint_temperatures | VECTOR6D | Temperature of each joint in degrees Celsius |
|
| actual_execution_time | DOUBLE | Controller real-time thread execution time |
|
| robot_mode | INT32 |
Robot mode |
|
| joint_mode | VECTOR6INT32 |
Joint control modes |
|
| safety_mode | INT32 | Safety mode |
|
| safety_status | INT32 | Safety status | 3.10.0 / 5.4.0 |
| actual_tool_accelerometer | VECTOR3D | Tool x, y and z accelerometer values |
|
| speed_scaling | DOUBLE | Speed scaling of the trajectory limiter |
|
| target_speed_fraction | DOUBLE | Target speed fraction |
|
| actual_momentum | DOUBLE | Norm of Cartesian linear momentum |
|
| actual_main_voltage | DOUBLE | Safety Control Board: Main voltage |
|
| actual_robot_voltage | DOUBLE | Safety Control Board: Robot voltage (48V) |
|
| actual_robot_current | DOUBLE | Safety Control Board: Robot current |
|
| actual_joint_voltage | VECTOR6D | Actual joint voltages |
|
| actual_robot_energy_consumed | DOUBLE |
Robot Arm energy consumption since controller startup [Wh]. |
5.24.0 / 10.11.0 |
| actual_robot_energy_produced | DOUBLE |
Robot Arm energy production during regenerative braking, since controller startup [Wh]. This energy is flowing back into the Control Box and gets dissipated as heat. |
5.24.0 / 10.11.0 |
| actual_digital_output_bits | UINT64 | Digital outputs |
|
| runtime_state | UINT32 | Program state |
|
| elbow_position | VECTOR3D | Position of robot elbow in Cartesian Base Coordinates |
3.5.0 / 5.0.0 |
| elbow_velocity | VECTOR3D | Velocity of robot elbow in Cartesian Base Coordinates |
3.5.0 / 5.0.0 |
| robot_status_bits | UINT32 |
Bits 0-3: Is power on | Is program running | Is teach button pressed | Is power button pressed |
|
| safety_status_bits | UINT32 |
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 safety |
|
| analog_io_types | UINT32 |
Bits 0-3: analog input 0 | analog input 1 | analog output 0 | analog output 1, {0=current[mA], 1=voltage[V]}
|
|
| standard_analog_input0 | DOUBLE | Standard analog input 0 [mA or V] |
|
| standard_analog_input1 | DOUBLE | Standard analog input 1 [mA or V] |
|
| standard_analog_output0 | DOUBLE | Standard analog output 0 [mA or V] |
|
| standard_analog_output1 | DOUBLE | Standard analog output 1 [mA or V] |
|
| io_current | DOUBLE | I/O current [mA] |
|
| encoder0_raw | INT32 |
Raw encoder0 counter counter with range of [-2³¹, 2³¹[
|
|
| encoder1_raw | INT32 |
Raw encoder1 counter with range of [-2³¹, 2³¹[
|
|
| euromap67_input_bits | UINT32 |
Euromap67 input bits
|
|
| euromap67_output_bits | UINT32 |
Euromap67 output bits
|
|
| euromap67_24V_voltage | DOUBLE |
Euromap 24V voltage [V]
|
|
| euromap67_24V_current | DOUBLE |
Euromap 24V current [mA]
|
|
| tool_mode | UINT32 | Tool mode |
|
| tool_analog_input_types | UINT32 |
Output domain {0=current[mA], 1=voltage[V]} Bits 0-1: tool_analog_input_0 | tool_analog_input_1 |
|
| tool_analog_input0 | DOUBLE | Tool analog input 0 [mA or V] |
|
| tool_analog_input1 | DOUBLE | Tool analog input 1 [mA or V] |
|
| tool_output_voltage | INT32 | Tool output voltage [V] |
|
| tool_output_current | DOUBLE | Tool current [mA] |
|
| tool_temperature | DOUBLE | Tool temperature in degrees Celsius |
|
| tcp_force_scalar | DOUBLE | TCP force scalar [N] |
|
| joint_position_deviation_ratio | DOUBLE |
|
|
| wrench_calc_from_currents | VECTOR6D | The forces and torques derived from the joint currents |
|
| output_bit_registers0_to_31 | UINT32 | General purpose bits |
|
| output_bit_registers32_to_63 | UINT32 | General purpose bits |
|
| output_bit_register_X | BOOL |
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). |
3.9.0 / 5.3.0 |
| output_int_register_X | INT32 |
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). |
[0..23] 3.4.0 [24..47] 3.9.0 / 5.3.0 |
| output_double_register_X | DOUBLE |
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). |
[0..23] 3.4.0 [24..47] 3.9.0 / 5.3.0 |
| input_bit_registers0_to_31 | UINT32 |
General purpose bits (input read back) This range of the boolean output registers is reserved for FieldBus/PLC interface usage. |
3.4.0 |
| input_bit_registers32_to_63 | UINT32 |
General purpose bits (input read back) This range of the boolean output registers is reserved for FieldBus/PLC interface usage. |
3.4.0 |
| input_bit_register_X ([64 .. 127]) | BOOL |
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). |
3.9.0 / 5.3.0 |
| input_int_register_X ([0 .. 48]) |
INT32 | 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). |
[0..23] 3.4.0 [24..47] 3.9.0 / 5.3.0 |
| input_double_register_X ([0 .. 48]) |
DOUBLE | 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). |
[0..23] 3.4.0 [24..47] 3.9.0 / 5.3.0 |
| tool_output_mode | UINT8 | The current output mode |
|
| tool_digital_output0_mode | UINT8 | The current mode of digital output 0 |
|
| tool_digital_output1_mode | UINT8 | The current mode of digital output 1 |
|
| payload | DOUBLE | Payload mass Kg |
|
| payload_cog | VECTOR3D | Payload Center of Gravity (CoGx, CoGy, CoGz) m |
|
| script_control_line | UINT32 |
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. |
3.14.0 / 5.9.0 |
| actual_current_as_torque | VECTOR6D | Actual joint currents converted to torques |
|
Data types
| Name | Type | Size in bits |
|---|---|---|
| BOOL | 0 = False, everything else = True | 8 |
|
UINT8 |
unsigned integer | 8 |
| UINT32 | unsigned integer | 32 |
| UINT64 | unsigned integer | 64 |
| INT32 | signed integer, two's complement | 32 |
| DOUBLE | IEEE 754 floating point | 64 |
| VECTOR3D | 3xDOUBLE | 3x64 |
| VECTOR6D | 6xDOUBLE | 6x64 |
| VECTOR6INT32 | 6xINT32 | 6x32 |
| VECTOR6UINT32 | 6xUINT32 | 6x32 |
| STRING | ASCII char array | lengthx8 |
Network byte order
Protocol
EE = External Executable
CON = Robot Controller
Output: CON -> EE
Input: CON <- EE
Header
| Field name | Data Type |
|---|---|
| package size | uint16_t |
| package type | uint8_t |
Summary: All packages use the header.
Supported package types are:
| Package name | Package type | ascii equivalent |
|---|---|---|
| RTDE_REQUEST_PROTOCOL_VERSION | 86 | V |
| RTDE_GET_URCONTROL_VERSION | 118 | v |
| RTDE_TEXT_MESSAGE | 77 | M |
| RTDE_DATA_PACKAGE | 85 | U |
| RTDE_CONTROL_PACKAGE_SETUP_OUTPUTS | 79 | O |
| RTDE_CONTROL_PACKAGE_SETUP_INPUTS | 73 | I |
| RTDE_CONTROL_PACKAGE_START | 83 | S |
| RTDE_CONTROL_PACKAGE_PAUSE | 80 | P |
Direction: Bilateral
Return: Not available
RTDE_REQUEST_PROTOCOL_VERSION
| Field name | Data Type |
|---|---|
| Header | See above |
| protocol version | uint16_t |
Summary: Request the controller to work with "protocol version"
Direction: EE -> CON
Return
| Field name | Data Type |
|---|---|
| Header | See above |
| accepted | uint8_t |
Summary: The controller accepts or not, i.e. either 1 (success) or 0 (failed). On success, the EE should speak the specified protocol version and the CON will answer in that version.
RTDE_GET_URCONTROL_VERSION
| Field name | Data Type |
|---|---|
| Header | See above |
Summary: Retrieves the CON major, minor, bugfix and build number.
Direction: EE -> CON
Return
| Field name | Data Type |
|---|---|
| Header | See above |
| major | uint32_t |
| minor | uint32_t |
| bugfix | uint32_t |
| build | uint32_t |
Summary: The major, minor, bugfix and build number.
RTDE_TEXT_MESSAGE (protocol v. 1)
Direction: CON -> EE
| Field name | Data Type |
|---|---|
| Header | See above |
| message type | uint8_t |
| message | string |
Direction: EE -> CON
| Field name | Data Type |
|---|---|
| Header | See above |
| message length | uint8_t |
| message | string |
| source length | uint8_t |
| source | string |
| warning level | uint8_t |
Summary: Send an exception, error, warning or info message.
Warning level: EXCEPTION_MESSAGE, ERROR_MESSAGE, WARNING_MESSAGE, INFO_MESSAGE
EE->CON: Exceptions indicate EE program failure without recovery possibilities. Error, warning and info will end up in the PolyScope log.
CON -> EE: Indicates mainly different kinds of protocol failures.
Direction: See above
Return: Not available.
RTDE_TEXT_MESSAGE (protocol v. 2)
| Field name | Data Type |
|---|---|
| Header | See above |
| message length | uint8_t |
| message | string |
| source length | uint8_t |
| source | string |
| warning level | uint8_t |
Summary: Send an exception, error, warning or info message.
Warning level: EXCEPTION_MESSAGE, ERROR_MESSAGE, WARNING_MESSAGE, INFO_MESSAGE
EE->CON: Exceptions indicate EE program failure without recovery possibilities. Error, warning and info will end up in the PolyScope log.
CON -> EE: Indicates mainly different kinds of protocol failures.
Direction: Bilateral
Return: Not available.
RTDE_DATA_PACKAGE
| Field name | Data Type |
|---|---|
| Header | See above |
| recipe id | uint8_t |
| <variable> | <data type> |
Summary: An update to the CON/EE inputs respectively.
The <variable>s are packaged/serialized binary and match the type specified by the SETUP_OUTPUTS or SETUP_INPUTS requests return.
Direction: Bilateral
Return: Not available
RTDE_CONTROL_PACKAGE_SETUP_OUTPUTS (protocol v. 1)
| Field name | Data Type |
|---|---|
| Header | See above |
| variable names | string |
Summary: Setup the outputs recipe. At the moment the CON only supports one output recipe. The package should contain all desired output variables. The variables names is a list of comma separated variable name strings.
Direction: EE -> CON
Return
| Field name | Data Type |
|---|---|
| Header | See above |
| variable types | string |
Summary: Returns the variable types in the same order as they were supplied in the request.
Variable types: VECTOR6D, VECTOR3D, VECTOR6INT32, VECTOR6UINT32, DOUBLE, UINT64, UINT32, INT32, BOOL, UINT8
If a variable is not available, then the variable type will be "NOT_FOUND".
In case of one or more "NOT_FOUND" return values, the recipe is considered invalid and the RTDE will not output this data.
RTDE_CONTROL_PACKAGE_SETUP_OUTPUTS (protocol v. 2)
| Field name | Data Type |
|---|---|
| Header | See above |
| output frequency | double |
| variable names | string |
Summary: Setup the outputs recipe. At the moment the CON only supports one output recipe and the output frequency is configurable. The frequency must be between 1 and 125 Hz and the output rate will be according to floor(125 / frequency). The package should contain all desired output variables. The variable names is a list of comma separated variable name strings.
Direction: EE -> CON
Return
| Field name | Data Type |
|---|---|
| Header | See above |
| output recipe id | uint8_t |
| variable types | string |
Summary: Returns the variable types in the same order as they were supplied in the request.
Variable types: VECTOR6D, VECTOR3D, VECTOR6INT32, VECTOR6UINT32, DOUBLE, UINT64, UINT32, INT32, BOOL, UINT8
If a variable is not available, then the variable type will be "NOT_FOUND".
In case of one or more "NOT_FOUND" return values, the recipe is considered invalid and the RTDE will not output this data (output recipe id = 0).
RTDE_CONTROL_PACKAGE_SETUP_INPUTS
| Field name | Data Type |
|---|---|
| Header | See above |
| variable names | string |
Summary: Setup a CON input recipe.The CON supports 255 different input recipes (0 is reserved). The variables names is a list of comma separated variable name strings.
Direction: EE -> CON
Return
| Field name | Data Type |
|---|---|
| Header | See above |
| input recipe id | uint8_t |
| variable types | string |
Summary: Returns the variable types in the same order as they were supplied in the request.
Variable types: VECTOR6D, VECTOR3D, VECTOR6INT32, VECTOR6UINT32, DOUBLE, UINT64, UINT32, INT32, BOOL, UINT8
If a variable has been claimed by another EE, then the variable type will be "IN_USE".
If a variable is not available, then the variable type will be "NOT_FOUND".
In case of one or more "IN_USE" or "NOT_FOUND" return values, the recipe is considered invalid (input recipe id = 0).
RTDE_CONTROL_PACKAGE_START
| Field name | Data Type |
|---|---|
|
Header |
See above |
Summary: Request the controller to start sending output updates. This will fail if e.g. an output package has not been configured yet.
Direction: EE -> CON
Return
| Field name | Data Type |
|---|---|
| Header | See above |
| accepted | uint8_t |
Summary: The CON accepts or not. Either 1 (success) or 0 (failed).
RTDE_CONTROL_PACKAGE_PAUSE
| Field name | Data Type |
|---|---|
| Header | See above |
Summary: Request the CON to pause sending output updates.
Direction: EE -> CON
Return
| Field name | Data Type |
|---|---|
| Header | See above |
| accepted | uint8_t |
Summary: The CON will always accept a pause command and return a 1 (success).