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