47 Swerve(std::string name, std::vector<SwerveModule::Config> moduleConfigs, std::shared_ptr<gyro::Gyro> gyro,
48 units::meter_t wheelDiameter, frc2::sysid::Config = frc2::sysid::Config{std::nullopt, std::nullopt, std::nullopt,
nullptr});
54 void StartOdomThread(units::hertz_t freq);
56 void SimulationPeriodic()
override;
64 inline frc2::CommandPtr SysIdQuasistatic(frc2::sysid::Direction d) {
return sysIdRoutine.Quasistatic(d); }
66 inline frc2::CommandPtr SysIdDynamic(frc2::sysid::Direction d) {
return sysIdRoutine.Dynamic(d); }
76 double GetSkiddingRatio();
77 bool IsRobotSkidding();
79 constexpr std::vector<std::unique_ptr<SwerveModule>>& GetModules() {
return swerveModules; }
86 units::angular_acceleration::radians_per_second_squared_t GetSmoothedAngularAcceleration();
87 double RotationLerping(
double);
89 constexpr const auto& GetState()
const {
return state; }
91 constexpr auto& GetState() {
return state; }
96 units::meters_per_second_t maxDriveSpeed;
97 units::radians_per_second_t maxRotationSpeed;
99 std::shared_ptr<gyro::Gyro> gyro;
100 ctre::phoenix6::swerve::impl::SwerveDriveKinematics kinematics;
102 kinematics, frc::Rotation2d{}, std::vector<frc::SwerveModulePosition>{}, frc::Pose2d{}};
103 util::Locked<ctre::phoenix6::swerve::impl::SwerveDrivePoseEstimator> calcEstimator{
104 kinematics, frc::Rotation2d{}, std::vector<frc::SwerveModulePosition>{}, frc::Pose2d{}};
106 void EnableCarpetGrain(
double grainMultiplier,
bool roughTowardsRed);
108 FrameWrapper<FieldFrame, frc::ChassisSpeeds> VectorLockedSpeeds(FrameWrapper<FieldFrame, frc::ChassisSpeeds> speeds,
109 FrameWrapper<FieldFrame, frc::Rotation2d> heading);
111 std::vector<std::unique_ptr<SwerveModule>> swerveModules;
113 void UpdateOdometry();
115 void SetRotationalLerpMap(wpi::interpolating_map<double, double> _interpolationMap);
116 ConvexPolygon GetPolygon()
const;
118 static FrameWrapper<FieldFrame, frc::ChassisSpeeds> ReflectDriveSpeeds(FrameWrapper<FieldFrame, frc::ChassisSpeeds> unreflectedSpeeds) {
119 if (frc::DriverStation::GetAlliance().value_or(frc::DriverStation::Alliance::kBlue) == frc::DriverStation::Alliance::kRed) {
120 return frc::ChassisSpeeds{-unreflectedSpeeds->vx, -unreflectedSpeeds->vy, unreflectedSpeeds->omega};
122 return unreflectedSpeeds;
125 frc::Timer resetOdom;
131 std::vector<frc::SwerveModulePosition> GetModulePositions();
133 std::vector<frc::SwerveModuleState> GetModuleStates();
135 std::deque<units::angular_acceleration::radians_per_second_squared_t> yawRateBuffer;
137 static constexpr size_t ACCEL_BUFFER_SIZE = 10;
138 units::angular_velocity::radians_per_second_t lastYawRate = 0_rad_per_s;
140 units::angular_acceleration::radians_per_second_squared_t angularAcceleration = 0_rad_per_s_sq;
142 bool useCarpetGrain =
false;
143 double carpetGrainMultiplier;
144 bool roughTowardsRed;
145 void CalculateCarpetPose();
153 std::vector<frc::SwerveModuleState> moduleStates;
154 std::vector<frc::SwerveModulePosition> modulePositions;
156 frc::Rotation3d gyroRotation;
157 gyro::Gyro::AngularVelocity3d gyroVelocity;
160 frc::Notifier odometryThread{[
this] { UpdateOdometry(); }};
162 wpi::interpolating_map<double, double> rotationalLerpMap;
164 frc2::sysid::SysIdRoutine sysIdRoutine;