-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathSwerveModule.java
129 lines (97 loc) · 2.89 KB
/
SwerveModule.java
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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
package frc.robot.subsystems.drive;
import PIDControl.PIDControl;
import frc.robot.abstraction.Motor;
import frc.robot.abstraction.PositionSensor;
public abstract class SwerveModule extends Vector
{
protected Motor _driveMotor;
protected Motor _rotateMotor;
protected PositionSensor _positionSensor;
protected PIDControl _rotatePID;
private double _rotateSetpoint;
private double _driveSetpoint;
private double _relativeZero;
private double _oldDrivePosition;
private double _distanceScaler;
public SwerveModule(double x,
double y,
double relativeZero,
double distanceScaler)
{
super(x, y);
_rotateSetpoint = 0;
_driveSetpoint = 0;
_relativeZero = relativeZero;
_oldDrivePosition = 0;
_distanceScaler = distanceScaler;
}
public void drive(Vector moduleCommand)
{
_driveSetpoint = moduleCommand.getR();
_rotateSetpoint = moduleCommand.getTheta();
drive();
}
public void drive()
{
double PIDPosition = Math.toRadians(_rotateSetpoint - getPosition());
double driveSpeed = _driveSetpoint * Math.cos(PIDPosition);
// https://www.desmos.com/calculator/sehmrxy3lt
PIDPosition = Math.sin(PIDPosition) * (Math.cos(PIDPosition) / -Math.abs(Math.cos(PIDPosition)));
_rotatePID.setSetpoint(0, PIDPosition);
double rotateSpeed = _rotatePID.calculate(PIDPosition);
_rotateMotor.set(rotateSpeed);
_driveMotor.set(driveSpeed);
}
public double getPosition()
{
return _positionSensor.get() - _relativeZero;
}
public double getRotateSetpoint()
{
return _rotateSetpoint;
}
public double getDriveSetpoint()
{
return _driveSetpoint;
}
public Motor getDriveMotor()
{
return _driveMotor;
}
public Motor getRotateMotor()
{
return _rotateMotor;
}
public PositionSensor getPositionSensor()
{
return _positionSensor;
}
public PIDControl getRotatePID()
{
return _rotatePID;
}
public double getRelativeZero()
{
return _relativeZero;
}
public void setRelativeZero(double zero)
{
_relativeZero = zero;
}
public double getDrivePosition()
{
return _driveMotor.getPositionSensor().get();
}
public void resetDrivePosition()
{
_oldDrivePosition = getDrivePosition();
}
public Vector getOffset()
{
Vector offset = new Vector();
offset.setR((getDrivePosition() - _oldDrivePosition) * _distanceScaler);
resetDrivePosition();
offset.setTheta(getPosition());
return offset;
}
}