Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package land.neutrino.rachel.rocket.adhara;
- import com.google.gson.JsonObject;
- import com.google.gson.JsonPrimitive;
- import krpc.client.Connection;
- import krpc.client.RPCException;
- import krpc.client.Stream;
- import krpc.client.services.MechJeb;
- import krpc.client.services.SpaceCenter;
- import land.neutrino.rachel.Rachel;
- import land.neutrino.rachel.rocket.FirstStage;
- import land.neutrino.rachel.rocket.RocketBody;
- import land.neutrino.rachel.rocket.neutrino.FirstStageDatas;
- import land.neutrino.rachel.tracking.RequestType;
- import land.neutrino.rachel.tracking.StageEnum;
- import land.neutrino.rachel.utils.*;
- import org.javatuples.Pair;
- import org.javatuples.Triplet;
- import javax.swing.*;
- import java.text.DecimalFormat;
- public class Booster extends FirstStage {
- protected boolean Shoulditland;
- protected SpaceCenter spaceCenter;
- protected SpaceCenter.Vessel vessel;
- protected LandingComplexEnum landingComplexTarget;
- public Booster(SpaceCenter.Vessel vessel, SpaceCenter spaceCenter, String stageName, Connection connection, RocketBody rocketBody,LandingComplexEnum landingComplexEnum, boolean Shoulditland) {
- super(rocketBody, stageName, connection);
- this.Shoulditland = Shoulditland;
- firstStageDatas = new FirstStageDatas();
- this.stageName = stageName;
- this.Shoulditland = Shoulditland;
- this.spaceCenter = spaceCenter;
- this.landingComplexTarget = landingComplexEnum;
- downrange = distance(landingComplexTarget.getLat(), 28.5289202545645, landingComplexTarget.getLong(), -80.52526259414269, 0.0, 0.0);
- }
- double downrange = 0;
- @Override
- public void startup() {
- try {
- vessel.getControl().setThrottle(0f);
- //Throttle: Adhara Slow: 0.35f | Other's adhara: 1f
- /*for (int i = 10; i < 14; i++) {
- vessel.getParts().getEngines().get(i).setActive(true);
- }*/
- System.out.println(stageName + " : " + "\n 0:" + impactPoint().getValue0() + "\n 1:" + impactPoint().getValue1() );
- for (SpaceCenter.Engine engine : vessel.getParts().getEngines()) {
- if(engine.getPart().getName().contains("cryoengine-375") && !engine.getPart().getTag().contains("secondEngine")) engine.setActive(true);
- }
- vessel.getControl().setThrottle(1f);
- Rachel.getInstance().sendAlert("First Stage ignition", StageEnum.STAGE_1);
- vessel.getControl().setSAS(true);
- vessel.getAutoPilot().engage();
- vessel.getAutoPilot().setTargetRoll(0f);
- vessel.getAutoPilot().targetPitchAndHeading(90, Rachel.getInstance().getFlightInfo().getInclination());
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- @Override
- public void meco() {
- try {
- for (SpaceCenter.Engine engine : vessel.getParts().getEngines()) {
- engine.setActive(false);
- }
- for (SpaceCenter.Engine engine : vessel.getParts().getEngines()) {
- engine.setThrustLimit(1f);
- }
- Rachel.getInstance().sendAlert("First Stage MECO", StageEnum.STAGE_1);
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- @Override
- public void boostbackburn() {
- new Thread(new Runnable() {
- @Override
- public void run() {
- try {
- // if(!landingComplexTarget.equals(LandingComplexEnum.Droneship)) {
- vessel.getControl().setThrottle(0f);
- vessel.getControl().toggleActionGroup(4);
- //vessel.getControl().activateNextStage();
- vessel.getAutoPilot().engage();
- //-10
- int pitch = 0;
- if((rocketBody.equals(RocketBody.SIDE_BOOSTER))) {
- pitch = 2;
- } else if(rocketBody.equals(RocketBody.CENTER_CORE)) {
- pitch = 1;
- } else if (landingComplexTarget.equals(LandingComplexEnum.Droneship)) {
- pitch = 10;
- } else {
- pitch = 10;
- }
- vessel.getAutoPilot().targetPitchAndHeading( pitch, 273);
- System.out.println(stageName + " : " + stageName + " : " + "Flip");
- for (SpaceCenter.RCS rcs : vessel.getParts().getRCS()) {
- rcs.setEnabled(true);
- }
- vessel.getControl().setRCS(true);
- vessel.getParts().withTag("centerEngine").get(0).getEngine().setActive(true);
- vessel.getControl().setThrottle(1f);
- SpaceCenter.ReferenceFrame refFrame = vessel.getSurfaceReferenceFrame();
- SpaceCenter.Flight flight = vessel.flight(refFrame);
- vessel.getParts().withTag("centerEngine").get(0).getEngine().setActive(true);
- while (Math.abs(flight.getHeading() - 273) > 5) {
- System.out.println(stageName + " : Pitch " + flight.getPitch() + " Heading " + flight.getHeading());
- }
- vessel.getParts().withTag("centerEngine").get(0).getEngine().setActive(true);
- for (SpaceCenter.Part engine : vessel.getParts().withTag("sideEngine")) {
- engine.getEngine().setActive(true);
- }
- System.out.println(stageName + " : " + "Engine startup");
- Rachel.getInstance().getAnnaConnection().addEvent("Boostback Burn");
- vessel.getControl().setThrottle(1f);
- vessel.getControl().setRCS(false);
- //double maxLatDiff = (rocketBody.equals(RocketBody.SIDE_BOOSTER) ? 0.1 : 0.05);
- Pair<Double, Double> impact = impactPoint();
- while ((impact.getValue1() - 0.1) > landingComplexTarget.getLong()) {
- impact = impactPoint();
- /*int correction = 0;
- if (impact.getValue0() - landingComplexTarget.getLat() > 0.01) {
- if(metersBtwPoints(impact.getValue0(),0,landingComplexTarget.getLat(),0) > 20000) {
- correction = 225;
- } else if(metersBtwPoints(impact.getValue0(),0,landingComplexTarget.getLat(),0) > 10000) {
- correction = 245;
- } else {
- correction = 265;
- }
- vessel.getAutoPilot().setTargetHeading(correction);
- } else if (impact.getValue0() - landingComplexTarget.getLat() < 0.01) {
- if(metersBtwPoints(impact.getValue0(),0,landingComplexTarget.getLat(),0) > 20000) {
- correction = 305;
- } else if(metersBtwPoints(impact.getValue0(),0,landingComplexTarget.getLat(),0) > 10000) {
- correction = 285;
- } else {
- correction = 275;
- }
- vessel.getAutoPilot().setTargetHeading(correction);
- }*/
- /*if(vessel.getOrbit().getApoapsisAltitude() > 205000) pitch = 0;
- if(vessel.getOrbit().getApoapsisAltitude() < 200000) pitch = 5;
- else pitch = 0;
- vessel.getAutoPilot().setTargetPitch(pitch);*/
- double lat1 = landingComplexTarget.getLat();
- double lng1 = landingComplexTarget.getLong();
- double lat2 = impact.getValue0();
- double lng2 = impact.getValue1();
- double teta1 = toRadians(lat1);
- double teta2 = toRadians(lat2);
- double delta1 = toRadians(lat2-lng1);
- double delta2 = toRadians(lng2-lng1);
- //==================Heading Formula Calculation================//
- double y = Math.sin(delta2) * Math.cos(teta2);
- double x = Math.cos(teta1)*Math.sin(teta2) - Math.sin(teta1)*Math.cos(teta2)*Math.cos(delta2);
- double brng = Math.atan2(y, x);
- brng = toDegrees(brng);// radians to degrees
- brng = ( ((int)brng + 360) % 360 );
- System.out.println("Heading: "+ (brng - 180) + " - " + flight.getHeading());
- vessel.getAutoPilot().setTargetHeading((float)(brng-180));
- }
- for (SpaceCenter.Part engine : vessel.getParts().withTag("sideEngine")) {
- engine.getEngine().setActive(false);
- }
- while ((impact.getValue1()) > landingComplexTarget.getLong()) {
- impact = impactPoint();
- /*int correction = 0;
- if (impact.getValue0() - landingComplexTarget.getLat() > 0.01) {
- if(metersBtwPoints(impact.getValue0(),0,landingComplexTarget.getLat(),0) > 20000) {
- correction = 225;
- } else if(metersBtwPoints(impact.getValue0(),0,landingComplexTarget.getLat(),0) > 10000) {
- correction = 245;
- } else {
- correction = 265;
- }
- vessel.getAutoPilot().setTargetHeading(correction);
- } else if (impact.getValue0() - landingComplexTarget.getLat() < 0.01) {
- if(metersBtwPoints(impact.getValue0(),0,landingComplexTarget.getLat(),0) > 20000) {
- correction = 305;
- } else if(metersBtwPoints(impact.getValue0(),0,landingComplexTarget.getLat(),0) > 10000) {
- correction = 285;
- } else {
- correction = 275;
- }
- vessel.getAutoPilot().setTargetHeading(correction);
- }*/
- double lat1 = landingComplexTarget.getLat();
- double lng1 = landingComplexTarget.getLong();
- double lat2 = impact.getValue0();
- double lng2 = impact.getValue1();
- double teta1 = toRadians(lat1);
- double teta2 = toRadians(lat2);
- double delta1 = toRadians(lat2-lng1);
- double delta2 = toRadians(lng2-lng1);
- //==================Heading Formula Calculation================//
- double y = Math.sin(delta2) * Math.cos(teta2);
- double x = Math.cos(teta1)*Math.sin(teta2) - Math.sin(teta1)*Math.cos(teta2)*Math.cos(delta2);
- double brng = Math.atan2(y, x);
- brng = toDegrees(brng);// radians to degrees
- brng = ( ((int)brng + 360) % 360 );
- System.out.println("Heading: "+ (brng - 180) + " - " + flight.getHeading());
- vessel.getAutoPilot().setTargetHeading((float)(brng-180));
- }
- System.out.println(stageName + " : " + "Engine shutdown");
- vessel.getControl().setThrottle(0f);
- // }
- vessel.getAutoPilot().engage();
- vessel.getControl().setRCS(true);
- vessel.getAutoPilot().targetPitchAndHeading(90,0);
- for (SpaceCenter.ControlSurface controlSurface : vessel.getParts().getControlSurfaces()) {
- controlSurface.setPitchEnabled(true);
- controlSurface.setYawEnabled(true);
- }
- vessel.getControl().setBrakes(true);
- entryburn();
- //gridFinsGuidance(vessel);
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- }).start();
- }
- @Override
- public void entryburn() {
- Thread thread = new Thread(new Runnable() {
- @Override
- public void run() {
- try {
- vessel.getAutoPilot().engage();
- vessel.getControl().setRCS(true);
- SpaceCenter.Resources stageResources = vessel.getResources();
- Stream<Float> hydrogenResource = connection.addStream(stageResources, "amount", "LqdMethane");
- System.out.println(stageName + " : " + "Fuel: " + (hydrogenResource.get() / 1030214 * 100));
- SpaceCenter.ReferenceFrame refFrame = vessel.getSurfaceReferenceFrame();
- SpaceCenter.Flight flight = vessel.flight(refFrame);
- for (SpaceCenter.RCS rc : vessel.getParts().getRCS()) {
- rc.setEnabled(true);
- }
- Stream<Double> verticalSpeed = connection.addStream(vessel.flight(vessel.getOrbit().getBody().getReferenceFrame()), "getVerticalSpeed");
- while(verticalSpeed.get() > -0.01) { Thread.sleep(1000); }
- vessel.getAutoPilot().targetPitchAndHeading(75,(landingComplexTarget == LandingComplexEnum.Droneship ? 270 : 90));
- while (flight.getSurfaceAltitude() > (rocketBody.equals(RocketBody.SIDE_BOOSTER) ? 92000 : (landingComplexTarget.equals(LandingComplexEnum.Droneship) ? (downrange > 800000 ? 90000:70000) : 70000))) { //65 000
- Thread.sleep(1000);
- }
- spaceCenter.setPhysicsWarpFactor(0);
- vessel.getControl().setSAS(false);
- vessel.getAutoPilot().engage();
- Rachel.getInstance().sendAlert("Entry burn start", StageEnum.STAGE_1);
- vessel.getControl().setRCS(true);
- vessel.getParts().withTag("centerEngine").get(0).getEngine().setActive(true);
- Rachel.getInstance().getAnnaConnection().addEvent("Entry Burn");
- vessel.getControl().setThrottle(1f);
- for (SpaceCenter.Part sideEngine : vessel.getParts().withTag("sideEngine")) {
- sideEngine.getEngine().setActive(true);
- sideEngine.getEngine().setThrustLimit(0.75f);
- //sideEngine.getEngine().setThrustLimit(0.885f);
- }
- Stream<Double> horizontalSpeed = connection.addStream(vessel.flight(vessel.getOrbit().getBody().getReferenceFrame()), "getHorizontalSpeed");
- Stream<Double> speed = connection.addStream(vessel.flight(vessel.getOrbit().getBody().getReferenceFrame()), "getSpeed");
- long time = System.currentTimeMillis();
- double Distance = distance(impactPoint().getValue0(), landingComplexTarget.getLat(),impactPoint().getValue1(), landingComplexTarget.getLong(),0.0,0.0);
- boolean end = false;
- /*vessel.getAutoPilot().disengage();
- vessel.getControl().setSASMode(SpaceCenter.SASMode.RETROGRADE);
- vessel.getControl().setSAS(true);
- vessel.getControl().setSASMode(SpaceCenter.SASMode.RETROGRADE);*/
- System.out.println(downrange + "km");
- float maxAngle = (rocketBody.equals(RocketBody.CENTER_CORE) ? 10 : (downrange > 600000 ? 50:70));
- double lastDist;
- float retrograde = (float)((Math.atan(Math.abs(verticalSpeed.get()) / horizontalSpeed.get()) * 180) / Math.PI) + 10;
- System.out.println("Retrograde: " +retrograde);
- double offset = 0.025 * (int)(downrange/100000);
- if(offset < 0.025) offset = 0.025;
- float heading = (landingComplexTarget == LandingComplexEnum.Droneship ? 272 : 90);
- if(landingComplexTarget.equals(LandingComplexEnum.Droneship))
- retrograde = retrograde + (float)(7*offset);
- System.out.println((landingComplexTarget.getLat() + ", " + (landingComplexTarget.getLong() - (flight.getSurfaceAltitude() > 15000 ? offset : 0))));
- horizontalSpeed = connection.addStream(vessel.flight(vessel.getOrbit().getBody().getReferenceFrame()), "getHorizontalSpeed");
- verticalSpeed = connection.addStream(vessel.flight(vessel.getOrbit().getBody().getReferenceFrame()), "getVerticalSpeed");
- while (verticalSpeed.get() < -400 /*|| horizontalSpeed.get() > 1800*/) {
- if(landingComplexTarget.equals(LandingComplexEnum.Droneship))
- Distance = distance(0, 0, impactPoint().getValue1(), landingComplexTarget.getLong() + (flight.getSurfaceAltitude() > 15000 ? offset : 0), 0.0, 0.0);
- else
- Distance = distance(0, 0, impactPoint().getValue1(), landingComplexTarget.getLong() - (flight.getSurfaceAltitude() > 15000 ? offset : 0), 0.0, 0.0);
- lastDist = Distance;
- if(!landingComplexTarget.equals(LandingComplexEnum.Droneship)) {
- retrograde = (float) ((Math.atan(Math.abs(verticalSpeed.get()) / horizontalSpeed.get()) * 180) / Math.PI);
- if (Distance > 2000) {
- maxAngle = (landingComplexTarget.equals(LandingComplexEnum.Droneship) ? 5 : 15);
- } else if (Distance < 2000 && Distance > 500) {
- maxAngle = (landingComplexTarget.equals(LandingComplexEnum.Droneship) ? 5 : 10);
- } else if (Distance < 500) {
- maxAngle = 5;
- }
- System.out.println("Max Angle: " + maxAngle);
- if (impactPoint().getValue1() - (landingComplexTarget.getLong() - (flight.getSurfaceAltitude() > 15000 ? offset : 0)) > 0.001) {
- System.out.println("Vandenberg");
- vessel.getAutoPilot().targetPitchAndHeading(retrograde + maxAngle, heading);
- } else if (impactPoint().getValue1() - (landingComplexTarget.getLong() - (flight.getSurfaceAltitude() > 15000 ? offset : 0)) < 0.001) {
- vessel.getAutoPilot().targetPitchAndHeading(retrograde - maxAngle, heading);
- System.out.println("France");
- }
- } else {
- if(Distance > lastDist) retrograde = retrograde - 0.1f;
- if(Distance < lastDist) retrograde = retrograde + 0.1f;
- vessel.getAutoPilot().targetPitchAndHeading(retrograde, heading);
- }
- }
- for (SpaceCenter.Part sideEngine : vessel.getParts().withTag("sideEngine")) {
- sideEngine.getEngine().setActive(true);
- sideEngine.getEngine().setThrustLimit(100f);
- }
- //vessel.getControl().setSAS(true);
- //vessel.getControl().setSASMode(SpaceCenter.SASMode.RETROGRADE);
- vessel.getControl().setThrottle(0f);
- System.out.println(stageName + " : " + "End of entry burn engine guidance");
- System.out.println(stageName + " : " + "vSpeed: " + verticalSpeed.get());
- for (SpaceCenter.Part sideEngine : vessel.getParts().withTag("sideEngine"))
- sideEngine.getEngine().setThrustLimit(0.30f);
- System.out.println(stageName + " : " + "Entry burn shutdown, Time: " + ((System.currentTimeMillis() - time) / 1000) + " seconds");
- //gridFinsGuidance(vessel);
- System.out.println(stageName + " : " + "Fuel: " + (hydrogenResource.get() / 1030214 * 100));
- gridFinsGuidance(vessel);
- } catch (Exception e) { e.printStackTrace();}
- }
- });
- thread.setPriority(10);
- thread.start();
- thread.setPriority(10);
- }
- @Override
- public void landingburn() {
- Thread landingBurn = new Thread(new Runnable() {
- @Override
- public void run() {
- try {
- vessel = spaceCenter.getActiveVessel();
- restoreConnectionWithFirstStage(spaceCenter);
- vessel.getParts().setControlling(vessel.getParts().withName("proceduralAvionics").get(0));
- spaceCenter.setActiveVessel(vessel);
- spaceCenter.setPhysicsWarpFactor(0);
- vessel.getControl().setRCS(true);
- boostbackburn();
- Rachel.getInstance().getAnnaConnection().updateVessel();
- System.out.println(stageName + " : " + "Landing Burn is on");
- Stream<Double> verticalSpeed = connection.addStream(vessel.flight(vessel.getOrbit().getBody().getReferenceFrame()), "getVerticalSpeed");
- while(verticalSpeed.get() > -0.01) { Thread.sleep(1000); }
- //entryburn();
- SpaceCenter.ReferenceFrame refFrame = vessel.getSurfaceReferenceFrame();
- SpaceCenter.Flight flight = vessel.flight(refFrame);
- //gridFinsGuidance(vessel);
- while (flight.getSurfaceAltitude() > 2000) { System.out.print(""); }
- Stream<Float> mass = connection.addStream(vessel, "getMass");
- SpaceCenter.Resources stageResources = vessel.getResources();
- Stream<Float> hydrogenResource = connection.addStream(stageResources, "amount", "LqdHydrogen");
- boolean engineGuidance = false;
- Rachel.getInstance().getAnnaConnection().addEvent("Landing Burn");
- while(flight.getSurfaceAltitude() > (landingComplexTarget == LandingComplexEnum.Droneship ? 80 : 52) || verticalSpeed.get() < -0.01) {
- /* System.out.println("-----------------");
- System.out.println("Distance Total:" + distance(impactPoint().getValue0(), landingComplexTarget.getLat(),impactPoint().getValue1(), landingComplexTarget.getLong(),0.0,0.0));
- System.out.println("Distance Gauche:" + distance(impactPoint().getValue0(), landingComplexTarget.getLat(),0, 0,0.0,0.0));
- System.out.println("Distance Bas:" + distance(0, 0,impactPoint().getValue1(), landingComplexTarget.getLong(),0.0,0.0));
- System.out.println("-----------------");*/
- double max_decel = vessel.getAvailableThrust() / mass.get() - vessel.getOrbit().getBody().getSurfaceGravity();
- double stop_dist = (Math.pow(verticalSpeed.get(),2) / (2 * max_decel));
- vessel.getControl().setThrottle((float)(stop_dist / (flight.getSurfaceAltitude() - 27)));
- if(flight.getSurfaceAltitude() < 700 && !vessel.getControl().getLegs()) {
- vessel.getControl().setLegs(true);
- }
- }
- //System.out.println("Distance: " + distance(impactPoint().getValue0(), landingComplexTarget.getLat(), impactPoint().getValue1(), landingComplexTarget.getLong(), 0.0, 0.0));
- vessel.getControl().setThrottle(0f);
- for (SpaceCenter.Engine engine : vessel.getParts().getEngines()) { engine.setActive(false); }
- for (String s : vessel.getParts().getLegs().get(0).getPart().getModules().get(1).getFields().keySet()) {
- System.out.println(s);
- }
- Rachel.getInstance().getAnnaConnection().addEvent("Landed");
- Rachel.getInstance().sendAlert("Adhara has landed", StageEnum.STAGE_1);
- Rachel.getInstance().sendAlert("Precision:" + distance(flight.getLatitude(),landingComplexTarget.getLat(), flight.getLongitude(), landingComplexTarget.getLong(), 0.0, 0.0), StageEnum.STAGE_1);
- Rachel.getInstance().sendAlert("Fuel remain: " +(hydrogenResource.get() / 887410 * 100) + "%", StageEnum.STAGE_1);
- Thread.sleep(5000);
- Rachel.getInstance().sendAlert("Securing Booster..", StageEnum.STAGE_1);
- vessel.getAutoPilot().disengage();
- Rachel.getInstance().sendAlert("AutoPilot disengage..", StageEnum.STAGE_1);
- vessel.getControl().setRCS(false);
- Rachel.getInstance().sendAlert("Legs are now hard", StageEnum.STAGE_1);
- for (SpaceCenter.Leg leg : vessel.getParts().getLegs()) {
- if(leg.getPart().getModules().size() > 0)
- leg.getPart().getModules().get(1).setFieldFloat("springTweakable",0500000007F);
- }
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- });
- landingBurn.setPriority(10);
- landingBurn.start();
- }
- private void engineGuidance(SpaceCenter.Vessel vessel) {
- Thread thread = new Thread(new Runnable() {
- @Override
- public void run() {
- try {
- Rachel.getInstance().getAnnaConnection().addEvent("Engine Guidance");
- SpaceCenter.ReferenceFrame refFrame = vessel.getSurfaceReferenceFrame();
- SpaceCenter.Flight flight = vessel.flight(refFrame);
- System.out.println(stageName + " : " + "Engine guidance");
- double Distance =0;
- double maxAngle = 90;
- double lastDist = 0;
- double lastHeading = flight.getHeading();
- System.out.println("Engine time: " + (System.currentTimeMillis() - time));
- while (vessel.getControl().getThrottle() < 0.15) {
- Stream<Double> horizontalSpeed = connection.addStream(vessel.flight(vessel.getOrbit().getBody().getReferenceFrame()), "getHorizontalSpeed");
- Stream<Double> verticalSpeed = connection.addStream(vessel.flight(vessel.getOrbit().getBody().getReferenceFrame()), "getVerticalSpeed");
- float retrograde = (float) ((Math.atan(Math.abs(verticalSpeed.get()) / horizontalSpeed.get()) * 180) / Math.PI);
- System.out.println(flight.getMeanAltitude());
- vessel.getAutoPilot().setTargetPitch(retrograde);
- }
- while (flight.getSurfaceAltitude() > 1000 /*&& (!landingComplexTarget.equals(LandingComplexEnum.Droneship) || downrange > 600000)*/) {
- long time = System.currentTimeMillis();
- Distance = distance(impactPoint().getValue0(), landingComplexTarget.getLat(), impactPoint().getValue1(), landingComplexTarget.getLong(), 0.0, 0.0);
- lastDist = Distance;
- //} else if ((distance(impactPoint().getValue0(), landingComplexTarget.getLat(), impactPoint().getValue1(), landingComplexTarget.getLong(), 0, 0) < 1000 && Distance > 100)) {
- if(Distance < 150) {
- maxAngle = 80;
- } else if(Distance < 20) {
- maxAngle = 86;
- } else if (Distance < 10) {
- maxAngle = 87.5;
- } else if (Distance < 4) {
- maxAngle = 89.5;
- }
- System.out.println("---");
- System.out.println(Distance);
- System.out.println(maxAngle);
- double lat1 = landingComplexTarget.getLat();
- double lng1 = landingComplexTarget.getLong();
- double lat2 = impactPoint().getValue0();
- double lng2 = impactPoint().getValue1();
- double teta1 = toRadians(lat1);
- double teta2 = toRadians(lat2);
- double delta1 = toRadians(lat2-lng1);
- double delta2 = toRadians(lng2-lng1);
- //==================Heading Formula Calculation================//
- double y = Math.sin(delta2) * Math.cos(teta2);
- double x = Math.cos(teta1)*Math.sin(teta2) - Math.sin(teta1)*Math.cos(teta2)*Math.cos(delta2);
- double brng = Math.atan2(y, x);
- brng = toDegrees(brng);// radians to degrees
- brng = ( ((int)brng + 360) % 360 );
- System.out.println("Heading: "+ (brng - 180) + " - " + flight.getHeading());
- vessel.getAutoPilot().targetPitchAndHeading((float)maxAngle, (float)(brng-180));
- }
- System.out.println(stageName + " : " + "End of engine guidance");
- while (vessel.getThrust() >0) {
- Stream<Double> horizontalSpeed = connection.addStream(vessel.flight(vessel.getOrbit().getBody().getReferenceFrame()), "getHorizontalSpeed");
- Stream<Double> verticalSpeed = connection.addStream(vessel.flight(vessel.getOrbit().getBody().getReferenceFrame()), "getVerticalSpeed");
- float retrograde = (float) ((Math.atan(Math.abs(verticalSpeed.get()) / horizontalSpeed.get()) * 180) / Math.PI);
- System.out.println(flight.getMeanAltitude());
- vessel.getAutoPilot().setTargetPitch(flight.getMeanAltitude() > 300 ? retrograde : 90f);
- }
- System.out.println(stageName + " : " + "End of retrograde guidance");
- } catch (Exception e) { e.printStackTrace();}
- }
- });
- thread.setPriority(1);
- thread.start();
- }
- long time = System.currentTimeMillis();
- public void gridFinsGuidance(SpaceCenter.Vessel vessel) {
- Thread thread = new Thread(new Runnable() {
- @Override
- public void run() {
- try {
- double Distance =0;
- double lastDist =0;
- float maxAngle = 80;
- SpaceCenter.ReferenceFrame refFrame = vessel.getSurfaceReferenceFrame();
- SpaceCenter.Flight flight = vessel.flight(refFrame);
- SpaceCenter.AutoPilot autoPilot = vessel.getAutoPilot();
- Rachel.getInstance().sendAlert("Gridfins guidance", StageEnum.STAGE_1);
- // vessel.getAutoPilot().setStoppingTime(new Triplet<>(0.2,0.2,0.2));
- maxAngle = 0;
- double coef = 0.1;
- while (vessel.getThrust() < 1) {
- double offset = 0.025 * (int)(downrange/100000);
- if(offset < 0.025) offset = 0.025;
- Distance = distance(impactPoint().getValue0(), landingComplexTarget.getLat(), impactPoint().getValue1(), landingComplexTarget.getLong() + (flight.getMeanAltitude() > 5000 ? 0.002 : 0), 0.0, 0.0)/*+ (0.5*downrange)*/;
- /*if(landingComplexTarget.equals(LandingComplexEnum.Droneship))
- Distance = distance(0,0, impactPoint().getValue1(), landingComplexTarget.getLong(), 0.0, 0.0);
- else
- Distance = distance(0,0, impactPoint().getValue1(), landingComplexTarget.getLong() - (flight.getSurfaceAltitude() > 15000 ? offset : 0), 0.0, 0.0); lastDist = Distance;
- System.out.println("Distance: " + Distance);*/
- if(Distance < 35000 && Distance > 5000) {
- maxAngle = 30;
- } else if (Distance < 5000 && Distance > 2000) {
- maxAngle = 50;
- } else if(Distance < 2000 && Distance > 1000) {
- maxAngle = 50;
- } else if(Distance < 1000 && Distance > 500) {
- maxAngle = 50;
- } else if(Distance < 500 && Distance > 250) {
- maxAngle = 50;
- } else if (Distance < 250 && Distance > 100) {
- maxAngle = 65;
- } else if(Distance < 100 && Distance > 50) {
- //} else if ((distance(impactPoint().getValue0(), landingComplexTarget.getLat(), impactPoint().getValue1(), landingComplexTarget.getLong(), 0, 0) < 1000 && Distance > 100)) {
- maxAngle = 70;
- } else if(Distance < 50 && Distance > 20) {
- //} else if ((distance(impactPoint().getValue0(), landingComplexTarget.getLat(), impactPoint().getValue1(), landingComplexTarget.getLong(), 0, 0) < 1000 && Distance > 100)) {
- maxAngle = 75;
- } else if(Distance < 20 && Distance > 1) {
- //} else if ((distance(impactPoint().getValue0(), landingComplexTarget.getLat(), impactPoint().getValue1(), landingComplexTarget.getLong(), 0, 0) < 1000 && Distance > 100)) {
- maxAngle = 85;
- } else if(Distance < 10) {
- Stream<Double> horizontalSpeed = connection.addStream(vessel.flight(vessel.getOrbit().getBody().getReferenceFrame()), "getHorizontalSpeed");
- Stream<Double> verticalSpeed = connection.addStream(vessel.flight(vessel.getOrbit().getBody().getReferenceFrame()), "getVerticalSpeed");
- maxAngle = (float)((Math.atan(Math.abs(verticalSpeed.get()) / horizontalSpeed.get()) * 180) / Math.PI);
- System.out.println("Retrograde");
- }
- /*if(maxAngle < 75 && flight.getSurfaceAltitude() < 20000) {
- System.out.println("Remettre +5");
- maxAngle = 80;
- }*/
- //System.out.println("Pitch:" + maxAngle);
- // System.out.println(impactPoint().getValue0() + " " + impactPoint().getValue1());
- Pair<Double, Double> impact = impactPoint();
- /*if(impact.getValue1() - landingComplexTarget.getLong() > 0.0000000000001) {
- autoPilot.setTargetHeading(90);
- System.out.println(90);
- } else if(impact.getValue1() - landingComplexTarget.getLong() < -0.0000000000001) {
- autoPilot.setTargetHeading(270);
- System.out.println(270);
- } else if(impact.getValue0() - landingComplexTarget.getLat() > 0.00000000000001) {
- autoPilot.setTargetHeading(0);
- System.out.println(0);
- } else if(impact.getValue0() - landingComplexTarget.getLat() < -0.00000000000001) {
- autoPilot.setTargetHeading(180);
- System.out.println(180);
- }*/
- /*double lo1 = impact.getValue1();
- double lo2 = landingComplexTarget.getLong();
- double la2 = landingComplexTarget.getLat();
- double la1 = impact.getValue0();*/
- /*if(flight.getGForce() > 2) {
- vessel.getControl().setRCS(false);
- } else {
- vessel.getControl().setRCS(true);
- }*/
- double lat1 = landingComplexTarget.getLat();
- double lng1 = landingComplexTarget.getLong() + (flight.getMeanAltitude() > 5000 ? 0.002 : 0);
- double lat2 = impact.getValue0();
- double lng2 = impact.getValue1();
- double teta1 = toRadians(lat1);
- double teta2 = toRadians(lat2);
- double delta1 = toRadians(lat2-lng1);
- double delta2 = toRadians(lng2-lng1);
- //==================Heading Formula Calculation================//
- double y = Math.sin(delta2) * Math.cos(teta2);
- double x = Math.cos(teta1)*Math.sin(teta2) - Math.sin(teta1)*Math.cos(teta2)*Math.cos(delta2);
- double brng = Math.atan2(y, x);
- brng = toDegrees(brng);// radians to degrees
- brng = ( ((int)brng + 360) % 360 );
- // if(Distance < 500) coef = 0.01;
- if(flight.getGForce() > 2.0) {
- vessel.getControl().setBrakes(false);
- } else {
- vessel.getControl().setBrakes(true);
- }
- if(Distance > lastDist && Distance < 300) {
- maxAngle = maxAngle - 2.5f;
- }
- lastDist = distance(impactPoint().getValue0(), landingComplexTarget.getLat(), impactPoint().getValue1(), landingComplexTarget.getLong(), 0.0, 0.0);
- System.out.println("Pitch:" + (Distance > 500 ? (float)Math.max(90-(Distance*coef)/*(lastDist < Distance ? 5 :0)*/,10) : maxAngle));
- System.out.println("Heading: " + (float)brng);
- // System.out.println("Heading: "+ brng + " - " + flight.getHeading());
- // System.out.println("Pitch: "+ maxAngle + " - " + flight.getPitch());
- vessel.getAutoPilot().targetPitchAndHeading((Distance > 500 ? (float)Math.max(90-(Distance*coef)/*(lastDist < Distance ? 5 :0)*/,10) : maxAngle),(float)brng);
- // if(flight.getMeanAltitude() > 12000)
- // vessel.getAutoPilot().wait_();
- }
- engineGuidance(vessel);
- } catch (Exception e) { e.printStackTrace();}
- }
- });
- thread.start();
- thread.setPriority(10);
- }
- public double toRadians(double value1) {
- return value1 * Math.PI / 180;
- }
- public double toDegrees(double value) {
- return value * 180/Math.PI;
- }
- public double distance(double lat1, double lat2, double lon1,
- double lon2, double el1, double el2) {
- final int R = 6371; // Radius of the earth
- double latDistance = Math.toRadians(lat2 - lat1);
- double lonDistance = Math.toRadians(lon2 - lon1);
- double a = Math.sin(latDistance / 2) * Math.sin(latDistance / 2)
- + Math.cos(Math.toRadians(lat1)) * Math.cos(Math.toRadians(lat2))
- * Math.sin(lonDistance / 2) * Math.sin(lonDistance / 2);
- double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
- double distance = R * c * 1000; // convert to meters
- double height = el1 - el2;
- distance = Math.pow(distance, 2) + Math.pow(height, 2);
- return Math.sqrt(distance);
- }
- /**
- * Get first stage impact point
- * @return Latitude / Longitude values.
- */
- public Pair<Double, Double> impactPoint() {
- try {
- //System.out.println(Trajectories.newInstance(connection).impactPos().getValue0() + Trajectories.newInstance(connection).impactPos().getValue1());
- return PR.newInstance(connection).getImpactPos(vessel);
- //return Trajectories.newInstance(connection).impactPos();
- } catch (Exception e) {
- }
- return new Pair<>(0D,0D);
- }
- public double metersBtwPoints(double lat1, double lon1, double lat2, double lon2) {
- double R = 6371; // Radius of earth in KM
- double dLat = lat2 * Math.PI / 180 - lat1 * Math.PI / 180;
- double dLon = lon2 * Math.PI / 180 - lon1 * Math.PI / 180;
- double a = Math.sin(dLat/2) * Math.sin(dLat/2) +
- Math.cos(lat1 * Math.PI / 180) * Math.cos(lat2 * Math.PI / 180) *
- Math.sin(dLon/2) * Math.sin(dLon/2);
- double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
- double d = R * c;
- return d * 1000; // meters
- }
- public void restoreConnectionWithFirstStage(SpaceCenter spaceCenter) {
- try {
- System.out.println(stageName + " : " + "Recover network...");
- for (SpaceCenter.Vessel spaceCenterVessel : spaceCenter.getVessels()) {
- if (!(spaceCenterVessel.getMET() > 60)) {
- if(spaceCenterVessel.getParts().withName("proceduralAvionics").size() > 0) {
- System.out.println(stageName + " : " + spaceCenterVessel.getParts().withName("proceduralAvionics").get(0).getTag().equals(stageName));
- System.out.println(stageName + " : " + spaceCenterVessel.getParts().withName("proceduralAvionics").get(0).getTag().contains(stageName));
- System.out.println(stageName + " : " + spaceCenterVessel.getParts().withName("proceduralAvionics").get(0).getTag() + " " + stageName);
- if (spaceCenterVessel.getParts().withName("proceduralAvionics").get(0).getTag().equals(stageName)) {
- vessel = spaceCenterVessel;
- System.out.println(stageName + " : " + "New Vessel : " + this.vessel.getName());
- spaceCenterVessel.setName(stageName);
- break;
- }
- }
- }
- }
- if(vessel == null) restoreConnectionWithFirstStage(spaceCenter);
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- public LandingComplexEnum getLandingComplexTarget() {
- return landingComplexTarget;
- }
- //Should it land? Or should it splashdown ?
- public boolean isShoulditland() {
- return Shoulditland;
- }
- @Override
- public void tick() {
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement