Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
708cc5c
[MP-2]: Added button for Create Maneuvers, fixed some UI
Pesterenan Feb 17, 2023
b1604f9
[MP-2]: Created button for Create Maneuvers Panel
Pesterenan Feb 22, 2023
97b790c
[MP-2]: Making liftoff button get back to telemetry jpanel
Pesterenan Feb 22, 2023
76ccd00
[MP-2]: Incremented patch version for bugfix
Pesterenan Feb 22, 2023
62faec0
Merge branch 'dev' of https://www.github.com/Pesterenan/MechPeste-Jav…
Pesterenan Mar 9, 2023
0dd3108
Merge branch 'dev' into MP-2
Pesterenan Apr 21, 2023
b17afbd
[MP-2]: Created Panel and Functionality
Pesterenan Apr 21, 2023
7f8f4a8
[MP-2]: Added event listeners for maneuver buttons
Pesterenan May 2, 2023
cc7ff55
[MP-2]: Began implementing Rendezvous code
Pesterenan May 3, 2023
24355e6
[MP-2]: Unified Create and Run Maneuver JPanels
Pesterenan May 10, 2023
7ac6768
[MP-2]: Saving current changes to MechPeste
Pesterenan Sep 20, 2023
f46bb3b
-- First implementation of auto-docking
Pesterenan Sep 23, 2023
33d9b73
-- Managed to debug on Neovim
Pesterenan Sep 29, 2023
672dab2
-- Changed how ControlePID works
Pesterenan Oct 4, 2023
8133220
[Docking]: Finally have a working docking script?
Pesterenan Oct 14, 2023
6338059
[Docking]: Working 1st and 2nd docking stage
Pesterenan Oct 20, 2023
c8902d8
[Docking]: We have a docking script!
Pesterenan Nov 10, 2023
a16771c
[Docking]: Implement docking into MechPeste
Pesterenan Nov 21, 2023
1736411
[Docking]: Organize docking code
Pesterenan Nov 22, 2023
cd60595
[Docking]: Implement maneuvering around target
Pesterenan Nov 22, 2023
99b7cee
[Landing]: Fix landing speed calculation
Pesterenan Nov 25, 2023
eb22971
Merge branch 'dev' into docking-test
Pesterenan Dec 5, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions .vscode/launch.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,12 @@
{
"configurations": [
{
"type": "java",
"name": "Main",
"request": "launch",
"mainClass": "com.pesterenan.Main",
"projectName": "MechPeste-Java"
},
{
"type": "java",
"name": "Launch MechPeste",
Expand Down
229 changes: 229 additions & 0 deletions src/com/pesterenan/Main.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,229 @@
package com.pesterenan;

import java.io.IOException;

import com.pesterenan.utils.Utilities;
import com.pesterenan.utils.Vector;

import krpc.client.Connection;
import krpc.client.RPCException;
import krpc.client.services.Drawing;
import krpc.client.services.Drawing.Line;
import krpc.client.services.SpaceCenter;
import krpc.client.services.SpaceCenter.Control;
import krpc.client.services.SpaceCenter.DockingPort;
import krpc.client.services.SpaceCenter.ReferenceFrame;
import krpc.client.services.SpaceCenter.SASMode;
import krpc.client.services.SpaceCenter.Vessel;

public class Main {
private static Connection connection;
private static SpaceCenter spaceCenter;
private static Drawing drawing;
private static Control control;

private static Vessel activeVessel;
private static Vessel targetVessel;

private static ReferenceFrame orbitalRefVessel;
private static ReferenceFrame vesselRefFrame;
private static ReferenceFrame orbitalRefBody;
private static final double SPEED_LIMIT = 3.0;
private static final double DISTANCE_LIMIT = 25.0;
private static Line distanceLine;
private static Line distLineXAxis;
private static Line distLineYAxis;
private static Line distLineZAxis;
private static DockingPort myDockingPort;
private static DockingPort targetDockingPort;
private static Vector positionMyDockingPort;
private static Vector positionTargetDockingPort;

private static void initializeParameters() {
try {
connection = Connection.newInstance();
spaceCenter = SpaceCenter.newInstance(connection);
drawing = Drawing.newInstance(connection);
activeVessel = spaceCenter.getActiveVessel();
targetVessel = spaceCenter.getTargetVessel();
vesselRefFrame = activeVessel.getReferenceFrame();
orbitalRefVessel = activeVessel.getOrbitalReferenceFrame();
orbitalRefBody = activeVessel.getOrbit().getBody().getReferenceFrame();

myDockingPort = activeVessel.getParts().getDockingPorts().get(0);
targetDockingPort = targetVessel.getParts().getDockingPorts().get(0);

positionMyDockingPort = new Vector(myDockingPort.position(orbitalRefVessel));
positionTargetDockingPort = new Vector(targetDockingPort.position(orbitalRefVessel));

createLines(positionMyDockingPort, positionTargetDockingPort);

} catch (IOException | RPCException e) {
e.printStackTrace();
}
}

public static void main(String[] args) {
try {
// Initialize parameters for the script, connection and setup:
initializeParameters();

// Setting up the control
control = activeVessel.getControl();
control.setSAS(true);
control.setRCS(false);
control.setSASMode(SASMode.STABILITY_ASSIST);

Vector targetDirection = new Vector(activeVessel.position(orbitalRefVessel))
.subtract(new Vector(targetVessel.position(orbitalRefVessel))).multiply(-1);
activeVessel.getAutoPilot().setReferenceFrame(orbitalRefVessel);
activeVessel.getAutoPilot().setTargetDirection(targetDirection.toTriplet());
activeVessel.getAutoPilot().setTargetRoll(90);
activeVessel.getAutoPilot().engage();
// Fazer a nave apontar usando o piloto automático, na marra
while (Math.abs(activeVessel.getAutoPilot().getError()) > 1) {
activeVessel.getAutoPilot().wait_();
}
control.setRCS(true);
activeVessel.getAutoPilot().disengage();
control.setSAS(true);
control.setSASMode(SASMode.STABILITY_ASSIST);

// PRIMEIRA PARTE DO DOCKING: APROXIMAÇÃO

Vector targetPosition = new Vector(targetVessel.position(vesselRefFrame));
double lastXTargetPos = targetPosition.x;
double lastYTargetPos = targetPosition.y;
double lastZTargetPos = targetPosition.z;
long sleepTime = 25;
double currentXAxisSpeed = 0;
double currentYAxisSpeed = 0;
double currentZAxisSpeed = 0;
while (Math.abs(lastYTargetPos) >= DISTANCE_LIMIT) {
targetPosition = new Vector(targetVessel.position(vesselRefFrame));

// Atualizar posições para linhas
positionMyDockingPort = new Vector(myDockingPort.position(vesselRefFrame));
positionTargetDockingPort = new Vector(targetDockingPort.position(vesselRefFrame));
updateLines(positionMyDockingPort, positionTargetDockingPort);

// Calcular velocidade de cada eixo:
currentXAxisSpeed = (targetPosition.x - lastXTargetPos) * sleepTime;
currentYAxisSpeed = (targetPosition.y - lastYTargetPos) * sleepTime;
currentZAxisSpeed = (targetPosition.z - lastZTargetPos) * sleepTime;

// Calcular a aceleração para cada eixo no RCS:
float forwardsError = calculateThrottle(DISTANCE_LIMIT, DISTANCE_LIMIT * 2, currentYAxisSpeed,
targetPosition.y, SPEED_LIMIT);
float sidewaysError = calculateThrottle(0, 10, currentXAxisSpeed, targetPosition.x, SPEED_LIMIT);
float upwardsError = calculateThrottle(0, 10, currentZAxisSpeed, targetPosition.z, SPEED_LIMIT);
control.setForward((float) forwardsError);
control.setRight((float) sidewaysError);
control.setUp((float) -upwardsError);

// Guardar últimas posições:
lastXTargetPos = targetPosition.x;
lastYTargetPos = targetPosition.y;
lastZTargetPos = targetPosition.z;
Thread.sleep(sleepTime);
}

// SEGUNDA PARTE APONTAR PRO LADO CONTRARIO:
Vector direcaoContrariaDockingPortAlvo = new Vector(targetDockingPort.direction(orbitalRefVessel))
.multiply(-1);
control.setSAS(false);
control.setRCS(false);
activeVessel.getAutoPilot().engage();
activeVessel.getAutoPilot().setReferenceFrame(orbitalRefVessel);
activeVessel.getAutoPilot().setTargetDirection(direcaoContrariaDockingPortAlvo.toTriplet());
activeVessel.getAutoPilot().setTargetRoll(90);
while (Math.abs(activeVessel.getAutoPilot().getError()) > 1) {
activeVessel.getAutoPilot().wait_();
}
activeVessel.getAutoPilot().disengage();
control.setSAS(true);
control.setSASMode(SASMode.STABILITY_ASSIST);
Thread.sleep(1000);
control.setRCS(true);

while (targetVessel != null) {
targetPosition = new Vector(targetDockingPort.position(vesselRefFrame));

// Atualizar posições para linhas
positionMyDockingPort = new Vector(myDockingPort.position(vesselRefFrame));
updateLines(positionMyDockingPort, targetPosition);

// Calcular velocidade de cada eixo:
currentXAxisSpeed = (targetPosition.x - lastXTargetPos) * sleepTime;
currentYAxisSpeed = (targetPosition.y - lastYTargetPos) * sleepTime;
currentZAxisSpeed = (targetPosition.z - lastZTargetPos) * sleepTime;

// Calcular a aceleração para cada eixo no RCS:
float forwardsError = calculateThrottle(5, 10, currentYAxisSpeed,
targetPosition.y, SPEED_LIMIT);
float sidewaysError = calculateThrottle(-1, 10, currentXAxisSpeed, targetPosition.x, SPEED_LIMIT);
float upwardsError = calculateThrottle(-1, 10, currentZAxisSpeed, targetPosition.z, SPEED_LIMIT);
control.setForward((float) forwardsError);
control.setRight((float) sidewaysError);
control.setUp((float) -upwardsError);

// Guardar últimas posições:
lastXTargetPos = targetPosition.x;
lastYTargetPos = targetPosition.y;
lastZTargetPos = targetPosition.z;
Thread.sleep(sleepTime);
}
// // Close the connection when finished
// connection.close();
} catch (RPCException | InterruptedException e) {
e.printStackTrace();
}
}

private static float calculateThrottle(double minDistance, double maxDistance, double currentSpeed,
double currentPosition, double speedLimit) {
double limiter = Utilities.remap(minDistance, maxDistance, 0, 1, Math.abs(currentPosition), true);
double change = (Utilities.remap(-speedLimit, speedLimit, -1.0, 1.0,
currentSpeed + (Math.signum(currentPosition) * (limiter * speedLimit)), true));
return (float) change;
}

private static void createLines(Vector start, Vector end) {
try {
distanceLine = drawing.addLine(start.toTriplet(),
end.toTriplet(), vesselRefFrame, true);
distLineXAxis = drawing.addLine(start.toTriplet(),
new Vector(end.x, 0.0, 0.0).toTriplet(),
vesselRefFrame, true);
distLineYAxis = drawing.addLine(start.toTriplet(),
new Vector(end.x, end.y, 0.0).toTriplet(),
vesselRefFrame, true);
distLineZAxis = drawing.addLine(start.toTriplet(),
end.toTriplet(),
vesselRefFrame, true);
distanceLine.setThickness(0.5f);
distLineXAxis.setThickness(0.25f);
distLineYAxis.setThickness(0.25f);
distLineZAxis.setThickness(0.25f);
distLineXAxis.setColor(new Vector(1.0, 0.0, 0.0).toTriplet());
distLineYAxis.setColor(new Vector(0.0, 1.0, 0.0).toTriplet());
distLineZAxis.setColor(new Vector(0.0, 0.0, 1.0).toTriplet());
} catch (RPCException e) {
}
}

private static void updateLines(Vector start, Vector end) {
// Updating drawing lines:
try {
distanceLine.setStart(start.toTriplet());
distanceLine.setEnd(end.toTriplet());
distLineXAxis.setStart(start.toTriplet());
distLineXAxis.setEnd(new Vector(end.x, 0.0, 0.0).toTriplet());
distLineYAxis.setStart(distLineXAxis.getEnd());
distLineYAxis.setEnd(new Vector(end.x, end.y, 0.0).toTriplet());
distLineZAxis.setStart(distLineYAxis.getEnd());
distLineZAxis.setEnd(end.toTriplet());
} catch (RPCException e) {
}
}
}
115 changes: 58 additions & 57 deletions src/com/pesterenan/MechPeste.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,8 @@
import java.util.Map;
import java.util.stream.Collectors;

import javax.swing.*;
import javax.swing.DefaultListModel;
import javax.swing.ListModel;

import com.pesterenan.model.ActiveVessel;
import com.pesterenan.resources.Bundle;
Expand All @@ -33,10 +34,6 @@ public class MechPeste {
private static int currentVesselId = -1;
private static ActiveVessel currentVessel = null;

private MechPeste() {
MainGui.newInstance();
}

public static void main(String[] args) {
MechPeste.newInstance().connectToKSP();
MechPeste.newInstance().checkActiveVessel();
Expand Down Expand Up @@ -92,32 +89,6 @@ public static ListModel<String> getCurrentManeuvers() {
return list;
}

private static boolean filterVessels(Vessel vessel, String search) {
if (search == "all") {
return true;
}
double TEN_KILOMETERS = 10000.0;
try {
Vessel active = MechPeste.getSpaceCenter().getActiveVessel();
if (vessel.getOrbit().getBody().getName().equals(active.getOrbit().getBody().getName())) {
final Vector activePos = new Vector(active.position(active.getSurfaceReferenceFrame()));
final Vector vesselPos = new Vector(vessel.position(active.getSurfaceReferenceFrame()));
final double distance = Vector.distance(activePos, vesselPos);
switch (search) {
case "closest":
if (distance < TEN_KILOMETERS) {
return true;
}
break;
case "samebody":
return true;
}
}
} catch (RPCException ignored) {
}
return false;
}

public static String getVesselInfo(int selectedIndex) {
try {
Vessel naveAtual = spaceCenter.getVessels().stream().filter(v -> v.hashCode() == selectedIndex).findFirst()
Expand All @@ -143,35 +114,42 @@ public static void changeToVessel(int selectedIndex) {
}
}

public KRPC.GameScene getCurrentGameScene() throws RPCException {
return krpc.getCurrentGameScene();
public static void cancelControl(ActionEvent e) {
currentVessel.cancelControl();
}

private void checkActiveVessel() {
while (getConnection() != null) {
try {
if (!MechPeste.newInstance().getCurrentGameScene().equals(KRPC.GameScene.FLIGHT)) {
Thread.sleep(100);
return;
}
int activeVesselId = spaceCenter.getActiveVessel().hashCode();
// If the current active vessel changes, create a new connection
if (currentVesselId != activeVesselId) {
currentVessel = new ActiveVessel();
currentVesselId = currentVessel.getCurrentVesselId();
}
if (currentVesselId != -1) {
currentVessel.recordTelemetryData();
if (currentVessel.hasModuleRunning()) {
setStatusMessage(currentVessel.getCurrentStatus());
}
FunctionsAndTelemetryJPanel.updateTelemetry(currentVessel.getTelemetryData());
CreateManeuverJPanel.updatePanel(getCurrentManeuvers());
private static boolean filterVessels(Vessel vessel, String search) {
if (search == "all") {
return true;
}
double TEN_KILOMETERS = 10000.0;
try {
Vessel active = MechPeste.getSpaceCenter().getActiveVessel();
if (vessel.getOrbit().getBody().getName().equals(active.getOrbit().getBody().getName())) {
final Vector activePos = new Vector(active.position(active.getSurfaceReferenceFrame()));
final Vector vesselPos = new Vector(vessel.position(active.getSurfaceReferenceFrame()));
final double distance = Vector.distance(activePos, vesselPos);
switch (search) {
case "closest":
if (distance < TEN_KILOMETERS) {
return true;
}
break;
case "samebody":
return true;
}
Thread.sleep(100);
} catch (RPCException | InterruptedException ignored) {
}
} catch (RPCException ignored) {
}
return false;
}

private MechPeste() {
MainGui.newInstance();
}

public KRPC.GameScene getCurrentGameScene() throws RPCException {
return krpc.getCurrentGameScene();
}

public void startModule(Map<String, String> commands) {
Expand Down Expand Up @@ -205,7 +183,30 @@ public void checkConnection() {
}
}

public static void cancelControl(ActionEvent e) {
currentVessel.cancelControl();
private void checkActiveVessel() {
while (getConnection() != null) {
try {
if (!MechPeste.newInstance().getCurrentGameScene().equals(KRPC.GameScene.FLIGHT)) {
Thread.sleep(100);
return;
}
int activeVesselId = spaceCenter.getActiveVessel().hashCode();
// If the current active vessel changes, create a new connection
if (currentVesselId != activeVesselId) {
currentVessel = new ActiveVessel();
currentVesselId = currentVessel.getCurrentVesselId();
}
if (currentVesselId != -1) {
currentVessel.recordTelemetryData();
if (currentVessel.hasModuleRunning()) {
setStatusMessage(currentVessel.getCurrentStatus());
}
FunctionsAndTelemetryJPanel.updateTelemetry(currentVessel.getTelemetryData());
CreateManeuverJPanel.updatePanel(getCurrentManeuvers());
}
Thread.sleep(100);
} catch (RPCException | InterruptedException ignored) {
}
}
}
}
Loading