Skip to content

Commit ecff92a

Browse files
Fix: LoadComposableNodes fails to parse wildcard param files correctly (#460) (#465) (#466)
(cherry picked from commit 6b503ad) Signed-off-by: emrekuru97 <[email protected]> Co-authored-by: Emre Kuru <[email protected]>
1 parent e42b6eb commit ecff92a

File tree

4 files changed

+46
-9
lines changed

4 files changed

+46
-9
lines changed

launch_ros/launch_ros/utilities/to_parameters_list.py

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
"""Module with utility to transform evaluated parameters into parameter lists."""
1616

1717
import pathlib
18+
import re
1819
from typing import List
1920
import warnings
2021

@@ -56,6 +57,12 @@ def normalize_parameters_dict(dictionary, keys, result_dict):
5657
return normalize_parameters_dict(dictionary, [], {})
5758

5859

60+
def is_node_name_matched(node_name: str, node_fqn: str) -> bool:
61+
# Will match ["/*" -> "(/\\w+)" and "/**" -> "(/\\w+)*"]
62+
regex = node_name.replace('/*', '(/\\w+)')
63+
return bool(re.fullmatch(regex, node_fqn))
64+
65+
5966
def to_parameters_list(
6067
context: LaunchContext,
6168
node_name: str,
@@ -89,8 +96,9 @@ def to_parameters_list(
8996

9097
if normalized_param_dict:
9198
param_dict.clear()
92-
if '**' in normalized_param_dict:
93-
param_dict = normalized_param_dict['**']
99+
for key in normalized_param_dict:
100+
if (is_node_name_matched(f'/{key}', f'/{node_name}')):
101+
param_dict.update(normalized_param_dict[key])
94102
if node_name in normalized_param_dict:
95103
param_dict.update(normalized_param_dict[node_name])
96104
if not warned_once and not node_name:

test_launch_ros/test/test_launch_ros/actions/example_parameters_multiple_entries.yaml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,10 @@
99
param_2: 22
1010
param_3: 33
1111

12+
/*/node_1:
13+
ros__parameters:
14+
param_4: 4
15+
1216
ns_2/node_2:
1317
ros__parameters:
1418
param_3: 3
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
/*/aa/**/my_node:
2+
ros__parameters:
3+
param: "wildcard"

test_launch_ros/test/test_launch_ros/actions/test_load_composable_nodes.py

Lines changed: 29 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -387,13 +387,15 @@ def test_load_node_with_param_file(mock_component_container):
387387
assert get_node_name_count(context, '/ns_1/node_1') == 1
388388
assert request.node_name == 'node_1'
389389
assert request.node_namespace == '/ns_1'
390-
assert len(request.parameters) == 3
391-
assert request.parameters[0].name == 'param_2'
392-
assert request.parameters[0].value.integer_value == 2
393-
assert request.parameters[1].name == 'param_3'
394-
assert request.parameters[1].value.integer_value == 33
395-
assert request.parameters[2].name == 'param_1'
396-
assert request.parameters[2].value.integer_value == 1
390+
assert len(request.parameters) == 4
391+
assert request.parameters[0].name == 'param_1'
392+
assert request.parameters[0].value.integer_value == 1
393+
assert request.parameters[1].name == 'param_2'
394+
assert request.parameters[1].value.integer_value == 2
395+
assert request.parameters[2].name == 'param_3'
396+
assert request.parameters[2].value.integer_value == 33
397+
assert request.parameters[3].name == 'param_4'
398+
assert request.parameters[3].value.integer_value == 4
397399

398400
request = mock_component_container.requests[-1]
399401
assert get_node_name_count(context, '/ns_2/node_2') == 1
@@ -469,6 +471,26 @@ def test_load_node_with_param_file(mock_component_container):
469471
assert request.node_namespace == '/ns'
470472
assert len(request.parameters) == 0
471473

474+
# Case 9: wildcard mixed
475+
context = _assert_launch_no_errors([
476+
_load_composable_node(
477+
package='foo_package',
478+
plugin='bar_plugin',
479+
name='my_node',
480+
namespace='/wildcard_ns/aa/extra1/extra2',
481+
parameters=[
482+
parameters_file_dir / 'example_parameters_wildcard_mixed.yaml'
483+
],
484+
)
485+
])
486+
request = mock_component_container.requests[-1]
487+
assert get_node_name_count(context, '/wildcard_ns/aa/extra1/extra2/my_node') == 1
488+
assert request.node_name == 'my_node'
489+
assert request.node_namespace == '/wildcard_ns/aa/extra1/extra2'
490+
assert len(request.parameters) == 1
491+
assert request.parameters[0].name == 'param'
492+
assert request.parameters[0].value.string_value == 'wildcard'
493+
472494
# Namespace not found
473495
context = _assert_launch_no_errors([
474496
_load_composable_node(

0 commit comments

Comments
 (0)