1. 项目概述:机械臂与倒立摆的MPC控制实践
在工业自动化和机器人控制领域,模型预测控制(MPC)因其出色的多变量处理能力和约束管理特性,正逐渐成为复杂系统控制的首选方案。这次我将分享一个基于MATLAB实现的完整控制框架,涵盖二自由度机械臂、六自由度机械臂以及倒立摆系统的MPC控制实现。这个项目最初是为了解决实验室机械臂轨迹跟踪中的抖动问题而开发的,经过多次迭代后形成了一套通用性较强的控制方案。
这套系统的核心价值在于:通过模块化设计将复杂的MPC算法工程化,使得即使没有深厚控制理论背景的工程师也能快速部署应用。我在开发过程中特别注重三个实用特性:一是参数可调节性强,所有关键控制参数都开放为接口;二是可视化程度高,内置了丰富的实时监控图表;三是计算效率优化,通过合理的线性化处理使MPC能够在普通工控机上实时运行。
提示:虽然本文以二自由度机械臂为例讲解,但所有模块设计都考虑了向更高自由度系统的扩展性。文末我会特别分享六自由度机械臂实现时的关键调整点。
2. 系统架构设计解析
2.1 整体控制流程
系统的运行遵循典型的MPC控制循环,但针对机械臂控制做了特殊优化。完整的工作流程如下:
-
初始化阶段:加载机械臂的物理参数(质量、长度、惯量等),设置MPC控制器的预测时域、权重矩阵等参数。这里我建议将ROB结构体参数单独保存为.mat文件,方便不同机械臂配置的切换。
-
参考轨迹生成:根据目标位置生成期望的关节角度轨迹。实际项目中我发现,采用五次多项式插值比简单的线性插值能获得更平滑的运动曲线,特别是在需要经过多个路径点时。
-
实时控制循环:
- 通过编码器获取当前关节状态(角度、角速度)
- 调用动力学模块计算当前状态下的M、C、G矩阵
- 构建状态空间方程并离散化(采样时间dt=0.01s是个经验值)
- 求解QP优化问题得到最优控制序列
- 取第一个控制量输出到执行机构
- 使用RK4积分更新系统状态
-
数据记录与可视化:除了常规的角度跟踪曲线,我还添加了能量消耗统计和计算时间监控,这对评估控制器的实时性很有帮助。
2.2 模块化设计优势
将系统分解为六个核心模块带来了三个显著好处:
-
调试效率提升:当跟踪误差偏大时,可以单独测试动力学模型是否正确;当控制力矩异常时,可以先检查QP问题的构建过程。这种隔离排查的方式比整体调试节省至少40%的时间。
-
功能扩展方便:例如要添加碰撞检测功能,只需在新的模块中实现检测算法,然后通过主控制模块协调即可,不需要修改原有模块。
-
代码复用性强:动力学模型模块(RobDyn.m)和正运动学模块(fkRob.m)可以直接复用到其他类型的机械臂项目中,只需调整物理参数。
3. 核心算法实现细节
3.1 动力学建模关键点
机械臂的动力学方程通常表示为:
M(q)q̈ + C(q,q̇)q̇ + G(q) = τ
在RobDyn.m中实现时,有几个易错点需要特别注意:
- 科里奥利矩阵的计算:必须保证矩阵满足q̇ᵀ(Ṁ-2C)q̇=0的性质,否则能量不守恒会导致仿真发散。我采用的Christoffel符号计算方法如下:
matlab复制% 计算Christoffel符号
for k = 1:2
for j = 1:2
for i = 1:2
c(i,j,k) = 0.5*(diff(M(k,j),q(i)) + diff(M(k,i),q(j)) - diff(M(i,j),q(k)));
end
end
end
-
惯性矩阵的对称正定性:在代码中应添加断言检查M矩阵的特征值,避免因参数错误导致数值问题。我在实际项目中遇到过因单位弄错(cm vs m)导致矩阵奇异的情况。
-
重力项的方向:注意重力加速度g的符号约定,通常取负值表示向下。这个错误非常隐蔽,会导致机械臂在重力场中"向上坠落"的诡异现象。
3.2 MPC控制器实现技巧
RobDynMPC.m是系统的智能核心,其实现有几个工程优化点值得分享:
-
状态空间离散化:采用零阶保持法离散连续系统时,对于采样时间dt的选择很有讲究。我的经验公式是dt应小于系统最小时间常数的1/10。对于典型机械臂,0.01-0.05s都是可行范围。
-
QP问题构建:将标准MPC优化问题:
min Σ(xᵀQx + uᵀRu)
s.t. xₖ₊₁ = Axₖ + Buₖ
u_min ≤ u ≤ u_max
转化为quadprog所需的格式时,需要注意:
matlab复制H = blkdiag(kron(eye(N),Q), kron(eye(N),R)); % 块对角矩阵构造
f = zeros(N*(nx+nu),1); % 线性项设为0
Aeq = [kron(eye(N),-B), kron(diag(ones(N-1,1),-1),-A), eye(N*nx)]; % 等式约束矩阵
- 实时线性化处理:与传统LQR不同,MPC在每个控制周期都重新线性化系统。这里我采用数值微分而非符号求导,计算效率提升约30%:
matlab复制[A,B] = numericalJacobian(@(x,u) armDynamics(x,u,ROB), x0, u0);
- 热启动优化:利用上一周期的优化序列作为本次优化的初始猜测,可以减少约40%的QP求解时间。这在硬件资源有限的场景特别有用。
3.3 轨迹生成优化
getTraj.m模块虽然看似简单,但生成合理的参考轨迹对控制性能影响巨大。我总结了三点经验:
- 速度规划:避免阶跃式的角度指令,应采用梯形或S型速度曲线。对于二自由度机械臂,最大角速度建议设置为:
matlab复制w_max = min(2*pi/3, 0.8*sqrt(tau_max/J_eff)); % 考虑执行器力矩限制
- 路径点过渡:当需要经过多个中间点时,采用五次多项式插值可保证加速度连续:
matlab复制% 五次多项式系数计算
A = [1 t0 t0^2 t0^3 t0^4 t0^5;
0 1 2*t0 3*t0^2 4*t0^3 5*t0^4;
0 0 2 6*t0 12*t0^2 20*t0^3;
1 tf tf^2 tf^3 tf^4 tf^5;
0 1 2*tf 3*tf^2 4*tf^3 5*tf^4;
0 0 2 6*tf 12*tf^2 20*tf^3];
b = [q0; w0; a0; qf; wf; af];
coeff = A\b;
- 奇异点规避:对于六自由度机械臂,需要在轨迹规划阶段就避免接近奇异构型。可以通过条件数监控提前调整路径。
4. 仿真与实验结果分析
4.1 二自由度机械臂测试
在默认参数下(m1=1kg, m2=0.8kg, l1=0.5m, l2=0.4m),系统表现出以下特性:
-
阶跃响应:从[0,0]到[π/2, π/2]的阶跃跟踪中,调节时间约1.2秒,超调量<5%。值得注意的是,第二个关节由于负载较小,响应速度明显更快。
-
能量消耗:完成一次π/2转动,两个关节的总能量消耗约为15J(Q=diag([10,10,1,1]), R=0.1*eye(2)时)。
-
计算负荷:在Intel i5-8250U上,单次MPC优化平均耗时8ms,满足实时性要求。
4.2 参数敏感性研究
通过改变权重矩阵发现:
- 增大Q的对角元素(状态权重)能减少跟踪误差,但会导致控制量剧烈波动
- 增大R元素(控制权重)可使运动更平滑,但响应速度下降
- 交叉权重项(如Q(1,2))对耦合较强的机械臂特别重要
注意:实际调试时应先固定R调Q,待跟踪性能满意后再微调R。我常用的起始点为Q=diag([10,10,1,1]),R=0.1*eye(nu)。
4.3 六自由度机械臂扩展
将系统扩展到六自由度时,需要特别注意:
-
计算复杂度:预测时域N需要适当减小(通常取5-10),否则QP问题规模会爆炸式增长。可以采用稀疏矩阵技术优化。
-
动力学耦合:高自由度机械臂的耦合效应更显著,建议在状态权重Q中增加关节间耦合项的权重。
-
奇异构型:需要在轨迹规划阶段加入雅可比矩阵条件数检查,避免接近奇异位置。
5. 工程实践中的挑战与解决方案
5.1 实时性保障
在实际部署中,我们遇到了MPC计算延迟导致控制性能下降的问题。通过以下优化将计算时间缩短了60%:
- 代码向量化:将for循环改为矩阵运算,特别是M、C矩阵的计算部分。
- QP求解器选择:相比MATLAB内置的quadprog,OSQP求解器速度更快且内存占用更低。
- 降阶模型:对于六自由度机械臂,在不影响精度的前提下采用模态截断方法降阶。
5.2 参数辨识技巧
机械臂的动力学参数(特别是惯量)往往难以准确测量。我们开发了一套基于激励轨迹的最小二乘辨识方法:
- 设计持续激励的参考轨迹(如扫频正弦信号)
- 记录关节角度和驱动电流数据
- 建立线性回归模型:Y = Φθ
- 通过伪逆求解:θ = (ΦᵀΦ)⁻¹ΦᵀY
matlab复制% 示例参数辨识代码
Phi = computeRegressor(q, dq, ddq); % 回归量计算
Y = tau_measured; % 测量力矩
theta = pinv(Phi)*Y; % 参数估计
5.3 硬件在环测试
在将算法部署到真实机械臂前,我们采用dSPACE系统进行硬件在环(HIL)测试,发现了几个关键问题:
- 执行器饱和:仿真中忽略的电机转矩限制在实际中会导致积分饱和,通过加入反饱和补偿解决。
- 测量噪声:编码器噪声会干扰状态估计,添加卡尔曼滤波器后性能显著改善。
- 通信延迟:CAN总线的传输延迟导致控制量不同步,采用Smith预估器补偿后效果良好。
6. 进阶应用:倒立摆控制
将相同的MPC框架应用于倒立摆控制时,需要特别注意:
- 平衡点线性化:倒立摆在直立位置是本质不稳定的,必须在每个控制周期重新线性化。
- 状态约束:小车位移必须限制在轨道长度内,这需要在QP问题中添加不等式约束。
- 抗摆策略:初始摆动能量较大时,常规MPC可能失效,我们采用能量泵入策略先稳定摆动幅度。
倒立摆的MPC实现与机械臂的主要区别在于状态方程的形式:
matlab复制% 倒立摆线性化模型
A = [0 1 0 0;
(M+m)*g/(M*l) 0 0 0;
0 0 0 1;
-m*g/M 0 0 0];
B = [0; -1/(M*l); 0; 1/M];
在实际测试中,MPC控制器能够稳定倒立摆,即使受到脉冲干扰(等效于施加0.5N·s的冲量)后,也能在1秒内恢复平衡位置。