STK与matlab交互 Astrogator模块(8)

一、背景介绍

根据(7)的介绍可以知道,使用微分求解器求解的脉冲明显优于使用Lambert求解的脉冲大小,根据Lambert那一节的讨论,绕飞的入轨点可能会影响转移的脉冲大小。所以,本节参考(6)中利用CW方程递推产生一系列绕飞的点,得到绕飞点在VVLH坐标系下的坐标,然后利用坐标转换得到其绝对坐标系下的坐标,通过遍历的方式来探索不同的绕飞入轨点是否会对脉冲大小有明显的影响。

二、仿真案例

案例仿真:例如目标星是定在东经150°的地球同步轨道,蓝星是定在东经165°的地球同步轨道,蓝星在26 Jan 2024 04:00:00.000 UTCG开始实施机动,经过一天的时间机动到达目标星周围进行椭圆自然绕飞,要求于27 Jan 2024 04:00:00.000 UTCG时刻开始进行绕飞任务,并且使得消耗的脉冲最小。

基本思路:本次任务机动过程均采用双脉冲转移的方式,同样利用CW方程生成的所有满足绕飞的点来产生绕飞卫星,通过STK得到其在地球惯性系下的位置和速度,该位置和速度即为整个脉冲控制过程中希望蓝星到达的状态。

(1)打开STK,初始化蓝星,目标星

clear;clc
%% 使用轨迹优化的方式来寻找最优脉冲,即使用Differential Corrector微分求解器
uiApplication = actxGetRunningServer('STK11.application');
% Get our IAgStkObjectRoot interface
global root End_rx End_ry End_rz End_vx End_vy End_vz xx
root = uiApplication.Personality2;
checkempty = root.Children.Count;
if checkempty ~= 0
    root.CurrentScenario.Unload
    root.CloseScenario;
end
%% 根据你的需要设定场景的名称
root.NewScenario('optimal_control');
StartTime = '26 Jan 2024 04:00:00.000';    % 场景开始时间
StopTime = '10 Feb 2024 04:00:00.000';     % 场景结束时间
root.ExecuteCommand(['SetAnalysisTimePeriod * "',StartTime,'" "',StopTime,'"']);
root.ExecuteCommand(' Animate * Reset');


Sat_name2='target';
satellite2= root.CurrentScenario.Children.New('eSatellite', Sat_name2);
satellite2.SetPropagatorType('ePropagatorAstrogator'); 
satellite2.Propagator
e=0;Sat_TA=0;Sat_LAN=150;
root.ExecuteCommand(['Astrogator */Satellite/target SetValue MainSequence.SegmentList Initial_State Propagate']);
root.ExecuteCommand(['Astrogator */Satellite/target SetValue MainSequence.SegmentList.Initial_State.CoordinateType Modified Keplerian']);
root.ExecuteCommand(['Astrogator */Satellite/target SetValue MainSequence.SegmentList.Initial_State.InitialState.Epoch ',StartTime,' UTCG']);
root.ExecuteCommand(['Astrogator */Satellite/target SetValue MainSequence.SegmentList.Initial_State.InitialState.Keplerian.ElementType "Kozai-Izsak Mean"']);
root.ExecuteCommand(['Astrogator */Satellite/target SetValue MainSequence.SegmentList.Initial_State.InitialState.Keplerian.Period 86169.6 sec']);
root.ExecuteCommand(['Astrogator */Satellite/target SetValue MainSequence.SegmentList.Initial_State.InitialState.Keplerian.ecc ',num2str(e)]);
root.ExecuteCommand(['Astrogator */Satellite/target SetValue MainSequence.SegmentList.Initial_State.InitialState.Keplerian.inc 0 deg']);
root.ExecuteCommand(['Astrogator */Satellite/target SetValue MainSequence.SegmentList.Initial_State.InitialState.Keplerian.w 0 deg']);
root.ExecuteCommand(['Astrogator */Satellite/target SetValue MainSequence.SegmentList.Initial_State.InitialState.Keplerian.TA ',num2str(Sat_TA),' deg']);
root.ExecuteCommand(['Astrogator */Satellite/target SetValue MainSequence.SegmentList.Initial_State.InitialState.Keplerian.LAN ',num2str(Sat_LAN),' deg']);
root.ExecuteCommand(['Astrogator */Satellite/target SetValue MainSequence.SegmentList.Propagate.StoppingConditions Epoch']);
root.ExecuteCommand(['Astrogator */Satellite/target SetValue MainSequence.SegmentList.Propagate.StoppingConditions.Epoch.TripValue ',StopTime,' UTCG']);%
root.ExecuteCommand(['Astrogator */Satellite/target SetValue MainSequence.SegmentList.Propagate.Propagator Earth_J2']);

