package com.team254.lib.trajectory;
/**
* PID + Feedforward controller for following a Trajectory.
*
* @author Jared341
*/
public class LegacyTrajectoryFollower {
private double kp_;
private double ki_; // Not currently used, but might be in the future.
private double kd_;
private double kv_;
private double ka_;
private double last_error_;
private double current_heading = 0;
private int current_segment;
private Trajectory profile_;
public String name;
public LegacyTrajectoryFollower(String name) {
this.name = name;
}
public void configure(double kp, double ki, double kd, double kv, double ka) {
kp_ = kp;
ki_ = ki;
kd_ = kd;
kv_ = kv;
ka_ = ka;
}
public void reset() {
last_error_ = 0.0;
current_segment = 0;
}
public void setTrajectory(Trajectory profile) {
profile_ = profile;
}
public double calculate(double distance_so_far) {
if (current_segment < profile_.getNumSegments()) {
Trajectory.Segment segment = profile_.getSegment(current_segment);
double error = segment.pos - distance_so_far;
double output = kp_ * error + kd_ * ((error - last_error_)
/ segment.dt - segment.vel) + (kv_ * segment.vel
+ ka_ * segment.acc);
last_error_ = error;
current_heading = segment.heading;
current_segment++;
return output;
} else {
return 0;
}
}
public double getHeading() {
return current_heading;
}
public boolean isFinishedTrajectory() {
return current_segment >= profile_.getNumSegments();
}
public Trajectory.Segment getCurrentSegment() {
return profile_.getSegment(current_segment);
}
public int getCurrentSegmentNumber() {
return current_segment;
}
public int getNumSegments() {
return profile_.getNumSegments();
}
}