分区四元数航天器姿态控制 & Matlab复现

本文介绍了在实际工程应用中,如何使用分区四元数方法设计航天器的姿态控制系统,考虑了控制力矩和角速度的限制,并通过角速度规划器和PI控制策略实现姿态机动和稳定。文中详细展示了仿真过程和结果,包括角速度、控制力矩等关键变量的变化情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在实际应用中,控制算法需要考虑各种工程约束,包括控制力矩受限即不能逾越飞轮或喷气执行机构的最大控制力矩角速度限制,以满足航天器平稳性需求、导航带宽需求以及角速率陀螺量程等要求;控制模式一体化要求, 尽可能将机动和跟踪两种模式用一个统一公式表达等等。

分区四元数姿态控制[1]的基本思想是把姿态分为内区和外区,设计角速度规划器,在外区以恒定的、满足约束的角速度使航天器姿态快速机动到内区;在内区通过PI控制使角速度随姿态线性变化,积分项还可以抵抗常值干扰力矩。此外,添加对力矩的饱和约束,满足控制力矩受限的工程约束。内区与外区结合,同时满足姿态机动和姿态稳定要求。下图为角速度规划器。

其详细控制模型和其他特点见论文[1]。

复现结果如下,4张图依次是q-w相平面轨迹、姿态四元数、角速度、控制力矩。

主函数如下:

% 分区四元数航天器姿态控制
clear; clc; close all;
%% 参数定义(国际单位)
global I qExp d
% 系统参数
I = diag([4012, 2807, 2334]); % 惯性矩阵
% 控制参数
global M1 M2 tauMax k1 k2 alpha0 wT sBar qTbar k
M1 = 0.07475; M2 = 0.06725; % 限幅参数
tauMax = 300; % 最大控制力矩
k1 = 2; k2 = 0.78; % 角速度跟踪律的PI系数,rad/s
alpha0 = [0, 0, 0];
wT = 3*pi/180; % 最大角速度幅值
sBar = (M1+M2)/k1; % 控制力切换误差, rad/s
qTbar = 0.0349; % 分区四元数边界值
k = wT/qTbar; % 1.5 rad/s
% 初始状态
situ = 1;
switch(situ)
    case 1
        w0 = [0; 0; 0]; % 角速度
        q0 = [0.707; 0; 0.707; 0]; % 姿态四元数
    case 2
         w0 = [0; 20; 0]*pi/180; % 角速度
         q0 = [0.707; 0; 0.707; 0]; % 姿态四元数
end
% 期望状态
% qExp = @(t) [cos(t/100*pi-pi/4); 0; sin(t/100*pi-pi/4); 0];
qExp = @(t) [1; 0; 0; 0];
% 干扰
d = [150; 150; 150];
% 仿真参数
tspan = [0 200];
% 参数检查
if ~(M1 > M2 && M2 > norm(I^(-1)*d, inf))
    warning('不满足定理1条件3');
end
if abs(sBar - (M1+M2)/k1) > 1e-6
    warning('不满足定理1条件4');
end
judge = norm(I, inf)*((2*M1/k1+wT)^2 + sqrt(3)/2*k*(2*M1/k1+wT) + M1);
if tauMax < judge*0.8
    warning('不满足定理1条件5');
end
%% 仿真
[t, y] = ode45(@dynamic, tspan, [q0', w0', alpha0]);
%% 绘图
% 计算力矩、期望角速度
n = length(t);
tau = zeros(3, n); wd = zeros(3, n);
qEr = zeros(4, n);
for ii = 1: n
    [tau(:, ii), wd(:, ii), qEr(:, ii)] = showDynamicPara(t(ii), y(ii, :));
end
figure(1);% 姿态时间曲线
% plot(t, y(:, 1), t, y(:, 2), t, y(:, 3), t, y(:, 4), 'linewidth', 1.25);
plot(t, qEr(1, :), t, qEr(2, :), t, qEr(3, :), t, qEr(4, :), 'linewidth', 1.25);
xlabel('t(s)'); ylabel('误差四元数'); grid on;
legend({'q0'; 'q1'; 'q2'; 'q3'});
figure(2);% 角速度时间曲线
plot(t, y(:, 5)*180/pi, t, y(:, 6)*180/pi, t, y(:, 7)*180/pi, 'linewidth', 1.25);
xlabel('t(s)'); ylabel('w(°/s)'); grid on;
legend({'wx'; 'wy'; 'wz'});
figure(3); % 期望角速度
wd = wd*180/pi;
plot(t, wd(1, :), t, wd(2, :), t, wd(3, :), 'linewidth', 1.25);
xlabel('t(s)'); ylabel('wd(°/s)'); grid on;
legend({'wdx'; 'wdy'; 'wdz'});
figure(4); % 力矩
plot(t, tau(1, :), t, tau(2, :), t, tau(3, :), 'linewidth', 1.25);
xlabel('t(s)'); ylabel('M(N·m)'); grid on;
legend({'Mx'; 'My'; 'Mz'});
figure(5); % 角速度对比
subplot(2, 2, 1);
plot(t, y(:, 5)*180/pi, t, wd(1, :), 'linewidth', 1.25);
xlabel('t(s)'); ylabel('wx(°/s)'); grid on;
legend({'wx'; 'wdx'});
subplot(2, 2, 2);
plot(t, y(:, 6)*180/pi, t, wd(2, :), 'linewidth', 1.25);
xlabel('t(s)'); ylabel('wy(°/s)'); grid on;
legend({'wy'; 'wdy'});
subplot(2, 2, 3);
plot(t, y(:, 7)*180/pi, t, wd(3, :), 'linewidth', 1.25);
xlabel('t(s)'); ylabel('wz(°/s)'); grid on;
legend({'wz'; 'wdz'});
figure(6); % 相平面轨迹
subplot(2, 2, 1);
plot(y(:, 2), y(:, 5)*180/pi, 'linewidth', 1.25);
xlabel('q1'); ylabel('wx(°/s)'); grid on;
subplot(2, 2, 2);
plot(y(:, 3), y(:, 6)*180/pi, 'linewidth', 1.25);
xlabel('q2'); ylabel('wy(°/s)'); grid on;
subplot(2, 2, 3);
plot(y(:, 4), y(:, 7)*180/pi, 'linewidth', 1.25);
xlabel('q3'); ylabel('wz(°/s)'); grid on;
subplot(2, 2, 4);
wn = sqrt((y(:, 5)).^2 + (y(:, 6)).^2 + (y(:, 7)).^2);
plot(2*acos(y(:, 1)), wn*180/pi, 'linewidth', 1.25);
xlabel('\theta(°)'); ylabel('wn(°/s)'); grid on;

