Valkyrie 2026
Loading...
Searching...
No Matches
TrajectoryFollower.h
1#pragma once
2
3#include <algorithm>
4#include <cmath>
5#include <functional>
6#include <optional>
7
8#include <choreo/trajectory/SwerveSample.h>
9#include <choreo/trajectory/Trajectory.h>
10#include <frc/Timer.h>
11#include <frc/apriltag/AprilTagFieldLayout.h>
12#include <frc/controller/ProfiledPIDController.h>
13#include <frc/geometry/Pose2d.h>
14#include <frc/geometry/Rotation2d.h>
15#include <frc/kinematics/ChassisSpeeds.h>
16#include <frc/kinematics/SwerveModuleState.h>
17#include <frc2/command/Command.h>
18#include <frc2/command/CommandHelper.h>
19#include <frc2/command/CommandPtr.h>
20#include <frc2/command/Commands.h>
21#include <frc2/command/FunctionalCommand.h>
22#include <frc2/command/SequentialCommandGroup.h>
23#include <units/acceleration.h>
24#include <units/time.h>
25
26#include "valkyrie/Loggable.h"
27#include "valkyrie/WorldAlign.h"
28#include "valkyrie/controllers/BaseController.h"
29#include "valkyrie/controllers/PIDController.h"
30#include "valkyrie/controllers/PIDF.h"
31#include "valkyrie/drivetrain/swerve/Requests.h"
32
33namespace valor {
34
39 units::meters_per_second_squared_t ax;
40 units::meters_per_second_squared_t ay;
41 units::radians_per_second_squared_t alpha;
42};
43
48 units::second_t timestamp;
49 frc::Pose2d pose;
50 frc::ChassisSpeeds speeds;
52};
53
58 public:
59 struct Config {
60 std::function<void(frc::Pose2d)> resetOdom;
61 std::function<void(swerve::requests::ApplyChassisSpeeds)> drive;
62 std::function<frc::Pose2d()> poseGetter;
63 std::function<std::vector<frc::SwerveModuleState>()> swerveStatesGetter;
64 units::meter_t wheelRadius;
65 frc::DCMotor driveMotor;
66 double driveGearing;
67 frc::AprilTagField field = frc::AprilTagField::kDefaultField;
68 };
69
76
80 enum class TrajectoryEndCondition { TIME, POSITION };
81
82 enum class FieldSymmetry { MIRROR, ROTATE };
83
95 static void Register(Config config);
96
107 static frc2::CommandPtr FollowPath(std::optional<choreo::Trajectory<choreo::SwerveSample>> traj,
108 std::optional<TrajectoryEndCondition> end, std::optional<units::meter_t> tol,
109 std::optional<std::function<bool()>> inter, bool isMirrored, bool resetOdom);
116 static void SetPID(WorldAlign::TranslationalPIDF_t x, WorldAlign::TranslationalPIDF_t y, WorldAlign::RotationalPIDF_t rot);
117
118 private:
124 static AutoSwerveState ConvertChoreoSampleIntoSwerveState(choreo::SwerveSample sample);
131 static AutoSwerveState Interop(units::second_t time, std::vector<AutoSwerveState> traj);
139 static frc2::CommandPtr GetFollowCommand(std::optional<choreo::Trajectory<choreo::SwerveSample>> traj, TrajectoryEndCondition end,
140 std::optional<units::meter_t> tol, std::optional<std::function<bool()>> interruption,
141 bool isMirrored);
147 static AutoSwerveState FlipSwerveState(AutoSwerveState state, FieldSymmetry sym);
153 static AutoSwerveState MirrorSwerveState(AutoSwerveState state);
154
155 static bool IsAllianceFlipped();
156
160 static std::unique_ptr<PIDController<units::meter, units::meters_per_second>> xController;
161 static std::unique_ptr<PIDController<units::meter, units::meters_per_second>> yController;
165 static std::unique_ptr<PIDController<units::radian, units::radians_per_second>> rotController;
169 static frc::Timer timer;
170
171 static std::optional<Config> config;
172
173 static std::optional<frc::AprilTagFieldLayout> field;
174
175 static Loggable loggable;
176};
177} // namespace valor
Base helper for publishing and subscribing values to NetworkTables.
Definition Loggable.h:218
static frc2::CommandPtr FollowPath(std::optional< choreo::Trajectory< choreo::SwerveSample > > traj, std::optional< TrajectoryEndCondition > end, std::optional< units::meter_t > tol, std::optional< std::function< bool()> > inter, bool isMirrored, bool resetOdom)
Follows a choreo trajectory.
TrajectoryFollower()=delete
The default constructor where everything is initialized to zero.
TrajectoryEndCondition
Enum to represent the how the trajectory determines that it is finished: time or position.
Definition TrajectoryFollower.h:80
static void SetPID(WorldAlign::TranslationalPIDF_t x, WorldAlign::TranslationalPIDF_t y, WorldAlign::RotationalPIDF_t rot)
Sets a new PIDF config.
static void Register(Config config)
Defines the essential functions for the trajectory follower.
A struct to represent the acceleration swerve state.
Definition TrajectoryFollower.h:38
A struct to represent a swerve state in auto.
Definition TrajectoryFollower.h:47
Definition TrajectoryFollower.h:59
Request structure for commanding a swerve drivetrain using chassis speeds.
Definition Requests.h:49