机器人控制系统的分层设计与算法选型方法
1. 本文要解决什么问题
战队里最常见的误判是:控制效果不好,就立刻讨论“要不要换更高级算法”。 这一步太快,通常会把问题越改越乱。
本文只讲一条能落地的主线: 先把参考做对,再判断 PID 够不够,最后才考虑 LADRC/ESO。
如果你把这条顺序反过来,常见结果是: - 参数越调越多 - 问题定位越来越慢 - 代码复杂度上去,但稳定性没上去
2. 四层架构:先分层,再谈算法
先记框架: 任务层 -> 参考生成层 -> 跟踪控制层 -> 执行与工程层
如果这四层你还没有分清,先看 01-重新理解控制论.md。
这里不再展开讲“什么是四层”,只保留和选型直接相关的摘要:
| 层次 | 核心问题 | 典型内容 |
|---|---|---|
| 任务层 | 目标从哪里来 | 遥控器、导航、视觉、任务脚本 |
| 参考生成层 | 给控制器什么样的目标 | 限速、限加速度、轨迹规划、插值、TD |
| 跟踪控制层 | 怎么让系统跟上目标 | PID、LADRC、PID+前馈、PID+ESO |
| 执行与工程层 | 真实系统会怎么破坏控制 | 饱和、摩擦、延迟、周期抖动、阻塞调用 |
3. 两类任务决定控制策略
先分任务,再选动作。任务没分清,后面基本白调。
| 任务类型 | 典型场景 | 第一优先目标 | 常见翻车点 |
|---|---|---|---|
| 实时跟踪型 | 遥控底盘、实时随动 | 响应快且可控 | 平滑过重导致“发肉” |
| 点到点执行型 | 机械臂到位、自动跑点 | 轨迹合理、停止精度 | 目标阶跃导致冲击/超调 |
快速判定: - 输入是“人实时给”的,优先响应。 - 输入是“系统自动算”的,优先轨迹与边界。
4. 常见算法放在哪一层
下面这张表只做一件事:防止混层。
| 方法 | 层次 | 主要作用 |
|---|---|---|
| 轨迹规划 | 参考生成层 | 生成可执行、可预期参考 |
| 限速/限加速度 | 参考生成层 | 控制参考变化率,降低冲击 |
| TD | 参考生成层/辅助 | 平滑参考并提取变化趋势 |
| PID | 跟踪控制层 | 误差反馈,简单耐造 |
| LADRC | 跟踪控制层 | 扰动估计补偿能力更强 |
| ESO | 观测/辅助 | 估计状态与总扰动 |
| 前馈 | 控制辅助 | 提前补偿,减小跟踪滞后 |
一句话: - 参考层决定“喂什么目标”。 - 控制层决定“怎么追目标”。 - 工程层决定“能不能稳定打完整场”。
5. 选型流程(5步,按顺序)
每一步都按“检查项 -> 通过判据 -> 不通过先做什么”。
第1步:任务类型
- 检查项:当前任务是实时跟踪型还是点到点执行型?
- 通过判据:能明确写出第一优先目标(响应 或 精度)。
- 不通过先做:先定任务边界,不进入调参。
第2步:参考是否可执行
- 检查项:是否有大阶跃、是否越过执行器速度/加速度能力。
- 通过判据:参考变化率在执行器能力内,且边界明确。
- 不通过先做:先上限速/限加速度/轨迹规划/TD,再看闭环。
第3步:PID 是否达标
- 检查项:响应速度、稳定性、稳态误差。
- 通过判据:三项都满足任务指标,且可重复复现。
- 不通过先做:继续 PID 基线整定,不急着上复杂算法。
第4步:是否真的需要强抗扰
- 检查项:负载变化是否频繁,外扰是否明显,模型不确定性是否高。
- 通过判据:存在持续且可观测的扰动问题,PID 难覆盖。
- 不通过先做:保持 PID 方案,优化工程链路和参考层。
第5步:工程能否承载
- 检查项:控制周期稳定性、阻塞调用、饱和策略、回退能力。
- 通过判据:周期稳定且有保底回退路径。
- 不通过先做:先修工程,再谈 LADRC/ESO。
6. 工程落地顺序(排障顺序)
效果不好时,按这个顺序查,能解决99%问题:
-
输入参考是否合理。 症状:目标一变就猛冲、机械冲击大。 先做动作:先加参考整形,再看闭环。
-
控制周期是否稳定。 症状:偶发抖动、同参数复现性差。 先做动作:清理阻塞和抖动源,稳定采样周期。
-
执行器是否长期饱和。 症状:输出贴边、积分堆积、恢复慢。 先做动作:补齐限幅与抗积分饱和。
-
PID 基线是否可保底。 症状:系统只能在某组参数“碰运气”运行。 先做动作:先拿到可复现的 PID 基线版本。
-
再考虑 ESO/LADRC。 症状:有明确扰动问题,且工程条件已满足。 先做动作:增量接入并保留 PID 一键回退。
实战常用组合: - 实时任务:轻量平滑 + PID(+前馈) - 点到点任务:轨迹规划 + PID,扰动强再加 ESO/LADRC
7. 常见误区与反例
误区1:控制不好就换高级算法
现场症状:参数越来越多,问题定位越来越慢。 反例:参考是跳变、执行器又饱和时,换 LADRC 通常只会更难调。 先做动作:先修参考层和工程层,再谈升级。
误区2:模块拆得越细越优雅
现场症状:文件很多、接口很多,但联调效率更低。 反例:把 ESO、限幅、微分器拆成过细碎片,维护成本上升。 先做动作:模块化放在“算法之间”,不是“算法内部过度拆分”。
误区3:通用逻辑全扔 utils
现场症状:参数责任不清,故障定位绕圈。 反例:复用是有了,边界却丢了。 先做动作:先明确职责边界,再抽象复用。
误区4:直接从 PID 跨到复杂控制
现场症状:一改就全链路不稳,回滚成本高。 反例:没有保底链路时,复杂方案放大系统风险。 先做动作:先保证 PID 保底,再做可回退演进。
8. 一页总结(上线前检查清单)
核心结论: 不是先选“最强算法”,而是先找“哪一层先出问题”。
三条原则: - 先参考,后控制。 - 能稳定达标就不盲目加复杂度。 - 任何升级都要有保底和回退。
上线前检查表:
| 检查项 | 结果 | 判定标准 |
|---|---|---|
| 任务类型已明确 | 已明确是实时跟踪型或点到点执行型 | |
| 参考可执行 | 无过猛阶跃,变化率在执行器能力内 | |
| PID 基线达标 | 响应/稳定/精度满足任务要求 | |
| 工程链路稳定 | 周期稳定、无关键阻塞、饱和可控 | |
| 升级可回退 | 出现异常可快速切回保底方案 |
如果以上 5 项里有 2 项及以上不满足,先补系统,再谈算法升级。