🧪 代码实验室
不用安装任何软件 —— 在浏览器里直接调 PID、看 FOC 矢量、玩倒立摆
拖动滑块、点击按钮,现象立刻可见
PID 整定
FOC 矢量
倒立摆
零安装
纯本地运行
🎯 本页学习目标
1. 亲手调出一组"快速且无超调"的 PID 参数,理解 Kp/Ki/Kd 各自的作用
2. 看懂 FOC 里"三相电流合成旋转矢量 → dq 分解 → id=0"的几何含义
3. 理解倒立摆为什么必须"先立住再走",以及微分项提供的阻尼作用
4. 把实验现象与本站
01-02 原理动画、
04-02 固件与电机控制 联系起来
建议用时:30-60 分钟(每个实验 08-20 分钟)
💡 使用说明:三个实验全部在浏览器本地实时计算(JavaScript 物理仿真),不联网、不上传、零安装。拖动参数即调即生效:实验一拖动任何滑块会自动重放响应曲线,实验三若摆已倒下会自动重置——每次拖动都能立刻看到新参数的效果,方便对比;点"重置"可随时回到初始状态。每个实验下方都有"现象解释"与"思考题",先玩、再想、最后对照解释。
2 实验二 · FOC 电流矢量可视化
拖动电角度 θe 与 q 轴电流 iq,观察三相电流如何合成一个旋转矢量,以及 dq 坐标系如何把它"变静止"。这就是 FOC(磁场定向控制)的几何本质 —— 配合 01-02 原理动画 观看。
id = 0.00 A(恒为 0,id=0 控制) | iq = 6.0 A | 矢量幅值 6.0 A | 矢量相位 90° | 三相电流 ia=0.0 / ib=-5.2 / ic=5.2 A
现象解释:
· 左上图:αβ 静止坐标系中,三相电流 ia/ib/ic 合成一个幅值 = 1.5·|is| 的旋转矢量(按 2/3 变换约定,这里直接用幅值 1·|is| 示意)。θe 转一圈,矢量转一圈 —— 这就是三相正弦电流产生旋转磁场的来源。
· 右上图:三个相电流的波形,任意时刻三者之和为 0(星形接法无中线)。
· 下图:dq 坐标系跟着转子磁极一起转,于是旋转矢量在 dq 里"看起来静止"了:分解成 d 轴(励磁)与 q 轴(转矩)两个直流分量 —— 这就是 Park 变换的意义:把交流控制变成直流控制,两个 PI 就能搞定。
· id=0 控制:让电流矢量始终垂直于转子磁极(d 轴),此时全部电流都用来产生转矩,单位电流转矩最大 —— 表贴式永磁电机(FOC 关节电机)最常用。
🤔 思考题:如果 id≠0,电流矢量会发生什么变化?对转矩和发热分别有什么影响?为什么 SVPWM 要输出的是"电压"而不是"电流"?
3 实验三 · 倒立摆平衡控制
小车 + 摆杆,摆杆朝上 —— 这是"站立平衡"的经典抽象:人形机器人站立、单腿支撑,本质上都是在控制一个"不稳定倒立系统"。默认模式用角度 PD 让摆杆保持竖直(内环);勾选"启用位置控制"体验串级控制 —— 位置环把误差转成角度参考,再交给平衡环执行(外环)。
摆角 0.0° | 小车位置 0.00 m | 推力 0.0 N | 状态 未平衡
现象解释:
· 默认的
纯平衡模式只有角度 PD:Kp 把摆杆拉回竖直,Kd 提供阻尼防止来回晃。调参口诀:先加 Kp 到"刚好开始晃",再加 Kd 压住晃动。
能立住后点"推它一把",好的参数应在 1-2 秒内回稳(摆角不超过约 15°)。
·
小技巧:摆杆倒下(推力限幅救不回来)后调参看似无效 —— 本实验在倒下状态下拖动 Kp/Kd 会自动重置重新起摆,新参数立刻可见。
· 小车带滚动摩擦,平衡后它会自己慢慢停下 —— 真机上"站住不动"同样靠关节内部的阻尼与摩擦力矩。
·
高级 · 位置控制:位置误差先换算成"期望倾斜角"(限幅 ±0.3 rad 且斜率受限),再交给角度环。你会看到小车移向目标位置,但会伴随
缓慢晃动 —— 这是"位置环与平衡环耦合"的必然结果:想往右走,必须先向右倾;倾斜又产生加速度,位置环再回来纠偏。内环(角度)带宽必须远高于外环(位置),否则会越晃越大直至摔倒。
· 真实的人形机器人平衡远比这复杂:脚踝/髋/膝关节协同、ZMP 约束、模型预测控制(MPC)与强化学习步态(参见
04-23 升级路线、
04-04 仿真与 RL),但"先稳住内环、再调外环"的思路完全一致。
🤔 思考题:为什么角度环必须"快"、位置环必须"慢"?如果把两个环的带宽反过来会怎样?这和你调三环(电流→速度→位置)的顺序有什么关系?
4 🎮 关卡挑战:把"会调"变成"调得准"
📐 挑战规则:在
实验一(PID 位置控制)里调 Kp/Ki/Kd,点"提交挑战"按当前指标评级(选阶跃模式、关闭扰动)。
⭐ 青铜 · 能收敛:稳态误差 < 0.02 rad
⭐⭐ 白银 · 又快又稳:调节时间 < 2.0 s 且超调 < 10%
⭐⭐⭐ 黄金 · 极限手调:调节时间 < 1.5 s 且超调 < 5%
5 📖 代码走读:实验二背后的六行代码
实验二的每个旋钮,对应 FOC 中断里的一行代码。点击下面的代码行,下方给出解释并联动上方实验二(自动暂停旋转、把电角度设到该行的典型值),对照矢量图与波形阅读:
6 本节自测
1. 实验中把 Kd 从 0 逐渐增大,最直接的效果是什么?
💡 Kd 对速度(误差变化率)起阻尼作用,直接抑制超调与振荡;消除稳态误差靠 Ki 或前馈。
2. FOC 中"id=0 控制"的物理含义是什么?
💡 id=0 让定子电流矢量与转子磁极(d 轴)垂直,即全部落在 q 轴(转矩轴)上,单位电流转矩最大,是表贴式永磁电机的常用策略。
3. 倒立摆实验里,为什么角度环的增益必须明显大于位置环?
💡 级联控制铁律:内环(角度)带宽必须远高于外环(位置),否则外环一动就把内环"带倒"。这与三环控制(电流→速度→位置)由内到外带宽递减是同一个道理。
4. 实验一中,为什么把 Ki 设为 0,纯 P 控制也能让关节准确到位、没有稳态误差?
💡 稳态误差来自持续的负载(重力、摩擦)。本模型无重力,纯 P 已能到位,故 Ki 可为 0;真实关节有摩擦和重力才需要 Ki 消差(见实验一「现象解释」第 3 条)。D 是常见误区:纯 P 在有恒定负载的系统中是有静差的。
5. 代码走读第 ④ 行 Park 变换,最核心的价值是什么?
💡 Park 变换把 αβ 静止坐标旋转到随转子转动的 dq 坐标,使正弦量「看起来静止」成直流量;PI 管直流量可实现零稳态误差,这就是 FOC 的全部动机(见代码走读 ④ 与实验二「现象解释」)。
6. 实验二右侧的三相电流波形,任意时刻 ia+ib+ic 等于多少?
💡 星形(Y)接法无中线,三相电流汇于中性点,由基尔霍夫电流定律可知任意时刻三者之和必为 0(见实验二「现象解释」第 2 条)。误以为三相电流之和是某个旋转幅值,是常见误区。
📌 本节要点速查:①PID 位置环:先加 Kp 到「刚好振荡」,再加 Kd 压超调,真实关节靠 Ki 消重力/摩擦静差;②FOC 几何本质:三相电流合成旋转矢量 → Clarke(3→2)→ Park(旋转→静止,交流变直流)→ id=0 全部电流用于转矩;③倒立摆:角度 PD 先立住(Kd 提供阻尼),级联控制内环(角度)带宽必须远高于外环(位置);④真机实现路径:SimpleFOC/ODrive 位置环、FOC 电流环、MPC/WBC/RL 平衡步态(见 01-02、04-02、04-23、04-04)。
📌 本节小结:三个实验演示了机器人控制的三个层次:①PID 位置环 —— 关节运动的最小闭环;②FOC 矢量控制 —— 电流环的几何本质(三相合成旋转矢量、dq 分解、id=0);③倒立摆 —— 平衡与级联控制思想(内环快、外环慢)。这些在真机上的实现路径分别是 SimpleFOC/ODrive(04-02)、FOC 固件(04-02)与 MPC/WBC/RL(04-23、04-04)。
🤔 综合思考题:
1. 把实验一的 Kd 换成"纯 P + 前馈"能不能达到同样效果?前馈需要知道什么模型信息?
2. 如果给实验一的关节加上 2 N·m 的恒定重力负载,哪种参数组合能让稳态误差归零?
3. 实验三的角度环用"摆角速度"做微分项,如果编码器噪声很大,Kd 大会有什么副作用?怎么缓解?
7 参考来源