Skip to content

Commit d3c06eb

Browse files
authored
Merge branch 'master' into auto_reconnect_rtde
2 parents d7a622a + d68f808 commit d3c06eb

File tree

13 files changed

+199
-145
lines changed

13 files changed

+199
-145
lines changed

.github/release.yml

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
---
2+
changelog:
3+
exclude:
4+
labels:
5+
- release
6+
categories:
7+
- title: Bugfixes
8+
labels:
9+
- bugfix
10+
- bug
11+
- title: New features
12+
labels:
13+
- enhancement
14+
- title: Documentation
15+
labels:
16+
- documentation
17+
- title: CI/ Repo / Packages
18+
labels:
19+
- CI
20+
- package
21+
- dependencies
22+
- title: Other
23+
labels:
24+
- "*"

CHANGELOG.rst

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,16 @@
22
Changelog for package ur_client_library
33
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
44

5+
2.4.0 (2025-10-13)
6+
------------------
7+
* UR18 support (`#387 <https://github.com/UniversalRobots/Universal_Robots_Client_Library/issues/387>`_)
8+
* Remove output_bit_register_0...63 and input_bit_register_0..63 from RTDE list (`#385 <https://github.com/UniversalRobots/Universal_Robots_Client_Library/issues/385>`_)
9+
* Set force mode parameters from config (`#383 <https://github.com/UniversalRobots/Universal_Robots_Client_Library/issues/383>`_)
10+
* Direct torque control (`#381 <https://github.com/UniversalRobots/Universal_Robots_Client_Library/issues/381>`_)
11+
* Update RTDE list to include new fields (`#380 <https://github.com/UniversalRobots/Universal_Robots_Client_Library/issues/380>`_)
12+
* Add const qualifier to get functions and changed map value retrieval to at() function (`#379 <https://github.com/UniversalRobots/Universal_Robots_Client_Library/issues/379>`_)
13+
* Contributors: Dominic Reber, Felix Exner, Pablo David Aranda Rodriguez, URJala
14+
515
2.3.0 (2025-09-15)
616
------------------
717
* Install endian header on Windows and Apple only (`#372 <https://github.com/UniversalRobots/Universal_Robots_Client_Library/issues/372>`_)

doc/architecture/rtde_client.rst

Lines changed: 43 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ client. To use the RTDE-Client, you'll have to initialize and start it separatel
1111

1212
.. code-block:: c++
1313

14-
rtde_interface::RTDEClient my_client(ROBOT_IP, notifier, OUTPUT_RECIPE, INPUT_RECIPE);
14+
rtde_interface::RTDEClient my_client(ROBOT_IP, notifier, OUTPUT_RECIPE_FILE, INPUT_RECIPE_FILE);
1515
my_client.init();
1616
my_client.start();
1717
while (true)
@@ -28,6 +28,20 @@ outputs. Please refer to the `RTDE
2828
guide <https://www.universal-robots.com/articles/ur-articles/real-time-data-exchange-rtde-guide/>`_
2929
on which elements are available.
3030

31+
.. note::
32+
33+
The recipes can be either passed as a filename or as a list of strings directly. E.g. the
34+
following will work
35+
36+
.. code-block:: c++
37+
38+
rtde_interface::RTDEClient my_client(
39+
ROBOT_IP,
40+
notifier,
41+
{"timestamp", "actual_q"},
42+
{"speed_slider_mask", "speed_slider_fraction"}
43+
);
44+
3145
Inside the ``RTDEclient`` data is received in a separate thread, parsed by the ``RTDEParser`` and
3246
added to a pipeline queue.
3347

@@ -56,6 +70,29 @@ sure to
5670
frequency, please use the ``resetRTDEClient()`` method after the ``UrDriver`` object has been
5771
created.
5872

