Enforce a precedence for wildcard matching in parameter overrides. (#1094)

Signed-off-by: Michel Hidalgo <michel@ekumenlabs.com>
This commit is contained in:
Michel Hidalgo 2020-04-27 15:14:48 -03:00 committed by GitHub
parent 45f3976453
commit 814298480c
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 15 additions and 7 deletions

View file

@ -107,11 +107,14 @@ NodeParameters::NodeParameters(
rcl_yaml_node_struct_fini(params);
});
rclcpp::ParameterMap initial_map = rclcpp::parameter_map_from(params);
for (auto iter = initial_map.begin(); initial_map.end() != iter; iter++) {
// TODO(cottsay) implement further wildcard matching
if (iter->first == "/**" || iter->first == combined_name_) {
// Enforce wildcard matching precedence
// TODO(cottsay) implement further wildcard matching
const std::vector<std::string> node_matching_names{"/**", combined_name_};
for (const auto & node_name : node_matching_names) {
if (initial_map.count(node_name) > 0) {
// Combine parameter yaml files, overwriting values in older ones
for (auto & param : iter->second) {
for (const rclcpp::Parameter & param : initial_map.at(node_name)) {
parameter_overrides_[param.get_name()] =
rclcpp::ParameterValue(param.get_value_message());
}

View file

@ -1,4 +1,8 @@
/**:
ros__parameters:
parameter_int: 21
parameter_bool: true
parameter_int: 42
parameter_string_array: [baz, baz, baz]
test_declare_parameter_node:
ros__parameters:
parameter_int: 21

View file

@ -691,7 +691,7 @@ TEST_F(TestNode, declare_parameter_with_cli_overrides) {
no.arguments(
{
"--ros-args",
"-p", "parameter_bool:=true",
"-p", "parameter_bool:=false",
"-p", "parameter_int:=42",
"-p", "parameter_double:=0.42",
"-p", "parameter_string:=foo",
@ -702,7 +702,8 @@ TEST_F(TestNode, declare_parameter_with_cli_overrides) {
"-p", "parameter_string_array:=[foo, bar]"
});
auto node = std::make_shared<rclcpp::Node>("test_declare_parameter_node"_unq, no);
// To match parameters YAML file content, use a well-known node name for this test only.
auto node = std::make_shared<rclcpp::Node>("test_declare_parameter_node", no);
{
rclcpp::ParameterValue value = node->declare_parameter("parameter_bool");
EXPECT_EQ(value.get_type(), rclcpp::PARAMETER_BOOL);