root.ExecuteCommand(['Astrogator */Satellite/target RunMCS']);
%% 建立Target Sequence设定需要到达的目标 
%% 序列包括 在转移段 施加脉冲段 转移段 第二个脉冲段
%% 由于整个任务过程只有10天 假设转移时间为1天 开始施加脉冲之前的转移段为0天
Sat_name1='blue';
satellite1= root.CurrentScenario.Children.New('eSatellite', Sat_name1);
satellite1.SetPropagatorType('ePropagatorAstrogator'); 
satellite1.Propagator;
%% 生成蓝方星和拦截红方星的初始轨道数据
e=0;Sat_TA=0;Sat_LAN=165;period=86169.6;
root.ExecuteCommand(['Astrogator */Satellite/blue SetValue MainSequence.SegmentList Initial_State Target_Sequence Propagate']);
root.ExecuteCommand(['Astrogator */Satellite/blue SetValue MainSequence.SegmentList.Initial_State.CoordinateType Modified Keplerian']);
root.ExecuteCommand(['Astrogator */Satellite/blue SetValue MainSequence.SegmentList.Initial_State.InitialState.Epoch ',StartTime,' UTCG']);
root.ExecuteCommand(['Astrogator */Satellite/blue SetValue MainSequence.SegmentList.Initial_State.InitialState.Keplerian.ElementType "Kozai-Izsak Mean"']);
root.ExecuteCommand(['Astrogator */Satellite/blue SetValue MainSequence.SegmentList.Initial_State.InitialState.Keplerian.Period ',num2str(period),' sec']);
root.ExecuteCommand(['Astrogator */Satellite/blue SetValue MainSequence.SegmentList.Initial_State.InitialState.Keplerian.ecc ',num2str(e)]);
root.ExecuteCommand(['Astrogator */Satellite/blue SetValue MainSequence.SegmentList.Initial_State.InitialState.Keplerian.inc 0 deg']);
root.ExecuteCommand(['Astrogator */Satellite/blue SetValue MainSequence.SegmentList.Initial_State.InitialState.Keplerian.w 0 deg']);
root.ExecuteCommand(['Astrogator */Satellite/blue SetValue MainSequence.SegmentList.Initial_State.InitialState.Keplerian.TA ',num2str(Sat_TA),' deg']);
root.ExecuteCommand(['Astrogator */Satellite/blue SetValue MainSequence.SegmentList.Initial_State.InitialState.Keplerian.LAN ',num2str(Sat_LAN),' deg']);
root.ExecuteCommand(['Astrogator */Satellite/blue SetValue MainSequence.SegmentList.Propagate.StoppingConditions.Duration.TripValue 3 day']);%
root.ExecuteCommand(['Astrogator */Satellite/blue SetValue MainSequence.SegmentList.Propagate.Propagator Earth_J2']);
root.ExecuteCommand(['Astrogator */Satellite/blue SetValue MainSequence.SegmentList.Target_Sequence.SegmentList Propagate Maneuver Propagate Maneuver']);%
root.ExecuteCommand(['Astrogator */Satellite/blue SetValue MainSequence.SegmentList.Target_Sequence.SegmentList.Propagate.StoppingConditions.Duration.TripValue 0 sec']);
root.ExecuteCommand(['Astrogator */Satellite/blue SetValue MainSequence.SegmentList.Target_Sequence.SegmentList.Propagate1.StoppingConditions.Duration.TripValue 1 day']);
root.ExecuteCommand(['Astrogator */Satellite/blue SetValue MainSequence.SegmentList.Target_Sequence.SegmentList.Maneuver.ImpulsiveMnvr.AttitudeControl Thrust Vector']);
root.ExecuteCommand(['Astrogator */Satellite/blue SetValue MainSequence.SegmentList.Target_Sequence.SegmentList.Maneuver1.ImpulsiveMnvr.AttitudeControl Thrust Vector']);
root.ExecuteCommand(['Astrogator */Satellite/blue SetValue MainSequence.SegmentList.Target_Sequence.SegmentList.Maneuver1.ImpulsiveMnvr.ThrustAxes "CentralBody/Earth Inertial"']);
root.ExecuteCommand(['Astrogator */Satellite/blue SetValue MainSequence.SegmentList.Target_Sequence.SegmentList.Maneuver.ImpulsiveMnvr.ThrustAxes "CentralBody/Earth Inertial"'])

