Advertisement
Eychics_

Untitled

Nov 17th, 2020
47
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 43.24 KB | None | 0 0
  1. package land.neutrino.rachel.rocket.adhara;
  2.  
  3. import com.google.gson.JsonObject;
  4. import com.google.gson.JsonPrimitive;
  5. import krpc.client.Connection;
  6. import krpc.client.RPCException;
  7. import krpc.client.Stream;
  8. import krpc.client.services.MechJeb;
  9. import krpc.client.services.SpaceCenter;
  10. import land.neutrino.rachel.Rachel;
  11. import land.neutrino.rachel.rocket.FirstStage;
  12. import land.neutrino.rachel.rocket.RocketBody;
  13. import land.neutrino.rachel.rocket.neutrino.FirstStageDatas;
  14. import land.neutrino.rachel.tracking.RequestType;
  15. import land.neutrino.rachel.tracking.StageEnum;
  16. import land.neutrino.rachel.utils.*;
  17. import org.javatuples.Pair;
  18. import org.javatuples.Triplet;
  19.  
  20. import javax.swing.*;
  21. import java.text.DecimalFormat;
  22.  
  23. public class Booster extends FirstStage {
  24.  
  25. protected boolean Shoulditland;
  26. protected SpaceCenter spaceCenter;
  27. protected SpaceCenter.Vessel vessel;
  28.  
  29. protected LandingComplexEnum landingComplexTarget;
  30.  
  31. public Booster(SpaceCenter.Vessel vessel, SpaceCenter spaceCenter, String stageName, Connection connection, RocketBody rocketBody,LandingComplexEnum landingComplexEnum, boolean Shoulditland) {
  32. super(rocketBody, stageName, connection);
  33. this.Shoulditland = Shoulditland;
  34. firstStageDatas = new FirstStageDatas();
  35. this.stageName = stageName;
  36. this.Shoulditland = Shoulditland;
  37. this.spaceCenter = spaceCenter;
  38. this.landingComplexTarget = landingComplexEnum;
  39.  
  40. downrange = distance(landingComplexTarget.getLat(), 28.5289202545645, landingComplexTarget.getLong(), -80.52526259414269, 0.0, 0.0);
  41. }
  42.  
  43. double downrange = 0;
  44.  
  45. @Override
  46. public void startup() {
  47. try {
  48. vessel.getControl().setThrottle(0f);
  49. //Throttle: Adhara Slow: 0.35f | Other's adhara: 1f
  50. /*for (int i = 10; i < 14; i++) {
  51. vessel.getParts().getEngines().get(i).setActive(true);
  52. }*/
  53.  
  54. System.out.println(stageName + " : " + "\n 0:" + impactPoint().getValue0() + "\n 1:" + impactPoint().getValue1() );
  55.  
  56. for (SpaceCenter.Engine engine : vessel.getParts().getEngines()) {
  57. if(engine.getPart().getName().contains("cryoengine-375") && !engine.getPart().getTag().contains("secondEngine")) engine.setActive(true);
  58. }
  59. vessel.getControl().setThrottle(1f);
  60. Rachel.getInstance().sendAlert("First Stage ignition", StageEnum.STAGE_1);
  61. vessel.getControl().setSAS(true);
  62. vessel.getAutoPilot().engage();
  63. vessel.getAutoPilot().setTargetRoll(0f);
  64. vessel.getAutoPilot().targetPitchAndHeading(90, Rachel.getInstance().getFlightInfo().getInclination());
  65.  
  66.  
  67. } catch (Exception e) {
  68. e.printStackTrace();
  69. }
  70. }
  71.  
  72. @Override
  73. public void meco() {
  74. try {
  75. for (SpaceCenter.Engine engine : vessel.getParts().getEngines()) {
  76. engine.setActive(false);
  77. }
  78. for (SpaceCenter.Engine engine : vessel.getParts().getEngines()) {
  79. engine.setThrustLimit(1f);
  80. }
  81. Rachel.getInstance().sendAlert("First Stage MECO", StageEnum.STAGE_1);
  82. } catch (Exception e) {
  83. e.printStackTrace();
  84. }
  85. }
  86.  
  87. @Override
  88. public void boostbackburn() {
  89. new Thread(new Runnable() {
  90. @Override
  91. public void run() {
  92. try {
  93. // if(!landingComplexTarget.equals(LandingComplexEnum.Droneship)) {
  94. vessel.getControl().setThrottle(0f);
  95. vessel.getControl().toggleActionGroup(4);
  96. //vessel.getControl().activateNextStage();
  97. vessel.getAutoPilot().engage();
  98. //-10
  99.  
  100. int pitch = 0;
  101. if((rocketBody.equals(RocketBody.SIDE_BOOSTER))) {
  102. pitch = 2;
  103. } else if(rocketBody.equals(RocketBody.CENTER_CORE)) {
  104. pitch = 1;
  105. } else if (landingComplexTarget.equals(LandingComplexEnum.Droneship)) {
  106. pitch = 10;
  107. } else {
  108. pitch = 10;
  109. }
  110.  
  111. vessel.getAutoPilot().targetPitchAndHeading( pitch, 273);
  112. System.out.println(stageName + " : " + stageName + " : " + "Flip");
  113.  
  114. for (SpaceCenter.RCS rcs : vessel.getParts().getRCS()) {
  115. rcs.setEnabled(true);
  116. }
  117. vessel.getControl().setRCS(true);
  118. vessel.getParts().withTag("centerEngine").get(0).getEngine().setActive(true);
  119. vessel.getControl().setThrottle(1f);
  120. SpaceCenter.ReferenceFrame refFrame = vessel.getSurfaceReferenceFrame();
  121. SpaceCenter.Flight flight = vessel.flight(refFrame);
  122.  
  123. vessel.getParts().withTag("centerEngine").get(0).getEngine().setActive(true);
  124.  
  125. while (Math.abs(flight.getHeading() - 273) > 5) {
  126. System.out.println(stageName + " : Pitch " + flight.getPitch() + " Heading " + flight.getHeading());
  127. }
  128.  
  129. vessel.getParts().withTag("centerEngine").get(0).getEngine().setActive(true);
  130.  
  131. for (SpaceCenter.Part engine : vessel.getParts().withTag("sideEngine")) {
  132. engine.getEngine().setActive(true);
  133. }
  134. System.out.println(stageName + " : " + "Engine startup");
  135. Rachel.getInstance().getAnnaConnection().addEvent("Boostback Burn");
  136. vessel.getControl().setThrottle(1f);
  137.  
  138. vessel.getControl().setRCS(false);
  139.  
  140. //double maxLatDiff = (rocketBody.equals(RocketBody.SIDE_BOOSTER) ? 0.1 : 0.05);
  141. Pair<Double, Double> impact = impactPoint();
  142. while ((impact.getValue1() - 0.1) > landingComplexTarget.getLong()) {
  143. impact = impactPoint();
  144. /*int correction = 0;
  145. if (impact.getValue0() - landingComplexTarget.getLat() > 0.01) {
  146. if(metersBtwPoints(impact.getValue0(),0,landingComplexTarget.getLat(),0) > 20000) {
  147. correction = 225;
  148. } else if(metersBtwPoints(impact.getValue0(),0,landingComplexTarget.getLat(),0) > 10000) {
  149. correction = 245;
  150. } else {
  151. correction = 265;
  152. }
  153. vessel.getAutoPilot().setTargetHeading(correction);
  154. } else if (impact.getValue0() - landingComplexTarget.getLat() < 0.01) {
  155. if(metersBtwPoints(impact.getValue0(),0,landingComplexTarget.getLat(),0) > 20000) {
  156. correction = 305;
  157. } else if(metersBtwPoints(impact.getValue0(),0,landingComplexTarget.getLat(),0) > 10000) {
  158. correction = 285;
  159. } else {
  160. correction = 275;
  161. }
  162.  
  163. vessel.getAutoPilot().setTargetHeading(correction);
  164. }*/
  165.  
  166. /*if(vessel.getOrbit().getApoapsisAltitude() > 205000) pitch = 0;
  167. if(vessel.getOrbit().getApoapsisAltitude() < 200000) pitch = 5;
  168. else pitch = 0;
  169. vessel.getAutoPilot().setTargetPitch(pitch);*/
  170.  
  171. double lat1 = landingComplexTarget.getLat();
  172. double lng1 = landingComplexTarget.getLong();
  173.  
  174. double lat2 = impact.getValue0();
  175. double lng2 = impact.getValue1();
  176.  
  177.  
  178. double teta1 = toRadians(lat1);
  179. double teta2 = toRadians(lat2);
  180. double delta1 = toRadians(lat2-lng1);
  181. double delta2 = toRadians(lng2-lng1);
  182.  
  183. //==================Heading Formula Calculation================//
  184.  
  185. double y = Math.sin(delta2) * Math.cos(teta2);
  186. double x = Math.cos(teta1)*Math.sin(teta2) - Math.sin(teta1)*Math.cos(teta2)*Math.cos(delta2);
  187. double brng = Math.atan2(y, x);
  188. brng = toDegrees(brng);// radians to degrees
  189. brng = ( ((int)brng + 360) % 360 );
  190.  
  191. System.out.println("Heading: "+ (brng - 180) + " - " + flight.getHeading());
  192. vessel.getAutoPilot().setTargetHeading((float)(brng-180));
  193. }
  194. for (SpaceCenter.Part engine : vessel.getParts().withTag("sideEngine")) {
  195. engine.getEngine().setActive(false);
  196. }
  197.  
  198. while ((impact.getValue1()) > landingComplexTarget.getLong()) {
  199. impact = impactPoint();
  200.  
  201. /*int correction = 0;
  202. if (impact.getValue0() - landingComplexTarget.getLat() > 0.01) {
  203. if(metersBtwPoints(impact.getValue0(),0,landingComplexTarget.getLat(),0) > 20000) {
  204. correction = 225;
  205. } else if(metersBtwPoints(impact.getValue0(),0,landingComplexTarget.getLat(),0) > 10000) {
  206. correction = 245;
  207. } else {
  208. correction = 265;
  209. }
  210. vessel.getAutoPilot().setTargetHeading(correction);
  211. } else if (impact.getValue0() - landingComplexTarget.getLat() < 0.01) {
  212. if(metersBtwPoints(impact.getValue0(),0,landingComplexTarget.getLat(),0) > 20000) {
  213. correction = 305;
  214. } else if(metersBtwPoints(impact.getValue0(),0,landingComplexTarget.getLat(),0) > 10000) {
  215. correction = 285;
  216. } else {
  217. correction = 275;
  218. }
  219.  
  220. vessel.getAutoPilot().setTargetHeading(correction);
  221. }*/
  222.  
  223. double lat1 = landingComplexTarget.getLat();
  224. double lng1 = landingComplexTarget.getLong();
  225.  
  226. double lat2 = impact.getValue0();
  227. double lng2 = impact.getValue1();
  228.  
  229.  
  230. double teta1 = toRadians(lat1);
  231. double teta2 = toRadians(lat2);
  232. double delta1 = toRadians(lat2-lng1);
  233. double delta2 = toRadians(lng2-lng1);
  234.  
  235. //==================Heading Formula Calculation================//
  236.  
  237. double y = Math.sin(delta2) * Math.cos(teta2);
  238. double x = Math.cos(teta1)*Math.sin(teta2) - Math.sin(teta1)*Math.cos(teta2)*Math.cos(delta2);
  239. double brng = Math.atan2(y, x);
  240. brng = toDegrees(brng);// radians to degrees
  241. brng = ( ((int)brng + 360) % 360 );
  242.  
  243. System.out.println("Heading: "+ (brng - 180) + " - " + flight.getHeading());
  244. vessel.getAutoPilot().setTargetHeading((float)(brng-180));
  245. }
  246.  
  247. System.out.println(stageName + " : " + "Engine shutdown");
  248. vessel.getControl().setThrottle(0f);
  249.  
  250. // }
  251. vessel.getAutoPilot().engage();
  252. vessel.getControl().setRCS(true);
  253.  
  254.  
  255. vessel.getAutoPilot().targetPitchAndHeading(90,0);
  256.  
  257. for (SpaceCenter.ControlSurface controlSurface : vessel.getParts().getControlSurfaces()) {
  258. controlSurface.setPitchEnabled(true);
  259. controlSurface.setYawEnabled(true);
  260. }
  261.  
  262. vessel.getControl().setBrakes(true);
  263.  
  264. entryburn();
  265.  
  266.  
  267.  
  268.  
  269. //gridFinsGuidance(vessel);
  270.  
  271. } catch (Exception e) {
  272. e.printStackTrace();
  273. }
  274. }
  275. }).start();
  276.  
  277. }
  278.  
  279. @Override
  280. public void entryburn() {
  281. Thread thread = new Thread(new Runnable() {
  282. @Override
  283. public void run() {
  284. try {
  285.  
  286.  
  287.  
  288. vessel.getAutoPilot().engage();
  289. vessel.getControl().setRCS(true);
  290. SpaceCenter.Resources stageResources = vessel.getResources();
  291. Stream<Float> hydrogenResource = connection.addStream(stageResources, "amount", "LqdMethane");
  292.  
  293. System.out.println(stageName + " : " + "Fuel: " + (hydrogenResource.get() / 1030214 * 100));
  294.  
  295. SpaceCenter.ReferenceFrame refFrame = vessel.getSurfaceReferenceFrame();
  296. SpaceCenter.Flight flight = vessel.flight(refFrame);
  297. for (SpaceCenter.RCS rc : vessel.getParts().getRCS()) {
  298. rc.setEnabled(true);
  299. }
  300. Stream<Double> verticalSpeed = connection.addStream(vessel.flight(vessel.getOrbit().getBody().getReferenceFrame()), "getVerticalSpeed");
  301. while(verticalSpeed.get() > -0.01) { Thread.sleep(1000); }
  302. vessel.getAutoPilot().targetPitchAndHeading(75,(landingComplexTarget == LandingComplexEnum.Droneship ? 270 : 90));
  303.  
  304. while (flight.getSurfaceAltitude() > (rocketBody.equals(RocketBody.SIDE_BOOSTER) ? 92000 : (landingComplexTarget.equals(LandingComplexEnum.Droneship) ? (downrange > 800000 ? 90000:70000) : 70000))) { //65 000
  305. Thread.sleep(1000);
  306. }
  307.  
  308. spaceCenter.setPhysicsWarpFactor(0);
  309. vessel.getControl().setSAS(false);
  310. vessel.getAutoPilot().engage();
  311. Rachel.getInstance().sendAlert("Entry burn start", StageEnum.STAGE_1);
  312.  
  313. vessel.getControl().setRCS(true);
  314. vessel.getParts().withTag("centerEngine").get(0).getEngine().setActive(true);
  315. Rachel.getInstance().getAnnaConnection().addEvent("Entry Burn");
  316. vessel.getControl().setThrottle(1f);
  317.  
  318.  
  319. for (SpaceCenter.Part sideEngine : vessel.getParts().withTag("sideEngine")) {
  320. sideEngine.getEngine().setActive(true);
  321. sideEngine.getEngine().setThrustLimit(0.75f);
  322. //sideEngine.getEngine().setThrustLimit(0.885f);
  323. }
  324. Stream<Double> horizontalSpeed = connection.addStream(vessel.flight(vessel.getOrbit().getBody().getReferenceFrame()), "getHorizontalSpeed");
  325. Stream<Double> speed = connection.addStream(vessel.flight(vessel.getOrbit().getBody().getReferenceFrame()), "getSpeed");
  326.  
  327. long time = System.currentTimeMillis();
  328. double Distance = distance(impactPoint().getValue0(), landingComplexTarget.getLat(),impactPoint().getValue1(), landingComplexTarget.getLong(),0.0,0.0);
  329. boolean end = false;
  330.  
  331. /*vessel.getAutoPilot().disengage();
  332. vessel.getControl().setSASMode(SpaceCenter.SASMode.RETROGRADE);
  333. vessel.getControl().setSAS(true);
  334. vessel.getControl().setSASMode(SpaceCenter.SASMode.RETROGRADE);*/
  335. System.out.println(downrange + "km");
  336. float maxAngle = (rocketBody.equals(RocketBody.CENTER_CORE) ? 10 : (downrange > 600000 ? 50:70));
  337. double lastDist;
  338. float retrograde = (float)((Math.atan(Math.abs(verticalSpeed.get()) / horizontalSpeed.get()) * 180) / Math.PI) + 10;
  339. System.out.println("Retrograde: " +retrograde);
  340. double offset = 0.025 * (int)(downrange/100000);
  341. if(offset < 0.025) offset = 0.025;
  342.  
  343. float heading = (landingComplexTarget == LandingComplexEnum.Droneship ? 272 : 90);
  344. if(landingComplexTarget.equals(LandingComplexEnum.Droneship))
  345. retrograde = retrograde + (float)(7*offset);
  346. System.out.println((landingComplexTarget.getLat() + ", " + (landingComplexTarget.getLong() - (flight.getSurfaceAltitude() > 15000 ? offset : 0))));
  347. horizontalSpeed = connection.addStream(vessel.flight(vessel.getOrbit().getBody().getReferenceFrame()), "getHorizontalSpeed");
  348. verticalSpeed = connection.addStream(vessel.flight(vessel.getOrbit().getBody().getReferenceFrame()), "getVerticalSpeed");
  349. while (verticalSpeed.get() < -400 /*|| horizontalSpeed.get() > 1800*/) {
  350. if(landingComplexTarget.equals(LandingComplexEnum.Droneship))
  351. Distance = distance(0, 0, impactPoint().getValue1(), landingComplexTarget.getLong() + (flight.getSurfaceAltitude() > 15000 ? offset : 0), 0.0, 0.0);
  352. else
  353. Distance = distance(0, 0, impactPoint().getValue1(), landingComplexTarget.getLong() - (flight.getSurfaceAltitude() > 15000 ? offset : 0), 0.0, 0.0);
  354. lastDist = Distance;
  355. if(!landingComplexTarget.equals(LandingComplexEnum.Droneship)) {
  356. retrograde = (float) ((Math.atan(Math.abs(verticalSpeed.get()) / horizontalSpeed.get()) * 180) / Math.PI);
  357. if (Distance > 2000) {
  358. maxAngle = (landingComplexTarget.equals(LandingComplexEnum.Droneship) ? 5 : 15);
  359. } else if (Distance < 2000 && Distance > 500) {
  360. maxAngle = (landingComplexTarget.equals(LandingComplexEnum.Droneship) ? 5 : 10);
  361. } else if (Distance < 500) {
  362. maxAngle = 5;
  363. }
  364. System.out.println("Max Angle: " + maxAngle);
  365. if (impactPoint().getValue1() - (landingComplexTarget.getLong() - (flight.getSurfaceAltitude() > 15000 ? offset : 0)) > 0.001) {
  366. System.out.println("Vandenberg");
  367. vessel.getAutoPilot().targetPitchAndHeading(retrograde + maxAngle, heading);
  368. } else if (impactPoint().getValue1() - (landingComplexTarget.getLong() - (flight.getSurfaceAltitude() > 15000 ? offset : 0)) < 0.001) {
  369. vessel.getAutoPilot().targetPitchAndHeading(retrograde - maxAngle, heading);
  370. System.out.println("France");
  371. }
  372. } else {
  373. if(Distance > lastDist) retrograde = retrograde - 0.1f;
  374. if(Distance < lastDist) retrograde = retrograde + 0.1f;
  375. vessel.getAutoPilot().targetPitchAndHeading(retrograde, heading);
  376. }
  377.  
  378.  
  379. }
  380.  
  381. for (SpaceCenter.Part sideEngine : vessel.getParts().withTag("sideEngine")) {
  382. sideEngine.getEngine().setActive(true);
  383. sideEngine.getEngine().setThrustLimit(100f);
  384. }
  385.  
  386.  
  387.  
  388.  
  389.  
  390. //vessel.getControl().setSAS(true);
  391. //vessel.getControl().setSASMode(SpaceCenter.SASMode.RETROGRADE);
  392. vessel.getControl().setThrottle(0f);
  393. System.out.println(stageName + " : " + "End of entry burn engine guidance");
  394. System.out.println(stageName + " : " + "vSpeed: " + verticalSpeed.get());
  395.  
  396. for (SpaceCenter.Part sideEngine : vessel.getParts().withTag("sideEngine"))
  397. sideEngine.getEngine().setThrustLimit(0.30f);
  398.  
  399. System.out.println(stageName + " : " + "Entry burn shutdown, Time: " + ((System.currentTimeMillis() - time) / 1000) + " seconds");
  400.  
  401.  
  402.  
  403.  
  404.  
  405. //gridFinsGuidance(vessel);
  406.  
  407. System.out.println(stageName + " : " + "Fuel: " + (hydrogenResource.get() / 1030214 * 100));
  408. gridFinsGuidance(vessel);
  409.  
  410. } catch (Exception e) { e.printStackTrace();}
  411. }
  412. });
  413. thread.setPriority(10);
  414. thread.start();
  415. thread.setPriority(10);
  416. }
  417.  
  418. @Override
  419. public void landingburn() {
  420. Thread landingBurn = new Thread(new Runnable() {
  421. @Override
  422. public void run() {
  423. try {
  424. vessel = spaceCenter.getActiveVessel();
  425. restoreConnectionWithFirstStage(spaceCenter);
  426. vessel.getParts().setControlling(vessel.getParts().withName("proceduralAvionics").get(0));
  427. spaceCenter.setActiveVessel(vessel);
  428. spaceCenter.setPhysicsWarpFactor(0);
  429. vessel.getControl().setRCS(true);
  430. boostbackburn();
  431. Rachel.getInstance().getAnnaConnection().updateVessel();
  432.  
  433. System.out.println(stageName + " : " + "Landing Burn is on");
  434.  
  435. Stream<Double> verticalSpeed = connection.addStream(vessel.flight(vessel.getOrbit().getBody().getReferenceFrame()), "getVerticalSpeed");
  436. while(verticalSpeed.get() > -0.01) { Thread.sleep(1000); }
  437. //entryburn();
  438. SpaceCenter.ReferenceFrame refFrame = vessel.getSurfaceReferenceFrame();
  439. SpaceCenter.Flight flight = vessel.flight(refFrame);
  440.  
  441. //gridFinsGuidance(vessel);
  442.  
  443. while (flight.getSurfaceAltitude() > 2000) { System.out.print(""); }
  444.  
  445.  
  446. Stream<Float> mass = connection.addStream(vessel, "getMass");
  447.  
  448. SpaceCenter.Resources stageResources = vessel.getResources();
  449. Stream<Float> hydrogenResource = connection.addStream(stageResources, "amount", "LqdHydrogen");
  450.  
  451. boolean engineGuidance = false;
  452. Rachel.getInstance().getAnnaConnection().addEvent("Landing Burn");
  453. while(flight.getSurfaceAltitude() > (landingComplexTarget == LandingComplexEnum.Droneship ? 80 : 52) || verticalSpeed.get() < -0.01) {
  454. /* System.out.println("-----------------");
  455. System.out.println("Distance Total:" + distance(impactPoint().getValue0(), landingComplexTarget.getLat(),impactPoint().getValue1(), landingComplexTarget.getLong(),0.0,0.0));
  456. System.out.println("Distance Gauche:" + distance(impactPoint().getValue0(), landingComplexTarget.getLat(),0, 0,0.0,0.0));
  457. System.out.println("Distance Bas:" + distance(0, 0,impactPoint().getValue1(), landingComplexTarget.getLong(),0.0,0.0));
  458. System.out.println("-----------------");*/
  459.  
  460.  
  461. double max_decel = vessel.getAvailableThrust() / mass.get() - vessel.getOrbit().getBody().getSurfaceGravity();
  462. double stop_dist = (Math.pow(verticalSpeed.get(),2) / (2 * max_decel));
  463. vessel.getControl().setThrottle((float)(stop_dist / (flight.getSurfaceAltitude() - 27)));
  464.  
  465. if(flight.getSurfaceAltitude() < 700 && !vessel.getControl().getLegs()) {
  466. vessel.getControl().setLegs(true);
  467. }
  468. }
  469. //System.out.println("Distance: " + distance(impactPoint().getValue0(), landingComplexTarget.getLat(), impactPoint().getValue1(), landingComplexTarget.getLong(), 0.0, 0.0));
  470. vessel.getControl().setThrottle(0f);
  471.  
  472. for (SpaceCenter.Engine engine : vessel.getParts().getEngines()) { engine.setActive(false); }
  473.  
  474. for (String s : vessel.getParts().getLegs().get(0).getPart().getModules().get(1).getFields().keySet()) {
  475. System.out.println(s);
  476. }
  477.  
  478. Rachel.getInstance().getAnnaConnection().addEvent("Landed");
  479. Rachel.getInstance().sendAlert("Adhara has landed", StageEnum.STAGE_1);
  480. Rachel.getInstance().sendAlert("Precision:" + distance(flight.getLatitude(),landingComplexTarget.getLat(), flight.getLongitude(), landingComplexTarget.getLong(), 0.0, 0.0), StageEnum.STAGE_1);
  481. Rachel.getInstance().sendAlert("Fuel remain: " +(hydrogenResource.get() / 887410 * 100) + "%", StageEnum.STAGE_1);
  482. Thread.sleep(5000);
  483. Rachel.getInstance().sendAlert("Securing Booster..", StageEnum.STAGE_1);
  484. vessel.getAutoPilot().disengage();
  485. Rachel.getInstance().sendAlert("AutoPilot disengage..", StageEnum.STAGE_1);
  486. vessel.getControl().setRCS(false);
  487.  
  488. Rachel.getInstance().sendAlert("Legs are now hard", StageEnum.STAGE_1);
  489.  
  490. for (SpaceCenter.Leg leg : vessel.getParts().getLegs()) {
  491. if(leg.getPart().getModules().size() > 0)
  492. leg.getPart().getModules().get(1).setFieldFloat("springTweakable",0500000007F);
  493. }
  494.  
  495. } catch (Exception e) {
  496. e.printStackTrace();
  497. }
  498. }
  499. });
  500. landingBurn.setPriority(10);
  501. landingBurn.start();
  502.  
  503. }
  504.  
  505.  
  506. private void engineGuidance(SpaceCenter.Vessel vessel) {
  507.  
  508. Thread thread = new Thread(new Runnable() {
  509. @Override
  510. public void run() {
  511. try {
  512. Rachel.getInstance().getAnnaConnection().addEvent("Engine Guidance");
  513.  
  514. SpaceCenter.ReferenceFrame refFrame = vessel.getSurfaceReferenceFrame();
  515. SpaceCenter.Flight flight = vessel.flight(refFrame);
  516.  
  517. System.out.println(stageName + " : " + "Engine guidance");
  518. double Distance =0;
  519. double maxAngle = 90;
  520. double lastDist = 0;
  521. double lastHeading = flight.getHeading();
  522.  
  523. System.out.println("Engine time: " + (System.currentTimeMillis() - time));
  524. while (vessel.getControl().getThrottle() < 0.15) {
  525. Stream<Double> horizontalSpeed = connection.addStream(vessel.flight(vessel.getOrbit().getBody().getReferenceFrame()), "getHorizontalSpeed");
  526. Stream<Double> verticalSpeed = connection.addStream(vessel.flight(vessel.getOrbit().getBody().getReferenceFrame()), "getVerticalSpeed");
  527. float retrograde = (float) ((Math.atan(Math.abs(verticalSpeed.get()) / horizontalSpeed.get()) * 180) / Math.PI);
  528. System.out.println(flight.getMeanAltitude());
  529. vessel.getAutoPilot().setTargetPitch(retrograde);
  530. }
  531. while (flight.getSurfaceAltitude() > 1000 /*&& (!landingComplexTarget.equals(LandingComplexEnum.Droneship) || downrange > 600000)*/) {
  532. long time = System.currentTimeMillis();
  533. Distance = distance(impactPoint().getValue0(), landingComplexTarget.getLat(), impactPoint().getValue1(), landingComplexTarget.getLong(), 0.0, 0.0);
  534. lastDist = Distance;
  535. //} else if ((distance(impactPoint().getValue0(), landingComplexTarget.getLat(), impactPoint().getValue1(), landingComplexTarget.getLong(), 0, 0) < 1000 && Distance > 100)) {
  536.  
  537. if(Distance < 150) {
  538. maxAngle = 80;
  539. } else if(Distance < 20) {
  540. maxAngle = 86;
  541. } else if (Distance < 10) {
  542. maxAngle = 87.5;
  543. } else if (Distance < 4) {
  544. maxAngle = 89.5;
  545. }
  546. System.out.println("---");
  547.  
  548. System.out.println(Distance);
  549. System.out.println(maxAngle);
  550.  
  551.  
  552. double lat1 = landingComplexTarget.getLat();
  553. double lng1 = landingComplexTarget.getLong();
  554.  
  555. double lat2 = impactPoint().getValue0();
  556. double lng2 = impactPoint().getValue1();
  557.  
  558.  
  559. double teta1 = toRadians(lat1);
  560. double teta2 = toRadians(lat2);
  561. double delta1 = toRadians(lat2-lng1);
  562. double delta2 = toRadians(lng2-lng1);
  563.  
  564. //==================Heading Formula Calculation================//
  565.  
  566. double y = Math.sin(delta2) * Math.cos(teta2);
  567. double x = Math.cos(teta1)*Math.sin(teta2) - Math.sin(teta1)*Math.cos(teta2)*Math.cos(delta2);
  568. double brng = Math.atan2(y, x);
  569. brng = toDegrees(brng);// radians to degrees
  570. brng = ( ((int)brng + 360) % 360 );
  571.  
  572. System.out.println("Heading: "+ (brng - 180) + " - " + flight.getHeading());
  573.  
  574. vessel.getAutoPilot().targetPitchAndHeading((float)maxAngle, (float)(brng-180));
  575.  
  576.  
  577. }
  578. System.out.println(stageName + " : " + "End of engine guidance");
  579. while (vessel.getThrust() >0) {
  580. Stream<Double> horizontalSpeed = connection.addStream(vessel.flight(vessel.getOrbit().getBody().getReferenceFrame()), "getHorizontalSpeed");
  581. Stream<Double> verticalSpeed = connection.addStream(vessel.flight(vessel.getOrbit().getBody().getReferenceFrame()), "getVerticalSpeed");
  582. float retrograde = (float) ((Math.atan(Math.abs(verticalSpeed.get()) / horizontalSpeed.get()) * 180) / Math.PI);
  583. System.out.println(flight.getMeanAltitude());
  584. vessel.getAutoPilot().setTargetPitch(flight.getMeanAltitude() > 300 ? retrograde : 90f);
  585. }
  586. System.out.println(stageName + " : " + "End of retrograde guidance");
  587.  
  588.  
  589.  
  590. } catch (Exception e) { e.printStackTrace();}
  591. }
  592. });
  593. thread.setPriority(1);
  594. thread.start();
  595. }
  596.  
  597. long time = System.currentTimeMillis();
  598.  
  599.  
  600.  
  601. public void gridFinsGuidance(SpaceCenter.Vessel vessel) {
  602.  
  603. Thread thread = new Thread(new Runnable() {
  604. @Override
  605. public void run() {
  606. try {
  607. double Distance =0;
  608. double lastDist =0;
  609. float maxAngle = 80;
  610. SpaceCenter.ReferenceFrame refFrame = vessel.getSurfaceReferenceFrame();
  611. SpaceCenter.Flight flight = vessel.flight(refFrame);
  612. SpaceCenter.AutoPilot autoPilot = vessel.getAutoPilot();
  613. Rachel.getInstance().sendAlert("Gridfins guidance", StageEnum.STAGE_1);
  614. // vessel.getAutoPilot().setStoppingTime(new Triplet<>(0.2,0.2,0.2));
  615.  
  616. maxAngle = 0;
  617. double coef = 0.1;
  618. while (vessel.getThrust() < 1) {
  619. double offset = 0.025 * (int)(downrange/100000);
  620. if(offset < 0.025) offset = 0.025;
  621. Distance = distance(impactPoint().getValue0(), landingComplexTarget.getLat(), impactPoint().getValue1(), landingComplexTarget.getLong() + (flight.getMeanAltitude() > 5000 ? 0.002 : 0), 0.0, 0.0)/*+ (0.5*downrange)*/;
  622.  
  623.  
  624. /*if(landingComplexTarget.equals(LandingComplexEnum.Droneship))
  625. Distance = distance(0,0, impactPoint().getValue1(), landingComplexTarget.getLong(), 0.0, 0.0);
  626. else
  627. Distance = distance(0,0, impactPoint().getValue1(), landingComplexTarget.getLong() - (flight.getSurfaceAltitude() > 15000 ? offset : 0), 0.0, 0.0); lastDist = Distance;
  628.  
  629. System.out.println("Distance: " + Distance);*/
  630. if(Distance < 35000 && Distance > 5000) {
  631. maxAngle = 30;
  632. } else if (Distance < 5000 && Distance > 2000) {
  633. maxAngle = 50;
  634. } else if(Distance < 2000 && Distance > 1000) {
  635. maxAngle = 50;
  636. } else if(Distance < 1000 && Distance > 500) {
  637. maxAngle = 50;
  638. } else if(Distance < 500 && Distance > 250) {
  639. maxAngle = 50;
  640. } else if (Distance < 250 && Distance > 100) {
  641. maxAngle = 65;
  642. } else if(Distance < 100 && Distance > 50) {
  643. //} else if ((distance(impactPoint().getValue0(), landingComplexTarget.getLat(), impactPoint().getValue1(), landingComplexTarget.getLong(), 0, 0) < 1000 && Distance > 100)) {
  644. maxAngle = 70;
  645. } else if(Distance < 50 && Distance > 20) {
  646. //} else if ((distance(impactPoint().getValue0(), landingComplexTarget.getLat(), impactPoint().getValue1(), landingComplexTarget.getLong(), 0, 0) < 1000 && Distance > 100)) {
  647. maxAngle = 75;
  648. } else if(Distance < 20 && Distance > 1) {
  649. //} else if ((distance(impactPoint().getValue0(), landingComplexTarget.getLat(), impactPoint().getValue1(), landingComplexTarget.getLong(), 0, 0) < 1000 && Distance > 100)) {
  650. maxAngle = 85;
  651. } else if(Distance < 10) {
  652. Stream<Double> horizontalSpeed = connection.addStream(vessel.flight(vessel.getOrbit().getBody().getReferenceFrame()), "getHorizontalSpeed");
  653. Stream<Double> verticalSpeed = connection.addStream(vessel.flight(vessel.getOrbit().getBody().getReferenceFrame()), "getVerticalSpeed");
  654. maxAngle = (float)((Math.atan(Math.abs(verticalSpeed.get()) / horizontalSpeed.get()) * 180) / Math.PI);
  655. System.out.println("Retrograde");
  656. }
  657.  
  658. /*if(maxAngle < 75 && flight.getSurfaceAltitude() < 20000) {
  659. System.out.println("Remettre +5");
  660. maxAngle = 80;
  661. }*/
  662. //System.out.println("Pitch:" + maxAngle);
  663. // System.out.println(impactPoint().getValue0() + " " + impactPoint().getValue1());
  664. Pair<Double, Double> impact = impactPoint();
  665. /*if(impact.getValue1() - landingComplexTarget.getLong() > 0.0000000000001) {
  666. autoPilot.setTargetHeading(90);
  667. System.out.println(90);
  668. } else if(impact.getValue1() - landingComplexTarget.getLong() < -0.0000000000001) {
  669. autoPilot.setTargetHeading(270);
  670. System.out.println(270);
  671. } else if(impact.getValue0() - landingComplexTarget.getLat() > 0.00000000000001) {
  672. autoPilot.setTargetHeading(0);
  673. System.out.println(0);
  674. } else if(impact.getValue0() - landingComplexTarget.getLat() < -0.00000000000001) {
  675. autoPilot.setTargetHeading(180);
  676. System.out.println(180);
  677. }*/
  678. /*double lo1 = impact.getValue1();
  679. double lo2 = landingComplexTarget.getLong();
  680.  
  681. double la2 = landingComplexTarget.getLat();
  682. double la1 = impact.getValue0();*/
  683.  
  684.  
  685. /*if(flight.getGForce() > 2) {
  686. vessel.getControl().setRCS(false);
  687. } else {
  688. vessel.getControl().setRCS(true);
  689. }*/
  690.  
  691. double lat1 = landingComplexTarget.getLat();
  692. double lng1 = landingComplexTarget.getLong() + (flight.getMeanAltitude() > 5000 ? 0.002 : 0);
  693. double lat2 = impact.getValue0();
  694. double lng2 = impact.getValue1();
  695.  
  696.  
  697. double teta1 = toRadians(lat1);
  698. double teta2 = toRadians(lat2);
  699. double delta1 = toRadians(lat2-lng1);
  700. double delta2 = toRadians(lng2-lng1);
  701.  
  702. //==================Heading Formula Calculation================//
  703.  
  704. double y = Math.sin(delta2) * Math.cos(teta2);
  705. double x = Math.cos(teta1)*Math.sin(teta2) - Math.sin(teta1)*Math.cos(teta2)*Math.cos(delta2);
  706. double brng = Math.atan2(y, x);
  707. brng = toDegrees(brng);// radians to degrees
  708. brng = ( ((int)brng + 360) % 360 );
  709.  
  710. // if(Distance < 500) coef = 0.01;
  711.  
  712. if(flight.getGForce() > 2.0) {
  713. vessel.getControl().setBrakes(false);
  714. } else {
  715. vessel.getControl().setBrakes(true);
  716. }
  717.  
  718. if(Distance > lastDist && Distance < 300) {
  719. maxAngle = maxAngle - 2.5f;
  720. }
  721. lastDist = distance(impactPoint().getValue0(), landingComplexTarget.getLat(), impactPoint().getValue1(), landingComplexTarget.getLong(), 0.0, 0.0);
  722.  
  723. System.out.println("Pitch:" + (Distance > 500 ? (float)Math.max(90-(Distance*coef)/*(lastDist < Distance ? 5 :0)*/,10) : maxAngle));
  724. System.out.println("Heading: " + (float)brng);
  725.  
  726.  
  727.  
  728.  
  729. // System.out.println("Heading: "+ brng + " - " + flight.getHeading());
  730. // System.out.println("Pitch: "+ maxAngle + " - " + flight.getPitch());
  731. vessel.getAutoPilot().targetPitchAndHeading((Distance > 500 ? (float)Math.max(90-(Distance*coef)/*(lastDist < Distance ? 5 :0)*/,10) : maxAngle),(float)brng);
  732. // if(flight.getMeanAltitude() > 12000)
  733. // vessel.getAutoPilot().wait_();
  734. }
  735. engineGuidance(vessel);
  736. } catch (Exception e) { e.printStackTrace();}
  737. }
  738. });
  739. thread.start();
  740. thread.setPriority(10);
  741. }
  742.  
  743. public double toRadians(double value1) {
  744. return value1 * Math.PI / 180;
  745. }
  746.  
  747. public double toDegrees(double value) {
  748. return value * 180/Math.PI;
  749. }
  750.  
  751.  
  752.  
  753.  
  754.  
  755. public double distance(double lat1, double lat2, double lon1,
  756. double lon2, double el1, double el2) {
  757.  
  758. final int R = 6371; // Radius of the earth
  759.  
  760. double latDistance = Math.toRadians(lat2 - lat1);
  761. double lonDistance = Math.toRadians(lon2 - lon1);
  762. double a = Math.sin(latDistance / 2) * Math.sin(latDistance / 2)
  763. + Math.cos(Math.toRadians(lat1)) * Math.cos(Math.toRadians(lat2))
  764. * Math.sin(lonDistance / 2) * Math.sin(lonDistance / 2);
  765. double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
  766. double distance = R * c * 1000; // convert to meters
  767.  
  768. double height = el1 - el2;
  769.  
  770. distance = Math.pow(distance, 2) + Math.pow(height, 2);
  771.  
  772. return Math.sqrt(distance);
  773. }
  774.  
  775.  
  776. /**
  777. * Get first stage impact point
  778. * @return Latitude / Longitude values.
  779. */
  780.  
  781. public Pair<Double, Double> impactPoint() {
  782. try {
  783. //System.out.println(Trajectories.newInstance(connection).impactPos().getValue0() + Trajectories.newInstance(connection).impactPos().getValue1());
  784. return PR.newInstance(connection).getImpactPos(vessel);
  785. //return Trajectories.newInstance(connection).impactPos();
  786. } catch (Exception e) {
  787. }
  788.  
  789. return new Pair<>(0D,0D);
  790. }
  791.  
  792. public double metersBtwPoints(double lat1, double lon1, double lat2, double lon2) {
  793. double R = 6371; // Radius of earth in KM
  794. double dLat = lat2 * Math.PI / 180 - lat1 * Math.PI / 180;
  795. double dLon = lon2 * Math.PI / 180 - lon1 * Math.PI / 180;
  796. double a = Math.sin(dLat/2) * Math.sin(dLat/2) +
  797. Math.cos(lat1 * Math.PI / 180) * Math.cos(lat2 * Math.PI / 180) *
  798. Math.sin(dLon/2) * Math.sin(dLon/2);
  799. double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
  800. double d = R * c;
  801. return d * 1000; // meters
  802. }
  803.  
  804. public void restoreConnectionWithFirstStage(SpaceCenter spaceCenter) {
  805. try {
  806. System.out.println(stageName + " : " + "Recover network...");
  807. for (SpaceCenter.Vessel spaceCenterVessel : spaceCenter.getVessels()) {
  808.  
  809. if (!(spaceCenterVessel.getMET() > 60)) {
  810. if(spaceCenterVessel.getParts().withName("proceduralAvionics").size() > 0) {
  811. System.out.println(stageName + " : " + spaceCenterVessel.getParts().withName("proceduralAvionics").get(0).getTag().equals(stageName));
  812. System.out.println(stageName + " : " + spaceCenterVessel.getParts().withName("proceduralAvionics").get(0).getTag().contains(stageName));
  813. System.out.println(stageName + " : " + spaceCenterVessel.getParts().withName("proceduralAvionics").get(0).getTag() + " " + stageName);
  814. if (spaceCenterVessel.getParts().withName("proceduralAvionics").get(0).getTag().equals(stageName)) {
  815. vessel = spaceCenterVessel;
  816. System.out.println(stageName + " : " + "New Vessel : " + this.vessel.getName());
  817. spaceCenterVessel.setName(stageName);
  818. break;
  819. }
  820. }
  821. }
  822. }
  823.  
  824. if(vessel == null) restoreConnectionWithFirstStage(spaceCenter);
  825. } catch (Exception e) {
  826. e.printStackTrace();
  827. }
  828. }
  829.  
  830.  
  831. public LandingComplexEnum getLandingComplexTarget() {
  832. return landingComplexTarget;
  833. }
  834.  
  835. //Should it land? Or should it splashdown ?
  836. public boolean isShoulditland() {
  837. return Shoulditland;
  838. }
  839.  
  840.  
  841. @Override
  842. public void tick() {
  843.  
  844. }
  845.  
  846.  
  847.  
  848. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement