卫星变轨轨迹和推力模拟(单一引力源)MATLAB

打印 上一主题 下一主题

主题 2037|帖子 2037|积分 6111


 
代码阐明:


  • 常量界说:界说了万有引力常数、地球和月球的质量、半径以及地月平均距离。
  • 初始状态设置:设置卫星的初始位置、速率和姿态,以及月球的初始位置。
  • 模拟循环:在循环中计算地球和月球对卫星的引力,模拟机动变轨推力,更新卫星的速率、位置和姿态。
  • 绘制 3D 场景:卫星轨迹、卫星姿态和推力矢量。
  • 辅助函数:rotationMatrix 函数用于计算旋转矩阵,drawSatellite 函数用于绘制卫星(长方体)。
你可以根据必要调整模拟参数和卫星的初始状态。
  1. % 常量定义
  2. G = 6.67430e-20; % 万有引力常数 (km^3 kg^-1 s^-2)
  3. M_earth = 5.972e12; % 地球质量 (kg)
  4. % 卫星初始状态
  5. initial_position = [5; 0; 0]; % 初始位置 (km),椭圆轨道长半轴的端点
  6. initial_velocity = [0; 2; 0]; % 初始速度 (km/s),垂直于长半轴方向
  7. initial_attitude = [1 0 0; 0 1 0; 0 0 1]; % 初始姿态矩阵
  8. % 引力源位置(假设在原点)
  9. gravitational_source_position = [0; 0; 0];
  10. % 模拟参数
  11. total_time = 200; % 总模拟时间 (s),根据椭圆轨道周期调整
  12. dt = 0.1; % 时间步长 (s)
  13. num_steps = total_time / dt;
  14. % 初始化数组
  15. position = zeros(3, num_steps);
  16. velocity = zeros(3, num_steps);
  17. attitude = zeros(3, 3, num_steps);
  18. position(:, 1) = initial_position;
  19. velocity(:, 1) = initial_velocity;
  20. attitude(:, :, 1) = initial_attitude;
  21. % 椭圆轨道参数
  22. semi_major_axis = norm(initial_position); % 长半轴
  23. angular_velocity = norm(initial_velocity) / semi_major_axis; % 角速度
  24. % 模拟循环
  25. for i = 1:num_steps - 1
  26.     % 计算引力
  27.     r = position(:, i) - gravitational_source_position;
  28.     gravitational_force = -G * M_earth * r / norm(r)^3;
  29.    
  30.     % 计算当前位置的角度
  31.     current_angle = atan2(position(2, i), position(1, i));
  32.    
  33.     % 计算向心力方向的单位向量
  34.     centripetal_direction = -position(:, i) / norm(position(:, i));
  35.    
  36.     % 计算向心力大小(根据圆周运动公式 F = m * v^2 / r,这里假设 m = 1)
  37.     centripetal_magnitude = norm(velocity(:, i))^2 / norm(position(:, i));
  38.    
  39.     % 计算推力
  40.     thrust = centripetal_direction * centripetal_magnitude;
  41.    
  42.     % 计算总加速度
  43.     acceleration = gravitational_force + thrust;
  44.    
  45.     % 更新速度和位置
  46.     velocity(:, i + 1) = velocity(:, i) + acceleration * dt;
  47.     position(:, i + 1) = position(:, i) + velocity(:, i) * dt;
  48.    
  49.     % 更新姿态(这里简单假设姿态绕推力方向旋转一个小角度)
  50.     rotation_angle = 0.001; % 旋转角度 (rad)
  51.     rotation_axis = thrust / norm(thrust);
  52.     rotation_matrix = rotationMatrix(rotation_axis, rotation_angle);
  53.     attitude(:, :, i + 1) = rotation_matrix * attitude(:, :, i);
  54. end
  55. % 绘制 3D 轨迹
  56. figure;
  57. plot3(position(1, :), position(2, :), position(3, :), 'b', 'LineWidth', 2);
  58. xlabel('X (km)');
  59. ylabel('Y (km)');
  60. zlabel('Z (km)');
  61. title('卫星变轨 3D 轨迹(考虑引力源)');
  62. grid on;
  63. % 绘制卫星姿态和推力矢量
  64. for i = 1:10:num_steps
  65.     % 绘制卫星(长方体)
  66.     drawSatellite(position(:, i), attitude(:, :, i));
  67.    
  68.     % 确定立方体底面中心位置
  69.     length = 1;
  70.     width = 0.5;
  71.     height = 0.2;
  72.     base_center_local = [length/2; width/2; 0];
  73.     base_center_global = attitude(:, :, i) * base_center_local + position(:, i);
  74.    
  75.     % 计算当前位置的角度
  76.     current_angle = atan2(position(2, i), position(1, i));
  77.    
  78.     % 计算向心力方向的单位向量
  79.     centripetal_direction = -position(:, i) / norm(position(:, i));
  80.    
  81.     % 计算向心力大小(根据圆周运动公式 F = m * v^2 / r,这里假设 m = 1)
  82.     centripetal_magnitude = norm(velocity(:, i))^2 / norm(position(:, i));
  83.    
  84.     % 计算推力
  85.     thrust = centripetal_direction * centripetal_magnitude;
  86.    
  87.     % 绘制推力矢量
  88.     quiver3(base_center_global(1), base_center_global(2), base_center_global(3), thrust(1), thrust(2), thrust(3), 'r', 'LineWidth', 2, 'MaxHeadSize', 0.5);
  89.     % 标注矢量大小
  90.     text(base_center_global(1)+thrust(1), base_center_global(2)+thrust(2), base_center_global(3)+thrust(3), num2str(centripetal_magnitude), 'Color', 'r');
  91. end
  92. % 旋转矩阵函数
  93. function R = rotationMatrix(axis, angle)
  94.     axis = axis / norm(axis);
  95.     c = cos(angle);
  96.     s = sin(angle);
  97.     t = 1 - c;
  98.     x = axis(1);
  99.     y = axis(2);
  100.     z = axis(3);
  101.    
  102.     R = [t*x^2 + c    t*x*y - s*z  t*x*z + s*y;
  103.          t*x*y + s*z  t*y^2 + c    t*y*z - s*x;
  104.          t*x*z - s*y  t*y*z + s*x  t*z^2 + c];
  105. end
  106. % 绘制卫星(长方体)函数
  107. function drawSatellite(position, attitude)
  108.     % 长方体尺寸
  109.     length = 1;
  110.     width = 0.5;
  111.     height = 0.2;
  112.    
  113.     % 长方体顶点坐标
  114.     vertices = [0 0 0;
  115.                 length 0 0;
  116.                 length width 0;
  117.                 0 width 0;
  118.                 0 0 height;
  119.                 length 0 height;
  120.                 length width height;
  121.                 0 width height];
  122.    
  123.     % 应用姿态变换
  124.     vertices = vertices * attitude';
  125.    
  126.     % 平移到当前位置
  127.     vertices = bsxfun(@plus, vertices, position');
  128.    
  129.     % 绘制长方体
  130.     faces = [1 2 3 4; 5 6 7 8; 1 2 6 5; 2 3 7 6; 3 4 8 7; 4 1 5 8];
  131.     patch('Vertices', vertices, 'Faces', faces, 'FaceColor', 'g', 'EdgeColor', 'k');
  132.     hold on;
  133. end   
复制代码
 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

宝塔山

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表