一、理论基础
1.1 航天器相对运动模型(Clohessy-Wiltshire方程)
航天器交会相对运动通常采用Clohessy-Wiltshire(C-W)方程描述。在目标航天器轨道坐标系(RTN坐标系)中,追踪航天器相对运动方程为:
x¨=3n2x+2ny˙+axy¨=−2nx˙+ayz¨=−n2z+az \begin{aligned} \ddot{x} &= 3n^2x + 2n\dot{y} + a_x \\ \ddot{y} &= -2n\dot{x} + a_y \\ \ddot{z} &= -n^2z + a_z \end{aligned} x¨y¨z¨=3n2x+2ny˙+ax=−2nx˙+ay=−n2z+az
其中:
- x,y,zx,y,zx,y,z:径向、切向、法向相对位置
- x˙,y˙,z˙\dot{x},\dot{y},\dot{z}x˙,y˙,z˙:相对速度
- ax,ay,aza_x,a_y,a_zax,ay,az:控制加速度
- n=μ/a3n = \sqrt{\mu/a^3}n=μ/a3 :轨道角速度(μ\muμ为地球引力常数,aaa为轨道半长轴)
1.2 状态空间离散化
将C-W方程转化为状态空间形式:
x˙=Acx+Bcu \dot{\mathbf{x}} = A_c\mathbf{x} + B_c\mathbf{u} x˙=Acx+Bcu
其中状态向量 x=[x,y,z,x˙,y˙,z˙]T\mathbf{x} = [x, y, z, \dot{x}, \dot{y}, \dot{z}]^Tx=[x,y,z,x˙,y˙,z˙]T,控制输入 u=[ax,ay,az]T\mathbf{u} = [a_x, a_y, a_z]^Tu=[ax,ay,az]T。
离散化(采样时间TsT_sTs):
x(k+1)=Ax(k)+Bu(k) \mathbf{x}(k+1) = A\mathbf{x}(k) + B\mathbf{u}(k) x(k+1)=Ax(k)+Bu(k)
1.3 分布式模型预测控制(DMPC)原理
DMPC将多航天器协同控制问题分解为局部优化子问题。每个航天器基于自身状态和邻居信息,求解局部MPC问题,通过通信协调实现全局目标。
DMPC优势:
- 降低计算复杂度(相比集中式MPC)
- 提高系统鲁棒性(局部故障不影响全局)
- 减少通信负担(仅需邻居信息交换)
二、DMPC算法框架
2.1 系统架构
通信
通信
通信
航天器1
航天器2
航天器3
局部MPC优化
局部MPC优化
局部MPC优化
全局协同
2.2 局部MPC优化问题
对于第iii个航天器,在时刻kkk求解:
minui∑t=0Np−1(∥xi(k+t∣k)−xiref∥Q2+∥ui(k+t∣k)∥R2)+∑j∈Ni∥xi(k+Np∣k)−xj(k+Np∣k)∥P2s.t.xi(k+t+1∣k)=Axi(k+t∣k)+Bui(k+t∣k)umin≤ui(k+t∣k)≤umaxxmin≤xi(k+t∣k)≤xmax \begin{aligned} \min_{\mathbf{u}i} & \sum{t=0}^{N_p-1} \left( \|\mathbf{x}_i(k+t|k) - \mathbf{x}_i^{ref}\|_Q^2 + \|\mathbf{u}_i(k+t|k)\|R^2 \right) \\ & + \sum{j\in\mathcal{N}_i} \|\mathbf{x}_i(k+N_p|k) - \mathbf{x}_j(k+N_p|k)\|_P^2 \\ \text{s.t.} & \quad \mathbf{x}_i(k+t+1|k) = A\mathbf{x}i(k+t|k) + B\mathbf{u}i(k+t|k) \\ & \quad \mathbf{u}{min} \leq \mathbf{u}i(k+t|k) \leq \mathbf{u}{max} \\ & \quad \mathbf{x}{min} \leq \mathbf{x}i(k+t|k) \leq \mathbf{x}{max} \end{aligned} uimins.t.t=0∑Np−1(∥xi(k+t∣k)−xiref∥Q2+∥ui(k+t∣k)∥R2)+j∈Ni∑∥xi(k+Np∣k)−xj(k+Np∣k)∥P2xi(k+t+1∣k)=Axi(k+t∣k)+Bui(k+t∣k)umin≤ui(k+t∣k)≤umaxxmin≤xi(k+t∣k)≤xmax
其中:
- NpN_pNp:预测时域
- Ni\mathcal{N}_iNi:航天器iii的邻居集合
- Q,R,PQ,R,PQ,R,P:权重矩阵(QQQ状态误差,RRR控制代价,PPP终端协同代价)
三、MATLAB代码实现
3.1 主程序框架
matlab
%% 航天器交会分布式模型预测控制(DMPC)主程序
clear; clc; close all;
% 1. 系统参数
n = 6; % 状态维度(位置+速度)
m = 3; % 控制维度(三轴加速度)
N_agents = 3; % 航天器数量
Np = 10; % 预测时域
Nc = 5; % 控制时域
Ts = 60; % 采样时间(秒)
a = 6725000; % 轨道半长轴(米)
mu = 3.986e14; % 地球引力常数
n_orb = sqrt(mu/a^3); % 轨道角速度
% 2. 连续时间C-W方程矩阵
Ac = [0, 0, 0, 1, 0, 0;
0, 0, 0, 0, 1, 0;
0, 0, 0, 0, 0, 1;
3*n_orb^2, 0, 0, 0, 2*n_orb, 0;
0, 0, 0, -2*n_orb, 0, 0;
0, 0, -n_orb^2, 0, 0, 0];
Bc = [zeros(3,3); eye(3)];
% 3. 离散化(零阶保持)
sysc = ss(Ac, Bc, eye(n), zeros(n,m));
sysd = c2d(sysc, Ts);
A = sysd.A;
B = sysd.B;
% 4. 权重矩阵
Q = 0.1 * eye(n); % 状态误差权重
R = 0.001 * eye(m); % 控制代价权重
P = Np^2 * eye(n); % 终端协同权重
% 5. 约束
u_min = -3.0 * ones(m,1); % 控制下限(m/s²)
u_max = 3.0 * ones(m,1); % 控制上限
x_min = [-1000; -1000; -1000; -10; -10; -10]; % 状态下限
x_max = [1000; 1000; 1000; 10; 10; 10]; % 状态上限
% 6. 初始状态和目标状态
x0 = cell(N_agents,1);
x_ref = cell(N_agents,1);
for i = 1:N_agents
% 初始位置分散,目标位置汇聚
x0{i} = [100*(i-1); 50*(i-1); 30*(i-1); 0; 0; 0];
x_ref{i} = [0; 0; 0; 0; 0; 0]; % 交会点
end
% 7. 通信拓扑(环形)
adj_matrix = [0, 1, 1; 1, 0, 1; 1, 1, 0]; % 全连接
% 8. DMPC仿真
T_sim = 100; % 仿真步数
[x_history, u_history] = dmc_simulation(A, B, Q, R, P, Np, Nc, ...
x0, x_ref, adj_matrix, ...
u_min, u_max, x_min, x_max, T_sim);
% 9. 结果可视化
plot_results(x_history, u_history, Ts, N_agents);
3.2 DMPC核心函数
matlab
function [x_history, u_history] = dmc_simulation(A, B, Q, R, P, Np, Nc, ...
x0, x_ref, adj_matrix, ...
u_min, u_max, x_min, x_max, T_sim)
% DMPC主仿真函数
N_agents = length(x0);
n = size(A,1);
m = size(B,2);
% 初始化
x_history = zeros(n, T_sim, N_agents);
u_history = zeros(m, T_sim, N_agents);
x_current = x0;
for k = 1:T_sim
% 每个航天器并行求解局部MPC问题
u_opt = cell(N_agents,1);
for i = 1:N_agents
% 获取邻居信息
neighbors = find(adj_matrix(i,:));
% 构建局部优化问题
[H, f, Aeq, beq, lb, ub] = build_local_mpc(...
A, B, Q, R, P, Np, Nc, ...
x_current{i}, x_ref{i}, ...
x_current(neighbors), x_ref(neighbors), ...
u_min, u_max, x_min, x_max);
% 求解二次规划
options = optimoptions('quadprog', 'Display', 'off');
U_i = quadprog(H, f, [], [], Aeq, beq, lb, ub, [], options);
% 提取第一个控制量
u_opt{i} = U_i(1:m);
end
% 应用控制并更新状态
for i = 1:N_agents
u_history(:,k,i) = u_opt{i};
x_current{i} = A * x_current{i} + B * u_opt{i};
x_history(:,k,i) = x_current{i};
end
% 显示进度
if mod(k,10) == 0
fprintf('Step %d/%d: Mean position error = %.3f m\n', ...
k, T_sim, mean(vecnorm(cell2mat(x_current),2,1)));
end
end
end
3.3 局部MPC问题构建
matlab
function [H, f, Aeq, beq, lb, ub] = build_local_mpc(...
A, B, Q, R, P, Np, Nc, x0, x_ref, x_neighbors, x_ref_neighbors, ...
u_min, u_max, x_min, x_max)
% 构建局部MPC二次规划问题
n = size(A,1);
m = size(B,2);
N_neighbors = length(x_neighbors);
% 预测矩阵
Phi = zeros(n*Np, n);
Gamma = zeros(n*Np, m*Nc);
for i = 1:Np
Phi((i-1)*n+1:i*n, :) = A^i;
for j = 1:min(i, Nc)
Gamma((i-1)*n+1:i*n, (j-1)*m+1:j*m) = A^(i-j) * B;
end
end
% 代价函数矩阵
Q_bar = kron(eye(Np), Q);
R_bar = kron(eye(Nc), R);
% 终端协同代价
if N_neighbors > 0
P_bar = kron(eye(N_neighbors), P);
% 构建邻居状态差矩阵
diff_term = zeros(n*N_neighbors, 1);
for idx = 1:N_neighbors
diff_term((idx-1)*n+1:idx*n) = x_ref - x_ref_neighbors{idx};
end
else
P_bar = zeros(n);
diff_term = zeros(n,1);
end
% Hessian矩阵和梯度向量
H = 2 * (Gamma' * Q_bar * Gamma + R_bar);
f = 2 * Gamma' * Q_bar * (Phi * x0 - repmat(x_ref, Np, 1));
% 添加终端协同项
if N_neighbors > 0
H = H + 2 * Gamma(end-n+1:end, :)' * P_bar * Gamma(end-n+1:end, :);
f = f + 2 * Gamma(end-n+1:end, :)' * P_bar * diff_term;
end
% 等式约束(动力学)
Aeq = [];
beq = [];
% 不等式约束(控制输入)
lb = repmat(u_min, Nc, 1);
ub = repmat(u_max, Nc, 1);
% 状态约束(松弛处理)
% 可添加状态约束,此处简化处理
end
3.4 结果可视化函数
matlab
function plot_results(x_history, u_history, Ts, N_agents)
% 绘制DMPC仿真结果
T_sim = size(x_history, 2);
t = (0:T_sim-1) * Ts;
% 1. 相对位置轨迹
figure('Position', [100, 100, 1200, 800]);
% 三维轨迹
subplot(2,3,1);
hold on;
colors = {'r', 'g', 'b', 'm', 'c'};
for i = 1:N_agents
plot3(x_history(1,:,i), x_history(2,:,i), x_history(3,:,i), ...
'Color', colors{i}, 'LineWidth', 1.5);
plot3(x_history(1,1,i), x_history(2,1,i), x_history(3,1,i), ...
'o', 'Color', colors{i}, 'MarkerSize', 8, 'LineWidth', 2);
plot3(x_history(1,end,i), x_history(2,end,i), x_history(3,end,i), ...
's', 'Color', colors{i}, 'MarkerSize', 10, 'LineWidth', 2);
end
xlabel('x (m)'); ylabel('y (m)'); zlabel('z (m)');
title('航天器相对运动轨迹');
legend('航天器1', '起点1', '终点1', '航天器2', '起点2', '终点2', ...
'航天器3', '起点3', '终点3');
grid on; view(3);
% 2. 位置分量时间序列
subplot(2,3,2);
hold on;
for i = 1:N_agents
plot(t, x_history(1,:,i), 'Color', colors{i}, 'LineWidth', 1.5);
end
xlabel('时间 (s)'); ylabel('x位置 (m)');
title('径向位置'); grid on; legend('航天器1', '航天器2', '航天器3');
subplot(2,3,3);
hold on;
for i = 1:N_agents
plot(t, x_history(2,:,i), 'Color', colors{i}, 'LineWidth', 1.5);
end
xlabel('时间 (s)'); ylabel('y位置 (m)');
title('切向位置'); grid on;
subplot(2,3,4);
hold on;
for i = 1:N_agents
plot(t, x_history(3,:,i), 'Color', colors{i}, 'LineWidth', 1.5);
end
xlabel('时间 (s)'); ylabel('z位置 (m)');
title('法向位置'); grid on;
% 3. 控制输入
subplot(2,3,5);
hold on;
for i = 1:N_agents
plot(t, vecnorm(u_history(:,:,i), 2, 1), ...
'Color', colors{i}, 'LineWidth', 1.5);
end
xlabel('时间 (s)'); ylabel('控制幅值 (m/s²)');
title('控制输入幅值'); grid on;
legend('航天器1', '航天器2', '航天器3');
% 4. 相对距离
subplot(2,3,6);
hold on;
if N_agents >= 2
dist_12 = vecnorm(x_history(:,:,1) - x_history(:,:,2), 2, 1);
plot(t, dist_12, 'b-', 'LineWidth', 1.5);
end
if N_agents >= 3
dist_13 = vecnorm(x_history(:,:,1) - x_history(:,:,3), 2, 1);
plot(t, dist_13, 'r-', 'LineWidth', 1.5);
dist_23 = vecnorm(x_history(:,:,2) - x_history(:,:,3), 2, 1);
plot(t, dist_23, 'g-', 'LineWidth', 1.5);
legend('航天器1-2', '航天器1-3', '航天器2-3');
end
xlabel('时间 (s)'); ylabel('相对距离 (m)');
title('航天器间相对距离'); grid on;
% 5. 控制输入分量
figure('Position', [100, 100, 1000, 600]);
for i = 1:min(3, N_agents)
subplot(3,1,i);
plot(t, u_history(1,:,i), 'r-', t, u_history(2,:,i), 'g-', ...
t, u_history(3,:,i), 'b-', 'LineWidth', 1.5);
xlabel('时间 (s)'); ylabel('控制输入 (m/s²)');
title(['航天器', num2str(i), '控制输入分量']);
legend('a_x', 'a_y', 'a_z'); grid on;
end
end
参考代码 航天器交会的分布式模型预测控制 www.youwenfan.com/contentcst/160555.html
四、算法性能分析
4.1 关键参数影响
| 参数 | 影响 | 建议值 | 调整策略 |
|---|---|---|---|
| 预测时域 NpN_pNp | 预测精度与计算量权衡 | 5-20步 | 增大NpN_pNp提高稳定性,但增加计算负担 |
| 控制时域 NcN_cNc | 控制平滑性与优化自由度 | 3-8步 | 通常Nc<NpN_c < N_pNc<Np,NcN_cNc越小控制越平滑 |
| 状态权重 QQQ | 状态跟踪精度 | 0.1I60.1I_60.1I6 | 增大QQQ提高跟踪速度,但可能引起振荡 |
| 控制权重 RRR | 控制能量消耗 | 0.001I30.001I_30.001I3 | 增大RRR减少控制能量,但响应变慢 |
| 协同权重 PPP | 航天器间协同程度 | Np2I6N_p^2 I_6Np2I6 | 增大PPP增强协同,但可能牺牲个体性能 |
4.2 与集中式MPC对比
| 指标 | 分布式MPC | 集中式MPC |
|---|---|---|
| 计算复杂度 | O(Na⋅(n+m)3)O(N_a \cdot (n+m)^3)O(Na⋅(n+m)3) | O((Na⋅(n+m))3)O((N_a \cdot (n+m))^3)O((Na⋅(n+m))3) |
| 通信需求 | 仅邻居间通信 | 全局通信 |
| 容错性 | 高(局部故障不影响全局) | 低(中心故障导致系统崩溃) |
| 扩展性 | 易于扩展航天器数量 | 扩展困难 |
| 实时性 | 适合在线计算 | 计算负担重 |
4.3 收敛性分析
DMPC收敛条件:
- 通信拓扑连通:邻接矩阵对应图连通
- 优化问题可行:存在满足约束的控制序列
- 权重矩阵正定 :Q,R,PQ,R,PQ,R,P正定保证代价函数凸性
- 采样时间适当 :TsT_sTs满足Nyquist采样定理
五、扩展与改进
5.1 鲁棒DMPC
考虑模型不确定性和外部扰动:
matlab
% 鲁棒DMPC:添加扰动补偿
function u_robust = robust_dmpc(A_nom, B_nom, x, u_prev, d_est)
% A_nom, B_nom: 标称模型
% d_est: 扰动估计
A_robust = A_nom + delta_A; % 考虑模型不确定性
B_robust = B_nom + delta_B;
% 在优化问题中添加扰动补偿项
end
5.2 事件触发通信
减少通信负担:
matlab
% 事件触发条件:状态变化超过阈值时通信
function should_communicate = event_trigger(x_current, x_last_sent, threshold)
error_norm = norm(x_current - x_last_sent);
should_communicate = (error_norm > threshold);
end
5.3 异步DMPC
处理通信延迟和异步更新:
matlab
% 异步更新:各航天器独立更新周期
function u_async = async_dmpc(agent_id, local_clock, neighbor_info)
if mod(local_clock, update_period(agent_id)) == 0
% 执行本地优化
u_async = solve_local_mpc(...);
else
% 使用上一时刻控制
u_async = u_previous;
end
end
六、总结
本文实现了航天器交会的分布式模型预测控制(DMPC)MATLAB代码,基于Clohessy-Wiltshire方程建模,通过局部优化和邻居信息交换实现多航天器协同交会。DMPC相比集中式MPC具有计算效率高、通信负担轻、容错性强的优势,适合大规模航天器编队控制。
关键特点:
- 模型准确:采用C-W方程精确描述轨道相对运动
- 分布式架构:各航天器独立优化,通过通信协调
- 约束处理:考虑控制输入和状态约束
- 可视化完善:提供三维轨迹、位置、控制等多维度可视化