Contents

CMG demo

This tests the dynamics with 3 CMGs.

It looks at angular momentum conservation and looks for a symmetric inertia matrix

------------------------------------------------------------------------
See also: RHSCMG, StepTorque, RK4, TimeLabl, Plot2D, NewFig, Figui
------------------------------------------------------------------------
%--------------------------------------------------------------------------
%   Copyright (c) 2020 Princeton Satellite Systems, Inc.
%   All rights reserved.
%--------------------------------------------------------------------------
%   Since version 2020.2
%--------------------------------------------------------------------------

User inputs

Simulation control

dT        = 0.1;
tEnd      = 100;

% Disturbance torque
torque    = [0;0;0];

% Core attitude states
q         = [1;0;0;0];  % Quaternion
omega     = [0.01;0.2;0.01]; % Angular rate

% Wheel and gimbal rates
wGW       = 0.1*rand(6,1);

Initialize the simlation

x         = [q;0;0;0;omega;wGW];

% Storage for plots
n         = ceil(tEnd/dT);
xP        = zeros(length(x)+4,n+1);

% Get default data structure
d                   = RHSCMG;
d.fDist             = @StepTorque;  % Disturbance function pointer
d.torqueDisturbance = torque;
t                   = 0;

% Get the initial momentum
[~,~,h0]            = RHSCMG(x,t,d);

Simulation loop using 4th order Runge-Kutta

for k = 1:n

  % Control
  d.torqueG = [0;0;0];
  d.torqueW = [0;0;0];

  % For plotting
  [~,inr,h] = RHSCMG(x,t,d);
	inrErr    = max(max(abs(inr - inr')));
  xP(:,k)   = [x;h-h0;inrErr];

  % Passes a pointer to RHSRigidBody for numerical integration
  x         = RK4(@RHSCMG,x,dT,t,d);
  t         = t + dT;
end

% Last point for plotting
[~,inr,h]	= RHSCMG(x,t,d);
inrErr    = max(max(abs(inr - inr')));
xP(:,n+1) = [x;h-h0;inrErr];

% Reduce the time step
dT2         = dT/1000;

% Storage for plots
n2          = ceil(tEnd/dT);
xP2         = zeros(3,n2+1);

x         = [q;0;0;0;omega;wGW];

Simulation loop using 4th order Runge-Kutta with a smaller time step

for k = 1:n2

  % Control
  d.torqueG = [0;0;0];
  d.torqueW = [0;0;0];

  % For plotting
  [~,~,h]   = RHSCMG(x,t,d);
  xP2(:,k)  = h-h0;

  % Passes a pointer to RHSRigidBody for numerical integration
  x         = RK4(@RHSCMG,x,dT2,t,d);
  t         = t + dT2;
end

% Last point for plotting
[~,~,h]	= RHSCMG(x,t,d);
xP2(:,n+1) = h-h0;

Plotting

tSec  	= (0:n)*dT;
[t,tL]	= TimeLabl(tSec);

yL      = [d.states(:)' {'\Delta H_x (Nms)'} {'\Delta H_y (Nms)'} {'\Delta H_z (Nms)'}  {'\Delta I (kg-m^2)'}];

k = 5:7;
Plot2D(t,xP(k,:),tL,yL(k),'Gimbal Angles')

k = 8:10;
Plot2D(t,xP(k,:),tL,yL(k),'Angular Rate')

k = 11:13;
Plot2D(t,xP(k,:),tL,yL(k),'Gimbal Rate')

k = 14:16;
Plot2D(t,xP(k,:),tL,yL(k),'Wheel Rate')

k = 17:20;
Plot2D(t,xP(k,:),tL,yL(k),'Angular Momentum and Inertia')

k = 17:19;
tSec  	= (0:n2)*dT;
[t2,tL]	= TimeLabl(tSec);
dTL     = sprintf('DT = %7.4f',dT);
dTL2    = sprintf('DT = %7.4f',dT2);


NewFig('Angular Momentum')
subplot(3,1,1)
plot(t,xP(17,:))
hold on
plot(t2,xP2(1,:));
grid on
XLabelS(tL);
YLabelS('H_x (Nms)');
legend(dTL,dTL2);

subplot(3,1,2)
plot(t,xP(18,:))
hold on
plot(t2,xP2(2,:));
grid on
XLabelS(tL);
YLabelS('H_x (Nms)');
legend(dTL,dTL2);

subplot(3,1,3)
plot(t,xP(19,:))
hold on
plot(t2,xP2(3,:));
grid on
XLabelS(tL);
YLabelS('H_x (Nms)');
legend(dTL,dTL2);

Figui

%--------------------------------------