YAMS
Yet Another Mechanism System
Loading...
Searching...
No Matches
SwerveModuleConfig.hpp
Go to the documentation of this file.
1// Copyright (c) 2026 Yet Another Software Suite
2// SPDX-License-Identifier: LGPL-3.0-or-later
3
4#pragma once
5
6#include <any>
7#include <functional>
8#include <optional>
9#include <string>
10#include <wpi/math/geometry/Rotation2d.hpp>
11#include <wpi/math/geometry/Translation2d.hpp>
12#include <wpi/math/kinematics/SwerveModuleVelocity.hpp>
13#include <wpi/units/angle.hpp>
14#include <wpi/units/length.hpp>
15#include <wpi/units/velocity.hpp>
16
22
24
31 public:
33
34 SwerveModuleConfig() = default;
35
44
45 // ---- Builder methods -------------------------------------------------------
46
57
67
74 SwerveModuleConfig& WithAbsoluteEncoder(std::function<wpi::units::degree_t()> supplier);
75
86
96 SwerveModuleConfig& WithCouplingRatio(std::optional<gearing::GearBox> couplingRatio);
97
104 SwerveModuleConfig& WithCouplingRatio(double driveMotorRotationsPerAzimuthRotation);
105
114 wpi::units::meter_t left);
115
123
131 SwerveModuleConfig& WithAbsoluteEncoderOffset(wpi::units::degree_t offset);
132
140 SwerveModuleConfig& WithLocation(wpi::math::Translation2d location);
141
149 SwerveModuleConfig& WithLocation(wpi::units::meter_t front, wpi::units::meter_t left);
150
158 SwerveModuleConfig& WithLocation(wpi::units::meter_t distance, wpi::units::degree_t angle);
159
166 SwerveModuleConfig& WithWheelRadius(wpi::units::meter_t radius);
167
174 SwerveModuleConfig& WithWheelDiameter(wpi::units::meter_t diameter);
175
185 SwerveModuleConfig& WithVelocityDeadband(std::optional<wpi::units::meters_per_second_t> speed);
186
194
202 SwerveModuleConfig& WithTelemetry(const std::string& name, TelemetryVerbosity verbosity);
203
212 SwerveModuleConfig& WithTelemetry(const std::string& name,
214
215 // ---- Getters ---------------------------------------------------------------
216
219
222
224 std::optional<std::string> GetTelemetryName() const;
225
227 std::optional<TelemetryVerbosity> GetTelemetryVerbosity() const;
228
230 std::optional<wpi::math::Translation2d> GetLocation() const;
231
234
242 wpi::units::degree_t GetAbsoluteEncoderAngle() const;
243
252 std::function<wpi::units::degree_t()> GetRawAbsoluteEncoderAngle() const;
253
255 std::optional<std::function<wpi::units::degree_t()>> GetAbsoluteEncoderSupplier() const;
256
265 std::optional<telemetry::SwerveModuleTelemetryConfig> GetSwerveModuleTelemetryConfig();
266
274 wpi::math::SwerveModuleVelocity GetOptimizedState(wpi::math::SwerveModuleVelocity state) const;
275
283 wpi::math::SwerveModuleVelocity GetOptimizedState(
284 wpi::math::SwerveModuleVelocity state,
285 const swerve::SwerveModuleVelocityWithAzimuth& measured) const;
286
294 double GetCosineCompensationScalar(wpi::math::Rotation2d desiredAngle) const;
295
297 std::optional<gearing::GearBox> GetCouplingRatio() const;
298
309 wpi::math::SwerveModuleVelocity GetLockedState(wpi::math::Rotation2d angle) const;
310
319 wpi::math::SwerveModuleVelocity GetLockedState(
320 wpi::math::Rotation2d angle, const swerve::SwerveModuleVelocityWithAzimuth& measured) const;
321
322 private:
323 motorcontrollers::SmartMotorController* m_driveMotor{nullptr};
324 motorcontrollers::SmartMotorController* m_azimuthMotor{nullptr};
325 std::optional<std::string> m_telemetryName;
326 std::optional<TelemetryVerbosity> m_telemetryVerbosity;
327 std::optional<telemetry::SwerveModuleTelemetryConfig> m_specifiedTelemetryConfig;
328 std::optional<std::function<wpi::units::degree_t()>> m_absoluteEncoderSupplier;
329 std::optional<wpi::units::degree_t> m_absoluteEncoderOffset;
330 gearing::GearBox m_absoluteEncoderGearbox{1.0};
331 bool m_stateOptimization{true};
332 bool m_cosineCompensation{false};
333 std::optional<gearing::GearBox> m_couplingRatio;
334 std::any m_absoluteEncoder;
335 std::optional<wpi::units::meters_per_second_t> m_velocityDeadband{
336 wpi::units::meters_per_second_t{0.1}};
338 mutable std::optional<wpi::math::Rotation2d> m_lastCommandedAngle;
339 std::optional<wpi::math::Translation2d> m_location;
340 std::optional<wpi::units::meter_t> m_wheelCircumference;
341
350 double GetCosineCompensatedVelocity(const wpi::math::SwerveModuleVelocity& desiredState,
351 const wpi::math::Rotation2d& currentAngle) const;
352
357 wpi::math::Rotation2d GetAzimuthAngle() const;
358
360 swerve::SwerveModuleVelocityWithAzimuth GetMeasuredAzimuth() const;
361
374 static wpi::math::SwerveModuleVelocity Optimize(
375 wpi::math::SwerveModuleVelocity desired, const wpi::math::Rotation2d& currentAngle,
376 const std::optional<wpi::math::Rotation2d>& lastCommanded);
377};
378
379} // namespace yams::mechanisms::config
Definition GearBox.hpp:19
Definition SwerveModuleConfig.hpp:30
SwerveModuleConfig & WithLocation(wpi::units::meter_t front, wpi::units::meter_t left)
SwerveModuleConfig & WithAbsoluteEncoderOffset(wpi::units::degree_t offset)
SwerveModuleConfig & WithWheelRadius(wpi::units::meter_t radius)
std::optional< gearing::GearBox > GetCouplingRatio() const
wpi::units::degree_t GetAbsoluteEncoderAngle() const
SwerveModuleConfig & WithLocation(wpi::units::meter_t distance, wpi::units::degree_t angle)
wpi::math::SwerveModuleVelocity GetLockedState(wpi::math::Rotation2d angle) const
SwerveModuleConfig & WithVelocityDeadband(std::optional< wpi::units::meters_per_second_t > speed)
std::optional< std::string > GetTelemetryName() const
SwerveModuleConfig & WithDistanceFromCenterOfRotation(wpi::units::meter_t front, wpi::units::meter_t left)
SwerveModuleConfig(motorcontrollers::SmartMotorController *drive, motorcontrollers::SmartMotorController *azimuth)
motorcontrollers::SmartMotorController * GetDriveMotor() const
wpi::math::SwerveModuleVelocity GetLockedState(wpi::math::Rotation2d angle, const swerve::SwerveModuleVelocityWithAzimuth &measured) const
double GetCosineCompensationScalar(wpi::math::Rotation2d desiredAngle) const
SwerveModuleConfig & WithSmartMotorController(motorcontrollers::SmartMotorController *driveMotor, motorcontrollers::SmartMotorController *azimuthMotor)
wpi::math::SwerveModuleVelocity GetOptimizedState(wpi::math::SwerveModuleVelocity state, const swerve::SwerveModuleVelocityWithAzimuth &measured) const
SwerveModuleConfig & WithCouplingRatio(std::optional< gearing::GearBox > couplingRatio)
std::optional< std::function< wpi::units::degree_t()> > GetAbsoluteEncoderSupplier() const
SwerveModuleConfig & WithCouplingRatio(double driveMotorRotationsPerAzimuthRotation)
motorcontrollers::SmartMotorController * GetAzimuthMotor() const
SwerveModuleConfig & WithAbsoluteEncoderGearing(const gearing::GearBox &gearing)
SwerveModuleConfig & WithAbsoluteEncoder(std::function< wpi::units::degree_t()> supplier)
wpi::math::SwerveModuleVelocity GetOptimizedState(wpi::math::SwerveModuleVelocity state) const
SwerveModuleConfig & WithCosineCompensation(bool compensate)
std::optional< telemetry::SwerveModuleTelemetryConfig > GetSwerveModuleTelemetryConfig()
SwerveModuleConfig & WithExternalAbsoluteEncoder(std::any absoluteEncoder)
std::optional< TelemetryVerbosity > GetTelemetryVerbosity() const
SwerveModuleConfig & WithTelemetry(const std::string &name, TelemetryVerbosity verbosity)
SwerveModuleConfig & WithLocation(wpi::math::Translation2d location)
SwerveModuleConfig & WithTelemetry(const std::string &name, telemetry::SwerveModuleTelemetryConfig telemetryConfig)
std::optional< wpi::math::Translation2d > GetLocation() const
SwerveModuleConfig & WithOptimization(bool enable)
SwerveModuleConfig & WithWheelDiameter(wpi::units::meter_t diameter)
std::function< wpi::units::degree_t()> GetRawAbsoluteEncoderAngle() const
TelemetryVerbosity
Definition SmartMotorControllerConfig.hpp:72
Definition SmartMotorController.hpp:48
Definition SwerveModuleTelemetryConfig.hpp:37
Definition ArmConfig.hpp:17
Definition SwerveModuleVelocityWithAzimuth.hpp:19