73+
Read-Only RTDEClient
74+
--------------------
75+
76+
While RTDE allows multiple clients to connect to the same robot, only one client is allowed to
77+
write data to the robot. To create a read-only RTDE client, the ``RTDEClient`` can be created with
78+
an empty input recipe, like this:
79+
80+
.. code-block:: c++
81+
82+
rtde_interface::RTDEClient my_client(ROBOT_IP, notifier, OUTPUT_RECIPE, {});
83+
// Alternatively, pass an empty filename when using recipe files
84+
// rtde_interface::RTDEClient my_client(ROBOT_IP, notifier, OUTPUT_RECIPE_FILE, "");
85+
my_client.init();
86+
my_client.start();
87+
while (true)
88+
{
89+
std::unique_ptr<rtde_interface::DataPackage> data_pkg = my_client.getDataPackage(READ_TIMEOUT);
90+
if (data_pkg)
91+
{
92+
std::cout << data_pkg->toString() << std::endl;
93+
}
94+
}
95+
5996
RTDEWriter
6097
----------
6198

@@ -66,3 +103,8 @@ The class offers specific methods for every RTDE input possible to write.
66103

67104
Data is sent asynchronously to the RTDE interface.
68105

106+
.. note::
107+
108+
The ``RTDEWriter`` will return ``false`` on any writing attempts for fields that have not been
109+
setup in the ``INPUT_RECIPE``. When no input recipe was provided, all write operations will
110+
return ``false``.

include/ur_client_library/rtde/data_package.h

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,22 @@ class DataPackage : public RTDEPackage
7171
this->protocol_version_ = other.protocol_version_;
7272
}
7373

