This repository was archived by the owner on May 11, 2020. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathTargetDirection.java
More file actions
79 lines (66 loc) · 3.66 KB
/
TargetDirection.java
File metadata and controls
79 lines (66 loc) · 3.66 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
package org.firstinspires.ftc.utilities;
import com.qualcomm.hardware.bosch.BNO055IMU;
import org.firstinspires.ftc.robotcore.external.navigation.AngleUnit;
import org.firstinspires.ftc.robotcore.external.navigation.AxesOrder;
import org.firstinspires.ftc.robotcore.external.navigation.AxesReference;
import org.firstinspires.ftc.robotcore.external.navigation.Orientation;
public class TargetDirection {
// Private Variables
private static double absoluteHeadingAtFieldZero;
private static BNO055IMU imu;
private double fieldHeadingAtTargetZero;
// Constructor, to be used by static functions.
private TargetDirection(double fieldHeadingAtTargetZero) {
this.fieldHeadingAtTargetZero = fieldHeadingAtTargetZero;
}
// Function to be called before using a TargetDirection object
public static void setImu(BNO055IMU imu) {
TargetDirection.imu = imu;
}
public static void setCurrentHeading(double robotsCurrentHeading){
TargetDirection.absoluteHeadingAtFieldZero = getAbsoluteHeading() - robotsCurrentHeading;
}
// Public functions to change directions
public void moveTargetToRight(double degrees) { fieldHeadingAtTargetZero += degrees; }
public void moveTargetToLeft(double degrees) { fieldHeadingAtTargetZero -= degrees; }
public void setToFieldDirection(double degrees) { this.fieldHeadingAtTargetZero = degrees; }
// Calculation functions
private static double getAbsoluteHeading() {
Orientation angles;
synchronized (imu) {
angles = imu.getAngularOrientation(AxesReference.INTRINSIC, AxesOrder.ZYX, AngleUnit.DEGREES);
}
return errorCorrecter(-angles.firstAngle);
}
private static double calculateFieldHeading() {
return errorCorrecter(getAbsoluteHeading() - absoluteHeadingAtFieldZero);
}
public static double getHeading() { return calculateFieldHeading(); }
public double calculateDistanceFromTarget() {
return errorCorrecter(calculateFieldHeading() - fieldHeadingAtTargetZero);
}
// Functions to create TargetDirection objects
public static TargetDirection makeTargetAtFieldPosition(double fieldPositionInDegrees) { return new TargetDirection(fieldPositionInDegrees); }
public static TargetDirection makeTargetToRobotsRight(double degreesToRight) { return new TargetDirection(calculateFieldHeading() + degreesToRight); }
public static TargetDirection makeTargetToRobotsLeft(double degreesToLeft) { return new TargetDirection(calculateFieldHeading() - degreesToLeft); }
// Error correction to make everything on the range -180 to +180
public static double errorCorrecter(double heading){
if (heading > 180f)
heading = ((heading + 180f) % 360f) - 180f;
else if (heading < -180f)
heading = 180f - ((180f - heading) % 360f);
return heading;
}
public double getFocusHeading() {
return fieldHeadingAtTargetZero;
}
public static TargetDirection bisect(TargetDirection t1, TargetDirection t2) {
return makeTargetAtFieldPosition(errorCorrecter(t2.getFocusHeading() + errorCorrecter(t1.getFocusHeading() - t2.getFocusHeading()) / 2.0));
}
public TargetDirection mirrorAbout(TargetDirection mirrorLine) {
return makeTargetAtFieldPosition(errorCorrecter(fieldHeadingAtTargetZero + errorCorrecter(mirrorLine.getFocusHeading() - getFocusHeading()) * 2.0));
}
public TargetDirection mirrorAbout(double mirrorLine) {
return makeTargetAtFieldPosition(errorCorrecter(fieldHeadingAtTargetZero + errorCorrecter(mirrorLine - getFocusHeading()) * 2.0));
}
}