(2)设置蓝方的控制变量

root.ExecuteCommand(['Astrogator */Satellite/blue AddMCSSegmentControl MainSequence.SegmentList.Target_Sequence.SegmentList.Maneuver ImpulsiveMnvr.Cartesian.X']);
root.ExecuteCommand(['Astrogator */Satellite/blue AddMCSSegmentControl MainSequence.SegmentList.Target_Sequence.SegmentList.Maneuver ImpulsiveMnvr.Cartesian.Y']);
root.ExecuteCommand(['Astrogator */Satellite/blue AddMCSSegmentControl MainSequence.SegmentList.Target_Sequence.SegmentList.Maneuver ImpulsiveMnvr.Cartesian.Z']);
root.ExecuteCommand(['Astrogator */Satellite/blue AddMCSSegmentControl MainSequence.SegmentList.Target_Sequence.SegmentList.Maneuver1 ImpulsiveMnvr.Cartesian.X']);
root.ExecuteCommand(['Astrogator */Satellite/blue AddMCSSegmentControl MainSequence.SegmentList.Target_Sequence.SegmentList.Maneuver1 ImpulsiveMnvr.Cartesian.Y']);
root.ExecuteCommand(['Astrogator */Satellite/blue AddMCSSegmentControl MainSequence.SegmentList.Target_Sequence.SegmentList.Maneuver1 ImpulsiveMnvr.Cartesian.Z']);

root.ExecuteCommand(['Astrogator */Satellite/blue SetValue MainSequence.SegmentList.Target_Sequence.SegmentList.Propagate1.Results Vx Vy Vz X Y Z']);
root.ExecuteCommand(['Astrogator */Satellite/blue SetMCSControlValue MainSequence.SegmentList.Target_Sequence.Profiles.Differential_Corrector Maneuver ImpulsiveMnvr.Cartesian.X Active true']);
root.ExecuteCommand(['Astrogator */Satellite/blue SetMCSControlValue MainSequence.SegmentList.Target_Sequence.Profiles.Differential_Corrector Maneuver ImpulsiveMnvr.Cartesian.Y Active true']);
root.ExecuteCommand(['Astrogator */Satellite/blue SetMCSControlValue MainSequence.SegmentList.Target_Sequence.Profiles.Differential_Corrector Maneuver ImpulsiveMnvr.Cartesian.Z Active true']);

(3)建立一个和目标入轨点选择有关的函数

