整机 PID 和单轮 PID 的关系

结论先说:

  1. 每一个轮子,都有独立的转速 PID(内环,跑在 STM32),只负责把该轮子转速稳定到运动学给出的目标轮速
  2. 原生没有 “整机速度 PID” 这种现成算法。不存在一个 PID 直接输入整车 Vx/Vy/ω,直接输出整机运动。
  3. 但是可以做整车层面的闭环(外环)主控大脑可以利用 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,但是左侧轮子打滑空转。

  1. 单轮 PID:轮子转速达到目标,内环已经满足,但是车体实际\(V_{y\_real}\)只有 0.2m/s。
  2. 整车外环检测误差 \(e_{vy}=0.3\),经过 PID 输出正向速度补偿。
  3. 修改整车指令,把\(V_{y\_cmd}\)抬高。
  4. 运动学重新计算四轮目标转速,4 个轮子的内环 PID 提高转速,尝试把车体速度拉回期望值。

⚠️注意:

麦克纳姆轮、滑移底盘这种过驱动底盘,车体外环 PID 一般放在RDK X5(ROS2 导航层),不在 STM32。

STM32 只负责运动学 + 四轮转速内环 PID。

和阿克曼小车对比

阿克曼底盘:

  • 驱动轮转速 PID;转向舵机位置闭环。 同样:底层执行器各自闭环;
  • 整车层面可以在外层做速度 / 航向闭环,修改车速、转向角指令不会存在一个直接控制整车的 PID

关键总结表格

表格

控制器 控制对象 运行位置 输入 输出 作用
单轮转速 PID(内环) 单个电机轮子转速 STM32 轮子目标转速、轮子真实编码器转速 PWM 占空比 保证每个轮子跑到设定转速;无法对抗轮子打滑带来车体偏差
车体整车外环 PID(可选) 整车的 Vx,Vy,ω RDK X5/ROS2 整车期望速度、车体真实速度 (里程计 IMU) 整车速度修正量 修正整车运动误差,弥补打滑;不直接输出 PWM

两个极易混淆的概念

  1. 每个轮子独立转速 PID(内环):必须有,硬件驱动必备。
  2. ⚠️整机 PID,不是一个独立控制器,是车体层面的外环闭环,用来修正整车运动指令,它不能跳过运动学和单轮 PID 直接控制电机。

通俗比喻:

  • 4 个轮子 PID = 4 个工人,每个人只管自己跑多快。
  • 运动学 = 工头,分配每个人应该跑多快,实现整体效果。
  • 整车外环 PID = 监工,观察整个队伍前进快慢,如果整体走慢了,给工头下达指令:所有人整体提速,而不是直接上手控制每一个工人。

工程现实

  • 很多简易小车,只做四轮内环转速 PID,不做整车外环 PID。完全依赖运动学模型。一旦打滑,整车运动就会跑偏。
  • ROS2 的导航、move_base、nav2,内部的速度控制器本质就是这一类车体级闭环,它输出修正后的 Twist 整车速度下发给下位机 STM32。

代码示例:

备注:

小车在三个方向的速度诉求,会转化成4个电动车轮的速度,这个就是运动学要 解决的问题。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