Add ignore override argument to declare parameter (#767)
Signed-off-by: ivanpauno <ivanpauno@ekumenlabs.com>
This commit is contained in:
parent
e7c463dc74
commit
2069594cc2
7 changed files with 75 additions and 33 deletions
|
@ -369,6 +369,8 @@ public:
|
||||||
* are ignored, and should be specified using the name argument to this
|
* are ignored, and should be specified using the name argument to this
|
||||||
* function and the default value's type instead.
|
* function and the default value's type instead.
|
||||||
*
|
*
|
||||||
|
* If `ignore_override` is `true`, the parameter override will be ignored.
|
||||||
|
*
|
||||||
* This method, if successful, will result in any callback registered with
|
* This method, if successful, will result in any callback registered with
|
||||||
* set_on_parameters_set_callback to be called.
|
* set_on_parameters_set_callback to be called.
|
||||||
* If that callback prevents the initial value for the parameter from being
|
* If that callback prevents the initial value for the parameter from being
|
||||||
|
@ -382,6 +384,8 @@ public:
|
||||||
* did not override it.
|
* did not override it.
|
||||||
* \param[in] parameter_descriptor An optional, custom description for
|
* \param[in] parameter_descriptor An optional, custom description for
|
||||||
* the parameter.
|
* the parameter.
|
||||||
|
* \param[in] ignore_override When `true`, the parameter override is ignored.
|
||||||
|
* Default to `false`.
|
||||||
* \return A const reference to the value of the parameter.
|
* \return A const reference to the value of the parameter.
|
||||||
* \throws rclcpp::exceptions::ParameterAlreadyDeclaredException if parameter
|
* \throws rclcpp::exceptions::ParameterAlreadyDeclaredException if parameter
|
||||||
* has already been declared.
|
* has already been declared.
|
||||||
|
@ -396,7 +400,8 @@ public:
|
||||||
const std::string & name,
|
const std::string & name,
|
||||||
const rclcpp::ParameterValue & default_value = rclcpp::ParameterValue(),
|
const rclcpp::ParameterValue & default_value = rclcpp::ParameterValue(),
|
||||||
const rcl_interfaces::msg::ParameterDescriptor & parameter_descriptor =
|
const rcl_interfaces::msg::ParameterDescriptor & parameter_descriptor =
|
||||||
rcl_interfaces::msg::ParameterDescriptor());
|
rcl_interfaces::msg::ParameterDescriptor(),
|
||||||
|
bool ignore_override = false);
|
||||||
|
|
||||||
/// Declare and initialize a parameter with a type.
|
/// Declare and initialize a parameter with a type.
|
||||||
/**
|
/**
|
||||||
|
@ -425,7 +430,8 @@ public:
|
||||||
const std::string & name,
|
const std::string & name,
|
||||||
const ParameterT & default_value,
|
const ParameterT & default_value,
|
||||||
const rcl_interfaces::msg::ParameterDescriptor & parameter_descriptor =
|
const rcl_interfaces::msg::ParameterDescriptor & parameter_descriptor =
|
||||||
rcl_interfaces::msg::ParameterDescriptor());
|
rcl_interfaces::msg::ParameterDescriptor(),
|
||||||
|
bool ignore_override = false);
|
||||||
|
|
||||||
/// Declare and initialize several parameters with the same namespace and type.
|
/// Declare and initialize several parameters with the same namespace and type.
|
||||||
/**
|
/**
|
||||||
|
@ -440,11 +446,12 @@ public:
|
||||||
* expanding "namespace.key".
|
* expanding "namespace.key".
|
||||||
* This allows you to declare several parameters at once without a namespace.
|
* This allows you to declare several parameters at once without a namespace.
|
||||||
*
|
*
|
||||||
* The map may either contain default values for parameters, or a std::pair
|
* The map contains default values for parameters.
|
||||||
* where the first element is a default value and the second is a
|
* There is another overload which takes the std::pair with the default value
|
||||||
* parameter descriptor.
|
* and descriptor.
|
||||||
* This function only takes the default value, but there is another overload
|
*
|
||||||
* which takes the std::pair with the default value and descriptor.
|
* If `ignore_overrides` is `true`, all the overrides of the parameters declared
|
||||||
|
* by the function call will be ignored.
|
||||||
*
|
*
|
||||||
* This method, if successful, will result in any callback registered with
|
* This method, if successful, will result in any callback registered with
|
||||||
* set_on_parameters_set_callback to be called, once for each parameter.
|
* set_on_parameters_set_callback to be called, once for each parameter.
|
||||||
|
@ -453,6 +460,8 @@ public:
|
||||||
*
|
*
|
||||||
* \param[in] namespace_ The namespace in which to declare the parameters.
|
* \param[in] namespace_ The namespace in which to declare the parameters.
|
||||||
* \param[in] parameters The parameters to set in the given namespace.
|
* \param[in] parameters The parameters to set in the given namespace.
|
||||||
|
* \param[in] ignore_overrides When `true`, the parameters overrides are ignored.
|
||||||
|
* Default to `false`.
|
||||||
* \throws rclcpp::exceptions::ParameterAlreadyDeclaredException if parameter
|
* \throws rclcpp::exceptions::ParameterAlreadyDeclaredException if parameter
|
||||||
* has already been declared.
|
* has already been declared.
|
||||||
* \throws rclcpp::exceptions::InvalidParametersException if a parameter
|
* \throws rclcpp::exceptions::InvalidParametersException if a parameter
|
||||||
|
@ -464,7 +473,8 @@ public:
|
||||||
std::vector<ParameterT>
|
std::vector<ParameterT>
|
||||||
declare_parameters(
|
declare_parameters(
|
||||||
const std::string & namespace_,
|
const std::string & namespace_,
|
||||||
const std::map<std::string, ParameterT> & parameters);
|
const std::map<std::string, ParameterT> & parameters,
|
||||||
|
bool ignore_overrides = false);
|
||||||
|
|
||||||
/// Declare and initialize several parameters with the same namespace and type.
|
/// Declare and initialize several parameters with the same namespace and type.
|
||||||
/**
|
/**
|
||||||
|
@ -480,7 +490,8 @@ public:
|
||||||
const std::map<
|
const std::map<
|
||||||
std::string,
|
std::string,
|
||||||
std::pair<ParameterT, rcl_interfaces::msg::ParameterDescriptor>
|
std::pair<ParameterT, rcl_interfaces::msg::ParameterDescriptor>
|
||||||
> & parameters);
|
> & parameters,
|
||||||
|
bool ignore_overrides = false);
|
||||||
|
|
||||||
/// Undeclare a previously declared parameter.
|
/// Undeclare a previously declared parameter.
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -250,12 +250,14 @@ auto
|
||||||
Node::declare_parameter(
|
Node::declare_parameter(
|
||||||
const std::string & name,
|
const std::string & name,
|
||||||
const ParameterT & default_value,
|
const ParameterT & default_value,
|
||||||
const rcl_interfaces::msg::ParameterDescriptor & parameter_descriptor)
|
const rcl_interfaces::msg::ParameterDescriptor & parameter_descriptor,
|
||||||
|
bool ignore_override)
|
||||||
{
|
{
|
||||||
return this->declare_parameter(
|
return this->declare_parameter(
|
||||||
name,
|
name,
|
||||||
rclcpp::ParameterValue(default_value),
|
rclcpp::ParameterValue(default_value),
|
||||||
parameter_descriptor
|
parameter_descriptor,
|
||||||
|
ignore_override
|
||||||
).get<ParameterT>();
|
).get<ParameterT>();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -263,14 +265,19 @@ template<typename ParameterT>
|
||||||
std::vector<ParameterT>
|
std::vector<ParameterT>
|
||||||
Node::declare_parameters(
|
Node::declare_parameters(
|
||||||
const std::string & namespace_,
|
const std::string & namespace_,
|
||||||
const std::map<std::string, ParameterT> & parameters)
|
const std::map<std::string, ParameterT> & parameters,
|
||||||
|
bool ignore_overrides)
|
||||||
{
|
{
|
||||||
std::vector<ParameterT> result;
|
std::vector<ParameterT> result;
|
||||||
std::string normalized_namespace = namespace_.empty() ? "" : (namespace_ + ".");
|
std::string normalized_namespace = namespace_.empty() ? "" : (namespace_ + ".");
|
||||||
std::transform(
|
std::transform(
|
||||||
parameters.begin(), parameters.end(), std::back_inserter(result),
|
parameters.begin(), parameters.end(), std::back_inserter(result),
|
||||||
[this, &normalized_namespace](auto element) {
|
[this, &normalized_namespace, ignore_overrides](auto element) {
|
||||||
return this->declare_parameter(normalized_namespace + element.first, element.second);
|
return this->declare_parameter(
|
||||||
|
normalized_namespace + element.first,
|
||||||
|
element.second,
|
||||||
|
rcl_interfaces::msg::ParameterDescriptor(),
|
||||||
|
ignore_overrides);
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
return result;
|
return result;
|
||||||
|
@ -283,18 +290,20 @@ Node::declare_parameters(
|
||||||
const std::map<
|
const std::map<
|
||||||
std::string,
|
std::string,
|
||||||
std::pair<ParameterT, rcl_interfaces::msg::ParameterDescriptor>
|
std::pair<ParameterT, rcl_interfaces::msg::ParameterDescriptor>
|
||||||
> & parameters)
|
> & parameters,
|
||||||
|
bool ignore_overrides)
|
||||||
{
|
{
|
||||||
std::vector<ParameterT> result;
|
std::vector<ParameterT> result;
|
||||||
std::string normalized_namespace = namespace_.empty() ? "" : (namespace_ + ".");
|
std::string normalized_namespace = namespace_.empty() ? "" : (namespace_ + ".");
|
||||||
std::transform(
|
std::transform(
|
||||||
parameters.begin(), parameters.end(), std::back_inserter(result),
|
parameters.begin(), parameters.end(), std::back_inserter(result),
|
||||||
[this, &normalized_namespace](auto element) {
|
[this, &normalized_namespace, ignore_overrides](auto element) {
|
||||||
return static_cast<ParameterT>(
|
return static_cast<ParameterT>(
|
||||||
this->declare_parameter(
|
this->declare_parameter(
|
||||||
normalized_namespace + element.first,
|
normalized_namespace + element.first,
|
||||||
element.second.first,
|
element.second.first,
|
||||||
element.second.second)
|
element.second.second,
|
||||||
|
ignore_overrides)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
|
@ -80,7 +80,8 @@ public:
|
||||||
declare_parameter(
|
declare_parameter(
|
||||||
const std::string & name,
|
const std::string & name,
|
||||||
const rclcpp::ParameterValue & default_value,
|
const rclcpp::ParameterValue & default_value,
|
||||||
const rcl_interfaces::msg::ParameterDescriptor & parameter_descriptor) override;
|
const rcl_interfaces::msg::ParameterDescriptor & parameter_descriptor,
|
||||||
|
bool ignore_override) override;
|
||||||
|
|
||||||
RCLCPP_PUBLIC
|
RCLCPP_PUBLIC
|
||||||
void
|
void
|
||||||
|
|
|
@ -53,7 +53,8 @@ public:
|
||||||
const std::string & name,
|
const std::string & name,
|
||||||
const rclcpp::ParameterValue & default_value = rclcpp::ParameterValue(),
|
const rclcpp::ParameterValue & default_value = rclcpp::ParameterValue(),
|
||||||
const rcl_interfaces::msg::ParameterDescriptor & parameter_descriptor =
|
const rcl_interfaces::msg::ParameterDescriptor & parameter_descriptor =
|
||||||
rcl_interfaces::msg::ParameterDescriptor()) = 0;
|
rcl_interfaces::msg::ParameterDescriptor(),
|
||||||
|
bool ignore_override = false) = 0;
|
||||||
|
|
||||||
/// Undeclare a parameter.
|
/// Undeclare a parameter.
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -236,9 +236,14 @@ const rclcpp::ParameterValue &
|
||||||
Node::declare_parameter(
|
Node::declare_parameter(
|
||||||
const std::string & name,
|
const std::string & name,
|
||||||
const rclcpp::ParameterValue & default_value,
|
const rclcpp::ParameterValue & default_value,
|
||||||
const rcl_interfaces::msg::ParameterDescriptor & parameter_descriptor)
|
const rcl_interfaces::msg::ParameterDescriptor & parameter_descriptor,
|
||||||
|
bool ignore_override)
|
||||||
{
|
{
|
||||||
return this->node_parameters_->declare_parameter(name, default_value, parameter_descriptor);
|
return this->node_parameters_->declare_parameter(
|
||||||
|
name,
|
||||||
|
default_value,
|
||||||
|
parameter_descriptor,
|
||||||
|
ignore_override);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
|
@ -170,7 +170,8 @@ NodeParameters::NodeParameters(
|
||||||
this->declare_parameter(
|
this->declare_parameter(
|
||||||
pair.first,
|
pair.first,
|
||||||
pair.second,
|
pair.second,
|
||||||
rcl_interfaces::msg::ParameterDescriptor());
|
rcl_interfaces::msg::ParameterDescriptor(),
|
||||||
|
true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -333,7 +334,7 @@ __declare_parameter_common(
|
||||||
const std::map<std::string, rclcpp::ParameterValue> & overrides,
|
const std::map<std::string, rclcpp::ParameterValue> & overrides,
|
||||||
OnParametersSetCallbackType on_set_parameters_callback,
|
OnParametersSetCallbackType on_set_parameters_callback,
|
||||||
rcl_interfaces::msg::ParameterEvent * parameter_event_out,
|
rcl_interfaces::msg::ParameterEvent * parameter_event_out,
|
||||||
bool use_overrides = true)
|
bool ignore_override = false)
|
||||||
{
|
{
|
||||||
using rclcpp::node_interfaces::ParameterInfo;
|
using rclcpp::node_interfaces::ParameterInfo;
|
||||||
std::map<std::string, ParameterInfo> parameter_infos {{name, ParameterInfo()}};
|
std::map<std::string, ParameterInfo> parameter_infos {{name, ParameterInfo()}};
|
||||||
|
@ -342,7 +343,7 @@ __declare_parameter_common(
|
||||||
// Use the value from the overrides if available, otherwise use the default.
|
// Use the value from the overrides if available, otherwise use the default.
|
||||||
const rclcpp::ParameterValue * initial_value = &default_value;
|
const rclcpp::ParameterValue * initial_value = &default_value;
|
||||||
auto overrides_it = overrides.find(name);
|
auto overrides_it = overrides.find(name);
|
||||||
if (use_overrides && overrides_it != overrides.end()) {
|
if (!ignore_override && overrides_it != overrides.end()) {
|
||||||
initial_value = &overrides_it->second;
|
initial_value = &overrides_it->second;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -369,7 +370,8 @@ const rclcpp::ParameterValue &
|
||||||
NodeParameters::declare_parameter(
|
NodeParameters::declare_parameter(
|
||||||
const std::string & name,
|
const std::string & name,
|
||||||
const rclcpp::ParameterValue & default_value,
|
const rclcpp::ParameterValue & default_value,
|
||||||
const rcl_interfaces::msg::ParameterDescriptor & parameter_descriptor)
|
const rcl_interfaces::msg::ParameterDescriptor & parameter_descriptor,
|
||||||
|
bool ignore_override)
|
||||||
{
|
{
|
||||||
std::lock_guard<std::mutex> lock(mutex_);
|
std::lock_guard<std::mutex> lock(mutex_);
|
||||||
|
|
||||||
|
@ -392,7 +394,8 @@ NodeParameters::declare_parameter(
|
||||||
parameters_,
|
parameters_,
|
||||||
parameter_overrides_,
|
parameter_overrides_,
|
||||||
on_parameters_set_callback_,
|
on_parameters_set_callback_,
|
||||||
¶meter_event);
|
¶meter_event,
|
||||||
|
ignore_override);
|
||||||
|
|
||||||
// If it failed to be set, then throw an exception.
|
// If it failed to be set, then throw an exception.
|
||||||
if (!result.successful) {
|
if (!result.successful) {
|
||||||
|
@ -524,7 +527,7 @@ NodeParameters::set_parameters_atomically(const std::vector<rclcpp::Parameter> &
|
||||||
parameter_overrides_,
|
parameter_overrides_,
|
||||||
nullptr, // callback is explicitly null, so that it is called only once, when setting below.
|
nullptr, // callback is explicitly null, so that it is called only once, when setting below.
|
||||||
¶meter_event_msg,
|
¶meter_event_msg,
|
||||||
false);
|
true);
|
||||||
if (!result.successful) {
|
if (!result.successful) {
|
||||||
// Declare failed, return knowing that nothing was changed because the
|
// Declare failed, return knowing that nothing was changed because the
|
||||||
// staged changes were not applied.
|
// staged changes were not applied.
|
||||||
|
|
|
@ -362,14 +362,15 @@ TEST_F(TestNode, declare_parameter_with_no_initial_values) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(TestNode, declare_parameter_with_initial_values) {
|
TEST_F(TestNode, declare_parameter_with_overrides) {
|
||||||
// test cases with initial values
|
// test cases with overrides
|
||||||
rclcpp::NodeOptions no;
|
rclcpp::NodeOptions no;
|
||||||
no.parameter_overrides({
|
no.parameter_overrides({
|
||||||
{"parameter_no_default", 42},
|
{"parameter_no_default", 42},
|
||||||
{"parameter_no_default_set", 42},
|
{"parameter_no_default_set", 42},
|
||||||
{"parameter_no_default_set_cvref", 42},
|
{"parameter_no_default_set_cvref", 42},
|
||||||
{"parameter_and_default", 42},
|
{"parameter_and_default", 42},
|
||||||
|
{"parameter_and_default_ignore_override", 42},
|
||||||
{"parameter_custom", 42},
|
{"parameter_custom", 42},
|
||||||
{"parameter_template", 42},
|
{"parameter_template", 42},
|
||||||
{"parameter_already_declared", 42},
|
{"parameter_already_declared", 42},
|
||||||
|
@ -378,13 +379,13 @@ TEST_F(TestNode, declare_parameter_with_initial_values) {
|
||||||
});
|
});
|
||||||
auto node = std::make_shared<rclcpp::Node>("test_declare_parameter_node"_unq, no);
|
auto node = std::make_shared<rclcpp::Node>("test_declare_parameter_node"_unq, no);
|
||||||
{
|
{
|
||||||
// no default, with initial
|
// no default, with override
|
||||||
rclcpp::ParameterValue value = node->declare_parameter("parameter_no_default");
|
rclcpp::ParameterValue value = node->declare_parameter("parameter_no_default");
|
||||||
EXPECT_EQ(value.get_type(), rclcpp::PARAMETER_INTEGER);
|
EXPECT_EQ(value.get_type(), rclcpp::PARAMETER_INTEGER);
|
||||||
EXPECT_EQ(value.get<int>(), 42);
|
EXPECT_EQ(value.get<int>(), 42);
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
// no default, with initial, and set after
|
// no default, with override, and set after
|
||||||
rclcpp::ParameterValue value = node->declare_parameter("parameter_no_default_set");
|
rclcpp::ParameterValue value = node->declare_parameter("parameter_no_default_set");
|
||||||
EXPECT_EQ(value.get_type(), rclcpp::PARAMETER_INTEGER);
|
EXPECT_EQ(value.get_type(), rclcpp::PARAMETER_INTEGER);
|
||||||
EXPECT_EQ(value.get<int>(), 42);
|
EXPECT_EQ(value.get<int>(), 42);
|
||||||
|
@ -393,7 +394,7 @@ TEST_F(TestNode, declare_parameter_with_initial_values) {
|
||||||
EXPECT_EQ(node->get_parameter("parameter_no_default_set").get_value<int>(), 44);
|
EXPECT_EQ(node->get_parameter("parameter_no_default_set").get_value<int>(), 44);
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
// no default, with initial
|
// no default, with override
|
||||||
const rclcpp::ParameterValue & value =
|
const rclcpp::ParameterValue & value =
|
||||||
node->declare_parameter("parameter_no_default_set_cvref");
|
node->declare_parameter("parameter_no_default_set_cvref");
|
||||||
EXPECT_EQ(value.get_type(), rclcpp::PARAMETER_INTEGER);
|
EXPECT_EQ(value.get_type(), rclcpp::PARAMETER_INTEGER);
|
||||||
|
@ -403,12 +404,23 @@ TEST_F(TestNode, declare_parameter_with_initial_values) {
|
||||||
EXPECT_EQ(value.get<int>(), 44);
|
EXPECT_EQ(value.get<int>(), 44);
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
// int default, with initial
|
// int default, with override
|
||||||
rclcpp::ParameterValue default_value(43);
|
rclcpp::ParameterValue default_value(43);
|
||||||
rclcpp::ParameterValue value = node->declare_parameter("parameter_and_default", default_value);
|
rclcpp::ParameterValue value = node->declare_parameter("parameter_and_default", default_value);
|
||||||
EXPECT_EQ(value.get_type(), rclcpp::PARAMETER_INTEGER);
|
EXPECT_EQ(value.get_type(), rclcpp::PARAMETER_INTEGER);
|
||||||
EXPECT_EQ(value.get<int>(), 42); // and not 43 which is the default value
|
EXPECT_EQ(value.get<int>(), 42); // and not 43 which is the default value
|
||||||
}
|
}
|
||||||
|
{
|
||||||
|
// int default, with override and ignoring it
|
||||||
|
rclcpp::ParameterValue default_value(43);
|
||||||
|
rclcpp::ParameterValue value = node->declare_parameter(
|
||||||
|
"parameter_and_default_ignore_override",
|
||||||
|
default_value,
|
||||||
|
rcl_interfaces::msg::ParameterDescriptor(),
|
||||||
|
true);
|
||||||
|
EXPECT_EQ(value.get_type(), rclcpp::PARAMETER_INTEGER);
|
||||||
|
EXPECT_EQ(value.get<int>(), 43); // and not 42, the parameter override is ignored.
|
||||||
|
}
|
||||||
{
|
{
|
||||||
// int default, with initial, custom parameter descriptor
|
// int default, with initial, custom parameter descriptor
|
||||||
rclcpp::ParameterValue default_value(43);
|
rclcpp::ParameterValue default_value(43);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue