YAGSL supports most common FRC motor controllers (except Venom's) and while we recommend using a brushless motor with an integrated encoder if at all possible we support brushed motors with external quadrature encoders as well ONLY with SparkMAX's.
The integrated encoder value will show up in shuffleboard under swerve/modules/.../Raw Motor Encoder
as directly outputting the encoder value from the motor.
- All motors spin counterclockwise positive, if not document inversions required to achieve that.
- PID is tuned to the best of your abilities.
- Motor is updated to the latest firmware.
- Motor has unique CAN ID.
- Motor type is set.
- CAN ID given corresponds to the one in the JSON module.
- Wheels are aligned forwards with all bevels facing the same way.
YAGSL created wrappers over all supported Motor Controllers to uniformly fetch and set data that is needed for a Swerve Drive to operate. This wrapper is called SwerveMotor
. All SwerveMotor
's can be fetched via the SwerveModule
configuration object SwerveModuleConfiguration
motor definitions angleMotor
and driveMotor
. The SwerveModule
is able to be fetched by SwerveDrive.getModules()
easily.
/**
* Initialize {@link SwerveDrive} with the directory provided.
*
* @param directory Directory of swerve drive config files.
*/
public SwerveSubsystem(File directory)
{
// Angle conversion factor is 360 / (GEAR RATIO * ENCODER RESOLUTION)
// In this case the gear ratio is 12.8 motor revolutions per wheel rotation.
// The encoder resolution per motor revolution is 1 per motor revolution.
double angleConversionFactor = SwerveMath.calculateDegreesPerSteeringRotation(12.8, 1);
// Motor conversion factor is (PI * WHEEL DIAMETER IN METERS) / (GEAR RATIO * ENCODER RESOLUTION).
// In this case the wheel diameter is 4 inches, which must be converted to meters to get meters/second.
// The gear ratio is 6.75 motor revolutions per wheel rotation.
// The encoder resolution per motor revolution is 1 per motor revolution.
double driveConversionFactor = SwerveMath.calculateMetersPerRotation(Units.inchesToMeters(4), 6.75, 1);
// Configure the Telemetry before creating the SwerveDrive to avoid unnecessary objects being created.
SwerveDriveTelemetry.verbosity = TelemetryVerbosity.HIGH;
try
{
swerveDrive = new SwerveParser(directory).createSwerveDrive(maximumSpeed, angleConversionFactor, driveConversionFactor);
} catch (Exception e)
{
throw new RuntimeException(e);
}
swerveDrive.setHeadingCorrection(false); // Heading correction should only be used while controlling the robot via angle.
for(SwerveModule m : swerveDrive.getModules())
{
System.out.println("Module Name: "+m.configuration.name);
CANSparkMax steeringMotor = (CANSparkMax)m.getAngleMotor().getMotor();
CANSparkMax driveMotor = (CANSparkMax)m.getDriveMotor().getMotor();
}
}
{% hint style="warning" %}
Only CTRE devices currently support the canbus
option, if your device is using the roboRIO canbus
you must use the value of null
or "rio"
for supported CTRE devices. If you are using a CANivore, and the device is on the CANivore bus, the name must match the CANivore name.
{% endhint %}
Inside any module JSON such as frontleft.json
,frontright.json
,backleft.json
,backright.json
this is what you would see to configure a motor controller.
{
"drive": {
"type": "sparkmax",
"id": 5,
"canbus": null
},
"angle": {
"type": "sparkmax",
"id": 6,
"canbus": null
},
"encoder": {
"type": "cancoder",
"id": 11,
"canbus": null
},
"inverted": {
"drive": false,
"angle": false
},
"absoluteEncoderOffset": -18.281,
"location": {
"front": -12,
"left": -12
}
}
Device | type |
---|---|
SparkMAX | sparkmax (same as neo );neo ; neo550 |
SparkFlex | sparkflex (same as vortex ); vortex ; sparkflex_neo ; sparkflex_vortex |
TalonFX | talonfx (same as krakenx60 );falcon500 ;falcon500foc ;krakenx60 ; krakenx60foc |
TalonSRX | talonsrx |
SparkMAX Brushed | sparkmax_brushed |
{% hint style="warning" %}
At this time I do not provide documentation on brushed motor utilization, like sparkmax_brushed
and talonsrx
.
{% endhint %}