Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
40 commits
Select commit Hold shift + click to select a range
c3a714f
fixed acceleration
TurtleMinecraft Jan 30, 2024
75a7950
Merge pull request #1 from TurtleMinecraft/fix-acceleration
TurtleMinecraft Jan 30, 2024
07a397a
saving
TurtleMinecraft Jan 30, 2024
a193706
displaying information now also moved everything to a package
TurtleMinecraft Jan 30, 2024
0c85388
Merge pull request #2 from TurtleMinecraft/add-information
TurtleMinecraft Jan 30, 2024
3c576b6
created several classes related to PID control and FF control to make…
TurtleMinecraft Feb 3, 2024
46c0703
added wait time and tolerance
TurtleMinecraft Feb 8, 2024
175b2e5
fixed ordering in Character
TurtleMinecraft Feb 8, 2024
cea0973
fixed ordering in Character
TurtleMinecraft Feb 8, 2024
0dd7a02
removed magic
TurtleMinecraft Feb 8, 2024
f95ec10
removed magic
TurtleMinecraft Feb 8, 2024
1768bf1
removed spaces and fixed magic
TurtleMinecraft Feb 8, 2024
be04f06
added the option to change i zone
TurtleMinecraft Feb 11, 2024
f7eab81
added the option to change setpoint location
TurtleMinecraft Feb 11, 2024
4006a1c
Merge pull request #3 from TurtleMinecraft/add-ff-settings
TurtleMinecraft Feb 11, 2024
bea25ee
added velocity control
TurtleMinecraft Jun 15, 2024
9a9452e
removed debug sout
TurtleMinecraft Jun 15, 2024
fdee782
organized update() in Character to different functions
TurtleMinecraft Jun 15, 2024
e0d683b
fixed ordering
TurtleMinecraft Jun 15, 2024
49839e9
fixed ordering
TurtleMinecraft Jun 15, 2024
00bdff9
function
TurtleMinecraft Jun 16, 2024
6cb354c
Merge pull request #4 from TurtleMinecraft/add-velocity-control-mode
TurtleMinecraft Jun 16, 2024
97befb4
removed magic and unnecessary function
TurtleMinecraft Jun 16, 2024
386b882
removed a shitton of magic
TurtleMinecraft Jun 16, 2024
0c4c3c3
made an enum which represents the control types
TurtleMinecraft Jun 16, 2024
e53dbb6
removed wait time in PIDController
TurtleMinecraft Jun 16, 2024
a38658b
added a status which shows if the command ended
TurtleMinecraft Jun 16, 2024
4f58e42
removed more magic
TurtleMinecraft Jun 16, 2024
13d7cf9
Delete .idea/uiDesigner.xml
TurtleMinecraft Jun 16, 2024
0fb97d5
changed param ordering
TurtleMinecraft Jun 16, 2024
7539356
Merge remote-tracking branch 'origin/dev' into dev
TurtleMinecraft Jun 16, 2024
4117c77
added an error graph
TurtleMinecraft Jun 17, 2024
705169e
made GUI fit into most computer screens
TurtleMinecraft Jun 17, 2024
19cc66b
sizes shall now fit to screen size
TurtleMinecraft Jun 26, 2024
c20ee9f
created the randomness factor
TurtleMinecraft Aug 12, 2024
782d926
remove unneeded repaint
TurtleMinecraft Sep 9, 2024
0071324
fucking hate this normalizeSpeed() method
TurtleMinecraft Sep 30, 2024
ae1e68c
velocity random factor is not so random anymore :3 (thanks tuval)
TurtleMinecraft Sep 30, 2024
96663cc
Merge pull request #6 from TurtleMinecraft/random-factor
TurtleMinecraft Sep 30, 2024
944c2e3
changed how the random factor works
TurtleMinecraft Oct 1, 2024
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
102 changes: 0 additions & 102 deletions src/Character.java

This file was deleted.

76 changes: 0 additions & 76 deletions src/Window.java

This file was deleted.

155 changes: 155 additions & 0 deletions src/simulator/Character.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,155 @@
package simulator;

import simulator.control.*;

import java.awt.*;

