资讯动态

第271篇 行为树基础——序列/选择/装饰/并行节点

发布时间:2026/8/28 8:07:18 来源:尧图企业网站定制
局部规划器选型聊完了DWA、TEB、MPC三种方案的特点和适用场景应该清楚了。从这篇开始我们进入行为树系列。Nav2用行为树来编排整个导航流程行为树在机器人任务管理领域已经成了标配方案。面试问到Nav2架构行为树是绕不开的话题。行为树Behavior Tree简称BT听起来很高大上但核心概念其实很简单。它就是用一棵树来组织机器人的行为逻辑树的每个节点负责一小块任务节点之间通过固定的组合方式协作。搞清楚四种基本节点类型行为树就入门了。一、为什么需要行为树在行为树之前机器人任务管理的主流方案是有限状态机FSM。状态机用状态和转移来组织逻辑——如果在充电状态且电量低于20%转移到充电行为。状态机的问题在于状态一多就变成蜘蛛网。十几个状态之间的转移关系可能上百条改一个状态可能影响一堆转移。调试和维护都很痛苦。行为树换了一种完全不同的思路。它不用状态转移而是用节点组合来组织逻辑。核心优势是模块化——每个节点只关心自己的任务节点之间的交互规则是固定的由节点类型决定。加一个新行为只需要在树上挂一个新节点不影响其他部分。游戏行业最早大规模使用行为树《光环2》之后几乎成了游戏AI的标配后来机器人领域也跟进采用。二、四种基本节点类型行为树的节点分两大类控制节点compositor和执行节点leaf。控制节点负责怎么组织子节点有四种基本类型1. 序列节点Sequence子节点从左到右依次执行。只要有一个子节点返回Failure整个序列就返回Failure。只有所有子节点都返回Success序列才返回Success。类似于编程里的逻辑与AND。Sequence ├── 检查电量充足 ├── 计算路径 └── 执行导航检查电量失败电量不足后面的计算路径和执行导航都不执行。2. 选择节点Fallback/Selector子节点从左到右依次执行。只要有一个子节点返回Success整个选择节点就返回Success。只有所有子节点都返回Failure选择节点才返回Failure。类似于逻辑或OR。Fallback ├── 直接到达目标 ├── 重新规划路径 └── 执行恢复行为直接到达成功就不需要后面的步骤。失败了就尝试重新规划。规划也失败了就执行恢复行为。3. 装饰节点Decorator只有一个子节点对子节点的结果做修饰。常见的装饰器有Inverter反转结果。Success变FailureFailure变Success。Repeat重复执行子节点N次。RetryUntilSuccessful反复重试直到成功或达到最大次数。Timeout给子节点设一个超时时间。RetryUntilSuccessful (max_tries3) └── 请求机械臂抓取抓取失败就重试最多试3次。4. 并行节点Parallel同时执行所有子节点。返回结果的策略可以配置——比如所有子节点都Success才Success或者有一个Success就Success。Parallel (success_threshold2) ├── 导航到目标位置 ├── 持续检测障碍物 └── 上报当前位置三个任务同时跑只要有2个成功就算成功。三、执行节点叶子节点控制节点下面的叶子节点才是真正干活的。叶子节点分两种Condition条件节点——检查某个条件是否满足。比如电量是否充足目标是否可见。不满足返回Failure满足返回Success。执行是瞬时的不耗时。Action动作节点——执行一个具体动作。比如发送速度指令调用规划服务发出语音提示。动作节点通常需要时间执行返回Running直到完成。Sequence ├── [Condition] 电量 20% ├── [Action] ComputePath → 调用全局规划器 └── [Action] FollowPath → 调用局部规划器这棵小树的意思是先检查电量够了再算路径算出来再执行。四、行为树的执行机制行为树从根节点开始按深度优先的方式遍历。每个tick通常10-20ms一次执行一遍整棵树。执行规则序列节点从第一个子节点开始执行。如果子节点返回Running下次tick还从这个子节点继续。选择节点从第一个子节点开始。如果返回Failure尝试下一个。返回Running就暂停在这里。装饰节点先执行唯一的子节点再根据装饰规则处理返回值。叶子节点条件节点瞬时返回Success/Failure动作节点可能返回Running。# 序列节点的tick逻辑简化 class Sequence(Node): def tick(self): for child in self.children: status child.tick() if status FAILURE: return FAILURE if status RUNNING: return RUNNING # 下次从这里继续 return SUCCESS这种执行机制的关键特性是行为树是反应式的。每个tick都从根节点重新评估条件变了行为立刻跟着变。不像状态机需要显式的转移条件。来看一个完整的例子。Nav2的导航行为树简化版root main_tree_to_executeMainTree BehaviorTree IDMainTree Sequence nameNavigateWithReplanning RetryUntilSuccessful num_attempts3 Sequence ComputePath goal{goal} path{path}/ FollowPath path{path}/ /Sequence /RetryUntilSuccessful ClearCostmap/ /Sequence /BehaviorTree /root执行流程先尝试算路径走路径的组合。如果任一步骤失败重试最多3次。3次都失败就清除代价地图恢复行为然后整棵树的tick结束等下一个tick重新来。注意黑板变量{goal}和{path}——ComputePath把算好的路径写到黑板的path字段FollowPath从黑板读取路径。两个动作节点通过黑板通信互不直接依赖。五、面试高频追问Q行为树和状态机的核心区别是什么A状态机用状态转移组织逻辑行为树用节点组合组织逻辑。行为树的优势是模块化加新行为不影响旧逻辑和反应式执行条件变了行为自动变。Q行为树的tick频率一般设多少ANav2里默认是10-20Hz50-100ms一次。频率太高浪费CPU太低响应不够快。具体取决于任务需求——避障要求高的可以跑快一些。Q行为树怎么处理并发任务A用并行节点Parallel。但并行节点的子节点共享同一个执行线程不是真正的多线程。如果需要真正的并行执行得用多个行为树或者在动作节点内部实现异步。Q行为树的黑板Blackboard是什么A黑板是行为树的全局数据共享机制。节点之间通过黑板读写数据。比如规划器把算好的路径写到黑板上控制器从黑板上读路径。黑板避免了节点之间的直接耦合。Nav2用的是BehaviorTree.CPP库的黑板实现支持类型检查和端口映射。行为树的四种基本节点类型就是这些基础。看起来简单但组合起来能表达非常复杂的逻辑。下一篇我们来聊行为树的设计模式——怎么把这些基本节点拼成实用的机器人任务管理方案。行为树系列开篇把序列、选择、装饰、并行四种基本节点讲清楚了。理解了这些基础后面的设计模式和实战应用就好懂了。行为树是Nav2的核心调度机制面试必问。上一篇第270篇 局部规划器选型下一篇聊行为树的设计模式。如果这篇文章对你有帮助欢迎点赞支持一下你的鼓励是我持续更新的动力

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价