三个状态
SUCCESS,FAILURE,RUNNING,节点运行成功后返回给父节点状态。
RUNNING用于asynchronous(异步)节点里,当该节点需要更多时间执行时就返回该值。
同步(synchronous)与异步(asynchronous):
同步方法调用一旦开始,调用者必须等到方法调用返回后,才能继续后续的行为。
异步方法调用更像一个消息的传递,一旦开始,方法调用就会立即返回,调用者就可以继续后续的操作。而异步方法通常会在另外一个线程中“真实”地执行。整个过程,不会阻碍调用者的工作。对于调用者来说异步调用似乎是一瞬间就完成了。如果异步调用需要返回结果,那么当这个异步调用真实完成时,则会通知调用者。你可以去干其他事情,等异步调用完再通知你。
节点类型
control_nodes
sequence和fallback等,要有1-N个孩子,tick的时候从左往右tick孩子。
- sequence
- success的话就tick下一个,遇到failure就整体返回failure,所有孩子tick后成功了则返回success。
- 若用decorator_node结合的话,这里的inverter表示反转节点状态,retry表示多次尝试
retry节点表示如果孩子尝试失败,则继续循环,直到次数结束都没有成功就返回失败。
下图表示:isDoorOpen?-YES-END, isDoorOpen?-NO-Success-Continue
- 在tick第一个孩子之前,这个node的状态为running
- restart:当下一次tick该sequence的时候,整体回去从列表的第一个节点开始tick。
tick again:当下一次tick该sequence的时候,整体从这个相同的child开始。
NodeStatus MoveBaseAction::tick()
{
Pose2D goal;
if ( !getInput<Pose2D>("goal", goal))
{
throw RuntimeError("missing required input [goal]");
}
printf("[ MoveBase: STARTED ]. goal: x=%.f y=%.1f theta=%.2f\n",
goal.x, goal.y, goal.theta);
_halt_requested.store(false);
int count = 0;
// Pretend that "computing" takes 250 milliseconds.
// It is up to you to check periodicall _halt_requested and interrupt
// this tick() if it is true.
//注意!当重新tick的时候,仍然是回到这里继续执行,这是一个异步线程。
while (!_halt_requested && count++ < 25)
{
SleepMS(10);
}
std::cout << "[ MoveBase: FINISHED ]" << std::endl;
return _halt_requested ? NodeStatus::FAILURE : NodeStatus::SUCCESS;
}
type | child returns failure | child returns running |
---|---|---|
sequence | restart | tick again |
ReactiveSequence | restart | resart |
SequenceStar | tick again | tick again |
ReactiveSequence:
可以用于重复确认前面的条件,但要注意如果前面的child是同步节点的话,他们不能过多地tick。
SequenceStar:
使用该控制节点的话,你可以不用重复tick那些已经成功的节点。
比如此图里面,ABC只需执行一次,但是Batteryok要重复确认。
- fallback(selector)
- failure的话就tick下一个,如果有个孩子成功就返回成功,所有都失败就返回失败。
- 在tick第一个孩子之前,这个node的状态为running
- restart:当下一次tick该fallback的时候,整体回去从列表的第一个节点开始tick。
tick again:当下一次tick该fallback的时候,整体从这个相同的child开始。
type | when child returns running |
---|---|
fallback | try again |
reactiveFallback | restart |
ReactiveFallback:
这个控制节点用于如果它的子结点中,前面的子结点有从failure变成success的话,那么后面的异步节点就可以中断。
比如该图里,有可能timeout一直执行,但是中间用户突然fully rested了,那么就不继续time out sleep了。
Decorators_nodes
只有一个孩子,可以决定是否、如何、多少次来tick孩子
- InverterNode
反转孩子状态,若孩子SUCCESS返回FAILURE,孩子FAILURE则返回SUCCESS,若孩子RUNNING则返回RUNNING - ForceSuccessNode
若孩子返回RUNNING,否则一直返回SUCCESS - ForceFailureNode
同理,一直返回FAILURE - RepeatNode
tick了N次,N在Input Port里设置,只要孩子返回成功,就不断循环,直到孩子失败,循环被打破了也就意味着整体返回失败。 - RetryNode
tick了N次,N在Input Port里设置,只要孩子返回失败,就不断循环,直到孩子成功,循环被打破了也就意味着整体返回成功。
action_nodes:无孩子,xx
condition_nodes:总是为同步的,它们不能返回RUNNING,不能改变系统状态。