diff --git a/ros2bag/ros2bag/api/__init__.py b/ros2bag/ros2bag/api/__init__.py index 0e275c0111..832f63c8ed 100644 --- a/ros2bag/ros2bag/api/__init__.py +++ b/ros2bag/ros2bag/api/__init__.py @@ -100,6 +100,17 @@ def check_positive_float(value: Any) -> float: raise ArgumentTypeError('{} is not the valid type (float)'.format(value)) +def check_not_negative_float(value: Any) -> float: + """Argparse validator to verify that a value is a float and that not negative.""" + try: + fvalue = float(value) + if fvalue < 0.0: + raise ArgumentTypeError(f'Value {value} is less than zero.') + return fvalue + except ValueError: + raise ArgumentTypeError('{} is not the valid type (float)'.format(value)) + + def check_path_exists(value: Any) -> str: """Argparse validator to verify a path exists.""" try: diff --git a/ros2bag/ros2bag/verb/play.py b/ros2bag/ros2bag/verb/play.py index 8143668735..78d4bbbf7e 100644 --- a/ros2bag/ros2bag/verb/play.py +++ b/ros2bag/ros2bag/verb/play.py @@ -16,6 +16,7 @@ from rclpy.qos import InvalidQoSProfileException from ros2bag.api import add_standard_reader_args +from ros2bag.api import check_not_negative_float from ros2bag.api import check_not_negative_int from ros2bag.api import check_positive_float from ros2bag.api import convert_yaml_to_qos_profile @@ -85,7 +86,7 @@ def add_arguments(self, parser, cli_name): # noqa: D102 '-p', '--start-paused', action='store_true', default=False, help='Start the playback player in a paused state.') parser.add_argument( - '--start-offset', type=check_positive_float, default=0.0, + '--start-offset', type=check_not_negative_float, default=0.0, help='Start the playback player this many seconds into the bag file.') parser.add_argument( '--wait-for-all-acked', type=check_not_negative_int, default=-1,