TrajoptLib
Library for generating time-optimal trajectories for FRC robots.
Loading...
Searching...
No Matches
trajopt_util.hpp
1// Copyright (c) TrajoptLib contributors
2
3#pragma once
4
5#include <cmath>
6#include <cstddef>
7#include <numbers>
8#include <numeric>
9#include <vector>
10
11namespace trajopt {
12
21inline size_t get_index(const std::vector<size_t>& N, size_t wpt_index,
22 size_t sample_index = 0) {
23 return std::accumulate(N.begin(), N.begin() + wpt_index, size_t{0}) +
24 sample_index;
25}
26
35inline std::vector<double> linspace(double start, double end,
36 size_t num_samples) {
37 std::vector<double> result;
38 double delta = (end - start) / num_samples;
39 for (size_t i = 1; i <= num_samples; ++i) {
40 result.push_back(start + i * delta);
41 }
42 return result;
43}
44
50constexpr double input_modulus(double input, double minimum_input,
51 double maximum_input) {
52 double modulus = maximum_input - minimum_input;
53
54 // Wrap input if it's above the maximum input
55 int numMax = (input - minimum_input) / modulus;
56 input -= numMax * modulus;
57
58 // Wrap input if it's below the minimum input
59 int numMin = (input - maximum_input) / modulus;
60 input -= numMin * modulus;
61
62 return input;
63}
64
68constexpr double angle_modulus(double angle) {
69 return input_modulus(angle, -std::numbers::pi, std::numbers::pi);
70}
71
80inline std::vector<double> angle_linspace(double start, double end,
81 size_t num_samples) {
82 return linspace(start, start + angle_modulus(end - start), num_samples);
83}
84
91inline double calculate_trapezoidal_time(double distance, double velocity,
92 double acceleration) {
93 if (distance > ((velocity * velocity) / acceleration)) {
94 // Velocity profile is shaped like a trapezoid
95 return distance / velocity + velocity / acceleration;
96 } else {
97 // Velocity profile is shaped like a triangle
98 return 2.0 * std::sqrt(distance * acceleration) / acceleration;
99 }
100}
101
102} // namespace trajopt