火星着陆火箭的模型预测控制(MPC)参考跟踪系统

火星着陆火箭的模型预测控制(MPC)参考跟踪系统

一、火星着陆问题建模

1.1 火星环境参数

%% 火星着陆火箭MPC控制系统
% 功能:模拟火箭在火星上的精确着陆控制
% 控制策略:模型预测控制(MPC)参考跟踪
% 状态变量:[x, y, z, vx, vy, vz, theta, phi, m]
% 控制输入:[Tx, Ty, Tz, 节流阀开度]

clear; clc; close all;
warning('off', 'all');

%% 1. 火星环境与任务参数初始化
disp('=== 火星着陆火箭MPC控制系统 ===');
disp('初始化火星环境和任务参数...');

% 1.1 火星物理参数
mars = struct();
mars.g = 3.711;                % 火星重力加速度 (m/s²)
mars.atmosphere_height = 120;  % 大气层高度 (km)
mars.surface_pressure = 610;   % 表面气压 (Pa)
mars.temperature = 210;        % 平均温度 (K)
mars.radius = 3389.5;          % 火星半径 (km)
mars.rotation_period = 24.62;  % 自转周期 (小时)

% 1.2 火星地形参数(着陆点:Jezero陨石坑)
landing_site = struct();
landing_site.name = 'Jezero Crater';
landing_site.latitude = 18.38;  % 纬度 (°N)
landing_site.longitude = 77.58; % 经度 (°E)
landing_site.elevation = -2500; % 海拔 (m,负值表示低于平均表面)
landing_site.terrain_slope = 2; % 平均坡度 (°)
landing_site.wind_speed = 5;    % 平均风速 (m/s)
landing_site.wind_direction = 45; % 风向 (°,从北顺时针)

% 1.3 着陆任务参数
mission = struct();
mission.initial_altitude = 10e3;   % 初始高度 (m)
mission.initial_velocity = 5800;   % 初始速度 (m/s,进入大气层速度)
mission.initial_angle = -15;       % 初始俯仰角 (°,负值为俯冲)
mission.final_altitude = 0;        % 最终高度 (m)
mission.final_velocity = 0.5;      % 最终速度 (m/s,软着陆)
mission.landing_accuracy = 100;    % 着陆精度 (m)
mission.max_g_force = 4;           % 最大过载 (g)
mission.total_fuel = 5000;         % 总燃料质量 (kg)
mission.dry_mass = 2000;           % 干重 (kg)
mission.max_thrust = 35000;        % 最大推力 (N)
mission.min_thrust = 1000;         % 最小推力 (N)
mission.max_throttle = 1.0;        % 最大节流阀
mission.min_throttle = 0.1;        % 最小节流阀

% 1.4 时间参数
time = struct();
time.entry_time = 240;            % 进入阶段持续时间 (s)
time.parachute_time = 60;         % 降落伞阶段 (s)
time.powered_descent = 120;       % 动力下降阶段 (s)
time.final_landing = 30;          % 最终着陆阶段 (s)
time.total_duration = time.entry_time + time.parachute_time + ...
                     time.powered_descent + time.final_landing;
time.dt = 0.1;                    % 控制周期 (s)
time.simulation_steps = ceil(time.total_duration / time.dt);

fprintf('火星环境参数初始化完成\n');
fprintf('  重力加速度: %.3f m/s²\n', mars.g);
fprintf('  总任务时间: %.1f 秒\n', time.total_duration);
fprintf('  着陆点: %s (%.2f°N, %.2f°E)\n', ...
    landing_site.name, landing_site.latitude, landing_site.longitude);

1.2 火箭动力学模型

%% 2. 火箭动力学建模
disp('建立火箭动力学模型...');

% 2.1 火箭状态向量定义
% x = [px, py, pz, vx, vy, vz, theta, phi, m]^T
% px, py, pz: 位置 (m),火星中心惯性坐标系
% vx, vy, vz: 速度 (m/s)
% theta: 俯仰角 (rad)
% phi: 滚转角 (rad)
% m: 质量 (kg)

% 2.2 连续时间动力学方程
rocket = struct();
rocket.n_states = 9;      % 状态数
rocket.n_controls = 4;    % 控制输入数 [Tx, Ty, Tz, throttle]

% 动力学函数
rocket.f = @(x,u) rocket_dynamics_continuous(x, u, mars, mission);

% 离散化(使用4阶Runge-Kutta)
rocket.dt = time.dt;
rocket.f_discrete = @(x,u) discrete_dynamics_rk4(x, u, rocket.f, rocket.dt);

% 2.3 质量流率模型
rocket.mass_flow = struct();
rocket.mass_flow.Isp = 300;      % 比冲 (s)
rocket.mass_flow.g0 = 9.80665;   % 地球海平面重力加速度
rocket.mass_flow.max_flow = mission.max_thrust / ...
                           (rocket.mass_flow.Isp * rocket.mass_flow.g0);
rocket.mass_flow.min_flow = mission.min_thrust / ...
                           (rocket.mass_flow.Isp * rocket.mass_flow.g0);

% 2.4 推进器配置
rocket.thruster = struct();
rocket.thruster.n_main = 1;      % 主发动机数量
rocket.thruster.n_rcs = 8;       % 反作用控制系统推力器数量
rocket.thruster.max_gimbal = 15; % 最大万向节角度 (°)
rocket.thruster.response_time = 0.05; % 响应时间 (s)

% 2.5 空气动力学模型(火星稀薄大气)
rocket.aerodynamics = struct();
rocket.aerodynamics.Cd = 1.5;    % 阻力系数
rocket.aerodynamics.A_ref = 10;  % 参考面积 (m²)
rocket.aerodynamics.cl = 0.1;    % 升力系数
rocket.aerodynamics.rho = @(h) martian_atmosphere_density(h);

