Brick
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
18/**
19 * @brief Configuration parameters and constraint container for generating trajectories.
20 */
22 units::Length distance;
23 std::string name;
24};
25
27 public:
28 /**
29 * @brief Constructs TrajectoryConfig with maximum velocity and acceleration.
30 * @param max_velocity Maximum physical chassis velocity limit.
31 * @param max_acceleration Maximum physical chassis acceleration limit.
32 */
33 TrajectoryConfig(units::Velocity max_velocity, units::Acceleration max_acceleration)
34 : max_velocity_(max_velocity), max_acceleration_(max_acceleration) {}
35
36 /**
37 * @brief Constructs TrajectoryConfig with max velocity, max acceleration, and direction.
38 * @param max_velocity Max velocity limit.
39 * @param max_acceleration Max acceleration limit.
40 * @param reversed True to generate path in reverse direction.
41 */
43 units::Velocity max_velocity, units::Acceleration max_acceleration, bool reversed
44 )
46 set_reversed(reversed);
47 }
48
49 /**
50 * @brief Constructs TrajectoryConfig with max velocity, max acceleration, and track width
51 * constraint.
52 * @param max_velocity Max velocity limit.
53 * @param max_acceleration Max acceleration limit.
54 * @param track_width Drivetrain track width for kinematics constraints.
55 */
57 units::Velocity max_velocity, units::Acceleration max_acceleration, units::Length track_width
58 )
60 set_track_width(track_width);
61 }
62
63 /**
64 * @brief Constructs TrajectoryConfig with kinematics model constraint.
65 * @param max_velocity Max velocity limit.
66 * @param max_acceleration Max acceleration limit.
67 * @param kinematics Differential drive kinematics model.
68 */
70 units::Velocity max_velocity, units::Acceleration max_acceleration,
71 const TankKinematics& kinematics
72 )
74 set_kinematics(kinematics);
75 }
76
77 /**
78 * @brief Constructs TrajectoryConfig with start/end boundary velocities.
79 * @param max_velocity Max velocity limit.
80 * @param max_acceleration Max acceleration limit.
81 * @param start_velocity Initial trajectory velocity.
82 * @param end_velocity Final trajectory velocity.
83 * @param reversed Direction flag.
84 */
86 units::Velocity max_velocity, units::Acceleration max_acceleration,
87 units::Velocity start_velocity, units::Velocity end_velocity, bool reversed
88 )
90 set_start_velocity(start_velocity);
92 }
93
94 /**
95 * @brief Constructs TrajectoryConfig with full parameters.
96 */
98 units::Velocity max_velocity, units::Acceleration max_acceleration,
99 units::Velocity start_velocity, units::Velocity end_velocity, bool reversed,
100 units::Length track_width
101 )
103 set_track_width(track_width);
104 }
105
106 /**
107 * @brief Constructs TrajectoryConfig with full parameters and kinematics model.
108 */
110 units::Velocity max_velocity, units::Acceleration max_acceleration,
111 units::Velocity start_velocity, units::Velocity end_velocity, bool reversed,
112 const TankKinematics& kinematics
113 )
115 set_kinematics(kinematics);
116 }
117
118 /** @brief Polymorphic deep-copy constructor. */
120 : start_velocity_(other.start_velocity_),
121 end_velocity_(other.end_velocity_),
122 max_velocity_(other.max_velocity_),
123 max_acceleration_(other.max_acceleration_),
124 sample_ds_(other.sample_ds_),
125 events_(other.events_),
126 reversed_(other.reversed_),
127 spline_order_(other.spline_order_),
128 error_handler_(other.error_handler_) {
129 constraints_.reserve(other.constraints_.size());
130 for (const std::unique_ptr<TrajectoryConstraint>& c : other.constraints_) {
131 if (c) {
132 constraints_.push_back(c->clone());
133 }
134 }
135 }
136
137 /** @brief Polymorphic deep-copy assignment operator. */
139 if (this != &other) {
140 start_velocity_ = other.start_velocity_;
141 end_velocity_ = other.end_velocity_;
142 max_velocity_ = other.max_velocity_;
143 max_acceleration_ = other.max_acceleration_;
144 sample_ds_ = other.sample_ds_;
145 reversed_ = other.reversed_;
146 spline_order_ = other.spline_order_;
147 error_handler_ = other.error_handler_;
148 events_ = other.events_;
149 constraints_.clear();
150 constraints_.reserve(other.constraints_.size());
151 for (const std::unique_ptr<TrajectoryConstraint>& c : other.constraints_) {
152 if (c) {
153 constraints_.push_back(c->clone());
154 }
155 }
156 }
157 return *this;
158 }
159
160 /** @brief Move constructor. */
162
163 /** @brief Move assignment. */
165
166 /** @brief Adds an event triggered at a distance along the trajectory. */
167 void add_event(const std::string& name, units::Length distance) {
168 events_.push_back({distance, name});
169 }
170
171 void set_start_velocity(units::Velocity start_velocity) { start_velocity_ = start_velocity; }
172
173 /** @brief Sets final trajectory velocity. */
174 void set_end_velocity(units::Velocity end_velocity) { end_velocity_ = end_velocity; }
175
176 /** @brief Sets direction flag (reversed = true for driving backward). */
177 void set_reversed(bool reversed) { reversed_ = reversed; }
178
179 /** @brief Sets spatial discretization step size for spline sampling. */
180 void set_sample_ds(units::Length sample_ds) { sample_ds_ = sample_ds; }
181
182 /** @brief Sets spline order. */
183 void set_spline_order(SplinePath::Order order) { spline_order_ = order; }
184
185 /** @brief Sets error handler for trajectory generation failures. */
186 void set_error_handler(std::function<void(const char*)> handler) {
187 error_handler_ = std::move(handler);
188 }
189
190 /**
191 * @brief Adds a user-defined TrajectoryConstraint.
192 * @tparam Constraint Constraint class inheriting from TrajectoryConstraint.
193 * @param constraint Constraint instance to add.
194 */
195 template <typename Constraint>
196 typename std::enable_if<
197 std::is_base_of<TrajectoryConstraint, typename std::decay<Constraint>::type>::value,
198 void>::type
199 add_constraint(Constraint&& constraint) {
200 typedef typename std::decay<Constraint>::type C;
201 constraints_.emplace_back(
202 std::unique_ptr<TrajectoryConstraint>(new C(std::forward<Constraint>(constraint)))
203 );
204 }
205
206 /** @brief Adds a TankKinematicsConstraint using track width and explicit wheel limits. */
208 units::Length track_width, units::Velocity max_wheel_speed,
209 units::Acceleration max_wheel_acceleration
210 ) {
211 add_constraint(TankKinematicsConstraint(track_width, max_wheel_speed, max_wheel_acceleration));
212 }
213
214 /** @brief Adds a TankKinematicsConstraint using track width and explicit max wheel speed limit.
215 */
216 void set_track_width(units::Length track_width, units::Velocity max_wheel_speed) {
217 add_constraint(TankKinematicsConstraint(track_width, max_wheel_speed));
218 }
219
220 /** @brief Adds a TankKinematicsConstraint using track width and config max velocity. */
221 void set_track_width(units::Length track_width) {
222 add_constraint(TankKinematicsConstraint(track_width, max_velocity_));
223 }
224
225 /** @brief Adds a TankKinematicsConstraint using TankKinematics and explicit limits. */
227 const TankKinematics& kinematics, units::Velocity max_wheel_speed,
228 units::Acceleration max_wheel_acceleration
229 ) {
230 add_constraint(TankKinematicsConstraint(kinematics, max_wheel_speed, max_wheel_acceleration));
231 }
232
233 /** @brief Adds a TankKinematicsConstraint using TankKinematics and explicit max wheel speed
234 * limit. */
235 void set_kinematics(const TankKinematics& kinematics, units::Velocity max_wheel_speed) {
236 add_constraint(TankKinematicsConstraint(kinematics, max_wheel_speed));
237 }
238
239 /** @brief Adds a TankKinematicsConstraint using TankKinematics and config max velocity. */
240 void set_kinematics(const TankKinematics& kinematics) {
241 add_constraint(TankKinematicsConstraint(kinematics, max_velocity_));
242 }
243
244 /** @return Initial trajectory velocity. */
245 units::Velocity start_velocity() const { return start_velocity_; }
246
247 /** @return Final trajectory velocity. */
248 units::Velocity end_velocity() const { return end_velocity_; }
249
250 /** @return Maximum physical velocity limit. */
251 units::Velocity max_velocity() const { return max_velocity_; }
252
253 /** @return Maximum physical acceleration limit. */
254 units::Acceleration max_acceleration() const { return max_acceleration_; }
255
256 /** @return Spatial sampling step size for path generation. */
257 units::Length sample_ds() const { return sample_ds_; }
258
259 /** @return Vector of polymorphic trajectory constraint pointers. */
260 const std::vector<std::unique_ptr<TrajectoryConstraint>>& constraints() const {
261 return constraints_;
262 }
263
264 const std::vector<DistanceEvent>& events() const { return events_; }
265
266 /** @return True if trajectory is driven in reverse. */
267 bool is_reversed() const { return reversed_; }
268
269 /** @return Spline order used for path generation. */
270 SplinePath::Order spline_order() const { return spline_order_; }
271
272 /** @return Error handler callback. */
273 const std::function<void(const char*)>& error_handler() const { return error_handler_; }
274
275 private:
276 units::Velocity start_velocity_ = 0_inps;
277 units::Velocity end_velocity_ = 0_inps;
278 units::Velocity max_velocity_;
279 units::Acceleration max_acceleration_;
280 units::Length sample_ds_ = 0.5_in;
281 std::vector<std::unique_ptr<TrajectoryConstraint>> constraints_;
282 std::vector<DistanceEvent> events_;
283 bool reversed_ = false;
285 std::function<void(const char*)> error_handler_ = [](const char* message) {
286 std::fprintf(stderr, "%s\n", message);
287 };
288};
289
290/**
291 * @brief Fluent Builder API for constructing TrajectoryConfig instances cleanly.
292 */
294 public:
295 /**
296 * @brief Creates a builder with max velocity and max acceleration limits.
297 */
298 TrajectoryConfigBuilder(units::Velocity max_velocity, units::Acceleration max_acceleration)
299 : config_(max_velocity, max_acceleration) {}
300
301 /** @brief Configures initial trajectory velocity. */
303 config_.set_start_velocity(v);
304 return *this;
305 }
306
307 /** @brief Configures final trajectory velocity. */
309 config_.set_end_velocity(v);
310 return *this;
311 }
312
313 /** @brief Configures reverse driving flag. */
314 TrajectoryConfigBuilder& with_reversed(bool reversed = true) {
315 config_.set_reversed(reversed);
316 return *this;
317 }
318
319 /** @brief Configures spatial spline discretization step size. */
321 config_.set_sample_ds(ds);
322 return *this;
323 }
324
325 /** @brief Configures drivetrain track width kinematics constraint with explicit limits. */
327 units::Length track_width, units::Velocity max_wheel_speed,
328 units::Acceleration max_wheel_acceleration
329 ) {
330 config_.set_track_width(track_width, max_wheel_speed, max_wheel_acceleration);
331 return *this;
332 }
333
334 /** @brief Configures drivetrain track width kinematics constraint with explicit wheel speed. */
336 units::Length track_width, units::Velocity max_wheel_speed
337 ) {
338 config_.set_track_width(track_width, max_wheel_speed);
339 return *this;
340 }
341
342 /** @brief Configures drivetrain track width kinematics constraint. */
343 TrajectoryConfigBuilder& with_track_width(units::Length track_width) {
344 config_.set_track_width(track_width);
345 return *this;
346 }
347
348 /** @brief Configures drivetrain kinematics constraint using TankKinematics and explicit limits.
349 */
351 const TankKinematics& kinematics, units::Velocity max_wheel_speed,
352 units::Acceleration max_wheel_acceleration
353 ) {
354 config_.set_kinematics(kinematics, max_wheel_speed, max_wheel_acceleration);
355 return *this;
356 }
357
358 /** @brief Configures drivetrain kinematics constraint using TankKinematics and explicit wheel
359 * speed. */
361 const TankKinematics& kinematics, units::Velocity max_wheel_speed
362 ) {
363 config_.set_kinematics(kinematics, max_wheel_speed);
364 return *this;
365 }
366
367 /** @brief Configures drivetrain kinematics constraint using TankKinematics and default limits. */
369 config_.set_kinematics(kinematics);
370 return *this;
371 }
372
373 /** @brief Configures spline order. */
375 config_.set_spline_order(order);
376 return *this;
377 }
378
379 /** @brief Configures custom error handler callback. */
380 TrajectoryConfigBuilder& with_error_handler(std::function<void(const char*)> handler) {
381 config_.set_error_handler(std::move(handler));
382 return *this;
383 }
384
385 /** @brief Adds a custom physical trajectory constraint. */
386 template <typename Constraint>
387 TrajectoryConfigBuilder& with_constraint(Constraint&& constraint) {
388 config_.add_constraint(std::forward<Constraint>(constraint));
389 return *this;
390 }
391
392 /** @brief Adds a distance-triggered event to the trajectory. */
393 TrajectoryConfigBuilder& with_event(const std::string& name, units::Length distance) {
394 config_.add_event(name, distance);
395 return *this;
396 }
397
398 /** @brief Builds and returns constructed TrajectoryConfig instance. */
399 TrajectoryConfig build() { return std::move(config_); }
400
401 private:
402 TrajectoryConfig config_;
403};
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:387
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:326
TrajectoryConfigBuilder & with_start_velocity(units::Velocity v)
Configures initial trajectory velocity.
Definition trajectory_config.h:302
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:360
TrajectoryConfigBuilder & with_track_width(units::Length track_width)
Configures drivetrain track width kinematics constraint.
Definition trajectory_config.h:343
TrajectoryConfigBuilder & with_reversed(bool reversed=true)
Configures reverse driving flag.
Definition trajectory_config.h:314
TrajectoryConfigBuilder & with_kinematics(const TankKinematics &kinematics)
Configures drivetrain kinematics constraint using TankKinematics and default limits.
Definition trajectory_config.h:368
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:350
TrajectoryConfigBuilder & with_error_handler(std::function< void(const char *)> handler)
Configures custom error handler callback.
Definition trajectory_config.h:380
TrajectoryConfigBuilder(units::Velocity max_velocity, units::Acceleration max_acceleration)
Creates a builder with max velocity and max acceleration limits.
Definition trajectory_config.h:298
TrajectoryConfigBuilder & with_spline_order(SplinePath::Order order)
Configures spline order.
Definition trajectory_config.h:374
TrajectoryConfigBuilder & with_event(const std::string &name, units::Length distance)
Adds a distance-triggered event to the trajectory.
Definition trajectory_config.h:393
TrajectoryConfigBuilder & with_sample_ds(units::Length ds)
Configures spatial spline discretization step size.
Definition trajectory_config.h:320
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:335
TrajectoryConfigBuilder & with_end_velocity(units::Velocity v)
Configures final trajectory velocity.
Definition trajectory_config.h:308
TrajectoryConfig build()
Builds and returns constructed TrajectoryConfig instance.
Definition trajectory_config.h:399
Definition trajectory_config.h:26
TrajectoryConfig(units::Velocity max_velocity, units::Acceleration max_acceleration, units::Length track_width)
Constructs TrajectoryConfig with max velocity, max acceleration, and track width constraint.
Definition trajectory_config.h:56
void set_kinematics(const TankKinematics &kinematics)
Adds a TankKinematicsConstraint using TankKinematics and config max velocity.
Definition trajectory_config.h:240
void set_track_width(units::Length track_width, units::Velocity max_wheel_speed)
Adds a TankKinematicsConstraint using track width and explicit max wheel speed limit.
Definition trajectory_config.h:216
void set_kinematics(const TankKinematics &kinematics, units::Velocity max_wheel_speed, units::Acceleration max_wheel_acceleration)
Adds a TankKinematicsConstraint using TankKinematics and explicit limits.
Definition trajectory_config.h:226
units::Acceleration max_acceleration() const
Definition trajectory_config.h:254
TrajectoryConfig(units::Velocity max_velocity, units::Acceleration max_acceleration)
Constructs TrajectoryConfig with maximum velocity and acceleration.
Definition trajectory_config.h:33
TrajectoryConfig & operator=(TrajectoryConfig &&)=default
Move assignment.
TrajectoryConfig(TrajectoryConfig &&)=default
Move constructor.
void set_kinematics(const TankKinematics &kinematics, units::Velocity max_wheel_speed)
Adds a TankKinematicsConstraint using TankKinematics and explicit max wheel speed limit.
Definition trajectory_config.h:235
TrajectoryConfig(units::Velocity max_velocity, units::Acceleration max_acceleration, units::Velocity start_velocity, units::Velocity end_velocity, bool reversed, const TankKinematics &kinematics)
Constructs TrajectoryConfig with full parameters and kinematics model.
Definition trajectory_config.h:109
TrajectoryConfig(units::Velocity max_velocity, units::Acceleration max_acceleration, units::Velocity start_velocity, units::Velocity end_velocity, bool reversed)
Constructs TrajectoryConfig with start/end boundary velocities.
Definition trajectory_config.h:85
void set_spline_order(SplinePath::Order order)
Sets spline order.
Definition trajectory_config.h:183
const std::function< void(const char *)> & error_handler() const
Definition trajectory_config.h:273
units::Velocity start_velocity() const
Definition trajectory_config.h:245
TrajectoryConfig(const TrajectoryConfig &other)
Polymorphic deep-copy constructor.
Definition trajectory_config.h:119
const std::vector< std::unique_ptr< TrajectoryConstraint > > & constraints() const
Definition trajectory_config.h:260
void set_track_width(units::Length track_width, units::Velocity max_wheel_speed, units::Acceleration max_wheel_acceleration)
Adds a TankKinematicsConstraint using track width and explicit wheel limits.
Definition trajectory_config.h:207
TrajectoryConfig & operator=(const TrajectoryConfig &other)
Polymorphic deep-copy assignment operator.
Definition trajectory_config.h:138
TrajectoryConfig(units::Velocity max_velocity, units::Acceleration max_acceleration, units::Velocity start_velocity, units::Velocity end_velocity, bool reversed, units::Length track_width)
Constructs TrajectoryConfig with full parameters.
Definition trajectory_config.h:97
units::Velocity end_velocity() const
Definition trajectory_config.h:248
SplinePath::Order spline_order() const
Definition trajectory_config.h:270
units::Length sample_ds() const
Definition trajectory_config.h:257
void set_error_handler(std::function< void(const char *)> handler)
Sets error handler for trajectory generation failures.
Definition trajectory_config.h:186
units::Velocity max_velocity() const
Definition trajectory_config.h:251
TrajectoryConfig(units::Velocity max_velocity, units::Acceleration max_acceleration, const TankKinematics &kinematics)
Constructs TrajectoryConfig with kinematics model constraint.
Definition trajectory_config.h:69
void set_sample_ds(units::Length sample_ds)
Sets spatial discretization step size for spline sampling.
Definition trajectory_config.h:180
void set_reversed(bool reversed)
Sets direction flag (reversed = true for driving backward).
Definition trajectory_config.h:177
void set_end_velocity(units::Velocity end_velocity)
Sets final trajectory velocity.
Definition trajectory_config.h:174
void set_track_width(units::Length track_width)
Adds a TankKinematicsConstraint using track width and config max velocity.
Definition trajectory_config.h:221
std::enable_if< std::is_base_of< TrajectoryConstraint, typenamestd::decay< Constraint >::type >::value, void >::type add_constraint(Constraint &&constraint)
Adds a user-defined TrajectoryConstraint.
Definition trajectory_config.h:199
TrajectoryConfig(units::Velocity max_velocity, units::Acceleration max_acceleration, bool reversed)
Constructs TrajectoryConfig with max velocity, max acceleration, and direction.
Definition trajectory_config.h:42
void add_event(const std::string &name, units::Length distance)
Adds an event triggered at a distance along the trajectory.
Definition trajectory_config.h:167
bool is_reversed() const
Definition trajectory_config.h:267
Definition units.h:691
Configuration parameters and constraint container for generating trajectories.
Definition trajectory_config.h:21