function delta_all=doubleMnvr(dot);
global xx root
MissionTime='27 Jan 2024 04:00:00';
StartTime = '26 Jan 2024 04:00:00.000';    % 场景开始时间
StopTime = '10 Feb 2024 04:00:00.000';     % 场景结束时间
dot=floor(dot)
rrxx=xx(dot,1);
rryy=xx(dot,2);
rrzz=xx(dot,3);
vvxx=xx(dot,4);
vvyy=xx(dot,5);
vvzz=xx(dot,6);
root.ExecuteCommand(['Astrogator */Satellite/raofei SetValue MainSequence.SegmentList.Initial_State.InitialState.Cartesian.X ',num2str(rrxx),' km']);
root.ExecuteCommand(['Astrogator */Satellite/raofei SetValue MainSequence.SegmentList.Initial_State.InitialState.Cartesian.Y ',num2str(rryy),' km']);
root.ExecuteCommand(['Astrogator */Satellite/raofei SetValue MainSequence.SegmentList.Initial_State.InitialState.Cartesian.Z ',num2str(rrzz),' km']);
root.ExecuteCommand(['Astrogator */Satellite/raofei SetValue MainSequence.SegmentList.Initial_State.InitialState.Cartesian.Vx ',num2str(vvxx),' km/sec']);
root.ExecuteCommand(['Astrogator */Satellite/raofei SetValue MainSequence.SegmentList.Initial_State.InitialState.Cartesian.Vy ',num2str(vvyy),' km/sec']);
root.ExecuteCommand(['Astrogator */Satellite/raofei SetValue MainSequence.SegmentList.Initial_State.InitialState.Cartesian.Vz ',num2str(vvzz),' km/sec']);
root.ExecuteCommand(['Astrogator */Satellite/raofei SetValue MainSequence.SegmentList.Initial_State.InitialState.Epoch ',MissionTime,' UTCG']);
root.ExecuteCommand(['Astrogator */Satellite/raofei SetValue MainSequence.SegmentList.Propagate.StoppingConditions Epoch']);
root.ExecuteCommand(['Astrogator */Satellite/raofei SetValue MainSequence.SegmentList.Propagate.StoppingConditions.Epoch.TripValue ',StopTime,' UTCG']);%
root.ExecuteCommand(['Astrogator */Satellite/raofei SetValue MainSequence.SegmentList.Propagate.Propagator Earth_J2']);
root.ExecuteCommand(['Astrogator */Satellite/raofei RunMCS']);
data_raofei=root.ExecuteCommand(['Report_RM */Satellite/raofei Style "Inertial Position Velocity" TimePeriod "',MissionTime,'" "',StopTime,'" TimeStep 3600']);
struct=regexp(data_raofei.Item(1),',','split');
End_rx=str2double(cell2mat(struct(2)));
End_ry=str2double(cell2mat(struct(3)));
End_rz=str2double(cell2mat(struct(4)));
End_vx=str2double(cell2mat(struct(5)));
End_vy=str2double(cell2mat(struct(6)));
End_vz=str2double(cell2mat(struct(7)));

root.ExecuteCommand(['Astrogator */Satellite/blue SetValue MainSequence.SegmentList.Target_Sequence.SegmentList.Maneuver1.ImpulsiveMnvr.Cartesian.X 0 km/sec']);
root.ExecuteCommand(['Astrogator */Satellite/blue SetValue MainSequence.SegmentList.Target_Sequence.SegmentList.Maneuver1.ImpulsiveMnvr.Cartesian.Y 0 km/sec']);
root.ExecuteCommand(['Astrogator */Satellite/blue SetValue MainSequence.SegmentList.Target_Sequence.SegmentList.Maneuver1.ImpulsiveMnvr.Cartesian.Z 0 km/sec']);

%% 希望达到的控制边界
% root.ExecuteCommand(['Astrogator */Satellite/blue SetMCSConstraintValue MainSequence.SegmentList.Target_Sequence.Profiles.Differential_Corrector Maneuver1 Vx Active true']);
% root.ExecuteCommand(['Astrogator */Satellite/blue SetMCSConstraintValue MainSequence.SegmentList.Target_Sequence.Profiles.Differential_Corrector Maneuver1 Vy Active true']);
% root.ExecuteCommand(['Astrogator */Satellite/blue SetMCSConstraintValue MainSequence.SegmentList.Target_Sequence.Profiles.Differential_Corrector Maneuver1 Vz Active true']);
root.ExecuteCommand(['Astrogator */Satellite/blue SetMCSConstraintValue MainSequence.SegmentList.Target_Sequence.Profiles.Differential_Corrector Propagate1 X Active true']);
root.ExecuteCommand(['Astrogator */Satellite/blue SetMCSConstraintValue MainSequence.SegmentList.Target_Sequence.Profiles.Differential_Corrector Propagate1 Y Active true']);
root.ExecuteCommand(['Astrogator */Satellite/blue SetMCSConstraintValue MainSequence.SegmentList.Target_Sequence.Profiles.Differential_Corrector Propagate1 Z Active true']);

