blob: f75c6eb8c783767563ef055a96ecdd0c36de5bb3 [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
7// TODO(austin): We are re-computing dpoints a lot here. Figure out how to pass
8// them in.
9double Spline::Theta(double alpha) const {
10 const ::Eigen::Matrix<double, 2, 1> dp = DPoint(alpha);
11 return ::std::atan2(dp(1), dp(0));
12}
13
14double Spline::DTheta(double alpha) const {
15 const ::Eigen::Matrix<double, 2, 1> dp = DPoint(alpha);
16 const ::Eigen::Matrix<double, 2, 1> ddp = DDPoint(alpha);
17 const double dx = dp(0);
18 const double dy = dp(1);
19
20 const double ddx = ddp(0);
21 const double ddy = ddp(1);
22
23 return 1.0 / (::std::pow(dx, 2) + ::std::pow(dy, 2)) * (dx * ddy - dy * ddx);
24}
25
26double Spline::DDTheta(double alpha) const {
27 const ::Eigen::Matrix<double, 2, 1> dp = DPoint(alpha);
28 const ::Eigen::Matrix<double, 2, 1> ddp = DDPoint(alpha);
29 const ::Eigen::Matrix<double, 2, 1> dddp = DDDPoint(alpha);
30 const double dx = dp(0);
31 const double dy = dp(1);
32
33 const double ddx = ddp(0);
34 const double ddy = ddp(1);
35
36 const double dddx = dddp(0);
37 const double dddy = dddp(1);
38
39 const double magdxy2 = ::std::pow(dx, 2) + ::std::pow(dy, 2);
40
41 return -1.0 / (::std::pow(magdxy2, 2)) * (dx * ddy - dy * ddx) * 2.0 *
42 (dy * ddy + dx * ddx) +
43 1.0 / magdxy2 * (dx * dddy - dy * dddx);
44}
45
46} // namespace drivetrain
47} // namespace control_loops
48} // namespace frc971