卫星姿态控制仿真系统 (MATLAB)

卫星姿态控制仿真系统 (MATLAB)

一、系统架构

┌─────────────────────────────────────────────────────────────┐
│                    卫星姿态控制仿真系统                    │
├─────────────────────────────────────────────────────────────┤
│  姿态确定层   │  控制算法层   │  动力学模型层   │  可视化层   │
│               │               │                 │             │
│  • 四元数估计 │  • PID控制    │  • 刚体动力学   │  • 3D动画   │
│  • 陀螺仪模型 │  • 滑模控制   │  • 环境干扰     │  • 姿态角   │
│  • 星敏感器   │  • LQR控制    │  • 执行机构     │  • 角速度   │
│  • 磁强计     │  • 自适应控制 │  • 燃料消耗     │  • 控制力矩 │
└─────────────────────────────────────────────────────────────┘

二、实现

2.1 主仿真脚本 (satellite_attitude_control.m)

%% 卫星姿态控制仿真系统
% 功能:完整的卫星姿态确定、控制、动力学仿真

clear all; close all; clc;

fprintf('=== 卫星姿态控制仿真系统 ===\n\n');

%% 1. 仿真参数设置
params = struct();
params.sim_time = 1000;        % 仿真时间 (s)
params.dt = 0.01;             % 仿真步长 (s)
params.steps = params.sim_time / params.dt;

fprintf('仿真参数设置:\n');
fprintf('  仿真时长: %d s\n', params.sim_time);
fprintf('  仿真步长: %.3f s\n', params.dt);
fprintf('  总步数: %d\n\n', params.steps);

%% 2. 卫星物理参数
satellite = define_satellite_parameters();

%% 3. 初始条件
% 初始姿态(四元数:[q0, q1, q2, q3],q0为标量)
q_init = euler2quat([30, 20, 10] * pi/180); % 30°滚转, 20°俯仰, 10°偏航
% 初始角速度 (rad/s)
omega_init = [0.01, 0.005, -0.008]'; 

% 目标姿态(期望指向)
q_target = [1, 0, 0, 0]'; % 本体坐标系与惯性系重合

fprintf('初始姿态角: %.1f°, %.1f°, %.1f°\n', ...
        30, 20, 10);
fprintf('初始角速度: [%.3f, %.3f, %.3f] rad/s\n\n', ...
        omega_init(1), omega_init(2), omega_init(3));

%% 4. 控制器选择
controller_type = 'SMC'; % 'PID', 'SMC', 'LQR'

switch controller_type
    case 'PID'
        controller = setup_pid_controller(satellite);
    case 'SMC'
        controller = setup_smc_controller(satellite);
    case 'LQR'
        controller = setup_lqr_controller(satellite);
end

fprintf('控制器类型: %s\n\n', controller_type);

%% 5. 执行仿真
fprintf('开始姿态控制仿真...\n');

% 初始化状态变量
q_history = zeros(params.steps, 4);
omega_history = zeros(params.steps, 3);
torque_history = zeros(params.steps, 3);
error_history = zeros(params.steps, 3);

q_current = q_init;
omega_current = omega_init;

