轨迹优化与非线性模型预测控制(NMPC)
一、核心概念对比
1.1 轨迹优化(Trajectory Optimization)
本质:开环最优控制问题,寻找从初始状态到目标状态的最优轨迹。
数学形式:
minu(t)∫t0tfL(x(t),u(t))dt+Φ(x(tf))\min_{u(t)} \int_{t_0}^{t_f} L(x(t), u(t)) dt + \Phi(x(t_f))minu(t)∫t0tfL(x(t),u(t))dt+Φ(x(tf))
s.t. x˙=f(x,u),g(x,u)≤0,h(x,u)=0\text{s.t. } \dot{x} = f(x, u), \quad g(x, u) \leq 0, \quad h(x, u) = 0s.t. x˙=f(x,u),g(x,u)≤0,h(x,u)=0
特点:
- 离线计算:提前规划完整轨迹
- 全局优化:考虑整个时间域的最优性
- 计算密集:可承受较长计算时间
- 无反馈:对扰动敏感
1.2 非线性模型预测控制(NMPC)
本质:闭环反馈控制,在线滚动优化。
数学形式:
minu(⋅)∫tt+TL(x(τ),u(τ))dτ+E(x(t+T))\min_{u(\cdot)} \int_{t}^{t+T} L(x(\tau), u(\tau)) d\tau + E(x(t+T))minu(⋅)∫tt+TL(x(τ),u(τ))dτ+E(x(t+T))
s.t. x˙=f(x,u),x(t)=xmeas,u∈U\text{s.t. } \dot{x} = f(x, u), \quad x(t) = x_{\text{meas}}, \quad u \in \mathcal{U}s.t. x˙=f(x,u),x(t)=xmeas,u∈U
特点:
- 在线优化:实时计算控制输入
- 滚动时域:有限预测时域
- 反馈机制:基于测量状态更新
- 实时性要求:必须在采样时间内求解
二、技术实现对比
2.1 算法框架对比
| 特性 | 轨迹优化 | 非线性MPC |
|---|---|---|
| 计算时机 | 离线,一次性 | 在线,每个采样周期 |
| 优化时域 | 完整轨迹 ([t_0, t_f]) | 滚动时域 ([t, t+T]) |
| 反馈机制 | 无(开环) | 有(闭环) |
| 计算时间 | 分钟/小时级 | 毫秒/秒级 |
| 最优性 | 全局最优 | 局部最优 |
| 鲁棒性 | 对扰动敏感 | 对扰动鲁棒 |
| 应用场景 | 任务规划、路径设计 | 实时控制、轨迹跟踪 |
2.2 求解方法对比
轨迹优化常用方法:
- 直接法:将连续问题离散化为非线性规划(NLP)
- 直接配点法(Direct Collocation)
- 直接多重打靶法(Direct Multiple Shooting)
- 间接法:求解庞特里亚金极大值原理
- 伪谱法:在配点处使用高精度多项式近似
NMPC常用方法:
- 实时迭代(Real-Time Iteration, RTI)
- 显式NMPC:离线计算分段仿射控制律
- 序列二次规划(SQP)在线求解
- 内点法处理路径约束
三、MATLAB实现框架
3.1 轨迹优化实现(直接配点法)
%% 轨迹优化:无人机最小能量轨迹规划
function [traj_opt, info] = trajectory_optimization_direct_collocation()
% 问题定义
prob = struct();
prob.n_states = 4; % [x, y, vx, vy]
prob.n_controls = 2; % [ax, ay]
prob.n_nodes = 50; % 配点数
prob.tf = 10; % 终端时间
% 边界条件
prob.bounds.x0 = [0; 0; 0; 0];
prob.bounds.xf = [10; 10; 0; 0];
prob.bounds.u_min = [-2; -2];
prob.bounds.u_max = [2; 2];
prob.bounds.v_max = 3;
% 代价函数:最小控制能量
prob.cost.integrand = @(x,u) 0.1*(u'*u);
prob.cost.terminal = @(xf) 0;
% 动力学约束
prob.dynamics = @(x,u) [x(3); x(4); u(1); u(2)];
% 路径约束(避障)
prob.path_constraints = @(x) obstacle_constraints(x);
% 直接配点法求解
[traj_opt, info] = solve_direct_collocation(prob);
% 可视化结果
if info.success
plot_trajectory_optimization_results(traj_opt, prob);
end
end
function [traj, info] = solve_direct_collocation(prob)
% 使用MATLAB优化工具箱求解
n_states = prob.n_states;
n_controls = prob.n_controls;
n_nodes = prob.n_nodes;
% 决策变量:所有节点的状态和控制
n_vars = n_nodes * (n_states + n_controls);
x0 = zeros(n_vars, 1);
% 设置优化问题
options = optimoptions('fmincon', ...
'Algorithm', 'interior-point', ...
'Display', 'iter', ...
'MaxIterations', 1000, ...
'MaxFunctionEvaluations', 1e6, ...
'OptimalityTolerance', 1e-6);
% 求解
[x_opt, fval, exitflag, output] = fmincon(...
@(x) trajectory_cost(x, prob), ...
x0, [], [], [], [], ...
prob.lb, prob.ub, ...
@(x) trajectory_constraints(x, prob), ...
options);
% 提取结果
traj = extract_trajectory(x_opt, prob);
info = struct('success', exitflag > 0, 'fval', fval, 'output', output);
end
3.2 非线性MPC实现(实时迭代)
%% 非线性MPC:无人机轨迹跟踪控制
function [mpc_controller] = nonlinear_mpc_controller_design()
% NMPC控制器设计
% 系统参数
sys = struct();
sys.dt = 0.1; % 采样时间
sys.nx = 4; % 状态维度
sys.nu = 2; % 控制维度
sys.N = 10; % 预测时域
% 权重矩阵
sys.Q = diag([10, 10, 1, 1]); % 状态误差权重
sys.R = diag([0.1, 0.1]); % 控制权重
sys.P = diag([20, 20, 2, 2]); % 终端权重
% 非线性动力学(无人机模型)
sys.f = @(x,u) [
x(3); % dx = vx
x(4); % dy = vy
u(1) - 0.1*x(3); % dvx = ax - 阻尼
u(2) - 0.1*x(4) % dvy = ay - 阻尼
];
% 约束
sys.constraints = struct();
sys.constraints.x_min = [-inf; -inf; -3; -3];
sys.constraints.x_max = [inf; inf; 3; 3];
sys.constraints.u_min = [-2; -2];
sys.constraints.u_max = [2; 2];
% 构建NMPC控制器
mpc_controller = struct();
mpc_controller.sys = sys;
mpc_controller.solver = setup_nmpc_solver(sys);
mpc_controller.estimator = setup_state_estimator(sys);
mpc_controller.reference = @(t) generate_reference_trajectory(t);
% 实时迭代参数
mpc_controller.rti_params = struct();
mpc_controller.rti_params.max_iter = 3; % 最大迭代次数
mpc_controller.rti_params.warm_start = true; % 热启动
fprintf('NMPC控制器设计完成\n');
end
function [u_opt, info] = nmpc_step(controller, x_current, t)
% NMPC单步求解
% 获取参考轨迹
ref_traj = controller.reference(t);
% 构建当前优化问题
[nlp_problem, x0] = build_nmpc_problem(...
controller, x_current, ref_traj);
% 实时迭代求解
if controller.rti_params.warm_start
% 使用上一时刻解作为初始猜测
x0 = controller.last_solution;
end
% 求解NLP(使用fmincon或专用求解器)
options = optimoptions('fmincon', ...
'Algorithm', 'sqp', ...
'MaxIterations', controller.rti_params.max_iter, ...
'Display', 'off');
[x_opt, fval, exitflag] = fmincon(...
nlp_problem.cost, x0, ...
nlp_problem.Aineq, nlp_problem.bineq, ...
nlp_problem.Aeq, nlp_problem.beq, ...
nlp_problem.lb, nlp_problem.ub, ...
nlp_problem.nonlcon, options);
% 提取控制输入
u_opt = x_opt(1:controller.sys.nu);
% 保存解用于热启动
controller.last_solution = x_opt;
% 返回信息
info = struct('fval', fval, 'exitflag', exitflag);
end
%% 主控制循环
function [results] = run_nmpc_simulation(controller, T_sim)
% 运行NMPC仿真
sys = controller.sys;
n_steps = ceil(T_sim / sys.dt);
% 初始化
x = zeros(sys.nx, n_steps+1);
u = zeros(sys.nu, n_steps);
t = zeros(1, n_steps+1);
x(:,1) = [0; 0; 0; 0]; % 初始状态
t(1) = 0;
% 性能记录
solve_times = zeros(1, n_steps);
cost_values = zeros(1, n_steps);
% 主循环
for k = 1:n_steps
tic;
% NMPC求解
[u_opt, info] = nmpc_step(controller, x(:,k), t(k));
% 记录求解时间
solve_times(k) = toc;
cost_values(k) = info.fval;
% 应用控制输入(带模拟噪声)
u_noisy = u_opt + 0.01*randn(sys.nu, 1);
u(:,k) = saturate(u_noisy, sys.constraints.u_min, sys.constraints.u_max);
% 模拟系统动态(使用4阶Runge-Kutta)
x(:,k+1) = rk4_integration(sys.f, x(:,k), u(:,k), sys.dt);
% 添加过程噪声
x(:,k+1) = x(:,k+1) + 0.01*randn(sys.nx, 1);
% 更新时间
t(k+1) = t(k) + sys.dt;
% 显示进度
if mod(k, 10) == 0
fprintf('步数 %d/%d, 求解时间: %.3f秒\n', ...
k, n_steps, solve_times(k));
end
end
% 整理结果
results = struct();
results.x = x;
results.u = u;
results.t = t;
results.solve_times = solve_times;
results.cost_values = cost_values;
results.average_solve_time = mean(solve_times);
fprintf('仿真完成,平均求解时间: %.3f秒\n', results.average_solve_time);
end
四、关键技术挑战与解决方案
4.1 共同挑战
| 挑战 | 轨迹优化 | 非线性MPC | 解决方案 |
|---|---|---|---|
| 非凸性 | 路径约束导致非凸 | 动力学非线性导致非凸 | 凸松弛、序列凸规划(SCP) |
| 计算效率 | 高维参数空间 | 实时性要求严格 | 稀疏性利用、代码生成 |
| 数值稳定性 | 长时间积分误差 | 在线优化数值问题 | 自适应网格、正则化 |
| 约束处理 | 复杂状态约束 | 实时约束满足 | 障碍函数、软约束 |
4.2 专用求解器与工具
MATLAB工具箱:
-
轨迹优化:
fmincon:通用非线性规划direct:DIRECT全局优化算法gpoops:高斯伪谱法工具箱
-
非线性MPC:
nlmpc:MATLAB官方NMPC工具箱MPC Toolbox:支持非线性MPCCasADi:符号计算与自动微分(需安装)
第三方工具:
- ACADO:自动控制与动态优化
- ROCKIT:刚体系统轨迹优化
- Drake:MIT机器人工具箱
- FORCES Pro:嵌入式优化求解器
参考代码 轨迹优化和非线性模型预测控制(MPC) www.youwenfan.com/contentcst/160631.html
五、实际应用中的协同策略
5.1 分层控制架构
┌─────────────────┐
│ 任务规划层 │ ← 轨迹优化(离线)
└────────┬────────┘
↓
┌─────────────────┐
│ 轨迹跟踪层 │ ← 非线性MPC(在线)
└────────┬────────┘
↓
┌─────────────────┐
│ 底层控制器 │ ← PID/反馈线性化
└─────────────────┘
5.2 典型工作流程
-
离线阶段(轨迹优化):
- 根据任务要求生成全局最优参考轨迹
- 考虑障碍物、动力学约束、能量最优
- 输出:时间参数化的轨迹 (xref(t),uref(t)x_{\text{ref}}(t), u_{\text{ref}}(t)xref(t),uref(t))
-
在线阶段(非线性MPC):
- 以参考轨迹为跟踪目标
- 实时处理模型不确定性、扰动
- 在线调整轨迹以满足新约束
-
应急处理:
- 当NMPC检测到无法跟踪参考轨迹时
- 触发重新规划(在线轨迹优化)
- 生成新的可行参考轨迹
5.3 性能评估指标
function [metrics] = evaluate_performance(results, reference)
% 计算性能指标
metrics = struct();
% 跟踪误差
tracking_error = results.x(1:2,:) - reference.x(1:2,:);
metrics.rmse_position = sqrt(mean(sum(tracking_error.^2, 1)));
metrics.max_position_error = max(sqrt(sum(tracking_error.^2, 1)));
% 控制能量
control_energy = sum(results.u.^2, 1);
metrics.total_control_energy = sum(control_energy);
% 实时性
metrics.max_solve_time = max(results.solve_times);
metrics.percent_real_time = ...
sum(results.solve_times < results.sys.dt) / length(results.solve_times) * 100;
% 约束违反
constraint_violation = compute_constraint_violation(results);
metrics.max_constraint_violation = max(constraint_violation);
fprintf('性能评估结果:\n');
fprintf(' 位置RMSE: %.3f m\n', metrics.rmse_position);
fprintf(' 最大位置误差: %.3f m\n', metrics.max_position_error);
fprintf(' 控制总能量: %.3f\n', metrics.total_control_energy);
fprintf(' 最大求解时间: %.3f ms\n', metrics.max_solve_time*1000);
fprintf(' 实时性满足率: %.1f%%\n', metrics.percent_real_time);
end
六、前沿研究方向
6.1 学习增强方法
- 神经网络近似:用深度学习近似NMPC优化
- 强化学习结合:RL学习价值函数,MPC执行优化
- 高斯过程学习:学习模型不确定性
6.2 高效求解算法
- 实时迭代SQP:固定计算复杂度
- 显式MPC:离线计算控制律查询表
- 并行计算:GPU加速优化求解
6.3 鲁棒与随机NMPC
- Tube-based MPC:处理有界扰动
- 场景MPC:处理随机不确定性
- 分布ally鲁棒MPC:最坏情况优化
七、实用建议与最佳实践
7.1 选择指南
-
选择轨迹优化当:
- 需要全局最优解
- 计算时间充裕(离线)
- 系统确定性较强
- 作为参考轨迹生成器
-
选择非线性MPC当:
- 需要实时反馈控制
- 系统存在不确定性
- 需要处理扰动
- 在线调整能力重要
7.2 实现建议
- 从简单开始:先实现线性MPC,再扩展到非线性
- 利用稀疏性:NMPC问题天然稀疏,可大幅加速
- 代码生成:对嵌入式系统使用代码生成工具
- 硬件在环测试:在实际硬件上验证实时性
7.3 MATLAB学习资源
-
官方文档:
help nlmpchelp fmincon- Model Predictive Control Toolbox用户指南
-
示例代码:
- MATLAB示例:
mpcNonlinearExample - File Exchange:搜索"NMPC"、“trajectory optimization”
- MATLAB示例:
-
在线课程:
- MathWorks培训:Model Predictive Control
- Coursera:机器人学中的最优控制
总结
轨迹优化和非线性MPC是现代控制系统中两个强大且互补的工具。轨迹优化擅长全局路径规划,为系统提供最优参考;非线性MPC擅长实时反馈控制,确保系统在各种扰动下稳定跟踪。在实际应用中,两者常结合使用:轨迹优化提供"战略规划",非线性MPC负责"战术执行"。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)