航天器交会的分布式模型预测控制(DMPC)MATLAB实现

航天器交会的分布式模型预测控制(DMPC)MATLAB实现

一、理论基础

1.1 航天器相对运动模型(Clohessy-Wiltshire方程)

航天器交会相对运动通常采用Clohessy-Wiltshire(C-W)方程描述。在目标航天器轨道坐标系(RTN坐标系)中,追踪航天器相对运动方程为:

其中:

1.2 状态空间离散化

将C-W方程转化为状态空间形式:

其中状态向量 ,控制输入

离散化(采样时间):

1.3 分布式模型预测控制(DMPC)原理

DMPC将多航天器协同控制问题分解为局部优化子问题。每个航天器基于自身状态和邻居信息,求解局部MPC问题,通过通信协调实现全局目标。

DMPC优势

二、DMPC算法框架

2.1 系统架构

graph TD
    A[航天器1] -->|通信| B[航天器2]
    B -->|通信| C[航天器3]
    C -->|通信| A
    A --> D[局部MPC优化]
    B --> E[局部MPC优化]
    C --> F[局部MPC优化]
    D --> G[全局协同]
    E --> G
    F --> G

2.2 局部MPC优化问题

对于第个航天器,在时刻求解:

其中:

三、MATLAB代码实现

3.1 主程序框架

%% 航天器交会分布式模型预测控制(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核心函数

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问题构建

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 结果可视化函数

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 关键参数影响

参数 影响 建议值 调整策略
预测时域 预测精度与计算量权衡 5-20步 增大提高稳定性,但增加计算负担
控制时域 控制平滑性与优化自由度 3-8步 通常越小控制越平滑
状态权重 状态跟踪精度 增大提高跟踪速度,但可能引起振荡
控制权重 控制能量消耗 增大减少控制能量,但响应变慢
协同权重 航天器间协同程度 增大增强协同,但可能牺牲个体性能

4.2 与集中式MPC对比

指标 分布式MPC 集中式MPC
计算复杂度
通信需求 仅邻居间通信 全局通信
容错性 高(局部故障不影响全局) 低(中心故障导致系统崩溃)
扩展性 易于扩展航天器数量 扩展困难
实时性 适合在线计算 计算负担重

4.3 收敛性分析

DMPC收敛条件:

  1. 通信拓扑连通:邻接矩阵对应图连通
  2. 优化问题可行:存在满足约束的控制序列
  3. 权重矩阵正定正定保证代价函数凸性
  4. 采样时间适当满足Nyquist采样定理

五、扩展与改进

5.1 鲁棒DMPC

考虑模型不确定性和外部扰动:

% 鲁棒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 事件触发通信

减少通信负担:

% 事件触发条件:状态变化超过阈值时通信
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

处理通信延迟和异步更新:

% 异步更新:各航天器独立更新周期
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具有计算效率高、通信负担轻、容错性强的优势,适合大规模航天器编队控制。

关键特点

  1. 模型准确:采用C-W方程精确描述轨道相对运动
  2. 分布式架构:各航天器独立优化,通过通信协调
  3. 约束处理:考虑控制输入和状态约束
  4. 可视化完善:提供三维轨迹、位置、控制等多维度可视化

专注于matlab/simulink,电子电路,编程