74+
DataPackage& operator=(DataPackage& other)
75+
{
76+
this->data_ = other.data_;
77+
this->recipe_ = other.recipe_;
78+
this->protocol_version_ = other.protocol_version_;
79+
return *this;
80+
}
81+
82+
DataPackage operator=(const DataPackage& other)
83+
{
84+
this->data_ = other.data_;
85+
this->recipe_ = other.recipe_;
86+
this->protocol_version_ = other.protocol_version_;
87+
return *this;
88+
}
89+
7490
/*!
7591
* \brief Creates a new DataPackage object, based on a given recipe.
7692
*
@@ -82,6 +98,7 @@ class DataPackage : public RTDEPackage
8298
: RTDEPackage(PackageType::RTDE_DATA_PACKAGE), recipe_(recipe), protocol_version_(protocol_version)
8399
{
84100
}
101+
85102
virtual ~DataPackage() = default;
86103

87104
/*!

include/ur_client_library/rtde/rtde_writer.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,15 @@ class RTDEWriter
6363
{
6464
stop();
6565
}
66+
67+
/*!
68+
* \brief Sets a new input recipe. This can be used to change the input recipe on the fly, if
69+
* needed.
70+
*
71+
* \param recipe The new recipe to use
72+
*/
73+
void setInputRecipe(const std::vector<std::string>& recipe);
74+
6675
/*!
6776
* \brief Starts the writer thread, which periodically clears the queue to write packages to the
6877
* robot.

include/ur_client_library/ur/datatypes.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,7 @@ enum class RobotType : int8_t
9595
UR10 = 2,
9696
UR3 = 3,
9797
UR16 = 4,
98+
UR18 = 5,
9899
UR8LONG = 6,
99100
UR20 = 7,
100101
UR30 = 8,

package.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
<?xml-model href="http://download.ros.org/schema/package_format2.xsd" schematypens="http://www.w3.org/2001/XMLSchema"?>
33
<package format="3">
44
<name>ur_client_library</name>
5-
<version>2.3.0</version>
5+
<version>2.4.0</version>
66
<description>Standalone C++ library for accessing Universal Robots interfaces. This has been forked off the ur_robot_driver.</description>
77
<author>Thomas Timm Andersen</author>
88
<author>Simon Rasmussen</author>

scripts/start_ursim.sh

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ help()
4343
echo
4444
echo "Syntax: `basename "$0"` [-m|s|h]"
4545
echo "options:"
46-
echo " -m <model> Robot model. One of [ur3, ur3e, ur5, ur5e, ur7e, ur8long, ur10e, ur12e, ur16e, ur15, ur20, ur30]. Defaults to ur5e."
46+
echo " -m <model> Robot model. One of [ur3, ur3e, ur5, ur5e, ur7e, ur8long, ur10e, ur12e, ur16e, ur15, ur18, ur20, ur30]. Defaults to ur5e."
4747
echo " -v <version> URSim version that should be used.
4848
See https://hub.docker.com/r/universalrobots/ursim_e-series/tags
4949
for available versions. Defaults to 'latest'"
@@ -86,7 +86,7 @@ get_series_from_model()
8686
ur3e|ur5e|ur7e|ur10e|ur12e|ur16e)
8787
ROBOT_SERIES=e-series
8888
;;
89-
ur8long|ur15|ur20|ur30)
89+
ur8long|ur15|ur18|ur20|ur30)
9090
ROBOT_SERIES=e-series
9191
;;
9292
*)
@@ -125,7 +125,7 @@ strip_robot_model()
125125
ROBOT_MODEL=${robot_model^^}
126126
else
127127
ROBOT_MODEL=${robot_model^^}
128-
# UR8LONG, UR15, UR20 and UR30 need no further adjustment
128+
# UR8LONG, UR15, UR18, UR20 and UR30 need no further adjustment
129129
if [[ "$robot_model" = @(ur3e|ur5e|ur10e|ur16e) ]]; then
130130
ROBOT_MODEL=$(echo "${ROBOT_MODEL:0:$((${#ROBOT_MODEL}-1))}")
131131
elif [[ "$robot_model" = @(ur7e|ur12e) ]]; then
@@ -153,8 +153,8 @@ validate_parameters()
153153
local MIN_UR30="5.15.0"
154154
local MIN_UR7e="5.22.0" # and UR12e
155155
local MIN_UR7e_X="10.9.0" # and UR12e
156-
local MIN_UR8LONG="5.23.0"
157-
local MIN_UR8LONG_X="10.11.0"
156+
local MIN_UR8LONG="5.23.0" # and UR18
157+
local MIN_UR8LONG_X="10.11.0" # and UR18
158158

159159
local URSIM_VERSION_CHECK="$URSIM_VERSION"
160160
if [[ "$URSIM_VERSION" == "latest" ]]; then
@@ -184,7 +184,7 @@ validate_parameters()
184184
verlte "$MIN_CB3" "$URSIM_VERSION_CHECK" && return 0
185185
;;
186186
e-series)
187-
if [[ $ROBOT_MODEL != @(ur3e|ur5e|ur7e|ur8long|ur10e|ur12e|ur16e|ur15|ur20|ur30) ]]; then
187+
if [[ $ROBOT_MODEL != @(ur3e|ur5e|ur7e|ur8long|ur10e|ur12e|ur16e|ur15|ur18|ur20|ur30) ]]; then
188188
echo "$ROBOT_MODEL is no valid e-series model!" && exit 1
189189
fi
190190
if [[ $ROBOT_MODEL == "ur15" ]]; then
@@ -195,7 +195,7 @@ validate_parameters()
195195
MIN_VERSION=$MIN_UR30
196196
elif [[ $ROBOT_MODEL == "ur7e" || $ROBOT_MODEL == "ur12e" ]]; then
197197
MIN_VERSION=$MIN_UR7e
198-
elif [[ $ROBOT_MODEL == "ur8long" ]]; then
198+
elif [[ $ROBOT_MODEL == "ur8long" || $ROBOT_MODEL == "ur18" ]]; then
199199
MIN_VERSION=$MIN_UR8LONG
200200
else
201201
MIN_VERSION=$MIN_E_SERIES
@@ -206,11 +206,11 @@ validate_parameters()
206206
echo "PolyscopeX is only supported from version $MIN_POLYSCOPE_X onwards"
207207
exit 1
208208
fi
209-
if [[ $ROBOT_MODEL != @(ur3e|ur5e|ur7e|ur8long|ur10e|ur12e|ur16e|ur15|ur20|ur30) ]]; then
209+
if [[ $ROBOT_MODEL != @(ur3e|ur5e|ur7e|ur8long|ur10e|ur12e|ur16e|ur15|ur18|ur20|ur30) ]]; then
210210
echo "$ROBOT_MODEL is no valid PolyscopeX model!" && exit 1
211211
elif [[ $ROBOT_MODEL == "ur7e" || $ROBOT_MODEL == "ur12e" ]]; then
212212
MIN_VERSION=$MIN_UR7e_X
213-
elif [[ $ROBOT_MODEL == "ur8long" ]]; then
213+
elif [[ $ROBOT_MODEL == "ur8long" || $ROBOT_MODEL == "ur18" ]]; then
214214
MIN_VERSION=$MIN_UR8LONG_X
215215
elif [[ $ROBOT_MODEL == "ur15" ]]; then
216216
MIN_VERSION=$MIN_UR15_X

src/rtde/data_package.cpp

Lines changed: 0 additions & 128 deletions
Original file line numberDiff line numberDiff line change
@@ -50,70 +50,6 @@ std::unordered_map<std::string, DataPackage::_rtde_type_variant> DataPackage::g_
5050
// INPUT / OUTPUT
5151
{ "input_bit_registers0_to_31", uint32_t() },
5252
{ "input_bit_registers32_to_63", uint32_t() },
53-
{ "input_bit_register_0", bool() },
54-
{ "input_bit_register_1", bool() },
55-
{ "input_bit_register_2", bool() },
56-
{ "input_bit_register_3", bool() },
57-
{ "input_bit_register_4", bool() },
58-
{ "input_bit_register_5", bool() },
59-
{ "input_bit_register_6", bool() },
60-
{ "input_bit_register_7", bool() },
61-
{ "input_bit_register_8", bool() },
62-
{ "input_bit_register_9", bool() },
63-
{ "input_bit_register_10", bool() },
64-
{ "input_bit_register_11", bool() },
65-
{ "input_bit_register_12", bool() },
66-
{ "input_bit_register_13", bool() },
67-
{ "input_bit_register_14", bool() },
68-
{ "input_bit_register_15", bool() },
69-
{ "input_bit_register_16", bool() },
70-
{ "input_bit_register_17", bool() },
71-
{ "input_bit_register_18", bool() },
72-
{ "input_bit_register_19", bool() },
73-
{ "input_bit_register_20", bool() },
74-
{ "input_bit_register_21", bool() },
75-
{ "input_bit_register_22", bool() },
76-
{ "input_bit_register_23", bool() },
77-
{ "input_bit_register_24", bool() },
78-
{ "input_bit_register_25", bool() },
79-
{ "input_bit_register_26", bool() },
80-
{ "input_bit_register_27", bool() },
81-
{ "input_bit_register_28", bool() },
82-
{ "input_bit_register_29", bool() },
83-
{ "input_bit_register_30", bool() },
84-
{ "input_bit_register_31", bool() },
85-
{ "input_bit_register_32", bool() },
86-
{ "input_bit_register_33", bool() },
87-
{ "input_bit_register_34", bool() },
88-
{ "input_bit_register_35", bool() },
89-
{ "input_bit_register_36", bool() },
90-
{ "input_bit_register_37", bool() },
91-
{ "input_bit_register_38", bool() },
92-
{ "input_bit_register_39", bool() },
93-
{ "input_bit_register_40", bool() },
94-
{ "input_bit_register_41", bool() },
95-
{ "input_bit_register_42", bool() },
96-
{ "input_bit_register_43", bool() },
97-
{ "input_bit_register_44", bool() },
98-
{ "input_bit_register_45", bool() },
99-
{ "input_bit_register_46", bool() },
100-
{ "input_bit_register_47", bool() },
101-
{ "input_bit_register_48", bool() },
102-
{ "input_bit_register_49", bool() },
103-
{ "input_bit_register_50", bool() },
104-
{ "input_bit_register_51", bool() },
105-
{ "input_bit_register_52", bool() },
106-
{ "input_bit_register_53", bool() },
107-
{ "input_bit_register_54", bool() },
108-
{ "input_bit_register_55", bool() },
109-
{ "input_bit_register_56", bool() },
110-
{ "input_bit_register_57", bool() },
111-
{ "input_bit_register_58", bool() },
112-
{ "input_bit_register_59", bool() },
113-
{ "input_bit_register_60", bool() },
114-
{ "input_bit_register_61", bool() },
115-
{ "input_bit_register_62", bool() },
116-
{ "input_bit_register_63", bool() },
11753
{ "input_bit_register_64", bool() },
11854
{ "input_bit_register_65", bool() },
11955
{ "input_bit_register_66", bool() },
@@ -328,70 +264,6 @@ std::unordered_map<std::string, DataPackage::_rtde_type_variant> DataPackage::g_
328264
{ "io_current", double() },
329265
{ "output_bit_registers0_to_31", uint32_t() },
330266
{ "output_bit_registers32_to_63", uint32_t() },
331-
{ "output_bit_register_0", bool() },
332-
{ "output_bit_register_1", bool() },
333-
{ "output_bit_register_2", bool() },
334-
{ "output_bit_register_3", bool() },
335-
{ "output_bit_register_4", bool() },
336-
{ "output_bit_register_5", bool() },
337-
{ "output_bit_register_6", bool() },
338-
{ "output_bit_register_7", bool() },
339-
{ "output_bit_register_8", bool() },
340-
{ "output_bit_register_9", bool() },
341-
{ "output_bit_register_10", bool() },
342-
{ "output_bit_register_11", bool() },
343-
{ "output_bit_register_12", bool() },
344-
{ "output_bit_register_13", bool() },
345-
{ "output_bit_register_14", bool() },
346-
{ "output_bit_register_15", bool() },
347-
{ "output_bit_register_16", bool() },
348-
{ "output_bit_register_17", bool() },
349-
{ "output_bit_register_18", bool() },
350-
{ "output_bit_register_19", bool() },
351-
{ "output_bit_register_20", bool() },
352-
{ "output_bit_register_21", bool() },
353-
{ "output_bit_register_22", bool() },
354-
{ "output_bit_register_23", bool() },
355-
{ "output_bit_register_24", bool() },
356-
{ "output_bit_register_25", bool() },
357-
{ "output_bit_register_26", bool() },
358-
{ "output_bit_register_27", bool() },
359-
{ "output_bit_register_28", bool() },
360-
{ "output_bit_register_29", bool() },
361-
{ "output_bit_register_30", bool() },
362-
{ "output_bit_register_31", bool() },
363-
{ "output_bit_register_32", bool() },
364-
{ "output_bit_register_33", bool() },
365-
{ "output_bit_register_34", bool() },
366-
{ "output_bit_register_35", bool() },
367-
{ "output_bit_register_36", bool() },
368-
{ "output_bit_register_37", bool() },
369-
{ "output_bit_register_38", bool() },
370-
{ "output_bit_register_39", bool() },
371-
{ "output_bit_register_40", bool() },
372-
{ "output_bit_register_41", bool() },
373-
{ "output_bit_register_42", bool() },
374-
{ "output_bit_register_43", bool() },
375-
{ "output_bit_register_44", bool() },
376-
{ "output_bit_register_45", bool() },
377-
{ "output_bit_register_46", bool() },
378-
{ "output_bit_register_47", bool() },
379-
{ "output_bit_register_48", bool() },
380-
{ "output_bit_register_49", bool() },
381-
{ "output_bit_register_50", bool() },
382-
{ "output_bit_register_51", bool() },
383-
{ "output_bit_register_52", bool() },
384-
{ "output_bit_register_53", bool() },
385-
{ "output_bit_register_54", bool() },
386-
{ "output_bit_register_55", bool() },
387-
{ "output_bit_register_56", bool() },
388-
{ "output_bit_register_57", bool() },
389-
{ "output_bit_register_58", bool() },
390-
{ "output_bit_register_59", bool() },
391-
{ "output_bit_register_60", bool() },
392-
{ "output_bit_register_61", bool() },
393-
{ "output_bit_register_62", bool() },
394-
{ "output_bit_register_63", bool() },
395267
{ "output_bit_register_64", bool() },
396268
{ "output_bit_register_65", bool() },
397269
{ "output_bit_register_66", bool() },

0 commit comments

Comments
 (0)