Skip to content

parameter_dict_from_yaml_file says YAML file is not a valid ROS parameter file but it is. #1546

@wouterio

Description

@wouterio

Generated by Generative AI

No response

Operating System:

Linux wouter-laptop 6.14.0-36-generic #36~24.04.1-Ubuntu SMP PREEMPT_DYNAMIC Wed Oct 15 15:45:17 UTC 2 x86_64 x86_64 x86_64 GNU/Linux

ROS version or commit hash:

jazzy

RMW implementation (if applicable):

rmw_fastrtps_cpp

RMW Configuration (if applicable):

No response

Client library (if applicable):

rclpy

'ros2 doctor --report' output

ros2 doctor --report
<COPY OUTPUT HERE>

Steps to reproduce issue

Our parameter config file starts with:

/**:
  ros__parameters:
    carrier_id: carrier
    oddcore_id: oddcore
    odometry_frame_rate: 10.0
    odometry_frame_rate_min: 8.0
    odometry_frame_rate_max: 12.0
    detections_frame_rate: 5.0
    detections_frame_rate_min: 4.0
    detections_frame_rate_max: 6.0

/*:
  gps_node:
    ros__parameters:
      port: "/dev/ttyACM0"
      baud: 9600
      frame_id: "gps"
      time_ref_source: "gps"
      useRMC: False

We're using this file many years now, so it should be valid.

Then we load a redis parameter node to connect ROS2 parameters and Redis. This nodes needs the parameter files for its own parameters, but as well needs the paths to the parameter files, so that it can read the complete files:

    default_parameters_file = LaunchConfiguration('default_parameters_file', default=default_parameters_file)
    override_parameters_file = LaunchConfiguration('override_parameters_file', default=override_parameters_file)

    redis_parameter_node = Node(
        condition=IfCondition(run_redis_parameter_node),
        package='database',
        executable='redis_parameter_node',
        output='screen',
        parameters=[
            default_parameters_file,
            override_parameters_file,
            {'default_parameters_file': default_parameters_file},
            {'override_parameters_file': override_parameters_file}
        ],
    )

In the redis parameter node we try to read the files:

class RedisParameterNode(NodeBase):  # NodeBase subclass of Node

    def __init__(self):
        super().__init__('redis_parameter_node')
        self.__read_parameter_files()
        ...

    #

    def __read_parameter_files(self):
        self.get_logger().debug(self.parameters.default_parameters_file)   # correctly logs path to file
        default_parameters = parameter_dict_from_yaml_file(self.parameters.default_parameters_file)  # reads file but fails with error

Within the node I can read and print the parameter file. parameter_dict_from_yaml_file reads the file but says it's invalid. See stack trace under 'Actual behavior'.

Expected behavior

parameter_dict_from_yaml_file return a parameter dict.

Actual behavior

[redis_parameter_node-1] [DEBUG] [1764068550.222920305] [oddcore.redis_parameter_node]: /home/wouter/Documents/repos/oddbot/vision-ros/install/vision_launch/share/vision_launch/config/oddcore_default_configs.yaml
[redis_parameter_node-1] Traceback (most recent call last):
[redis_parameter_node-1]   File "/home/wouter/Documents/repos/oddbot/vision-ros/install/database/lib/database/redis_parameter_node", line 33, in <module>
[redis_parameter_node-1]     sys.exit(load_entry_point('database', 'console_scripts', 'redis_parameter_node')())
[redis_parameter_node-1]              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[redis_parameter_node-1]   File "/home/wouter/Documents/repos/oddbot/vision-ros/build/database/database/redis_parameter_node.py", line 291, in main
[redis_parameter_node-1]     node = RedisParameterNode()
[redis_parameter_node-1]            ^^^^^^^^^^^^^^^^^^^^
[redis_parameter_node-1]   File "/home/wouter/Documents/repos/oddbot/vision-ros/build/database/database/redis_parameter_node.py", line 37, in __init__
[redis_parameter_node-1]     self.__read_parameter_files()
[redis_parameter_node-1]   File "/home/wouter/Documents/repos/oddbot/vision-ros/build/database/database/redis_parameter_node.py", line 65, in __read_parameter_files
[redis_parameter_node-1]     default_parameters = parameter_dict_from_yaml_file(self.parameters.default_parameters_file)
[redis_parameter_node-1]                          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[redis_parameter_node-1]   File "/opt/ros/jazzy/lib/python3.12/site-packages/rclpy/parameter.py", line 323, in parameter_dict_from_yaml_file
[redis_parameter_node-1]     raise RuntimeError(f'YAML file is not a valid ROS parameter file for node {n}')
[redis_parameter_node-1] RuntimeError: YAML file is not a valid ROS parameter file for node /*

Additional information

The error says YAML file is not a valid ROS parameter file for node /*. Apparently it mistakes /* for a node?

Also tried default_parameters = parameter_dict_from_yaml_file(self.parameters.default_parameters_file, use_wildcard=True), but it made no difference.

Metadata

Metadata

Assignees

Labels

bugSomething isn't working

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions