3 #include <gtest/gtest.h> 10 <root main_tree_to_execute="BehaviorTree"> 11 <BehaviorTree ID="BehaviorTree"> 12 <Fallback name="root"> 14 <ReactiveSequence name="navigation_subtree"> 16 <Condition ID="IsStuck"/> 18 <SequenceStar name="navigate"> 19 <Action ID="ComputePathToPose"/> 20 <Action ID="FollowPath"/> 24 <SequenceStar name="stuck_recovery"> 25 <Condition ID="IsStuck"/> 26 <Action ID="BackUpAndSpin"/> 38 inline std::chrono::high_resolution_clock::time_point
Now()
40 return std::chrono::high_resolution_clock::now();
51 _expected_result(true),
58 _expected_result = will_succeed;
69 std::cout << _name <<
": "<< (_expected_result?
"true" :
"false") << std::endl;
71 return expectedResult();
125 std::cout <<
"FollowPath::started" << std::endl;
126 _initial_time =
Now();
141 std::cout <<
"FollowPath::halt" << std::endl;
153 template <
typename Original,
typename Casted>
156 if( dynamic_cast<Casted*>(ptr) )
158 destination =
dynamic_cast<Casted*
>(ptr);
164 TEST(Navigationtest, MoveBaseRecovery)
177 IsStuck *first_stuck_node =
nullptr;
178 IsStuck *second_stuck_node =
nullptr;
183 for (
auto& node: tree.nodes)
185 auto ptr = node.get();
187 if( !first_stuck_node )
199 ASSERT_TRUE( first_stuck_node );
200 ASSERT_TRUE( second_stuck_node );
201 ASSERT_TRUE( back_spin_node );
202 ASSERT_TRUE( compute_node );
203 ASSERT_TRUE( follow_node );
205 std::cout <<
"-----------------------" << std::endl;
214 status = tree.tickRoot();
221 ASSERT_GE( first_stuck_node->
tickCount(), 6);
223 ASSERT_EQ( second_stuck_node->
tickCount(), 0 );
224 ASSERT_EQ( back_spin_node->
tickCount(), 0 );
226 ASSERT_EQ( compute_node->
tickCount(), 1 );
227 ASSERT_EQ( follow_node->
tickCount(), 1 );
228 ASSERT_FALSE( follow_node->
wasHalted() );
230 std::cout <<
"-----------------------" << std::endl;
251 status = tree.tickRoot();
259 ASSERT_GE( first_stuck_node->
tickCount(), 2);
261 ASSERT_EQ( second_stuck_node->
tickCount(), 1 );
262 ASSERT_EQ( back_spin_node->
tickCount(), 1 );
265 ASSERT_EQ( compute_node->
tickCount(), 1 );
267 ASSERT_EQ( follow_node->
tickCount(), 0 );
275 std::cout <<
"-----------------------" << std::endl;
291 status = tree.tickRoot();
298 ASSERT_GE( first_stuck_node->
tickCount(), 6);
299 ASSERT_EQ( second_stuck_node->
tickCount(), 0 );
300 ASSERT_EQ( back_spin_node->
tickCount(), 0 );
305 ASSERT_FALSE( follow_node->
wasHalted() );
The ActionNodeBase is the base class to use to create any kind of action. A particular derived class ...
NodeStatus tick() override
Method to be implemented by the user.
BackUpAndSpin(const std::string &name)
void registerNodeType(const std::string &ID)
ComputePathToPose(const std::string &name)
void TryDynamicCastPtr(Original *ptr, Casted *&destination)
NodeStatus tick() override
Method to be implemented by the user.
NodeStatus tick() override
Method to be implemented by the user.
void setExpectedResult(bool will_succeed)
FollowPath(const std::string &name)
The SyncActionNode is an ActionNode that explicitly prevents the status RUNNING and doesn't require a...
The BehaviorTreeFactory is used to create instances of a TreeNode at run-time.
std::chrono::high_resolution_clock::time_point Now()
Tree createTreeFromText(const std::string &text, Blackboard::Ptr blackboard=Blackboard::create())
TEST(Navigationtest, MoveBaseRecovery)
std::chrono::high_resolution_clock::time_point _initial_time
NodeStatus tick() override
Method to be implemented by the user.
NodeStatus status() const
TestNode(const std::string &name)
std::chrono::milliseconds Milliseconds
static const char * xml_text
NodeStatus expectedResult() const
IsStuck(const std::string &name)