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.