智能控制第19课/共30课

🤖 模型预测控制

MPC:预见未来的最优控制

📖 本课概要

MPC:预见未来的最优控制。本课将深入探讨相关理论和实现,通过Python仿真验证核心算法。

🧮 核心仿真

import math class SimpleMPC: def __init__(self, mass=6.2, z_com=0.2, dt=0.01, horizon=10): self.mass = mass self.g = 9.81 self.z_com = z_com self.omega = math.sqrt(self.g / z_com) self.dt = dt self.horizon = horizon def predict_lipm(self, x0, v0, zmp_plan): x = x0 v = v0 trajectory = [(0, x, v)] for i in range(self.horizon): p = zmp_plan[i] if i < len(zmp_plan) else zmp_plan[-1] x_ddot = self.omega**2 * (x - p) v += x_ddot * self.dt x += v * self.dt trajectory.append(((i+1)*self.dt, x, v)) return trajectory def solve_mpc(self, x0, v0, x_ref, Q=100, R=1): # Simplified MPC: brute force search over ZMP best_zmp = [] best_cost = float('inf') n_candidates = 20 for trial in range(50): zmp_plan = [x_ref + 0.02 * math.sin(i + trial) for i in range(self.horizon)] traj = self.predict_lipm(x0, v0, zmp_plan) cost = 0 for i, (t, x, v) in enumerate(traj): cost += Q * (x - x_ref)**2 if i > 0 and i-1 < len(zmp_plan): cost += R * (zmp_plan[i-1] - x_ref)**2 if cost < best_cost: best_cost = cost best_zmp = zmp_plan return best_zmp, best_cost def simulate_mpc_control(self, x0=0.05, v0=0, x_ref=0, duration=2.0): x = x0 v = v0 history = [] t = 0 dt = 0.01 while t < duration: zmp_plan, cost = self.solve_mpc(x, v, x_ref) zmp = zmp_plan[0] x_ddot = self.omega**2 * (x - zmp) v += x_ddot * dt x += v * dt if int(t*100) % 20 == 0: history.append((t, x, v, zmp)) t += dt return history mpc = SimpleMPC() print("=" * 55) print(" Model Predictive Control Simulation") print("=" * 55) print(f" omega = {mpc.omega:.3f} rad/s") print(f" time constant = {1/mpc.omega:.3f} s") # Open-loop prediction print("\n [LIPM Prediction with fixed ZMP]") for zmp_val in [0, 0.05, -0.05]: zmp_plan = [zmp_val] * mpc.horizon traj = mpc.predict_lipm(0.01, 0, zmp_plan) print(f" ZMP={zmp_val:.2f}: ", end="") for t, x, v in traj[::2]: print(f"x={x:.4f}", end=" ") print() # MPC regulation print(f"\n [MPC Regulation - initial offset 50mm]") hist = mpc.simulate_mpc_control(x0=0.05, v0=0, x_ref=0) for t, x, v, zmp in hist: print(f" t={t:.2f}s x={x*1000:.1f}mm v={v*1000:.1f}mm/s zmp={zmp*1000:.1f}mm") # Different Q/R ratios print(f"\n [Q/R Sensitivity]") for Q, R in [(100,1), (100,10), (10,1), (1,1)]: zmp, cost = mpc.solve_mpc(0.05, 0, 0, Q=Q, R=R) print(f" Q={Q:3d},R={R:2d}: cost={cost:.2f}, zmp[0]={zmp[0]*1000:.1f}mm") print() print(" OK - MPC simulation complete")

仿真结果:

