Skip to content

Commit 45bfce1

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

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
@@ -395,13 +395,15 @@ def test_load_node_with_param_file(mock_component_container):
395395
assert get_node_name_count(context, '/ns_1/node_1') == 1
396396
assert request.node_name == 'node_1'
397397
assert request.node_namespace == '/ns_1'
398-
assert len(request.parameters) == 3
399-
assert request.parameters[0].name == 'param_2'
400-
assert request.parameters[0].value.integer_value == 2
401-
assert request.parameters[1].name == 'param_3'
402-
assert request.parameters[1].value.integer_value == 33
403-
assert request.parameters[2].name == 'param_1'
404-
assert request.parameters[2].value.integer_value == 1
398+
assert len(request.parameters) == 4
399+
assert request.parameters[0].name == 'param_1'
400+
assert request.parameters[0].value.integer_value == 1
401+
assert request.parameters[1].name == 'param_2'
402+
assert request.parameters[1].value.integer_value == 2
403+
assert request.parameters[2].name == 'param_3'
404+
assert request.parameters[2].value.integer_value == 33
405+
assert request.parameters[3].name == 'param_4'
406+
assert request.parameters[3].value.integer_value == 4
405407

406408
request = mock_component_container.requests[-1]
407409
assert get_node_name_count(context, '/ns_2/node_2') == 1
@@ -477,6 +479,26 @@ def test_load_node_with_param_file(mock_component_container):
477479
assert request.node_namespace == '/ns'
478480
assert len(request.parameters) == 0
479481

482+
# Case 9: wildcard mixed
483+
context = _assert_launch_no_errors([
484+
_load_composable_node(
485+
package='foo_package',
486+
plugin='bar_plugin',
487+
name='my_node',
488+
namespace='/wildcard_ns/aa/extra1/extra2',
489+
parameters=[
490+
parameters_file_dir / 'example_parameters_wildcard_mixed.yaml'
491+
],
492+
)
493+
])
494+
request = mock_component_container.requests[-1]
495+
assert get_node_name_count(context, '/wildcard_ns/aa/extra1/extra2/my_node') == 1
496+
assert request.node_name == 'my_node'
497+
assert request.node_namespace == '/wildcard_ns/aa/extra1/extra2'
498+
assert len(request.parameters) == 1
499+
assert request.parameters[0].name == 'param'
500+
assert request.parameters[0].value.string_value == 'wildcard'
501+
480502
# Namespace not found
481503
context = _assert_launch_no_errors([
482504
_load_composable_node(

0 commit comments

Comments
 (0)