TrajoptLib
Library for generating time-optimal trajectories for FRC robots.
Loading...
Searching...
No Matches
path_builder.hpp
1// Copyright (c) TrajoptLib contributors
2
3#pragma once
4
5#include <stdint.h>
6
7#include <cassert>
8#include <cstddef>
9#include <functional>
10#include <span>
11#include <utility>
12#include <vector>
13
14#include "trajopt/constraint/angular_velocity_max_magnitude_constraint.hpp"
15#include "trajopt/constraint/lane_constraint.hpp"
16#include "trajopt/constraint/linear_acceleration_max_magnitude_constraint.hpp"
17#include "trajopt/constraint/linear_velocity_direction_constraint.hpp"
18#include "trajopt/constraint/linear_velocity_max_magnitude_constraint.hpp"
19#include "trajopt/constraint/point_at_constraint.hpp"
20#include "trajopt/constraint/point_point_max_constraint.hpp"
21#include "trajopt/constraint/point_point_min_constraint.hpp"
22#include "trajopt/constraint/line_point_constraint.hpp"
23#include "trajopt/constraint/point_line_region_constraint.hpp"
24#include "trajopt/constraint/constraint.hpp"
25#include "trajopt/constraint/pose_equality_constraint.hpp"
26#include "trajopt/constraint/translation_equality_constraint.hpp"
27#include "trajopt/geometry/pose2.hpp"
28#include "trajopt/geometry/translation2.hpp"
29#include "trajopt/path/path.hpp"
30#include "trajopt/util/generate_linear_initial_guess.hpp"
31#include "trajopt/util/generate_spline_initial_guess.hpp"
32#include "trajopt/util/symbol_exports.hpp"
33
34namespace trajopt {
35
40template <typename Drivetrain, typename Solution>
41class TRAJOPT_DLLEXPORT PathBuilder {
42 public:
46 void set_drivetrain(Drivetrain drivetrain) {
47 path.drivetrain = std::move(drivetrain);
48 }
49
57 void set_bumpers(double front, double left, double right, double back) {
58 bumpers.emplace_back(KeepOutRegion{.safety_distance = 0.01,
59 .points = {{+front, +left},
60 {-back, +left},
61 {-back, -right},
62 {+front, -right}}});
63 }
64
69 void set_control_interval_counts(std::vector<size_t>&& counts) {
70 control_interval_counts = std::move(counts);
71 }
72
76 const std::vector<size_t>& get_control_interval_counts() const {
77 return control_interval_counts;
78 }
79
90 void sgmt_initial_guess_points(size_t from_index,
91 std::span<const Pose2d> guess_points) {
92 new_wpts(from_index + 1);
93 std::vector<Pose2d>& to_initial_guess_points =
94 initial_guess_points.at(from_index + 1);
95 to_initial_guess_points.insert(to_initial_guess_points.begin(),
96 guess_points.begin(), guess_points.end());
97 }
98
104 void pose_wpt(size_t index, const Pose2d& pose) {
105 wpt_constraint(index, PoseEqualityConstraint{pose});
106 empty_wpt(index, pose);
107 }
108
115 void translation_wpt(size_t index, const Translation2d& translation,
116 double heading_guess = 0.0) {
117 wpt_constraint(index, TranslationEqualityConstraint{translation});
118 empty_wpt(index, {translation, {heading_guess}});
119 }
120
125 void empty_wpt(size_t index, const Pose2d& pose_guess) {
126 new_wpts(index);
127 initial_guess_points.at(index).back() = pose_guess;
128 }
129
134 void wpt_linear_velocity_direction(size_t index, double angle) {
135 wpt_constraint(index, LinearVelocityDirectionConstraint{angle});
136 }
137
142 void wpt_linear_velocity_max_magnitude(size_t index, double magnitude) {
143 wpt_constraint(index, LinearVelocityMaxMagnitudeConstraint{magnitude});
144 }
145
150 void wpt_angular_velocity_max_magnitude(size_t index, double magnitude) {
151 wpt_constraint(index, AngularVelocityMaxMagnitudeConstraint{magnitude});
152 }
153
158 void wpt_linear_acceleration_max_magnitude(size_t index, double magnitude) {
159 wpt_constraint(index, LinearAccelerationMaxMagnitudeConstraint{magnitude});
160 }
161
168 void wpt_point_at(size_t index, const Translation2d& field_point,
169 double heading_tolerance, bool flip) {
170 wpt_constraint(index,
171 PointAtConstraint{field_point, heading_tolerance, flip});
172 }
173
181 void wpt_keep_in_circle(size_t index, const Translation2d& center,
182 double radius) {
183 for (const auto& bumper : bumpers) {
184 for (const auto& point : bumper.points) {
185 wpt_constraint(index, PointPointMaxConstraint{point, center, radius});
186 }
187 }
188 wpt_constraint(index, PointPointMaxConstraint{{0.0, 0.0}, center, radius});
189 }
190
198 void wpt_keep_in_polygon(size_t index,
199 std::span<Translation2d> field_points) {
200 for (size_t i = 0; i < field_points.size(); ++i) {
201 size_t j = (i + 1) % field_points.size();
202 wpt_constraint(
203 index,
205 {0.0, 0.0}, field_points[i], field_points[j], Side::ABOVE});
206 for (const auto& bumper : bumpers) {
207 for (const auto& corner : bumper.points) {
208 wpt_constraint(
209 index, PointLineRegionConstraint{corner, field_points[i],
210 field_points[j], Side::ABOVE});
211 }
212 }
213 }
214 }
215
224 void wpt_keep_in_lane(size_t index, const Translation2d& center_line_start,
225 const Translation2d& center_line_end,
226 double tolerance) {
227 wpt_constraint(
228 index, LaneConstraint{center_line_start, center_line_end, tolerance});
229 }
230
238 void wpt_keep_out_circle(size_t index, const Translation2d& center,
239 double radius) {
240 for (const auto& bumper : bumpers) {
241 for (size_t i = 0; i < bumper.points.size(); ++i) {
242 size_t j = (i + 1) % bumper.points.size();
243 wpt_constraint(index, PointPointMinConstraint{bumper.points.at(i),
244 center, radius});
245 wpt_constraint(
246 index, LinePointConstraint{bumper.points.at(i), bumper.points.at(j),
247 center, radius});
248 }
249 }
250 }
251
257 void sgmt_linear_velocity_direction(size_t from_index, size_t to_index,
258 double angle) {
259 sgmt_constraint(from_index, to_index,
261 }
262
268 void sgmt_linear_velocity_max_magnitude(size_t from_index, size_t to_index,
269 double magnitude) {
270 sgmt_constraint(from_index, to_index,
272 }
273
280 void sgmt_angular_velocity_max_magnitude(size_t from_index, size_t to_index,
281 double magnitude) {
282 sgmt_constraint(from_index, to_index,
284 }
285
293 size_t to_index,
294 double magnitude) {
295 sgmt_constraint(from_index, to_index,
297 }
298
306 void sgmt_point_at(size_t from_index, size_t to_index,
307 Translation2d field_point, double heading_tolerance,
308 bool flip) {
309 sgmt_constraint(from_index, to_index,
310 PointAtConstraint{field_point, heading_tolerance, flip});
311 }
312
321 void sgmt_keep_in_circle(size_t from_index, size_t to_index,
322 const Translation2d& center, double radius) {
323 for (const auto& bumper : bumpers) {
324 for (size_t i = 0; i < bumper.points.size(); ++i) {
325 sgmt_constraint(
326 from_index, to_index,
327 PointPointMaxConstraint{bumper.points.at(i), center, radius});
328 }
329 }
330 }
331
340 void sgmt_keep_in_polygon(size_t from_index, size_t to_index,
341 std::span<Translation2d> field_points) {
342 for (size_t i = 0; i < field_points.size(); ++i) {
343 size_t j = (i + 1) % field_points.size();
344 sgmt_constraint(
345 from_index, to_index,
347 {0.0, 0.0}, field_points[i], field_points[j], Side::ABOVE});
348 for (const auto& bumper : bumpers) {
349 for (const auto& corner : bumper.points) {
350 sgmt_constraint(
351 from_index, to_index,
352 PointLineRegionConstraint{corner, field_points[i],
353 field_points[j], Side::ABOVE});
354 }
355 }
356 }
357 }
358
368 void sgmt_keep_in_lane(size_t from_index, size_t to_index,
369 const Translation2d& center_line_start,
370 const Translation2d& center_line_end,
371 double tolerance) {
372 sgmt_constraint(
373 from_index, to_index,
374 LaneConstraint{center_line_start, center_line_end, tolerance});
375 }
376
385 void sgmt_keep_out_circle(size_t from_index, size_t to_index,
386 Translation2d center, double radius) {
387 for (const auto& bumper : bumpers) {
388 for (size_t i = 0; i < bumper.points.size(); ++i) {
389 size_t j = (i + 1) % bumper.points.size();
390 sgmt_constraint(
391 from_index, to_index,
392 PointPointMinConstraint{bumper.points.at(i), center, radius});
393 sgmt_constraint(
394 from_index, to_index,
395 LinePointConstraint{bumper.points.at(i), bumper.points.at(j),
396 center, radius});
397 }
398 }
399 }
400
409 const std::function<void(const Solution& solution, int64_t handle)>
410 callback) {
411 path.callbacks.push_back(callback);
412 }
413
418
424 return generate_linear_initial_guess<Solution>(initial_guess_points,
425 control_interval_counts);
426 }
427
433 return generate_spline_initial_guess<Solution>(initial_guess_points,
434 control_interval_counts);
435 }
436
437 private:
444 struct TRAJOPT_DLLEXPORT KeepOutRegion {
446 double safety_distance;
447
449 std::vector<Translation2d> points;
450 };
451
453 Path<Drivetrain, Solution> path;
454
456 std::vector<KeepOutRegion> bumpers;
457
459 std::vector<std::vector<Pose2d>> initial_guess_points;
460
462 std::vector<size_t> control_interval_counts;
463
468 void wpt_constraint(size_t index, const Constraint& constraint) {
469 new_wpts(index);
470 path.waypoints.at(index).waypoint_constraints.push_back(constraint);
471 }
472
478 void sgmt_constraint(size_t from_index, size_t to_index,
479 const Constraint& constraint) {
480 assert(from_index < to_index);
481
482 new_wpts(to_index);
483 path.waypoints.at(from_index).waypoint_constraints.push_back(constraint);
484 for (size_t index = from_index + 1; index <= to_index; ++index) {
485 path.waypoints.at(index).waypoint_constraints.push_back(constraint);
486 path.waypoints.at(index).segment_constraints.push_back(constraint);
487 }
488 }
489
493 void new_wpts(size_t final_index) {
494 if (final_index < path.waypoints.size()) {
495 return;
496 }
497
498 for (size_t i = path.waypoints.size(); i <= final_index; ++i) {
499 path.waypoints.emplace_back();
500 initial_guess_points.emplace_back(std::vector<Pose2d>{{0.0, 0.0, {0.0}}});
501 if (i != 0) {
502 control_interval_counts.push_back(40);
503 }
504 }
505 }
506};
507
508} // namespace trajopt
Angular velocity max magnitude inequality constraint.
Definition angular_velocity_max_magnitude_constraint.hpp:17
Definition lane_constraint.hpp:22
Definition line_point_constraint.hpp:22
Linear acceleration max magnitude inequality constraint.
Definition linear_acceleration_max_magnitude_constraint.hpp:17
Linear velocity direction equality constraint.
Definition linear_velocity_direction_constraint.hpp:15
Linear velocity max magnitude inequality constraint.
Definition linear_velocity_max_magnitude_constraint.hpp:17
Definition path_builder.hpp:41
void wpt_linear_velocity_direction(size_t index, double angle)
Definition path_builder.hpp:134
void empty_wpt(size_t index, const Pose2d &pose_guess)
Definition path_builder.hpp:125
void wpt_keep_in_polygon(size_t index, std::span< Translation2d > field_points)
Definition path_builder.hpp:198
Solution calculate_linear_initial_guess() const
Definition path_builder.hpp:423
void sgmt_keep_in_lane(size_t from_index, size_t to_index, const Translation2d &center_line_start, const Translation2d &center_line_end, double tolerance)
Definition path_builder.hpp:368
void pose_wpt(size_t index, const Pose2d &pose)
Definition path_builder.hpp:104
void sgmt_linear_velocity_direction(size_t from_index, size_t to_index, double angle)
Definition path_builder.hpp:257
void sgmt_keep_out_circle(size_t from_index, size_t to_index, Translation2d center, double radius)
Definition path_builder.hpp:385
void wpt_keep_in_circle(size_t index, const Translation2d &center, double radius)
Definition path_builder.hpp:181
void sgmt_initial_guess_points(size_t from_index, std::span< const Pose2d > guess_points)
Definition path_builder.hpp:90
void sgmt_linear_acceleration_max_magnitude(size_t from_index, size_t to_index, double magnitude)
Definition path_builder.hpp:292
void wpt_keep_out_circle(size_t index, const Translation2d &center, double radius)
Definition path_builder.hpp:238
void wpt_linear_velocity_max_magnitude(size_t index, double magnitude)
Definition path_builder.hpp:142
void sgmt_linear_velocity_max_magnitude(size_t from_index, size_t to_index, double magnitude)
Definition path_builder.hpp:268
void translation_wpt(size_t index, const Translation2d &translation, double heading_guess=0.0)
Definition path_builder.hpp:115
void wpt_point_at(size_t index, const Translation2d &field_point, double heading_tolerance, bool flip)
Definition path_builder.hpp:168
void sgmt_point_at(size_t from_index, size_t to_index, Translation2d field_point, double heading_tolerance, bool flip)
Definition path_builder.hpp:306
const std::vector< size_t > & get_control_interval_counts() const
Definition path_builder.hpp:76
void add_callback(const std::function< void(const Solution &solution, int64_t handle)> callback)
Definition path_builder.hpp:408
Solution calculate_spline_initial_guess() const
Definition path_builder.hpp:432
void wpt_angular_velocity_max_magnitude(size_t index, double magnitude)
Definition path_builder.hpp:150
void set_bumpers(double front, double left, double right, double back)
Definition path_builder.hpp:57
void set_drivetrain(Drivetrain drivetrain)
Definition path_builder.hpp:46
void sgmt_keep_in_polygon(size_t from_index, size_t to_index, std::span< Translation2d > field_points)
Definition path_builder.hpp:340
void sgmt_angular_velocity_max_magnitude(size_t from_index, size_t to_index, double magnitude)
Definition path_builder.hpp:280
void set_control_interval_counts(std::vector< size_t > &&counts)
Definition path_builder.hpp:69
void sgmt_keep_in_circle(size_t from_index, size_t to_index, const Translation2d &center, double radius)
Definition path_builder.hpp:321
void wpt_keep_in_lane(size_t index, const Translation2d &center_line_start, const Translation2d &center_line_end, double tolerance)
Definition path_builder.hpp:224
void wpt_linear_acceleration_max_magnitude(size_t index, double magnitude)
Definition path_builder.hpp:158
Path< Drivetrain, Solution > & get_path()
Definition path_builder.hpp:417
Definition point_at_constraint.hpp:21
Definition point_line_region_constraint.hpp:32
Definition point_point_max_constraint.hpp:21
Definition point_point_min_constraint.hpp:21
Pose equality constraint.
Definition pose_equality_constraint.hpp:15
Translation equality constraint.
Definition translation_equality_constraint.hpp:15
Definition path.hpp:29