1- package com .pesterenan .funcoes ;
2-
3- import java .io .IOException ;
4-
5- import com .pesterenan .MechPeste ;
6- import com .pesterenan .gui .GUI ;
7- import com .pesterenan .gui .Status ;
8- import com .pesterenan .utils .ControlePID ;
9-
10- import krpc .client .Connection ;
11- import krpc .client .RPCException ;
12- import krpc .client .Stream ;
13- import krpc .client .StreamException ;
14- import krpc .client .services .SpaceCenter ;
15- import krpc .client .services .SpaceCenter .Flight ;
16- import krpc .client .services .SpaceCenter .Node ;
17- import krpc .client .services .SpaceCenter .Vessel ;
18- import krpc .client .services .SpaceCenter .VesselSituation ;
19-
20- public class DecolagemOrbital {
21-
22- private static SpaceCenter centroEspacial ;
23- private static Vessel naveAtual ;
24- private Flight parametrosVoo ;
25-
26- Stream <Double > tempoMissao ;
27- Stream <Double > altitude ;
28- Stream <Double > apoastro ;
29- Stream <Double > periastro ;
30- double pressaoAtual ;
31-
32- private float altInicioCurva = 250 ;
33- private float altFimCurva = 80000 ;
34- public static float altApoastroFinal = 80000 ;
35- private int etapaAtual = 0 ;
36- private int inclinacao = 90 ;
37- private static int direcao = 90 ;
38- private double anguloGiro ;
39- private static boolean executando = true ;
40- private Manobras manobras ;
41- ControlePID ctrlPressao = new ControlePID ();
42-
43- public DecolagemOrbital (Connection conexao )
44- throws IOException , RPCException , InterruptedException , StreamException {
45- // Declarar Variáveis:
46- centroEspacial = SpaceCenter .newInstance (conexao );
47- naveAtual = centroEspacial .getActiveVessel ();
48- parametrosVoo = naveAtual .flight (naveAtual .getOrbit ().getBody ().getReferenceFrame ());
49- naveAtual .getAutoPilot ().setReferenceFrame (naveAtual .getSurfaceReferenceFrame ());
50- manobras = new Manobras (conexao , false );
51- ctrlPressao .setAmostraTempo (25 );
52- ctrlPressao .setLimitePID (20 );
53- ctrlPressao .ajustarPID (0.25 , 0.01 , 0.025 );
54- ctrlPressao .limitarSaida (0.25 , 1.0 );
55- // Iniciar Streams:
56- tempoMissao = conexao .addStream (SpaceCenter .class , "getUT" );
57- altitude = conexao .addStream (parametrosVoo , "getMeanAltitude" );
58- apoastro = conexao .addStream (naveAtual .getOrbit (), "getApoapsisAltitude" );
59- periastro = conexao .addStream (naveAtual .getOrbit (), "getPeriapsisAltitude" );
60-
61- anguloGiro = 0 ;
62-
63- GUI .setParametros ("nome" , naveAtual .getName ());
64- // Loop principal de subida
65- while (executando ) { // loop while sempre funcionando até um break
66- switch (etapaAtual ) {
67- case 0 :
68- decolar ();
69- break ;
70- case 1 :
71- giroGravitacional ();
72- break ;
73- case 2 :
74- planejarOrbita ();
75- break ;
76- case 3 :
77- GUI .setStatus (Status .PRONTO .get ());
78- etapaAtual = 0 ;
79- executando = false ;
80- break ;
81- }
82- atualizarParametros ();
83- Thread .sleep (50 );
84- }
85- tempoMissao .remove ();
86- altitude .remove ();
87- apoastro .remove ();
88- periastro .remove ();
89- MechPeste .finalizarTarefa ();
90- }
91-
92- private void decolar () throws RPCException , StreamException , InterruptedException {
93- GUI .setStatus ("Iniciando Decolagem..." );
94- naveAtual .getControl ().setSAS (false ); // desligar SAS
95- naveAtual .getControl ().setRCS (false ); // desligar RCS
96- // Ligar Piloto Automatico e Mirar a Direção:
97- naveAtual .getAutoPilot ().engage (); // ativa o piloto auto
98- naveAtual .getAutoPilot ().targetPitchAndHeading (inclinacao , direcao ); // direção
99- GUI .setStatus ("Lançamento!" );
100- if (naveAtual .getSituation ().equals (VesselSituation .PRE_LAUNCH )) {
101- aceleracao (1.0f ); // acelerar ao máximo
102- naveAtual .getControl ().activateNextStage ();
103- } else {
104- aceleracao (1.0f ); // acelerar ao máximo
105- }
106- etapaAtual = 1 ;
107- }
108-
109- private void giroGravitacional () throws RPCException , StreamException , InterruptedException {
110- double altitudeAtual = altitude .get ();
111- double apoastroAtual = apoastro .get ();
112- pressaoAtual = parametrosVoo .getDynamicPressure () / 1000 ;
113- System .out .println (pressaoAtual );
114- ctrlPressao .setEntradaPID (pressaoAtual );
115- System .out .println ("PID: " + ctrlPressao .computarPID ());
116- if (altitudeAtual > altInicioCurva && altitudeAtual < altFimCurva ) {
117- double incremento = Math .sqrt ((altitudeAtual - altInicioCurva ) / (altFimCurva - altInicioCurva ));
118- double novoAnguloGiro = incremento * inclinacao ;
119- if (Math .abs (novoAnguloGiro - anguloGiro ) > 0.5 ) {
120- anguloGiro = novoAnguloGiro ;
121- naveAtual .getAutoPilot ().targetPitchAndHeading ((float ) (inclinacao - anguloGiro ), direcao );
122- aceleracao ((float ) ctrlPressao .computarPID ());
123- GUI .setStatus (String .format ("Ângulo de Inclinação: %1$.1f °" , anguloGiro ));
124- }
125- }
126- // Diminuir aceleração ao chegar perto do apoastro
127- if (apoastroAtual > altApoastroFinal * 0.95 ) {
128- GUI .setStatus ("Se aproximando do apoastro..." );
129- aceleracao (0.25f ); // mudar aceleração pra 25%
130- }
131- // Sair do giro ao chegar na altitude de apoastro:
132- if (apoastroAtual >= altApoastroFinal ) {
133- GUI .setStatus ("Apoastro alcançado." );
134- aceleracao (0.0f );
135- Thread .sleep (25 );
136- etapaAtual = 2 ;
137- }
138- }
139-
140- private void planejarOrbita () throws RPCException , StreamException , InterruptedException , IOException {
141- GUI .setStatus ("Esperando sair da atmosfera." );
142- if (altitude .get () > (altApoastroFinal * 0.8 )) {
143- GUI .setStatus ("Planejando Manobra de circularização..." );
144- Node noDeManobra = manobras .circularizarApoastro ();
145- double duracaoDaQueima = manobras .calcularTempoDeQueima (noDeManobra );
146- manobras .orientarNave (noDeManobra );
147- GUI .setStatus ("Executando Manobra de circularização..." );
148- manobras .executarQueima (noDeManobra , duracaoDaQueima );
149- naveAtual .getAutoPilot ().disengage ();
150- naveAtual .getControl ().setSAS (true );
151- naveAtual .getControl ().setRCS (false );
152- noDeManobra .remove ();
153- etapaAtual = 3 ;
154- }
155- }
156-
157- private void aceleracao (float acel ) throws RPCException {
158- naveAtual .getControl ().setThrottle ((float ) acel );
159- }
160-
161- private void atualizarParametros () throws RPCException , StreamException {
162- GUI .setParametros ("altitude" , altitude .get ());
163- GUI .setParametros ("apoastro" , apoastro .get ());
164- GUI .setParametros ("periastro" , periastro .get ());
165- }
166-
167- public static void setAltApoastro (float apoastroFinal ) {
168- altApoastroFinal = apoastroFinal ;
169-
170- }
171-
172- public static void setDirecao (int direcaoOrbita ) {
173- direcao = direcaoOrbita ;
174-
175- }
176-
177- public static void setExecutar (boolean estado ) {
178- executando = estado ;
179- }
1+ package com .pesterenan .funcoes ;
2+
3+ import java .io .IOException ;
4+
5+ import com .pesterenan .MechPeste ;
6+ import com .pesterenan .gui .GUI ;
7+ import com .pesterenan .gui .Status ;
8+ import com .pesterenan .utils .ControlePID ;
9+
10+ import krpc .client .Connection ;
11+ import krpc .client .RPCException ;
12+ import krpc .client .Stream ;
13+ import krpc .client .StreamException ;
14+ import krpc .client .services .SpaceCenter ;
15+ import krpc .client .services .SpaceCenter .Flight ;
16+ import krpc .client .services .SpaceCenter .Node ;
17+ import krpc .client .services .SpaceCenter .Vessel ;
18+ import krpc .client .services .SpaceCenter .VesselSituation ;
19+
20+ public class DecolagemOrbital {
21+
22+ private static SpaceCenter centroEspacial ;
23+ private static Vessel naveAtual ;
24+ private Flight parametrosVoo ;
25+
26+ Stream <Double > tempoMissao ;
27+ Stream <Double > altitude ;
28+ Stream <Double > apoastro ;
29+ Stream <Double > periastro ;
30+ double pressaoAtual ;
31+
32+ private float altInicioCurva = 250 ;
33+ private float altFimCurva = 80000 ;
34+ public static float altApoastroFinal = 80000 ;
35+ private int etapaAtual = 0 ;
36+ private int inclinacao = 90 ;
37+ private static int direcao = 90 ;
38+ private double anguloGiro ;
39+ private static boolean executando = true ;
40+ private Manobras manobras ;
41+ ControlePID ctrlPressao = new ControlePID ();
42+
43+ public DecolagemOrbital (Connection conexao )
44+ throws IOException , RPCException , InterruptedException , StreamException {
45+ // Declarar Variáveis:
46+ centroEspacial = SpaceCenter .newInstance (conexao );
47+ naveAtual = centroEspacial .getActiveVessel ();
48+ parametrosVoo = naveAtual .flight (naveAtual .getOrbit ().getBody ().getReferenceFrame ());
49+ naveAtual .getAutoPilot ().setReferenceFrame (naveAtual .getSurfaceReferenceFrame ());
50+ manobras = new Manobras (conexao , false );
51+ ctrlPressao .setAmostraTempo (25 );
52+ ctrlPressao .setLimitePID (20 );
53+ ctrlPressao .ajustarPID (0.25 , 0.01 , 0.025 );
54+ ctrlPressao .limitarSaida (0.25 , 1.0 );
55+ // Iniciar Streams:
56+ tempoMissao = conexao .addStream (SpaceCenter .class , "getUT" );
57+ altitude = conexao .addStream (parametrosVoo , "getMeanAltitude" );
58+ apoastro = conexao .addStream (naveAtual .getOrbit (), "getApoapsisAltitude" );
59+ periastro = conexao .addStream (naveAtual .getOrbit (), "getPeriapsisAltitude" );
60+
61+ anguloGiro = 0 ;
62+
63+ GUI .setParametros ("nome" , naveAtual .getName ());
64+ // Loop principal de subida
65+ while (executando ) { // loop while sempre funcionando até um break
66+ switch (etapaAtual ) {
67+ case 0 :
68+ decolar ();
69+ break ;
70+ case 1 :
71+ giroGravitacional ();
72+ break ;
73+ case 2 :
74+ planejarOrbita ();
75+ break ;
76+ case 3 :
77+ GUI .setStatus (Status .PRONTO .get ());
78+ etapaAtual = 0 ;
79+ executando = false ;
80+ break ;
81+ }
82+ atualizarParametros ();
83+ Thread .sleep (50 );
84+ }
85+ tempoMissao .remove ();
86+ altitude .remove ();
87+ apoastro .remove ();
88+ periastro .remove ();
89+ MechPeste .finalizarTarefa ();
90+ }
91+
92+ private void decolar () throws RPCException , StreamException , InterruptedException {
93+ GUI .setStatus ("Iniciando Decolagem..." );
94+ naveAtual .getControl ().setSAS (false ); // desligar SAS
95+ naveAtual .getControl ().setRCS (false ); // desligar RCS
96+ // Ligar Piloto Automatico e Mirar a Direção:
97+ naveAtual .getAutoPilot ().engage (); // ativa o piloto auto
98+ naveAtual .getAutoPilot ().targetPitchAndHeading (inclinacao , direcao ); // direção
99+ GUI .setStatus ("Lançamento!" );
100+ if (naveAtual .getSituation ().equals (VesselSituation .PRE_LAUNCH )) {
101+ aceleracao (1.0f ); // acelerar ao máximo
102+ naveAtual .getControl ().activateNextStage ();
103+ } else {
104+ aceleracao (1.0f ); // acelerar ao máximo
105+ }
106+ etapaAtual = 1 ;
107+ }
108+
109+ private void giroGravitacional () throws RPCException , StreamException , InterruptedException {
110+ double altitudeAtual = altitude .get ();
111+ double apoastroAtual = apoastro .get ();
112+ pressaoAtual = parametrosVoo .getDynamicPressure () / 1000 ;
113+ System .out .println (pressaoAtual );
114+ ctrlPressao .setEntradaPID (pressaoAtual );
115+ System .out .println ("PID: " + ctrlPressao .computarPID ());
116+ if (altitudeAtual > altInicioCurva && altitudeAtual < altFimCurva ) {
117+ double incremento = Math .sqrt ((altitudeAtual - altInicioCurva ) / (altFimCurva - altInicioCurva ));
118+ double novoAnguloGiro = incremento * inclinacao ;
119+ if (Math .abs (novoAnguloGiro - anguloGiro ) > 0.5 ) {
120+ anguloGiro = novoAnguloGiro ;
121+ naveAtual .getAutoPilot ().targetPitchAndHeading ((float ) (inclinacao - anguloGiro ), direcao );
122+ aceleracao ((float ) ctrlPressao .computarPID ());
123+ GUI .setStatus (String .format ("Ângulo de Inclinação: %1$.1f °" , anguloGiro ));
124+ }
125+ }
126+ // Diminuir aceleração ao chegar perto do apoastro
127+ if (apoastroAtual > altApoastroFinal * 0.95 ) {
128+ GUI .setStatus ("Se aproximando do apoastro..." );
129+ aceleracao (0.25f ); // mudar aceleração pra 25%
130+ }
131+ // Sair do giro ao chegar na altitude de apoastro:
132+ if (apoastroAtual >= altApoastroFinal ) {
133+ GUI .setStatus ("Apoastro alcançado." );
134+ aceleracao (0.0f );
135+ Thread .sleep (25 );
136+ etapaAtual = 2 ;
137+ }
138+ }
139+
140+ private void planejarOrbita () throws RPCException , StreamException , InterruptedException , IOException {
141+ GUI .setStatus ("Esperando sair da atmosfera." );
142+ if (altitude .get () > (altApoastroFinal * 0.8 )) {
143+ GUI .setStatus ("Planejando Manobra de circularização..." );
144+ Node noDeManobra = manobras .circularizarApoastro ();
145+ double duracaoDaQueima = manobras .calcularTempoDeQueima (noDeManobra );
146+ manobras .orientarNave (noDeManobra );
147+ GUI .setStatus ("Executando Manobra de circularização..." );
148+ manobras .executarQueima (noDeManobra , duracaoDaQueima );
149+ naveAtual .getAutoPilot ().disengage ();
150+ naveAtual .getControl ().setSAS (true );
151+ naveAtual .getControl ().setRCS (false );
152+ noDeManobra .remove ();
153+ etapaAtual = 3 ;
154+ }
155+ }
156+
157+ private void aceleracao (float acel ) throws RPCException {
158+ naveAtual .getControl ().setThrottle ((float ) acel );
159+ }
160+
161+ private void atualizarParametros () throws RPCException , StreamException {
162+ GUI .setParametros ("altitude" , altitude .get ());
163+ GUI .setParametros ("apoastro" , apoastro .get ());
164+ GUI .setParametros ("periastro" , periastro .get ());
165+ }
166+
167+ public static void setAltApoastro (float apoastroFinal ) {
168+ altApoastroFinal = apoastroFinal ;
169+
170+ }
171+
172+ public static void setDirecao (int direcaoOrbita ) {
173+ direcao = direcaoOrbita ;
174+
175+ }
176+
177+ public static void setExecutar (boolean estado ) {
178+ executando = estado ;
179+ }
180180}
0 commit comments