Real-Time Data Exchange (RTDE) Guide
Real-Time Data Exchange (RTDE) Guide
This is a guide on how to use the data synchronization protocol of the UR controller
Last modified on Apr 16, 2021
This is a guide on how to use the data synchronization protocol of the UR controller e.g. when developing URCaps/UR+ for Universal
Robots.
NOTE: All files are avalable for download at the bottom of this page.
The RTDE is available on CB3/CB3.1 from software 3.4, but specific features may only be available in newer software versions.
The RTDE synchronize external executables with the UR controller, for instance URCaps, without breaking any real-time properties. This
document first describes the protocol and then provides a Python client reference implementation.
Data types
Protocol
Header
RTDE_REQUEST_PROTOCOL_VERSION
RTDE_GET_URCONTROL_VERSION
RTDE_TEXT_MESSAGE (protocol v. 1)
RTDE_TEXT_MESSAGE (protocol v. 2)
RTDE_DATA_PACKAGE
RTDE_CONTROL_PACKAGE_SETUP_OUTPUTS (protocol v. 1)
RTDE_CONTROL_PACKAGE_SETUP_OUTPUTS (protocol v. 2)
RTDE_CONTROL_PACKAGE_SETUP_INPUTS
RTDE_CONTROL_PACKAGE_START
RTDE_CONTROL_PACKAGE_PAUSE
INTRODUCTION
The Real-Time Data Exchange (RTDE) interface provides a way to synchronize external applications with the UR controller over a standard
TCP/IP connection, without breaking any real-time properties of the UR controller. This functionality is among others useful for interacting
with fieldbus drivers (e.g. Ethernet/IP), manipulating robot I/O and plotting robot status (e.g. robot trajectories). The RTDE interface is by
default available when the UR controller is running.
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 binary 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 using 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.
timestamp DOUBLE Time elapsed since the controller was started [s]
output_bit_register_X (X=[64 .. 127]) BOOL X: [64..127] - The upper range of the boolean output 3.9.0 / 5.3.0
registers can be used by external RTDE clients (i.e
URCAPS).
input_bit_register_X (X=[64 .. 127]) BOOL X: [64..127] - The upper range of the boolean output 3.9.0 / 5.3.0
registers can be used by external RTDE clients (i.e
URCAPS).
[0..23] 3.4.0
X: [0..23] - The lower range of the integer input registers is
input_int_register_X (X=[0 .. 48]) INT32 reserved for FieldBus/PLC interface usage.
[24..47] 3.9.0 /
5.3.0
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
X: [0..23] - The lower range of the double input registers is
input_double_register_X (X=[0 .. 48]) DOUBLE reserved for FieldBus/PLC interface usage.
[24..47] 3.9.0 /
5.3.0
X: [24..47] - The upper range of the double input registers
can be used by external RTDE clients (i.e URCAPS).
DATA TYPES
Name Type Size in bits
Network byte order: Data are always sent in network byte order, so big-endian. If you read raw data directly from the socket you will see it
in big-endian, and you might need to convert to little. UR's rtde-client library will do the conversion to little.
PROTOCOL
EE = External Executable
HEADER
Field name Data Type
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
RTDE_REQUEST_PROTOCOL_VERSION
Field name Data Type
RETURN
Field name Data Type
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
Summary: Retrieves the CON major, minor, bugfix and build number.
RETURN
Field name Data Type
minor uint32_t
bugfix uint32_t
build uint32_t
RTDE_TEXT_MESSAGE (PROTOCOL V. 1)
Direction: CON -> EE
message string
message length uint8_t
message string
source string
EE->CON: Exceptions indicate EE program failure without recovery possibilities. Error, warning and info will end up in the PolyScope log.
RTDE_TEXT_MESSAGE (PROTOCOL V. 2)
Field name Data Type
message length uint8_t
message string
source string
warning level uint8_t
EE->CON: Exceptions indicate EE program failure without recovery possibilities. Error, warning and info will end up in the PolyScope log.
Direction: Bilateral
RTDE_DATA_PACKAGE
Field name Data Type
recipe id uint8_t
The <variable>s are packaged/serialized binary and match the type specified by the SETUP_OUTPUTS or SETUP_INPUTS requests return.
Direction: Bilateral
RTDE_CONTROL_PACKAGE_SETUP_OUTPUTS (PROTOCOL V. 1)
Field name Data Type
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.
RETURN
Field name Data Type
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
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
Summary: Setup the outputs recipe. At the moment the CON only supports one output recipe and the output frequency is configurable.
For CB-Series robots the frequency must be between 1 and 125 Hz and the output rate will be according to floor (125 / frequency), while
for e-Series robots the frequency can go up to 500 Hz. The package should contain all desired output variables. The variable names is a
list of comma separated variable name strings.
RETURN
Field name Data Type
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
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
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.
RETURN
Field name Data Type
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".
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
Summary: Request the controller to start sending output updates. This will fail if e.g. an output package has not been configured yet.
RETURN
Field name Data Type
accepted uint8_t
RTDE_CONTROL_PACKAGE_PAUSE
Field name Data Type
RETURN
Field name Data Type
accepted uint8_t
Summary: The CON will always accept a pause command and return a 1 (success).
EXAMPLES
record.py
Use this script as an executable to record output data from the robot and save it to a csv file.
Optional arguments
Provides a simple way to read and plot the data from a csv file recorded with the record.py.
example_control_loop.py
Example of a simple control loop. A configuration with two input recipes and one output recipe is read from XML file and sent to the RTDE
server. The control loop consist of a blocking read followed by some very simple data processing before sending new information to the
robot.
RTDE MODULE
This section describes the different classes and their public interfaces of the rtde module.
Reads the CSV file and maps each column into an entry in the namespace dictionary of the object. The column header are the
dictionary key and the value is an array of data points in the column.
Input parameters:
Returns a writer object that can take RTDE DataObjects and convert them into delimited string and write them to a file like object.
Input parameters:
writeheader()
Write column headers to current line in file based on variable names. Multidimensional variables will get an index appended to the
name in each column.
writerow(data_object)
Input parameters:
data_object (DataObject): Data object with member variables matching the names of the configured RTDE variables
class rtde_config.ConfigFile(filename)
An RTDE configuration can be loaded from an XML file containing a list of recipes. Each recipe should have a key and a list of field
with a variable name and type. An example XML recipe:
<?xml version="1.0"?>
<rtde_config>
<recipe key="out">
</recipe>
<recipe key="in1">
</recipe>
<recipe key="in2">
</recipe>
</rtde_config>
get_recipe(key)
Gets the recipe associated to the specified key given as a list of names and a list of types.
Input parameters:
Return values:
class serialize.DataObject():
A data transfer object where the RTDE variable names configured for synchronization has been added to the namespace dictionary of
the class for convenient accessing. This means that for example the timestamp can be accessed on an output DataObject like this:
objName.timestamp. The DataObject is used for both input and output.
recipe_id
The recipe_id is an integer member variable on the DataObject instance used to identify input packages configured in the RTDE
server. It is not used for output packages.
Input parameters:
connect()
Return value:
success (boolean)
disconnect()
Close the RTDE connection.
is_connected()
Return value:
open (boolean)
get_controller_version()
Returns the software version of the robot controller running the RTDE server.
Return values:
major (int)
minor (int)
bugfix (int)
build (int)
negotiate_protocol_version(protocol)
Negotiate the protocol version with the server. Returns True if the controller supports the specified protocol version. We recommend
that you use this to ensure full compatibility between your application and future versions of the robot controller.
Input parameters:
Return value:
success (boolean)
send_input_setup(variables, types)
Configure an input package that the external application will send to the robot controller. An input package is a collection of input
variables that the external application will provide to the robot controller in a single update. Variables is a list of variable names and
should be a subset of the names supported as input by the RTDE interface.The list of types is optional, but if any types are provided it
should have the same length as the variables list. The provided types will be matched with the types that the RTDE interface expects
and the function returns None if they are not equal. Multiple input packages can be configured. The returned InputObject has a
reference to the recipe id which is used to identify the specific input format when sending an update.
Input parameters:
variables (array<string>): Variable names from the list of possible RTDE inputs
types (array<string>): [Optional] Types matching the variables
Return value:
input_data (DataObject): Empty object with member variables matching the names of the configured RTDE variables
send_output_setup(variables, types)
Configure an output package that the robot controller will send to the external application at the control frequency. Variables is a list
of variable names and should be a subset of the names supported as output by the RTDE interface. The list of types is optional, but if
any types are provided it should have the same length as the variables list. The provided types will be matched with the types that the
RTDE interface expects and the function returns False if they are not equal. Only one output package format can be specified and
hence no recipe id is used for output.
Input parameters:
variables (array<string>): Variable names from the list of possible RTDE outputs
types (array<string>): [Optional] Types matching the variables
Return value:
success (boolean)
send_start()
Sends a start command to the RTDE server to initiate the actual synchronization. Setup of all inputs and outputs should be done
before starting the synchronization.
Return value:
success (boolean)
send_pause()
Sends a pause command to the RTDE server to pause the synchronization. When paused it is possible to change the input and output
configurations and start the synchronization again.
Return value:
success (boolean)
send(input_data)
Send the contents of a DataObject as input to the RTDE server. Returns True if successful.
Input parameters:
input_data (DataObject): object with member variables matching the names of the configured RTDE variables
Return value:
success (boolean)
receive()
Return value:
output_data (DataObject): object with member variables matching the names of the configured RTDE variables