Valkyrie 2026
Loading...
Searching...
No Matches
Mecanum.h
1#pragma once
2#include <frc/Notifier.h>
3#include <frc/estimator/MecanumDrivePoseEstimator.h>
4#include <valkyrie/BaseSubsystem.h>
5#include <valkyrie/controllers/BaseController.h>
6#include <valkyrie/drivetrain/mecanum/Requests.h>
7#include <valkyrie/gyro/Gyro.h>
8#include <valkyrie/util/CoordinateFrames.h>
9#include <valkyrie/util/LockedAccess.h>
10
11namespace valor {
12namespace mecanum {
13
14class Mecanum : public BaseSubsystem {
15 public:
16 static constexpr int NUM_WHEELS = 4;
17
18 Mecanum(wpi::array<std::pair<std::unique_ptr<BaseController>, frc::Translation2d>, NUM_WHEELS> wheels, std::unique_ptr<gyro::Gyro> gyro,
19 units::meter_t wheelDiameter);
20
21 inline FrameWrapper<FieldFrame, frc::Pose2d> GetPose() const { return estimator->GetEstimatedPosition(); }
22
23 inline FrameWrapper<FieldFrame, frc::Pose2d> GetRawPose() const { return rawEstimator->GetEstimatedPosition(); }
24
25 inline FrameWrapper<FieldFrame, frc::ChassisSpeeds> GetFieldRelativeSpeeds() const { return GetRobotRelativeSpeeds(); }
26
27 FrameWrapper<RobotFrame, frc::ChassisSpeeds> GetRobotRelativeSpeeds() const;
28
29 frc::MecanumDriveWheelPositions GetWheelPositions() const;
30 frc::MecanumDriveWheelSpeeds GetWheelSpeeds() const;
31
32 void ApplyRequest(requests::ApplyChassisSpeeds);
33 void ApplyRequest(requests::ApplyWheelSpeeds);
34
35 void ResetOdometry(frc::Pose2d pose);
36
37 void StartOdomThread(units::hertz_t freq) { odomThread.StartPeriodic(1 / freq); }
38
39 protected:
40 struct Wheels {
41 std::unique_ptr<BaseController> frontLeft;
42 std::unique_ptr<BaseController> frontRight;
43 std::unique_ptr<BaseController> rearLeft;
44 std::unique_ptr<BaseController> rearRight;
45 };
46
47 virtual void UpdateOdometry();
48
49 std::unique_ptr<gyro::Gyro> gyro;
50 Wheels wheels;
51
52 private:
53 frc::MecanumDriveKinematics GenerateKinematics(
54 wpi::array<std::pair<std::unique_ptr<BaseController>, frc::Translation2d>, NUM_WHEELS> wheels);
55
56 decltype(1_m / 1_tr) wheelConversion;
57 frc::MecanumDriveKinematics kinematics;
58 frc::Notifier odomThread{[this] { UpdateOdometry(); }};
59 util::Locked<frc::MecanumDrivePoseEstimator> rawEstimator{kinematics, gyro->GetRotation().ToRotation2d(), GetWheelPositions(),
60 frc::Pose2d{}};
61
62 protected:
63 util::Locked<frc::MecanumDrivePoseEstimator> estimator{kinematics, gyro->GetRotation().ToRotation2d(), GetWheelPositions(),
64 frc::Pose2d{}};
65};
66
67} // namespace mecanum
68} // namespace valor
BaseSubsystem(std::string name)
Construct a new Valor Subsystem object.
Definition BaseSubsystem.h:60
Definition CoordinateFrames.h:139
Definition LockedAccess.h:33
Definition Mecanum.h:40
Request structure for commanding a swerve drivetrain using chassis speeds.
Definition Requests.h:48
Request structure for commanding a swerve drivetrain using explicit module states.
Definition Requests.h:131