RIT VEXU Core API
Loading...
Searching...
No Matches
trajectory_config.h
1#pragma once
2
3#include <cstdio>
4#include <functional>
5#include <memory>
6#include <string>
7#include <type_traits>
8#include <utility>
9#include <vector>
10
11#include "core/math/spline/spline_path.h"
12#include "core/math/trajectory/constraints/tank_kinematics_constraint.h"
13#include "core/math/trajectory/constraints/trajectory_constraint.h"
14#include "core/math/units.h"
15
16using namespace units::literals;
17
22 units::Length distance;
23 std::string name;
24};
25
26class TrajectoryConfig {
27 public:
33 TrajectoryConfig(units::Velocity max_velocity, units::Acceleration max_acceleration)
34 : max_velocity_(max_velocity), max_acceleration_(max_acceleration) {}
35
42 TrajectoryConfig(units::Velocity max_velocity, units::Acceleration max_acceleration,
43 bool reversed)
44 : TrajectoryConfig(max_velocity, max_acceleration) {
45 set_reversed(reversed);
46 }
47
55 TrajectoryConfig(units::Velocity max_velocity, units::Acceleration max_acceleration,
56 units::Length track_width)
57 : TrajectoryConfig(max_velocity, max_acceleration) {
58 set_track_width(track_width);
59 }
60
67 TrajectoryConfig(units::Velocity max_velocity, units::Acceleration max_acceleration,
68 const TankKinematics& kinematics)
69 : TrajectoryConfig(max_velocity, max_acceleration) {
70 set_kinematics(kinematics);
71 }
72
81 TrajectoryConfig(units::Velocity max_velocity, units::Acceleration max_acceleration,
82 units::Velocity start_velocity, units::Velocity end_velocity, bool reversed)
83 : TrajectoryConfig(max_velocity, max_acceleration, reversed) {
84 set_start_velocity(start_velocity);
85 set_end_velocity(end_velocity);
86 }
87
91 TrajectoryConfig(units::Velocity max_velocity, units::Acceleration max_acceleration,
92 units::Velocity start_velocity, units::Velocity end_velocity, bool reversed,
93 units::Length track_width)
94 : TrajectoryConfig(max_velocity, max_acceleration, start_velocity, end_velocity, reversed) {
95 set_track_width(track_width);
96 }
97
101 TrajectoryConfig(units::Velocity max_velocity, units::Acceleration max_acceleration,
102 units::Velocity start_velocity, units::Velocity end_velocity, bool reversed,
103 const TankKinematics& kinematics)
104 : TrajectoryConfig(max_velocity, max_acceleration, start_velocity, end_velocity, reversed) {
105 set_kinematics(kinematics);
106 }
107
109 TrajectoryConfig(const TrajectoryConfig& other)
110 : start_velocity_(other.start_velocity_),
111 end_velocity_(other.end_velocity_),
112 max_velocity_(other.max_velocity_),
113 max_acceleration_(other.max_acceleration_),
114 sample_ds_(other.sample_ds_),
115 events_(other.events_),
116 reversed_(other.reversed_),
117 spline_order_(other.spline_order_),
118 error_handler_(other.error_handler_) {
119 constraints_.reserve(other.constraints_.size());
120 for (const std::unique_ptr<TrajectoryConstraint>& c : other.constraints_) {
121 if (c) {
122 constraints_.push_back(c->clone());
123 }
124 }
125 }
126
128 TrajectoryConfig& operator=(const TrajectoryConfig& other) {
129 if (this != &other) {
130 start_velocity_ = other.start_velocity_;
131 end_velocity_ = other.end_velocity_;
132 max_velocity_ = other.max_velocity_;
133 max_acceleration_ = other.max_acceleration_;
134 sample_ds_ = other.sample_ds_;
135 reversed_ = other.reversed_;
136 spline_order_ = other.spline_order_;
137 error_handler_ = other.error_handler_;
138 events_ = other.events_;
139 constraints_.clear();
140 constraints_.reserve(other.constraints_.size());
141 for (const std::unique_ptr<TrajectoryConstraint>& c : other.constraints_) {
142 if (c) {
143 constraints_.push_back(c->clone());
144 }
145 }
146 }
147 return *this;
148 }
149
151 TrajectoryConfig(TrajectoryConfig&&) = default;
152
154 TrajectoryConfig& operator=(TrajectoryConfig&&) = default;
155
157 void add_event(const std::string& name, units::Length distance) {
158 events_.push_back({distance, name});
159 }
160
161 void set_start_velocity(units::Velocity start_velocity) { start_velocity_ = start_velocity; }
162
164 void set_end_velocity(units::Velocity end_velocity) { end_velocity_ = end_velocity; }
165
167 void set_reversed(bool reversed) { reversed_ = reversed; }
168
170 void set_sample_ds(units::Length sample_ds) { sample_ds_ = sample_ds; }
171
173 void set_spline_order(SplinePath::Order order) { spline_order_ = order; }
174
176 void set_error_handler(std::function<void(const char*)> handler) {
177 error_handler_ = std::move(handler);
178 }
179
185 template <typename Constraint>
186 typename std::enable_if<
187 std::is_base_of<TrajectoryConstraint, typename std::decay<Constraint>::type>::value,
188 void>::type
189 add_constraint(Constraint&& constraint) {
190 typedef typename std::decay<Constraint>::type C;
191 constraints_.emplace_back(
192 std::unique_ptr<TrajectoryConstraint>(new C(std::forward<Constraint>(constraint))));
193 }
194
196 void set_track_width(units::Length track_width, units::Velocity max_wheel_speed,
197 units::Acceleration max_wheel_acceleration) {
198 add_constraint(TankKinematicsConstraint(track_width, max_wheel_speed, max_wheel_acceleration));
199 }
200
203 void set_track_width(units::Length track_width, units::Velocity max_wheel_speed) {
204 add_constraint(TankKinematicsConstraint(track_width, max_wheel_speed));
205 }
206
208 void set_track_width(units::Length track_width) {
209 add_constraint(TankKinematicsConstraint(track_width, max_velocity_));
210 }
211
213 void set_kinematics(const TankKinematics& kinematics, units::Velocity max_wheel_speed,
214 units::Acceleration max_wheel_acceleration) {
215 add_constraint(TankKinematicsConstraint(kinematics, max_wheel_speed, max_wheel_acceleration));
216 }
217
220 void set_kinematics(const TankKinematics& kinematics, units::Velocity max_wheel_speed) {
221 add_constraint(TankKinematicsConstraint(kinematics, max_wheel_speed));
222 }
223
225 void set_kinematics(const TankKinematics& kinematics) {
226 add_constraint(TankKinematicsConstraint(kinematics, max_velocity_));
227 }
228
230 units::Velocity start_velocity() const { return start_velocity_; }
231
233 units::Velocity end_velocity() const { return end_velocity_; }
234
236 units::Velocity max_velocity() const { return max_velocity_; }
237
239 units::Acceleration max_acceleration() const { return max_acceleration_; }
240
242 units::Length sample_ds() const { return sample_ds_; }
243
245 const std::vector<std::unique_ptr<TrajectoryConstraint>>& constraints() const {
246 return constraints_;
247 }
248
249 const std::vector<DistanceEvent>& events() const { return events_; }
250
252 bool is_reversed() const { return reversed_; }
253
255 SplinePath::Order spline_order() const { return spline_order_; }
256
258 const std::function<void(const char*)>& error_handler() const { return error_handler_; }
259
260 private:
261 units::Velocity start_velocity_ = 0_inps;
262 units::Velocity end_velocity_ = 0_inps;
263 units::Velocity max_velocity_;
264 units::Acceleration max_acceleration_;
265 units::Length sample_ds_ = 0.5_in;
266 std::vector<std::unique_ptr<TrajectoryConstraint>> constraints_;
267 std::vector<DistanceEvent> events_;
268 bool reversed_ = false;
270 std::function<void(const char*)> error_handler_ = [](const char* message) {
271 std::fprintf(stderr, "%s\n", message);
272 };
273};
274
279 public:
283 TrajectoryConfigBuilder(units::Velocity max_velocity, units::Acceleration max_acceleration)
284 : config_(max_velocity, max_acceleration) {}
285
288 config_.set_start_velocity(v);
289 return *this;
290 }
291
294 config_.set_end_velocity(v);
295 return *this;
296 }
297
299 TrajectoryConfigBuilder& with_reversed(bool reversed = true) {
300 config_.set_reversed(reversed);
301 return *this;
302 }
303
306 config_.set_sample_ds(ds);
307 return *this;
308 }
309
311 TrajectoryConfigBuilder& with_track_width(units::Length track_width,
312 units::Velocity max_wheel_speed,
313 units::Acceleration max_wheel_acceleration) {
314 config_.set_track_width(track_width, max_wheel_speed, max_wheel_acceleration);
315 return *this;
316 }
317
319 TrajectoryConfigBuilder& with_track_width(units::Length track_width,
320 units::Velocity max_wheel_speed) {
321 config_.set_track_width(track_width, max_wheel_speed);
322 return *this;
323 }
324
326 TrajectoryConfigBuilder& with_track_width(units::Length track_width) {
327 config_.set_track_width(track_width);
328 return *this;
329 }
330
334 units::Velocity max_wheel_speed,
335 units::Acceleration max_wheel_acceleration) {
336 config_.set_kinematics(kinematics, max_wheel_speed, max_wheel_acceleration);
337 return *this;
338 }
339
343 units::Velocity max_wheel_speed) {
344 config_.set_kinematics(kinematics, max_wheel_speed);
345 return *this;
346 }
347
350 config_.set_kinematics(kinematics);
351 return *this;
352 }
353
356 config_.set_spline_order(order);
357 return *this;
358 }
359
361 TrajectoryConfigBuilder& with_error_handler(std::function<void(const char*)> handler) {
362 config_.set_error_handler(std::move(handler));
363 return *this;
364 }
365
367 template <typename Constraint>
368 TrajectoryConfigBuilder& with_constraint(Constraint&& constraint) {
369 config_.add_constraint(std::forward<Constraint>(constraint));
370 return *this;
371 }
372
374 TrajectoryConfigBuilder& with_event(const std::string& name, units::Length distance) {
375 config_.add_event(name, distance);
376 return *this;
377 }
378
380 TrajectoryConfig build() { return std::move(config_); }
381
382 private:
383 TrajectoryConfig config_;
384};
Order
Order of spline polynomials used per segment.
Definition spline_path.h:17
@ Quintic
Quintic Hermite splines (C2 continuity).
Definition spline_path.h:19
TankKinematicsConstraint(units::Length track_width, units::Velocity max_speed, units::Acceleration max_acceleration=10000_inps2)
Constructs a TankKinematicsConstraint.
Definition tank_kinematics_constraint.h:24
Helper class that converts a chassis velocity (vx and omega) to left and right wheel velocities for a...
Definition tank_kinematics.h:19
TrajectoryConfigBuilder & with_constraint(Constraint &&constraint)
Adds a custom physical trajectory constraint.
Definition trajectory_config.h:368
TrajectoryConfigBuilder & with_track_width(units::Length track_width, units::Velocity max_wheel_speed, units::Acceleration max_wheel_acceleration)
Configures drivetrain track width kinematics constraint with explicit limits.
Definition trajectory_config.h:311
TrajectoryConfigBuilder & with_start_velocity(units::Velocity v)
Configures initial trajectory velocity.
Definition trajectory_config.h:287
TrajectoryConfigBuilder & with_kinematics(const TankKinematics &kinematics, units::Velocity max_wheel_speed)
Configures drivetrain kinematics constraint using TankKinematics and explicit wheel speed.
Definition trajectory_config.h:342
TrajectoryConfigBuilder & with_track_width(units::Length track_width)
Configures drivetrain track width kinematics constraint.
Definition trajectory_config.h:326
TrajectoryConfigBuilder & with_reversed(bool reversed=true)
Configures reverse driving flag.
Definition trajectory_config.h:299
TrajectoryConfigBuilder & with_kinematics(const TankKinematics &kinematics)
Configures drivetrain kinematics constraint using TankKinematics and default limits.
Definition trajectory_config.h:349
TrajectoryConfigBuilder & with_kinematics(const TankKinematics &kinematics, units::Velocity max_wheel_speed, units::Acceleration max_wheel_acceleration)
Configures drivetrain kinematics constraint using TankKinematics and explicit limits.
Definition trajectory_config.h:333
TrajectoryConfigBuilder & with_error_handler(std::function< void(const char *)> handler)
Configures custom error handler callback.
Definition trajectory_config.h:361
TrajectoryConfigBuilder(units::Velocity max_velocity, units::Acceleration max_acceleration)
Creates a builder with max velocity and max acceleration limits.
Definition trajectory_config.h:283
TrajectoryConfigBuilder & with_spline_order(SplinePath::Order order)
Configures spline order.
Definition trajectory_config.h:355
TrajectoryConfigBuilder & with_event(const std::string &name, units::Length distance)
Adds a distance-triggered event to the trajectory.
Definition trajectory_config.h:374
TrajectoryConfigBuilder & with_sample_ds(units::Length ds)
Configures spatial spline discretization step size.
Definition trajectory_config.h:305
TrajectoryConfigBuilder & with_track_width(units::Length track_width, units::Velocity max_wheel_speed)
Configures drivetrain track width kinematics constraint with explicit wheel speed.
Definition trajectory_config.h:319
TrajectoryConfigBuilder & with_end_velocity(units::Velocity v)
Configures final trajectory velocity.
Definition trajectory_config.h:293
TrajectoryConfig build()
Builds and returns constructed TrajectoryConfig instance.
Definition trajectory_config.h:380
Configuration parameters and constraint container for generating trajectories.
Definition trajectory_config.h:21