Add TrapezoidProfile example (#1814)

This commit is contained in:
Tyler Veness
2019-08-16 22:03:44 -07:00
committed by Peter Johnson
parent 8f386f6bb3
commit a216b9e9ee
5 changed files with 168 additions and 0 deletions

View File

@@ -0,0 +1,56 @@
/*----------------------------------------------------------------------------*/
/* Copyright (c) 2019 FIRST. All Rights Reserved. */
/* Open Source Software - may be modified and shared by FRC teams. The code */
/* must be accompanied by the FIRST BSD license file in the root directory of */
/* the project. */
/*----------------------------------------------------------------------------*/
#include <frc/Encoder.h>
#include <frc/Joystick.h>
#include <frc/Spark.h>
#include <frc/TimedRobot.h>
#include <frc/controller/PIDController.h>
#include <frc/trajectory/TrapezoidProfile.h>
class Robot : public frc::TimedRobot {
public:
static constexpr units::second_t kDt = 20_ms;
Robot() { m_encoder.SetDistancePerPulse(1.0 / 360.0 * 2.0 * 3.1415 * 1.5); }
void TeleopPeriodic() override {
if (m_joystick.GetRawButtonPressed(2)) {
m_goal = {5_m, 0_mps};
} else if (m_joystick.GetRawButtonPressed(3)) {
m_goal = {0_m, 0_mps};
}
// Create a motion profile with the given maximum velocity and maximum
// acceleration constraints for the next setpoint, the desired goal, and the
// current setpoint.
frc::TrapezoidProfile profile{m_constraints, m_goal, m_setpoint};
// Retrieve the profiled setpoint for the next timestep. This setpoint moves
// toward the goal while obeying the constraints.
m_setpoint = profile.Calculate(kDt);
// Run controller with profiled setpoint and update motor output
double output = m_controller.Calculate(m_encoder.GetDistance(),
m_setpoint.position.to<double>());
m_motor.Set(output);
}
private:
frc::Joystick m_joystick{1};
frc::Encoder m_encoder{1, 2};
frc::Spark m_motor{1};
frc2::PIDController m_controller{1.3, 0.0, 0.7, kDt.to<double>()};
frc::TrapezoidProfile::Constraints m_constraints{1.75_mps, 0.75_mps_sq};
frc::TrapezoidProfile::State m_goal;
frc::TrapezoidProfile::State m_setpoint;
};
#ifndef RUNNING_FRC_TESTS
int main() { return frc::StartRobot<Robot>(); }
#endif

View File

@@ -166,6 +166,18 @@
"foldername": "PotentiometerPID",
"gradlebase": "cpp"
},
{
"name": "Elevator with trapezoid profiled PID",
"description": "An example to demonstrate the use of an encoder and trapezoid profiled PID control to reach elevator position setpoints.",
"tags": [
"Digital",
"Sensors",
"Actuators",
"Joystick"
],
"foldername": "ElevatorTrapezoidProfile",
"gradlebase": "cpp"
},
{
"name": "Getting Started",
"description": "An example program which demonstrates the simplest autonomous and teleoperated routines.",