# 0130實驗結果 ## 只有考慮J2影響,無阻力 ### 原本程式J2公式與計算方式 ![image](https://hackmd.io/_uploads/ryd70EL5a.png) ```matlab % J2 perturbation z2 = rvector(3)^2; r2 = r^2; factor = 1.5 * J2 * mu * RE^2 / r2^2; ax_J2 = rvector(1) / r * (5 * z2 / r2 - 1) * factor; ay_J2 = rvector(2) / r * (5 * z2 / r2 - 1) * factor; az_J2 = rvector(3) / r * (5 * z2 / r2 - 3) * factor; a_J2 = [ax_J2; ay_J2; az_J2]; ``` ### 更新後程式J2公式與計算方式 公式來源:Spacecraft Formation Flying: Dynamics, Control and Navigation ![image](https://hackmd.io/_uploads/SkFN5Cg56.png) ```matlab % J2 perturbation Z = rvector(3); Z2 = Z^2; r2 = r^2; r3 = r^3; r5 = r^5; % Calculate the J2 perturbation for each component ax_J2 = (-mu* rvector(1) / r3 ) * (1 - (3/2) * J2 * (RE^2 / r2) * (5 * Z2 / r2 - 1)); ay_J2 = (-mu* rvector(2) / r3 ) * (1 - (3/2) * J2 * (RE^2 / r2) * (5 * Z2 / r2 - 1)); az_J2 = (-mu* rvector(3) / r3 ) * (1 - (3/2) * J2 * (RE^2 / r2) * (5 * Z2 / r2 - 3)); % The total gravitational acceleration including J2 perturbation a_J2 = [ax_J2; ay_J2; az_J2]; ``` ### 兩個數學式展開 ![image](https://hackmd.io/_uploads/S1ja0NLq6.png) 只是差在有沒有先加入重力影響,其他數學式基本上是相同的 ### 比較新、舊 a_J2的差異 ![image](https://hackmd.io/_uploads/B1LbJr85T.png) 平均誤差1.12995E-08 ### 主程式 ``` matlab % FORMOSAT 5 % 1 42920U 17049A 23352.88591631 .00000349 00000-0 99784-4 0 9991 % 2 42920 98.3089 68.1091 0010834 12.0422 348.1030 14.50778162334536 clc; clear; close all; warning('off','all') G = 6.67430e-20; % km^3/(kg * s^2) m1 = 5.97219e24; % kg m2 = 475; %Mass of the satellite kg %mu = G * m1; % km^3/s^2 mu = 398600.44189; % km^3/s^2 RE = 6378.12; % km utc = [2000 1 1 11 59 28]; Cd = 2.2; % Example value for drag coefficient A = 2.120773439350248; % Example value for cross-sectional area in square meters r0 = [2646.803786119759 6581.416179767096 14.64870964671942]; % km v0 = [0.9992138358820861 -0.4201725262436247 7.421268328550636]; % km/s Y0 = [r0 v0]; t0 = 0; % seconds tf = 86400*14; % seconds, period of one orbit time_step = 60; % specify the time step in seconds num_steps = length(t0:time_step:tf); global a_J2_values; a_J2_values = zeros(num_steps, 3); % Assuming 'num_steps' is the total number of time steps options = odeset('RelTol', 1e-13, 'AbsTol', 1e-13, 'MaxStep', time_step); [t, Y] = ode89(@(t, Y) relative_motion_drag_J2(t, Y, mu, Cd, A, m2, round(t/time_step) + 1), t0:time_step:tf, Y0, options); rvec = Y(:, 1:3); vvec = Y(:, 4:6); rmag = vecnorm(rvec, 2, 2); %vmag = vecnorm(vvec, 2, 2); altitude = rmag - RE; % Plot altitude as a function of time figure; plot(t/86400, altitude); xlabel('Time (day)'); ylabel('Altitude (km)'); title('Altitude vs. Time'); % Create a new figure for the 3D orbit figure; [xx, yy, zz] = sphere(200); surf(RE * xx, RE * yy, RE * zz) colormap(light_blue) clim([-RE / 100 RE / 100]) shading interp % Draw and label the X, Y, and Z axes line([0 2 * RE], [0 0], [0 0]); text(2 * RE + RE / 10, 0, 0, 'x') line([0 0], [0 2 * RE], [0 0]); text(0, 2 * RE + RE / 10, 0, 'y') line([0 0], [0 0], [0 2 * RE]); text(0, 0, 2 * RE + RE / 10, 'z') hold on plot3(rvec(:, 1), rvec(:, 2), rvec(:, 3), 'k') plot3(rvec(1, 1), rvec(1, 2), rvec(1, 3), 'go'); % Starting point plot3(rvec(end, 1), rvec(end, 2), rvec(end, 3), 'ro'); % Ending point % Specify some properties of the graph grid on axis equal xlabel('km') ylabel('km') zlabel('km') title('3D Orbit'); function map = light_blue r = 0.8; g = r; b = 1.0; map = [r g b; 0 0 0; r g b]; end function Ydot = relative_motion_drag_J2(t, Y, mu, Cd, A, m,step_index) global a_J2_values; % Earth's J2 coefficient and equatorial radius J2 = 1.08262668e-3; RE = 6378.12; % km Omega = 7.2921*10^-5; Omega = [0.0, 0.0, Omega]'; % Extract position and velocity vectors rvector = Y(1:3); vvector = Y(4:6); % Standard gravitational acceleration r = norm(rvector); a_gravity = -mu * rvector / r^3; % J2 perturbation Z = rvector(3); Z2 = Z^2; r2 = r^2; r3 = r^3; r5 = r^5; % Calculate the J2 perturbation for each component ax_J2 = (-mu* rvector(1) / r3 ) * (1 - (3/2) * J2 * (RE^2 / r2) * (5 * Z2 / r2 - 1)); ay_J2 = (-mu* rvector(2) / r3 ) * (1 - (3/2) * J2 * (RE^2 / r2) * (5 * Z2 / r2 - 1)); az_J2 = (-mu* rvector(3) / r3 ) * (1 - (3/2) * J2 * (RE^2 / r2) * (5 * Z2 / r2 - 3)); % The total gravitational acceleration including J2 perturbation a_J2 = [ax_J2; ay_J2; az_J2]; %a_J2_values(t, :) = a_J2; a_J2_values(step_index, :) = a_J2; % Calculate the relative velocity v_icrf = Y(4:6); r_icrf = Y(1:3); if isrow(r_icrf) r_icrf = r_icrf'; end if isrow(v_icrf) v_icrf = v_icrf'; end % Extracted mean motion from TLE (revolutions per day) n_TLE = 14.50778162; % Convert mean motion to radians per second n = n_TLE * (2 * pi) / 86400; % Rotation angle about the Z-axis % fprintf("time:%d\n",t); theta = n * t; % fprintf("theta:%d\n",theta); % Rotation matrix about the Z-axis Rz = [cos(theta), -sin(theta), 0; sin(theta), cos(theta), 0; 0, 0, 1]; % Now you can use Rz to rotate your r_icrf vector from body to ECI frame r_icrf_eci = Rz * r_icrf; % Replace r_icrf_body with your vector % Calculate the relative velocity v_rel = (v_icrf - cross(Omega, r_icrf_eci)); % Calculate the drag acceleration v_rel_mag = norm(v_rel); % Call atmospheric density function with additional arguments x = r_icrf(1); y = r_icrf(2); z = r_icrf(3); simulationTime = t; % Assuming 't' is your simulation time in seconds since start rho = atmospheric_density(norm(r_icrf) - RE); %fprintf("%f kg/m^3\n", rho); %a_drag = -0.5 *( (Cd * A*10^-6 )/ m )* (1.68e-11*10^9 )* (v_rel_mag)^2 * ((v_rel) / (v_rel_mag)); %disp(a_drag); a_drag = -0.5 *( (Cd * A*10^-6 )/ m )* (rho*10^9 )* (v_rel_mag)^2 * ((v_rel) / (v_rel_mag)); % Total acceleration %a_total = a_gravity + a_J2 + a_drag; a_total = a_J2; %a_total = a_gravity + a_J2; %disp(a_total); % Output derivative of state vector Ydot = [vvector; a_total]; end function rho = atmospheric_density(altitude) % Placeholder values - you need to replace these with actual calculations or inputs % atmosnrlmsise00 function call for accurate atmospheric density %[T, rho] = atmosnrlmsise00(altitude * 1000, 45,-50,2007,4,0); %[T,a,P,rho,nu] = atmosisa(altitude*1000); [T,rho] = atmosnrlmsise00(altitude*1000,45,-50,2023,360,0); rho = rho(6); end ``` ## result ![image](https://hackmd.io/_uploads/HJv4uNUca.png) ![image](https://hackmd.io/_uploads/ryzBu489a.png) ## 對STK比較 #### STK(HPOP、EGM2008 重力模型) 與MATLAB誤差 ![image](https://hackmd.io/_uploads/BkYFdEUcT.png) #### STK(HPOP、JGM2重力模型) 與MATLAB誤差 ![image](https://hackmd.io/_uploads/H1f5dV896.png) #### STK(J2 disturbance) 與MATLAB誤差 ![image](https://hackmd.io/_uploads/HkTKuNU5p.png) #### 放大檢視200個資料點週期 ![image](https://hackmd.io/_uploads/rJd5dV89a.png) ## 結論 * SKT裡面的J2長怎樣(J2公式)還不確定 * JGM2 &EGM2008 看起來差不多 * STK裡面的J2 跟我自己寫的MATLAB 有個每日循環回去0誤差之現象,需要再探討 https://help.agi.com/stk/12.4.0/index.htm#gator/ab-engine.htm?TocPath=Capabilities%257CAstrogator%257CAstrogator%2520Components%257C_____6 J2000 2682.4882685250249779 km 6566.9639001485847984 km 8.1007149823713345 km 1.0143378782946217 km/sec -0.4253020701657230 km/sec 7.4189240233167526 km/sec https://help.agi.com/stk/#gator/eq-diffcorr.htm?TocPath=Capabilities%257CAstrogator%257CTechnical%2520Notes%257C_____1 https://help.agi.com/stk/#training/Astro_LowThrust.htm?TocPath=Training%257CLevel%25203%2520-%2520Focused%257CFeature%2520Specific%257CAstrogator%257C_____12 ![image](https://hackmd.io/_uploads/HJGf-urBC.png) ![image](https://hackmd.io/_uploads/H13EZuBrR.png) ![image](https://hackmd.io/_uploads/ByF5GOSH0.png) ![image](https://hackmd.io/_uploads/ByqHPJPHC.png) ![image](https://hackmd.io/_uploads/ry11_JwBC.png) ![image](https://hackmd.io/_uploads/HkayOkvrA.png) ![image](https://hackmd.io/_uploads/H1mlOkvHA.png) ![image](https://hackmd.io/_uploads/HJWZd1vBC.png) ![image](https://hackmd.io/_uploads/BJPbu1wr0.png) ![image](https://hackmd.io/_uploads/HyTWOkPSA.png) ![image](https://hackmd.io/_uploads/HyIf_1wSA.png) ![image](https://hackmd.io/_uploads/By2G_1PBR.png) ![image](https://hackmd.io/_uploads/rkZX_kwB0.png) ![image](https://hackmd.io/_uploads/HkDQOJwrR.png) ![image](https://hackmd.io/_uploads/BkT7u1wrC.png)