Valkyrie 2026
Loading...
Searching...
No Matches
Differential.h
1#pragma once
2#include <frc/Notifier.h>
3#include <frc/estimator/DifferentialDrivePoseEstimator.h>
4#include <valkyrie/BaseSubsystem.h>
5#include <valkyrie/controllers/BaseController.h>
6#include <valkyrie/drivetrain/differential/Requests.h>
7#include <valkyrie/gyro/Gyro.h>
8#include <valkyrie/util/CoordinateFrames.h>
9#include <valkyrie/util/LockedAccess.h>
10
11namespace valor {
12namespace differential {
13
14class Differential : public BaseSubsystem {
15 public:
16 Differential(std::vector<std::unique_ptr<BaseController>> leftMotors, std::vector<std::unique_ptr<BaseController>> rightMotors,
17 std::unique_ptr<gyro::Gyro> gyro, units::meter_t trackWidth, units::meter_t wheelDiameter);
18
19 FrameWrapper<FieldFrame, frc::Pose2d> GetPose() const { return estimator->GetEstimatedPosition(); }
20
21 FrameWrapper<FieldFrame, frc::Pose2d> GetRawPose() const { return rawEstimator->GetEstimatedPosition(); }
22
23 inline FrameWrapper<FieldFrame, frc::ChassisSpeeds> GetFieldRelativeSpeeds() const { return GetRobotRelativeSpeeds(); }
24
25 FrameWrapper<RobotFrame, frc::ChassisSpeeds> GetRobotRelativeSpeeds() const;
26
27 frc::DifferentialDriveWheelPositions GetWheelPositions() const;
28 frc::DifferentialDriveWheelSpeeds GetWheelSpeeds() const;
29
30 void ApplyRequest(requests::ApplyChassisSpeeds request);
31 void ApplyRequest(requests::ApplyWheelSpeeds request);
32
33 void ResetOdometry(frc::Pose2d pose);
34
35 void StartOdomThread(units::hertz_t freq) { odomThread.StartPeriodic(1 / freq); }
36
37 protected:
38 virtual void UpdateOdometry();
39
40 std::vector<std::unique_ptr<BaseController>> leftMotors;
41 std::vector<std::unique_ptr<BaseController>> rightMotors;
42 std::unique_ptr<gyro::Gyro> gyro;
43
44 private:
45 decltype(1_m / 1_tr) wheelConversion;
46 frc::DifferentialDriveKinematics kinematics;
47 frc::Notifier odomThread{[this] { UpdateOdometry(); }};
48 util::Locked<frc::DifferentialDrivePoseEstimator> rawEstimator{kinematics, gyro->GetRotation().ToRotation2d(), GetWheelPositions().left,
49 GetWheelPositions().right, frc::Pose2d{}};
50
51 protected:
52 util::Locked<frc::DifferentialDrivePoseEstimator> estimator{kinematics, gyro->GetRotation().ToRotation2d(), GetWheelPositions().left,
53 GetWheelPositions().right, frc::Pose2d{}};
54};
55
56} // namespace differential
57} // namespace valor
BaseSubsystem(std::string name)
Construct a new Valor Subsystem object.
Definition BaseSubsystem.h:60
Definition CoordinateFrames.h:139
Definition LockedAccess.h:33
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:122