blob: 609d3b111890d230cf57b5caa65bb9d3271bb79c [file] [log] [blame]
Austin Schuhc2b08772018-12-19 18:05:06 +11001#include "frc971/control_loops/drivetrain/spline.h"
2
3namespace frc971 {
4namespace control_loops {
5namespace drivetrain {
6
Austin Schuhb23f5252019-01-13 21:16:23 -08007::Eigen::Matrix<double, 2, 6> Spline4To6(
8 const ::Eigen::Matrix<double, 2, 4> &control_points) {
9 ::Eigen::Matrix<double, 2, 6> new_control_points;
10 // a' = a
11 // b' = (2a + 3b) / 5
12 // c' = (a + 6b + 3c) / 10
13 // d' = (d + 6c + 3b) / 10
14 // e' = (2d + 3c) / 5
15 // f' = d
16 new_control_points.block<2, 1>(0, 0) = control_points.block<2, 1>(0, 0);
17 new_control_points.block<2, 1>(0, 1) =
18 (2.0 * control_points.block<2, 1>(0, 0) +
19 3.0 * control_points.block<2, 1>(0, 1)) /
20 5.0;
21 new_control_points.block<2, 1>(0, 2) =
22 (control_points.block<2, 1>(0, 0) +
23 6.0 * control_points.block<2, 1>(0, 1) +
24 3.0 * control_points.block<2, 1>(0, 2)) /
25 10.0;
26 new_control_points.block<2, 1>(0, 3) =
27 (control_points.block<2, 1>(0, 3) +
28 6.0 * control_points.block<2, 1>(0, 2) +
29 3.0 * control_points.block<2, 1>(0, 1)) /
30 10.0;
31 new_control_points.block<2, 1>(0, 4) =
32 (2.0 * control_points.block<2, 1>(0, 3) +
33 3.0 * control_points.block<2, 1>(0, 2)) /
34 5.0;
35 new_control_points.block<2, 1>(0, 5) = control_points.block<2, 1>(0, 3);
36 return new_control_points;
37}
38
Austin Schuhc2b08772018-12-19 18:05:06 +110039} // namespace drivetrain
40} // namespace control_loops
41} // namespace frc971