% root.ExecuteCommand(['Astrogator */Satellite/blue SetMCSConstraintValue MainSequence.SegmentList.Target_Sequence.Profiles.Differential_Corrector Maneuver1 Vx Desired ',num2str(End_vx),' km/sec']);
% root.ExecuteCommand(['Astrogator */Satellite/blue SetMCSConstraintValue MainSequence.SegmentList.Target_Sequence.Profiles.Differential_Corrector Maneuver1 Vy Desired ',num2str(End_vy),' km/sec']);
% root.ExecuteCommand(['Astrogator */Satellite/blue SetMCSConstraintValue MainSequence.SegmentList.Target_Sequence.Profiles.Differential_Corrector Maneuver1 Vz Desired ',num2str(End_vz),' km/sec']);
root.ExecuteCommand(['Astrogator */Satellite/blue SetMCSConstraintValue MainSequence.SegmentList.Target_Sequence.Profiles.Differential_Corrector Propagate1 X Desired ',num2str(End_rx),' km']);
root.ExecuteCommand(['Astrogator */Satellite/blue SetMCSConstraintValue MainSequence.SegmentList.Target_Sequence.Profiles.Differential_Corrector Propagate1 Y Desired ',num2str(End_ry),' km']);
root.ExecuteCommand(['Astrogator */Satellite/blue SetMCSConstraintValue MainSequence.SegmentList.Target_Sequence.Profiles.Differential_Corrector Propagate1 Z Desired ',num2str(End_rz),' km']);
%% 将微分控制器打开开始计算
root.ExecuteCommand(['Astrogator */Satellite/blue SetValue MainSequence.SegmentList.Target_Sequence.Action Run active profiles']);
root.ExecuteCommand(['Astrogator */Satellite/blue RunMCS']);
root.ExecuteCommand(['Astrogator */Satellite/blue ApplyCorrections MainSequence.SegmentList.Target_Sequence']);
root.ExecuteCommand(['Astrogator */Satellite/blue SetValue MainSequence.SegmentList.Target_Sequence.Action Run nominal sequence']);
%% 利用相差的位置和速度
data=root.ExecuteCommand(['Report_RM */Satellite/blue Style "Inertial Position Velocity" TimePeriod "',StartTime,'" "',MissionTime,'" TimeStep 3600']);
line=data.count;
struct=regexp(data.Item(line-2),',','split');
v_x=str2double(cell2mat(struct(5)));
v_y=str2double(cell2mat(struct(6)));
v_z=str2double(cell2mat(struct(7)));
%% 通过两者之差修正速度
deltavx=End_vx-v_x;
deltavy=End_vy-v_y;
deltavz=End_vz-v_z;
root.ExecuteCommand(['Astrogator */Satellite/blue SetValue MainSequence.SegmentList.Target_Sequence.SegmentList.Maneuver1.ImpulsiveMnvr.Cartesian.X ',num2str(deltavx),' km/sec']);
root.ExecuteCommand(['Astrogator */Satellite/blue SetValue MainSequence.SegmentList.Target_Sequence.SegmentList.Maneuver1.ImpulsiveMnvr.Cartesian.Y ',num2str(deltavy),' km/sec']);
root.ExecuteCommand(['Astrogator */Satellite/blue SetValue MainSequence.SegmentList.Target_Sequence.SegmentList.Maneuver1.ImpulsiveMnvr.Cartesian.Z ',num2str(deltavz),' km/sec']);
root.ExecuteCommand(['Astrogator */Satellite/blue RunMCS']);
%% 得到第一次脉冲施加的大小
data=root.ExecuteCommand(['Astrogator_RM */Satellite/blue GetValue MainSequence.SegmentList.Target_Sequence.SegmentList.Maneuver.ImpulsiveMnvr.Cartesian']);
XX=data.Item(0);
YY=data.Item(1);
ZZ=data.Item(2);
start=strfind(XX,'=');
stop=strfind(XX,'km/sec');
deltax1=str2num(XX(start+1:stop-1));
deltay1=str2num(YY(start+1:stop-1));
deltaz1=str2num(ZZ(start+1:stop-1));
%% 将结果呈现优化
root.ExecuteCommand(['VO */Satellite/target OrbitSystem Modify System "InertialByWindow" Show Off']);
root.ExecuteCommand(['VO */Satellite/blue OrbitSystem Modify System "InertialByWindow" Show Off']);
root.ExecuteCommand(['VO */Satellite/raofei OrbitSystem Modify System "InertialByWindow" Show Off']);
root.ExecuteCommand(['VO */Satellite/blue OrbitSystem Add System VVLH Satellite/target Color red']);
root.ExecuteCommand(['VO */Satellite/raofei OrbitSystem Add System VVLH Satellite/target Color green']);
root.ExecuteCommand(['Astrogator */Satellite/blue ClearDWCGraphics']);
root.ExecuteCommand(['Astrogator */Satellite/raofei ClearDWCGraphics']);
root.ExecuteCommand(['Astrogator */Satellite/target ClearDWCGraphics']);
%% 总脉冲大小为
delta_all=(sqrt(deltavx^2+deltavy^2+deltavz^2)+sqrt(deltax1^2+deltay1^2+deltaz1^2))*1000;
fprintf('耗费的总脉冲大小为%.4f m/sec\n',delta_all)
end

