-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathGenericEncodedSwerve.java
More file actions
118 lines (101 loc) · 3.74 KB
/
GenericEncodedSwerve.java
File metadata and controls
118 lines (101 loc) · 3.74 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
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
package frc.robot.swervev2.components;
import com.ctre.phoenix6.hardware.CANcoder;
import com.revrobotics.RelativeEncoder;
import edu.wpi.first.math.geometry.Rotation2d;
import edu.wpi.first.math.kinematics.SwerveModulePosition;
import edu.wpi.first.wpilibj.motorcontrol.MotorController;
/**
* Generic Class for Swerve Modules with Encoders
*/
public class GenericEncodedSwerve implements SwerveMotor, SwerveMotorEncoder {
private final MotorController driveMotor;
private final MotorController steerMotor;
private final RelativeEncoder driveEncoder;
private final RelativeEncoder steerEncoder;
private double steerOffset = 0;
private final CANcoder absEncoder;
public GenericEncodedSwerve(MotorController driveMotor, MotorController steerMotor, CANcoder absEncoder, RelativeEncoder driveEncoder, RelativeEncoder steerEncoder,
double driveVelFactor, double drivePosFactor, double steerPosFactor) {
this.driveMotor = driveMotor;
this.steerMotor = steerMotor;
this.absEncoder = absEncoder;
this.driveEncoder = driveEncoder;
this.steerEncoder = steerEncoder;
configureEncoders(driveVelFactor,drivePosFactor, steerPosFactor);
}
/**
* resets the relative encoders and sets the encoder conversion factors
* @param driveVelFactor (2 * PI * wheelRadius) / (gearRatio * 60);
* @param drivePosFactor (2 * PI * wheelRadius) / gearRatio;
* @param steerPosFactor (2 * PI) / gearRatio
*/
public void configureEncoders(double driveVelFactor, double drivePosFactor, double steerPosFactor){
resetRelEnc();
driveEncoder.setVelocityConversionFactor(driveVelFactor);
driveEncoder.setPositionConversionFactor(drivePosFactor);
steerEncoder.setPositionConversionFactor(steerPosFactor);
steerEncoder.setVelocityConversionFactor(steerPosFactor/60);
absEncoder.getPosition().setUpdateFrequency(50); //We think its 50
}
@Override
public MotorController getSteerMotor() {
return steerMotor;
}
@Override
public MotorController getDriveMotor() {
return driveMotor;
}
/**
* @return the steer encoder position in radians between 0 and (2 * PI)
*/
@Override
public double getSteerEncPosition() {
return normalizeAngle(steerEncoder.getPosition() - getSteerOffset());
}
@Override
public double getDriveEncPosition() {
return driveEncoder.getPosition();
}
@Override
public void resetRelEnc() {
steerEncoder.setPosition(0);
driveEncoder.setPosition(0);
}
@Override
public double getDriveEncVel() {
return driveEncoder.getVelocity();
}
@Override
public double getSteerOffset() {
return steerOffset;
}
/**
* @param zeroAbs the absolute position of the steer encoder when the robot is zeroed
*/
@Override
public void setSteerOffset(double zeroAbs) {
steerEncoder.setPosition(0);
steerOffset = Math.toRadians(zeroAbs - absEncoder.getAbsolutePosition().getValueAsDouble());
steerOffset = normalizeAngle(steerOffset);
}
public SwerveModulePosition getPosition(){
return new SwerveModulePosition(getDriveEncPosition(),new Rotation2d(getSteerEncPosition()));
}
/**
* @param angleInRad angle in radians
* @return the angle between 0 and (2 * PI)
*/
private double normalizeAngle(double angleInRad){
angleInRad %= 2 * Math.PI;
if (angleInRad < 0) {
angleInRad += 2 * Math.PI;
}
return angleInRad;
}
public CANcoder getAbsEnc() {
return absEncoder;
}
public double getSteerEncoderRawPos() {
return steerEncoder.getPosition();
}
}