RIT VEXU Core API
Loading...
Searching...
No Matches
math/controls/motion_controller.h
1#pragma once
2
3#include <cmath>
4#include <memory>
5
6#include "math/controls/pidff.h"
7#include "math/geometry/rotation2d.h"
8#include "math/math_util.h"
9#include "math/trajectories/trapezoid_profile.h"
10
11namespace core {
12
26 public:
30 typedef struct {
31 PID::pid_config_t pid;
32 Feedforward::feedforward_config_t ff;
35
42 : config_(config),
43 pidff_(config.pid.kP, config.pid.kI, config.pid.kD,
44 config.ff.kS, config.ff.kV, config.ff.kA, config.ff.kG,
45 config.pid.tolerance, config.pid.dt),
46 current_position_(0.0),
47 target_position_(0.0),
48 profile_complete_(true),
49 profile_start_time_(0.0),
50 current_time_(0.0) {
51
52 pidff_.set_i_zone(config.pid.i_zone);
53 pidff_.set_i_limits(config.pid.i_min, config.pid.i_max);
54 pidff_.set_output_limits(config.pid.minimum_output, config.pid.maximum_output);
55
56 if (config.pid.continuous) {
57 pidff_.enable_continuous(config.pid.minimum_input, config.pid.maximum_input);
58 }
59 }
60
68 void set_target(double target_position, double current_position, double current_time) {
69 current_position_ = current_position;
70 target_position_ = target_position;
71 profile_start_time_ = current_time;
72 profile_complete_ = false;
73
74 // create a new trajectory from current position to target
75 profile_ = std::unique_ptr<TrapezoidProfile>(new TrapezoidProfile(
78 config_.profile.v_max,
79 config_.profile.accel,
80 config_.profile.decel
81 ));
82 }
83
92 double calculate(double current_position, double current_time, Rotation2d angle = Rotation2d()) {
93 current_position_ = current_position;
94 current_time_ = current_time;
95
96 if (profile_complete_) {
97 // if the profile is complete just hold position with pid
98 return pidff_.calculate(target_position_, current_position, angle);
99 }
100
101 double profile_time = current_time - profile_start_time_;
102
103 motion_t target_state = profile_->calculate(profile_time);
104
105 // set flag if profile is complete (time wise, not position wise)
106 if (profile_time >= profile_->total_time()) {
107 profile_complete_ = true;
108 }
109
110 // use the profile's velocity and acceleration as feedforward inputs
111 return pidff_.calculate_with_ff(
112 target_state.pos, // target position
113 current_position, // current position
114 target_state.vel, // velocity feedforward
115 target_state.acc, // acceleration feedforward
116 angle // angle for gravity compensation
117 );
118 }
119
125 bool is_profile_complete() const {
126 return profile_complete_;
127 }
128
134 bool at_target() const {
135 return profile_complete_ && pidff_.at_setpoint();
136 }
137
143 double target_position() const {
144 return target_position_;
145 }
146
152 double current_position() const {
153 return current_position_;
154 }
155
162 return pidff_;
163 }
164
171 config_.profile = config;
172 }
173
174 private:
175 motion_controller_config_t config_;
176 PIDFF pidff_;
177 std::unique_ptr<TrapezoidProfile> profile_;
178
179 double current_position_;
180 double target_position_;
181 bool profile_complete_;
182 double profile_start_time_;
183 double current_time_;
184};
185
186} // namespace core
Definition rotation2d.h:25
Definition core/utils/controls/trapezoid_profile.h:25
PIDFF & get_pidff()
Definition math/controls/motion_controller.h:161
MotionController(motion_controller_config_t config)
Definition math/controls/motion_controller.h:41
double target_position() const
Definition math/controls/motion_controller.h:143
double calculate(double current_position, double current_time, Rotation2d angle=Rotation2d())
Definition math/controls/motion_controller.h:92
void set_target(double target_position, double current_position, double current_time)
Definition math/controls/motion_controller.h:68
void set_profile_config(trapezoid_profile_config_t config)
Definition math/controls/motion_controller.h:170
bool is_profile_complete() const
Definition math/controls/motion_controller.h:125
double current_position() const
Definition math/controls/motion_controller.h:152
bool at_target() const
Definition math/controls/motion_controller.h:134
Definition math/controls/pidff.h:26
Definition math/controls/motion_controller.h:30
Definition math/trajectories/trapezoid_profile.h:15