fprintf('火箭动力学模型建立完成\n');
fprintf('  状态维度: %d\n', rocket.n_states);
fprintf('  控制维度: %d\n', rocket.n_controls);
fprintf('  比冲: %.0f 秒\n', rocket.mass_flow.Isp);

function dx = rocket_dynamics_continuous(x, u, mars, mission)
    % 连续时间火箭动力学
    % x: [px, py, pz, vx, vy, vz, theta, phi, m]
    % u: [Tx, Ty, Tz, throttle]
    
    % 提取状态
    px = x(1); py = x(2); pz = x(3);
    vx = x(4); vy = x(5); vz = x(6);
    theta = x(7); phi = x(8);
    m = x(9);
    
    % 提取控制
    Tx = u(1); Ty = u(2); Tz = u(3);
    throttle = u(4);
    
    % 计算高度
    h = sqrt(px^2 + py^2 + pz^2) - mars.radius*1000;  % 转换为米
    
    % 计算总推力
    T_max = mission.max_thrust;
    T_min = mission.min_thrust;
    T = T_min + throttle * (T_max - T_min);
    
    % 计算推力向量(在机体坐标系)
    T_body = [Tx; Ty; Tz] * T;
    
    % 转换到惯性坐标系
    R = rotation_matrix(theta, phi);
    T_inertial = R * T_body;
    
    % 计算空气阻力
    rho = martian_atmosphere_density(h);
    v = sqrt(vx^2 + vy^2 + vz^2);
    if v > 0
        drag_force = 0.5 * rho * rocket.aerodynamics.Cd * ...
                    rocket.aerodynamics.A_ref * v^2;
        D = -drag_force * [vx; vy; vz] / v;
    else
        D = [0; 0; 0];
    end
    
    % 计算升力
    if v > 0
        lift_force = 0.5 * rho * rocket.aerodynamics.cl * ...
                    rocket.aerodynamics.A_ref * v^2;
        L = lift_force * cross([0;0;1], [vx; vy; vz]/v);
    else
        L = [0; 0; 0];
    end
    
    % 万有引力
    r = [px; py; pz];
    r_norm = norm(r);
    g = -mars.g * r / r_norm;
    
    % 计算质量流率
    Isp = rocket.mass_flow.Isp;
    g0 = rocket.mass_flow.g0;
    m_dot = -T / (Isp * g0);
    
    % 动力学方程
    dx = zeros(9,1);
    dx(1:3) = [vx; vy; vz];                          % 位置变化率
    dx(4:6) = (T_inertial + D + L)/m + g;            % 速度变化率
    dx(7) = 0.1 * (atan2(T_body(2), T_body(1)) - theta);  % 俯仰角变化率
    dx(8) = 0.1 * (atan2(T_body(3), sqrt(T_body(1)^2 + T_body(2)^2)) - phi); % 滚转角
    dx(9) = m_dot;                                   % 质量变化率
    
    % 添加科里奥利力(火星自转影响,很小但包括)
    omega_mars = 2*pi / (mars.rotation_period * 3600);  % 自转角速度 (rad/s)
    coriolis = 2 * cross([0; 0; omega_mars], [vx; vy; vz]);
    dx(4:6) = dx(4:6) + coriolis;
end

function R = rotation_matrix(theta, phi)
    % 从机体到惯性坐标系的旋转矩阵
    R_theta = [cos(theta), -sin(theta), 0;
               sin(theta), cos(theta), 0;
               0, 0, 1];
    
    R_phi = [1, 0, 0;
             0, cos(phi), -sin(phi);
             0, sin(phi), cos(phi)];
    
    R = R_theta * R_phi;
end

function rho = martian_atmosphere_density(h)
    % 火星大气密度模型 (kg/m³)
    % 简化模型:指数衰减
    if h < 0
        h = 0;
    end
    
    rho0 = 0.020;  % 表面密度 (kg/m³)
    H = 11000;     % 标高 (m)
    
    rho = rho0 * exp(-h/H);
end

function x_next = discrete_dynamics_rk4(x, u, f_continuous, dt)
    % 4阶Runge-Kutta离散化
    k1 = f_continuous(x, u);
    k2 = f_continuous(x + dt/2*k1, u);
    k3 = f_continuous(x + dt/2*k2, u);
    k4 = f_continuous(x + dt*k3, u);
    
    x_next = x + dt/6 * (k1 + 2*k2 + 2*k3 + k4);
end

二、参考轨迹生成

%% 3. 参考轨迹生成
disp('生成火星着陆参考轨迹...');

% 3.1 参考轨迹规划(多项式轨迹)
reference = generate_landing_reference_trajectory(mission, time, mars);

% 3.2 显示参考轨迹
plot_reference_trajectory(reference, mission, time);

