整机 PID 和单轮 PID 的关系
结论先说:
- 每一个轮子,都有独立的转速 PID(内环,跑在 STM32),只负责把该轮子转速稳定到运动学给出的目标轮速。
- 原生没有“整机速度 PID” 这种现成算法。不存在一个 PID 直接输入整车Vx/Vy/ω,直接输出整机运动。
- 但是可以做整车层面的闭环(外环):主控大脑可以利用 IMU / 里程计反馈真实车体运动,输出修正后的整车期望 Vx,Vy,ω,再下发给底层运动学 + 单轮 PID。
分层拆解(麦克纳姆小车举例)
第一层:单轮转速 PID(内环,必有的,STM32)
运动学解算之后,得到 4 个轮子各自目标转速。
M1_target、M2_target、M3_target、M4_target
四个轮子各自一套独立转速 PID:
- M1‑PID:编码器读 M1 真实转速,输出 M1 的 PWM
- M2‑PID:编码器读 M2 真实转速,输出 M2 的 PWM
- M3‑PID:编码器读 M3 真实转速,输出 M3 的 PWM
- M4‑PID:编码器读 M4 真实转速,输出 M4 的 PWM
✅作用:保证每个轮子尽量跑在自己的目标转速。
❌局限:只管轮子转速,不管车体实际运动效果。
举个现实问题:
小车左边轮子打滑,M1 轮子空转。
M1 的 PID 看到轮子转速等于目标,很满意,拉高 PWM 维持转速;
但是轮子打滑空转,车体实际并没有达到期望的整车 Vx/Vy/ω。
👉单轮 PID 只能保证轮子转速,不能保证车体真实运动。
为什么没有直接的 “整机 PID”?
那想要做整车闭环,该怎么做?(整车外环 PID)
打滑案例演示
场景:小车希望向前 Vy=0.5m/s,但是左侧轮子打滑空转。
- 单轮 PID:轮子转速达到目标,内环已经满足,但是车体实际\(V_{y\_real}\)只有 0.2m/s。
- 整车外环检测误差 \(e_{vy}=0.3\),经过 PID 输出正向速度补偿。
- 修改整车指令,把\(V_{y\_cmd}\)抬高。
- 运动学重新计算四轮目标转速,4 个轮子的内环 PID 提高转速,尝试把车体速度拉回期望值。
⚠️注意:
麦克纳姆轮、滑移底盘这种过驱动底盘,车体外环 PID 一般放在RDK X5(ROS2 导航层),不在 STM32。
STM32 只负责运动学 + 四轮转速内环 PID。
和阿克曼小车对比
阿克曼底盘:
- 驱动轮转速 PID;转向舵机位置闭环。 同样:底层执行器各自闭环;
- 整车层面可以在外层做速度 / 航向闭环,修改车速、转向角指令,不会存在一个直接控制整车的 PID。
关键总结表格
表格
| 控制器 | 控制对象 | 运行位置 | 输入 | 输出 | 作用 |
|---|---|---|---|---|---|
| 单轮转速 PID(内环) | 单个电机轮子转速 | STM32 | 轮子目标转速、轮子真实编码器转速 | PWM 占空比 | 保证每个轮子跑到设定转速;无法对抗轮子打滑带来车体偏差 |
| 车体整车外环 PID(可选) | 整车的 Vx,Vy,ω | RDK X5/ROS2 | 整车期望速度、车体真实速度(里程计 IMU) | 整车速度修正量 | 修正整车运动误差,弥补打滑;不直接输出 PWM |
两个极易混淆的概念
- ✅每个轮子独立转速 PID(内环):必须有,硬件驱动必备。
- ⚠️整机 PID,不是一个独立控制器,是车体层面的外环闭环,用来修正整车运动指令,它不能跳过运动学和单轮 PID 直接控制电机。
通俗比喻:
- 4 个轮子 PID = 4 个工人,每个人只管自己跑多快。
- 运动学 =工头,分配每个人应该跑多快,实现整体效果。
- 整车外环 PID =监工,观察整个队伍前进快慢,如果整体走慢了,给工头下达指令:所有人整体提速,而不是直接上手控制每一个工人。
工程现实
- 很多简易小车,只做四轮内环转速 PID,不做整车外环 PID。完全依赖运动学模型。一旦打滑,整车运动就会跑偏。
- ROS2 的导航、move_base、nav2,内部的速度控制器本质就是这一类车体级闭环,它输出修正后的Twist 整车速度下发给下位机 STM32。
代码示例:
备注:
小车在三个方向的速度诉求,会转化成4个电动车轮的速度,这个就是运动学要 解决的问题。