在移动机器人控制领域,如何让机器人在存在传感器噪声和执行器噪声的情况下准确到达并稳定在目标位置,一直是个颇具挑战性的问题。传统方法往往将状态估计和控制设计分开处理,这种"先估计后控制"的分步策略在双重噪声环境下表现欠佳。我们提出了一种创新性的解决方案——将模型预测控制(MPC)与滚动时域估计(MHE)深度集成,形成一个闭环的"估计-控制"联合优化框架。
这个方案的核心思想是:不再将噪声视为需要单独处理的干扰因素,而是将其作为优化问题的一部分,通过联合优化来同时处理状态估计和控制决策。这种方法特别适合处理移动机器人在复杂环境中的定位与控制问题,比如自动驾驶车辆的轨迹跟踪、工业AGV的精确停靠等场景。
提示:本文介绍的MPC-MHE集成框架需要一定的控制理论基础,但我们会尽量用直观的方式解释关键概念。实际操作部分基于Matlab实现,读者可以结合提供的代码进行实践。
模型预测控制(MPC)是一种基于模型的前馈-反馈控制策略,其核心是在每个控制周期解决一个有限时域的开环最优控制问题。具体流程包括:
滚动时域估计(MHE)可以看作是MPC的对偶问题,它利用过去一段时间内的观测数据来估计当前系统状态。与卡尔曼滤波等传统估计方法相比,MHE能够显式处理系统约束,更适合非线性系统。
我们设计的MPC-MHE集成框架具有以下创新点:
双重噪声建模:同时考虑传感器噪声v_k~N(0,R)和执行器噪声w_k~N(0,Q),其中R和Q分别是测量噪声和过程噪声的协方差矩阵。
联合优化目标函数:
code复制min Σ(||x_k - x_s||²_Q + ||u_k||²_R) + Σ(||v_k||²_R^-1 + ||w_k||²_Q^-1)
前两项是MPC的常规代价,后两项是MHE的代价,实现了估计与控制的统一优化。
闭环信息流:构建了"传感器→MHE→MPC→执行器→系统→传感器"的完整闭环,每个环节都考虑噪声影响。
对于非线性系统模型,我们采用多重打靶法将连续时间最优控制问题转化为非线性规划问题(NLP):
这种方法相比直接转录法计算量更小,更适合实时控制应用。
首先定义移动机器人的动力学模型。我们采用独轮车模型作为示例:
matlab复制function dx = robotModel(x, u)
% 状态: x = [px; py; theta]
% 控制: u = [v; omega]
dx = [u(1)*cos(x(3));
u(1)*sin(x(3));
u(2)];
end
噪声参数配置:
matlab复制% 过程噪声协方差(执行器噪声)
Q = diag([0.01, 0.01]);
% 测量噪声协方差(传感器噪声)
R = diag([0.1, 0.05]);
% 预测时域
N = 10;
% 估计时域
Ne = 5;
滚动时域估计器的核心是构建并求解以下优化问题:
matlab复制% 使用CasADi创建优化问题
opti = casadi.Opti();
% 定义优化变量
X_est = opti.variable(3, Ne+1); % 估计状态序列
U_est = opti.variable(2, Ne); % 估计控制序列
V_est = opti.variable(2, Ne); % 测量噪声估计
W_est = opti.variable(2, Ne); % 过程噪声估计
% 构建代价函数
cost = 0;
for k = 1:Ne
% 模型一致性约束
opti.subject_to(X_est(:,k+1) == robotModel(X_est(:,k), U_est(:,k)+W_est(:,k)));
% 测量一致性约束
opti.subject_to(Z_meas(:,k) == measurementModel(X_est(:,k)) + V_est(:,k));
% 代价函数项
cost = cost + V_est(:,k)'*inv(R)*V_est(:,k) + W_est(:,k)'*inv(Q)*W_est(:,k);
end
% 求解
opti.minimize(cost);
opti.solver('ipopt');
sol = opti.solve();
MPC控制器的核心代码如下:
matlab复制% 初始化优化问题
opti = casadi.Opti();
% 定义优化变量
X = opti.variable(3, N+1); % 状态序列
U = opti.variable(2, N); % 控制序列
% 初始状态约束
opti.subject_to(X(:,1) == x_current);
% 构建代价函数和约束
cost = 0;
for k = 1:N
% 系统动力学约束
opti.subject_to(X(:,k+1) == robotModel(X(:,k), U(:,k)));
% 控制量约束
opti.subject_to(-umax <= U(:,k) <= umax);
% 状态代价
cost = cost + (X(:,k)-xs)'*Qx*(X(:,k)-xs);
% 控制代价
cost = cost + U(:,k)'*Qu*U(:,k);
end
% 终端代价
cost = cost + (X(:,N+1)-xs)'*Qf*(X(:,N+1)-xs);
% 求解
opti.minimize(cost);
opti.solver('ipopt');
sol = opti.solve();
将MHE和MPC集成为闭环系统的关键步骤:
matlab复制while norm(x_actual - xs) > tolerance
% 1. 获取带噪声的测量值
z = measurementModel(x_actual) + mvnrnd(zeros(2,1), R)';
% 2. MHE状态估计
x_est = solveMHE(z_history, u_history);
% 3. MPC计算控制量
u = solveMPC(x_est);
% 4. 施加带噪声的控制
x_actual = robotModel(x_actual, u + mvnrnd(zeros(2,1), Q)');
% 5. 更新历史数据
z_history = [z_history(:,2:end), z];
u_history = [u_history(:,2:end), u];
end
我们在Matlab中进行了大量仿真实验,比较了三种方案:
关键性能指标对比:
| 指标 | 无噪声 | KF+MPC | MPC-MHE |
|---|---|---|---|
| 稳态误差(m) | 0.001 | 0.152 | 0.032 |
| 调节时间(s) | 4.2 | 6.8 | 5.1 |
| 控制量波动(方差) | 0.003 | 0.125 | 0.041 |
从结果可以看出,MPC-MHE方法在双重噪声环境下显著优于传统分步方法,稳态误差减少了79%,控制波动降低了67%。
图1展示了三种情况下的机器人运动轨迹:
可以明显观察到,MPC-MHE方法(蓝色)更接近理想轨迹,特别是在接近目标点时表现出更好的稳定性。而传统方法(红色)在目标点附近持续振荡。
在Intel i7-11800H处理器上测试:
这意味着该算法可以支持约33Hz的控制频率,满足大多数移动机器人实时控制需求。通过代码优化(如热启动、稀疏性利用等),还可以进一步提高运行效率。
经过大量实验,我们总结了以下参数整定经验:
预测时域N:通常选择3-20步。太短会导致近视优化,太长增加计算负担。建议从N=10开始调整。
代价函数权重:
噪声协方差:
matlab复制% 好的初始猜测方法
Q = diag([(0.1*umax(1))^2, (0.1*umax(2))^2]); % 过程噪声
R = diag([(0.05*range_max)^2, (0.1*angle_max)^2]); % 测量噪声
在实际应用中可能会遇到以下问题:
求解器失败:
opti.set_initial提供更好的初始猜测振荡现象:
实时性不足:
本框架可以扩展到更复杂的应用场景:
多机器人协同控制:将状态向量扩展为所有机器人状态的拼接,协调优化。
动态避障:在MPC约束中加入障碍物约束,使用势场法或优化障碍。
参数自适应:在线更新噪声协方差Q和R,适应不同环境条件。
视觉伺服控制:将视觉特征直接作为观测变量,构建基于图像的MPC-MHE。
我们提供了完整的Matlab实现代码,包含以下模块:
main_simulation.mrobotModel.msolveMHE.msolveMPC.mplotResults.m使用步骤:
main_simulation.m开始仿真parameters.m调整系统参数代码支持以下自定义配置:
对于想深入研究的读者,可以从以下几个方面进行扩展: