From 9466d1d53c1da12e4204b2c93a52d849170336c0 Mon Sep 17 00:00:00 2001 From: Barry Xu Date: Tue, 1 Nov 2022 16:49:10 +0800 Subject: [PATCH 1/3] Deal with ParameterUninitializedException for parameter service Signed-off-by: Barry Xu --- rclpy/rclpy/parameter_service.py | 7 +++++-- rclpy/test/test_parameter_client.py | 20 ++++++++++++++++++++ 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/rclpy/rclpy/parameter_service.py b/rclpy/rclpy/parameter_service.py index 41314aadd..ec11dfd6d 100644 --- a/rclpy/rclpy/parameter_service.py +++ b/rclpy/rclpy/parameter_service.py @@ -14,10 +14,10 @@ import weakref -from rcl_interfaces.msg import SetParametersResult +from rcl_interfaces.msg import ParameterValue, ParameterType, SetParametersResult from rcl_interfaces.srv import DescribeParameters, GetParameters, GetParameterTypes from rcl_interfaces.srv import ListParameters, SetParameters, SetParametersAtomically -from rclpy.exceptions import ParameterNotDeclaredException +from rclpy.exceptions import ParameterNotDeclaredException, ParameterUninitializedException from rclpy.parameter import Parameter, PARAMETER_SEPARATOR_STRING from rclpy.qos import qos_profile_parameters from rclpy.validate_topic_name import TOPIC_SEPARATOR_STRING @@ -83,6 +83,9 @@ def _get_parameters_callback(self, request, response): except ParameterNotDeclaredException: response.values = node.get_parameters([]) return response + except ParameterUninitializedException: + response.values.append(ParameterValue(type=ParameterType.PARAMETER_NOT_SET)) + continue response.values.append(param.get_parameter_value()) return response diff --git a/rclpy/test/test_parameter_client.py b/rclpy/test/test_parameter_client.py index 7c4882fc7..c5eb4e0a0 100644 --- a/rclpy/test/test_parameter_client.py +++ b/rclpy/test/test_parameter_client.py @@ -170,3 +170,23 @@ def test_load_parameter_file_atomically(self): finally: if os.path.exists(f.name): os.unlink(f.name) + + def test_get_uninitialized_parameter(self): + self.target_node.declare_parameter('uninitialized_parameter', Parameter.Type.STRING) + + # The type in description should be STRING + future = self.client.describe_parameters(['uninitialized_parameter']) + self.executor.spin_until_future_complete(future) + results = future.result() + assert results is not None + assert len(results.descriptors) == 1 + assert results.descriptors[0].type == ParameterType.PARAMETER_STRING + assert results.descriptors[0].name == 'uninitialized_parameter' + + # The type in value should be NOT SET + future = self.client.get_parameters(['uninitialized_parameter']) + self.executor.spin_until_future_complete(future) + results = future.result() + assert results is not None + assert len(results.values) == 1 + assert results.values[0].type == ParameterType.PARAMETER_NOT_SET From b3af04e927c4848f88e3622ce32776721227f428 Mon Sep 17 00:00:00 2001 From: Barry Xu Date: Tue, 1 Nov 2022 17:29:36 +0800 Subject: [PATCH 2/3] Enable all tests in test_parameter_client.py Signed-off-by: Barry Xu --- rclpy/CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/rclpy/CMakeLists.txt b/rclpy/CMakeLists.txt index a9966c040..d95209be5 100644 --- a/rclpy/CMakeLists.txt +++ b/rclpy/CMakeLists.txt @@ -175,6 +175,7 @@ if(BUILD_TESTING) test/test_messages.py test/test_node.py test/test_parameter.py + test/test_parameter_client.py test/test_publisher.py test/test_qos.py test/test_qos_event.py From 6b9458e7f9cb8f8ec24e860112cd0f3682ff1537 Mon Sep 17 00:00:00 2001 From: Barry Xu Date: Wed, 2 Nov 2022 11:21:32 +0800 Subject: [PATCH 3/3] Get empty value for ParameterUninitializedException Signed-off-by: Barry Xu --- rclpy/rclpy/parameter_service.py | 7 ++----- rclpy/test/test_parameter_client.py | 7 ++++--- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/rclpy/rclpy/parameter_service.py b/rclpy/rclpy/parameter_service.py index ec11dfd6d..111fb46ea 100644 --- a/rclpy/rclpy/parameter_service.py +++ b/rclpy/rclpy/parameter_service.py @@ -14,7 +14,7 @@ import weakref -from rcl_interfaces.msg import ParameterValue, ParameterType, SetParametersResult +from rcl_interfaces.msg import SetParametersResult from rcl_interfaces.srv import DescribeParameters, GetParameters, GetParameterTypes from rcl_interfaces.srv import ListParameters, SetParameters, SetParametersAtomically from rclpy.exceptions import ParameterNotDeclaredException, ParameterUninitializedException @@ -80,12 +80,9 @@ def _get_parameters_callback(self, request, response): for name in request.names: try: param = node.get_parameter(name) - except ParameterNotDeclaredException: + except (ParameterNotDeclaredException, ParameterUninitializedException): response.values = node.get_parameters([]) return response - except ParameterUninitializedException: - response.values.append(ParameterValue(type=ParameterType.PARAMETER_NOT_SET)) - continue response.values.append(param.get_parameter_value()) return response diff --git a/rclpy/test/test_parameter_client.py b/rclpy/test/test_parameter_client.py index c5eb4e0a0..1fa30ede2 100644 --- a/rclpy/test/test_parameter_client.py +++ b/rclpy/test/test_parameter_client.py @@ -183,10 +183,11 @@ def test_get_uninitialized_parameter(self): assert results.descriptors[0].type == ParameterType.PARAMETER_STRING assert results.descriptors[0].name == 'uninitialized_parameter' - # The type in value should be NOT SET + # The value should be empty future = self.client.get_parameters(['uninitialized_parameter']) self.executor.spin_until_future_complete(future) results = future.result() assert results is not None - assert len(results.values) == 1 - assert results.values[0].type == ParameterType.PARAMETER_NOT_SET + assert results.values == [] + + self.target_node.undeclare_parameter('uninitialized_parameter')