FRC Paradigm Shift #1259
Documentation for the 2021 Robot
SwerveControllerCommand2.inc
Go to the documentation of this file.
1 // Copyright (c) FIRST and other WPILib contributors.
2 // Open Source Software; you can modify and/or share it under the terms of
3 // the WPILib BSD license file in the root directory of this project.
4 
5 //#pragma once
6 
7 #include <memory>
8 #include <utility>
9 
11 
12 namespace frc2 {
13 
14 template <size_t NumModules>
16  frc::Trajectory trajectory, std::function<frc::Pose2d()> pose,
17  frc::SwerveDriveKinematics<NumModules> kinematics,
18  frc2::PIDController xController, frc2::PIDController yController,
19  frc::ProfiledPIDController<units::radians> thetaController,
20  std::function<frc::Rotation2d()> desiredRotation,
21  std::function<void(std::array<frc::SwerveModuleState, NumModules>)> output,
22  std::initializer_list<Subsystem*> requirements)
23  : m_trajectory(std::move(trajectory)),
24  m_pose(std::move(pose)),
25  m_kinematics(kinematics),
26  m_controller(xController, yController, thetaController),
27  m_desiredRotation(std::move(desiredRotation)),
28  m_outputStates(output)
29 {
30  this->AddRequirements(requirements);
31 }
32 
33 template <size_t NumModules>
35  frc::Trajectory trajectory, std::function<frc::Pose2d()> pose,
36  frc::SwerveDriveKinematics<NumModules> kinematics,
37  frc2::PIDController xController, frc2::PIDController yController,
38  frc::ProfiledPIDController<units::radians> thetaController,
39  std::function<void(std::array<frc::SwerveModuleState, NumModules>)> output,
40  std::initializer_list<Subsystem*> requirements)
41  : m_trajectory(std::move(trajectory)),
42  m_pose(std::move(pose)),
43  m_kinematics(kinematics),
44  m_controller(xController, yController, thetaController),
45  m_outputStates(output)
46 {
47  this->AddRequirements(requirements);
48  m_desiredRotation = [&] {
49  return m_trajectory.States().back().pose.Rotation();
50  };
51 }
52 
53 template <size_t NumModules>
55  frc::Trajectory trajectory, std::function<frc::Pose2d()> pose,
56  frc::SwerveDriveKinematics<NumModules> kinematics,
57  frc2::PIDController xController, frc2::PIDController yController,
58  frc::ProfiledPIDController<units::radians> thetaController,
59  std::function<frc::Rotation2d()> desiredRotation,
60  std::function<void(std::array<frc::SwerveModuleState, NumModules>)> output,
61  wpi::ArrayRef<Subsystem*> requirements)
62  : m_trajectory(std::move(trajectory)),
63  m_pose(std::move(pose)),
64  m_kinematics(kinematics),
65  m_controller(xController, yController, thetaController),
66  m_desiredRotation(std::move(desiredRotation)),
67  m_outputStates(output)
68 {
69  this->AddRequirements(requirements);
70 }
71 
72 template <size_t NumModules>
74  frc::Trajectory trajectory, std::function<frc::Pose2d()> pose,
75  frc::SwerveDriveKinematics<NumModules> kinematics,
76  frc2::PIDController xController, frc2::PIDController yController,
77  frc::ProfiledPIDController<units::radians> thetaController,
78  std::function<void(std::array<frc::SwerveModuleState, NumModules>)> output,
79  wpi::ArrayRef<Subsystem*> requirements)
80  : m_trajectory(std::move(trajectory)),
81  m_pose(std::move(pose)),
82  m_kinematics(kinematics),
83  m_controller(xController, yController, thetaController),
84  m_outputStates(output)
85 {
86  this->AddRequirements(requirements);
87  m_desiredRotation = [&] {
88  return m_trajectory.States().back().pose.Rotation();
89  };
90 }
91 
92 template <size_t NumModules>
94  m_timer.Reset();
95  m_timer.Start();
96 }
97 
98 template <size_t NumModules>
100  auto curTime = units::second_t(m_timer.Get());
101  auto m_desiredState = m_trajectory.Sample(curTime);
102 
103  //auto targetChassisSpeeds = m_controller.Calculate(m_pose(), m_desiredState, m_desiredRotation());
104  auto targetChassisSpeeds = m_controller.Calculate(m_pose(), m_desiredState, m_desiredState.pose.Rotation());
105  //printf("t=%.3f desired x=%.3f y=%.3f Rot=%.3f ", curTime.to<double>(), m_desiredState.pose.X().to<double>(), m_desiredState.pose.Y().to<double>(), m_desiredState.pose.Rotation().Degrees().to<double>());
106  // printf("odometr x %.3f y %.3f Rot %.3f\n", m_pose().X().to<double>(), m_pose().Y().to<double>(), m_pose().Rotation().Degrees().to<double>());
107  // double err_x = m_desiredState.pose.X().to<double>() - m_pose().X().to<double>();
108  // double err_y = m_desiredState.pose.Y().to<double>() - m_pose().Y().to<double>();
109  // double err_theta = m_desiredState.pose.Rotation().Degrees().to<double>() - m_pose().Rotation().Degrees().to<double>();
110  //printf("speed_cmd=%.3f, x err=%.3f, y err=%.3f, theta err=%.3f\n", m_desiredState.velocity, err_x, err_y, err_theta);
111 
112  auto targetModuleStates = m_kinematics.ToSwerveModuleStates(targetChassisSpeeds);
113 
114  m_outputStates(targetModuleStates);
115 }
116 
117 template <size_t NumModules>
118 void SwerveControllerCommand2<NumModules>::End(bool interrupted) {
119  m_timer.Stop();
120 }
121 
122 template <size_t NumModules>
124  return m_timer.HasElapsed(m_trajectory.TotalTime());
125 }
126 
127 } // namespace frc2
STL namespace.
frc::HolonomicDriveController m_controller
std::function< void(std::array< frc::SwerveModuleState, NumModules >)> m_outputStates
std::function< frc::Pose2d()> m_pose
std::function< frc::Rotation2d()> m_desiredRotation
SwerveControllerCommand2(frc::Trajectory trajectory, std::function< frc::Pose2d()> pose, frc::SwerveDriveKinematics< NumModules > kinematics, frc2::PIDController xController, frc2::PIDController yController, frc::ProfiledPIDController< units::radians > thetaController, std::function< frc::Rotation2d()> desiredRotation, std::function< void(std::array< frc::SwerveModuleState, NumModules >)> output, std::initializer_list< Subsystem * > requirements)
void End(bool interrupted) override
frc::SwerveDriveKinematics< NumModules > m_kinematics