(4)利用CW方程生成满足绕飞点的VVLH坐标,CW函数在前面第(5)节中给出,遍历上述函数,得到每个入轨点所需要花费的脉冲的大小

%% 由于控制变量中,仅有地球惯性坐标系下的位置和速度,所以参照Lambert求解器的方法,能够到达的绕飞位置是由生成一个该时刻绕飞的卫星,然后利用STK报表的方式
%% 给出到达目标星的时间 确定绕飞的位置 
MissionTime='27 Jan 2024 04:00:00';% 在给定任务的第十天要求到达该位置
miu=3.986e5;omega=2*pi/period;z=10;    %绕飞短半轴
%% 利用CW方程选择能绕飞的点,根据理论知识,VVLH下绕飞椭圆的每个状态再不施加外部脉冲的时候,其绕飞椭圆均保持不变。
%% 根据初始条件 目标星的周期为86169.6sec 为了和前面报表的时间保持一致,本文取的时间步长为60sec
t=0:60:86169.6;dx=2*omega*z; 
X=[0,0,z,dx,0,0]';xx=zeros(length(t),6);
%% xx的长度 即包含了n个入轨点,也意味着可选择入轨的点包括这n个选择,现在从这n个入轨点进行优化和选择
for i=1:length(t)
    tt=(i-1)*60;
    xx(i,:)=CW(X,omega,tt);
end
%% 
VMC_SatName='raofei';
satellite3= root.CurrentScenario.Children.New('eSatellite', VMC_SatName);
satellite3.SetPropagatorType('ePropagatorAstrogator'); 
root.ExecuteCommand(['Astrogator */Satellite/raofei SetValue MainSequence.SegmentList Initial_State Propagate']);
root.ExecuteCommand(['Astrogator */Satellite/raofei SetValue MainSequence.SegmentList.Initial_State.CoordinateSystem "Satellite/target VVLH"']);
root.ExecuteCommand(['Astrogator */Satellite/raofei SetValue MainSequence.SegmentList.Initial_State.CoordinateType Cartesian']);
% End_rx=zeros(1,length(t));End_ry=zeros(1,length(t));End_rz=zeros(1,length(t));End_vx=zeros(1,length(t));End_vy=zeros(1,length(t));End_vz=zeros(1,length(t));
J=zeros(1,length(t));
for i=1:length(t)
    J(i)=doubleMnvr(i);
    i
end

三、总结与展望

入轨点的示意图,根据CW方程可以知道,一个绕飞椭圆的时间为被绕飞星的一个周期,我们取一个周期内,以60s为步长,离散得到入轨点,如图所示,每个蓝色的点在VVLH坐标系的位置和速度都可以由初始给出的位置和速度递推出来,以椭圆最上方的蓝点为第一个顶点,逆时针开始计数,直到再次回到椭圆最上方的位置,总共有1436个入轨点,按照这个顺序,得到了不同入轨点与脉冲大小之间的关系图,本文选取的绕飞椭圆大小半长轴为10km。

根据观察,耗费脉冲的最大值和最小值相差0.3m/s,在实际工程应用中也需要相应的重视。

  • 16
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值