🎛️ 现代控制理论:状态空间到 MPC
PID 之上的一层通用语言:状态空间建模 → 能控能观 → 极点配置 / LQR → 龙伯格观测器 / 卡尔曼滤波 → MPC。以关节电机单轴模型为主线,每个知识点都回答「是什么→为什么→怎么做→面试怎么问→易错点」。
状态空间
能控能观
极点配置 / LQR
观测器 / 卡尔曼滤波
MPC
🎯 本页学习目标
1. 能把关节电机单轴模型从物理方程推导为状态空间表达式,并说出状态变量怎么选
2. 能用秩判据判断能控性/能观性,解释「不能控就不能任意配极点」
3. 能说出 LQR 代价函数中 Q、R 的物理意义,并按「固定 R 扫 Q」的流程调参
4. 能画出「对象 + 观测器 + 状态反馈」结构框图,并解释分离原理
5. 能讲清 MPC 滚动优化三要素,以及为什么足式机器人步态都用 MPC
建议用时: 约 60 分钟(第一遍通读 + 公式手推,面试前再刷「面试高频问答」节)
1 全景思维导图:现代控制理论知识地图
现代控制理论不是一门孤立的课,而是一条「建模 → 分析 → 反馈设计 → 状态估计 → 优化与预测 」的完整链路。先把知识地图印在脑子里:本页每一节都对应图中一个分支,点击分支标题可折叠/展开。
现代控制理论(状态空间 → MPC)
状态空间语言
状态方程 ẋ=Ax+Bu, y=Cx+Du 核心
—— 状态变量选取: 能量相关的最小变量组
传函 → 能控标准型(实现不唯一)
物理方程 → 状态空间(关节电机例)
G(s)=C(sI−A)⁻¹B + 最小实现
线性系统的解与离散化
状态转移矩阵 e^{At}
特征值 = 极点 = 稳定性
ZOH 离散化 · 采样取带宽 10~20 倍
能控性与能观性
秩判据 rank[B AB … Aⁿ⁻¹B]=n 核心
—— 鞭子够得着(能控)/看得见(能观)
不能控 → 不能任意配极点
PBH 判据(面试加分项)
稳定性三视角
Lyapunov 渐近稳定(现代定义)
特征值实部全负 ⇔ BIBO 稳定
零极点对消的隐藏模态陷阱
极点配置
u = −Kx 全状态反馈
Ackermann 公式 / place 函数
主导极点远 → 快,但增益大 → 噪声放大
LQR 最优反馈
J=∫(xᵀQx+uᵀRu)dt + Riccati 方程 核心
调 Q = 响应快,调 R = 省力防饱和
增益裕度 ≥1(∞dB)、相位裕度 ≥60°
实操: 固定 R,对数量级扫 Q
观测器
龙伯格观测器 + 分离原理
—— 估计误差动态 (A−LC) 指数收敛
分离原理: 控制律与观测器独立设计
LQG = LQR + KF(全状态不可测时的组合)
卡尔曼滤波
预测—更新两步循环
Q/R 调参直觉: 信模型还是信传感器
KF = 时变增益的「最优观测器」
MPC 模型预测控制
滚动优化三要素: 模型/代价/约束 核心
QP 求解一句话 + Np/Nc 调参
足式步态: ZMP/质心模型约束
MPC vs LQR 对比(表格见 §11)
工程落地选位
内环电流环仍是 PID/FOC(高带宽)
外环状态反馈/LQR/MPC(躯干级算力)
与 ADRC 的关系(升级路线互链)
🗺️ 使用建议: 分支一是全页的「语言基础」——后面所有算法(LQR/KF/MPC)都用状态空间说话。若时间紧,按「一 → 二(能控能观) → 三(LQR) → 四(观测器) → 五(MPC)」的顺序读,与「建模 → 分析 → 控制 → 估计 → 优化」的工程链路一致。
2 为什么需要现代控制理论:PID 的三堵墙
你已经在本站 04-02 里见过 FOC 三环:电流环、速度环、位置环,全是 PID——单关节内环它依然是工业首选。但当控制对象变成「多关节全身 + 欠驱动动力学 + 强耦合」的人形机器人时,PID 会撞上三堵墙,这三堵墙正是现代控制理论诞生的原因。
是什么:PID 处理不了的三类问题
堵墙 具体表现(人形机器人场景) PID 的困境 现代控制的答案
① 多变量耦合 躯干侧倾会同时改变两条腿的负载;一个关节发力,相邻关节的等效惯量全变 每个回路一个 PID,把「别人引起的扰动」全当外扰硬扛,带宽互相抢、来回打架 状态空间天然描述 MIMO(多输入多输出),耦合写进 A、B 矩阵里统一处理
② 状态不可全测 力矩、接触力、质心速度、足端滑移大多没有直接传感器 PID 只反馈「被测的那一个量」,其他内部状态恶化时只能等它表现出来 观测器/卡尔曼滤波用模型 + 少量测量重构全部状态
③ 时变与非线性 姿态改变 → 重力项变化;负载抓放 → 惯量变化;步态切换 → 模型跳变 一组参数只在标称工况最优,工况一漂就震荡或迟钝,只能反复重调 工作点线性化 + 增益调度 / LTV-MPC;非线性直接上非线性 MPC 与反馈线性化
怎么做:换一种「语言」描述系统
经典控制用传递函数 说话:只看输入到输出的外部关系,s 域、单回路、频域设计(Bode 图、根轨迹)。现代控制用状态空间 说话:把系统内部所有「有记忆的量」(位置、速度、电流……)打包成状态向量 x,写成一阶微分方程组。语言换了之后,矩阵、特征值、线性代数这些工具全部进场——这就是「现代控制 = 状态空间语言」的含义。
💡 认知锚点: 不是「PID 落后被淘汰」,而是分工 。关节内环(电流/速度/位置,单输入单输出、带宽要求高)PID/FOC 依旧无敌;越往上层(多关节协调、平衡、步态),多变量耦合与约束越重,状态空间方法越不可替代。本页 12 节会给出完整的分层选位。
面试怎么问
「经典控制与现代控制的本质区别是什么?」 参考答法:①描述语言不同——经典控制用传递函数(外部输入输出描述,频域),现代控制用状态空间(内部状态描述,时域);②适用对象不同——经典控制主要面向 SISO 线性定常系统,现代控制天然支持 MIMO、时变、多状态系统;③设计思路不同——经典控制沿回路整定(PID + 频域校正),现代控制基于状态反馈(极点配置、LQR)与状态估计(观测器)。最后补一句工程判断:两者在实际机器人里是分层的、共存的。
易错点
⚠️ 误区: ①「学了 LQR/MPC 就该把 PID 全扔掉」——错,电流环 20kHz 带宽下 PI 是最便宜、最鲁棒的选择;②「现代控制 = 高级,一定更好」——模型不准时,基于模型的状态空间方法可能比不依赖模型的 PID 更差,鲁棒性要靠建模精度或 ADRC/鲁棒控制兜底。
3 状态空间建模:从物理方程到 Ax+Bu
是什么:状态变量与状态方程
为什么: 传递函数只描述「输入进去、输出出来」,系统内部发生了什么看不到。状态空间的核心思想是:挑出一组最小的、能完整记忆系统历史的变量 (状态向量 x),系统的未来只取决于当前 x 和今后的输入 u——知道 x,就不用再翻历史账本。
怎么做: 对线性定常(LTI)系统,状态空间模型就是两个方程:
\dot{x} = A x + B u, \qquad y = C x + D u
状态变量怎么选: 首选「与能量存储相关的量」——电容电压/电感电流(电气)、位置/速度(机械惯性与弹簧)、温度(热容)。n 阶系统需要且只需要 n 个独立状态。
A 状态矩阵(内部动力学)、B 输入矩阵(执行器怎么「推」状态)、C 输出矩阵(传感器能「看见」什么)、D 直通矩阵(常为 0)。
同一物理系统,状态变量选取不同 → A、B、C 不同,但特征值(极点)相同——这是「实现不唯一」的种子(§4)。
怎么做:从传递函数到能控标准型
已知传函时,可以「机械地」写出一种 companion(友矩阵)型实现。以二阶为例:
G(s) = \frac{1}{s^2 + 3s + 2} \;\Longrightarrow\; A = \begin{bmatrix} 0 & 1 \\ -2 & -3 \end{bmatrix},\; B = \begin{bmatrix} 0 \\ 1 \end{bmatrix},\; C = \begin{bmatrix} 1 & 0 \end{bmatrix}
规则:最后一行系数是分母多项式倒序取负 (−a₀, −a₁, …),上面一行全是 0 和 1 的移位结构;分子系数进 C。这种结构叫能控标准型 ——它名字的由来就是:这种实现一定完全能控(§6 秩判据一验便知),好处是极点配置公式(Ackermann)在它上面最简洁;缺点是各状态往往没有直接物理意义,且对参数误差、噪声敏感。
完整推导例:关节电机单轴模型(直/交流电机统一形式)
为什么用它: 人形机器人每个旋转关节,内核都是「电气回路 + 力矩生成 + 机械动力学」三段。把它推导一遍,你就掌握了状态空间建模的完整套路,后面 LQR/MPC 例程全部复用这个模型。
怎么做(三步): ①写电气 KVL 方程;②写机械转矩平衡方程;③选状态 x = [θ, ω, i]ᵀ,整理成标准形。
L\frac{di}{dt} = u - R\,i - K_e\,\omega, \qquad J\frac{d\omega}{dt} = K_t\,i - b\,\omega - \tau_L
符号:u 为电枢电压,i 为电流,Ke ω 为反电动势(机电耦合);Kt i 为电磁转矩,bω 为黏性摩擦,τL 为负载/重力扰动。两个方程把「电压 → 电流 → 转矩 → 转速」的因果链完整写了出来。
选状态 x₁=θ(位置)、x₂=ω(速度)、x₃=i(电流),u = u(电压),并把负载转矩 τL 当作已知外扰或「扰动输入」d:
\frac{d}{dt}\begin{bmatrix}\theta \\ \omega \\ i\end{bmatrix} = \begin{bmatrix} 0 & 1 & 0 \\ 0 & -\dfrac{b}{J} & \dfrac{K_t}{J} \\[2pt] 0 & -\dfrac{K_e}{L} & -\dfrac{R}{L} \end{bmatrix} \begin{bmatrix}\theta \\ \omega \\ i\end{bmatrix} + \begin{bmatrix} 0 \\ 0 \\ \dfrac{1}{L} \end{bmatrix} u
输出取决于传感器:编码器测 y=[θ, ω](C 取前两列),电流采样测 i(C=[0 0 1])——「C 就是你装了哪些传感器」 ,这句话连接了建模与后面的观测器设计。
u
电压
电气回路
L·di/dt = u − Ri − Ke·ω
状态 x₃ = i
i
Kt
τ
机械回路
J·dω/dt = τ − b·ω − τL
状态 x₂ = ω
ω
1/s
θ
τL 负载/重力扰动
−Ke·ω 反电动势(机电耦合反馈)
y₃ = i 电流采样
y₂ = ω
y₁ = θ
状态向量 x = [θ, ω, i]ᵀ · 蓝=电气域 橙=机械域 绿=测量 红=扰动
图① 关节电机单轴模型状态空间建模:两个物理方程 + 一条机电耦合反馈(反电动势/电磁转矩),状态选 [θ, ω, i]
含减速器怎么办: 关节端参数折算——等效惯量 Jeff = Jm + JL /n²,输出端角度 θJ = θm /n,输出端转矩放大 n 倍(扣效率)。若你把状态定义在输出端 ,Kt 项要除以 n;定义在电机端 则不变。先声明状态在哪个端,再写矩阵 ,这是关节建模最容易踩的坑。
代码:Python(control 库)建模与自检
import numpy as np
import control as ct
# 关节电机参数(电机端): R=0.5Ω, L=0.15mH, Kt=0.06 N·m/A,
# Ke≈Kt(SI单位制), J=1.2e-4 kg·m², b=1e-5, 减速比 n=10
R, L, Kt, J, b = 0.5, 1.5e-4, 0.06, 1.2e-4, 1e-5
Ke = Kt
# 状态 x = [theta_m, omega_m, i] (电机端角度/角速度/电流)
A = [[0, 1, 0],
[0, -b/J, Kt/J],
[0, -Ke/L, -R/L]]
B = [[0], [0], [1/L]]
C = [[1, 0, 0],
[0, 1, 0]] # 编码器测角度+速度; D=0
sys = ct.ss(A, B, C, 0)
# 自检1: 极点 = 特征值
print("极点:", sys.poles())
# 自检2: 传函回收(某一输出对u): G(s)=C(sI-A)^-1 B
tf = ct.ss2tf(sys)
print(tf)
🎤 面试怎么问: 「给你一个 RLC 电路/直流电机,让你建状态空间模型」几乎是控制岗面试的第一道动手题。答题模板:①数储能元件个数 = 状态维数 → ②列写每个储能元件的微分方程(电感:u=L·di/dt;电容/惯量同理) → ③消掉非状态中间量 → ④整理成 ẋ=Ax+Bu,并按传感器写 C。能顺手说出「选状态的原则是储能变量的最小独立组」直接加分。
⚠️ 易错点: ①状态数选多(θ 和 ω 都留,又额外加一个中间变量)→ 状态不独立,矩阵奇异;②单位混乱:转速用 rpm 还是 rad/s,Ke =Kt 只在 SI 单位下成立;③减速比折算漏乘/乘反(见上文「先声明哪一端」);④把 D 矩阵想当然不为 0——电压不直接瞬时产生角度,D=0。
4 状态空间与传递函数:同一系统的两副面孔
是什么:从状态方程拉回传函
为什么: 两者不是二选一,而是同一系统的「内部描述」与「外部描述」。对状态方程两边取拉普拉斯变换(零初始条件),消去内部状态 X(s),就得到输入输出关系:
G(s) = C\,(sI - A)^{-1} B + D
怎么做: 推导只需两步——X(s) = (sI−A)⁻¹B·U(s),代回 Y(s) = CX(s)+DU(s)。由此得到关键结论:G(s) 的极点 ⊆ A 的特征值 ,等号成立当且仅当没有零极点对消(即系统是最小实现)。
为什么:实现不唯一与最小实现
同一个 G(s) 可以有无穷多个状态空间实现——你把状态变量做一个可逆线性变换 T(x̃=Tx),A、B、C 全变,但 G(s) 不变(特征值也不变,相似变换不改变特征多项式)。例如能控标准型与「物理坐标」(θ, ω, i) 实现是同一传函的两副面孔。
最小实现: 实现的状态维数不同(你可以故意加一个不能控/不能观的「幽灵」状态),其中维数最小、且同时完全能控+完全能观的那个,叫最小实现。
判据: 实现是最小的 ⇔ (A,B) 能控 且 (A,C) 能观 ⇔ 传函没有零极点对消。
工程含义: 有对消发生时,G(s) 上「看不见」的那个模态仍然真实存在——若它不稳定,输出传函看起来没事,内部状态却在发散(内部不稳定)。这是「现代控制比经典控制看得深」的经典论据。
🎤 面试怎么问: 「传函和状态空间有什么区别与联系?」「G(s) 的极点和 A 的特征值一定相等吗?」标准答案要点:①G=C(sI−A)⁻¹B+D 是桥梁;②A 的特征值 ⊇ G 的极点,对消时特征值多于极点;③状态变换(相似变换)不改变传函与特征值;④最小实现 ⇔ 能控 + 能观。
⚠️ 易错点: ①以为「一个系统只有一种状态空间写法」——错,实现不唯一,考试里你写的和答案的不一样但都对,验算特征值与传函即可;②只会套公式不会推 (sI−A)⁻¹,二阶系统的手算要练熟;③把「D 常为 0」忘写进公式导致高频增益差一截。
5 线性系统的解、稳定性与离散化
是什么:状态转移矩阵 e^{At}
为什么: 经典控制用「阶跃响应表」查输出,现代控制直接把任意时刻的全部状态 解成封闭形式——控制算法跑在计算机上,本质上每个周期都在用这个解做预测。
x(t) = e^{At}\,x(0) + \int_0^t e^{A(t-\tau)}\,B\,u(\tau)\,\mathrm{d}\tau
第一项 e^{At}x(0):零输入响应——初始状态如何演化;第二项:零状态响应——输入如何「推」状态。
e^{At} 叫状态转移矩阵 ,可用级数定义 e^{At} = I + At + (At)²/2! + … 计算;它把「t 时刻状态」从「0 时刻状态」转移过来,故得此名。
e^{At} 的每一个元素都是 e^{λt}、t·e^{λt} 这类项的组合(λ 为特征值)——这就是「特征值决定响应形态」的代数根源。
为什么:特征值 = 极点 = 稳定性
e^{At} 含 e^{λt} 项 → 所有特征值实部 Re(λᵢ) < 0 时,零输入响应衰减到 0(Lyapunov 渐近稳定);有一个实部为正,状态发散。
而 G(s) 的极点 ⊆ 特征值(§4)→ 「特征值、极点」在最小实现里是一回事 ,频域语言与时域语言在这里会师。
复数特征值 λ = σ±jω 对应衰减振荡(e^{σt}·sinωt):σ 决定衰减快慢,ω 决定振荡频率——从二阶系统的阻尼比/自然频率直接迁移过来。
🎤 面试怎么问: 「为什么不解微分方程也知道稳定?」——只看 A 的特征值实部符号;「极点和特征值什么关系?」——见 §4。追问「离散系统的稳定区域在哪?」——z 平面单位圆内(连续域是左半平面),这是为下面的离散化铺垫的。
怎么做:离散化(ZOH)与采样频率选择
控制律跑在 MCU/DSP 上,周期 T 一步一步来,所以要把 ẋ=Ax+Bu 变成差分方程 x[k+1]=Ad x[k]+Bd u[k]。零阶保持(ZOH) 假设「一个周期内 u 保持恒定」——这正是 PWM/逆变器每拍更新一次指令的真实行为:
A_d = e^{AT}, \qquad B_d = \left(\int_0^T e^{A\tau}\,\mathrm{d}\tau\right) B
离散化方法 思路 特点 / 用途
前向欧拉 x[k+1] = x[k] + T·(Ax+Bu) 最简单,T 大时可能把稳定系统离散成不稳定(稳定域映射偏移),慎用
后向欧拉 x[k+1] 由 k+1 时刻导数定义 无条件稳定,但精度低,常用于保守估算
Tustin(双线性) s ≈ (2/T)·(1−z⁻¹)/(1+z⁻¹) 频域畸变需预扭曲(warping),滤波器离散化常用
ZOH(零阶保持) 精确解 + 周期内 u 恒定 控制系统离散化的默认正确选择 ,A_d、B_d 有精确公式
采样频率怎么选: 经验法则 fs ≈ (10~20) × 闭环带宽 。太低——相位滞后吃掉裕度、ZOH 假设失效,连续域设计的控制器离散后降级甚至不稳;太高——算力与传感器噪声压力上升。关节案例:位置/速度外环带宽约 50~100 Hz,1 kHz 控制周期绰绰有余;电流环带宽 1~2 kHz,对应 20 kHz PWM 与同频电流采样。香农定理(2 倍)只是「不混叠」的底线,工程上远不止 2 倍。
# ZOH 离散化(python-control 一行完成)
sysd = sys.sample(Ts=0.001, method='zoh') # 1 kHz 外环
print(sysd.A, sysd.B)
# 验证: 离散极点 = 连续极点的指数映射 z = e^(λ·Ts)
import numpy as np
lam = sys.poles()
print("z = exp(λTs):", np.exp(lam * 0.001))
⚠️ 易错点: ①面试答「采样率按香农 2 倍取」——那是信号重建的底线,控制回路要 10~20 倍带宽;②连续域稳定 ≠ 离散化后稳定:前向欧拉会「离散出不稳定」,ZOH 保持极点映射但增益响应仍受 T 影响;③离散极点必须落在单位圆内 ,别把左半平面的直觉直接搬到 z 平面。
6 能控性与能观性:鞭子够得着吗、看得见吗
是什么:定义与秩判据
为什么: 在动手设计任何状态反馈之前,必须先回答两个资格问题——「我能通过输入 u 把每个状态都推到位吗(能控)?」「我能从输出 y 反推出每个状态吗(能观)?」。答案决定后面所有设计方法是否可用。
\mathcal{C} = \begin{bmatrix} B & AB & A^2B & \cdots & A^{n-1}B \end{bmatrix}, \qquad \operatorname{rank}(\mathcal{C}) = n \;\Longleftrightarrow\; \text{完全能控}
\mathcal{O} = \begin{bmatrix} C \\ CA \\ \vdots \\ CA^{n-1} \end{bmatrix}, \qquad \operatorname{rank}(\mathcal{O}) = n \;\Longleftrightarrow\; \text{完全能观}
能控性矩阵是把 u 依次「作用 1 拍、2 拍……n 拍」能到达的所有方向拼起来;rank = n 意味着这些方向张满整个 n 维状态空间,任何状态都能在有限时间内到达 。
能观性矩阵对偶:把 y 及其各阶「导数信息」拼起来,能张满 n 维就能唯一反推初值。
面试加分:PBH 判据 rank[λI−A, B] = n 对每个特征值成立 ⇔ 能控,适合判断「哪个模态不能控」。
物理直觉:哪些状态「鞭子够得着」「眼睛看得见」
能控 = 鞭子够得着: u 是你手里的鞭子,状态是散落的球。够得着的球(能控子空间)可以任意指挥;够不着的球只能随它去。关节例子:电机经减速器拖动负载,输出端位置「够得着」;但如果你在输出端抱闸锁死 + 电机堵转 的场景里建模,锁死方向的自由度就是不能控的。
能观 = 看得见: 传感器是眼睛。只装电机端编码器时,减速器柔性形变/输出端残余振动在 y 里几乎不出现——「看不见」的状态要用观测器猜;这正是人形关节上双编码器(电机端 + 输出端)方案的动机之一(参见 02-05 参考资料汇总 )。
多关节系统:「腿摆动时躯干姿态不可控自由度」(欠驱动/非完整约束)是能控性直觉的高级版本——Underactuated Robotics 全书都在讲「鞭子够不着时怎么办」。
怎么做:不能控就不能任意配极点
状态反馈 u=−Kx 的闭环矩阵是 A−BK,它的 n 个极点想放哪就放哪的充要条件是完全能控 。不能控的模态像一个焊死的旋钮:你转不动它,它保持在原位(通常还在不稳定位置)——此时极点配置最多改 n−1 个。所以工程流程永远是:先验能控,再配极点;先验能观,再上观测器 。
import numpy as np
def ctrb(A, B):
n = A.shape[0]
return np.hstack([np.linalg.matrix_power(A, i) @ B for i in range(n)])
Cc = ctrb(A, B) # 用 §3 的关节电机 A, B
print("能控性秩:", np.linalg.matrix_rank(Cc), "/ 3") # 3 → 完全能控
Co = np.vstack([C] + [C @ np.linalg.matrix_power(A, i) for i in (1, 2)])
print("能观性秩:", np.linalg.matrix_rank(Co), "/ 3")
🎤 面试怎么问: ①「能控性的物理意义是什么?」——输入能在有限时间内把状态转移到任意位置;不是「动一动」,是「任意指哪到哪」。②「判断方法?」——rank[B AB … Aⁿ⁻¹B]=n 或 PBH。③「不能控的系统能稳定吗?」——不能控模态自身稳定(可镇定)则可以镇定;不能控且不稳定则状态反馈无能为力,只能改结构/加执行器。
⚠️ 易错点: ①数值陷阱:接近但不满秩的矩阵(条件数极大)算出的 rank 可能虚高/虚低,工程上要配合奇异值看;②「能控」与「能镇定」混淆——能镇定是弱条件(不能控的部分必须自己稳定);③把能控性矩阵拼错阶数(A 的幂只到 n−1,不是 n)。
7 极点配置:u = −Kx 把极点搬到想要的位置
是什么:全状态反馈
为什么: §5 说了「特征值决定响应形态」,那么最直接的控制思路就是:用状态反馈改造系统矩阵,把特征值搬到我们指定的位置 。取控制律 u = −Kx(参考输入先置零考虑调节问题):
\dot{x} = (A - BK)\,x, \qquad \det\!\big(sI - (A - BK)\big) = \text{期望特征多项式}
怎么做: K 有 n 个自由度,恰好够把 n 个极点各放一处(前提:完全能控)。参考输入 r 的引入用「前馈 + 反馈」结构 u = −Kx + N·r(N 用来把稳态误差调到 0,常用 N = 闭环直流增益的倒数)。
怎么做:Ackermann 公式
单输入系统求 K 有一个闭式解:记期望特征多项式 φd (s) = sⁿ + a₁*sⁿ⁻¹ + … + aₙ*,则
K = \begin{bmatrix} 0 & 0 & \cdots & 1 \end{bmatrix}\, \mathcal{C}^{-1}\, \varphi_d(A), \qquad \varphi_d(A) = A^n + a_1^* A^{n-1} + \cdots + a_n^* I
手推不必背,但要会用:Matlab 里 K = acker(A,B,P)(数值上仅推荐 n≤10),Python 里 K = ct.place(A,B,P)(place 还支持 MIMO 与鲁棒算法)。
# 把三个极点放到 {-30, -40, -300} (rad/s): 快动态给电流, 主导给机械
P = [-30, -40, -300]
K = ct.place(A, B, P)
print("K =", K) # 检查闭环
sys_cl = ct.ss(A - B @ K, B*0, C, 0) # 零输入闭环 A-BK
print("闭环极点:", ct.eigvals(A - B @ K))
为什么:主导极点放置策略(快 ≠ 无脑远)
主导极点: 把一对「较近」的复极点放在决定闭环带宽/阻尼的位置(如等效阻尼比 0.7~0.9),其余「快极点」放到主导极点 5~10 倍远的地方——远极点衰减快,对响应形态贡献小。
但增益别太大: 极点往左拉得越远,K 越大;K 大 = 控制电压/电流指令大 = 执行器饱和 + 传感器噪声被放大 n 倍 。编码器量化噪声经 K 直接进电压指令,电机「嘶嘶」发热啸叫就是经典症状。
工程折中: 极点位置受物理约束——期望带宽不得超过执行器带宽(电流环)与采样频率的 1/10,否则纸面极点在真机上根本实现不了。
🎤 面试怎么问: 「极点配置和 PID 有什么关系?」——对二阶系统配好极点后展开 u=−Kx,形式上就是 PD/PID 的系数(位置/速度反馈 = D、P 项);状态反馈是 PID 的「多变量推广」,能用上全部状态的信息。又问「为什么实际多用 LQR 而少用手摆极点?」——见下一节:LQR 把「摆极点」换成「摆权重」,物理意义更明确,且自带稳定裕度保证。
⚠️ 易错点: ①系统不完全能控时调 place → 报错或把极点放到离期望很远的位置,先验能控性;②单输入系统极点不能全配成相同实数之外的重根时 acker 数值病态;③忘了配置后的执行器幅值检查——仿真里 K 很漂亮,真机一上就饱和振荡。
8 LQR:把「怎么配极点」换成「怎么摆权重」
是什么:最优代价函数
为什么: 极点配置的痛点是「极点放哪要拍脑袋」。LQR(线性二次型调节器)换了个问法:不问极点在哪,而问「状态偏差 和控制能量 加起来最小的控制律是什么」。把偏好写成积分代价:
J = \int_0^{\infty} \left( x^{\mathsf T} Q x + u^{\mathsf T} R u \right) \mathrm{d}t, \qquad Q = Q^{\mathsf T} \succeq 0,\; R = R^{\mathsf T} \succ 0
被积函数第一项罚「状态离零位有多远」,第二项罚「花了多少控制量」。最小化 J 的解恰好是一个线性状态反馈 u = −Kx——最优解自动落在和 §7 相同的结构上,这就是 LQR 的优雅之处。
怎么做:Riccati 方程与增益
A^{\mathsf T} P + P A - P B R^{-1} B^{\mathsf T} P + Q = 0, \qquad K = R^{-1} B^{\mathsf T} P
代数 Riccati 方程(ARE)求出对称正定解 P,K 随之确定。你不需要手解 ARE——Matlab lqr(A,B,Q,R)、Python ct.lqr() 一行完成;需要理解的是它的两条性质:①(A,B) 能控(或可镇定)时闭环 A−BK 必渐近稳定;②固有裕度 :全状态反馈 LQR 的增益裕度至少 6 dB(环路增益降到 1/2 或升到无穷都不失稳),相位裕度不低于 60°——「鲁棒性免费送」,这是它远胜随手配极点的关键(前提:模型准确、全状态可测、未忽略执行器动态)。
Q、R 的物理意义与初值公式
权重 调大意味着 代价 典型用途
Q(状态罚) 对状态偏差「零容忍」→ 响应更快、超调小、抗扰强 K 变大 → 电流/电压指令猛,容易触发执行器饱和 ,噪声放大 想快速到位的位置环、平衡姿态角
R(控制罚) 「省着用力」→ 动作柔和、能耗低 响应变慢、抗扰变弱 发热受限、电池续航、防抖动
Q 中某一项(如 qθθ ) 单独惩罚某个状态:q 大 = 这个状态最重要 对应反馈通道增益变大 角度优先于速度:Q=diag(q₁,q₂,0)
初值公式(Bryson 法则): 按「每个量允许的最大偏差」倒数平方给初值,把各状态和控制量归一到同一量纲:
q_{ii} = \frac{1}{x_{i,\max}^2}, \qquad r_{jj} = \frac{1}{u_{j,\max}^2}
例如关节允许位置偏差 0.1 rad、电压指令 24 V:qθθ =100,r=1/576≈0.0017。
调参实操:固定 R,对数量级扫 Q
为什么这么扫: Q、R 同时动,方向感全无;固定 R 之后「Q 增大 = 更快更硬」是单调关系,行为可预测。R 相当于「执行器预算」——它由硬件决定(电压/电流上限),所以固定它符合物理直觉。
流程: R 按 Bryson 定死 → Q 从小到大 ×10 扫(1 → 10 → 100…)→ 看阶跃/抗扰仿真:上升时间够快、u 未饱和 → 再微调 Q 内部各分量的相对比例。
停止条件: 出现①指令饱和/抖动、②观测噪声引起输出毛刺、③带宽逼近电流环极限 —— 任一出现即回退一档 Q。
Q = np.diag([100.0, 1.0, 0.1]) # 罚位置、速度、电流
R = np.array([[1e-3]]) # 电压预算 24V → Bryson: 1/24² ≈ 0.0017
K, P, eig = ct.lqr(A, B, Q, R) # K shape (1,3)
print("K =", K, " 闭环特征值:", eig)
# 自检闭环带宽与阶跃响应
sys_lqr = ct.ss(A - np.squeeze(B @ K), np.squeeze(B), C, 0)
ct.step_response(sys_lqr) # 扫 Q: 10 → 100 → 1000 观察变化
1 建模 物理方程 → 状态空间 A,B,C(§3 关节电机例)
2 离散化 ZOH,采样率取带宽 10~20 倍(§5)
3 验能控性 rank[C]=n,不满足先改建模/执行器
4 定 Q、R Bryson 初值;固定 R 扫 Q
5 解 Riccati lqr() 得 K,检查闭环极点与带宽
6 仿真验证 阶跃/抗扰/噪声注入,u 不饱和
7 实车迭代 参数辨识误差 → 回退 Q 或加前馈/观测器
图② LQR 设计全流程:左半是「纸面推导」(1~5 可全部离线完成),右半是「仿真与实车」(6~7 才见真章),实车返回修正模型是常态闭环
🎤 面试怎么问: ①「LQR 的 Q、R 怎么给?」——答物理意义(罚状态 vs 罚控制)+ Bryson 初值 + 固定 R 扫 Q 的实操,并补一句「最终以执行器饱和与噪声表现为约束」;②「LQR 一定稳定吗?」——模型准确且 (A,B) 可镇定时闭环渐近稳定,且有 ≥60° 相位裕度/6dB 增益裕度保证,但模型失配大时保证打折;③「LQR 跟 MPC 什么关系?」——无约束 LQR 可视为 MPC 的解析解基准(见 §11 对比表)。
⚠️ 易错点: ①以为 Q、R 越大越好——R 大是「省力」不是「有力」,方向别记反;②Q 用单位阵不带量纲,机械状态(弧度)与电流状态(安培)权重差几个数量级,直接套模板必翻车;③全状态反馈假设在真机上不成立(θ 可测、i 可测,但「干净」的 ω 往往要微分/估计),引出下一节观测器。
9 状态观测器与分离原理:看不见的状态,算出来
为什么需要观测器
LQR/极点配置都要求「全状态可测」x,但真机上:角速度要靠编码器差分(噪声大)、柔性形变测不到、「干净」的电流转矩关系受温度漂移影响。把噪声很大的微分值直接喂进 K,等于给控制指令放大噪声。观测器(状态估计器)的思路:用同一个模型在线「影子仿真」,用测量误差不断校正影子,得到估计 x̂ 代替 x 做反馈。
怎么做:龙伯格(Luenberger)观测器方程
\dot{\hat{x}} = A\hat{x} + Bu + L\,\big(y - C\hat{x}\big), \qquad e = x - \hat{x}
前两项是「照抄对象模型的影子仿真」,第三项是校正项:测量残差 y−Cx̂ 经增益 L 注回估计。估计误差的动态是封闭的:
\dot{e} = (A - LC)\,e \quad\Longrightarrow\quad e(t) \to 0 \;\text{当且仅当}\; A - LC \;\text{特征值全负}
L 怎么设计: 与极点配置完全对偶——(A,C) 能观 ⇔ (Aᵀ,Cᵀ) 能控,所以 L = place(A.T, C.T, P_obs).T,把观测器极点放在闭环极点更左边(快 3~10 倍):太慢,x̂ 追不上 x;太快,测量噪声全被 L 放大。
观测器极点 ≪ 控制极点 的原因:估计误差收敛必须快于控制动态,反馈才「像」真全状态反馈;但受噪声约束,不能无限快——这是观测器设计的核心折中。
# 观测器: 极点放 {-80, -100, -800}(比控制快 3~10 倍)
P_obs = [-80, -100, -800]
L = ct.place(A.T, C.T, P_obs).T # 对偶设计
print("L =", L) # 误差动态 A - L C 特征值检验
print(ct.eigvals(A - L @ C))
r
参考
+
−
u
u = −Kx̂ + Nr(N 为参考前馈)
对象(真实关节)
ẋ = Ax + Bu , y = Cx
真实状态 x(部分不可测)
y = 测量(编码器 / 电流采样)
龙伯格观测器
x̂̇ = Ax̂ + Bu + L(y − Cx̂)
影子模型 + 残差校正 → x̂
x̂
K 反馈增益
−Kx̂
估计误差 e = x − x̂, 动态 (A−LC)e
观测器极点比控制极点快 3~10 倍
蓝 = 控制流(u) · 橙 = 估计/反馈流(x̂, −Kx̂) · 绿 = 测量流(y)
图③ 状态反馈 + 龙伯格观测器结构:x̂ 代替不可全测的 x 进入 K 反馈;r 为参考输入(经 N 前馈),u 同时喂给对象与观测器的影子模型
分离原理与 LQG
分离原理: 把 u=−Kx̂ 与龙伯格观测器联立后,闭环 2n 个极点恰好是 eig(A−BK)(控制)与 eig(A−LC)(观测)两组的并集——控制律设计与观测器设计可以完全独立进行,互不影响 。这是线性系统最漂亮的结论之一,把一个 2n 维耦合问题拆成两个 n 维问题。
LQG = LQR + KF: 当噪声是统计已知的随机过程时,用卡尔曼滤波(§10)替换龙伯格观测器、保留 LQR 反馈,组合叫 LQG。代价:分离原理在 LQR+KF 组合下仍成立(增益各自最优),但 LQG 不再保证 LQR 那套 60° 相位裕度(LQG 有著名的「裕度退化」反例)——面试能提这点非常加分。
🎤 面试怎么问: ①「分离原理是什么?为什么成立?」——答两组极点独立可配,本质是误差动态 (A−LC) 与控制动态 (A−BK) 解耦;②「观测器极点为什么放更快?」——误差收敛要先于控制响应;追问「为什么不能无限快?」——L 放大测量噪声,抖动加剧;③「LQG 的裕度还剩多少?」——不再是 60°,需要 Loop Transfer Recovery(LQR)恢复。
⚠️ 易错点: ①观测器设计前忘了验能观性——不能观的状态是「影子都造不出来」的部分;②把 L 的极点与 K 的极点混为一谈,误以为两者要一样快;③观测器模型里的 A 必须与真实对象一致才有 e→0,参数误差会把「残差校正」用去补模型误差,估计有偏——这正是 ADRC/扰动观测器(见 §12)要解决的问题。
10 卡尔曼滤波:给观测器装上「统计大脑」
是什么:预测—更新两步循环
为什么: 龙伯格观测器把测量当「完全可信」,把模型当「完全准确」,真实世界两头都不成立(编码器量化噪声、模型参数误差)。卡尔曼滤波(KF)把不确定性显式写进数学:模型误差用过程噪声 w~N(0,Qn ),传感器误差用测量噪声 v~N(0,Rn ),然后回答——「在这个噪声水平下,均方误差最小 的估计是什么」。
\text{预测:}\quad \hat{x}^{-} = A\hat{x} + Bu, \qquad P^{-} = A P A^{\mathsf T} + Q_n
\text{更新:}\quad K_k = P^{-} C^{\mathsf T}\big(C P^{-} C^{\mathsf T} + R_n\big)^{-1}
\hat{x} = \hat{x}^{-} + K_k\big(y - C\hat{x}^{-}\big), \qquad P = (I - K_k C)\,P^{-}
预测(模型说话): 用状态方程把估计推到下一拍;协方差 P⁻ 变大——「只靠模型,心里越来越没底」。
更新(测量说话): 来了新测量 y,按 Kalman 增益 Kk 折中修正;P 变小——「测量补了信息」。
每个周期循环这两步,Kk 自动在 0~1 之间浮动:模型准/噪声大时趋近 0(信模型),测量准/模型差时趋近 1(信测量)。
# 一维关节角度 KF 最小实现(感受两步结构)
x, P = 0.0, 1.0 # 初始估计与协方差
Qn, Rn = 1e-4, 0.05 # 过程/测量噪声方差
for y_meas in encoder_readings: # 每个采样周期
x = x # 1) 预测: 静态/匀速模型推 x
P = P + Qn # 不确定性增大
Kk = P / (P + Rn) # 2) 更新: 算增益
x = x + Kk * (y_meas - x) # 折中修正
P = (1 - Kk) * P # 不确定性减小
# 生产环境用 filterpy / scipy 实现向量化版本
Qn 、Rn 的调参直觉:信模型还是信传感器
动作 效果 副作用 关节场景
调大 Qn (过程噪声) 更信传感器 → 估计贴着测量走、响应快 输出毛刺多 快速摆动关节、速度估计要跟手
调大 Rn (测量噪声) 更信模型 → 平滑、滤波强 滞后大、真变化被当噪声滤掉 编码器线数低、振动环境
两者同调不准 比值 Qn /Rn 决定折中点,绝对值影响 P 收敛速度 — 先用数据说话:静置采测量方差定 Rn ,再加激励辨识 Qn
⚠️ 先分清两个「QR」: LQR 的 Q、R 是控制代价权重 (你想要的性能),KF 的 Qn 、Rn 是噪声协方差 (物理世界的统计属性)。面试常故意混淆这两个 QR,务必先澄清再作答。
与龙伯格观测器的关系:KF = 时变最优观测器
结构上,KF 就是龙伯格观测器:L(y−Cx̂) 的位置换成了 Kk (y−Cx̂⁻),只是增益不再固定,而是由协方差递推每个周期在线计算 。
理论上:噪声为高斯白噪声时,KF 是均方估计误差意义下的最优 估计器;把 Kk 收敛值固定,就退化为一个特定 L 的稳态卡尔曼滤波——与龙伯格形式完全重合。
扩展:模型非线性(EKF 雅可比线性化 / UKF 无味变换)、非线性-非高斯(粒子滤波)。关节级 EKF 常用于无传感器估计与 IMU 姿态融合——深入见下一页 17 状态观测器全解 。
🎤 面试怎么问: ①「卡尔曼滤波的两步?」——预测(推状态+扩不确定性)、更新(算增益+修正+缩协方差),要能写公式;②「Q、R 怎么调?」——比值定「信谁」,R 用静置数据标定,Q 靠激励实验;③「KF 和龙伯格观测器什么关系?」——同构,KF 是时变最优增益版本,稳态时退化为定增益观测器。
⚠️ 易错点: ①协方差 P 是「不确定度」,不是噪声本身,别把 P 和 Qn 混用;②Qn =0 会让滤波器逐渐「自信到不听测量」,数值上也常发散;③EKF 忘算雅可比或线性化点选错,强非线性下直接发散——先想 UKF/粒子滤波。
11 MPC 模型预测控制:一边预测,一边滚动优化
是什么:滚动优化三要素
为什么: LQR 求的是一个「一次性算完、永远用下去」的反馈增益;MPC(模型预测控制)换个更「务实」的玩法——每个控制周期都重新做一次有限时域的优化 :用模型预测未来 Np 步,选一串未来控制量让预测轨迹「又贴参考、又不费劲、还不越界」,但只执行第一个,下一拍全部重来。三要素缺一不可:
① 预测模型: 就是 §3/§5 的状态空间离散模型 x[k+1]=Ad x[k]+Bd u[k]——MPC 没有魔法,模型错预测全错;
② 代价函数: 把「贴参考 + 省控制 + 变化平滑」写成二次型;
③ 约束: 执行器饱和、状态边界、ZMP 必须落在支撑多边形内……显式写进优化问题,这是 MPC 区别于 LQR 的灵魂。
J = \sum_{k=1}^{N_p} \Big( \| x_k - x_{k}^{\mathrm{ref}} \|_Q^2 + \| u_{k-1} \|_R^2 \Big) + \sum_{k=1}^{N_c-1} \| \Delta u_k \|_{R_\Delta}^2
\text{s.t.}\;\; x_{k+1}=A_d x_k + B_d u_k, \qquad u_{\min} \le u \le u_{\max}
怎么做:QP 一句话与 Np /Nc 调参
QP 求解一句话: 把模型递推代入代价,决策变量是未来控制序列 U=[u₀,…,uNc −1],整个问题变成「二次目标 + 线性约束」的凸二次规划(QP) ——有唯一全局最优,专业求解器(OSQP、qpOASES、HPIPM)在嵌入式上毫秒级可解;没有约束时一阶导为零,解析解恰好退化为 LQR 增益。
Np (预测时域): 要覆盖对象的主要动态——太短是「近视」(看不到未来的罚与约束),太长是「远视」(决策变量暴增 + 远期预测没意义)。经验:覆盖 2~3 个开环响应时间。
Nc (控制时域): Nc ≤ Np ,之后控制量保持不变。Nc 越大自由度越高但求解越慢;关节/步态控制常取 Nc 为 Np 的 1/4~1/2。
节点数才是计算量: QP 规模 ∝ Nc ×控制维数;50 Hz 步态 MPC 通常 Np ≈10~16 步,1 kHz 关节级 MPC 只敢 Np ≈5~10。
每拍向右滚动一格,重新求解
下一拍窗口
预测时域 Np:模型向前推演 Np 步
现在 k
历史测量
参考轨迹 x_ref
预测轨迹(每步都贴向参考)
k+Np
控制时域 Nc:只执行第一个 u0*,
Nc 之后保持不变 · 下一拍重算
图④ MPC 滚动优化:在每个采样拍,以当前状态为起点优化未来 Np 步的轨迹与 Nc 步的控制序列,但只执行第一拍,窗口随时间滚动前进
为什么足式机器人步态都用 MPC(ZMP / 质心模型约束)
双足行走的本质是「控制一个倒立摆,同时 ZMP(零力矩点)必须始终落在脚底支撑多边形内」 ——踩出支撑多边形就翻倒。这个「不许越界」的硬约束,是 LQR 表达不了、而 MPC 与生俱来的能力。工业与学术主流步态控制器用简化质心模型做 MPC:
\ddot{x}_c = \frac{g}{z_c}\big(x_c - p\big) \;\Longrightarrow\; p = x_c - \frac{z_c}{g}\,\ddot{x}_c \quad\text{(线性倒立摆: 质心高度 } z_c \text{ 固定)}
状态取 [xc , ẋc , ẍc ](或加 jerk),控制输入为 ZMP/足端落点 p,约束 pmin ≤ p ≤ pmax (支撑多边形),代价罚质心跟踪 + 速度平滑 + 落点省力——一个标准的线性 MPC。MIT Cheetah、宇树、优必选等步态层的 MPC 本质都是这个套路(细看模型不同:凸 MPC 用 LIPM,更高端用质心动力学/全身 MPC);这些指令再下发到各关节,由本页 §3 的关节模型执行。
MPC vs LQR 对比表
维度 LQR MPC
优化形式 无限时域,离线解一次 Riccati,得固定增益 K 有限时域 Np ,每个周期在线解 QP
约束处理 ❌ 无能为力(只能事后补偿/抗饱和) ✅ 显式写入(力矩/速度/ZMP 边界)
参考轨迹 调节器取向,跟踪要另加前馈 ✅ 天然跟踪任意参考与规划轨迹
在线算力 极低(乘加即可,MCU 轻松) 高(每拍解 QP,需要 SoC/强 MCU)
理论保证 闭环稳定 + 60° 相位裕度(模型准确时) 稳定需专门论证(终端代价/终端约束集)
调参对象 Q、R 权重 Q、R 权重 + Np /Nc + 约束边界
典型用位 单关节位置/姿态稳定(算力紧、无硬约束) 足式步态 ZMP、机械臂避障、预测性力控
🎤 面试怎么问: ①「MPC 为什么能处理约束?」——约束直接写进优化问题,QP 在可行域内取最优;LQR 的增益线性律无法保证不越界。②「MPC 每个周期都在解优化,为什么实时性还行?」——问题规模由 Nc 决定,凸 QP 有多项式时间算法,加上热启动(用上一拍解做初值)与显式 MPC(离线枚举),嵌入式可行。③「无约束 MPC 和 LQR 什么关系?」——同一族问题,LQR 是其解析特例。
⚠️ 易错点: ①只调权重不动时域——Np 太短的病态(震荡/短视)怎么调 Q、R 都救不回来;②模型失配是 MPC 第一杀手:预测全靠模型,柔性与摩擦不进模型,预测就系统性偏移;③终端代价缺失时有限时域 MPC 可能不稳定(面试常问「MPC 一定稳定吗」)。
数值算例:单轴电机 MPC 手推 2 步(Np =2,无约束解析解)
对象: 一阶离散模型 x[k+1] = 0.9·x[k] + 0.1·u[k],参考 xref = 1,权重 Q = 1、R = 0.1,初始 x(0) = 0。预测时域 Np = 2、控制时域取满 2,决策变量 U = [u₀, u₁]T 。下面把「模型递推 → 代入代价 → 求偏导 → 解方程」完整走一遍,感受 QP 在最简单时是什么。
第 1 步:两步预测代入代价。 由模型递推:x₁ = 0.1u₀;x₂ = 0.9x₁ + 0.1u₁ = 0.09u₀ + 0.1u₁。状态跟踪代价 + 控制代价:
J = (x_1-1)^2 + (x_2-1)^2 + 0.1\,(u_0^2+u_1^2) = (0.1u_0-1)^2 + (0.09u_0+0.1u_1-1)^2 + 0.1\,(u_0^2+u_1^2)
第 2 步:对 u₀、u₁ 求偏导置零。 对 u₀:0.2(0.1u₀−1) + 0.18(0.09u₀+0.1u₁−1) + 0.2u₀ = 0,整理得 0.1181u₀ + 0.009u₁ = 0.19 ;对 u₁:0.2(0.09u₀+0.1u₁−1) + 0.2u₁ = 0,整理得 0.09u₀ + 1.1u₁ = 1 。(两个方程就是 QP 的 H·U = g,H 正定 → 唯一全局最优。)
第 3 步:解二元线性方程组。 由第二式 u₁ = (1 − 0.09u₀)/1.1,代入第一式:0.1181u₀ + (0.009/1.1)·(1 − 0.09u₀) = 0.19,即 0.1181u₀ + 0.008182 − 0.000736u₀ = 0.19,得 0.117364u₀ = 0.181818 → u₀* = 1.549 ;回代得 u₁ = (1 − 0.09×1.549)/1.1 = (1 − 0.1394)/1.1 = 0.8606/1.1,即 u₁* = 0.782 。
验算: x₁ = 0.1×1.549 = 0.155,x₂ = 0.09×1.549 + 0.1×0.782 = 0.139 + 0.078 = 0.218。代入两个偏导方程:0.1181×1.549 + 0.009×0.782 = 0.1830 + 0.0070 = 0.190 ✓;0.09×1.549 + 1.1×0.782 = 0.1394 + 0.8606 = 1.000 ✓。注意 u₀* = 1.549 远小于「一步到位」所需的 10——R = 0.1 罚控制量,MPC 主动选择「两拍内渐进到位」,这正是 LQR/MPC 权重的物理含义。
滚动时域怎么用: 这一拍只执行 u₀* = 1.549 ,u₁* 直接扔掉;下一拍用实测 x₁ = 0.1×1.549 = 0.155 作新初值,重新解一遍同样的问题(此时两步预测的起点变了,最优解也变),如此每拍滚动。真实关节级 MPC 的 Np = 5~10 无法手推,靠 OSQP/HPIPM 毫秒级求解,但「预测 → 优化 → 只执行第一步」的骨架和上面完全一样。
📌 自检: 把数字换成你的电机参数重算一遍(提示:改 A、B 矩阵后,先重推 x₁、x₂ 的表达式,再重解线性方程组)。
12 工程落地与选位:谁跑在哪一层
是什么:人形机器人的分层控制架构
为什么: 本页所有方法都有算力与带宽前提,把它们放到正确的层,才不会出现「在 G431 上跑 500Hz 全身 MPC」式的悲剧。结合本站 04-23 通信与控制算法升级路线 的五阶段路线,频率从内到外逐层下降:
层 频率 / 算力 算法 为什么是它
电流环(关节 MCU) 20 kHz PI + FOC(04-02 ) 电气时间常数微秒级,要求最高带宽;PI 在该尺度鲁棒且便宜
速度/位置环(关节 MCU) 1~2 kHz PID/PD + 前馈,可升 ADRC 单轴 SISO,PID 足够;观测器/ADRC 在此注入抗扰
关节级状态反馈 0.5~1 kHz 极点配置 / LQR + 龙伯格/KF 用上 §3 三状态模型;算力够、需要抗扰与柔顺时上
全身协调(躯干 SoC) 50~500 Hz MPC / WBC 多变量耦合 + ZMP 等硬约束,QP 每拍在线解
任务与学习 10~100 Hz RL 策略 / 规划(04-15 ) 模型难建的部分交给学习,输出给 MPC/关节层执行
怎么做:单关节位置 LQR 调参全流程(可复刻)
Step 1 · 辨识建模
给恒压阶跃,录电流/速度响应,拟合 R、L、Ke (电气)与 J、b(机械);减速比折算到统一端。模型置信度决定后面一切。
Step 2 · 验证能控能观
rank[C]=3、rank[O]=3(§6 代码);不满足说明建模或传感器配置有错,先修模型再谈控制。
Step 3 · 定权重,解 LQR
Bryson 初值:位置允许 0.1 rad → q₁=100;电压预算 24 V → r≈0.0017。固定 r 扫 q₁(10→100→1000),仿真看阶跃与电流指令。
Step 4 · 加观测器(分离原理)
速度差分太脏?上龙伯格观测器/KF 估 x̂,极点比控制快 3~10 倍;K 与 L 独立设计、独立调(§9)。
Step 5 · 仿真 → 半实 → 实车
MuJoCo/自建仿真验证(抗扰、噪声注入、u 不饱和)→ 台架空载/带载 → 实车。实车震荡先查:模型误差、采样延迟、噪声放大——回退一档 q₁ 或降低观测器带宽。
与 ADRC 的关系:两条通往「鲁棒」的路
本页的 LQR/MPC 是「基于模型 」路线:模型越准,性能上限越高;模型失配靠裕度和鲁棒设计兜底。ADRC(04-23 详解 )是「不依赖精确模型 」路线:用扩张状态观测器(ESO)把内外扰的总和实时估计出来直接抵消。
两者不冲突且常常同框:工业主流是「三环 PID + 选择性 ADRC 增强 + 上层 MPC」——关节内环用 ADRC/ESO 抗扰,躯干层用 MPC 处理约束与协调(见 04-09 变体 C)。观测器是共同基石:龙伯格、KF、ESO、SMO 是同一思想(§9)在不同噪声/鲁棒假设下的变体,下一页逐个拆解。
🎤 面试怎么问: 「你的关节模组为什么要用 LQR/MPC,而不是把 PID 调到极致?」——推荐答题结构:先承认 PID 在单轴内环的价值 → 指出全身系统的多变量耦合/约束/不可全测三大痛点 → 给出分层架构(内环 PID/FOC + 上层状态反馈/MPC)→ 落到自己实测过的单关节 LQR 流程。展示「知道边界在哪」比「全是新技术名词」得分高得多。
13 面试高频问答合集(复试/求职速刷)
以下 7 题覆盖本页最高频的面试考点,先自己作答再展开对答案。更多跨学科题库见 06-11 保研复试面试题库 ,机器人控制岗还可结合 06-07 大厂面试专题 冲刺。
Q1 · 能控性的物理意义是什么?怎么判断? 物理意义:在有限时间内,用允许的输入能把系统状态从任意初值转移到任意目标值 ——不是「能动一动」,而是「指哪到哪」。判断:秩判据 rank[B AB … Aⁿ⁻¹B]=n,或 PBH 判据 rank[λI−A, B]=n 对每个特征值成立。物理直觉:输入的「鞭子」能碰到每一个状态模态;碰到不了的模态就是不能控子空间,状态反馈对它无能为力。
Q2 · LQR 的 Q、R 权重怎么给? 先讲物理意义:Q 罚状态偏差(大 = 响应快、硬),R 罚控制量(大 = 省力、柔),两者相对比例决定「性能 vs 能耗」折中。再给方法:Bryson 法则取初值 q=1/xmax ²、r=1/umax ²(归一化量纲)→ 固定 R 扫 Q(×10 步进)→ 看阶跃响应与控制量是否饱和 → 微调 Q 内各分量比例。最后补约束:K 过大导致噪声放大与执行器饱和,真机表现是最终裁判。
Q3 · 分离原理是什么?为什么重要? 对线性系统,「状态反馈 u=−Kx̂ + 状态观测器」组合的闭环极点,恰为控制极点 eig(A−BK) 与观测器极点 eig(A−LC) 的并集——控制器和观测器可以完全独立设计、独立调参 。重要性:把 2n 维耦合设计问题拆成两个 n 维问题,LQG(LQR+KF)因此才可行。加分点:分离原理在 LQG 下「增益最优性分离」仍成立,但 LQR 的 60° 相位裕度保证不再自动保持 ,需要 LTR 恢复。
Q4 · MPC 为什么能处理约束?LQR 为什么不能? MPC 把未来 Np 步写成优化问题:二次代价 + 线性不等式约束 (u∈[umin ,umax ]、ZMP∈支撑多边形),约束直接参与求解,最优解天然可行;问题形式是凸 QP,多项式时间可解。LQR 的解是固定线性律 u=−Kx,没有任何机制保证输出不越界——执行器饱和时闭环特性突变(积分饱和/增益下降),只能事后补偿。一句话:MPC 把「约束」从希望变成硬性条目。
Q5 · 离散化方法有哪些?各用在哪? ①前向欧拉:x[k+1]=x[k]+T·f(x,u),最简单,T 大可能把稳定系统离散成不稳定;②后向欧拉:隐式,无条件稳定、精度低;③Tustin(双线性):s↔z 频域映射,常用于滤波器离散化,有频率畸变需预扭曲;④零阶保持 ZOH:精确解 e^{AT} + 周期内 u 恒定,是控制系统离散化的默认正确选择。采样频率按闭环带宽 10~20 倍取,不是香农 2 倍。
Q6 · 状态空间和传递函数是什么关系?最小实现是什么? G(s)=C(sI−A)⁻¹B+D 是桥梁:状态空间取拉氏变换消去内部状态即得传函。A 的特征值 ⊇ G(s) 的极点;实现不唯一(相似变换不改变传函与特征值),不同实现维数还可不同;维数最小且完全能控+完全能观的实现叫最小实现,等价于传函无零极点对消。对消掉的「隐藏模态」传函上看不见但真实存在,可能造成内部不稳定。
Q7 · 卡尔曼滤波和龙伯格观测器什么关系?Q、R 怎么调? 结构同构:都是「模型预测 + 残差校正」;KF 的增益 Kk 由协方差递推在线计算(时变),在统计假设下均方最优,稳态时退化为定增益龙伯格观测器。调参:Qn (过程噪声)大 = 信传感器、响应快但毛刺多;Rn (测量噪声)大 = 信模型、平滑但滞后;比值定折中,Rn 用传感器静置数据标定,Qn 靠激励实验辨识。注意别和控制 LQR 的 Q、R 混淆。
14 本节自测
1. 状态空间建模时,状态变量的选取原则是?
A. 状态越多越好,把所有物理量都列为状态
B. 选取与能量存储相关的、最小独立变量组(如电感电流、惯量速度)
C. 必须选输出变量本身作为全部状态
D. 状态数量必须等于输入数量
💡 n 阶系统需要且只需 n 个独立状态,首选储能相关量(电容电压/电感电流/位置/速度/温度)。选多了状态不独立、矩阵奇异;状态数与输入数无关。同一系统选法不同得到不同实现,但特征值相同。
2. 系统不完全能控时,关于极点配置的说法正确的是?
A. 仍然可以任意配置全部极点,只是 K 会大一些
B. 极点配置完全不可用,系统无法镇定
C. 不能控的模态无法移动,最多配置能控部分的极点;若不能控模态自身稳定(可镇定),仍可镇定系统
D. 换一个状态变量选取就能变得完全能控
💡 任意配极点 ⇔ 完全能控。不能控模态像「焊死的旋钮」动不了;若它自身渐近稳定(可镇定),仍可用状态反馈镇定其余部分。换状态坐标(相似变换)不改变能控性——那是系统的结构属性。
3. LQR 调参中「固定 R 扫 Q」的物理逻辑是?
A. R 代表执行器预算(电压/电流上限),由硬件定;固定后 Q 增大单调对应「更快更硬」的响应,行为可预测
B. Q 和 R 必须同时调整才能保证稳定
C. R 越大系统响应越快
D. Q 只影响稳态误差,不影响动态
💡 R 是控制量的「价格」,对应硬件预算,适合先定死;之后 Q 增大 = 更不容忍状态偏差 = 响应更快、K 更大(注意饱和与噪声放大)。R 增大是「省力」,响应变慢,选项 C 记反了方向。
4. 关于分离原理,下列说法正确的是?
A. 观测器设计必须先于控制器设计完成
B. 加入观测器后闭环极点会随机漂移
C. 分离原理说明观测器和控制器必须用同一组极点
D. 闭环极点 = 控制极点 eig(A−BK) 与观测器极点 eig(A−LC) 的并集,两者可独立设计
💡 分离原理:u=−Kx̂ 与龙伯格观测器联立后,2n 个闭环极点恰为两组极点的并集,控制律与观测器可完全独立设计。工程顺序(先控制后观测或反之)是流程选择,不是原理约束;观测器极点通常更快(3~10 倍)但不等于同一组。
5. 足式机器人步态控制普遍采用 MPC,最核心的原因是?
A. MPC 的预测模型精度比 LQR 高
B. MPC 能把「ZMP 必须落在支撑多边形内」「力矩有限」等硬约束显式写进优化,每拍滚动求解
C. MPC 不需要数学模型
D. MPC 的计算量比 LQR 更小
💡 双足行走的本质是「倒立摆 + ZMP 硬约束」,约束处理是 MPC 与生俱来的能力(约束直接进 QP),而 LQR 的固定线性律无法保证不越界。MPC 同样依赖模型(选项 C 错),计算量也更大(选项 D 错),模型精度两者共用同一模型(选项 A 无从谈起)。
📌 本节小结: ①现代控制 = 状态空间语言:ẋ=Ax+Bu、y=Cx,状态选储能相关的最小独立变量组,传函 G(s)=C(sI−A)⁻¹B 是其外部投影,实现不唯一、最小实现 ⇔ 能控+能观;②特征值 = 极点 = 稳定性,e^{At} 给出封闭解,离散化默认 ZOH、采样取带宽 10~20 倍;③能控/能观(rank 判据)是设计资格证:不能控就不能任意配极点;④极点配置(Ackermann/place)直给但靠手摆,LQR 把问题换成摆权重 Q、R(Bryson 初值 + 固定 R 扫 Q),自带稳定裕度;⑤状态不可全测就上观测器(龙伯格/KF),分离原理让两者独立设计,LQG=LQR+KF;⑥MPC = 预测模型 + 二次代价 + 硬约束,每拍解 QP、只执行第一拍,ZMP 约束使它成为足式步态标配;⑦落地分层:电流环 PI/FOC → 关节 PID/ADRC → 关节 LQR/观测器 → 躯干 MPC/WBC → 上层 RL。
🤔 思考题:
1. 若把 §3 关节模型的编码器只装在电机端(输出端没有传感器),减速器柔性形变状态还能观吗?这对双编码器方案意味着什么?
2. LQR 设计好的 K 在真机上「抖得厉害」,请列出至少三个可能原因与对应的排查顺序(提示:噪声放大、模型失配、观测器带宽、采样延迟)。
3. 把 §11 的 LIPM 步态 MPC 与 §8 的关节 LQR 组合成完整系统时,两层各自的控制周期、状态量与约束分别是什么?接口上传什么指令?
15 参考来源与延伸资源
以下资源均经核实真实可达(2026-09 核验),按「视频 → 书籍/课程 → 文章 → 工具」排序,⭐ 为优先推荐。
🎬
⭐ DR_CAN【Advanced 控制理论】系列(B站)
中文圈最经典的现代控制入门视频:状态空间、能控能观、观测器、卡尔曼滤波一路讲到分离原理,配合手写推导,播放近 30 万。UP 主为机器人方向博士,同系列还有建模与最优控制专题。
B站视频
⭐ 首推入门
入门
🎬
DR_CAN B站主页(全部控制系列合集)
从【Advanced 控制理论】到非线性控制、最优控制的完整合集入口,适合按合集顺序系统刷完。
B站空间
系统学习
🎬
⭐ Steve Brunton · Control Bootcamp(YouTube 官方播放列表)
华盛顿大学教授的短课(约 80 个 10 分钟小节):线性系统、能控能观、LQR、卡尔曼滤波、鲁棒控制,每讲直击一个概念,是英文世界最快的现代控制总览。
YouTube
⭐ 英文首选
入门~中级
🎬
Control Bootcamp 中文字幕版(B站搬运)
Brunton 课程的 B站字幕合集,不便访问 YouTube 时的替代;B站搜「Steve Brunton 控制」还有多个版本可选。
B站搬运
入门~中级
📘
⭐ MIT · Underactuated Robotics(Russ Tedrake 讲义)
欠驱动机器人控制圣经,免费全文:LQR、轨迹优化、ZMP 步态、全身控制、鲁棒/随机控制,全部带 Drake 可运行示例——本页 §11 步态 MPC 的「下一步深读」。
MIT 课程
⭐ 进阶必读
高级
📘
MIT OCW · 6.241J Dynamic Systems and Control
MIT 研究生级动态系统与控制公开课:状态空间、能控能观、状态反馈与观测器的严格理论版,讲义/作业/考试全套,适合想补数学严谨性的读者。
MIT OCW
研究生级
🧪
⭐ Kalman and Bayesian Filters in Python(rlabbe,免费交互书)
GitHub 19k+ 星的卡尔曼滤波开源教科书:全书 Jupyter 可运行、每张图都能改参数重跑,KF/EKF/UKF/粒子滤波全覆盖,「重直觉、轻证明」,本页 §10 的最佳实操续篇。
GitHub 开源书
⭐ 动手必跑
中级
📄
知乎 · 现代控制理论:状态空间与状态方程
中文社区高赞笔记:状态空间建模、特征值与极点关系、控制器/观测器设计与 LQR 实例,与 DR_CAN 视频互补的文字版。
知乎专栏
入门~中级
📄
知乎 · 跳出课本看 LQR:从公式到代码
专讲「Q、R 权重如何影响控制效果」的实战文章,含调参对照实验——本页 §8 调参实操的展开版。
知乎专栏
中级
📄
CSDN · 状态反馈极点配置:直接法 / 变换法 / Ackermann
CSDN 文章
中级
🛠️
⭐ Python Control Systems Library 官方文档
本页所有 Python 示例使用的开源库:状态空间建模、频域/时域分析、place/lqr/KF/MPC 一应俱全,Matlab 用户的免费平替。
工具文档
⭐ 实验环境
入门必备
🛠️
Control Tutorials for MATLAB and Simulink(密歇根大学)
老牌交互式控制教程:每个概念(状态空间、数字控制、LQR)配 Matlab/Simulink 可复现实验,含直流电机建模等经典案例,与本页关节模型高度对应。
大学官方教程
入门~中级
📅 核验说明: 上述视频 / 课程 / 文章 / 工具链接均于 2026-09 通过检索与访问核验;B站搬运版本可能随时间失效,失效时按对应标题在站内搜索即可找回。