Skip to content

Commit a6c8293

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

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
@@ -357,13 +357,15 @@ def test_load_node_with_param_file(mock_component_container):
357357
assert get_node_name_count(context, '/ns_1/node_1') == 1
358358
assert request.node_name == 'node_1'
359359
assert request.node_namespace == '/ns_1'
360-
assert len(request.parameters) == 3
361-
assert request.parameters[0].name == 'param_2'
362-
assert request.parameters[0].value.integer_value == 2
363-
assert request.parameters[1].name == 'param_3'
364-
assert request.parameters[1].value.integer_value == 33
365-
assert request.parameters[2].name == 'param_1'
366-
assert request.parameters[2].value.integer_value == 1
360+
assert len(request.parameters) == 4
361+
assert request.parameters[0].name == 'param_1'
362+
assert request.parameters[0].value.integer_value == 1
363+
assert request.parameters[1].name == 'param_2'
364+
assert request.parameters[1].value.integer_value == 2
365+
assert request.parameters[2].name == 'param_3'
366+
assert request.parameters[2].value.integer_value == 33
367+
assert request.parameters[3].name == 'param_4'
368+
assert request.parameters[3].value.integer_value == 4
367369

368370
request = mock_component_container.requests[-1]
369371
assert get_node_name_count(context, '/ns_2/node_2') == 1
@@ -439,6 +441,26 @@ def test_load_node_with_param_file(mock_component_container):
439441
assert request.node_namespace == '/ns'
440442
assert len(request.parameters) == 0
441443

444+
# Case 9: wildcard mixed
445+
context = _assert_launch_no_errors([
446+
_load_composable_node(
447+
package='foo_package',
448+
plugin='bar_plugin',
449+
name='my_node',
450+
namespace='/wildcard_ns/aa/extra1/extra2',
451+
parameters=[
452+
parameters_file_dir / 'example_parameters_wildcard_mixed.yaml'
453+
],
454+
)
455+
])
456+
request = mock_component_container.requests[-1]
457+
assert get_node_name_count(context, '/wildcard_ns/aa/extra1/extra2/my_node') == 1
458+
assert request.node_name == 'my_node'
459+
assert request.node_namespace == '/wildcard_ns/aa/extra1/extra2'
460+
assert len(request.parameters) == 1
461+
assert request.parameters[0].name == 'param'
462+
assert request.parameters[0].value.string_value == 'wildcard'
463+
442464
# Namespace not found
443465
context = _assert_launch_no_errors([
444466
_load_composable_node(

0 commit comments

Comments
 (0)