function reference = generate_landing_reference_trajectory(mission, time, mars)
    % 生成四阶段着陆参考轨迹
    
    % 阶段1:进入段(大气减速)
    t1 = linspace(0, time.entry_time, ceil(time.entry_time/time.dt)+1);
    h1 = mission.initial_altitude * exp(-0.01 * t1);
    v1 = mission.initial_velocity * exp(-0.015 * t1);
    
    % 阶段2:降落伞段
    t2 = linspace(time.entry_time, time.entry_time + time.parachute_time, ...
                 ceil(time.parachute_time/time.dt)+1);
    h2 = h1(end) * ones(size(t2));
    h2 = h2 - linspace(0, 2000, length(t2))';  % 稳定下降
    v2 = 100 * ones(size(t2));  % 降落伞终端速度
    
    % 阶段3:动力下降段
    t3 = linspace(time.entry_time + time.parachute_time, ...
                 time.entry_time + time.parachute_time + time.powered_descent, ...
                 ceil(time.powered_descent/time.dt)+1);
    
    % 多项式轨迹规划
    h0 = h2(end);
    hf = 100;  % 离地100米
    v0 = v2(end);
    vf = 5;    % 5m/s下降
    a0 = 0;    % 初始加速度
    af = -mars.g;  % 最终平衡重力
    
    t3_norm = (t3 - t3(1)) / (t3(end) - t3(1));
    h3 = polynomial_trajectory(t3_norm, h0, hf, v0, vf, a0, af, time.powered_descent);
    v3 = polynomial_velocity(t3_norm, h0, hf, v0, vf, a0, af, time.powered_descent);
    
    % 阶段4:最终着陆段
    t4 = linspace(t3(end), t3(end) + time.final_landing, ...
                 ceil(time.final_landing/time.dt)+1);
    h4 = polynomial_trajectory(linspace(0,1,length(t4)), hf, 0, vf, 0.5, af, 0, time.final_landing);
    v4 = polynomial_velocity(linspace(0,1,length(t4)), hf, 0, vf, 0.5, af, 0, time.final_landing);
    
    % 合并轨迹
    t = [t1, t2(2:end), t3(2:end), t4(2:end)];
    h = [h1, h2(2:end), h3(2:end), h4(2:end)];
    v = [v1, v2(2:end), v3(2:end), v4(2:end)];
    
    % 生成完整参考状态
    n_points = length(t);
    reference = struct();
    reference.time = t';
    reference.position = zeros(n_points, 3);
    reference.velocity = zeros(n_points, 3);
    reference.attitude = zeros(n_points, 2);  % [theta, phi]
    reference.thrust = zeros(n_points, 3);
    reference.throttle = zeros(n_points, 1);
    reference.mass = zeros(n_points, 1);
    
    % 初始条件
    reference.position(1,:) = [0, 0, mission.initial_altitude];
    reference.velocity(1,:) = [mission.initial_velocity * cosd(mission.initial_angle), ...
                              0, mission.initial_velocity * sind(mission.initial_angle)];
    reference.mass(1) = mission.dry_mass + mission.total_fuel;
    
    % 计算每个点的参考状态
    for i = 1:n_points
        reference.position(i,3) = h(i);
        
        if i > 1
            dt_ref = t(i) - t(i-1);
            % 速度方向(垂直向下)
            reference.velocity(i,:) = [0, 0, -v(i)];
            
            % 计算所需推力(平衡重力并产生减速)
            acceleration = (v(i-1) - v(i)) / dt_ref;
            reference.thrust(i,3) = reference.mass(i-1) * (mars.g + acceleration);
            
            % 节流阀
            reference.throttle(i) = reference.thrust(i,3) / mission.max_thrust;
            
            % 质量消耗
            Isp = 300;
            g0 = 9.80665;
            m_dot = reference.thrust(i,3) / (Isp * g0);
            reference.mass(i) = reference.mass(i-1) - m_dot * dt_ref;
        end
    end
    
    % 平滑处理
    reference.position(:,3) = smooth(reference.position(:,3), 50);
    reference.velocity(:,3) = smooth(reference.velocity(:,3), 50);
    
    fprintf('参考轨迹生成完成: %d 个点\n', n_points);
end

function h = polynomial_trajectory(t, h0, hf, v0, vf, a0, af, T)
    % 5次多项式轨迹规划
    % t: 归一化时间 [0,1]
    % h0, hf: 初始和最终高度
    % v0, vf: 初始和最终速度
    % a0, af: 初始和最终加速度
    % T: 总时间
    
    a0 = a0 * T;
    af = af * T;
    v0 = v0 * T;
    vf = vf * T;
    
    % 5次多项式系数
    A = [1, 0, 0, 0, 0, 0;
         0, 1, 0, 0, 0, 0;
         0, 0, 2, 0, 0, 0;
         1, 1, 1, 1, 1, 1;
         0, 1, 2, 3, 4, 5;
         0, 0, 2, 6, 12, 20];
    
    b = [h0; v0; a0; hf; vf; af];
    
    coeff = A \ b;
    
    % 计算轨迹
    t_vec = t(:);
    h = coeff(1) + coeff(2)*t_vec + coeff(3)*t_vec.^2 + ...
        coeff(4)*t_vec.^3 + coeff(5)*t_vec.^4 + coeff(6)*t_vec.^5;
end

function v = polynomial_velocity(t, h0, hf, v0, vf, a0, af, T)
    % 计算多项式轨迹的速度
    a0 = a0 * T;
    af = af * T;
    v0 = v0 * T;
    vf = vf * T;
    
    A = [1, 0, 0, 0, 0, 0;
         0, 1, 0, 0, 0, 0;
         0, 0, 2, 0, 0, 0;
         1, 1, 1, 1, 1, 1;
         0, 1, 2, 3, 4, 5;
         0, 0, 2, 6, 12, 20];
    
    b = [h0; v0; a0; hf; vf; af];
    coeff = A \ b;
    
    t_vec = t(:);
    v = (coeff(2) + 2*coeff(3)*t_vec + 3*coeff(4)*t_vec.^2 + ...
         4*coeff(5)*t_vec.^3 + 5*coeff(6)*t_vec.^4) / T;
end

三、MPC控制器设计

%% 4. 模型预测控制器设计
disp('设计MPC控制器...');

% 4.1 MPC参数配置
mpc_params = configure_mpc_controller(rocket, mission, time);

% 4.2 线性化模型(用于MPC预测)
[mpc_params.A_lin, mpc_params.B_lin] = linearize_rocket_model(rocket, mission, mars);

% 4.3 构建MPC优化问题
mpc_controller = build_mpc_optimization_problem(mpc_params, rocket, mission);

