-
Notifications
You must be signed in to change notification settings - Fork 178
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
Conversation
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.
There was a problem hiding this 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))
lol, this PR is ~5 months old. I suppose that could also work. Feel free to verify and push a patch to this branch :) |
It is old, but gold. It's a very useful fix |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM
diagnostic_updater/include/diagnostic_updater/diagnostic_updater.hpp
Outdated
Show resolved
Hide resolved
[BACKPORT - #227] Check if parameter is already declared to avoid re-declaring it
* 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>
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 transitionscould 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 checkingwhether that parameter has already been declared. In subsequent calls to
on_configure
(and thus, if Diagnostics are initialized there, in subsequentcalls to the
Updater
constructor, this results in the following message:To avoid this, until the Foxy version, the wrapper code could explicitly call
undeclare_parameter
on the parameter that theUpdater
is declaring, but asof 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.