动力学仿真函数:

function dx = dynamic(t, x)
%% 调试
if t > 50
    aa = 1;
end
%% 参数定义
q = x(1:4); % 姿态四元数
wb = x(5:7); % 角速度
dx = zeros(10, 1);
global I d qExp
%% 计算姿态误差
qD = qExp(t); % 当前时刻目标姿态
qDe = [qD(1); -qD(2); -qD(3); -qD(4)]; % 目标姿态四元数共轭
qE = quatMultiply(qDe, q);
%% 运动学
dx(1:4) = 0.5*quatMultiply(q, [0;wb]);
%% 控制律
[tau, wd, dAlpha] = partQuat(t, [qE; x(5:10)], dx(2:4));
dx(8:10) = dAlpha;
%% 动力学
dx(5:7) = I^(-1)*(tau + d - cross(wb, I*wb));
end

分区四元数控制子函数:

% 分区四元数控制律
function [tau, wd, dAlpha] = partQuat(t, x, dq)
%% 参数设定
% 控制参数
global M1 M2 tauMax k1 k2 wT sBar qTbar k
global I
% 状态量
q = x(1:4); % 姿态四元数
% 保证姿态控制方向的最小路径
if q(1) < 0
    q(2:4) = -q(2:4);
end
wb = x(5:7); % 角速度
alpha = x(8:10); % 积分器
dAlpha = zeros(3, 1);
%% 分区四元数控制
% 角速度规划器
if norm(q(2:4)) <= qTbar
    wd = -k*q(2:4); % 期望角速度
    dWd = -k*dq; % 期望角速度导数
else
    wd = -wT * q(2:4)/norm(q(2:4)); % 期望角速度
    % 期望角速度导数
    dWd = zeros(3, 1);
    qx = q(2); qy = q(3); qz = q(4);
    dWd(1) = ((qy^2+qz^2)*dq(1) - qx*(qy*dq(2) + qz*dq(3)))/(norm(q))^3;
    dWd(2) = ((qx^2+qz^2)*dq(2) - qy*(qz*dq(3) + qx*dq(1)))/(norm(q))^3;
    dWd(3) = ((qx^2+qy^2)*dq(3) - qz*(qx*dq(1) + qy*dq(2)))/(norm(q))^3;
end
% 误差角速度
s = wb - wd;
% 设置积分器饱和限制
for ii = 1:3
    if abs(abs(k2*alpha(ii)) - M2) < 1e-6 && alpha(ii)*s(ii) > 0
        dAlpha(ii) = 0;
    else
        dAlpha(ii) = s(ii);
    end
end
% 控制律
if norm(s, inf) <= sBar
    sigmaM1 = sat(-k1*s - k2*alpha, M1);
    tau = cross(wb, I*wb) + I*dWd + I*sigmaM1;
else
    tau = -tauMax * sign(s);
end
end
%% 矢量饱和函数
function out = sat(vec, M)
    n = length(vec);
    out = zeros(n, 1);
    for i = 1:n
        if abs(vec(i)) <= M
            out(i) = vec(i);
        elseif vec(i) > M
            out(i) = M;
        else
            out(i) = -M;
        end
    end
end

四元数乘法函数:

% 四元数圈乘计算P×Q
function out = quatMultiply(P, Q)
matQ = [Q(1), -Q(2), -Q(3), -Q(4);
        Q(2), Q(1), Q(4), -Q(3);
        Q(3), -Q(4), Q(1), Q(2);
        Q(4), Q(3), -Q(2), Q(1)];
out = matQ*P;
end

结果计算辅助函数

% 绘图用力矩、期望角速度
function [tau, wd, qE] = showDynamicPara(t, x)
%% 参数定义
q = x(1:4)'; % 姿态四元数
wb = x(5:7)'; % 角速度
%% 计算姿态误差
global qExp;
qD = qExp(t); % 当前时刻目标姿态
qDe = [qD(1); -qD(2); -qD(3); -qD(4)]; % 目标姿态四元数共轭
qE = quatMultiply(qDe, q);
%% 运动学
dx = 0.5*quatMultiply(q, [0;wb]);
%% 控制律
[tau, wd, ~] = partQuat(t, [qE; x(5:10)'], dx(2:4));
end

参考文献

[1]张洪华,关轶峰,胡锦昌,等.分区四元数姿态控制[J].自动化学报,2015,41(07):1341-1349.DOI:10.16383/j.aas.2015.c140624.

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Williamlliw

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值