Skip to content

Conversation

@silanus23
Copy link
Contributor

@silanus23 silanus23 commented Sep 26, 2025


Basic Info

Info Please fill out this column
Ticket(s) this addresses #5036
Primary OS tested on Ubuntu
Robotic platform tested on nav2_bringup
Does this PR contain AI generated software? unit tests
Was this PR description generated by AI software? Nope

Description of contribution in a few bullet points

I tried to implement the idea at #5036
I added run_id to the blackboard and it's symetrycal to action node template. So that everytime blackboard ticks nodes one can keep track of nodes init time. This is an insurance for synchronization in the background. Made this activated with a parameter so that it won't interfere with current implementations and break them too.

Description of documentation updates required from your changes

Action nodes now have the parameter is_global for this feature.

Description of how this change was tested

I have tested this locally with debug lines it was showing so integration tested too. Besides I wrote backward compatibility tests too.


Future work that may be required in bullet points

In future adding current behavior trees is_global = true for every node
As the final making this a default.

For Maintainers:

  • Check that any new parameters added are updated in docs.nav2.org
  • Check that any significant change is added to the migration guide
  • Check that any new features OR changes to existing behaviors are reflected in the tuning guide
  • Check that any new functions have Doxygen added
  • Check that any new features have test coverage
  • Check that any new plugins is added to the plugins page
  • If BT Node, Additionally: add to BT's XML index of nodes for groot, BT package's readme table, and BT library lists
  • Should this be backported to current distributions? If so, tag with backport-*.

@silanus23
Copy link
Contributor Author

silanus23 commented Sep 26, 2025

@adivardi could you give this a review? I just wondered if I comprehend the idea correctly.
Sorry to ping you directly. No worries if you are too busy.
Cheers

Copy link
Contributor

@adivardi adivardi left a comment

Choose a reason for hiding this comment

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

I left a few comments, but looks good!

We would need to add it to other nodes as well, all the ones that use BT::isStatusActive() to initialize (you can see #5035, though may new nodes were added in the meantime).

}
} catch (const std::exception & e) {
// run_id not found on blackboard, use old behavior
if (!BT::isStatusActive(status())) {
Copy link
Contributor

Choose a reason for hiding this comment

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

I am not sure about this, that would be a weird surprise. Maybe just let it crash? It would be the same as if server_timeout is missing.


// Subsequent ticks with same RunID should continue without re-initialization
result = tree_->tickOnce();
EXPECT_EQ(result, BT::NodeStatus::RUNNING);
Copy link
Contributor

Choose a reason for hiding this comment

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

how come all tests have the same EXPECT_EQ(result, BT::NodeStatus::RUNNING); ?

@silanus23
Copy link
Contributor Author

silanus23 commented Sep 26, 2025

Thank you.

@SteveMacenski
Copy link
Member

@silanus23 any update?

@silanus23
Copy link
Contributor Author

@SteveMacenski Sorry for late update. I couldn't give attention in here and other PRs. I am handling my hiring test case. Deadline is tomorrow. After that I beleive I can give others with this an answer in a week.

@codecov
Copy link

codecov bot commented Oct 23, 2025

Codecov Report

✅ All modified and coverable lines are covered by tests.

Files with missing lines Coverage Δ
...tree/include/nav2_behavior_tree/bt_action_node.hpp 80.29% <100.00%> (-0.63%) ⬇️
...ee/include/nav2_behavior_tree/bt_action_server.hpp 83.33% <ø> (ø)
...clude/nav2_behavior_tree/bt_action_server_impl.hpp 88.77% <100.00%> (+0.23%) ⬆️

... and 1 file with indirect coverage changes

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

@SteveMacenski
Copy link
Member

@adivardi can you review / close any resolved comments from your review?

#include <string>
#include <vector>

#include <boost/uuid/uuid.hpp>
Copy link
Member

Choose a reason for hiding this comment

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

We need to link this / package.xml the dependency? Please only include just the boost libraries required (not all)


// To keep track of the execution number
boost::uuids::random_generator uuid_generator_;
std::string run_id_;
Copy link
Member

Choose a reason for hiding this comment

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

Maybe current_run_id_ to be clear?

"wait_for_service_timeout",
wait_for_service_timeout_);

run_id_ = boost::uuids::to_string(uuid_generator_());
Copy link
Member

Choose a reason for hiding this comment

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

Do we ever actually use run_id_? If not, then we don't need to store this as a member.

if (getInput("server_name", remapped_action_name)) {
action_name_ = remapped_action_name;
}
getInput("is_global", is_global_);
Copy link
Member

Choose a reason for hiding this comment

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

Question: should this be applied to non-action nodes or only the action nodes?

Copy link
Member

@SteveMacenski SteveMacenski Oct 23, 2025

Choose a reason for hiding this comment

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

Also, I think this is also missing the other nodes that have the initialization procedure within their implementations themselves (not just the action server base node). I think that's a key part of the ticket #5036 but I can understand just starting in one spot to get it right before doing all the others!

BT::InputPort<std::string>("server_name", "Action server name"),
BT::InputPort<std::chrono::milliseconds>("server_timeout")
BT::InputPort<std::chrono::milliseconds>("server_timeout"),
BT::InputPort<bool>("is_global", false, "Use RunID for initialization")
Copy link
Member

Choose a reason for hiding this comment

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

The configuration guide would need to be updated to mention this.

Question: does this make more sense as a BT XML parameter for each and every node, or as a ROS configuration parameter applied to every node automatically from a yaml file? Is there a situation we'd want some nodes to do this and not others?

// first step to be done only at the beginning of the Action
if (!BT::isStatusActive(status())) {
if (is_global_) {
std::string current_run_id = config().blackboard->get<std::string>("run_id");
Copy link
Member

Choose a reason for hiding this comment

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

We should throw an exception if the run_id is not set but is_global_. That's an invalid situation.

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.

Behavior Tree: Add RunID Blackboard variable, and global version to Asynchronous nodes

3 participants