Skip to content

Commit 808bb07

Browse files
authored
Merge pull request #328 from lbr-stack/backport-324-to-jazzy
Backport 324 to jazzy
2 parents 6ad6d11 + 5c98046 commit 808bb07

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

41 files changed

+782
-501
lines changed

CHANGELOG.rst

Lines changed: 44 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,66 @@
11
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
22
Changelog for package LBR FRI ROS 2 Stack
33
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
4-
Jazzy v2.4.0 (TBD)
4+
Jazzy v2.4.0 (2025-12-06)
55
--------------------------
6+
This release removes the asynchronous force-torque estimation from the system interface (introduced in https://github.com/lbr-stack/lbr_fri_ros2_stack/releases/tag/humble-v2.2.0)
7+
and instead provides a synchronous estimation in the form of a chainable ROS 2 controller. It further adds some controller updates, API fixes, and safety improvements.
8+
9+
* ``lbr_bringup``: Added new chainable wrench interface controller to ``hardware.launch.py`` and added launch event handler for preceeding controllers
10+
* ``lbr_demos``: Updated topics ``/lbr/state`` -> ``/lbr/lbr_state``
11+
* ``lbr_description``:
12+
13+
* Removed now redundant ``estimated_ft_sensor`` from ``lbr_system_config.yaml`` and removed thus unused ``hardware`` prefix
14+
* Removed all ``hardware`` specifiers from ``lbr_system_interface.xacro``
15+
* ``lbr_fri_ros2``:
16+
17+
* Removed now redundant asynchronous ``lbr_fri_ros2::FTEstimator`` worker (also removed from ``lbr_ros2_control::SystemInterface``)
18+
* Renamed ``lbr_fri_ros::FTEstimatorImpl`` -> ``lbr_fri_ros2::WrenchEstimator``
19+
* Fixed twist clamping bug: https://github.com/lbr-stack/lbr_fri_ros2_stack/issues/313
620
* ``lbr_ros2_control``:
721

8-
* ``/lbr/state`` -> ``/lbr/lbr_state`` consistent with https://github.com/lbr-stack/lbr_fri_ros2_stack/pull/271.
9-
* Fixes missing integration step in the admittance controller: https://github.com/lbr-stack/lbr_fri_ros2_stack/issues/320.
10-
* Exit ``on_activate`` in ``lbr_ros2_control::SystemInterface`` with error on ``IDLE``: https://github.com/lbr-stack/lbr_fri_ros2_stack/issues/321.
22+
* Changes to ``lbr_ros2_control::SystemInterface``:
23+
24+
* Removed force-torque estimation from ``lbr_ros2_control::SystemInterface``
25+
* Exit ``on_activate`` in ``lbr_ros2_control::SystemInterface`` with error on ``IDLE``: https://github.com/lbr-stack/lbr_fri_ros2_stack/issues/321
26+
* Changes to controllers:
27+
28+
* ``lbr_ros2_control::EstimatedWrenchInterface``: Added new chainable controller for synchronous force-torque estimation and state interface
29+
* ``lbr_ros2_control::TwistController``: Stop twist controller on any joint limits: https://github.com/lbr-stack/lbr_fri_ros2_stack/issues/314
30+
* ``lbr_ros2_control::LBRStateBroadcaster``:
31+
32+
* ``/lbr/state`` -> ``/lbr/lbr_state`` consistent with https://github.com/lbr-stack/lbr_fri_ros2_stack/pull/271
33+
* Removed deprecated ``trylock()`` from ``lbr_ros2_control::LBRStateBroadcaster``: https://github.com/ros-controls/realtime_tools/pull/323
34+
* ``lbr_ros2_control::AdmittanceController``:
35+
36+
* Fixed missing integration step in the admittance controller: https://github.com/lbr-stack/lbr_fri_ros2_stack/issues/320
37+
* Added an adjustable load data safety tolerance: https://github.com/lbr-stack/lbr_fri_ros2_stack/issues/325
38+
* Replaced veloctiy command filtering with force state filtering: https://github.com/lbr-stack/lbr_fri_ros2_stack/issues/327
39+
* Related pull requests:
40+
41+
* Twist clamping and ``lbr_ros2_control::TwistController`` controller updates: https://github.com/lbr-stack/lbr_fri_ros2_stack/pull/315
42+
* ``lbr_ros2_control::AdmittanceController`` integration step and ``lbr_ros2_control::SystemInterface::on_activate`` exit: https://github.com/lbr-stack/lbr_fri_ros2_stack/pull/322
43+
* ``lbr_ros2_control::SystemInterface`` force-torque estimation removal (including new chainable controller): https://github.com/lbr-stack/lbr_fri_ros2_stack/pull/324
1144

1245
Jazzy v2.3.0 (2025-11-21)
1346
--------------------------
1447
* ``lbr_fri_ros2``:
1548

1649
* Interfaces now default to return by value for simplicity.
17-
* Added a new ``StateGuard`` that tests for load data calibration on activation in compliant control modes and shuts the connection otherwise.
18-
* Instead of disconnecting on ``CommandGuard`` limits, ``CommandInterfaces`` now execute a neutral command.
50+
* Added a new ``StateGuard`` that tests for load data calibration on activation in compliant control modes and shuts the connection otherwise
51+
* Instead of disconnecting on ``CommandGuard`` limits, ``CommandInterfaces`` now execute a neutral command
1952
* ``lbr_description``:
2053

2154
* Updated joint limits (upper / lower) to be 1 degree stricter to avoid hardware limits.
2255
* Added ``safety_controller`` tag to URDF files. Note, in Jazzy this is only utilised when ``enforce_command_limits:=true`` for the controller manager (default configured in ``lbr_controllers.yaml`` here).
2356
* ``lbr_ros2_control``:
2457

25-
* Migrated to Jazzy following guidelines at https://control.ros.org/jazzy/doc/ros2_control/doc/migration.html#migration-of-command-stateinterfaces.
58+
* Migrated to Jazzy following guidelines at https://control.ros.org/jazzy/doc/ros2_control/doc/migration.html#migration-of-command-stateinterfaces
2659
* Removed the default error from ``AdmittanceController`` with the introduction of load data checks. Also now supports the default ``lbr_system_config.yaml``.
27-
* WARN: KUKA's Cartesian impedance controller seems quite prone to singularities, and should thus be used with caution and only in ``T1`` mode.
60+
* WARN: KUKA's Cartesian impedance controller seems quite prone to singularities, and should thus be used with caution and only in ``T1`` mode
2861

2962
* ``LBRWrenchCommandController`` (uses Cartesian impedance) is now a ``ChainableControllerInterface`` to support separate wrench and joint position commands: https://github.com/lbr-stack/lbr_fri_ros2_stack/issues/250
30-
* Future releases will chain the ``LBRTorqueCommandController``, which uses KUKA's joint impedance controller without singularity issues.
63+
* Future releases will chain the ``LBRTorqueCommandController``, which uses KUKA's joint impedance controller without singularity issues
3164
* Topics were updated to reflect the chained controller structure:
3265

3366
* ``/lbr/wrench`` -> ``/lbr/lbr_wrench_command``
@@ -79,10 +112,10 @@ Humble v2.1.2 (2024-10-18)
79112

80113
Humble v2.1.1 (2024-09-27)
81114
--------------------------
82-
* Adds support for the new Gazebo and removes support for Gazebo Classic (End-of-Life January 2025, refer https://community.gazebosim.org/t/gazebo-classic-end-of-life/2563).
115+
* Adds support for the new Gazebo and removes support for Gazebo Classic (End-of-Life January 2025, refer https://community.gazebosim.org/t/gazebo-classic-end-of-life/2563)
83116

84117
* ``lbr_bringup``: Updated launch files and dependencies.
85-
* ``lbr_description``: Updated ``<gazebo>`` tag to include Gazebo plugin (see https://github.com/ros-controls/gz_ros2_control/tree/humble).
118+
* ``lbr_description``: Updated ``<gazebo>`` tag to include Gazebo plugin (see https://github.com/ros-controls/gz_ros2_control/tree/humble)
86119
* ``lbr_ros2_control``: Changed ``gazebo_ros2_control/GazeboSystem`` -> ``ign_ros2_control/IgnitionSystem```
87120

88121
Humble v2.1.0 (2024-09-10)

CITATION.cff

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,6 @@ authors:
1919

2020

2121
title: "LBR-Stack: ROS 2 and Python Integration of KUKA FRI for Med and IIWA Robots"
22-
version: 2.3.0
22+
version: 2.4.0
2323
doi: 10.21105/joss.06138
24-
date-released: 2025-03-26
24+
date-released: 2025-12-06

README.md

Lines changed: 33 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,18 @@ ROS 2 packages for the KUKA LBR, including communication to the real robot via t
1515
<th align="left" width="25%">LBR Med 14 R820</th>
1616
</tr>
1717
<tr>
18-
<td align="center"><img src="https://raw.githubusercontent.com/lbr-stack/lbr_fri_ros2_stack/jazzy/lbr_fri_ros2_stack/doc/img/foxglove/iiwa7_r800.png" alt="LBR IIWA 7 R800"></td>
19-
<td align="center"><img src="https://raw.githubusercontent.com/lbr-stack/lbr_fri_ros2_stack/jazzy/lbr_fri_ros2_stack/doc/img/foxglove/iiwa14_r820.png" alt="LBR IIWA 14 R820"></td>
20-
<td align="center"><img src="https://raw.githubusercontent.com/lbr-stack/lbr_fri_ros2_stack/jazzy/lbr_fri_ros2_stack/doc/img/foxglove/med7_r800.png" alt="LBR Med 7 R800"></td>
21-
<td align="center"><img src="https://raw.githubusercontent.com/lbr-stack/lbr_fri_ros2_stack/jazzy/lbr_fri_ros2_stack/doc/img/foxglove/med14_r820.png" alt="LBR Med 14 R820"></td>
18+
<td align="center">
19+
<img src="https://raw.githubusercontent.com/lbr-stack/lbr_fri_ros2_stack/jazzy/lbr_fri_ros2_stack/doc/img/foxglove/iiwa7_r800.png" alt="LBR IIWA 7 R800">
20+
</td>
21+
<td align="center">
22+
<img src="https://raw.githubusercontent.com/lbr-stack/lbr_fri_ros2_stack/jazzy/lbr_fri_ros2_stack/doc/img/foxglove/iiwa14_r820.png" alt="LBR IIWA 14 R820">
23+
</td>
24+
<td align="center">
25+
<img src="https://raw.githubusercontent.com/lbr-stack/lbr_fri_ros2_stack/jazzy/lbr_fri_ros2_stack/doc/img/foxglove/med7_r800.png" alt="LBR Med 7 R800">
26+
</td>
27+
<td align="center">
28+
<img src="https://raw.githubusercontent.com/lbr-stack/lbr_fri_ros2_stack/jazzy/lbr_fri_ros2_stack/doc/img/foxglove/med14_r820.png" alt="LBR Med 14 R820">
29+
</td>
2230
</tr>
2331
</table>
2432
</body>
@@ -86,15 +94,28 @@ Full documentation available on [Read the Docs](https://lbr-stack.readthedocs.io
8694
Now, run the [demos](https://lbr-stack.readthedocs.io/en/latest/lbr_fri_ros2_stack/lbr_demos/doc/lbr_demos.html). To get started with the real robot, checkout the [Hardware Setup](https://lbr-stack.readthedocs.io/en/latest/lbr_fri_ros2_stack/lbr_fri_ros2_stack/doc/hardware_setup.html).
8795

8896
## Repositories Using This Project
89-
- [KUKA ROS2 controllers](https://github.com/idra-lab/kuka_lbr_control)A repository for controlling KUKA LBR iiwa and med robots using various control algorithms.
97+
- [KUKA ROS 2 Controllers](https://github.com/idra-lab/kuka_lbr_control): A repository for controlling KUKA LBR IIWA and Med robots using various control algorithms.
9098

91-
<div align="center">
92-
93-
| Kinematics Control | Gravity compensation | Impedance Control |
94-
| :----------------- | :--------------------| :---------------- |
95-
| <img src='https://raw.githubusercontent.com/idra-lab/kuka_lbr_control/main/assets/videos/kin.gif' width=360/> | <img src='https://raw.githubusercontent.com/idra-lab/kuka_lbr_control/main/assets/videos/grav.gif' width=360/> | <img src='https://raw.githubusercontent.com/idra-lab/kuka_lbr_control/main/assets/videos/imp.gif' width=360/> |
96-
97-
</div>
99+
<body>
100+
<table style="width:100%; table-layout:fixed;">
101+
<tr>
102+
<th align="left" width="33%">Kinematics Control</th>
103+
<th align="left" width="33%">Gravity Compensation</th>
104+
<th align="left" width="33%">Impedance Control</th>
105+
</tr>
106+
<tr>
107+
<td align="center">
108+
<img src="https://raw.githubusercontent.com/idra-lab/kuka_lbr_control/main/assets/videos/kin.gif" alt="Kinematics Control">
109+
</td>
110+
<td align="center">
111+
<img src="https://raw.githubusercontent.com/idra-lab/kuka_lbr_control/main/assets/videos/grav.gif" alt="Gravity Compensation">
112+
</td>
113+
<td align="center">
114+
<img src="https://raw.githubusercontent.com/idra-lab/kuka_lbr_control/main/assets/videos/imp.gif" alt="Impedance Control">
115+
</td>
116+
</tr>
117+
</table>
118+
</body>
98119

99120
## Citation
100121
If you enjoyed using this repository for your work, we would really appreciate ❤️ if you could leave a ⭐ and / or cite it, as it helps us to continue offering support.

lbr_bringup/launch/hardware.launch.py

Lines changed: 24 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
from launch import LaunchDescription
22
from launch.actions import RegisterEventHandler
3-
from launch.event_handlers import OnProcessStart
3+
from launch.event_handlers import OnExecutionComplete, OnProcessStart
44
from launch.substitutions import LaunchConfiguration
55
from lbr_bringup.description import LBRDescriptionMixin
66
from lbr_bringup.ros2_control import LBRROS2ControlMixin
@@ -31,27 +31,42 @@ def generate_launch_description() -> LaunchDescription:
3131
ros2_control_node = LBRROS2ControlMixin.node_ros2_control(use_sim_time=False)
3232
ld.add_action(ros2_control_node)
3333

34-
# joint state broad caster and controller on ros2 control node start
34+
# controllers on ros2 control node start
3535
joint_state_broadcaster = LBRROS2ControlMixin.node_controller_spawner(
3636
controller="joint_state_broadcaster"
3737
)
38-
force_torque_broadcaster = LBRROS2ControlMixin.node_controller_spawner(
39-
controller="force_torque_broadcaster"
38+
estimated_wrench_interface = LBRROS2ControlMixin.node_controller_spawner(
39+
controller="estimated_wrench_interface"
4040
)
4141
lbr_state_broadcaster = LBRROS2ControlMixin.node_controller_spawner(
4242
controller="lbr_state_broadcaster"
4343
)
44-
controller = LBRROS2ControlMixin.node_controller_spawner(
45-
controller=LaunchConfiguration("ctrl")
46-
)
4744

48-
controller_event_handler = RegisterEventHandler(
45+
preceding_controllers_event_handler = RegisterEventHandler(
4946
OnProcessStart(
5047
target_action=ros2_control_node,
5148
on_start=[
5249
joint_state_broadcaster,
53-
force_torque_broadcaster,
50+
estimated_wrench_interface,
5451
lbr_state_broadcaster,
52+
],
53+
)
54+
)
55+
ld.add_action(preceding_controllers_event_handler)
56+
57+
# controllers on estimated wrench interface
58+
force_torque_broadcaster = LBRROS2ControlMixin.node_controller_spawner(
59+
controller="force_torque_broadcaster"
60+
)
61+
controller = LBRROS2ControlMixin.node_controller_spawner(
62+
controller=LaunchConfiguration("ctrl")
63+
)
64+
65+
controller_event_handler = RegisterEventHandler(
66+
OnExecutionComplete(
67+
target_action=estimated_wrench_interface, # estimated wrench interface is chained and exposes external wrench estimate state interfaces
68+
on_completion=[
69+
force_torque_broadcaster,
5570
controller,
5671
],
5772
)

lbr_bringup/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_format3.xsd" schematypens="http://www.w3.org/2001/XMLSchema"?>
33
<package format="3">
44
<name>lbr_bringup</name>
5-
<version>2.3.0</version>
5+
<version>2.4.0</version>
66
<description>LBR launch files.</description>
77
<maintainer email="m.huber_1994@hotmail.de">mhubii</maintainer>
88
<license>Apache-2.0</license>

lbr_demos/lbr_demos_advanced_cpp/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_format3.xsd" schematypens="http://www.w3.org/2001/XMLSchema"?>
33
<package format="3">
44
<name>lbr_demos_advanced_cpp</name>
5-
<version>2.3.0</version>
5+
<version>2.4.0</version>
66
<description>Advanced C++ demos for the lbr_ros2_control.</description>
77
<maintainer email="m.huber_1994@hotmail.de">mhubii</maintainer>
88
<license>Apache-2.0</license>

lbr_demos/lbr_demos_advanced_py/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_format3.xsd" schematypens="http://www.w3.org/2001/XMLSchema"?>
33
<package format="3">
44
<name>lbr_demos_advanced_py</name>
5-
<version>2.3.0</version>
5+
<version>2.4.0</version>
66
<description>Advanced Python demos for the lbr_ros2_control.</description>
77
<maintainer email="m.huber_1994@hotmail.de">mhubii</maintainer>
88
<maintainer email="mower.chris@gmail.com">cmower</maintainer>

lbr_demos/lbr_demos_advanced_py/setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
setup(
88
name=package_name,
9-
version="2.3.0",
9+
version="2.4.0",
1010
packages=[package_name],
1111
data_files=[
1212
("share/ament_index/resource_index/packages", ["resource/" + package_name]),

lbr_demos/lbr_demos_cpp/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_format3.xsd" schematypens="http://www.w3.org/2001/XMLSchema"?>
33
<package format="3">
44
<name>lbr_demos_cpp</name>
5-
<version>2.3.0</version>
5+
<version>2.4.0</version>
66
<description>C++ demos for lbr_ros2_control.</description>
77
<maintainer email="m.huber_1994@hotmail.de">mhubii</maintainer>
88
<license>Apache-2.0</license>

lbr_demos/lbr_demos_py/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_format3.xsd" schematypens="http://www.w3.org/2001/XMLSchema"?>
33
<package format="3">
44
<name>lbr_demos_py</name>
5-
<version>2.3.0</version>
5+
<version>2.4.0</version>
66
<description>Python demos for lbr_ros2_control.</description>
77
<maintainer email="m.huber_1994@hotmail.de">mhubii</maintainer>
88
<license>Apache-2.0</license>

0 commit comments

Comments
 (0)