Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Check if parameter is already declared to avoid re-declaring it. #227

Merged
merged 3 commits into from
Nov 12, 2022

Conversation

bergercookie
Copy link
Contributor

A parameter can only be declared once. When implementing a LicecycleNode one
would normally do all the initialization in on_configure() and the cleanup,
deinitialization in the on_cleanup method. Furthermore, these transitions
could potentially be called multiple times, depending on how the node is t
ransitioned from the lifecycles are triggered. However, this approach doesn't
currently work well with Diagnostics since, in the constructor, of
diagnostic_updater::Updater it's declaring a static parameter without checking
whether that parameter has already been declared. In subsequent calls to
on_configure (and thus, if Diagnostics are initialized there, in subsequent
calls to the Updater constructor, this results in the following message:

Original error: parameter 'diagnostic_updater.period' has already been declared

To avoid this, until the Foxy version, the wrapper code could explicitly call
undeclare_parameter on the parameter that the Updater is declaring, but as
of Galactic, undeclaring a static parameter is not allowed anymore. See e.g.,
ros2/rclcpp#1850.

In this commit, I'm checking explicitly if the parameter has already been
registered and if so, I'm just reading its value before attempting to re-declare
it.

A parameter can only be declared once. When implementing a LicecycleNode
one would normally do all the initialization in `on_configure()` and the
cleanup, deinitialization in the `on_cleanup` method. Furthermore, these
transitions could potentially be called multiple times, depending on how
the node is t ransitioned from the lifecycles are triggered. However,
this approach doesn't currently work well with Diagnostics since, in the
constructor, of `diagnostic_updater::Updater` it's declaring a static
parameter without checking whether that parameter has already been
declared. In subsequent calls to `on_configure` (and thus,
if Diagnostics are initialized there, in subsequent calls to the
`Updater` constructor, this results in the following message:

```
Original error: parameter 'diagnostic_updater.period' has already been declared
```

To avoid this, until the Foxy version, the wrapper code could explicitly
call `undeclare_parameter` on the parameter that the `Updater` is
declaring, but as of Galactic, undeclaring a static parameter is not
allowed anymore. See e.g., ros2/rclcpp#1850.

In this commit, I'm checking explicitly if the parameter has already
been registered and if so, I'm just reading its value before attempting
to re-declare it.
Copy link

@com2rng com2rng left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The code seems fine to me, I'm just wondering why a try-catch statement is used instead of using
if (parameters_interface->has_parameter(period_param_name))

@bergercookie
Copy link
Contributor Author

lol, this PR is ~5 months old.

I suppose that could also work. Feel free to verify and push a patch to this branch :)

@com2rng
Copy link

com2rng commented Oct 19, 2022

It is old, but gold. It's a very useful fix

Copy link
Collaborator

@ralph-lange ralph-lange left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

ralph-lange added a commit to bergercookie/diagnostics that referenced this pull request Nov 12, 2022
ralph-lange added a commit that referenced this pull request Nov 12, 2022
[BACKPORT - #227] Check if parameter is already declared to avoid re-declaring it
@ralph-lange ralph-lange merged commit 5c9fc46 into ros:ros2-devel Nov 12, 2022
ralph-lange added a commit that referenced this pull request Nov 12, 2022
* Check if parameter is already declared to avoid re-declaring it.

A parameter can only be declared once. When implementing a LicecycleNode
one would normally do all the initialization in `on_configure()` and the
cleanup, deinitialization in the `on_cleanup` method. Furthermore, these
transitions could potentially be called multiple times, depending on how
the node is t ransitioned from the lifecycles are triggered. However,
this approach doesn't currently work well with Diagnostics since, in the
constructor, of `diagnostic_updater::Updater` it's declaring a static
parameter without checking whether that parameter has already been
declared. In subsequent calls to `on_configure` (and thus,
if Diagnostics are initialized there, in subsequent calls to the
`Updater` constructor, this results in the following message:

```
Original error: parameter 'diagnostic_updater.period' has already been declared
```

To avoid this, until the Foxy version, the wrapper code could explicitly
call `undeclare_parameter` on the parameter that the `Updater` is
declaring, but as of Galactic, undeclaring a static parameter is not
allowed anymore. See e.g., ros2/rclcpp#1850.

In this commit, I'm checking explicitly if the parameter has already
been registered and if so, I'm just reading its value before attempting
to re-declare it.

* Replaced try-catch with has_parameter check.

Co-authored-by: Nikos Koukis <nikolaos@slamcore.com>
Co-authored-by: Ralph Lange <ralph-lange@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants