Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

String parameter with digits and E or e (e.g. "123E5") is always interpreted as double #384

Open
chrmel opened this issue Oct 20, 2023 · 1 comment
Assignees

Comments

@chrmel
Copy link

chrmel commented Oct 20, 2023

Bug report

When launching a ROS2 node with ros2 launch ... a parameter containing digits and E or e is always interpreted as a double value. Even when the parameter is defined as a string parameter and even when the whole parameter is passed as string.

  • Operating System:
    • Ubuntu 22.04
  • Installation type:
    • binaries
  • Version or commit hash:
    • humble
  • Client library (if applicable):
    • rclpy

Steps to reproduce issue

Create a Python package and have a simple node and launchfile
param_test.py

import signal
import rclpy

from rclpy.node import Node
from rcl_interfaces.msg import ParameterType


class ParamTest(Node):
    def __init__(self):
        Node.__init__(self, 'param_test')

        # parameter declaration and info
        self._param = self.declare_parameter('param', 'abc').get_parameter_value().string_value
        self.get_logger().info(f'String Param: {self._param}')


def main(args=None):
    def raise_keyboard_int(_, __):
        rclpy.logging.get_logger('param_test_node').info('stopping')
        raise KeyboardInterrupt()

    signal.signal(signal.SIGINT, raise_keyboard_int)

    rclpy.init(args=args)
    node = ParamTest()

    try:
        rclpy.spin_once(node)

    except KeyboardInterrupt:
        pass

    finally:
        node.destroy_node()



if __name__ == '__main__':
    main()

test.launch.py

#!/usr/bin/python3

from launch import LaunchDescription
from launch_ros.actions import Node
from launch.actions import DeclareLaunchArgument
from launch.substitutions import TextSubstitution, LaunchConfiguration


def generate_launch_description():
    return LaunchDescription([
        DeclareLaunchArgument(
            'param',
            default_value=TextSubstitution(text='abc'),
            description='String param'
        ),
        Node(
            package='param_test',
            executable='param_test',
            name='mccdaq_daq',
            output='screen',
            emulate_tty=True,
            parameters=[{
                'param': LaunchConfiguration('param'),
            }],
        ),
        ])

Expected behavior

$ ros2 launch param_test test.launch.py param:="123E5"
[INFO] [1697811050.937763500] [param_test]: String Param: 123E5

Actual behavior

$ ros2 launch param_test test.launch.py param:="123E5"
[INFO] [launch]: All log files can be found below /root/.ros/log/2023-10-20-14-11-17-221115-708631e4d2d9-2422
[INFO] [launch]: Default logging verbosity is set to INFO
[INFO] [param_test-1]: process started with pid [2423]
[param_test-1] Traceback (most recent call last):
[param_test-1]   File "/ros2_ws/install/param_test/lib/param_test/param_test", line 33, in <module>
[param_test-1]     sys.exit(load_entry_point('param-test==0.0.0', 'console_scripts', 'param_test')())
[param_test-1]   File "/ros2_ws/install/param_test/lib/python3.10/site-packages/param_test/param_test.py", line 25, in main
[param_test-1]     node = ParamTest()
[param_test-1]   File "/ros2_ws/install/param_test/lib/python3.10/site-packages/param_test/param_test.py", line 13, in __init__
[param_test-1]     self._param = self.declare_parameter('param', 'abc').get_parameter_value().string_value
[param_test-1]   File "/opt/ros/humble/local/lib/python3.10/dist-packages/rclpy/node.py", line 367, in declare_parameter
[param_test-1]     return self.declare_parameters('', [args], ignore_override)[0]
[param_test-1]   File "/opt/ros/humble/local/lib/python3.10/dist-packages/rclpy/node.py", line 494, in declare_parameters
[param_test-1]     self._set_parameters(
[param_test-1]   File "/opt/ros/humble/local/lib/python3.10/dist-packages/rclpy/node.py", line 739, in _set_parameters
[param_test-1]     raise InvalidParameterTypeException(
[param_test-1] rclpy.exceptions.InvalidParameterTypeException: Trying to set parameter 'param' to '12300000.0' of type 'DOUBLE', expecting type 'STRING'

Additional information

Mirght be related to ros2/ros2cli#677?

  • ros2 run ... can be forced to interpret the parameter as a string:
    $ ros2 run param_test param_test --ros-args -p "param:='123E5'"
    [INFO] [1697811050.937763500] [param_test]: String Param: 123E5
  • ros2 launch ... cannot be forced to take this parameter as a string:
    $ ros2 launch param_test test.launch.py param:="123E5"
    ... rclpy.exceptions.InvalidParameterTypeException: Trying to set parameter 'param' to '12300000.0' of type 'DOUBLE', expecting type 'STRING'
    $ ros2 launch param_test test.launch.py param:="'123E5'"
    ... rclpy.exceptions.InvalidParameterTypeException: Trying to set parameter 'param' to '12300000.0' of type 'DOUBLE', expecting type 'STRING'
    $ ros2 launch param_test test.launch.py param:='"123E5"'
    ... rclpy.exceptions.InvalidParameterTypeException: Trying to set parameter 'param' to '12300000.0' of type 'DOUBLE', expecting type 'STRING'
    And the most interesting one:
    $ ros2 launch param_test test.launch.py param:='!!str 123E5'
    ... rclpy.exceptions.InvalidParameterTypeException: Trying to set parameter 'param' to '12300000.0' of type 'DOUBLE', expecting type 'STRING'
    Even using all kinds of escapes, ASCII codes and what ever did not work!
fujitatomoya referenced this issue in fujitatomoya/ros2_test_prover Oct 24, 2023
@fujitatomoya
Copy link
Contributor

fujitatomoya commented Oct 24, 2023

I think this problem is related to https://github.com/ros2/launch_ros/tree/rolling/ros2launch, not in here ros2cli. (probably https://github.com/ros2/launch/tree/rolling/launch.)

@clalancette can you move this issue to https://github.com/ros2/launch_ros?

note: this problem is reproducible with ros2/ros2@1f5bd8e current head today.

@sloretz sloretz transferred this issue from ros2/ros2cli Nov 2, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants