16         , [
this](CANifier::PWMChannel channel){ 
return PWMToPulseWidth(channel); } 
    26         , [
this](CANifier::PWMChannel channel){ 
return PWMToPulseWidth(channel); } 
    30         , string(
"FrontRight")
    36         , [
this](CANifier::PWMChannel channel){ 
return PWMToPulseWidth(channel); } 
    46         , [
this](CANifier::PWMChannel channel){ 
return PWMToPulseWidth(channel); } 
    57     #ifdef MANUAL_MODULE_STATES    58     SmartDashboard::PutNumber(
"T_D_MFL", 0);
    59     SmartDashboard::PutNumber(
"T_D_MFR", 0);
    60     SmartDashboard::PutNumber(
"T_D_MRR", 0);
    61     SmartDashboard::PutNumber(
"T_D_MRL", 0);
    62     SmartDashboard::PutNumber(
"T_D_MFLV", 0);
    63     SmartDashboard::PutNumber(
"T_D_MFRV", 0);
    64     SmartDashboard::PutNumber(
"T_D_MRRV", 0);
    65     SmartDashboard::PutNumber(
"T_D_MRLV", 0);
    68     #ifdef TUNE_ROTATION_DRIVE    69     SmartDashboard::PutNumber(
"T_D_RP", 0);
    70     SmartDashboard::PutNumber(
"T_D_RI", 0);
    71     SmartDashboard::PutNumber(
"T_D_RD", 0);
    72     SmartDashboard::PutNumber(
"T_D_RMax", 0);
    73     SmartDashboard::PutNumber(
"T_D_RTMax", 0);
    98                                 , meters_per_second_t ySpeed
   100                                 , 
bool fieldRelative) 
   107     #ifdef TUNE_ROTATION_DRIVE   108     double P = SmartDashboard::GetNumber(
"T_D_RP", 0);
   109     double I = SmartDashboard::GetNumber(
"T_D_RI", 0);
   110     double D = SmartDashboard::GetNumber(
"T_D_RD", 0);
   111     double m = SmartDashboard::GetNumber(
"T_D_RMax", 0);
   112     double mTurn = SmartDashboard::GetNumber(
"T_D_RTMax", 0);
   126     if ((abs(currentTurnRate) >= maxTurn) && (signbit(desiredTurnRate) != signbit(currentTurnRate)))
   127         desiredTurnRate *= -1.0;
   130     if (abs(desiredTurnRate) > max)
   131         desiredTurnRate = signbit(desiredTurnRate) ? max * -1.0 : max;
   133     Drive(xSpeed, ySpeed, radians_per_second_t(desiredTurnRate), fieldRelative);
   137                                 , meters_per_second_t ySpeed
   140                                 , 
bool fieldRelative) 
   142     if (xRot != 0 || yRot != 0)
   145         RotationDrive(xSpeed, ySpeed, radian_t(atan2f(yRot, xRot)), fieldRelative);
   148         Drive(xSpeed, ySpeed, radians_per_second_t(0), fieldRelative);
   153                                 , meters_per_second_t ySpeed
   154                                 , radians_per_second_t rot
   155                                 , 
bool fieldRelative)
   157     if (xSpeed.to<
double>() == 0 && ySpeed.to<
double>() == 0 &&   rot.to<
double>() == 0)
   159         Drive(xSpeed, ySpeed, rot, fieldRelative);
   168     else if (rot.to<
double>() != 0)
   171     if (!
m_rotationalInput && (xSpeed.to<
double>() != 0 || ySpeed.to<
double>() != 0))
   174         Drive(xSpeed, ySpeed, rot, fieldRelative);
   178                         , meters_per_second_t ySpeed
   179                         , radians_per_second_t rot
   180                         , 
bool fieldRelative)
   182     ChassisSpeeds chassisSpeeds;
   186         chassisSpeeds = ChassisSpeeds{xSpeed, ySpeed, rot};
   192     #ifdef MANUAL_MODULE_STATES   193     states[
kFrontLeft].angle = Rotation2d(radian_t(SmartDashboard::GetNumber(
"T_D_MFL", 0.0)));
   194     states[
kFrontRight].angle = Rotation2d(radian_t(SmartDashboard::GetNumber(
"T_D_MFR", 0.0)));
   195     states[
kRearRight].angle = Rotation2d(radian_t(SmartDashboard::GetNumber(
"T_D_MRR", 0.0)));
   196     states[
kRearLeft].angle = Rotation2d(radian_t(SmartDashboard::GetNumber(
"T_D_MRL", 0.0)));
   197     states[
kFrontLeft].speed = SmartDashboard::GetNumber(
"T_D_MFLV", 0.0) * 1_mps;
   198     states[
kFrontRight].speed = SmartDashboard::GetNumber(
"T_D_MFRV", 0.0) * 1_mps;
   199     states[
kRearRight].speed = SmartDashboard::GetNumber(
"T_D_MRRV", 0.0) * 1_mps;
   200     states[
kRearLeft].speed = SmartDashboard::GetNumber(
"T_D_MRLV", 0.0) * 1_mps;
   238     double dutyCycleAndPeriod[2];
   239     m_canifier.GetPWMInput(pwmChannel, dutyCycleAndPeriod);
   258     static SwerveModuleState zeroState { 0_mps, 0_deg };
   259     printf(
"DriveSubsystem::WheelsForward() called");
 constexpr int kCanifierID