public class Character extends Rectangle {

public static final int WIDTH = 32;
public static final int HEIGHT = 32;

private static final int MILLISECONDS_IN_SECOND = 1000;

private static final int POSITION_SOURCE_X = 0;
private static final int POSITION_SOURCE_Y = Window.WINDOW_HEIGHT / 3;

private static final int VELOCITY_SOURCE_X = Window.WINDOW_WIDTH / 2;
private static final int VELOCITY_SOURCE_Y = 320;

private static final int MAX_SPEED = 120;
private static final int MAX_ACCELERATION = 6;
private static final int FRICTION = 3;

private final PIDSettings pidSettings;
private final PIDController pidController;
private final FeedForwardSettings feedForwardSettings;
private final FeedForwardController feedForwardController;

private double lastTimeNotOnTarget;
private double lastSpeed;
private boolean commandFinished;

private static Character instance;

public static Character getInstance() {
if (instance == null) {
instance = new Character(WIDTH, HEIGHT, POSITION_SOURCE_X, POSITION_SOURCE_Y);
}
return instance;
}

private Character(int width, int height, int sourceX, int sourceY) {
super(sourceX, sourceY, width, height);
lastSpeed = 0;
pidSettings = new PIDSettings(0, 0, 0, 0, 0);
feedForwardSettings = new FeedForwardSettings(0, 0, 0);
pidController = new PIDController(pidSettings);
feedForwardController = new FeedForwardController(feedForwardSettings);
lastTimeNotOnTarget = System.currentTimeMillis();
}

public static void reset() {
Character character = getInstance();
character.lastSpeed = 0;
if (ControlType.getInstance().getSelectedIndex() == ControlType.Types.POSITION.index) {
character.setLocation(POSITION_SOURCE_X, POSITION_SOURCE_Y);
} else {
if (ControlType.getInstance().getSelectedIndex() == ControlType.Types.VELOCITY.index) {
character.setLocation(VELOCITY_SOURCE_X, VELOCITY_SOURCE_Y);
}
}
character.commandFinished = false;
character.lastTimeNotOnTarget = System.currentTimeMillis();
character.pidController.reset();
character.feedForwardController.reset();
}

public void update() {
if (!commandFinished) {
if (ControlType.getInstance().getSelectedIndex() == ControlType.Types.POSITION.index) {
runPosition();
} else if (ControlType.getInstance().getSelectedIndex() == ControlType.Types.VELOCITY.index) {
runVelocity();
}
}
if (!pidController.isOnTarget()) {
lastTimeNotOnTarget = System.currentTimeMillis();
}
}

public void setPID(double kP, double kI, double kD, double tolerance, double waitTime) {
pidController.setPID(kP, kI, kD);
pidController.setTolerance(tolerance);
pidSettings.setWaitTime(waitTime);
}

public void setIZone(int iZone) {
pidController.setIZone(iZone);
}

public PIDController getPIDController() {
return pidController;
}

public double getError() {
if (ControlType.getInstance().getSelectedIndex() == ControlType.Types.POSITION.index) {
return Setpoint.getInstance().x - this.x;
} else {
if (ControlType.getInstance().getSelectedIndex() == ControlType.Types.VELOCITY.index) {
return Setpoint.getInstance().x - lastSpeed;
} else {
return 0;
}
}
}

public void setFF(double kS, double kV, double kA) {
feedForwardController.setGains(kS, kV, kA);
}

public double getLastSpeed() {
return lastSpeed;
}

public boolean commandEnded() {
return commandFinished;
}

private void runPosition() {
commandFinished = (System.currentTimeMillis() - lastTimeNotOnTarget >=
pidSettings.getWaitTime() * MILLISECONDS_IN_SECOND && pidController.isOnTarget());
int moveValue = pidController.calculate(this.x, Setpoint.getInstance().x) +
feedForwardController.calculate(this.x, Setpoint.getInstance().x);
if (Math.abs(moveValue - lastSpeed) > MAX_ACCELERATION) {
if (lastSpeed > moveValue) moveValue = (int) (lastSpeed - MAX_ACCELERATION);
if (lastSpeed < moveValue) moveValue = (int) (lastSpeed + MAX_ACCELERATION);
}
moveValue = (int) normalizeSpeed(moveValue);
moveValue += (Math.random() - 0.5) * Math.pow(moveValue, 2) / MAX_SPEED;
this.translate(moveValue, 0);
lastSpeed = moveValue;
}

private void runVelocity() {
int moveValue = pidController.calculate(lastSpeed, Setpoint.getInstance().x);
double feedForward = feedForwardController.calculate(lastSpeed, Setpoint.getInstance().x);
moveValue += feedForward * Math.pow(Math.E, -(Math.pow(feedForward / MAX_SPEED, 2) / Math.pow(MAX_SPEED, 0.25)));
moveValue = (int) normalizeSpeed(moveValue);
if (Math.abs(moveValue - lastSpeed) > MAX_ACCELERATION) {
if (lastSpeed > moveValue) moveValue = (int) (lastSpeed - MAX_ACCELERATION);
if (lastSpeed < moveValue) moveValue = (int) (lastSpeed + MAX_ACCELERATION);
}
lastSpeed = moveValue;
}

private double normalizeSpeed(double speed) {
if (speed != 0) {
if (speed > FRICTION) speed -= FRICTION;
else if (speed < -FRICTION) speed += FRICTION;
else return 0;
if (Math.abs(speed) > MAX_SPEED) speed = (int) (MAX_SPEED * Math.signum(speed));
}
return speed;
}
}
2 changes: 2 additions & 0 deletions src/Main.java → src/simulator/Main.java
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
package simulator;

public class Main {

public static void main(String[] args) {
Expand Down
16 changes: 10 additions & 6 deletions src/RerunButton.java → src/simulator/RerunButton.java
Original file line number Diff line number Diff line change
@@ -1,15 +1,18 @@
package simulator;

import simulator.information.ErrorGraph;
import simulator.textfields.BaseTextField;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class RerunButton extends JButton {

private static final int WIDTH = 100;
private static final int HEIGHT = 45;
public static final int WIDTH = 100;
public static final int HEIGHT = 45;

private static final int X = 620;
private static final int Y = 700;
private static final int X = Window.WINDOW_WIDTH / 2 - WIDTH / 2;
private static final int Y = 200;

private static RerunButton instance;

Expand All @@ -28,6 +31,7 @@ private RerunButton() {
this.setBounds(X, Y, WIDTH, HEIGHT);
this.addActionListener(e -> {
Character.reset();
ErrorGraph.reset();
});
}
}
Loading