Skip to content

Commit

Permalink
Fix rqt controller manager crash on ros2_control restart (#1273)
Browse files Browse the repository at this point in the history
* add service_timeout to the other service methods
* catch RuntimeErrors when the service is no longer available

(cherry picked from commit 2d82de8)

# Conflicts:
#	controller_manager/controller_manager/controller_manager_services.py
#	rqt_controller_manager/rqt_controller_manager/controller_manager.py
  • Loading branch information
saikishor authored and mergify[bot] committed Jan 8, 2024
1 parent f67b34a commit f88a8df
Show file tree
Hide file tree
Showing 2 changed files with 144 additions and 21 deletions.
146 changes: 126 additions & 20 deletions controller_manager/controller_manager/controller_manager_services.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,55 +37,151 @@ def service_caller(node, service_name, service_type, request, service_timeout=10
raise RuntimeError(f'Exception while calling service: {future.exception()}')


def configure_controller(node, controller_manager_name, controller_name):
def configure_controller(node, controller_manager_name, controller_name, service_timeout=10.0):
request = ConfigureController.Request()
request.name = controller_name
<<<<<<< HEAD
return service_caller(node, f'{controller_manager_name}/configure_controller',
ConfigureController, request)


def list_controllers(node, controller_manager_name):
=======
return service_caller(
node,
f"{controller_manager_name}/configure_controller",
ConfigureController,
request,
service_timeout,
)
>>>>>>> 2d82de8 (Fix rqt controller manager crash on ros2_control restart (#1273))


def list_controllers(node, controller_manager_name, service_timeout=10.0):
request = ListControllers.Request()
<<<<<<< HEAD
return service_caller(node, f'{controller_manager_name}/list_controllers',
ListControllers, request)


def list_controller_types(node, controller_manager_name):
=======
return service_caller(
node,
f"{controller_manager_name}/list_controllers",
ListControllers,
request,
service_timeout,
)
>>>>>>> 2d82de8 (Fix rqt controller manager crash on ros2_control restart (#1273))


def list_controller_types(node, controller_manager_name, service_timeout=10.0):
request = ListControllerTypes.Request()
<<<<<<< HEAD
return service_caller(node,
f'{controller_manager_name}/list_controller_types',
ListControllerTypes, request)


def list_hardware_components(node, controller_manager_name):
=======
return service_caller(
node,
f"{controller_manager_name}/list_controller_types",
ListControllerTypes,
request,
service_timeout,
)
>>>>>>> 2d82de8 (Fix rqt controller manager crash on ros2_control restart (#1273))


def list_hardware_components(node, controller_manager_name, service_timeout=10.0):
request = ListHardwareComponents.Request()
<<<<<<< HEAD
return service_caller(node, f'{controller_manager_name}/list_hardware_components',
ListHardwareComponents, request)


def list_hardware_interfaces(node, controller_manager_name):
=======
return service_caller(
node,
f"{controller_manager_name}/list_hardware_components",
ListHardwareComponents,
request,
service_timeout,
)
>>>>>>> 2d82de8 (Fix rqt controller manager crash on ros2_control restart (#1273))


def list_hardware_interfaces(node, controller_manager_name, service_timeout=10.0):
request = ListHardwareInterfaces.Request()
<<<<<<< HEAD
return service_caller(node, f'{controller_manager_name}/list_hardware_interfaces',
ListHardwareInterfaces, request)


def load_controller(node, controller_manager_name, controller_name):
=======
return service_caller(
node,
f"{controller_manager_name}/list_hardware_interfaces",
ListHardwareInterfaces,
request,
service_timeout,
)
>>>>>>> 2d82de8 (Fix rqt controller manager crash on ros2_control restart (#1273))


def load_controller(node, controller_manager_name, controller_name, service_timeout=10.0):
request = LoadController.Request()
request.name = controller_name
<<<<<<< HEAD
return service_caller(node, f'{controller_manager_name}/load_controller',
LoadController, request)


def reload_controller_libraries(node, controller_manager_name, force_kill):
=======
return service_caller(
node,
f"{controller_manager_name}/load_controller",
LoadController,
request,
service_timeout,
)
>>>>>>> 2d82de8 (Fix rqt controller manager crash on ros2_control restart (#1273))


def reload_controller_libraries(node, controller_manager_name, force_kill, service_timeout=10.0):
request = ReloadControllerLibraries.Request()
request.force_kill = force_kill
<<<<<<< HEAD
return service_caller(node,
f'{controller_manager_name}/reload_controller_libraries',
ReloadControllerLibraries, request)


def switch_controllers(node, controller_manager_name, deactivate_controllers,
activate_controllers, strict, activate_asap, timeout):
=======
return service_caller(
node,
f"{controller_manager_name}/reload_controller_libraries",
ReloadControllerLibraries,
request,
service_timeout,
)


def set_hardware_component_state(
node, controller_manager_name, component_name, lifecyle_state, service_timeout=10.0
):
request = SetHardwareComponentState.Request()
request.name = component_name
request.target_state = lifecyle_state
return service_caller(
node,
f"{controller_manager_name}/set_hardware_component_state",
SetHardwareComponentState,
request,
service_timeout,
)


def switch_controllers(
node,
controller_manager_name,
deactivate_controllers,
activate_controllers,
strict,
activate_asap,
timeout,
):
>>>>>>> 2d82de8 (Fix rqt controller manager crash on ros2_control restart (#1273))
request = SwitchController.Request()
request.activate_controllers = activate_controllers
request.deactivate_controllers = deactivate_controllers
Expand All @@ -99,8 +195,18 @@ def switch_controllers(node, controller_manager_name, deactivate_controllers,
SwitchController, request)


def unload_controller(node, controller_manager_name, controller_name):
def unload_controller(node, controller_manager_name, controller_name, service_timeout=10.0):
request = UnloadController.Request()
request.name = controller_name
<<<<<<< HEAD
return service_caller(node, f'{controller_manager_name}/unload_controller',
UnloadController, request)
=======
return service_caller(
node,
f"{controller_manager_name}/unload_controller",
UnloadController,
request,
service_timeout,
)
>>>>>>> 2d82de8 (Fix rqt controller manager crash on ros2_control restart (#1273))
Original file line number Diff line number Diff line change
Expand Up @@ -168,8 +168,12 @@ def _list_controllers(self):
@rtype [str]
"""
# Add loaded controllers first
controllers = list_controllers(self._node, self._cm_name).controller
try:
controllers = list_controllers(
self._node, self._cm_name, 2.0 / self._cm_update_freq
).controller

<<<<<<< HEAD
# Append potential controller configs found in the node's parameters
for name in _get_parameter_controller_names(self._node, self._cm_name):
add_ctrl = all(name != ctrl.name for ctrl in controllers)
Expand All @@ -179,6 +183,19 @@ def _list_controllers(self):
type=type_str)
controllers.append(uninit_ctrl)
return controllers
=======
# Append potential controller configs found in the node's parameters
for name in _get_parameter_controller_names(self._node, self._cm_name):
add_ctrl = all(name != ctrl.name for ctrl in controllers)
if add_ctrl:
type_str = _get_controller_type(self._node, self._cm_name, name)
uninit_ctrl = ControllerState(name=name, type=type_str)
controllers.append(uninit_ctrl)
return controllers
except RuntimeError as e:
print(e)
return []
>>>>>>> 2d82de8 (Fix rqt controller manager crash on ros2_control restart (#1273))

def _show_controllers(self):
table_view = self._widget.table_view
Expand Down

0 comments on commit f88a8df

Please sign in to comment.