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