行为树
行为树是一张整洁的、会分叉的图,机器人从上往下读它,来逐时逐刻地决定下一步做什么。把它想象成一棵倒过来的树形流程图:最底下是一个个具体的小动作和小检查——“走到门口”“门开着吗?”“把箱子拿起来”——而它们上方是一些简单的枢纽节点,负责决定去尝试哪一个、按什么顺序来。每一次时钟跳动,机器人都从顶端出发、一路往下走,每个节点都会回报几种简单答案之一:成功、失败,或仍在进行。这些答案再一层层往上传,左右着下一步的选择。
巧妙之处其实只在两种枢纽。顺序节点的意思是“按次序做这些,一旦有一个失败就停下”——适合那些必须全部发生的步骤,比如先张开夹爪、再下移、再合拢夹爪。回退节点(或称选择节点)的意思是“一个一个地试,直到有一个成功为止”——适合带有备选方案的计划,比如先试前门,不行就试侧门,再不行就向人求助。把顺序和回退层层嵌套,你就能用这寥寥几种简单部件,搭出丰富而有层次的行为,而设计者读起整棵树来,几乎就像在读一句话。
机器人开发者偏爱行为树,是因为它模块化、易于改动。由于每条分支都自成一体,你可以加上一项新技能、调换优先次序,或者在靠近顶端的位置嫁接一条紧急的“电量低就去充电”分支,而不必把其余部分全都拆开重接——树天生会先检查高优先级的分支。正因如此,行为树在游戏角色和许多机器人身上,已基本取代了更老的有限状态机风格:状态机会把每一种情形都直接连到其他每一种情形,越长越乱成一团;而行为树则让逻辑保持井然有序、便于复用,哪怕机器人的本领越来越多也是如此。
一台巡逻机器人的树,先检查顶部那条“电量低就回基座”的回退分支;只有在电量没问题时,它才会执行“前往下一个路点、扫描房间、记录任何新情况”这一顺序。
高优先级的安全分支放在靠近顶端的位置,因此每一次跳动都会最先被检查。
节点回传的信号通常是:成功、失败、进行中;顺序节点与回退(选择)节点,是组合子节点的两种基本方式。