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"
16using namespace units::literals;
22 units::Length distance;
26class TrajectoryConfig {
33 TrajectoryConfig(units::Velocity max_velocity, units::Acceleration max_acceleration)
34 : max_velocity_(max_velocity), max_acceleration_(max_acceleration) {}
42 TrajectoryConfig(units::Velocity max_velocity, units::Acceleration max_acceleration,
44 : TrajectoryConfig(max_velocity, max_acceleration) {
45 set_reversed(reversed);
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);
67 TrajectoryConfig(units::Velocity max_velocity, units::Acceleration max_acceleration,
68 const TankKinematics& kinematics)
69 : TrajectoryConfig(max_velocity, max_acceleration) {
70 set_kinematics(kinematics);
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);
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);
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);
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_) {
122 constraints_.push_back(c->clone());
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_) {
143 constraints_.push_back(c->clone());
151 TrajectoryConfig(TrajectoryConfig&&) =
default;
154 TrajectoryConfig& operator=(TrajectoryConfig&&) =
default;
157 void add_event(
const std::string& name, units::Length distance) {
158 events_.push_back({distance, name});
161 void set_start_velocity(units::Velocity start_velocity) { start_velocity_ = start_velocity; }
164 void set_end_velocity(units::Velocity end_velocity) { end_velocity_ = end_velocity; }
167 void set_reversed(
bool reversed) { reversed_ = reversed; }
170 void set_sample_ds(units::Length sample_ds) { sample_ds_ = sample_ds; }
176 void set_error_handler(std::function<
void(
const char*)> handler) {
177 error_handler_ = std::move(handler);
185 template <
typename Constra
int>
186 typename std::enable_if<
187 std::is_base_of<TrajectoryConstraint, typename std::decay<Constraint>::type>::value,
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))));
196 void set_track_width(units::Length track_width, units::Velocity max_wheel_speed,
197 units::Acceleration max_wheel_acceleration) {
203 void set_track_width(units::Length track_width, units::Velocity max_wheel_speed) {
208 void set_track_width(units::Length track_width) {
213 void set_kinematics(
const TankKinematics& kinematics, units::Velocity max_wheel_speed,
214 units::Acceleration max_wheel_acceleration) {
220 void set_kinematics(
const TankKinematics& kinematics, units::Velocity max_wheel_speed) {
230 units::Velocity start_velocity()
const {
return start_velocity_; }
233 units::Velocity end_velocity()
const {
return end_velocity_; }
236 units::Velocity max_velocity()
const {
return max_velocity_; }
239 units::Acceleration max_acceleration()
const {
return max_acceleration_; }
242 units::Length sample_ds()
const {
return sample_ds_; }
245 const std::vector<std::unique_ptr<TrajectoryConstraint>>& constraints()
const {
249 const std::vector<DistanceEvent>& events()
const {
return events_; }
252 bool is_reversed()
const {
return reversed_; }
258 const std::function<void(
const char*)>& error_handler()
const {
return error_handler_; }
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);
284 : config_(max_velocity, max_acceleration) {}
288 config_.set_start_velocity(v);
294 config_.set_end_velocity(v);
300 config_.set_reversed(reversed);
306 config_.set_sample_ds(ds);
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);
320 units::Velocity max_wheel_speed) {
321 config_.set_track_width(track_width, max_wheel_speed);
327 config_.set_track_width(track_width);
334 units::Velocity max_wheel_speed,
335 units::Acceleration max_wheel_acceleration) {
336 config_.set_kinematics(kinematics, max_wheel_speed, max_wheel_acceleration);
343 units::Velocity max_wheel_speed) {
344 config_.set_kinematics(kinematics, max_wheel_speed);
350 config_.set_kinematics(kinematics);
356 config_.set_spline_order(order);
362 config_.set_error_handler(std::move(handler));
367 template <
typename Constra
int>
369 config_.add_constraint(std::forward<Constraint>(constraint));
375 config_.add_event(name, distance);
380 TrajectoryConfig
build() {
return std::move(config_); }
383 TrajectoryConfig config_;
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