CANifier CAN ID (for absolute encoder PWM inputs) 
void RotationDrive(meters_per_second_t xSpeed, meters_per_second_t ySpeed, radian_t rot, bool fieldRelative)
frc::Rotation2d GetHeadingAsRot2d()
constexpr double kFrontRightOffset
void Drive(meters_per_second_t xSpeed, meters_per_second_t ySpeed, radians_per_second_t rot, bool fieldRelative)
constexpr double kRotationDriveMaxSpeed
Max speed for control. 
void Periodic() override
Will be called periodically whenever the CommandScheduler runs. 
static double NegPiToPiRads(double theta)
constexpr CANifier::PWMChannel kFrontRightPWM
constexpr int kRearRightDriveMotorPort
Rear Right Drive CAN ID (TalonFX) 
void ResetRelativeToAbsolute()
Resync all relative NEO turn encoders to the absolute encoders. 
SwerveDriveOdometry< DriveConstants::kNumSwerveModules > m_odometry
Odometry class for tracking robot pose. 
constexpr int kFrontLeftDriveMotorPort
Front Left Drive CAN ID (TalonFX) 
CANifier m_canifier
Reads the absolute encoder pulse widths. 
constexpr double kRearRightOffset
constexpr double kRotationDriveTolerance
Tolerance for turning. 
constexpr double kRotationDriveDirectionLimit
Speeds higher than value will prevent robot from changing directions for a turn. 
frc2::PIDController m_rotationPIDController
PID to control overall robot chassis rotation. 
SwerveModule m_frontRight
constexpr int kFrontRightTurningMotorPort
Front Right Turn CAN ID (SparkMAX) 
double PWMToPulseWidth(CANifier::PWMChannel pwmChannel)
constexpr int kFrontRightDriveMotorPort
Front Right Drive CAN ID (TalonFX) 
wpi::array< SwerveModuleState, DriveConstants::kNumSwerveModules > SwerveModuleStates
Readable alias for array of swerve modules. 
void SetDesiredState(SwerveModuleState &state)
double m_lastHeading
Last maintained heading, used for HeadingDrive. 
void ResetOdometry(Pose2d pose)
void WheelsForward()
Set all 4 wheels to the zero position. 
void UpdateLastHeading()
Updates the last heading set for Heading Drive. Needs to be called if transitioning from other Drive ...
constexpr int kRearLeftDriveMotorPort
Rear Left Drive CAN ID (TalonFX) 
constexpr CANifier::PWMChannel kRearLeftPWM
Gyro * m_gyro
Gyro to determine field relative driving, from RobotContainer. 
constexpr double kPulseWidthToZeroOne
void ResetRelativeToAbsolute()
Resync the relative NEO turn encoder to the absolute encoder. 
constexpr int kFrontLeftTurningMotorPort
Front Left Turn CAN ID (SparkMAX) 
constexpr double kRearLeftOffset
void ResetEncoders()
Resets the drive encoders to currently read a position of 0. 
constexpr double kFrontLeftOffset
constexpr bool kRearRightDriveMotorReversed
constexpr CANifier::PWMChannel kFrontLeftPWM
constexpr int kRearRightTurningMotorPort
Rear Right Turn CAN ID (SparkMAX) 
void HeadingDrive(meters_per_second_t xSpeed, meters_per_second_t ySpeed, radians_per_second_t rot, bool fieldRelative)
constexpr auto kDriveSpeed
constexpr bool kFrontRightDriveMotorReversed
DriveSubsystem(Gyro *gyro)
constexpr bool kRearLeftDriveMotorReversed
SwerveModuleState GetState()
constexpr int kRearLeftTurningMotorPort
constexpr CANifier::PWMChannel kRearRightPWM
constexpr double kRotationDriveIMaxRange
void SetModuleStates(SwerveModuleStates desiredStates)
Sets the drive SpeedControllers to a power from -1 to 1. 
void ResetEncoders()
Resets the drive motor encoders to 0. 
constexpr bool kFrontLeftDriveMotorReversed
SwerveDriveKinematics< kNumSwerveModules > kDriveKinematics
The kinematics object converts inputs into 4 individual swerve module turn angle and wheel speeds...
bool m_rotationalInput
Whether or not rotation input was provided, used for HeadingDrive.