function mpc_params = configure_mpc_controller(rocket, mission, time)
    % 配置MPC控制器参数
    
    mpc_params = struct();
    
    % 预测时域和控制时域
    mpc_params.N = 20;                    % 预测步数
    mpc_params.Nc = 10;                   % 控制步数
    mpc_params.dt = time.dt;             % 采样时间
    
    % 权重矩阵
    mpc_params.Q = diag([100, 100, 100,   % 位置权重
                         10, 10, 10,      % 速度权重
                         5, 5,           % 姿态权重
                         1]);            % 质量权重
    
    mpc_params.R = diag([0.1, 0.1, 0.1, 1]);  % 控制输入权重
    mpc_params.S = diag([1, 1, 1, 0.1]);      % 控制变化率权重
    
    % 终端权重
    mpc_params.P = 10 * mpc_params.Q;
    
    % 约束
    mpc_params.constraints = struct();
    
    % 状态约束
    mpc_params.constraints.x_min = [-inf; -inf; 0;      % 位置
                                    -inf; -inf; -inf;   % 速度
                                    -pi/2; -pi/6;       % 姿态
                                    mission.dry_mass];  % 质量
    
    mpc_params.constraints.x_max = [inf; inf; inf;      % 位置
                                    inf; inf; inf;      % 速度
                                    pi/2; pi/6;         % 姿态
                                    mission.dry_mass + mission.total_fuel];  % 质量
    
    % 输入约束
    mpc_params.constraints.u_min = [-1; -1; -1; mission.min_throttle];
    mpc_params.constraints.u_max = [1; 1; 1; mission.max_throttle];
    
    % 输入变化率约束
    mpc_params.constraints.du_min = [-0.5; -0.5; -0.5; -0.2];
    mpc_params.constraints.du_max = [0.5; 0.5; 0.5; 0.2];
    
    % 性能约束
    mpc_params.constraints.max_velocity = 100;      % 最大速度 (m/s)
    mpc_params.constraints.max_acceleration = mission.max_g_force * mars.g;
    mpc_params.constraints.max_attitude_rate = 5;   % 最大姿态变化率 (°/s)
    
    % 求解器选项
    mpc_params.solver_options = optimoptions('quadprog', ...
        'Display', 'off', ...
        'Algorithm', 'interior-point-convex', ...
        'MaxIterations', 200, ...
        'OptimalityTolerance', 1e-6, ...
        'ConstraintTolerance', 1e-6);
    
    % 实时迭代参数
    mpc_params.warm_start = true;          % 使用热启动
    mpc_params.max_iterations = 3;         % 最大迭代次数
    mpc_params.convergence_tol = 1e-4;     % 收敛容差
    
    fprintf('MPC参数配置完成\n');
    fprintf('  预测时域: %d 步 (%.1f 秒)\n', mpc_params.N, mpc_params.N * mpc_params.dt);
    fprintf('  控制时域: %d 步\n', mpc_params.Nc);
end

function [A_lin, B_lin] = linearize_rocket_model(rocket, mission, mars)
    % 在工作点线性化火箭模型
    
    % 选择线性化点(巡航状态)
    x0 = zeros(rocket.n_states, 1);
    x0(3) = 1000;  % 高度1000m
    x0(9) = mission.dry_mass + mission.total_fuel/2;  % 一半燃料
    
    u0 = zeros(rocket.n_controls, 1);
    u0(4) = 0.5;  % 50%节流阀
    
    % 数值计算雅可比矩阵
    epsilon = 1e-6;
    nx = rocket.n_states;
    nu = rocket.n_controls;
    
    A_lin = zeros(nx, nx);
    B_lin = zeros(nx, nu);
    
    % 计算A矩阵
    for i = 1:nx
        x_plus = x0;
        x_minus = x0;
        x_plus(i) = x_plus(i) + epsilon;
        x_minus(i) = x_minus(i) - epsilon;
        
        f_plus = rocket.f(x_plus, u0);
        f_minus = rocket.f(x_minus, u0);
        
        A_lin(:, i) = (f_plus - f_minus) / (2 * epsilon);
    end
    
    % 计算B矩阵
    for i = 1:nu
        u_plus = u0;
        u_minus = u0;
        u_plus(i) = u_plus(i) + epsilon;
        u_minus(i) = u_minus(i) - epsilon;
        
        f_plus = rocket.f(x0, u_plus);
        f_minus = rocket.f(x0, u_minus);
        
        B_lin(:, i) = (f_plus - f_minus) / (2 * epsilon);
    end
    
    % 离散化
    sysc = ss(A_lin, B_lin, eye(nx), zeros(nx, nu));
    sysd = c2d(sysc, rocket.dt, 'zoh');
    A_lin = sysd.A;
    B_lin = sysd.B;
    
    fprintf('火箭模型线性化完成\n');
    fprintf('  线性化点: 高度=%.0f m, 质量=%.0f kg\n', x0(3), x0(9));
end

function mpc_controller = build_mpc_optimization_problem(mpc_params, rocket, mission)
    % 构建MPC优化问题
    
    nx = rocket.n_states;
    nu = rocket.n_controls;
    N = mpc_params.N;
    Nc = mpc_params.Nc;
    
    % 构建预测矩阵
    [Phi, Gamma] = build_prediction_matrices(mpc_params.A_lin, mpc_params.B_lin, N, Nc);
    
    % 构建代价函数矩阵
    [H, f_template] = build_cost_function_matrices(Phi, Gamma, ...
        mpc_params.Q, mpc_params.R, mpc_params.S, mpc_params.P, N, Nc, nx, nu);
    
    % 构建约束矩阵
    [A_ineq, b_ineq_template, A_eq, b_eq_template, lb, ub] = ...
        build_constraint_matrices(mpc_params.constraints, N, Nc, nx, nu);
    
    % 创建控制器结构
    mpc_controller = struct();
    mpc_controller.nx = nx;
    mpc_controller.nu = nu;
    mpc_controller.N = N;
    mpc_controller.Nc = Nc;
    
    mpc_controller.optimization.H = H;
    mpc_controller.optimization.f_template = f_template;
    mpc_controller.optimization.A_ineq = A_ineq;
    mpc_controller.optimization.b_ineq_template = b_ineq_template;
    mpc_controller.optimization.A_eq = A_eq;
    mpc_controller.optimization.b_eq_template = b_eq_template;
    mpc_controller.optimization.lb = lb;
    mpc_controller.optimization.ub = ub;
    
    mpc_controller.optimization.Phi = Phi;
    mpc_controller.optimization.Gamma = Gamma;
    
    mpc_controller.params = mpc_params;
    mpc_controller.last_solution = [];
    
    fprintf('MPC优化问题构建完成\n');
    fprintf('  决策变量: %d\n', size(H,1));
    fprintf('  不等式约束: %d\n', size(A_ineq,1));
    fprintf('  等式约束: %d\n', size(A_eq,1));
