FSM和BT的区别

张开发
2026/4/10 13:41:40 15 分钟阅读

分享文章

FSM和BT的区别
FSM状态是 “主角”逻辑是 “跳转”BT任务是 “主角”状态只是 “执行结果”用超级直白的比喻1FSM像一个 “多房间的房子”你人只能站在一个房间里客厅厨房卧室厕所要做事必须先跳进对应的房间。逻辑写的是从客厅 → 厨房从厨房 → 卧室从卧室 → 厕所房间状态是主体你在哪个房间决定你能干啥。→这就是 FSM状态驱动。2BT像一张 “任务清单”你不关心自己在哪个房间你只关心下一步要做什么事去厨房烧水去客厅拿杯子去卧室拿手机完成任务是主体你执行到哪一步就是当前进度。→这就是 BT任务 / 流程驱动。那为什么 BT 里也会看到 “状态”因为任何执行中的动作都必然有执行结果成功了Success失败了Failure还在做Running这三个东西看起来像状态但它们不是用来跳转的是用来控制流程往下走不走的。真正的区别在这里关键FSM 的状态 身份我现在是【导航状态】→ 我就只能干导航的事要干避障 → 必须切换成【避障状态】BT 的状态 结果我现在在【执行路径跟踪】→ 返回 Running→ 继续 tick→ 继续走障碍来了 → 跟踪失败→ 自动走下一个子任务恢复 / 绕障→ 不需要 “切换状态”只是流程往下走再简化到不能再简化FSM我是谁 → 决定我做什么BT我要做什么 → 做到哪步算哪步对应到 Nav2 你就彻底懂了FSMROS1 move_base状态全局规划中状态局部控制中状态恢复中状态卡住必须跳来跳去。BTROS2 Nav2先检查目标再规划路径再跟踪路径跟踪失败 → 尝试恢复恢复成功 → 继续跟踪到达 → 结束没有状态跳转只有任务流程。最终总结你记住这句就够FSM 是状态机状态是核心逻辑是跳转。BT 是流程树流程是核心状态只是返回值。BT 里确实有 “状态”但它不依赖状态跳转所以不乱、不爆炸、好维护。行为树本质上就是可视化、可热改、带异步恢复的「面向过程编程」你完全没理解错而且这个比喻非常准。一句话戳穿面向过程 代码写死的顺序流程行为树 可配置、可可视化、可中断恢复的 “活流程”它就是升级版的面向过程所以你觉得很好理解太正常了那为什么还要搞 BT不直接写 if-else /for/while我给你对比一下你瞬间就明白 BT 存在的意义。1普通面向过程代码里写死if (!到达目标) { 规划路径(); while (!障碍) { 走路径(); } 旋转避障(); }问题写死在代码里改逻辑要重新编译不能中途暂停、恢复复杂了就是面条代码无法可视化调试2行为树XML 配置 tick 循环Sequence GoalReached/ ComputePath/ FollowPath/ SpinRecovery/ /Sequence特点流程写在XML / 图形里不用改代码改树就能改逻辑每帧只跑一小步tick可以中途挂起Running可以自动重试、恢复、切换策略可以可视化看机器人卡在哪一步最关键的区别能不能异步、能不能恢复普通面向过程代码一旦进入while(1)就卡死在里面不能暂停不能保存进度异常处理全靠 if 堆行为树每帧只执行一小步然后返回可以标记Running表示 “还没做完下次继续”环境变了树会自动重新走流程自带容错、重试、恢复机制它就是 “不会卡死、自带容错、可配置” 的面向过程。再对应到你熟悉的编程概念Sequence 节点 → 就是代码里的{ ... }顺序执行Selector 节点 → 就是if / else if选择执行Running → 就是函数没执行完下次继续Decorator → 就是 for、while、timeout所以行为树 图形化 异步化 容错化 的面向过程你觉得它像面向过程非常正确它本来就是面向过程的现代化工程版。那 FSM 像什么FSM 更像面向对象 状态变量 switch caseswitch(state) { case NAVIGATING: if(obstacle) state AVOIDING; break; case AVOIDING: if(clear) state NAVIGATING; break; }状态多了就炸逻辑乱飞。最终超级总结你一定会豁然开朗面向过程代码写死的顺序流程行为树 BT可配置、可可视化、可恢复的柔性面向过程FSM状态跳转式的逻辑容易乱所以你觉得 BT 很好理解因为它本来就是你最熟悉的思路只是换了个可视化的壳。

更多文章