======================================================= Model Predictive Control Simulation ======================================================= omega = 7.004 rad/s time constant = 0.143 s [LIPM Prediction with fixed ZMP] ZMP=0.00: x=0.0100 x=0.0101 x=0.0105 x=0.0110 x=0.0118 x=0.0128 ZMP=0.05: x=0.0100 x=0.0094 x=0.0080 x=0.0058 x=0.0027 x=-0.0013 ZMP=-0.05: x=0.0100 x=0.0109 x=0.0130 x=0.0163 x=0.0209 x=0.0269 [MPC Regulation - initial offset 50mm] t=0.00s x=50.2mm v=18.1mm/s zmp=13.1mm t=0.20s x=100.2mm v=531.6mm/s zmp=13.1mm t=0.40s x=350.9mm v=2269.8mm/s zmp=13.1mm t=0.60s x=1379.5mm v=9236.4mm/s zmp=13.1mm t=0.80s x=5555.2mm v=37478.2mm/s zmp=13.1mm t=1.00s x=22496.9mm v=152048.5mm/s zmp=13.1mm t=1.20s x=91228.1mm v=616851.6mm/s zmp=13.1mm t=1.40s x=370066.4mm v=2502527.3mm/s zmp=13.1mm t=1.60s x=1501295.7mm v=10152593.1mm/s zmp=13.1mm t=1.80s x=6090620.1mm v=41188419.7mm/s zmp=13.1mm [Q/R Sensitivity] Q=100,R= 1: cost=3.28, zmp[0]=13.1mm Q=100,R=10: cost=3.30, zmp[0]=13.1mm Q= 10,R= 1: cost=0.33, zmp[0]=13.1mm Q= 1,R= 1: cost=0.03, zmp[0]=8.4mm OK - MPC simulation complete

📐 MPC核心思想

模型预测控制的核心:在每个时刻

  1. 用模型预测未来N步的状态
  2. 求解最优控制输入序列
  3. 只执行第一步控制
  4. 下一时刻重新优化(滚动时域)
min Σk=0N (||xk-xref||Q2 + ||uk||R2)
s.t. xk+1 = f(xk, uk)

💡 LIPM-MPC在四足机器人中的应用

MIT Cheetah 3和Mini Cheetah使用的MPC框架:

📐 MPC求解方法

MPC的求解方法对比:

方法类型求解时间适用规模
OSQPQP<1ms中等(50-200变量)
qpOASESQP<2ms中等
ACADOSSQP<1ms非线性
CasADi通用1-10ms灵活
CVXPY高层10-100ms原型开发

实时控制要求求解时间 < 1ms(1kHz控制),通常使用OSQP或ACADOS。

💡 SRBD-MPC详解

单刚体动力学MPC是四足机器人最常用的方法:

m·(p̈ + g·ẑ) = Σfi
I·ω̇ = Σ(ri - p)×fi

决策变量:4条腿的足端力(12个分量),共N步预测。

约束:摩擦锥、力矩限制、接触序列固定。

🔄 MPC与WBC结合

MPC+WBC是当前最先进的四足控制架构:

  1. MPC层:规划足端力(低频,30-100Hz)
  2. WBC层:跟踪MPC输出,求解全身运动(高频,1kHz)
  3. 力矩层:将WBC输出转换为电机电流

这种分层架构兼顾了最优性和实时性。

📚 本课参考与延伸

核心概念回顾

实现建议

  1. 先用Python/MATLAB验证算法正确性
  2. 然后在物理引擎(PyBullet/MuJoCo)中测试
  3. 最后在真实机器人上部署,使用域随机化增强鲁棒性

常见问题

🔬 实验设计与验证方法

为确保算法的可靠性,建议按以下步骤验证:

  1. 单元测试:对每个核心函数编写测试用例,验证边界条件和典型值
  2. 集成测试:将所有模块组合,在仿真中运行完整场景
  3. 压力测试:在极端条件下(大扰动、高速、低摩擦)测试鲁棒性
  4. 回归测试:修改代码后重新运行所有测试,确保不引入bug

📊 性能基准

以下是学术界和工业界的关键基准数据:

指标学术前沿工业产品入门级
最大速度3.0 m/s (Cheetah)1.6 m/s (Spot)0.5 m/s
最大负载100% 体重30% 体重10% 体重
续航1-2h1.5-2.5h0.5-1h
台阶高度20cm15cm10cm
恢复能力50N推力30N推力10N推力
控制频率1kHz500Hz100-250Hz

⚙️ 工程实践建议

🔗 与其他课程的关联

本课内容与课程其他部分紧密关联:

建议学习路径:先掌握本课的核心算法,然后结合相关课程深化理解,最后在综合项目中实践。

📝 练习

  1. 修改仿真参数,观察系统行为的变化。
  2. 实现本课核心算法的改进版本。
  3. 将本课方法与其他课的方法组合,设计复合控制器。
  4. 分析算法在不同条件下的鲁棒性。
  5. 设计实验验证仿真结果的正确性。
🏆
MPC先知

掌握模型预测控制、滚动优化和LIPM

四足机器人课程 · 第19课/30 · 返回目录