end

function [Phi, Gamma] = build_prediction_matrices(A, B, N, Nc)
    % 构建预测矩阵
    
    nx = size(A, 1);
    nu = size(B, 2);
    
    % 全控制时域预测矩阵
    Phi_full = zeros(N*nx, nx);
    Gamma_full = zeros(N*nx, N*nu);
    
    % 构建Phi矩阵
    A_power = eye(nx);
    for k = 1:N
        rows = ((k-1)*nx+1):(k*nx);
        Phi_full(rows, :) = A_power;
        A_power = A * A_power;
    end
    
    % 构建Gamma矩阵
    for i = 1:N
        rows = ((i-1)*nx+1):(i*nx);
        for j = 1:i
            cols = ((j-1)*nu+1):(j*nu);
            A_power = eye(nx);
            for k = 1:(i-j)
                A_power = A * A_power;
            end
            Gamma_full(rows, cols) = A_power * B;
        end
    end
    
    % 提取控制时域部分
    if Nc < N
        % 控制时域外输入保持为零
        Gamma = Gamma_full(:, 1:Nc*nu);
    else
        Gamma = Gamma_full;
    end
    
    Phi = Phi_full;
end

function [H, f_template] = build_cost_function_matrices(Phi, Gamma, Q, R, S, P, N, Nc, nx, nu)
    % 构建代价函数矩阵
    
    % 扩展权重矩阵
    Q_bar = kron(eye(N-1), Q);
    Q_bar = blkdiag(Q_bar, P);  % 终端代价
    
    R_bar = kron(eye(Nc), R);
    
    % 控制变化率权重
    D = build_rate_matrix(Nc, nu);
    S_bar = D' * kron(eye(Nc), S) * D;
    
    % 构建H矩阵
    H = Gamma' * Q_bar * Gamma + R_bar + S_bar;
    H = (H + H') / 2;  % 确保对称
    
    % f向量模板(将在每次优化时更新)
    f_template = [];  % 将在solve_mpc中计算
    
    fprintf('  代价函数矩阵维度: %dx%d\n', size(H,1), size(H,2));
end

function D = build_rate_matrix(Nc, nu)
    % 构建控制变化率矩阵
    D = kron(eye(Nc), eye(nu)) - kron(diag(ones(Nc-1,1), -1), eye(nu));
    D = D(1:(Nc-1)*nu, :);
end

四、主控制循环

%% 5. 主控制循环
disp('开始火星着陆模拟...');

% 5.1 初始化状态
x0 = zeros(rocket.n_states, 1);
x0(1:2) = [1000, 500];  % 初始水平位置
x0(3) = mission.initial_altitude;
x0(4) = mission.initial_velocity * cosd(mission.initial_angle);
x0(6) = mission.initial_velocity * sind(mission.initial_angle);
x0(9) = mission.dry_mass + mission.total_fuel;

% 5.2 初始化记录
results = initialize_results_recording(rocket, mission, time, reference);

% 5.3 主循环
x_current = x0;
u_prev = zeros(rocket.n_controls, 1);

for k = 1:time.simulation_steps
    t = (k-1) * time.dt;
    fprintf('时间: %.1f/%.1f 秒 | 高度: %.0f m | 速度: %.1f m/s\n', ...
        t, time.total_duration, x_current(3), norm(x_current(4:6)));
    
    % 检查是否着陆
    if x_current(3) <= 0.1
        fprintf('火箭已着陆!\n');
        break;
    end
    
    % 获取当前参考轨迹
    [x_ref_seq, u_ref_seq] = get_reference_sequence(t, reference, mpc_params, rocket);
    
    % 求解MPC
    [u_opt, mpc_info] = solve_mpc_problem(mpc_controller, x_current, ...
        u_prev, x_ref_seq, u_ref_seq, t);
    
    % 应用控制输入(带饱和)
    u_opt_sat = saturate_control(u_opt, mpc_params.constraints);
    
    % 模拟火箭动态
    x_next = rocket.f_discrete(x_current, u_opt_sat);
    
    % 添加过程噪声
    process_noise = 0.01 * randn(rocket.n_states, 1);
    process_noise(3) = 0.05 * randn;  % 高度噪声稍大
    x_next = x_next + process_noise;
    
    % 记录结果
    results = record_iteration_results(results, k, x_current, u_opt_sat, ...
        mpc_info, x_ref_seq, t);
    
    % 更新状态
    x_current = x_next;
    u_prev = u_opt_sat;
    
    % 可视化
    if mod(k, 50) == 0
        plot_landing_progress(results, reference, k, time);
    end
end

% 最终结果分析
analyze_landing_performance(results, reference, mission, time);

function [x_ref_seq, u_ref_seq] = get_reference_sequence(t, reference, mpc_params, rocket)
    % 获取参考轨迹序列
    
    N = mpc_params.N;
    nx = rocket.n_states;
    nu = rocket.n_controls;
    
    % 找到当前时间在参考轨迹中的索引
    t_idx = find(reference.time >= t, 1);
    if isempty(t_idx)
        t_idx = length(reference.time);
    end
    
    % 提取未来N步的参考轨迹
    x_ref_seq = zeros(nx, N);
    u_ref_seq = zeros(nu, N);
    
    for i = 1:N
        idx = min(t_idx + i - 1, length(reference.time));
        
        % 位置
        x_ref_seq(1:3, i) = reference.position(idx, :)';
        
        % 速度
        x_ref_seq(4:6, i) = reference.velocity(idx, :)';
        
        % 姿态
        x_ref_seq(7:8, i) = reference.attitude(idx, :)';
        
        % 质量
        x_ref_seq(9, i) = reference.mass(idx);
        
        % 控制输入
        u_ref_seq(1:3, i) = reference.thrust(idx, :)';
        u_ref_seq(4, i) = reference.throttle(idx);
    end
end

function [u_opt, info] = solve_mpc_problem(mpc_controller, x_current, u_prev, x_ref_seq, u_ref_seq, t)
    % 求解MPC优化问题
    
    tic;
    
    % 提取参数
    nx = mpc_controller.nx;
    nu = mpc_controller.nu;
    N = mpc_controller.N;
    Nc = mpc_controller.Nc;
    
    % 构建f向量
    Phi = mpc_controller.optimization.Phi;
    Gamma = mpc_controller.optimization.Gamma;
    Q_bar = kron(eye(N-1), mpc_controller.params.Q);
    Q_bar = blkdiag(Q_bar, mpc_controller.params.P);
    
    % 计算跟踪误差
    x_ref_vec = x_ref_seq(:);
    tracking_error = Phi * x_current - x_ref_vec(1:N*nx);
    
    f = 2 * Gamma' * Q_bar * tracking_error;
    
    % 添加控制输入跟踪项
    R_bar = kron(eye(Nc), mpc_controller.params.R);
    u_ref_vec = u_ref_seq(:, 1:Nc);
    u_ref_vec = u_ref_vec(:);
    f = f - 2 * R_bar * u_ref_vec;
    
    % 构建约束
    b_ineq = mpc_controller.optimization.b_ineq_template;
    b_eq = mpc_controller.optimization.b_eq_template;
    
    % 添加初始控制输入约束
    A_rate = mpc_controller.optimization.A_ineq(end-nu+1:end, :);
    b_ineq(end-nu+1:end) = b_ineq(end-nu+1:end) + A_rate * [u_prev; zeros((Nc-1)*nu, 1)];
    
    % 使用热启动
    if mpc_controller.params.warm_start && ~isempty(mpc_controller.last_solution)
        x0 = mpc_controller.last_solution;
    else
        x0 = [];
    end
    
    % 求解QP
    [U_opt, fval, exitflag, output] = quadprog(...
        mpc_controller.optimization.H, f, ...
        mpc_controller.optimization.A_ineq, b_ineq, ...
        mpc_controller.optimization.A_eq, b_eq, ...
        mpc_controller.optimization.lb, mpc_controller.optimization.ub, ...
        x0, mpc_controller.params.solver_options);
    
    % 提取第一个控制输入
    if exitflag > 0
        u_opt = U_opt(1:nu);
        mpc_controller.last_solution = U_opt;
    else
        warning('MPC求解失败,使用参考控制');
        u_opt = u_ref_seq(:,1);
    end
    
    % 记录信息
    info = struct();
    info.solve_time = toc;
    info.fval = fval;
    info.exitflag = exitflag;
    info.iterations = output.iterations;
    
    if mod(t, 1) == 0
        fprintf('  MPC求解: %.3f ms, 代价: %.2f\n', info.solve_time*1000, fval);
    end
end

参考代码 具有参考跟踪的模型预测控制(MPC)来模拟火箭在火星上的着陆 www.youwenfan.com/contentcsu/160622.html

五、性能评估与可视化

%% 6. 性能评估与可视化
disp('分析着陆性能...');

function analyze_landing_performance(results, reference, mission, time)
    % 分析着陆性能
    
    fprintf('\n=== 火星着陆性能分析 ===\n\n');
    
    % 提取数据
    t = results.time;
    x = results.states;
    u = results.controls;
    x_ref = results.reference.states;
    
    % 1. 着陆精度
    final_pos = x(1:3, end);
    target_pos = [0; 0; 0];
    landing_error = norm(final_pos - target_pos);
    
    fprintf('1. 着陆精度:\n');
    fprintf('   目标位置: (%.1f, %.1f, %.1f) m\n', target_pos);
    fprintf('   实际位置: (%.1f, %.1f, %.1f) m\n', final_pos);
    fprintf('   着陆误差: %.2f m\n', landing_error);
    fprintf('   精度要求: < %.0f m\n', mission.landing_accuracy);
    
    if landing_error < mission.landing_accuracy
        fprintf('   ✅ 满足精度要求\n');
    else
        fprintf('   ❌ 不满足精度要求\n');
    end
    
    % 2. 着陆速度
    final_vel = norm(x(4:6, end));
    fprintf('\n2. 着陆速度:\n');
    fprintf('   最终速度: %.3f m/s\n', final_vel);
    fprintf('   目标速度: < %.1f m/s\n', mission.final_velocity);
    
    if final_vel < mission.final_velocity
        fprintf('   ✅ 软着陆成功\n');
    else
        fprintf('   ❌ 硬着陆\n');
    end
    
    % 3. 燃料消耗
    initial_fuel = mission.total_fuel;
    final_fuel = x(9, end) - mission.dry_mass;
    fuel_used = initial_fuel - final_fuel;
    fuel_efficiency = fuel_used / initial_fuel * 100;
    
    fprintf('\n3. 燃料消耗:\n');
    fprintf('   初始燃料: %.0f kg\n', initial_fuel);
    fprintf('   剩余燃料: %.0f kg\n', max(0, final_fuel));
    fprintf('   燃料消耗: %.0f kg (%.1f%%)\n', fuel_used, fuel_efficiency);
    
    if final_fuel > 0
        fprintf('   ✅ 燃料充足\n');
    else
        fprintf('   ⚠️ 燃料耗尽\n');
    end
    
    % 4. 过载分析
    accelerations = results.performance.accelerations;
    max_accel = max(abs(accelerations));
    max_g = max_accel / mission.mars.g;
    
    fprintf('\n4. 过载分析:\n');
    fprintf('   最大加速度: %.2f m/s²\n', max_accel);
    fprintf('   最大过载: %.2f g\n', max_g);
    fprintf('   限制: < %.1f g\n', mission.max_g_force);
    
    if max_g < mission.max_g_force
        fprintf('   ✅ 过载在安全范围内\n');
    else
        fprintf('   ⚠️ 超过最大过载限制\n');
    end
    
    % 5. 控制性能
    solve_times = results.performance.solve_times;
    avg_solve_time = mean(solve_times) * 1000;
    max_solve_time = max(solve_times) * 1000;
    
    fprintf('\n5. 控制性能:\n');
    fprintf('   平均求解时间: %.2f ms\n', avg_solve_time);
    fprintf('   最大求解时间: %.2f ms\n', max_solve_time);
    fprintf('   控制周期: %.0f ms\n', time.dt*1000);
    
    if avg_solve_time < time.dt*1000
        fprintf('   ✅ 满足实时性要求\n');
    else
        fprintf('   ⚠️ 实时性不足\n');
    end
    
    % 6. 跟踪性能
    pos_errors = results.performance.tracking_errors.position;
    vel_errors = results.performance.tracking_errors.velocity;
    
    rmse_pos = sqrt(mean(pos_errors.^2));
    rmse_vel = sqrt(mean(vel_errors.^2));
    
    fprintf('\n6. 跟踪性能:\n');
    fprintf('   位置RMSE: %.2f m\n', rmse_pos);
    fprintf('   速度RMSE: %.2f m/s\n', rmse_vel);
    
    % 7. 任务总结
    fprintf('\n7. 任务总结:\n');
    if landing_error < mission.landing_accuracy && ...
       final_vel < mission.final_velocity && ...
       max_g < mission.max_g_force
        fprintf('   🎉 任务成功!火星着陆完成。\n');
    else
        fprintf('   ⚠️ 任务部分成功,存在异常。\n');
    end
end

%% 7. 高级可视化
function plot_landing_visualization(results, reference, mission, mars)
    % 创建综合可视化
    
    figure('Position', [100, 100, 1400, 800]);
    
    % 1. 3D轨迹
    subplot(2,3,1);
    plot3(results.states(1,:), results.states(2,:), results.states(3,:), ...
        'b-', 'LineWidth', 2);
    hold on;
    plot3(reference.position(:,1), reference.position(:,2), reference.position(:,3), ...
        'r--', 'LineWidth', 1.5);
    
    % 绘制火星表面
    [X, Y, Z] = sphere(20);
    surf(mars.radius*X/1000, mars.radius*Y/1000, mars.radius*Z/1000, ...
        'FaceAlpha', 0.3, 'EdgeColor', 'none', 'FaceColor', [0.7, 0.3, 0.1]);
    
    xlabel('X (m)'); ylabel('Y (m)'); zlabel('高度 (m)');
    title('火星着陆3D轨迹');
    legend('实际轨迹', '参考轨迹', '火星表面');
    grid on; axis equal;
    view(45, 30);
    
    % 2. 高度-速度剖面
    subplot(2,3,2);
    velocity = sqrt(sum(results.states(4:6,:).^2, 1));
    plot(velocity, results.states(3,:), 'b-', 'LineWidth', 2);
    hold on;
    ref_velocity = sqrt(sum(reference.velocity.^2, 2));
    plot(ref_velocity, reference.position(:,3), 'r--', 'LineWidth', 1.5);
    
    xlabel('速度 (m/s)'); ylabel('高度 (m)');
    title('高度-速度剖面');
    legend('实际', '参考');
    grid on;
    set(gca, 'YScale', 'log');
    
    % 3. 控制输入
    subplot(2,3,3);
    t = results.time;
    
    yyaxis left;
    plot(t, results.controls(1:3,:)', 'LineWidth', 1.5);
    ylabel('推力分量 (N)');
    
    yyaxis right;
    plot(t, results.controls(4,:)*100, 'k-', 'LineWidth', 2);
    ylabel('节流阀 (%)');
    
    xlabel('时间 (s)');
    title('控制输入');
    legend('T_x', 'T_y', 'T_z', 'Throttle', 'Location', 'best');
    grid on;
    
    % 4. 质量变化
    subplot(2,3,4);
    plot(t, results.states(9,:), 'b-', 'LineWidth', 2);
    hold on;
    plot(reference.time, reference.mass, 'r--', 'LineWidth', 1.5);
    yline(mission.dry_mass, 'r--', 'LineWidth', 1, 'DisplayName', '干重');
    
    xlabel('时间 (s)'); ylabel('质量 (kg)');
    title('燃料消耗');
    legend('实际质量', '参考质量', '干重');
    grid on;
    
    % 5. 跟踪误差
    subplot(2,3,5);
    pos_error = results.performance.tracking_errors.position;
    vel_error = results.performance.tracking_errors.velocity;
    
    yyaxis left;
    plot(t, pos_error, 'b-', 'LineWidth', 2);
    ylabel('位置误差 (m)');
    
    yyaxis right;
    plot(t, vel_error, 'r-', 'LineWidth', 2);
    ylabel('速度误差 (m/s)');
    
    xlabel('时间 (s)');
    title('跟踪误差');
    legend('位置误差', '速度误差');
    grid on;
    
    % 6. 加速度剖面
    subplot(2,3,6);
    accel = results.performance.accelerations;
    g_force = accel / mars.g;
    
    plot(t, g_force, 'b-', 'LineWidth', 2);
    hold on;
    yline(mission.max_g_force, 'r--', 'LineWidth', 2, 'DisplayName', '最大限制');
    yline(-mission.max_g_force, 'r--', 'LineWidth', 2);
    
    xlabel('时间 (s)'); ylabel('过载 (g)');
    title('加速度剖面');
    ylim([-mission.max_g_force*1.2, mission.max_g_force*1.2]);
    grid on;
    
    sgtitle('火星着陆任务分析', 'FontSize', 16, 'FontWeight', 'bold');
end

六、鲁棒性与安全性增强

%% 8. 鲁棒性增强功能
disp('增强系统鲁棒性...');

function robust_mpc_controller = add_robustness_features(mpc_controller, mission, mars)
    % 添加鲁棒性特性
    
    robust_mpc_controller = mpc_controller;
    
    % 1. 故障检测与处理
    robust_mpc_controller.fault_detection = struct();
    robust_mpc_controller.fault_detection.enabled = true;
    robust_mpc_controller.fault_detection.thruster_fault_prob = 0.001;
    robust_mpc_controller.fault_detection.sensor_fault_prob = 0.0005;
    robust_mpc_controller.fault_detection.max_fault_thrusters = 1;
    
    % 2. 容错控制
    robust_mpc_controller.fault_tolerance = struct();
    robust_mpc_controller.fault_tolerance.redundant_thrusters = true;
    robust_mpc_controller.fault_tolerance.control_allocation = 'pseudo_inverse';
    robust_mpc_controller.fault_tolerance.min_thrust_margin = 0.2;
    
    % 3. 扰动观测器
    robust_mpc_controller.disturbance_observer = struct();
    robust_mpc_controller.disturbance_observer.enabled = true;
    robust_mpc_controller.disturbance_observer.type = 'kalman';
    robust_mpc_controller.disturbance_observer.process_noise = diag([0.1, 0.1, 0.1, 0.01, 0.01, 0.01, 0.001, 0.001, 0.1]);
    robust_mpc_controller.disturbance_observer.measurement_noise = diag([1, 1, 0.5, 0.1, 0.1, 0.1, 0.01, 0.01, 1]);
    
    % 4. 风扰动模型
    robust_mpc_controller.wind_model = struct();
    robust_mpc_controller.wind_model.enabled = true;
    robust_mpc_controller.wind_model.max_speed = 20;  % 最大风速 (m/s)
    robust_mpc_controller.wind_model.gust_duration = 5;  % 阵风持续时间 (s)
    robust_mpc_controller.wind_model.gust_intensity = 0.5;  % 阵风强度系数
    
    % 5. 安全性约束
    robust_mpc_controller.safety_constraints = struct();
    robust_mpc_controller.safety_constraints.min_safe_altitude = 10;  % 最低安全高度 (m)
    robust_mpc_controller.safety_constraints.abort_altitude = 100;    % 中止高度 (m)
    robust_mpc_controller.safety_constraints.emergency_thrust_margin = 1.2;  % 紧急推力裕度
    
    % 6. 适应性MPC
    robust_mpc_controller.adaptive_mpc = struct();
    robust_mpc_controller.adaptive_mpc.enabled = true;
    robust_mpc_controller.adaptive_mpc.model_update_interval = 1.0;  % 模型更新间隔 (s)
    robust_mpc_controller.adaptive_mpc.forgetting_factor = 0.95;     % 遗忘因子
    
    fprintf('鲁棒性特性添加完成\n');
end

%% 9. 应急处理系统
function emergency_system = setup_emergency_system(mission, mars)
    % 设置应急处理系统
    
    emergency_system = struct();
    
    % 应急模式
    emergency_system.modes = {
        'normal',           % 正常模式
        'engine_out',       % 发动机故障
        'sensor_failure',   % 传感器故障
        'wind_gust',        % 强阵风
        'terrain_avoid',    % 地形回避
        'abort_landing'     % 中止着陆
    };
    
    % 应急策略
    emergency_system.strategies = struct();
    
    % 发动机故障策略
    emergency_system.strategies.engine_out = struct();
    emergency_system.strategies.engine_out.thrust_reduction = 0.5;
    emergency_system.strategies.engine_out.max_tilt = 10;  % 最大倾斜角 (°)
    emergency_system.strategies.engine_out.landing_site_adjust = true;
    
    % 中止着陆策略
    emergency_system.strategies.abort_landing = struct();
    emergency_system.strategies.abort_landing.climb_rate = 20;  % 爬升率 (m/s)
    emergency_system.strategies.abort_landing.target_altitude = 500;  % 目标高度 (m)
    emergency_system.strategies.abort_landing.new_landing_site = [1000, 1000];  % 新着陆点 (m)
    
    % 地形回避策略
    emergency_system.strategies.terrain_avoid = struct();
    emergency_system.strategies.terrain_avoid.min_clearance = 50;  % 最小离地间隙 (m)
    emergency_system.strategies.terrain_avoid.max_slope = 10;      % 最大坡度 (°)
    
    % 应急检测阈值
    emergency_system.thresholds = struct();
    emergency_system.thresholds.max_velocity_error = 5.0;     % 最大速度误差 (m/s)
    emergency_system.thresholds.max_position_error = 20.0;    % 最大位置误差 (m)
    emergency_system.thresholds.max_attitude_error = 5.0;     % 最大姿态误差 (°)
    emergency_system.thresholds.min_fuel = 100;              % 最小燃料 (kg)
    
    fprintf('应急处理系统设置完成\n');
end

总结

本系统实现了完整的火星着陆火箭MPC控制框架,具有以下特点:

关键技术特性:

  1. 精确动力学建模:考虑火星重力、稀薄大气、火箭质量变化
  2. 智能轨迹规划:四阶段着陆参考轨迹生成
  3. 实时MPC控制:基于二次规划的模型预测控制
  4. 鲁棒性增强:故障检测、容错控制、扰动抑制
  5. 综合性能分析:全面的着陆性能评估指标

系统优势:

实际应用价值:

该系统可用于:

  1. 火星探测器着陆任务规划与验证
  2. 火箭垂直着陆控制算法开发
  3. 航天器制导、导航与控制(GNC)系统设计
  4. 航天任务仿真与训练

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