% 仿真主循环
for step = 1:params.steps
    t = step * params.dt;
    
    % 1. 姿态确定(模拟传感器测量)
    [q_measured, omega_measured] = attitude_determination(q_current, omega_current, satellite);
    
    % 2. 计算姿态误差
    [q_error, omega_error] = calculate_attitude_error(q_measured, omega_measured, q_target);
    
    % 3. 控制器计算控制力矩
    control_torque = controller.calculate(q_error, omega_error, t);
    
    % 4. 执行机构模型(飞轮、磁力矩器等)
    applied_torque = actuator_model(control_torque, satellite, t);
    
    % 5. 环境干扰力矩
    disturbance_torque = environmental_disturbances(satellite, q_current, omega_current, t);
    
    % 6. 卫星动力学更新
    [q_next, omega_next] = satellite_dynamics(q_current, omega_current, ...
                                            applied_torque + disturbance_torque, ...
                                            satellite, params.dt);
    
    % 7. 存储历史数据
    q_history(step, :) = q_current';
    omega_history(step, :) = omega_current';
    torque_history(step, :) = applied_torque';
    error_history(step, :) = [q_error(2:4), omega_error'] * 180/pi;
    
    % 8. 更新状态
    q_current = q_next;
    omega_current = omega_next;
    
    % 显示进度
    if mod(step, params.steps/10) == 0
        progress = step / params.steps * 100;
        euler_angles = quat2euler(q_current) * 180/pi;
        fprintf('  进度: %.0f%%, 姿态: [%.2f°, %.2f°, %.2f°]\n', ...
                progress, euler_angles(1), euler_angles(2), euler_angles(3));
    end
end

fprintf('仿真完成!\n\n');

%% 6. 结果可视化
visualize_simulation_results(q_history, omega_history, torque_history, error_history, params);

%% 7. 性能评估
performance_evaluation(q_history, omega_history, satellite);

2.2 卫星参数定义 (define_satellite_parameters.m)

function satellite = define_satellite_parameters()
    % 定义卫星物理参数
    
    % 卫星质量 (kg)
    satellite.mass = 500; % 500 kg小卫星
    
    % 转动惯量矩阵 (kg·m²)
    % 假设卫星为长方体: 1m x 1m x 1m
    Ixx = 100; Iyy = 120; Izz = 80;
    Ixy = 5; Ixz = -3; Iyz = 2;
    
    satellite.inertia = [Ixx, Ixy, Ixz;
                         Ixy, Iyy, Iyz;
                         Ixz, Iyz, Izz];
    
    satellite.inertia_inv = inv(satellite.inertia);
    
    % 执行机构参数
    satellite.actuators.max_torque = [0.1, 0.1, 0.1]'; % 最大控制力矩 (Nm)
    satellite.actuators.wheel_speed_limit = 6000; % 飞轮转速限制 (rpm)
    
    % 轨道参数
    satellite.orbit.altitude = 500e3; % 轨道高度 (m)
    satellite.orbit.period = 2*pi*sqrt((6371e3 + satellite.orbit.altitude)^3/3.986e14);
    satellite.orbit.angular_velocity = 2*pi/satellite.orbit.period; % rad/s
    
    % 传感器参数
    satellite.sensors.gyro_bias = [0.001, -0.0005, 0.0008]'; % 陀螺仪偏置 (rad/s)
    satellite.sensors.gyro_noise = 1e-6; % 陀螺仪噪声标准差
    satellite.sensors.star_tracker_noise = 1e-5; % 星敏噪声 (rad)
    
    fprintf('卫星参数定义完成\n');
end

2.3 姿态确定系统 (attitude_determination.m)

function [q_measured, omega_measured] = attitude_determination(q_true, omega_true, satellite)
    % 模拟姿态确定系统
    
    % 1. 陀螺仪测量
    gyro_noise = satellite.sensors.gyro_noise * randn(3, 1);
    omega_measured = omega_true + satellite.sensors.gyro_bias + gyro_noise;
    
    % 2. 星敏感器测量
    star_tracker_noise = satellite.sensors.star_tracker_noise * randn(3, 1);
    q_star_tracker = quat_multiply(q_true, [1, star_tracker_noise'/2]');
    
    % 3. 卡尔曼滤波融合
    persistent P Q R x_hat;
    if isempty(P)
        % 初始化
        P = eye(6) * 0.01; % 协方差矩阵
        Q = eye(6) * 1e-8; % 过程噪声
        R = diag([1e-6, 1e-6, 1e-6, 1e-8, 1e-8, 1e-8]); % 测量噪声
        x_hat = [q_true(2:4); omega_true]; % 状态向量 [q1,q2,q3, ωx,ωy,ωz]
    end
    
    % 状态转移矩阵
    dt = 0.01;
    F = eye(6);
    F(1:3, 4:6) = [skew_matrix(omega_true) * dt, eye(3) * dt; zeros(3), eye(3)];
    
    % 预测步骤
    x_pred = F * x_hat;
    P_pred = F * P * F' + Q;
    
    % 测量更新
    H = [eye(3), zeros(3, 3); zeros(3, 3), eye(3)];
    z = [q_star_tracker(2:4); omega_measured];
    
    K = P_pred * H' / (H * P_pred * H' + R);
    x_hat = x_pred + K * (z - H * x_pred);
    P = (eye(6) - K * H) * P_pred;
    
    % 提取测量结果
    q_measured = [sqrt(1 - norm(x_hat(1:3))^2), x_hat(1:3)]';
    omega_measured = x_hat(4:6);
end

function S = skew_matrix(v)
    % 计算斜对称矩阵
    S = [0, -v(3), v(2);
         v(3), 0, -v(1);
         -v(2), v(1), 0];
end

2.4 控制器实现

PID 控制器 (setup_pid_controller.m)

function controller = setup_pid_controller(satellite)
    controller.type = 'PID';
    
    % PID参数
    controller.Kp = diag([0.5, 0.5, 0.5]); % 比例增益
    controller.Ki = diag([0.01, 0.01, 0.01]); % 积分增益
    controller.Kd = diag([0.1, 0.1, 0.1]); % 微分增益
    
    % 积分项
    controller.integral_error = zeros(3, 1);
    
    controller.calculate = @pid_calculate;
    
    function torque = pid_calculate(q_error, omega_error, t)
        persistent integral_error;
        if isempty(integral_error)
            integral_error = zeros(3, 1);
        end
        
        % 姿态误差(四元数向量部分)
        attitude_error = q_error(2:4);
        
        % 积分项
        integral_error = integral_error + attitude_error * 0.01;
        integral_error = max(min(integral_error, 1), -1); % 限幅
        
        % PID控制律
        torque = -controller.Kp * attitude_error ...
                 - controller.Ki * integral_error ...
                 - controller.Kd * omega_error;
        
        % 控制力矩限幅
        torque = max(min(torque, satellite.actuators.max_torque), -satellite.actuators.max_torque);
    end
end

滑模控制器 (setup_smc_controller.m)

function controller = setup_smc_controller(satellite)
    controller.type = 'SMC';
    
    % 滑模面参数
    controller.lambda = diag([5, 5, 5]); % 滑模面系数
    controller.eta = diag([0.1, 0.1, 0.1]); % 切换增益
    controller.phi = diag([0.05, 0.05, 0.05]); % 边界层厚度
    
    controller.calculate = @smc_calculate;
    
    function torque = smc_calculate(q_error, omega_error, t)
        % 滑模面设计
        s = omega_error + controller.lambda * q_error(2:4);
        
        % 等效控制
        J = satellite.inertia;
        J_inv = satellite.inertia_inv;
        omega = omega_error;
        
        % 等效控制力矩
        tau_eq = -J * controller.lambda * omega_error - cross(omega, J * omega);
        
        % 切换控制
        sat_term = tanh(s ./ controller.phi); % 饱和函数代替符号函数
        tau_sw = -J * controller.eta * sat_term;
        
        % 总控制力矩
        torque = tau_eq + tau_sw;
        
        % 限幅
        torque = max(min(torque, satellite.actuators.max_torque), -satellite.actuators.max_torque);
    end
end

2.5 卫星动力学 (satellite_dynamics.m)

function [q_next, omega_next] = satellite_dynamics(q, omega, torque, satellite, dt)
    % 卫星刚体动力学
    
    % 四元数运动学方程
    omega_skew = [0, -omega(3), omega(2);
                  omega(3), 0, -omega(1);
                  -omega(2), omega(1), 0];
    
    q_dot = 0.5 * [q(1)*0 - q(2)*omega(1) - q(3)*omega(2) - q(4)*omega(3);
                   q(2)*0 + q(1)*omega(1) + q(4)*omega(2) - q(3)*omega(3);
                   q(3)*0 - q(4)*omega(1) + q(1)*omega(2) + q(2)*omega(3);
                   q(4)*0 + q(3)*omega(1) - q(2)*omega(2) + q(1)*omega(3)];
    
    % 欧拉方程(刚体转动动力学)
    omega_dot = satellite.inertia_inv * (torque - cross(omega, satellite.inertia * omega));
    
    % 四阶龙格-库塔积分
    [q_next, omega_next] = runge_kutta_4(q, omega, q_dot, omega_dot, dt, satellite);
    
    % 四元数归一化
    q_next = q_next / norm(q_next);
end

function [q_next, omega_next] = runge_kutta_4(q, omega, q_dot_func, omega_dot_func, dt, satellite)
    % 四阶龙格-库塔积分
    
    % 状态向量 [q; omega]
    state = [q; omega];
    
    % RK4步骤
    k1 = [q_dot_func; omega_dot_func];
    k2 = [q_dot_func + dt/2*k1(1:4); omega_dot_func + dt/2*k1(5:7)];
    k3 = [q_dot_func + dt/2*k2(1:4); omega_dot_func + dt/2*k2(5:7)];
    k4 = [q_dot_func + dt*k3(1:4); omega_dot_func + dt*k3(5:7)];
    
    % 更新状态
    state_next = state + dt/6 * (k1 + 2*k2 + 2*k3 + k4);
    
    q_next = state_next(1:4);
    omega_next = state_next(5:7);
end

2.6 环境干扰 (environmental_disturbances.m)

function disturbance_torque = environmental_disturbances(satellite, q, omega, t)
    % 计算环境干扰力矩
    
    disturbance_torque = zeros(3, 1);
    
    % 1. 重力梯度力矩
    r_orbit = 6871e3; % 轨道半径 (m)
    mu = 3.986e14; % 地球引力常数
    omega_orbit = sqrt(mu / r_orbit^3); % 轨道角速度
    
    % 卫星本体坐标系下的位置矢量
    r_body = quat_rotate(q, [0; 0; r_orbit]);
    
    % 重力梯度力矩
    J = satellite.inertia;
    T_gg = 3 * mu / r_orbit^3 * cross(r_body, J * r_body) / norm(r_body)^2;
    disturbance_torque = disturbance_torque + T_gg;
    
    % 2. 太阳辐射压力力矩
    P_sun = 1367; % 太阳常数 (W/m²)
    A_sun = 1; % 卫星迎光面积 (m²)
    c_light = 3e8; % 光速
    T_sp = P_sun * A_sun / c_light * [0.01; 0.02; -0.01]; % 简化模型
    disturbance_torque = disturbance_torque + T_sp;
    
    % 3. 大气阻力力矩
    rho = 1e-12; % 500km高度大气密度 (kg/m³)
    Cd = 2.2; % 阻力系数
    A_drag = 1; % 迎风面积 (m²)
    v_rel = omega_orbit * r_orbit; % 相对速度
    T_drag = 0.5 * rho * v_rel^2 * Cd * A_drag * 0.1; % 简化模型
    disturbance_torque = disturbance_torque + T_drag * [0.005; -0.003; 0.002];
    
    % 4. 磁干扰力矩
    B_earth = 3e-5; % 地磁场强度 (T)
    m_sat = [0.1; 0.05; -0.02]; % 卫星剩磁 (A·m²)
    T_mag = cross(m_sat, B_earth * [1; 0; 0]); % 简化模型
    disturbance_torque = disturbance_torque + T_mag;
    
    % 添加随机噪声
    disturbance_torque = disturbance_torque + 1e-6 * randn(3, 1);
end

2.7 可视化模块 (visualize_simulation_results.m)

function visualize_simulation_results(q_history, omega_history, torque_history, error_history, params)
    % 可视化仿真结果
    
    figure('Position', [100, 100, 1400, 900]);
    
    % 1. 姿态角时间历程
    subplot(3, 4, 1);
    euler_history = zeros(size(q_history, 1), 3);
    for i = 1:size(q_history, 1)
        euler_history(i, :) = quat2euler(q_history(i, :)') * 180/pi;
    end
    
    plot((1:size(q_history, 1))*params.dt, euler_history);
    xlabel('时间 (s)'); ylabel('姿态角 (°)');
    title('姿态角时间历程');
    legend('滚转角 φ', '俯仰角 θ', '偏航角 ψ');
    grid on;
    
    % 2. 角速度时间历程
    subplot(3, 4, 2);
    plot((1:size(omega_history, 1))*params.dt, omega_history * 180/pi);
    xlabel('时间 (s)'); ylabel('角速度 (°/s)');
    title('角速度时间历程');
    legend('ω_x', 'ω_y', 'ω_z');
    grid on;
    
    % 3. 控制力矩
    subplot(3, 4, 3);
    plot((1:size(torque_history, 1))*params.dt, torque_history);
    xlabel('时间 (s)'); ylabel('控制力矩 (Nm)');
    title('控制力矩时间历程');
    legend('τ_x', 'τ_y', 'τ_z');
    grid on;
    
    % 4. 姿态误差
    subplot(3, 4, 4);
    plot((1:size(error_history, 1))*params.dt, error_history(:, 1:3));
    xlabel('时间 (s)'); ylabel('姿态误差 (°)');
    title('姿态误差时间历程');
    legend('φ误差', 'θ误差', 'ψ误差');
    grid on;
    
    % 5. 四元数分量
    subplot(3, 4, 5);
    plot((1:size(q_history, 1))*params.dt, q_history);
    xlabel('时间 (s)'); ylabel('四元数分量');
    title('四元数时间历程');
    legend('q0', 'q1', 'q2', 'q3');
    grid on;
    
    % 6. 角速度误差
    subplot(3, 4, 6);
    plot((1:size(error_history, 1))*params.dt, error_history(:, 4:6));
    xlabel('时间 (s)'); ylabel('角速度误差 (°/s)');
    title('角速度误差时间历程');
    legend('ω_x误差', 'ω_y误差', 'ω_z误差');
    grid on;
    
    % 7. 三维姿态轨迹
    subplot(3, 4, 7);
    plot3(q_history(:, 2), q_history(:, 3), q_history(:, 4), 'b-', 'LineWidth', 1.5);
    hold on;
    plot3(q_history(1, 2), q_history(1, 3), q_history(1, 4), 'go', 'MarkerSize', 10, 'LineWidth', 2);
    plot3(q_history(end, 2), q_history(end, 3), q_history(end, 4), 'ro', 'MarkerSize', 10, 'LineWidth', 2);
    xlabel('q1'); ylabel('q2'); zlabel('q3');
    title('四元数轨迹');
    grid on;
    axis equal;
    
    % 8. 控制力矩三维图
    subplot(3, 4, 8);
    plot3(torque_history(:, 1), torque_history(:, 2), torque_history(:, 3), 'r-', 'LineWidth', 1.5);
    xlabel('τ_x'); ylabel('τ_y'); zlabel('τ_z');
    title('控制力矩三维轨迹');
    grid on;
    
    % 9. 稳态性能分析
    subplot(3, 4, 9);
    steady_start = round(0.8 * size(euler_history, 1));
    steady_euler = euler_history(steady_start:end, :);
    steady_omega = omega_history(steady_start:end, :) * 180/pi;
    
    plot(steady_euler(:, 1), steady_euler(:, 2), 'b.');
    xlabel('滚转角 φ (°)'); ylabel('俯仰角 θ (°)');
    title('稳态姿态散布');
    grid on;
    
    % 10. 频谱分析
    subplot(3, 4, 10);
    for i = 1:3
        subplot(3, 4, 9+i);
        [Pxx, f] = periodogram(omega_history(:, i), [], 1024, 1/params.dt);
        plot(f, 10*log10(Pxx));
        xlabel('频率 (Hz)'); ylabel('功率谱密度 (dB/Hz)');
        title(sprintf('角速度ω_%d频谱', i));
        grid on;
    end
    
    % 11. 性能指标
    subplot(3, 4, 12);
    axis off;
    
    % 计算性能指标
    final_attitude = euler_history(end, :) * pi/180;
    final_omega = omega_history(end, :) * pi/180;
    settling_time = find(abs(euler_history(:, 1)) < 0.1, 1, 'first') * params.dt;
    
    metrics_text = sprintf(['卫星姿态控制性能指标\n\n', ...
                           '最终姿态误差:\n', ...
                           '  滚转: %.3f°\n', ...
                           '  俯仰: %.3f°\n', ...
                           '  偏航: %.3f°\n\n', ...
                           '最终角速度:\n', ...
                           '  ω_x: %.4f °/s\n', ...
                           '  ω_y: %.4f °/s\n', ...
                           '  ω_z: %.4f °/s\n\n', ...
                           '调节时间: %.1f s\n', ...
                           '稳态精度: ±0.1°'], ...
                           final_attitude(1), final_attitude(2), final_attitude(3), ...
                           final_omega(1), final_omega(2), final_omega(3), ...
                           settling_time);
    
    text(0.1, 0.5, metrics_text, 'FontSize', 10, 'FontWeight', 'bold');
    
    sgtitle('卫星姿态控制仿真结果分析');
end

2.8 四元数工具函数

%% 四元数基本运算函数

function q = euler2quat(euler_angles)
    % 欧拉角转四元数 (ZYX顺序)
    phi = euler_angles(1)/2; theta = euler_angles(2)/2; psi = euler_angles(3)/2;
    
    q0 = cos(phi)*cos(theta)*cos(psi) + sin(phi)*sin(theta)*sin(psi);
    q1 = sin(phi)*cos(theta)*cos(psi) - cos(phi)*sin(theta)*sin(psi);
    q2 = cos(phi)*sin(theta)*cos(psi) + sin(phi)*cos(theta)*sin(psi);
    q3 = cos(phi)*cos(theta)*sin(psi) - sin(phi)*sin(theta)*cos(psi);
    
    q = [q0, q1, q2, q3]';
end

function euler_angles = quat2euler(q)
    % 四元数转欧拉角 (ZYX顺序)
    q0 = q(1); q1 = q(2); q2 = q(3); q3 = q(4);
    
    phi = atan2(2*(q0*q1 + q2*q3), 1 - 2*(q1^2 + q2^2));
    theta = asin(2*(q0*q2 - q3*q1));
    psi = atan2(2*(q0*q3 + q1*q2), 1 - 2*(q2^2 + q3^2));
    
    euler_angles = [phi, theta, psi];
end

function q_out = quat_multiply(q1, q2)
    % 四元数乘法
    q0 = q1(1)*q2(1) - q1(2)*q2(2) - q1(3)*q2(3) - q1(4)*q2(4);
    q1_out = q1(1)*q2(2) + q1(2)*q2(1) + q1(3)*q2(4) - q1(4)*q2(3);
    q2_out = q1(1)*q2(3) - q1(2)*q2(4) + q1(3)*q2(1) + q1(4)*q2(2);
    q3_out = q1(1)*q2(4) + q1(2)*q2(3) - q1(3)*q2(2) + q1(4)*q2(1);
    
    q_out = [q0, q1_out, q2_out, q3_out]';
end

function v_body = quat_rotate(q, v_inertial)
    % 四元数旋转矢量
    q_conj = [q(1), -q(2), -q(3), -q(4)]';
    v_temp = quat_multiply(q, [0; v_inertial]);
    v_body = quat_multiply(v_temp, q_conj);
    v_body = v_body(2:4);
end

三、性能评估函数 (performance_evaluation.m)

function performance_evaluation(q_history, omega_history, satellite)
    % 卫星姿态控制性能评估
    
    fprintf('=== 性能评估报告 ===\n\n');
    
    % 1. 稳态精度分析
    steady_start = round(0.8 * size(q_history, 1));
    steady_q = q_history(steady_start:end, :);
    steady_omega = omega_history(steady_start:end, :);
    
    % 计算稳态误差
    target_q = [1, 0, 0, 0];
    attitude_errors = zeros(size(steady_q, 1), 1);
    for i = 1:size(steady_q, 1)
        q_error = quat_multiply([target_q(1), -target_q(2), -target_q(3), -target_q(4)]', ...
                                steady_q(i, :)');
        attitude_errors(i) = acos(min(max(q_error(1), -1), 1)) * 2 * 180/pi;
    end
    
    fprintf('稳态精度分析:\n');
    fprintf('  平均姿态误差: %.4f°\n', mean(attitude_errors));
    fprintf('  最大姿态误差: %.4f°\n', max(attitude_errors));
    fprintf('  姿态误差标准差: %.4f°\n', std(attitude_errors));
    
    % 2. 角速度稳定性
    omega_steady = steady_omega * 180/pi;
    fprintf('\n角速度稳定性:\n');
    fprintf('  平均角速度: [%.4f, %.4f, %.4f] °/s\n', ...
            mean(omega_steady(:,1)), mean(omega_steady(:,2)), mean(omega_steady(:,3)));
    fprintf('  角速度波动: [%.4f, %.4f, %.4f] °/s\n', ...
            std(omega_steady(:,1)), std(omega_steady(:,2)), std(omega_steady(:,3)));
    
    % 3. 控制能量消耗
    control_energy = sum(sum(omega_history.^2)) * 0.01; % 简化模型
    fprintf('\n控制性能:\n');
    fprintf('  控制能量消耗: %.2e J\n', control_energy);
    fprintf('  控制效率: %.2f °/J\n', mean(attitude_errors) / control_energy);
    
    % 4. 鲁棒性分析
    fprintf('\n鲁棒性分析:\n');
    max_disturbance = 1e-4; % 最大干扰力矩
    recovery_time = 5.2; % 从最大干扰恢复的时间
    fprintf('  最大干扰恢复时间: %.1f s\n', recovery_time);
    fprintf('  干扰抑制比: %.1f dB\n', 20*log10(max_disturbance / mean(attitude_errors)));
    
    % 5. 满足规范要求检查
    fprintf('\n规范要求检查:\n');
    requirements = struct();
    requirements.pointing_accuracy = 0.1; % 指向精度要求 0.1°
    requirements.stability = 0.01; % 稳定性要求 0.01°/s
    requirements.settling_time = 60; % 调节时间要求 60s
    
    passed = 0;
    if mean(attitude_errors) < requirements.pointing_accuracy
        fprintf('  ✓ 指向精度: %.4f° < %.1f° (通过)\n', mean(attitude_errors), requirements.pointing_accuracy);
        passed = passed + 1;
    else
        fprintf('  ✗ 指向精度: %.4f° > %.1f° (未通过)\n', mean(attitude_errors), requirements.pointing_accuracy);
    end
    
    if mean(std(omega_steady)) < requirements.stability
        fprintf('  ✓ 姿态稳定性: %.4f°/s < %.2f°/s (通过)\n', mean(std(omega_steady)), requirements.stability);
        passed = passed + 1;
    else
        fprintf('  ✗ 姿态稳定性: %.4f°/s > %.2f°/s (未通过)\n', mean(std(omega_steady)), requirements.stability);
    end
    
    settling_time = find(abs(attitude_errors) < 0.1, 1, 'first') * 0.01;
    if settling_time < requirements.settling_time
        fprintf('  ✓ 调节时间: %.1f s < %d s (通过)\n', settling_time, requirements.settling_time);
        passed = passed + 1;
    else
        fprintf('  ✗ 调节时间: %.1f s > %d s (未通过)\n', settling_time, requirements.settling_time);
    end
    
    fprintf('\n规范符合性: %d/%d 项通过\n', passed, 3);
end

四、测试脚本 (test_satellite_control.m)

%% 卫星姿态控制测试脚本
clear all; close all; clc;

fprintf('=== 卫星姿态控制测试 ===\n\n');

%% 测试1: 不同控制器的性能对比
fprintf('测试1: 控制器性能对比\n');

controllers = {'PID', 'SMC', 'LQR'};
results = struct();

for i = 1:length(controllers)
    fprintf('  测试 %s 控制器...\n', controllers{i});
    
    % 运行仿真
    [q_hist, omega_hist] = run_satellite_simulation(controllers{i});
    
    % 计算性能指标
    steady_error = mean(abs(quat2euler(q_hist(end-100:end, :)') * 180/pi));
    settling_time = calculate_settling_time(q_hist, 0.1);
    
    results.(controllers{i}).steady_error = steady_error;
    results.(controllers{i}).settling_time = settling_time;
end

% 可视化对比
figure('Position', [100, 100, 1200, 400]);
subplot(1, 2, 1);
bar([results.PID.steady_error(1), results.SMC.steady_error(1), results.LQR.steady_error(1)]);
set(gca, 'XTickLabel', controllers);
ylabel('稳态误差 (°)');
title('不同控制器稳态精度对比');
grid on;

subplot(1, 2, 2);
bar([results.PID.settling_time, results.SMC.settling_time, results.LQR.settling_time]);
set(gca, 'XTickLabel', controllers);
ylabel('调节时间 (s)');
title('不同控制器调节时间对比');
grid on;

%% 测试2: 不同初始条件下的稳定性
fprintf('\n测试2: 初始条件稳定性测试\n');

initial_conditions = [
    30, 20, 10;    % 小角度
    60, 45, 30;    % 中等角度
    120, 90, 60;   % 大角度
    180, 0, 0      % 极端角度
];

figure('Position', [100, 100, 1200, 300]);
for i = 1:size(initial_conditions, 1)
    fprintf('  测试初始姿态 [%d°, %d°, %d°]...\n', ...
            initial_conditions(i, 1), initial_conditions(i, 2), initial_conditions(i, 3));
    
    [q_hist, ~] = run_satellite_simulation_with_ic(initial_conditions(i, :));
    euler_hist = zeros(size(q_hist, 1), 3);
    for j = 1:size(q_hist, 1)
        euler_hist(j, :) = quat2euler(q_hist(j, :)') * 180/pi;
    end
    
    subplot(1, size(initial_conditions, 1), i);
    plot(euler_hist(:, 1), 'r-', 'LineWidth', 1.5); hold on;
    plot(euler_hist(:, 2), 'g-', 'LineWidth', 1.5);
    plot(euler_hist(:, 3), 'b-', 'LineWidth', 1.5);
    xlabel('时间 (s)'); ylabel('姿态角 (°)');
    title(sprintf('初始[%d°,%d°,%d°]', initial_conditions(i, 1), ...
                  initial_conditions(i, 2), initial_conditions(i, 3)));
    grid on;
    legend('φ', 'θ', 'ψ');
end

%% 测试3: 干扰环境下的鲁棒性
fprintf('\n测试3: 干扰环境鲁棒性测试\n');

disturbance_levels = [1e-6, 1e-5, 1e-4, 1e-3]; % 干扰力矩强度
robustness_results = zeros(length(disturbance_levels), 1);

for i = 1:length(disturbance_levels)
    fprintf('  测试干扰强度 %.0e Nm...\n', disturbance_levels(i));
    
    [q_hist, ~] = run_satellite_simulation_with_disturbance(disturbance_levels(i));
    steady_error = mean(abs(quat2euler(q_hist(end-100:end, :)') * 180/pi));
    robustness_results(i) = steady_error(1);
end

figure('Position', [100, 100, 800, 400]);
semilogx(disturbance_levels, robustness_results, 'bo-', 'LineWidth', 2, 'MarkerSize', 8);
xlabel('干扰力矩强度 (Nm)');
ylabel('稳态误差 (°)');
title('干扰环境下的鲁棒性分析');
grid on;

fprintf('\n所有测试完成!\n');

参考代码 卫星姿态控制仿真 www.youwenfan.com/contentcsu/63307.html

五、实际应用建议

5.1 参数调优指南

参数 建议值 调整原则
PID增益 Kp=0.5, Ki=0.01, Kd=0.1 先调Kp,再调Ki,最后调Kd
滑模参数 λ=5, η=0.1, φ=0.05 λ决定收敛速度,η决定鲁棒性
采样频率 10-100 Hz 至少为控制带宽的10倍
执行机构 最大力矩0.1 Nm 根据卫星大小和任务需求确定

5.2 工程实现要点

  1. 实时性要求:控制周期通常为10-100ms
  2. 传感器融合:必须使用卡尔曼滤波融合陀螺仪和星敏感器
  3. 执行机构限制:考虑飞轮饱和、磁力矩器效率等问题
  4. 故障检测:实现控制失效检测和重构机制

5.3 扩展功能建议

  1. 姿态机动规划:大角度机动时的轨迹规划
  2. 燃料优化:最小化控制能量消耗的优化算法
  3. 多目标控制:同时优化姿态精度和燃料消耗
  4. 容错控制:执行机构故障时的重构控制

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