ROS执行任务——行为树

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Travis_X/article/details/87791457

行为树与分层状态机相比

与分层状态机相比,行为树组件的模块性与关联的简易性使得它特别容易编写与理解。

行为树以分支形式将复杂的任务划分成一组条件与子任务,从而对它们进行拆分。行为树总是自顶向下、自左向右地被执行。

行为树与分层状态机最重要的区别在于行为树同一层的行为之间不会有任何直接关联,这样的“兄弟关系”行为只能通过更高层行为的共享链接进行间接关联。

行为树的关键属性

  • 节点表示的是任务与条件,而非状态
  • 一项任务或行为一般是一段循环运行一次或多次的代码,并产生一个SUCCESSED或FAILURE的结果。如果一项任务需要通过多于一次的循环来完成,它将会在返回结果之前保持一个RUNNING的状态。一项任务的当前状态总会传递给行为树中的父任务;
  • 任务或行为还可以表示复合行为,其状态取决于两个或多个子行为。最常用的两个复合行为是选择器序列器;
  • 一个序列器尝试着依次运行它的所有子任务,如果任何一个子任务执行失败,那么该序列器执行失败;
  • 当一项任务含有多项子任务时,子任务会根据它们的排列顺序进行优化处理,该顺序即标准树状图中的从左到右,或使用项目符号列表时的自顶向下
  • 行为之间的关联总是父节点对子节点,而不会是兄弟节点对兄弟节点;
  • 行为树的执行过程总是起始于根节点,并按深度优先顺序从最左侧的分支开始执行。当一个给定的节点被运行,其结果(SUCCESSED、FAILURE或RUNNING)被传递给它的父节点。只有叶节点会直接导致一项行为或条件检查的产生,内部节点则被作用使用选择器和序列器将会将处理流引导至它们的子节点。行为树的一项重要性质是时钟每“走”一次,都会有执行过程从树的根节点开始进行。这确保了高优先级行为的状态的任何变动都将导致执行流进行适当的改变,即使其他节点已经在运行
  • 行为可通过修饰器进行扩展,修饰器可以修改行为的结果
  • 许多行为树利用一个全局的“黑板”,存储关于环境的数据以及先前行为的结果。独立的节点可以对黑板进行读和写的操作。

创建一棵行为树

以巡逻机器人为例,根节点有两个符合子行为:STAY_HEALTHY和PATROL。

  • BEHAVE(ROOT)
    • STAY_HEALTHY
    • PATROL

案例中,STAY_HEALTHY行为比PATROL行为的优先级更高。

更具体的行为表示为:

  • BEHAVE(ROOT)
    • STAY_HEALTHY
      • CHECK BATTERY
      • RECHARGE
        • NAV_DOCK
        • CHARGE
    • PATROL
      • NAV_0
      • NAV_1
      • NAV_2
      • NAV_3

选择器与序列器

行为树有两种复合行为类型:选择器序列器。

选择器尝试执行它的每一个子任务直到一个执行成功,序列器执行它的每一个子任务直到一个执行失败。

案例中的STAY_HEALTHY行为是一个简单的选择器。运行CHECK BATTERY任务,如果返回SUCCESS(电池完好),则将结果传递给父任务,它也将得到一个SUCCESS的状态,从而完成任务。然而,CHECK BATTERY任务返回FAILURE(电池水平低),则会前往执行RECHARGE任务,它将前往充电桩进行充电。

案例中的BEHAVE(ROOT)行为属于一个序列器。如果STAY_HEALTHY子任务未成功执行(当CHECK BATTERY任务执行失败时会出现此情况),那么序列器执行失败,PATROL任务将不会执行。

修饰器

一眼看上去,PATROL任务似乎使用一个序列器,希望机器人能依次到达每个设定的导航点。若机器人由于某些原因无法到达其中一个导航点时,序列器就会因为一个子任务执行失败而失败。因此需要对序列器的复合行为做些修改,是机器人因故障无法到达某个导航点时直接放弃当前任务前往下一个导航点。修饰器的作用是修改其他行为或任务的结果。

修改后的行为树表示为:

  • BEHAVE(ROOT)
    • STAY_HEALTHY
      • CHECK BATTERY
      • RECHARGE
        • NAV_DOCK
        • CHARGE
    • PATROL
      • IGNORE_FAILURE
        • NAV_0
      • IGNORE_FAILURE
        • NAV_1
      • IGNORE_FAILURE
        • NAV_2
      • IGNORE_FAILURE
        • NAV_3

在你的行为树中,你可以创建任意数量的修饰器并使用它们,例如:

  • 限制行为树能被运行的次数
  • 通过计时器来限制一个行为能被运行的频率
  • 暂时地停用一个行为
  • 一个以随机顺序执行子任务的选择器

参考自【美】R.Patrick Goebel《ROS进阶实例》

猜你喜欢

转载自blog.csdn.net/Travis_X/article/details/87791457