PID 算法在机器人系统中的位置与作用
结合前面的多电机混合控制框图、电机控制共性,把 PID 放在完整机器人链路里,讲清楚PID 在哪一层、解决什么问题、不解决什么问题、不同电机下 PID 配置差异。
完整机器人分层架构(从上到下)
plaintext
【上层规划层】主控CPU(RDK X5 / ROS2) ↓下发目标:Vx Vy ω、目标关节角度、目标位置 【运动控制层】电机MCU(STM32) ← PID算法运行在这里 ⭐ ↓输出PWM / STEP / 串口指令 【功率驱动层】AM2857 / DRV8825 /舵机内置驱动 ↓强电 【电机&机械层】电机、减速箱、轮子、机械臂 ↓反馈:编码器、电位器 反馈信号回送到【运动控制层】,形成闭环核心原则:PID 属于底层实时运动控制层,不在 ROS / 上层 AI 主控运行。上层只输出期望值,PID 负责让真实物理对象尽可能跟踪这个期望值。
普通 PWM 舵机、串口舵机:
PID 运行在舵机板载 MCU 内部,外部 STM32 只下发目标,不跑 PID。
PID 的本质
在不同电机中的位置与作用
1. 带编码器直流减速电机(麦克纳姆轮底盘)
- 运行位置:下层 STM32 电机 MCU
- 闭环类型:速度环 PID
- 输入:上层送来期望转速;编码器定时器 CNT 读取实际转速
- 输出:PWM 占空比给到 AM2857 驱动芯片
- 作用:
- 克服电池电压波动:电池电压下降,电机出力会变,PID 自动提高 PWM 占空比,维持转速稳定。
- 抵抗外部负载扰动:小车爬坡、遇到阻力,自动加大输出功率。
- 让四个轮子转速跟随逆运动学计算出来的目标转速,保障麦克纳姆轮运动形态不走样。
拓展:机器人还可以在外层套位置 PID 环(位置环输出作为速度环的目标),实现位置控制。
2. PWM 模拟舵机 (SG90)
- PID 运行位置:舵机板载 MCU 内部,外部完全不可见
- 闭环类型:位置 PID
- 反馈:板载电位器
- 外部 MCU:只输出 50Hz PWM 设置目标角度,不参与 PID 运算
- 局限:外部无法读取实际角度,你看不到 PID 的偏差,堵转外部系统无法感知。
3. 串口总线舵机
- PID 运行位置:舵机板载 MCU
- 闭环类型:位置 PID
- 特殊点:舵机把 PID 的输入输出状态(实际角度、温度、堵转标志)通过串口回传给 STM32;上层可以拿到偏差,但 PID 计算依旧在舵机内部。
高级用法:上层做外环 PID,舵机执行内环 PID,形成串级 PID。
4. 闭环步进电机(DRV8825 + 外置编码器)
- 运行位置:STM32 电机 MCU
- 开环状态:没有 PID,只管发 STEP 脉冲,不知道实际走没走。
- 闭环模式:编码器读取真实位置,做位置 PID。当发生丢步,PID 提高脉冲频率补偿偏差,抑制丢步。
PID 在整套机器人系统中的层级关系(串级 PID,机器人高频出现)
机器人经常使用双环串级 PID,内环响应快,外环响应慢。 以麦克纳姆轮位置控制举例:
plaintext
上层规划输出目标位置 ↓ 【外环:位置PID】(周期慢,几十ms) 输出 → 目标转速 ↓ 【内环:速度PID】(周期快,1‑5ms,MCU定时器中断) 输出 → PWM占空比 ↓ 电机、机械 ↓ 编码器反馈转速给速度环;积分得到位置反馈给位置环- 内环速度 PID:抑制电机扰动,快速响应,运行在高频定时器中断。
- 外环位置 PID:负责收敛到目标坐标,运行频率更低。
重要:内环必须跑在 MCU 实时中断;千万不要放在 ROS 应用层,ROS 是非实时,抖动会直接让 PID 震荡失控。
PID 能解决什么,PID 不能解决什么(工程最容易踩坑)
✅ PID 可以做到:
- 在存在扰动(负载变化、电压跌落)的条件下,让实际物理量跟踪目标值。
- 抑制稳态误差,让电机转速、关节位置逼近设定值。
- 合理调参可以抑制震荡,提升系统响应速度。
❌ PID不能解决:
- 不能消除机械打滑:麦克纳姆轮子打滑,编码器读到电机轴转了,但车体没动。PID 只能保证电机轴转速,无法修正车体真实世界位置。打滑带来的漂移 PID 无能为力,需要 IMU、视觉 SLAM 做更高层融合。
- 不能修复机械结构缺陷:间隙、齿轮旷量,PID 调再好也会有抖动、过冲,需要机械优化。
- 不能突破硬件物理极限:电机最大扭矩、最大电压电流是硬件天花板,PID 输出饱和之后,再大偏差也无能为力,需要限幅。
- 不能处理大时延:反馈采样、通信时延过大,PID 会剧烈震荡。
结合两级架构看 PID 的数据流
- ROS / 主控 CPU:做运动规划,输出目标速度 / 角度,不跑 PID。
- STM32 电机 MCU:
- 硬件外设:定时器编码器接口采集真实反馈;
- 定时器中断中执行 PID 运算(固定周期,强实时);
- PID 输出限幅,转换成 PWM / 脉冲输出;
- 驱动芯片执行功率放大;
- 电机运动;反馈再次回到 MCU。
如果 PID 放在上层 CPU 运行:USB / 串口传输存在时延抖动,控制周期忽快忽慢,小车会抖动、震荡、控制失效。
工程常见误区
- 误区:PID 参数一套通吃全部电机。
每个电机、机械负载不一样,P/I/D 参数必须单独标定;麦克纳姆四个轮子参数都可能略有差异。
- 误区:只调 P,无限放大 P 增益。
P 越大响应越快,但会带来震荡;I 消除静态误差;D 抑制震荡,三者配合。
- 误区:PID 周期随便写。
PID 必须固定控制周期;周期变化,等效 Kp Ki Kd 全部变化,系统特性改变。所以放在 MCU 定时器中断执行。
- 误区:用 PID 补偿打滑。
编码器测的是电机轴,不是车体末端;打滑属于观测失效,PID 无法根治,需要传感器融合。
总结
- PID 是底层实时运动控制器,绝大多数机器人中运行在电机 MCU(STM32)的定时器中断;PWM 舵机、串口舵机 PID 运行在舵机内置 MCU。上层主控 / ROS 只下发目标,不执行 PID。
- PID 核心工作:对比目标值与传感器反馈值,计算偏差,修正输出控制量,抵抗外界扰动,实现物理量跟踪。
- 机器人常使用串级 PID:位置外环 + 速度内环,内环高频,外环低频。
- PID 只解决闭环跟踪问题,无法解决机械打滑、旷量、硬件功率上限这类物理约束。
- PID 是电机控制共性里 “给定‑反馈‑修正” 逻辑的具体算法实现。