Go to the documentation of this file. 1 #include <gtest/gtest.h>
3 #include "../sample_nodes/dummy_nodes.h"
4 #include "../sample_nodes/movebase_node.h"
8 TEST(SubTree, SiblingPorts_Issue_72)
12 <root main_tree_to_execute = "MainTree" >
14 <BehaviorTree ID="MainTree">
16 <SetBlackboard value="hello" output_key="myParam" />
17 <SubTree ID="mySubtree" param="myParam" />
18 <SetBlackboard value="world" output_key="myParam" />
19 <SubTree ID="mySubtree" param="myParam" />
23 <BehaviorTree ID="mySubtree">
24 <SaySomething message="{param}" />
33 for (
auto& bb : tree.blackboard_stack)
36 std::cout <<
"-----" << std::endl;
42 ASSERT_EQ(tree.blackboard_stack.size(), 3);
54 auto msg = getInput<std::string>(
"in");
59 setOutput(
"out", msg.value());
65 return {BT::InputPort<std::string>(
"in"), BT::OutputPort<std::string>(
"out")};
69 TEST(SubTree, GoodRemapping)
73 <root main_tree_to_execute = "MainTree" >
75 <BehaviorTree ID="MainTree">
77 <SetBlackboard value="hello" output_key="thoughts" />
78 <SubTree ID="CopySubtree" in_arg="thoughts" out_arg="greetings"/>
79 <SaySomething message="{greetings}" />
83 <BehaviorTree ID="CopySubtree">
84 <CopyPorts in="{in_arg}" out="{out_arg}"/>
97 TEST(SubTree, BadRemapping)
103 static const char* xml_text_bad_in = R
"(
104 <root main_tree_to_execute = "MainTree" >
106 <BehaviorTree ID="MainTree">
108 <SetBlackboard value="hello" output_key="thoughts" />
109 <SubTree ID="CopySubtree" out_arg="greetings"/>
110 <SaySomething message="{greetings}" />
114 <BehaviorTree ID="CopySubtree">
115 <CopyPorts in="{in_arg}" out="{out_arg}"/>
120 EXPECT_ANY_THROW(tree_bad_in.tickRoot());
122 static const char* xml_text_bad_out = R
"(
123 <root main_tree_to_execute = "MainTree" >
125 <BehaviorTree ID="MainTree">
127 <SetBlackboard value="hello" output_key="thoughts" />
128 <SubTree ID="CopySubtree" in_arg="thoughts"/>
129 <SaySomething message="{greetings}" />
133 <BehaviorTree ID="CopySubtree">
134 <CopyPorts in="{in_arg}" out="{out_arg}"/>
139 EXPECT_ANY_THROW(tree_bad_out.tickRoot());
146 <root main_tree_to_execute = "MainTree" >
148 <BehaviorTree ID="MainTree">
150 <SetBlackboard value="Auto remapped" output_key="param" />
151 <SubTreePlus ID="mySubtree" __autoremap="1" />
155 <BehaviorTree ID="mySubtree">
156 <SaySomething message="{param}" />
172 <root main_tree_to_execute = "MainTree" >
174 <BehaviorTree ID="MainTree">
176 <SetBlackboard value="Hello World" output_key="myParam" />
177 <SetBlackboard value="Auto remapped" output_key="param3" />
178 <SubTreePlus ID="mySubtree" __autoremap="1" param1="{myParam}" param2="Straight Talking" />
182 <BehaviorTree ID="mySubtree">
184 <SaySomething message="{param1}" />
185 <SaySomething message="{param2}" />
186 <SaySomething message="{param3}" />
203 <root main_tree_to_execute = "MainTree" >
205 <BehaviorTree ID="MainTree">
207 <SetBlackboard value="Hello" output_key="param1" />
208 <SetBlackboard value="World" output_key="param2" />
209 <SubTree ID="mySubtree" __shared_blackboard="true"/>
213 <BehaviorTree ID="mySubtree">
215 <SaySomething message="{param1}" />
216 <SaySomething message="{param2}" />
235 auto msg = getInput<std::string>(
"message");
248 return {BT::InputPort<std::string>(
"message")};
258 <root main_tree_to_execute = "MainTree" >
260 <BehaviorTree ID="MainTree">
262 <SubTreePlus ID="mySubtree" __autoremap="1"/>
265 <BehaviorTree ID="mySubtree">
266 <ReadInConstructor message="{message}" />
284 <root main_tree_to_execute = "TestTree" >
285 <BehaviorTree ID="Subtree1">
286 <Decorator ID="Repeat" num_cycles="{port_to_use}">
287 <Action ID="AlwaysSuccess"/>
291 <BehaviorTree ID="Subtree2">
292 <Action ID="SetBlackboard" output_key="test_port" value="{port_to_read}"/>
295 <BehaviorTree ID="TestTree">
297 <Action ID="SetBlackboard" output_key="test_port" value="1"/>
298 <SubTree ID="Subtree1" port_to_use="test_port"/>
299 <SubTree ID="Subtree2" port_to_read="test_port"/>
319 std::cout <<
"CTOR:" << config.
blackboard->get<std::string>(
"ros_node") << std::endl;
324 std::cout <<
"tick:" << config().blackboard->get<std::string>(
"ros_node") << std::endl;
333 TEST(SubTree, SubtreeNav2_Issue563)
336 <root main_tree_to_execute="Tree1">
338 <BehaviorTree ID="Tree1">
340 <SetBlackboard output_key="the_message" value="hello world"/>
341 <SubTreePlus ID="Tree2" __autoremap="true"/>
342 <SaySomething message="{reply}" />
346 <BehaviorTree ID="Tree2">
347 <SubTreePlus ID="Tree3" __autoremap="true"/>
350 <BehaviorTree ID="Tree3">
351 <SubTreePlus ID="Talker" __autoremap="true"/>
354 <BehaviorTree ID="Talker">
356 <SaySomething message="{the_message}" />
357 <SetBlackboard output_key="reply" value="done"/>
369 blackboard->set<std::string>(
"ros_node",
"nav2_shouldnt_do_this");
377 TEST(SubTree, SubtreeNav2_Issue724)
380 <root main_tree_to_execute="Tree1">
382 <BehaviorTree ID="Tree1">
384 <SubTreePlus ID="Tree2" ros_node="{ros_node}"/>
388 <BehaviorTree ID="Tree2">
389 <SubTreePlus ID="Tree3" ros_node="{ros_node}"/>
392 <BehaviorTree ID="Tree3">
393 <SubTreePlus ID="Talker" ros_node="{ros_node}"/>
396 <BehaviorTree ID="Talker">
410 blackboard->set<std::string>(
"ros_node",
"nav2_shouldnt_do_this");
418 TEST(SubTree, String_to_Pose_Issue623)
423 <root main_tree_to_execute="Test">
424 <BehaviorTree ID="Test">
425 <ReactiveSequence name="MainSequence">
426 <SubTreePlus name="Visit2" ID="Visit2" tl1="1;2;3"/>
429 <BehaviorTree ID="Visit2">
430 <Sequence name="Visit2MainSequence">
431 <Action name="MoveBase" ID="MoveBase" goal="{tl1}"/>
442 tree.tickRootWhileRunning();
452 return {BT::InputPort<bool>(
"condition")};
457 if (getInput<bool>(
"condition").value())
464 TEST(SubTree, Issue653_SetBlackboard)
469 <root main_tree_to_execute = "MainTree">
470 <BehaviorTree ID="MainTree">
472 <SubTreePlus ID="Init" test="{test}" />
473 <Assert condition="{test}" />
477 <BehaviorTree ID="Init">
478 <SetBlackboard output_key="test" value="true"/>
488 tree.tickRootWhileRunning();
static BT::PortsList providedPorts()
NodeStatus tickRoot()
tickRoot send the tick signal to the root node. It will propagate through the entire tree.
void registerNodeType(const std::string &ID)
Assert(const std::string &name, const BT::NodeConfiguration &config)
BT::NodeStatus tick() override
Method to be implemented by the user.
Struct used to store a tree. If this object goes out of scope, the tree is destroyed.
std::unordered_map< std::string, PortInfo > PortsList
TEST(SubTree, SiblingPorts_Issue_72)
static BT::PortsList providedPorts()
Tree createTreeFromText(const std::string &text, Blackboard::Ptr blackboard=Blackboard::create())
static BT::PortsList providedPorts()
The BehaviorTreeFactory is used to create instances of a TreeNode at run-time.
static Blackboard::Ptr create(Blackboard::Ptr parent={})
ReadInConstructor(const std::string &name, const BT::NodeConfiguration &config)
Blackboard::Ptr blackboard
CopyPorts(const std::string &name, const BT::NodeConfiguration &config)
virtual BT::NodeStatus tick() override
Method to be implemented by the user.
BT::NodeStatus tick() override
Method to be implemented by the user.
NaughtyNav2Node(const std::string &name, const BT::NodeConfiguration &config)
void registerBehaviorTreeFromText(const std::string &xml_text)
BT::NodeStatus tick() override
Method to be implemented by the user.
static BT::PortsList providedPorts()
static const char * xml_text
The SyncActionNode is an ActionNode that explicitly prevents the status RUNNING and doesn't require a...
behaviortree_cpp_v3
Author(s): Michele Colledanchise, Davide Faconti
autogenerated on Wed Jun 26 2024 02:51:19