Nav2行为树核心节点总结(结合实操配置)
核心前提:以下节点均为「行为树逻辑节点」,不是ROS节点(不会出现在ros2 node list中),仅用于编排导航逻辑;所有节点规则均贴合你当前使用的Nav2行为树XML配置,无多余理论,重点解决实操困惑。
一、核心节点(按你配置中出现的优先级排序)
1. 根节点:<root>
「最外层容器」,无实际逻辑,仅用于指定“要运行的行为树”。
实操格式:<root main_tree_to_execute="MainTree"> (指定运行ID为MainTree的行为树)
规则:唯一根节点,所有行为树逻辑必须包裹在其内部,固定写法无需修改。
2. 行为树主体:<BehaviorTree>
「逻辑容器」,用于存放整个导航的行为树逻辑,是所有功能节点的父容器。
实操格式:<BehaviorTree ID="MainTree"> (ID需与root标签中指定的一致)
规则:一个XML文件可包含多个BehaviorTree,但root仅能指定一个作为主树运行。
3. 重试节点:<RecoveryNode>(核心自救调度节点)
「失败重试+补救调度」,是你配置中最外层的核心节点,负责“主任务执行+失败自救”。
实操示例(你的配置):
<RecoveryNode number_of_retries="6" name="NavigateRecovery"> <PipelineSequence><!-- 主任务:导航 --></PipelineSequence> <ReactiveFallback><!-- 补救任务:自救 --></ReactiveFallback> </RecoveryNode>
核心规则(重中之重):
-
先执行「第一个子节点」(主任务:导航);
-
若主任务成功:不执行第二个子节点(自救),直接结束本轮;
-
若主任务失败:执行第二个子节点(自救),然后重试主任务,最多重试number_of_retries次(你配置的是6次);
-
易错点:不是“循环执行两个子节点”,是“主任务失败才触发自救”。
4. 流水线顺序节点:<PipelineSequence>(Nav2专用)
「强制全执行顺序节点」,是你导航主任务的核心容器,负责“规划路径+跟踪路径”的同步执行。
实操示例(你的配置):
<PipelineSequence name="NavigateWithReplanning"> <RateController><!-- 规划路径 --></RateController> <RecoveryNode><!-- 跟踪路径 --></RecoveryNode> </PipelineSequence>
核心规则(最易混淆点):
-
与普通Sequence完全不同,不管子节点成功/失败,所有子节点都会依次执行,永不跳过;
-
解决你的核心困惑:RateController(规划路径)不会阻塞,每一帧都会先执行规划(按频率),再执行跟踪,不会出现“规划循环导致跟踪执行不到”的情况;
-
核心作用:保证“路径规划”和“路径跟踪”持续同步运行,是Nav2导航的核心逻辑载体。
5. 定时循环节点:<RateController>
「频率控制节点」,用于控制子节点的执行频率,你用于控制“路径规划的频率”。
实操示例(你的配置):<RateController hz="1.0"> (每秒执行1次内部的规划路径)
核心规则:
-
不是“死循环阻塞”,而是“每帧判断是否到执行时间”;
-
到频率时间:执行内部子节点(规划路径);
-
不到频率时间:直接返回成功,不执行内部子节点,不阻塞后续节点(跟踪路径);
-
易错点:不会霸占线程,每一帧都会释放控制权,保证跟踪路径能正常执行。
6. 反应式 fallback 节点:<ReactiveFallback>(自救逻辑容器)
「条件选择节点」,用于“判断优先执行哪个子节点”,你用于控制“目标更新vs自救”。
实操示例(你的配置):
<ReactiveFallback name="RecoveryFallback"> <GoalUpdated/><!-- 条件1:目标是否更新 --> <RoundRobin><!-- 条件2:自救逻辑 --></RoundRobin> </ReactiveFallback>
核心规则:
-
从上到下依次检查子节点,「谁能成功执行,就执行谁」;
-
若第一个子节点(GoalUpdated)成功(目标更新):执行它,不执行后面的自救逻辑,直接触发重新导航;
-
若第一个子节点失败(目标未更新):执行第二个子节点(自救逻辑);
-
补充:<GoalUpdated>是“判断节点”,无需手动写逻辑,仅判断“目标是否被修改”,成功即触发重新导航。
7. 轮询节点:<RoundRobin>(自救方法轮询)
「轮流尝试节点」,用于“多个自救方法轮流尝试”,你用于“清地图+旋转”的自救循环。
实操示例(你的配置):
<RoundRobin name="RecoveryActions"> <Sequence><!-- 自救1:清地图 --></Sequence> <Spin><!-- 自救2:旋转 --></Spin> </RoundRobin>
核心规则(结合你的高频疑问):
-
同一执行周期内,每次只执行一个子节点,不会同时执行;
-
若当前子节点失败:立即执行下一个子节点(同一次执行,不等待下一轮);
-
若当前子节点成功:立即停止,不执行后面的子节点;
-
循环逻辑:本次执行A失败→执行B;下次进入RoundRobin,重新从A开始尝试。
8. 顺序节点:<Sequence>(普通顺序执行)
「严格顺序节点」,用于“多个子节点必须按顺序全部执行成功”,你用于“清局部地图+清全局地图”。
实操示例(你的配置):
<Sequence name="ClearingActions"> <ClearEntireCostmap/><!-- 先清局部 --> <ClearEntireCostmap/><!-- 再清全局 --> </Sequence>
核心规则(纠正之前的混淆点):
-
与RecoveryNode、Fallback相反:成功继续,失败停止;
-
子节点必须从上到下依次执行,第一个成功→执行第二个;第一个失败→停止,不执行后面的;
-
你的用法:清地图必须“先局部、再全局”,两个都成功,才算完成清地图操作。
9. 具体行为节点:<Spin>、<ClearEntireCostmap>等
「实际执行行为的节点」,无复杂逻辑,仅执行具体操作,是行为树的“执行单元”。
实操示例(你的配置):
-
<Spin spin_dist="1.57"/>:原地旋转1.57弧度(90度),执行成功即返回SUCCESS;
-
<ClearEntireCostmap/>:清除指定代价地图(局部/全局),执行成功即返回SUCCESS;
-
<ComputePathToPose/>:规划从当前位置到目标点的路径;
-
<FollowPath/>:跟踪规划好的路径,持续执行直到到达目标或失败。
二、四大核心节点终极对比(易混点汇总)
|
节点类型 |
核心规则(成功/失败处理) |
实操作用(你的配置中) |
|---|---|---|
|
RecoveryNode |
成功→停止(不执行下一个);失败→继续(执行下一个) |
主任务(导航)失败,触发自救 |
|
PipelineSequence |
无论成功/失败,所有子节点都执行 |
同步执行“规划路径+跟踪路径” |
|
ReactiveFallback |
成功→停止(执行第一个成功的);失败→继续 |
判断“目标更新”优先,否则执行自救 |
|
RoundRobin |
成功→停止;失败→立即执行下一个(同一次) |
轮流尝试“清地图+旋转”自救 |
三、实操易错点(你曾困惑的点汇总)
-
1. 所有节点均为“行为树逻辑节点”,不是ROS节点,无法用ros2 node相关命令查看;
-
2. PipelineSequence不会跳过子节点,RateController不会阻塞后续跟踪路径的执行;
-
3. RoundRobin是“同一次执行内轮流试”,不是“下一次再试”,失败立即切换下一个;
-
4. 清地图、旋转等行为,仅在“导航失败+目标未更新”时,才会被RoundRobin调用;
-
5. 节点规则不能混用(比如不能用Sequence的规则套RecoveryNode)。
更多推荐
所有评论(0)