ros行为树-概念(基于behaviortree_v3)

7 篇文章 1 订阅

三个状态

SUCCESS,FAILURE,RUNNING,节点运行成功后返回给父节点状态。
RUNNING用于asynchronous(异步)节点里,当该节点需要更多时间执行时就返回该值。

同步(synchronous)与异步(asynchronous):
同步方法调用一旦开始,调用者必须等到方法调用返回后,才能继续后续的行为。
异步方法调用更像一个消息的传递,一旦开始,方法调用就会立即返回,调用者就可以继续后续的操作。而异步方法通常会在另外一个线程中“真实”地执行。整个过程,不会阻碍调用者的工作。对于调用者来说异步调用似乎是一瞬间就完成了。如果异步调用需要返回结果,那么当这个异步调用真实完成时,则会通知调用者。你可以去干其他事情,等异步调用完再通知你。

节点类型

control_nodes

sequence和fallback等,要有1-N个孩子,tick的时候从左往右tick孩子。

  1. 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;
}
typechild returns failurechild returns running
sequencerestarttick again
ReactiveSequencerestartresart
SequenceStartick againtick again

ReactiveSequence:
可以用于重复确认前面的条件,但要注意如果前面的child是同步节点的话,他们不能过多地tick。
SequenceStar:
使用该控制节点的话,你可以不用重复tick那些已经成功的节点。
在这里插入图片描述
比如此图里面,ABC只需执行一次,但是Batteryok要重复确认。

  1. fallback(selector)
  • failure的话就tick下一个,如果有个孩子成功就返回成功,所有都失败就返回失败。
  • 在tick第一个孩子之前,这个node的状态为running
  • restart:当下一次tick该fallback的时候,整体回去从列表的第一个节点开始tick。
    tick again:当下一次tick该fallback的时候,整体从这个相同的child开始。
typewhen child returns running
fallbacktry again
reactiveFallbackrestart

ReactiveFallback:
这个控制节点用于如果它的子结点中,前面的子结点有从failure变成success的话,那么后面的异步节点就可以中断。
在这里插入图片描述
比如该图里,有可能timeout一直执行,但是中间用户突然fully rested了,那么就不继续time out sleep了。

Decorators_nodes

只有一个孩子,可以决定是否、如何、多少次来tick孩子

  1. InverterNode
    反转孩子状态,若孩子SUCCESS返回FAILURE,孩子FAILURE则返回SUCCESS,若孩子RUNNING则返回RUNNING
  2. ForceSuccessNode
    若孩子返回RUNNING,否则一直返回SUCCESS
  3. ForceFailureNode
    同理,一直返回FAILURE
  4. RepeatNode
    tick了N次,N在Input Port里设置,只要孩子返回成功,就不断循环,直到孩子失败,循环被打破了也就意味着整体返回失败。
  5. RetryNode
    tick了N次,N在Input Port里设置,只要孩子返回失败,就不断循环,直到孩子成功,循环被打破了也就意味着整体返回成功。

action_nodes:无孩子,xx
condition_nodes:总是为同步的,它们不能返回RUNNING,不能改变系统状态。

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值