diff --git a/example/src/parameters.yaml b/example/src/parameters.yaml index 6cb9c57..549fbfa 100644 --- a/example/src/parameters.yaml +++ b/example/src/parameters.yaml @@ -284,6 +284,32 @@ admittance_controller: validation: gt<>: [ 15 ] lt<>: [ 20 ] + lt_eq_fifteen_double: + type: double + default_value: 1 + description: "should be a number less than or equal to 15" + validation: + lt_eq<>: [ 15 ] + gt_fifteen_double: + type: double + default_value: 16 + description: "should be a number greater than 15" + validation: + gt<>: [ 15 ] + gt_fifteen_lt_eq_twenty_double: + type: double + default_value: 20 + description: "should be a number greater than 15 and less than or equal to 20" + validation: + gt<>: [ 15 ] + lt_eq<>: [ 20 ] + gt_fifteen_lt_twenty_double: + type: double + default_value: 16 + description: "should be a number greater than 15 and less than 20" + validation: + gt<>: [ 15 ] + lt<>: [ 20 ] one_number: type: int default_value: 14540 diff --git a/example/test/descriptor_test_gtest.cpp b/example/test/descriptor_test_gtest.cpp index ed9d5bb..876c14b 100644 --- a/example/test/descriptor_test_gtest.cpp +++ b/example/test/descriptor_test_gtest.cpp @@ -84,7 +84,7 @@ TEST_F(DescriptorTest, check_lt_eq) { } TEST_F(DescriptorTest, check_gt) { - EXPECT_EQ(descriptors_[4].integer_range.at(0).from_value, 15); + EXPECT_EQ(descriptors_[4].integer_range.at(0).from_value, 16); EXPECT_EQ(descriptors_[4].integer_range.at(0).to_value, std::numeric_limits::max()); } diff --git a/example_python/generate_parameter_module_example/parameters.yaml b/example_python/generate_parameter_module_example/parameters.yaml index 175597c..90be621 100644 --- a/example_python/generate_parameter_module_example/parameters.yaml +++ b/example_python/generate_parameter_module_example/parameters.yaml @@ -287,6 +287,32 @@ admittance_controller: validation: gt<>: [ 15 ] lt<>: [ 20 ] + lt_eq_fifteen_double: + type: double + default_value: 1 + description: "should be a number less than or equal to 15" + validation: + lt_eq<>: [ 15 ] + gt_fifteen_double: + type: double + default_value: 16 + description: "should be a number greater than 15" + validation: + gt<>: [ 15 ] + gt_fifteen_lt_eq_twenty_double: + type: double + default_value: 20 + description: "should be a number greater than 15 and less than or equal to 20" + validation: + gt<>: [ 15 ] + lt_eq<>: [ 20 ] + gt_fifteen_lt_twenty_double: + type: double + default_value: 16 + description: "should be a number greater than 15 and less than 20" + validation: + gt<>: [ 15 ] + lt<>: [ 20 ] one_number: type: int default_value: 14540 diff --git a/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/cpp/declare_parameter b/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/cpp/declare_parameter index c0896e2..b69454e 100644 --- a/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/cpp/declare_parameter +++ b/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/cpp/declare_parameter @@ -12,10 +12,14 @@ descriptor.additional_constraints = {{parameter_additional_constraints | valid_s {%- if validation.arguments|length == 2 %} {%- set range.lower = validation.arguments[0] %} {%- set range.upper = validation.arguments[1] %} -{%- elif ("lower" in validation.function_name or "gt" == validation.function_base_name or "gt_eq" == validation.function_base_name) and validation.arguments|length == 1 %} +{%- elif ("lower" in validation.function_name or "gt_eq" == validation.function_base_name) and validation.arguments|length == 1 %} {%- set range.lower = validation.arguments[0] %} -{%- elif ("upper" in validation.function_name or "lt" == validation.function_base_name or "lt_eq" == validation.function_base_name) and validation.arguments|length == 1 %} +{%- elif "gt" == validation.function_base_name and validation.arguments|length == 1 %} +{%- set range.lower = "std::nextafter({}, std::numeric_limits::infinity())".format(validation.arguments[0]) %} +{%- elif ("upper" in validation.function_name or "lt_eq" == validation.function_base_name) and validation.arguments|length == 1 %} {%- set range.upper = validation.arguments[0] %} +{%- elif "lt" == validation.function_base_name and validation.arguments|length == 1 %} +{%- set range.upper = "std::nextafter({}, -std::numeric_limits::infinity())".format(validation.arguments[0]) %} {%- endif %} {%- endfor %} {%- if range.lower is not none or range.upper is not none %} @@ -29,10 +33,14 @@ descriptor.floating_point_range.at(0).to_value = {{range.upper if range.upper is {%- if validation.arguments|length == 2 %} {%- set range.lower = validation.arguments[0] %} {%- set range.upper = validation.arguments[1] %} -{%- elif ("lower" in validation.function_name or "gt" == validation.function_base_name or "gt_eq" == validation.function_base_name) and validation.arguments|length == 1 %} +{%- elif ("lower" in validation.function_name or "gt_eq" == validation.function_base_name) and validation.arguments|length == 1 %} {%- set range.lower = validation.arguments[0] %} -{%- elif ("upper" in validation.function_name or "lt" == validation.function_base_name or "lt_eq" == validation.function_base_name) and validation.arguments|length == 1 %} +{%- elif "gt" == validation.function_base_name and validation.arguments|length == 1 %} +{%- set range.lower = "({} + 1)".format(validation.arguments[0]) %} +{%- elif ("upper" in validation.function_name or "lt_eq" == validation.function_base_name) and validation.arguments|length == 1 %} {%- set range.upper = validation.arguments[0] %} +{%- elif "lt" == validation.function_base_name and validation.arguments|length == 1 %} +{%- set range.upper = "({} - 1)".format(validation.arguments[0]) %} {%- endif %} {%- endfor %} {%- if range.lower is not none or range.upper is not none %} diff --git a/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/cpp/declare_runtime_parameter b/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/cpp/declare_runtime_parameter index 935bb17..e045d4d 100644 --- a/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/cpp/declare_runtime_parameter +++ b/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/cpp/declare_runtime_parameter @@ -28,10 +28,14 @@ descriptor.additional_constraints = {{parameter_additional_constraints | valid_s {%- if validation.arguments|length == 2 %} {%- set range.lower = validation.arguments[0] %} {%- set range.upper = validation.arguments[1] %} -{%- elif ("lower" in validation.function_name or "gt" == validation.function_base_name or "gt_eq" == validation.function_base_name) and validation.arguments|length == 1 %} +{%- elif ("lower" in validation.function_name or "gt_eq" == validation.function_base_name) and validation.arguments|length == 1 %} {%- set range.lower = validation.arguments[0] %} -{%- elif ("upper" in validation.function_name or "lt" == validation.function_base_name or "lt_eq" == validation.function_base_name) and validation.arguments|length == 1 %} +{%- elif "gt" == validation.function_base_name and validation.arguments|length == 1 %} +{%- set range.lower = "std::nextafter({}, std::numeric_limits::infinity())".format(validation.arguments[0]) %} +{%- elif ("upper" in validation.function_name or "lt_eq" == validation.function_base_name) and validation.arguments|length == 1 %} {%- set range.upper = validation.arguments[0] %} +{%- elif "lt" == validation.function_base_name and validation.arguments|length == 1 %} +{%- set range.upper = "std::nextafter({}, -std::numeric_limits::infinity())".format(validation.arguments[0]) %} {%- endif %} {%- endfor %} {%- if range.lower is not none or range.upper is not none %} @@ -45,10 +49,14 @@ descriptor.floating_point_range.at(0).to_value = {{range.upper if range.upper is {%- if validation.arguments|length == 2 %} {%- set range.lower = validation.arguments[0] %} {%- set range.upper = validation.arguments[1] %} -{%- elif ("lower" in validation.function_name or "gt" == validation.function_base_name or "gt_eq" == validation.function_base_name) and validation.arguments|length == 1 %} +{%- elif ("lower" in validation.function_name or "gt_eq" == validation.function_base_name) and validation.arguments|length == 1 %} {%- set range.lower = validation.arguments[0] %} -{%- elif ("upper" in validation.function_name or "lt" == validation.function_base_name or "lt_eq" == validation.function_base_name) and validation.arguments|length == 1 %} +{%- elif "gt" == validation.function_base_name and validation.arguments|length == 1 %} +{%- set range.lower = "({} + 1)".format(validation.arguments[0]) %} +{%- elif ("upper" in validation.function_name or "lt_eq" == validation.function_base_name) and validation.arguments|length == 1 %} {%- set range.upper = validation.arguments[0] %} +{%- elif "lt" == validation.function_base_name and validation.arguments|length == 1 %} +{%- set range.upper = "({} - 1)".format(validation.arguments[0]) %} {%- endif %} {%- endfor %} {%- if range.lower is not none or range.upper is not none %} diff --git a/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/python/declare_parameter b/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/python/declare_parameter index bc71a37..4ad708b 100644 --- a/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/python/declare_parameter +++ b/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/python/declare_parameter @@ -10,10 +10,14 @@ descriptor.additional_constraints = "{{parameter_additional_constraints|valid_st {%- if validation.arguments|length == 2 %} {%- set range.lower = validation.arguments[0] %} {%- set range.upper = validation.arguments[1] %} -{%- elif ("lower" in validation.function_name or "gt" == validation.function_base_name or "gt_eq" == validation.function_base_name) and validation.arguments|length == 1 %} +{%- elif ("lower" in validation.function_name or "gt_eq" == validation.function_base_name) and validation.arguments|length == 1 %} {%- set range.lower = validation.arguments[0] %} -{%- elif ("upper" in validation.function_name or "lt" == validation.function_base_name or "lt_eq" == validation.function_base_name) and validation.arguments|length == 1 %} +{%- elif "gt" == validation.function_base_name and validation.arguments|length == 1 %} +{%- set range.lower = "({} + sys.float_info.epsilon)".format(validation.arguments[0]) %} +{%- elif ("upper" in validation.function_name or "lt_eq" == validation.function_base_name) and validation.arguments|length == 1 %} {%- set range.upper = validation.arguments[0] %} +{%- elif "lt" == validation.function_base_name and validation.arguments|length == 1 %} +{%- set range.upper = "({} - sys.float_info.epsilon)".format(validation.arguments[0]) %} {%- endif %} {%- endfor %} {%- if range.lower is not none or range.upper is not none %} @@ -27,10 +31,14 @@ descriptor.floating_point_range[-1].to_value = {{range.upper if range.upper is n {%- if validation.arguments|length == 2 %} {%- set range.lower = validation.arguments[0] %} {%- set range.upper = validation.arguments[1] %} -{%- elif ("lower" in validation.function_name or "gt" == validation.function_base_name or "gt_eq" == validation.function_base_name) and validation.arguments|length == 1 %} +{%- elif ("lower" in validation.function_name or "gt_eq" == validation.function_base_name) and validation.arguments|length == 1 %} {%- set range.lower = validation.arguments[0] %} -{%- elif ("upper" in validation.function_name or "lt" == validation.function_base_name or "lt_eq" == validation.function_base_name) and validation.arguments|length == 1 %} +{%- elif "gt" == validation.function_base_name and validation.arguments|length == 1 %} +{%- set range.lower = "({} + 1)".format(validation.arguments[0]) %} +{%- elif ("upper" in validation.function_name or "lt_eq" == validation.function_base_name) and validation.arguments|length == 1 %} {%- set range.upper = validation.arguments[0] %} +{%- elif "lt" == validation.function_base_name and validation.arguments|length == 1 %} +{%- set range.upper = "({} - 1)".format(validation.arguments[0]) %} {%- endif %} {%- endfor %} {%- if range.lower is not none or range.upper is not none %} diff --git a/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/python/declare_runtime_parameter b/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/python/declare_runtime_parameter index a74ca2c..05838ec 100644 --- a/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/python/declare_runtime_parameter +++ b/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/python/declare_runtime_parameter @@ -25,10 +25,14 @@ descriptor.additional_constraints = "{{parameter_additional_constraints|valid_st {%- if validation.arguments|length == 2 %} {%- set range.lower = validation.arguments[0] %} {%- set range.upper = validation.arguments[1] %} -{%- elif ("lower" in validation.function_name or "gt" == validation.function_base_name or "gt_eq" == validation.function_base_name) and validation.arguments|length == 1 %} +{%- elif ("lower" in validation.function_name or "gt_eq" == validation.function_base_name) and validation.arguments|length == 1 %} {%- set range.lower = validation.arguments[0] %} -{%- elif ("upper" in validation.function_name or "lt" == validation.function_base_name or "lt_eq" == validation.function_base_name) and validation.arguments|length == 1 %} +{%- elif "gt" == validation.function_base_name and validation.arguments|length == 1 %} +{%- set range.lower = "({} + sys.float_info.epsilon)".format(validation.arguments[0]) %} +{%- elif ("upper" in validation.function_name or "lt_eq" == validation.function_base_name) and validation.arguments|length == 1 %} {%- set range.upper = validation.arguments[0] %} +{%- elif "lt" == validation.function_base_name and validation.arguments|length == 1 %} +{%- set range.upper = "({} - sys.float_info.epsilon)".format(validation.arguments[0]) %} {%- endif %} {%- endfor %} {%- if range.lower is not none or range.upper is not none %} @@ -42,10 +46,14 @@ descriptor.floating_point_range[-1].to_value = {{range.upper if range.upper is n {%- if validation.arguments|length == 2 %} {%- set range.lower = validation.arguments[0] %} {%- set range.upper = validation.arguments[1] %} -{%- elif ("lower" in validation.function_name or "gt" == validation.function_base_name or "gt_eq" == validation.function_base_name) and validation.arguments|length == 1 %} +{%- elif ("lower" in validation.function_name or "gt_eq" == validation.function_base_name) and validation.arguments|length == 1 %} {%- set range.lower = validation.arguments[0] %} -{%- elif ("upper" in validation.function_name or "lt" == validation.function_base_name or "lt_eq" == validation.function_base_name) and validation.arguments|length == 1 %} +{%- elif "gt" == validation.function_base_name and validation.arguments|length == 1 %} +{%- set range.lower = "({} + 1)".format(validation.arguments[0]) %} +{%- elif ("upper" in validation.function_name or "lt_eq" == validation.function_base_name) and validation.arguments|length == 1 %} {%- set range.upper = validation.arguments[0] %} +{%- elif "lt" == validation.function_base_name and validation.arguments|length == 1 %} +{%- set range.upper = "({} - 1)".format(validation.arguments[0]) %} {%- endif %} {%- endfor %} {%- if range.lower is not none or range.upper is not none %} diff --git a/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/python/parameter_library_header b/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/python/parameter_library_header index 8ea5820..8ad5ab8 100644 --- a/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/python/parameter_library_header +++ b/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/python/parameter_library_header @@ -9,6 +9,7 @@ from rclpy.clock import Clock from rclpy.exceptions import InvalidParameterValueException from rclpy.time import Time import copy +import sys import rclpy import rclpy.parameter from generate_parameter_library_py.python_validators import ParameterValidators