Advertisement
Eychics_

Code boof

Jan 13th, 2021
186
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 58.96 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. import java.util.*;
  23.  
  24. public class Booster extends FirstStage {
  25.  
  26. protected boolean Shoulditland;
  27. protected SpaceCenter spaceCenter;
  28. protected SpaceCenter.Vessel vessel;
  29.  
  30. protected LandingComplexEnum landingComplexTarget;
  31.  
  32. public Booster(SpaceCenter.Vessel vessel, SpaceCenter spaceCenter, String stageName, Connection connection, RocketBody rocketBody,LandingComplexEnum landingComplexEnum, boolean Shoulditland) {
  33. super(rocketBody, stageName, connection);
  34. this.Shoulditland = Shoulditland;
  35. firstStageDatas = new FirstStageDatas();
  36. this.stageName = stageName;
  37. this.Shoulditland = Shoulditland;
  38. this.spaceCenter = spaceCenter;
  39. this.landingComplexTarget = landingComplexEnum;
  40.  
  41. downrange = distance(landingComplexTarget.getLat(), 28.5289202545645, landingComplexTarget.getLong(), -80.52526259414269, 0.0, 0.0);
  42. }
  43.  
  44. double downrange = 0;
  45.  
  46. @Override
  47. public void startup() {}
  48.  
  49. @Override
  50. public void meco() {
  51. try {
  52. for (SpaceCenter.Engine engine : vessel.getParts().getEngines()) {
  53. engine.setActive(false);
  54. }
  55. for (SpaceCenter.Engine engine : vessel.getParts().getEngines()) {
  56. engine.setThrustLimit(1f);
  57. }
  58. Rachel.getInstance().sendAlert("First Stage MECO", StageEnum.STAGE_1);
  59. } catch (Exception e) {
  60. e.printStackTrace();
  61. }
  62. }
  63.  
  64. @Override
  65. public void boostbackburn() {
  66. new Thread(new Runnable() {
  67. @Override
  68. public void run() {
  69. try {
  70. vessel.getControl().setThrottle(0f);
  71. vessel.getControl().toggleActionGroup(4);
  72. //vessel.getControl().activateNextStage();
  73. vessel.getAutoPilot().engage();
  74. //-10
  75. // if(!landingComplexTarget.equals(LandingComplexEnum.Droneship)) {
  76.  
  77. int pitch = 0;
  78. if ((rocketBody.equals(RocketBody.SIDE_BOOSTER))) {
  79. pitch = 25;
  80. } else if (rocketBody.equals(RocketBody.CENTER_CORE)) {
  81. pitch = 10;
  82. } else if (landingComplexTarget.equals(LandingComplexEnum.Droneship)) {
  83. pitch = 10;
  84. } else {
  85. pitch = 12;
  86. }
  87.  
  88. vessel.getAutoPilot().targetPitchAndHeading(pitch, 273);
  89. System.out.println(stageName + " : " + stageName + " : " + "Flip");
  90.  
  91. for (SpaceCenter.RCS rcs : vessel.getParts().getRCS()) {
  92. rcs.setEnabled(true);
  93. }
  94. vessel.getControl().setRCS(true);
  95. Thread.sleep(5000);
  96. vessel.getParts().withTag("centerEngine").get(0).getEngine().setActive(true);
  97. vessel.getControl().setThrottle(1f);
  98. SpaceCenter.ReferenceFrame refFrame = vessel.getSurfaceReferenceFrame();
  99. SpaceCenter.Flight flight = vessel.flight(refFrame);
  100.  
  101. vessel.getParts().withTag("centerEngine").get(0).getEngine().setActive(true);
  102.  
  103. while (Math.abs(flight.getHeading() - 273) > 5) {
  104. System.out.println(stageName + " : Pitch " + flight.getPitch() + " Heading " + flight.getHeading());
  105. }
  106.  
  107. vessel.getParts().withTag("centerEngine").get(0).getEngine().setActive(true);
  108.  
  109. for (SpaceCenter.Part engine : vessel.getParts().withTag("sideEngine")) {
  110. engine.getEngine().setActive(true);
  111. }
  112. System.out.println(stageName + " : " + "Engine startup");
  113. Rachel.getInstance().getAnnaConnection().addEvent("Boostback Burn");
  114. vessel.getControl().setThrottle(1f);
  115.  
  116. vessel.getControl().setRCS(false);
  117.  
  118. //double maxLatDiff = (rocketBody.equals(RocketBody.SIDE_BOOSTER) ? 0.1 : 0.05);
  119. Pair<Double, Double> impact = impactPoint();
  120. while ((impact.getValue1() - 0.1) > landingComplexTarget.getLong()) {
  121. impact = impactPoint();
  122. /*int correction = 0;
  123. if (impact.getValue0() - landingComplexTarget.getLat() > 0.01) {
  124. if(metersBtwPoints(impact.getValue0(),0,landingComplexTarget.getLat(),0) > 20000) {
  125. correction = 225;
  126. } else if(metersBtwPoints(impact.getValue0(),0,landingComplexTarget.getLat(),0) > 10000) {
  127. correction = 245;
  128. } else {
  129. correction = 265;
  130. }
  131. vessel.getAutoPilot().setTargetHeading(correction);
  132. } else if (impact.getValue0() - landingComplexTarget.getLat() < 0.01) {
  133. if(metersBtwPoints(impact.getValue0(),0,landingComplexTarget.getLat(),0) > 20000) {
  134. correction = 305;
  135. } else if(metersBtwPoints(impact.getValue0(),0,landingComplexTarget.getLat(),0) > 10000) {
  136. correction = 285;
  137. } else {
  138. correction = 275;
  139. }
  140.  
  141. vessel.getAutoPilot().setTargetHeading(correction);
  142. }*/
  143.  
  144. /*if(vessel.getOrbit().getApoapsisAltitude() > 205000) pitch = 0;
  145. if(vessel.getOrbit().getApoapsisAltitude() < 200000) pitch = 5;
  146. else pitch = 0;
  147. vessel.getAutoPilot().setTargetPitch(pitch);*/
  148.  
  149. double lat1 = landingComplexTarget.getLat();
  150. double lng1 = landingComplexTarget.getLong();
  151.  
  152. double lat2 = impact.getValue0();
  153. double lng2 = impact.getValue1();
  154.  
  155.  
  156. double teta1 = toRadians(lat1);
  157. double teta2 = toRadians(lat2);
  158. double delta1 = toRadians(lat2 - lng1);
  159. double delta2 = toRadians(lng2 - lng1);
  160.  
  161. //==================Heading Formula Calculation================//
  162.  
  163. double y = Math.sin(delta2) * Math.cos(teta2);
  164. double x = Math.cos(teta1) * Math.sin(teta2) - Math.sin(teta1) * Math.cos(teta2) * Math.cos(delta2);
  165. double brng = Math.atan2(y, x);
  166. brng = toDegrees(brng);// radians to degrees
  167. brng = (((int) brng + 360) % 360);
  168.  
  169. System.out.println("Heading: " + (brng - 180) + " - " + flight.getHeading());
  170. vessel.getAutoPilot().setTargetHeading((float) (brng - 180));
  171. }
  172. for (SpaceCenter.Part engine : vessel.getParts().withTag("sideEngine")) {
  173. engine.getEngine().setActive(false);
  174. }
  175.  
  176. while ((impact.getValue1()) > landingComplexTarget.getLong()) {
  177. impact = impactPoint();
  178.  
  179. /*int correction = 0;
  180. if (impact.getValue0() - landingComplexTarget.getLat() > 0.01) {
  181. if(metersBtwPoints(impact.getValue0(),0,landingComplexTarget.getLat(),0) > 20000) {
  182. correction = 225;
  183. } else if(metersBtwPoints(impact.getValue0(),0,landingComplexTarget.getLat(),0) > 10000) {
  184. correction = 245;
  185. } else {
  186. correction = 265;
  187. }
  188. vessel.getAutoPilot().setTargetHeading(correction);
  189. } else if (impact.getValue0() - landingComplexTarget.getLat() < 0.01) {
  190. if(metersBtwPoints(impact.getValue0(),0,landingComplexTarget.getLat(),0) > 20000) {
  191. correction = 305;
  192. } else if(metersBtwPoints(impact.getValue0(),0,landingComplexTarget.getLat(),0) > 10000) {
  193. correction = 285;
  194. } else {
  195. correction = 275;
  196. }
  197.  
  198. vessel.getAutoPilot().setTargetHeading(correction);
  199. }*/
  200.  
  201. double lat1 = landingComplexTarget.getLat();
  202. double lng1 = landingComplexTarget.getLong();
  203.  
  204. double lat2 = impact.getValue0();
  205. double lng2 = impact.getValue1();
  206.  
  207.  
  208. double teta1 = toRadians(lat1);
  209. double teta2 = toRadians(lat2);
  210. double delta1 = toRadians(lat2 - lng1);
  211. double delta2 = toRadians(lng2 - lng1);
  212.  
  213. //==================Heading Formula Calculation================//
  214.  
  215. double y = Math.sin(delta2) * Math.cos(teta2);
  216. double x = Math.cos(teta1) * Math.sin(teta2) - Math.sin(teta1) * Math.cos(teta2) * Math.cos(delta2);
  217. double brng = Math.atan2(y, x);
  218. brng = toDegrees(brng);// radians to degrees
  219. brng = (((int) brng + 360) % 360);
  220.  
  221. System.out.println("Heading: " + (brng - 180) + " - " + flight.getHeading());
  222. vessel.getAutoPilot().setTargetHeading((float) (brng - 180));
  223. }
  224.  
  225. // }
  226. System.out.println(stageName + " : " + "Engine shutdown");
  227. vessel.getControl().setThrottle(0f);
  228.  
  229. // }
  230. vessel.getAutoPilot().engage();
  231. vessel.getControl().setRCS(true);
  232.  
  233.  
  234. vessel.getAutoPilot().targetPitchAndHeading(90,0);
  235.  
  236. for (SpaceCenter.ControlSurface controlSurface : vessel.getParts().getControlSurfaces()) {
  237. controlSurface.setPitchEnabled(false);
  238. controlSurface.setYawEnabled(false);
  239. }
  240.  
  241. vessel.getControl().setBrakes(true);
  242. Thread.sleep(1500);
  243. entryburn();
  244.  
  245.  
  246.  
  247.  
  248. //gridFinsGuidance(vessel);
  249.  
  250. } catch (Exception e) {
  251. e.printStackTrace();
  252. }
  253. }
  254. }).start();
  255.  
  256. }
  257.  
  258. public double calcHeading() {
  259.  
  260. double lat1 = landingComplexTarget.getLat();
  261. double lng1 = landingComplexTarget.getLong();
  262.  
  263. double lat2 = impactPoint().getValue0();
  264. double lng2 = impactPoint().getValue1();
  265.  
  266.  
  267. double teta1 = toRadians(lat1);
  268. double teta2 = toRadians(lat2);
  269. double delta1 = toRadians(lat2 - lng1);
  270. double delta2 = toRadians(lng2 - lng1);
  271.  
  272. //==================Heading Formula Calculation================//
  273.  
  274. double y = Math.sin(delta2) * Math.cos(teta2);
  275. double x = Math.cos(teta1) * Math.sin(teta2) - Math.sin(teta1) * Math.cos(teta2) * Math.cos(delta2);
  276. double brng = Math.atan2(y, x);
  277. brng = toDegrees(brng);// radians to degrees
  278. brng = (((int) brng + 360) % 360);
  279. return brng;
  280. }
  281.  
  282. /*@Override
  283. public void entryburn() {
  284. Thread thread = new Thread(new Runnable() {
  285. @Override
  286. public void run() {
  287. try {
  288.  
  289. vessel.getControl().setBrakes(false);
  290.  
  291.  
  292. vessel.getAutoPilot().engage();
  293. vessel.getControl().setRCS(true);
  294. SpaceCenter.Resources stageResources = vessel.getResources();
  295. Stream<Float> hydrogenResource = connection.addStream(stageResources, "amount", "LqdMethane");
  296.  
  297. System.out.println(stageName + " : " + "Fuel: " + (hydrogenResource.get() / 1030214 * 100));
  298.  
  299. SpaceCenter.ReferenceFrame refFrame = vessel.getSurfaceReferenceFrame();
  300. SpaceCenter.Flight flight = vessel.flight(refFrame);
  301. for (SpaceCenter.RCS rc : vessel.getParts().getRCS()) {
  302. rc.setEnabled(true);
  303. }
  304. Stream<Double> verticalSpeed = connection.addStream(vessel.flight(vessel.getOrbit().getBody().getReferenceFrame()), "getVerticalSpeed");
  305. while(verticalSpeed.get() > -0.01) { Thread.sleep(1000); }
  306. Stream<Double> horizontalSpeed = connection.addStream(vessel.flight(vessel.getOrbit().getBody().getReferenceFrame()), "getHorizontalSpeed");
  307.  
  308. float retrograde = (float)((Math.atan(Math.abs(verticalSpeed.get()) / horizontalSpeed.get()) * 180) / Math.PI) + 8;
  309. System.out.println("Retrograde: " +retrograde);
  310. double offset = 0.025 * (int)(downrange/100000);
  311. if(offset < 0.025) offset = 0.025;
  312.  
  313. float heading = (landingComplexTarget == LandingComplexEnum.Droneship ? 235 : 90);
  314.  
  315. System.out.println((landingComplexTarget.getLat() + ", " + (landingComplexTarget.getLong() - (flight.getSurfaceAltitude() > 15000 ? offset : 0))));
  316.  
  317. double lat1 = impactPoint().getValue0();
  318. double lng1 = impactPoint().getValue1();
  319.  
  320. double lat2 = flight.getLatitude();
  321. double lng2 = flight.getLongitude();
  322.  
  323.  
  324.  
  325.  
  326. double teta1 = toRadians(lat1);
  327. double teta2 = toRadians(lat2);
  328. double delta1 = toRadians(lat2-lng1);
  329. double delta2 = toRadians(lng2-lng1);
  330.  
  331. //==================Heading Formula Calculation================//
  332.  
  333. double y = Math.sin(delta2) * Math.cos(teta2);
  334. double x = Math.cos(teta1)*Math.sin(teta2) - Math.sin(teta1)*Math.cos(teta2)*Math.cos(delta2);
  335. double brng = Math.atan2(y, x);
  336. brng = toDegrees(brng);// radians to degrees
  337. brng = ( ((int)brng + 360) % 360 );
  338.  
  339. System.out.println("Test Heading: "+ brng + " - " + (brng-180));
  340.  
  341. vessel.getAutoPilot().targetPitchAndHeading(retrograde, (float)brng);
  342.  
  343. while (flight.getSurfaceAltitude() > (rocketBody.equals(RocketBody.SIDE_BOOSTER) ? 92000 : (landingComplexTarget.equals(LandingComplexEnum.Droneship) ? (downrange > 800000 ? 90000:70000) : 70000))) { //65 000
  344. Thread.sleep(1000);
  345. }
  346.  
  347. spaceCenter.setPhysicsWarpFactor(0);
  348. vessel.getControl().setSAS(false);
  349. vessel.getAutoPilot().engage();
  350. Rachel.getInstance().sendAlert("Entry burn start", StageEnum.STAGE_1);
  351.  
  352. vessel.getControl().setRCS(true);
  353. vessel.getParts().withTag("centerEngine").get(0).getEngine().setActive(true);
  354. Rachel.getInstance().getAnnaConnection().addEvent("Entry Burn");
  355. vessel.getControl().setThrottle(1f);
  356.  
  357.  
  358. for (SpaceCenter.Part sideEngine : vessel.getParts().withTag("sideEngine")) {
  359. sideEngine.getEngine().setActive(true);
  360. sideEngine.getEngine().setThrustLimit(0.75f);
  361. //sideEngine.getEngine().setThrustLimit(0.885f);
  362. }
  363. Stream<Double> speed = connection.addStream(vessel.flight(vessel.getOrbit().getBody().getReferenceFrame()), "getSpeed");
  364.  
  365. long time = System.currentTimeMillis();
  366. double Distance = distance(impactPoint().getValue0(), landingComplexTarget.getLat(),impactPoint().getValue1(), landingComplexTarget.getLong(),0.0,0.0);
  367. boolean end = false;
  368.  
  369.  
  370. System.out.println(downrange + "km");
  371. float maxAngle = (rocketBody.equals(RocketBody.CENTER_CORE) ? 10 : (downrange > 600000 ? 50:70));
  372. double lastDist;
  373. horizontalSpeed = connection.addStream(vessel.flight(vessel.getOrbit().getBody().getReferenceFrame()), "getHorizontalSpeed");
  374. verticalSpeed = connection.addStream(vessel.flight(vessel.getOrbit().getBody().getReferenceFrame()), "getVerticalSpeed");
  375.  
  376.  
  377.  
  378.  
  379.  
  380. while (verticalSpeed.get() < -700 || horizontalSpeed.get() > 1800) {
  381.  
  382. lat1 = impactPoint().getValue0();
  383. lng1 = impactPoint().getValue1();
  384.  
  385. lat2 = flight.getLatitude();
  386. lng2 = flight.getLongitude();
  387.  
  388.  
  389.  
  390.  
  391. teta1 = toRadians(lat1);
  392. teta2 = toRadians(lat2);
  393. delta1 = toRadians(lat2-lng1);
  394. delta2 = toRadians(lng2-lng1);
  395.  
  396. //==================Heading Formula Calculation================//
  397.  
  398. y = Math.sin(delta2) * Math.cos(teta2);
  399. x = Math.cos(teta1)*Math.sin(teta2) - Math.sin(teta1)*Math.cos(teta2)*Math.cos(delta2);
  400. brng = Math.atan2(y, x);
  401. brng = toDegrees(brng);// radians to degrees
  402. brng = ( ((int)brng + 360) % 360 );
  403.  
  404.  
  405. if(landingComplexTarget.equals(LandingComplexEnum.Droneship))
  406. Distance = distance(0, 0, impactPoint().getValue1(), landingComplexTarget.getLong() + (flight.getSurfaceAltitude() > 15000 ? offset : 0), 0.0, 0.0);
  407. else
  408. Distance = distance(0, 0, impactPoint().getValue1(), landingComplexTarget.getLong() - (flight.getSurfaceAltitude() > 15000 ? offset : 0), 0.0, 0.0);
  409. lastDist = Distance;
  410. if(!landingComplexTarget.equals(LandingComplexEnum.Droneship)) {
  411. retrograde = (float) ((Math.atan(Math.abs(verticalSpeed.get()) / horizontalSpeed.get()) * 180) / Math.PI);
  412. if (Distance > 2000) {
  413. maxAngle = (landingComplexTarget.equals(LandingComplexEnum.Droneship) ? 5 : 15);
  414. } else if (Distance < 2000 && Distance > 500) {
  415. maxAngle = (landingComplexTarget.equals(LandingComplexEnum.Droneship) ? 5 : 10);
  416. } else if (Distance < 500) {
  417. maxAngle = 5;
  418. }
  419. System.out.println("Max Angle: " + maxAngle);
  420. if (impactPoint().getValue1() - (landingComplexTarget.getLong() - (flight.getSurfaceAltitude() > 15000 ? offset : 0)) > 0.001) {
  421. System.out.println("Vandenberg");
  422. vessel.getAutoPilot().targetPitchAndHeading(retrograde + maxAngle, (float)brng);
  423. } else if (impactPoint().getValue1() - (landingComplexTarget.getLong() - (flight.getSurfaceAltitude() > 15000 ? offset : 0)) < 0.001) {
  424. vessel.getAutoPilot().targetPitchAndHeading(retrograde - maxAngle, (float)brng);
  425. System.out.println("France");
  426. }
  427. } else {
  428. if(Distance > lastDist) retrograde = retrograde - 0.1f;
  429. if(Distance < lastDist) retrograde = retrograde + 0.1f;
  430. vessel.getAutoPilot().targetPitchAndHeading(retrograde, (float)brng);
  431. }
  432.  
  433.  
  434. }
  435.  
  436. for (SpaceCenter.Part sideEngine : vessel.getParts().withTag("sideEngine")) {
  437. sideEngine.getEngine().setActive(true);
  438. sideEngine.getEngine().setThrustLimit(100f);
  439. }
  440.  
  441.  
  442.  
  443.  
  444.  
  445. //vessel.getControl().setSAS(true);
  446. //vessel.getControl().setSASMode(SpaceCenter.SASMode.RETROGRADE);
  447. vessel.getControl().setThrottle(0f);
  448. System.out.println(stageName + " : " + "End of entry burn engine guidance");
  449. System.out.println(stageName + " : " + "vSpeed: " + verticalSpeed.get());
  450.  
  451. for (SpaceCenter.Part sideEngine : vessel.getParts().withTag("sideEngine"))
  452. sideEngine.getEngine().setThrustLimit(0.30f);
  453.  
  454. System.out.println(stageName + " : " + "Entry burn shutdown, Time: " + ((System.currentTimeMillis() - time) / 1000) + " seconds");
  455.  
  456.  
  457.  
  458.  
  459.  
  460. //gridFinsGuidance(vessel);
  461.  
  462. System.out.println(stageName + " : " + "Fuel: " + (hydrogenResource.get() / 1030214 * 100));
  463. gridFinsGuidance(vessel);
  464.  
  465. } catch (Exception e) { e.printStackTrace();}
  466. }
  467. });
  468. thread.setPriority(10);
  469. thread.start();
  470. thread.setPriority(10);
  471. }*/
  472.  
  473.  
  474. @Override
  475. public void entryburn() {
  476. Thread thread = new Thread(new Runnable() {
  477. @Override
  478. public void run() {
  479. try {
  480.  
  481.  
  482.  
  483. vessel.getAutoPilot().engage();
  484. SpaceCenter.Resources stageResources = vessel.getResources();
  485. Stream<Float> hydrogenResource = connection.addStream(stageResources, "amount", "LqdMethane");
  486.  
  487. System.out.println(stageName + " : " + "Fuel: " + (hydrogenResource.get() / 1030214 * 100));
  488.  
  489. SpaceCenter.ReferenceFrame refFrame = vessel.getSurfaceReferenceFrame();
  490. SpaceCenter.Flight flight = vessel.flight(refFrame);
  491. for (SpaceCenter.RCS rc : vessel.getParts().getRCS()) {
  492. rc.setEnabled(true);
  493. }
  494. Stream<Double> verticalSpeed = connection.addStream(vessel.flight(vessel.getOrbit().getBody().getReferenceFrame()), "getVerticalSpeed");
  495. vessel.getAutoPilot().setTargetPitch(90f);
  496. while(verticalSpeed.get() > -0.01) {
  497. Thread.sleep(1000);
  498. }
  499.  
  500. double lat1 = impactPoint().getValue0();
  501. double lng1 = impactPoint().getValue1();
  502.  
  503. double lat2 = flight.getLatitude();
  504. double lng2 = flight.getLongitude();
  505.  
  506.  
  507.  
  508.  
  509. double teta1 = toRadians(lat1);
  510. double teta2 = toRadians(lat2);
  511. double delta1 = toRadians(lat2-lng1);
  512. double delta2 = toRadians(lng2-lng1);
  513.  
  514. //==================Heading Formula Calculation================//
  515.  
  516. double y = Math.sin(delta2) * Math.cos(teta2);
  517. double x = Math.cos(teta1)*Math.sin(teta2) - Math.sin(teta1)*Math.cos(teta2)*Math.cos(delta2);
  518. double brng = Math.atan2(y, x);
  519. brng = toDegrees(brng);// radians to degrees
  520. brng = ( ((int)brng + 360) % 360 );
  521.  
  522. System.out.println("Test Heading: "+ brng + " - " + (brng-180));
  523.  
  524. vessel.getAutoPilot().targetPitchAndHeading(70,(float)brng);
  525.  
  526. while (flight.getSurfaceAltitude() > (rocketBody.equals(RocketBody.SIDE_BOOSTER) ? 70000 : (landingComplexTarget.equals(LandingComplexEnum.Droneship) ? (downrange > 800000 ? 90000:70000) : 70000))) { //65 000
  527. Thread.sleep(1000);
  528. }
  529. vessel.getControl().setRCS(true);
  530.  
  531. spaceCenter.setPhysicsWarpFactor(0);
  532. vessel.getControl().setSAS(false);
  533. vessel.getAutoPilot().engage();
  534. Rachel.getInstance().sendAlert("Entry burn start", StageEnum.STAGE_1);
  535.  
  536. vessel.getControl().setRCS(true);
  537. vessel.getParts().withTag("centerEngine").get(0).getEngine().setActive(true);
  538. Rachel.getInstance().getAnnaConnection().addEvent("Entry Burn");
  539. vessel.getControl().setThrottle(1f);
  540.  
  541.  
  542. for (SpaceCenter.Part sideEngine : vessel.getParts().withTag("sideEngine")) {
  543. sideEngine.getEngine().setActive(true);
  544. // sideEngine.getEngine().setThrustLimit(0.75f);
  545. //sideEngine.getEngine().setThrustLimit(0.885f);
  546. }
  547. Stream<Double> horizontalSpeed = connection.addStream(vessel.flight(vessel.getOrbit().getBody().getReferenceFrame()), "getHorizontalSpeed");
  548. Stream<Double> speed = connection.addStream(vessel.flight(vessel.getOrbit().getBody().getReferenceFrame()), "getSpeed");
  549.  
  550. long time = System.currentTimeMillis();
  551. double Distance = distance(impactPoint().getValue0(), landingComplexTarget.getLat(),impactPoint().getValue1(), landingComplexTarget.getLong(),0.0,0.0);
  552. boolean end = false;
  553.  
  554. /*vessel.getAutoPilot().disengage();
  555. vessel.getControl().setSASMode(SpaceCenter.SASMode.RETROGRADE);
  556. vessel.getControl().setSAS(true);
  557. vessel.getControl().setSASMode(SpaceCenter.SASMode.RETROGRADE);*/
  558. System.out.println(downrange + "km");
  559. float maxAngle = (rocketBody.equals(RocketBody.CENTER_CORE) ? 10 : (downrange > 600000 ? 50:70));
  560. double lastDist;
  561. horizontalSpeed = connection.addStream(vessel.flight(vessel.getOrbit().getBody().getReferenceFrame()), "getHorizontalSpeed");
  562. verticalSpeed = connection.addStream(vessel.flight(vessel.getOrbit().getBody().getReferenceFrame()), "getVerticalSpeed");
  563.  
  564.  
  565. float retrograde = (float)((Math.atan(Math.abs(verticalSpeed.get()) / horizontalSpeed.get()) * 180) / Math.PI) + 8;
  566. System.out.println("Retrograde: " +retrograde);
  567. double offset = 0.025 * (int)(downrange/100000);
  568. if(offset < 0.025) offset = 0.025;
  569.  
  570. float heading = (landingComplexTarget == LandingComplexEnum.Droneship ? 235 : 90);
  571.  
  572. System.out.println((landingComplexTarget.getLat() + ", " + (landingComplexTarget.getLong() - (flight.getSurfaceAltitude() > 15000 ? offset : 0))));
  573.  
  574.  
  575.  
  576. while (verticalSpeed.get() < -700 /*|| horizontalSpeed.get() > 1800*/ && (vessel.getResources().amount("LqdOxygen") / 108041 * 100) > 1.5f) {
  577.  
  578. lat1 = impactPoint().getValue0();
  579. lng1 = impactPoint().getValue1();
  580.  
  581. lat2 = flight.getLatitude();
  582. lng2 = flight.getLongitude();
  583.  
  584.  
  585.  
  586.  
  587. teta1 = toRadians(lat1);
  588. teta2 = toRadians(lat2);
  589. delta1 = toRadians(lat2-lng1);
  590. delta2 = toRadians(lng2-lng1);
  591.  
  592. //==================Heading Formula Calculation================//
  593.  
  594. y = Math.sin(delta2) * Math.cos(teta2);
  595. x = Math.cos(teta1)*Math.sin(teta2) - Math.sin(teta1)*Math.cos(teta2)*Math.cos(delta2);
  596. brng = Math.atan2(y, x);
  597. brng = toDegrees(brng);// radians to degrees
  598. brng = ( ((int)brng + 360) % 360 );
  599.  
  600.  
  601. if(landingComplexTarget.equals(LandingComplexEnum.Droneship))
  602. Distance = distance(0, 0, impactPoint().getValue1(), landingComplexTarget.getLong() + (flight.getSurfaceAltitude() > 15000 ? offset : 0), 0.0, 0.0);
  603. else
  604. Distance = distance(0, 0, impactPoint().getValue1(), landingComplexTarget.getLong() - (flight.getSurfaceAltitude() > 15000 ? offset : 0), 0.0, 0.0);
  605. lastDist = Distance;
  606. if(!landingComplexTarget.equals(LandingComplexEnum.Droneship)) {
  607. /*retrograde = (float) ((Math.atan(Math.abs(verticalSpeed.get()) / horizontalSpeed.get()) * 180) / Math.PI);
  608. if (Distance > 2000) {
  609. maxAngle = (landingComplexTarget.equals(LandingComplexEnum.Droneship) ? 5 : 15);
  610. } else if (Distance < 2000 && Distance > 500) {
  611. maxAngle = (landingComplexTarget.equals(LandingComplexEnum.Droneship) ? 5 : 10);
  612. } else if (Distance < 500) {
  613. maxAngle = 5;
  614. }
  615. System.out.println("Max Angle: " + maxAngle);
  616. if (impactPoint().getValue1() - (landingComplexTarget.getLong() - (flight.getSurfaceAltitude() > 15000 ? offset : 0)) > 0.001) {
  617. System.out.println("Vandenberg");
  618. vessel.getAutoPilot().targetPitchAndHeading(retrograde + maxAngle, (float)brng);
  619. } else if (impactPoint().getValue1() - (landingComplexTarget.getLong() - (flight.getSurfaceAltitude() > 15000 ? offset : 0)) < 0.001) {
  620. vessel.getAutoPilot().targetPitchAndHeading(retrograde - maxAngle, (float)brng);
  621. System.out.println("France");
  622. }*/
  623. System.out.println("Calc retrograde");
  624. refFrame = vessel.getSurfaceVelocityReferenceFrame();
  625. flight = vessel.flight(refFrame);
  626. vessel.getAutoPilot().setReferenceFrame(refFrame);
  627. vessel.getAutoPilot().setTargetDirection(new Triplet<>(0.0,-1.0,0.0));
  628. } else {
  629. System.out.println("Calc retrograde");
  630. refFrame = vessel.getSurfaceVelocityReferenceFrame();
  631. flight = vessel.flight(refFrame);
  632. vessel.getAutoPilot().setReferenceFrame(refFrame);
  633. vessel.getAutoPilot().setTargetDirection(new Triplet<>(0.0,-1.0,0.0));
  634. }
  635.  
  636.  
  637. }
  638.  
  639. vessel.getAutoPilot().setReferenceFrame(vessel.getSurfaceReferenceFrame());
  640.  
  641.  
  642. for (SpaceCenter.Part sideEngine : vessel.getParts().withTag("sideEngine")) {
  643. sideEngine.getEngine().setActive(true);
  644. sideEngine.getEngine().setThrustLimit(100f);
  645. }
  646.  
  647.  
  648.  
  649.  
  650.  
  651. //vessel.getControl().setSAS(true);
  652. //vessel.getControl().setSASMode(SpaceCenter.SASMode.RETROGRADE);
  653. vessel.getControl().setThrottle(0f);
  654. System.out.println(stageName + " : " + "End of entry burn engine guidance");
  655. if((vessel.getResources().amount("LqdOxygen") / 108041 * 100) < 1.5f)
  656. System.out.println(stageName + " : " + "Less than a 1.5%, Abort Entry burn");
  657. System.out.println(stageName + " : " + "vSpeed: " + verticalSpeed.get());
  658.  
  659. for (SpaceCenter.Part sideEngine : vessel.getParts().withTag("sideEngine"))
  660. sideEngine.getEngine().setThrustLimit(0.30f);
  661.  
  662. System.out.println(stageName + " : " + "Entry burn shutdown, Time: " + ((System.currentTimeMillis() - time) / 1000) + " seconds");
  663.  
  664.  
  665.  
  666.  
  667.  
  668. //gridFinsGuidance(vessel);
  669.  
  670. System.out.println(stageName + " : " + "Fuel: " + (hydrogenResource.get() / 1030214 * 100));
  671. gridFinsGuidance(vessel);
  672.  
  673. } catch (Exception e) { e.printStackTrace();}
  674. }
  675. });
  676. thread.setPriority(10);
  677. thread.start();
  678. thread.setPriority(10);
  679. }
  680.  
  681. @Override
  682. public void landingburn() {
  683. Thread landingBurn = new Thread(new Runnable() {
  684. @Override
  685. public void run() {
  686. try {
  687. // vessel = spaceCenter.getActiveVessel();
  688. restoreConnectionWithFirstStage(spaceCenter);
  689. System.out.println(impactPoint().getValue0() + " -- " + impactPoint().getValue1());
  690.  
  691. //vessel.getParts().setControlling(vessel.getParts().withTag("First Stage").get(0));
  692. spaceCenter.setActiveVessel(vessel);
  693. spaceCenter.setPhysicsWarpFactor(0);
  694. vessel.getControl().setRCS(true);
  695. boostbackburn();
  696. //entryburn();
  697. //gridFinsGuidance(vessel);
  698. System.out.println(stageName + " : " + "Landing Burn is on");
  699.  
  700.  
  701.  
  702.  
  703.  
  704. } catch (Exception e) {
  705. e.printStackTrace();
  706. }
  707. }
  708. });
  709. landingBurn.setPriority(10);
  710. landingBurn.start();
  711.  
  712. }
  713. boolean hover = true;
  714.  
  715. public void hover() {
  716. Thread thread = new Thread(new Runnable() {
  717. @Override
  718. public void run() {
  719. try {
  720. hover = landingComplexTarget.equals(LandingComplexEnum.Droneship);
  721. Stream<Double> verticalSpeed = connection.addStream(vessel.flight(vessel.getOrbit().getBody().getReferenceFrame()), "getVerticalSpeed");
  722. verticalSpeed.setRate(0f);
  723. while (hover) {
  724. long time = System.currentTimeMillis();
  725. double g = vessel.getOrbit().getBody().getSurfaceGravity();
  726. double maxAccel = vessel.getAvailableThrust() / vessel.getMass();
  727. double throttle = (g - verticalSpeed.get()) / maxAccel;
  728. vessel.getControl().setThrottle((float)throttle);
  729. System.out.println("Time Hover Throttle:" + (System.currentTimeMillis() - time));
  730. }
  731. } catch (Exception e) { e.printStackTrace();}
  732. }
  733. });
  734. thread.setPriority(10);
  735. thread.start();
  736. }
  737.  
  738. private void engineGuidance(SpaceCenter.Vessel vessel) {
  739.  
  740. Thread thread = new Thread(new Runnable() {
  741. @Override
  742. public void run() {
  743. try {
  744. Stream<Double> verticalSpeed = connection.addStream(vessel.flight(vessel.getOrbit().getBody().getReferenceFrame()), "getVerticalSpeed");
  745. Rachel.getInstance().getAnnaConnection().addEvent("Engine Guidance");
  746. verticalSpeed.setRate(0f);
  747.  
  748. SpaceCenter.ReferenceFrame refFrame = vessel.getSurfaceReferenceFrame();
  749. SpaceCenter.Flight flight = vessel.flight(refFrame);
  750.  
  751.  
  752. System.out.println(stageName + " : " + "Engine guidance");
  753. double Distance =0;
  754. double maxAngle = 90;
  755. double lastDist = 0;
  756. double lastHeading = flight.getHeading();
  757.  
  758. System.out.println("Engine time: " + (System.currentTimeMillis() - time));
  759.  
  760. moyenne.clear();
  761. vessel.getParts().withTag("sideEngine").get(0).getEngine().setActive(false);
  762. vessel.getParts().withTag("sideEngine").get(1).getEngine().setActive(false);
  763. hover();
  764. long time = System.currentTimeMillis();
  765.  
  766. while (true) {
  767. if(!landingComplexTarget.equals(LandingComplexEnum.Droneship)) break;
  768. Distance = distance(impactPoint().getValue0(), landingComplexTarget.getLat(), impactPoint().getValue1(), landingComplexTarget.getLong(), 0.0, 0.0);
  769. if(Distance > 10) maxAngle = 85;
  770. if(Distance < 10) maxAngle = 87;
  771. if(Distance < 1) maxAngle = 90;
  772.  
  773. if(Distance > 100) maxAngle = 70;
  774.  
  775.  
  776.  
  777. double lat1 = landingComplexTarget.getLat();
  778. double lng1 = landingComplexTarget.getLong();
  779.  
  780. double lat2 = impactPoint().getValue0();
  781. double lng2 = impactPoint().getValue1();
  782.  
  783.  
  784. double teta1 = toRadians(lat1);
  785. double teta2 = toRadians(lat2);
  786. double delta1 = toRadians(lat2-lng1);
  787. double delta2 = toRadians(lng2-lng1);
  788.  
  789. //==================Heading Formula Calculation================//
  790.  
  791. double y = Math.sin(delta2) * Math.cos(teta2);
  792. double x = Math.cos(teta1)*Math.sin(teta2) - Math.sin(teta1)*Math.cos(teta2)*Math.cos(delta2);
  793. double brng = Math.atan2(y, x);
  794. brng = toDegrees(brng);// radians to degrees
  795. brng = ( ((int)brng + 360) % 360 );
  796.  
  797. vessel.getAutoPilot().targetPitchAndHeading((float)maxAngle, (float)(brng-180));
  798. System.out.println("Hovering Distance " + Distance);
  799.  
  800.  
  801. DistanceBySec = Math.abs(distance(impactPoint().getValue0(), landingComplexTarget.getLat(), impactPoint().getValue1(), landingComplexTarget.getLong(), 0.0, 0.0) - Distance);
  802. moyenne.add(DistanceBySec);
  803. if(Distance < 10 && ((System.currentTimeMillis() - time) / 1000) > 10) {
  804. Thread.sleep(1200);
  805. if(Distance < 10) {
  806. System.out.println("Stop hovering ! " + ((System.currentTimeMillis() - time) / 1000));
  807. System.out.println("Stop hovering Distance " + Distance);
  808. hover = false;
  809. break;
  810. }
  811. System.out.println("False positive");
  812. }
  813. System.out.println("Time Hover Guidance:" + (System.currentTimeMillis() - time));
  814.  
  815. }
  816. Stream<Double> horizontalSpeed = connection.addStream(vessel.flight(vessel.getOrbit().getBody().getReferenceFrame()), "getHorizontalSpeed");
  817.  
  818. while(flight.getMeanAltitude() > 80 || verticalSpeed.get() < -0.01) {
  819. if(Distance > 10) maxAngle = 80;
  820. if(Distance < 10) maxAngle = 85;
  821. if(Distance < 1) maxAngle = 90;
  822.  
  823.  
  824. if(verticalSpeed.get() < 100 && vessel.getParts().withTag("sideEngine").get(0).getEngine().getActive()) {
  825. vessel.getParts().withTag("sideEngine").get(0).getEngine().setActive(false);
  826. vessel.getParts().withTag("sideEngine").get(1).getEngine().setActive(false);
  827. }
  828.  
  829. double max_decel = vessel.getAvailableThrust() / vessel.getMass() - vessel.getOrbit().getBody().getSurfaceGravity();
  830. double stop_dist = (Math.pow(verticalSpeed.get() + (horizontalSpeed.get() * -1), 2) / (2 * max_decel));
  831. vessel.getControl().setThrottle((float) (stop_dist / (flight.getSurfaceAltitude() - 27)));
  832.  
  833. if(!isLiftSuperiorToEngine(flight)) {
  834. if (flight.getMeanAltitude() > 100) {
  835. Distance = distance(0, 0, impactPoint().getValue1(), landingComplexTarget.getLong(), 0.0, 0.0);
  836. System.out.println("Distance: " + Distance);
  837.  
  838. // if(Distance > 100) maxAngle = 80;
  839. if (Distance > 10) maxAngle = 85;
  840. if (Distance < 10) maxAngle = 87;
  841. if (Distance < 1) maxAngle = 90;
  842.  
  843. if (Distance > 50) maxAngle = 80;
  844.  
  845. double lat1 = landingComplexTarget.getLat();
  846. double lng1 = landingComplexTarget.getLong();
  847.  
  848. double lat2 = impactPoint().getValue0();
  849. double lng2 = impactPoint().getValue1();
  850.  
  851.  
  852. double teta1 = toRadians(lat1);
  853. double teta2 = toRadians(lat2);
  854. double delta1 = toRadians(lat2 - lng1);
  855. double delta2 = toRadians(lng2 - lng1);
  856.  
  857. //==================Heading Formula Calculation================//
  858.  
  859. double y = Math.sin(delta2) * Math.cos(teta2);
  860. double x = Math.cos(teta1) * Math.sin(teta2) - Math.sin(teta1) * Math.cos(teta2) * Math.cos(delta2);
  861. double brng = Math.atan2(y, x);
  862. brng = toDegrees(brng);// radians to degrees
  863. brng = (((int) brng + 360) % 360);
  864.  
  865. vessel.getAutoPilot().targetPitchAndHeading((float) maxAngle, (float) (brng - 180));
  866. } else {
  867. refFrame = vessel.getSurfaceVelocityReferenceFrame();
  868. flight = vessel.flight(refFrame);
  869. vessel.getAutoPilot().setReferenceFrame(refFrame);
  870. vessel.getAutoPilot().setTargetDirection(new Triplet<>(0.0, -1.0, 0.0));
  871. }
  872. }
  873.  
  874. if(flight.getMeanAltitude() < 700 && !vessel.getControl().getLegs()) vessel.getControl().setLegs(true);
  875. }
  876. vessel.getControl().setThrottle(0f);
  877. vessel.getControl().setBrakes(false);
  878.  
  879. for (SpaceCenter.Engine engine : vessel.getParts().getEngines()) { engine.setActive(false); }
  880.  
  881. Rachel.getInstance().getAnnaConnection().addEvent("Landed");
  882. vessel.getAutoPilot().setReferenceFrame(vessel.getSurfaceReferenceFrame());
  883. Rachel.getInstance().sendAlert("Adhara has landed", StageEnum.STAGE_1);
  884. Rachel.getInstance().sendAlert("Precision:" + distance(flight.getLatitude(),landingComplexTarget.getLat(), flight.getLongitude(), landingComplexTarget.getLong(), 0.0, 0.0), StageEnum.STAGE_1);
  885.  
  886.  
  887. } catch (Exception e) { e.printStackTrace();}
  888. }
  889. });
  890. thread.setPriority(1);
  891. thread.start();
  892. }
  893.  
  894.  
  895.  
  896.  
  897.  
  898. long time = System.currentTimeMillis();
  899. double DistanceBySec = 0;
  900.  
  901.  
  902. ArrayList<Double> moyenne = new ArrayList<>();
  903. double DistanceCanLift = 0;
  904. double lastDist =0;
  905.  
  906. public void headingHandler() {
  907. Thread thread = new Thread(new Runnable() {
  908. @Override
  909. public void run() {
  910. try {
  911. double Distance =0;
  912. float maxAngle = 80;
  913. double lastPitch = DistanceBySec;
  914. DistanceCanLift = distance(impactPoint().getValue0(), landingComplexTarget.getLat(), impactPoint().getValue1(), landingComplexTarget.getLong(), 0.0, 0.0);
  915. SpaceCenter.ReferenceFrame refFrame = vessel.getSurfaceReferenceFrame();
  916. SpaceCenter.Flight flight = vessel.flight(refFrame);
  917. SpaceCenter.AutoPilot autoPilot = vessel.getAutoPilot();
  918. Rachel.getInstance().sendAlert("Gridfins guidance", StageEnum.STAGE_1);
  919. // vessel.getAutoPilot().setStoppingTime(new Triplet<>(0.2,0.2,0.2));
  920. //updateValues();
  921.  
  922. while (isLiftSuperiorToEngine(flight) || flight.getSurfaceAltitude() > 4000) {
  923.  
  924.  
  925. double lat1 = landingComplexTarget.getLat();
  926. double lng1 = landingComplexTarget.getLong();
  927. double lat2 = impactPoint().getValue0();
  928. double lng2 = impactPoint().getValue1();
  929.  
  930.  
  931. double teta1 = toRadians(lat1);
  932. double teta2 = toRadians(lat2);
  933. double delta1 = toRadians(lat2-lng1);
  934. double delta2 = toRadians(lng2-lng1);
  935.  
  936. //==================Heading Formula Calculation================//
  937.  
  938. double y = Math.sin(delta2) * Math.cos(teta2);
  939. double x = Math.cos(teta1)*Math.sin(teta2) - Math.sin(teta1)*Math.cos(teta2)*Math.cos(delta2);
  940. double brng = Math.atan2(y, x);
  941. brng = toDegrees(brng);// radians to degrees
  942. brng = ( ((int)brng + 360) % 360 );
  943.  
  944. vessel.getAutoPilot().setTargetHeading((float)brng);
  945. System.out.println("Plot new Heading: " +(float)brng);
  946.  
  947. }
  948. } catch (Exception e) { e.printStackTrace();}
  949. }
  950. });
  951. thread.start();
  952. thread.setPriority(10);
  953. }
  954.  
  955. public boolean isLiftSuperiorToEngine(SpaceCenter.Flight flight) throws Exception {
  956. if(hover) return false;
  957. return magnitude(flight.getLift()) > vessel.getThrust();
  958. }
  959.  
  960. public void pitchHandler() {
  961. Thread thread = new Thread(new Runnable() {
  962. @Override
  963. public void run() {
  964. try {
  965. vessel.getAutoPilot().engage();
  966. vessel.getAutoPilot().setStoppingTime(new Triplet<>(0.2,0.2,0.2));
  967. double Distance =0;
  968. float maxAngle = 80;
  969. double lastPitch = DistanceBySec;
  970. DistanceCanLift = distance(impactPoint().getValue0(), landingComplexTarget.getLat(), impactPoint().getValue1(), landingComplexTarget.getLong(), 0.0, 0.0);
  971. SpaceCenter.ReferenceFrame refFrame = vessel.getSurfaceReferenceFrame();
  972. SpaceCenter.Flight flight = vessel.flight(refFrame);
  973. SpaceCenter.AutoPilot autoPilot = vessel.getAutoPilot();
  974. Rachel.getInstance().sendAlert("Gridfins guidance", StageEnum.STAGE_1);
  975. // vessel.getAutoPilot().setStoppingTime(new Triplet<>(0.2,0.2,0.2));
  976. //updateValues();
  977.  
  978. Stream<Double> horizontalSpeed = connection.addStream(vessel.flight(vessel.getOrbit().getBody().getReferenceFrame()), "getHorizontalSpeed");
  979. Stream<Double> verticalSpeed = connection.addStream(vessel.flight(vessel.getOrbit().getBody().getReferenceFrame()), "getVerticalSpeed");
  980. while (isLiftSuperiorToEngine(flight) || flight.getSurfaceAltitude() > 4000) {
  981.  
  982. Distance = distance(impactPoint().getValue0(), landingComplexTarget.getLat(), impactPoint().getValue1(), landingComplexTarget.getLong(), 0.0, 0.0);
  983. lastDist = Distance;
  984. // System.out.println("--------------------------------------");
  985. if(flight.getMeanAltitude() < 10000 && !vessel.getControl().getBrakes()) {
  986. vessel.getControl().setBrakes(true);
  987. moyenne.clear();
  988. }
  989. DistanceBySec = Math.abs(Distance - distance(impactPoint().getValue0(), landingComplexTarget.getLat(), impactPoint().getValue1(), landingComplexTarget.getLong(), 0.0, 0.0));
  990. moyenne.add(DistanceBySec);
  991. double timeBeforeTouchdown = Math.abs((flight.getMeanAltitude() - 4000)/ verticalSpeed.get());
  992. int precision = 60;
  993. if(Distance > 5000) precision = 60;
  994. if(Distance < 2500) precision = 50;
  995. if(Distance < 700) precision = 30;
  996. if(Distance < 500) precision = 25;
  997. if(Distance < 100) precision = 15;
  998. if(Distance < 50) precision = 10;
  999. if(Distance < 10) precision = 0;
  1000.  
  1001.  
  1002. /*if(flight.getMeanAltitude() < 8000 && Distance > 40) precision += 5;
  1003. if(landingComplexTarget.equals(LandingComplexEnum.Droneship)) precision = precision +15;
  1004.  
  1005. if(Distance > DistanceCanLift) precision = precision - 10;*/
  1006. float pitch = (float) plotPitch(flight, timeBeforeTouchdown, precision, false);
  1007.  
  1008. System.out.println("Plot new Pitch: " +(float)pitch);
  1009. //if(vessel.getThrust() > 0) pitch -=5;
  1010. //if(Distance > lastDist) pitch -= 5;
  1011.  
  1012.  
  1013.  
  1014. vessel.getAutoPilot().setTargetPitch(pitch-1.5f);
  1015.  
  1016. }
  1017. } catch (Exception e) { e.printStackTrace();}
  1018. }
  1019. });
  1020. thread.start();
  1021. thread.setPriority(10);
  1022. }
  1023.  
  1024. public void gridFinsGuidance(SpaceCenter.Vessel vessel) throws Exception {
  1025. pitchHandler();
  1026. headingHandler();
  1027. SpaceCenter.ReferenceFrame refFrame = vessel.getSurfaceReferenceFrame();
  1028. SpaceCenter.Flight flight = vessel.flight(refFrame);
  1029. while (flight.getMeanAltitude() > 4000) {
  1030. System.out.print("");
  1031. }
  1032. engineGuidance(vessel);
  1033. }
  1034.  
  1035. public double average() {
  1036. int i = 0;
  1037. for (Double aDouble : moyenne) {
  1038. i += aDouble;
  1039. }
  1040. return i / moyenne.size();
  1041. }
  1042.  
  1043. double lastPitch = 10;
  1044. double precisionViolation = 0;
  1045. public double plotPitch(SpaceCenter.Flight flight, double timeBeforeTouchdown, int limit, boolean toward) throws Exception{
  1046. try {
  1047. long time = System.currentTimeMillis();
  1048. double Distance = distance(impactPoint().getValue0(), landingComplexTarget.getLat(), impactPoint().getValue1(), landingComplexTarget.getLong(), 0.0, 0.0);
  1049.  
  1050. Map<Double, Double> numbers = new LinkedHashMap<>();
  1051. double distancePerPitch = average() / vessel.getAutoPilot().getTargetPitch();
  1052. double min = Double.MAX_VALUE;
  1053. double closest = Distance;
  1054. Stream<Double> horizontalSpeed = connection.addStream(vessel.flight(vessel.getOrbit().getBody().getReferenceFrame()), "getHorizontalSpeed");
  1055. Stream<Double> verticalSpeed = connection.addStream(vessel.flight(vessel.getOrbit().getBody().getReferenceFrame()), "getVerticalSpeed");
  1056. float retrograde = (float) ((Math.atan(Math.abs(verticalSpeed.get()) / horizontalSpeed.get()) * 180) / Math.PI);
  1057. if(Distance < 5) return retrograde + 1.5f;
  1058. if(limit < 1) return retrograde + 1.5f;
  1059.  
  1060. /*if(Distance < 50) {
  1061.  
  1062.  
  1063. System.out.println(flight.getMeanAltitude());
  1064. vessel.getAutoPilot().setTargetPitch(retrograde);
  1065. }*/
  1066.  
  1067. for (double i = 0.0; i < (limit * 100) + precisionViolation; i += 0.01) {
  1068.  
  1069. double i2 = (distancePerPitch * i) * timeBeforeTouchdown;
  1070. numbers.put(i2, i / 10);
  1071.  
  1072.  
  1073. final double diff = Math.abs(i2 - Distance);
  1074.  
  1075. if (diff < min) {
  1076. min = diff;
  1077. closest = i2;
  1078. }
  1079. }
  1080.  
  1081.  
  1082. // System.out.println("Required: " + Distance);
  1083. // System.out.println("Found: " + closest(Distance, (new ArrayList<Double>(numbers.keySet()))) + " --- " + numbers.get(closest(Distance, (new ArrayList<Double>(numbers.keySet())))));
  1084. // System.out.println("Difference: " + Math.abs(closest(Distance, (new ArrayList<Double>(numbers.keySet()))) / Distance));
  1085. /* System.out.println("Plot time: " + (System.currentTimeMillis() - time) + "ms");
  1086. System.out.println("Precision: " + limit);
  1087. System.out.println("PrecisionV: " + precisionViolation);*/
  1088. if(Math.abs(closest - Distance) > 3 || Distance > lastPitch || DistanceBySec < 2) {
  1089. precisionViolation +=1;
  1090. if(precisionViolation > 50) precisionViolation = 30;
  1091. } else {
  1092. precisionViolation -=1;;
  1093. if(precisionViolation < 0) precisionViolation = 0;
  1094. }
  1095. DistanceCanLift = closest;
  1096. lastPitch = (toward ? 90 + (numbers.get(closest)) : 90 - (numbers.get(closest)));
  1097.  
  1098. return (toward ? 90 + (numbers.get(closest)) : 90 - (numbers.get(closest)));
  1099. } catch (Exception e) {
  1100. e.printStackTrace();
  1101. return lastPitch;
  1102. }
  1103. }
  1104.  
  1105. public double magnitude(Triplet<Double, Double, Double> values) {
  1106. return Math.sqrt(Math.pow(values.getValue0(),2.0) + Math.pow(values.getValue1(),2.0) + Math.pow(values.getValue1(),2.0));
  1107. }
  1108.  
  1109. public double closest(double of, ArrayList<Double> in) {
  1110. double min = Double.MAX_VALUE;
  1111. double closest = of;
  1112.  
  1113. for (double v : in) {
  1114. final double diff = Math.abs(v - of);
  1115.  
  1116. if (diff < min) {
  1117. min = diff;
  1118. closest = v;
  1119. }
  1120. }
  1121.  
  1122. return closest;
  1123. }
  1124.  
  1125. public double value(double Distance) {
  1126. /* if(Distance < 2000 && Distance > 1000) return 10;
  1127. if(Distance < 1000 && Distance > 500) return 5;
  1128. else if(Distance < 500 && Distance > 100) return 2;
  1129. else if(Distance < 100 && Distance > 50) return 1;
  1130. else return 0.5;*/
  1131. if(Distance > 100) return 1;
  1132. else return 0.5;
  1133. }
  1134.  
  1135. public double toRadians(double value1) {
  1136. return value1 * Math.PI / 180;
  1137. }
  1138.  
  1139. public double toDegrees(double value) {
  1140. return value * 180/Math.PI;
  1141. }
  1142.  
  1143.  
  1144.  
  1145.  
  1146.  
  1147. public double distance(double lat1, double lat2, double lon1,
  1148. double lon2, double el1, double el2) {
  1149.  
  1150. final int R = 6371; // Radius of the earth
  1151.  
  1152. double latDistance = Math.toRadians(lat2 - lat1);
  1153. double lonDistance = Math.toRadians(lon2 - lon1);
  1154. double a = Math.sin(latDistance / 2) * Math.sin(latDistance / 2)
  1155. + Math.cos(Math.toRadians(lat1)) * Math.cos(Math.toRadians(lat2))
  1156. * Math.sin(lonDistance / 2) * Math.sin(lonDistance / 2);
  1157. double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
  1158. double distance = R * c * 1000; // convert to meters
  1159.  
  1160. double height = el1 - el2;
  1161.  
  1162. distance = Math.pow(distance, 2) + Math.pow(height, 2);
  1163.  
  1164. return Math.sqrt(distance);
  1165. }
  1166.  
  1167.  
  1168. /**
  1169. * Get first stage impact point
  1170. * @return Latitude / Longitude values.
  1171. */
  1172.  
  1173. public Pair<Double, Double> impactPoint() {
  1174. try {
  1175. //System.out.println(Trajectories.newInstance(connection).impactPos().getValue0() + Trajectories.newInstance(connection).impactPos().getValue1());
  1176. return PR.newInstance(connection).getImpactPos(vessel);
  1177. //return Trajectories.newInstance(connection).impactPos();
  1178. } catch (Exception e) {
  1179. }
  1180.  
  1181. return new Pair<>(0D,0D);
  1182. }
  1183.  
  1184. public double metersBtwPoints(double lat1, double lon1, double lat2, double lon2) {
  1185. double R = 6371; // Radius of earth in KM
  1186. double dLat = lat2 * Math.PI / 180 - lat1 * Math.PI / 180;
  1187. double dLon = lon2 * Math.PI / 180 - lon1 * Math.PI / 180;
  1188. double a = Math.sin(dLat/2) * Math.sin(dLat/2) +
  1189. Math.cos(lat1 * Math.PI / 180) * Math.cos(lat2 * Math.PI / 180) *
  1190. Math.sin(dLon/2) * Math.sin(dLon/2);
  1191. double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
  1192. double d = R * c;
  1193. return d * 1000; // meters
  1194. }
  1195.  
  1196. public void restoreConnectionWithFirstStage(SpaceCenter spaceCenter) {
  1197. try {
  1198. System.out.println(stageName + " : " + "Recover network...");
  1199. for (SpaceCenter.Vessel spaceCenterVessel : spaceCenter.getVessels()) {
  1200.  
  1201. if (!(spaceCenterVessel.getMET() > 500)) {
  1202. if(spaceCenterVessel.getParts().withName("proceduralAvionics").size() > 0) {
  1203. System.out.println(stageName + " : " + spaceCenterVessel.getParts().withName("proceduralAvionics").get(0).getTag().equals(stageName));
  1204. System.out.println(stageName + " : " + spaceCenterVessel.getParts().withName("proceduralAvionics").get(0).getTag().contains(stageName));
  1205. System.out.println(stageName + " : " + spaceCenterVessel.getParts().withName("proceduralAvionics").get(0).getTag() + " " + stageName);
  1206. if (spaceCenterVessel.getParts().withName("proceduralAvionics").get(0).getTag().equals(stageName)) {
  1207. vessel = spaceCenterVessel;
  1208. System.out.println(stageName + " : " + "New Vessel : " + this.vessel.getName());
  1209. spaceCenterVessel.setName(stageName);
  1210. break;
  1211. }
  1212. }
  1213. }
  1214. }
  1215.  
  1216. if(vessel == null) restoreConnectionWithFirstStage(spaceCenter);
  1217. } catch (Exception e) {
  1218. e.printStackTrace();
  1219. }
  1220. }
  1221.  
  1222.  
  1223. public LandingComplexEnum getLandingComplexTarget() {
  1224. return landingComplexTarget;
  1225. }
  1226.  
  1227. //Should it land? Or should it splashdown ?
  1228. public boolean isShoulditland() {
  1229. return Shoulditland;
  1230. }
  1231.  
  1232.  
  1233. @Override
  1234. public void tick() {
  1235.  
  1236. }
  1237.  
  1238.  
  1239.  
  1240. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement