Skip to content

Commit 8e85c2a

Browse files
committed
Fix resource claiming in hw interface
1 parent 67f2256 commit 8e85c2a

File tree

2 files changed

+39
-3
lines changed

2 files changed

+39
-3
lines changed

ur_robot_driver/src/hardware_interface.cpp

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1076,6 +1076,7 @@ hardware_interface::return_type URPositionHardwareInterface::prepare_command_mod
10761076
}
10771077

10781078
// Do not start conflicting controllers
1079+
// Passthrough controller requested to start
10791080
if (std::any_of(start_modes_[0].begin(), start_modes_[0].end(),
10801081
[this](auto& item) { return (item == PASSTHROUGH_GPIO); }) &&
10811082
(std::any_of(start_modes_[0].begin(), start_modes_[0].end(),
@@ -1092,15 +1093,34 @@ hardware_interface::return_type URPositionHardwareInterface::prepare_command_mod
10921093
ret_val = hardware_interface::return_type::ERROR;
10931094
}
10941095

1096+
// Force mode requested to start
10951097
if (std::any_of(start_modes_[0].begin(), start_modes_[0].end(),
10961098
[this](auto& item) { return (item == FORCE_MODE_GPIO); }) &&
10971099
(std::any_of(start_modes_[0].begin(), start_modes_[0].end(),
1098-
[](auto& item) {
1099-
return (item == hardware_interface::HW_IF_VELOCITY || item == hardware_interface::HW_IF_POSITION);
1100+
[this](auto& item) {
1101+
return (item == hardware_interface::HW_IF_VELOCITY || item == hardware_interface::HW_IF_POSITION ||
1102+
item == FREEDRIVE_MODE_GPIO);
1103+
}) ||
1104+
std::any_of(control_modes[0].begin(), control_modes[0].end(), [this](auto& item) {
1105+
return (item == hardware_interface::HW_IF_VELOCITY || item == hardware_interface::HW_IF_POSITION ||
1106+
item == FORCE_MODE_GPIO || item == FREEDRIVE_MODE_GPIO);
1107+
}))) {
1108+
RCLCPP_ERROR(get_logger(), "Attempting to start force mode control while there is either position or "
1109+
"velocity mode running.");
1110+
ret_val = hardware_interface::return_type::ERROR;
1111+
}
1112+
1113+
// Freedrive mode requested to start
1114+
if (std::any_of(start_modes_[0].begin(), start_modes_[0].end(),
1115+
[this](auto& item) { return (item == FREEDRIVE_MODE_GPIO); }) &&
1116+
(std::any_of(start_modes_[0].begin(), start_modes_[0].end(),
1117+
[this](auto& item) {
1118+
return (item == hardware_interface::HW_IF_VELOCITY || item == hardware_interface::HW_IF_POSITION ||
1119+
item == PASSTHROUGH_GPIO || item == FORCE_MODE_GPIO);
11001120
}) ||
11011121
std::any_of(control_modes[0].begin(), control_modes[0].end(), [this](auto& item) {
11021122
return (item == hardware_interface::HW_IF_VELOCITY || item == hardware_interface::HW_IF_POSITION ||
1103-
item == FORCE_MODE_GPIO);
1123+
item == PASSTHROUGH_GPIO || item == FORCE_MODE_GPIO);
11041124
}))) {
11051125
RCLCPP_ERROR(get_logger(), "Attempting to start force mode control while there is either position or "
11061126
"velocity mode running.");

ur_robot_driver/test/integration_test_controller_switch.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,14 @@ def test_activating_multiple_controllers_different_interface_fails(self):
179179
activate_controllers=[
180180
"scaled_joint_trajectory_controller",
181181
"force_mode_controller",
182+
],
183+
).ok
184+
)
185+
self.assertFalse(
186+
self._controller_manager_interface.switch_controller(
187+
strictness=SwitchController.Request.STRICT,
188+
activate_controllers=[
189+
"scaled_joint_trajectory_controller",
182190
"freedrive_mode_controller",
183191
],
184192
).ok
@@ -301,6 +309,14 @@ def test_activating_controller_with_running_passthrough_trajectory_controller_fa
301309
],
302310
).ok
303311
)
312+
self.assertFalse(
313+
self._controller_manager_interface.switch_controller(
314+
strictness=SwitchController.Request.STRICT,
315+
activate_controllers=[
316+
"freedrive_mode_controller",
317+
],
318+
).ok
319+
)
304320
# Stop the controller again
305321
self.assertTrue(
306322
self._controller_manager_interface.switch_controller(

0 commit comments

Comments
 (0)