blob: 57b93bb42bf283f00f5abf7c27a1ed001e512477 [file] [log] [blame]
Austin Schuh812d0d12021-11-04 20:16:48 -07001// Copyright (c) FIRST and other WPILib contributors.
2// Open Source Software; you can modify and/or share it under the terms of
3// the WPILib BSD license file in the root directory of this project.
Austin Schuh1e69f942020-11-14 15:06:14 -08004
5#include <gtest/gtest.h>
6
7#include <array>
8
9#include "Eigen/Core"
10#include "frc/StateSpaceUtil.h"
Austin Schuh812d0d12021-11-04 20:16:48 -070011#include "frc/system/NumericalIntegration.h"
Austin Schuh1e69f942020-11-14 15:06:14 -080012
13TEST(StateSpaceUtilTest, MakeMatrix) {
14 // Column vector
Austin Schuh812d0d12021-11-04 20:16:48 -070015 Eigen::Vector<double, 2> mat1 = frc::MakeMatrix<2, 1>(1.0, 2.0);
Austin Schuh1e69f942020-11-14 15:06:14 -080016 EXPECT_NEAR(mat1(0), 1.0, 1e-3);
17 EXPECT_NEAR(mat1(1), 2.0, 1e-3);
18
19 // Row vector
Austin Schuh812d0d12021-11-04 20:16:48 -070020 Eigen::RowVector<double, 2> mat2 = frc::MakeMatrix<1, 2>(1.0, 2.0);
Austin Schuh1e69f942020-11-14 15:06:14 -080021 EXPECT_NEAR(mat2(0), 1.0, 1e-3);
22 EXPECT_NEAR(mat2(1), 2.0, 1e-3);
23
24 // Square matrix
25 Eigen::Matrix<double, 2, 2> mat3 = frc::MakeMatrix<2, 2>(1.0, 2.0, 3.0, 4.0);
26 EXPECT_NEAR(mat3(0, 0), 1.0, 1e-3);
27 EXPECT_NEAR(mat3(0, 1), 2.0, 1e-3);
28 EXPECT_NEAR(mat3(1, 0), 3.0, 1e-3);
29 EXPECT_NEAR(mat3(1, 1), 4.0, 1e-3);
30
31 // Nonsquare matrix with more rows than columns
32 Eigen::Matrix<double, 3, 2> mat4 =
33 frc::MakeMatrix<3, 2>(1.0, 2.0, 3.0, 4.0, 5.0, 6.0);
34 EXPECT_NEAR(mat4(0, 0), 1.0, 1e-3);
35 EXPECT_NEAR(mat4(0, 1), 2.0, 1e-3);
36 EXPECT_NEAR(mat4(1, 0), 3.0, 1e-3);
37 EXPECT_NEAR(mat4(1, 1), 4.0, 1e-3);
38 EXPECT_NEAR(mat4(2, 0), 5.0, 1e-3);
39 EXPECT_NEAR(mat4(2, 1), 6.0, 1e-3);
40
41 // Nonsquare matrix with more columns than rows
42 Eigen::Matrix<double, 2, 3> mat5 =
43 frc::MakeMatrix<2, 3>(1.0, 2.0, 3.0, 4.0, 5.0, 6.0);
44 EXPECT_NEAR(mat5(0, 0), 1.0, 1e-3);
45 EXPECT_NEAR(mat5(0, 1), 2.0, 1e-3);
46 EXPECT_NEAR(mat5(0, 2), 3.0, 1e-3);
47 EXPECT_NEAR(mat5(1, 0), 4.0, 1e-3);
48 EXPECT_NEAR(mat5(1, 1), 5.0, 1e-3);
49 EXPECT_NEAR(mat5(1, 2), 6.0, 1e-3);
50}
51
52TEST(StateSpaceUtilTest, CostParameterPack) {
53 Eigen::Matrix<double, 3, 3> mat = frc::MakeCostMatrix(1.0, 2.0, 3.0);
54 EXPECT_NEAR(mat(0, 0), 1.0, 1e-3);
55 EXPECT_NEAR(mat(0, 1), 0.0, 1e-3);
56 EXPECT_NEAR(mat(0, 2), 0.0, 1e-3);
57 EXPECT_NEAR(mat(1, 0), 0.0, 1e-3);
58 EXPECT_NEAR(mat(1, 1), 1.0 / 4.0, 1e-3);
59 EXPECT_NEAR(mat(1, 2), 0.0, 1e-3);
60 EXPECT_NEAR(mat(0, 2), 0.0, 1e-3);
61 EXPECT_NEAR(mat(1, 2), 0.0, 1e-3);
62 EXPECT_NEAR(mat(2, 2), 1.0 / 9.0, 1e-3);
63}
64
65TEST(StateSpaceUtilTest, CostArray) {
66 Eigen::Matrix<double, 3, 3> mat = frc::MakeCostMatrix<3>({1.0, 2.0, 3.0});
67 EXPECT_NEAR(mat(0, 0), 1.0, 1e-3);
68 EXPECT_NEAR(mat(0, 1), 0.0, 1e-3);
69 EXPECT_NEAR(mat(0, 2), 0.0, 1e-3);
70 EXPECT_NEAR(mat(1, 0), 0.0, 1e-3);
71 EXPECT_NEAR(mat(1, 1), 1.0 / 4.0, 1e-3);
72 EXPECT_NEAR(mat(1, 2), 0.0, 1e-3);
73 EXPECT_NEAR(mat(0, 2), 0.0, 1e-3);
74 EXPECT_NEAR(mat(1, 2), 0.0, 1e-3);
75 EXPECT_NEAR(mat(2, 2), 1.0 / 9.0, 1e-3);
76}
77
78TEST(StateSpaceUtilTest, CovParameterPack) {
79 Eigen::Matrix<double, 3, 3> mat = frc::MakeCovMatrix(1.0, 2.0, 3.0);
80 EXPECT_NEAR(mat(0, 0), 1.0, 1e-3);
81 EXPECT_NEAR(mat(0, 1), 0.0, 1e-3);
82 EXPECT_NEAR(mat(0, 2), 0.0, 1e-3);
83 EXPECT_NEAR(mat(1, 0), 0.0, 1e-3);
84 EXPECT_NEAR(mat(1, 1), 4.0, 1e-3);
85 EXPECT_NEAR(mat(1, 2), 0.0, 1e-3);
86 EXPECT_NEAR(mat(0, 2), 0.0, 1e-3);
87 EXPECT_NEAR(mat(1, 2), 0.0, 1e-3);
88 EXPECT_NEAR(mat(2, 2), 9.0, 1e-3);
89}
90
91TEST(StateSpaceUtilTest, CovArray) {
92 Eigen::Matrix<double, 3, 3> mat = frc::MakeCovMatrix<3>({1.0, 2.0, 3.0});
93 EXPECT_NEAR(mat(0, 0), 1.0, 1e-3);
94 EXPECT_NEAR(mat(0, 1), 0.0, 1e-3);
95 EXPECT_NEAR(mat(0, 2), 0.0, 1e-3);
96 EXPECT_NEAR(mat(1, 0), 0.0, 1e-3);
97 EXPECT_NEAR(mat(1, 1), 4.0, 1e-3);
98 EXPECT_NEAR(mat(1, 2), 0.0, 1e-3);
99 EXPECT_NEAR(mat(0, 2), 0.0, 1e-3);
100 EXPECT_NEAR(mat(1, 2), 0.0, 1e-3);
101 EXPECT_NEAR(mat(2, 2), 9.0, 1e-3);
102}
103
104TEST(StateSpaceUtilTest, WhiteNoiseVectorParameterPack) {
Austin Schuh812d0d12021-11-04 20:16:48 -0700105 Eigen::Vector<double, 2> vec = frc::MakeWhiteNoiseVector(2.0, 3.0);
Austin Schuh1e69f942020-11-14 15:06:14 -0800106 static_cast<void>(vec);
107}
108
109TEST(StateSpaceUtilTest, WhiteNoiseVectorArray) {
Austin Schuh812d0d12021-11-04 20:16:48 -0700110 Eigen::Vector<double, 2> vec = frc::MakeWhiteNoiseVector<2>({2.0, 3.0});
Austin Schuh1e69f942020-11-14 15:06:14 -0800111 static_cast<void>(vec);
112}
113
114TEST(StateSpaceUtilTest, IsStabilizable) {
Austin Schuh812d0d12021-11-04 20:16:48 -0700115 Eigen::Matrix<double, 2, 1> B{0, 1};
Austin Schuh1e69f942020-11-14 15:06:14 -0800116
117 // First eigenvalue is uncontrollable and unstable.
118 // Second eigenvalue is controllable and stable.
Austin Schuh812d0d12021-11-04 20:16:48 -0700119 EXPECT_FALSE((frc::IsStabilizable<2, 1>(
120 Eigen::Matrix<double, 2, 2>{{1.2, 0}, {0, 0.5}}, B)));
Austin Schuh1e69f942020-11-14 15:06:14 -0800121
122 // First eigenvalue is uncontrollable and marginally stable.
123 // Second eigenvalue is controllable and stable.
Austin Schuh812d0d12021-11-04 20:16:48 -0700124 EXPECT_FALSE((frc::IsStabilizable<2, 1>(
125 Eigen::Matrix<double, 2, 2>{{1, 0}, {0, 0.5}}, B)));
Austin Schuh1e69f942020-11-14 15:06:14 -0800126
127 // First eigenvalue is uncontrollable and stable.
128 // Second eigenvalue is controllable and stable.
Austin Schuh812d0d12021-11-04 20:16:48 -0700129 EXPECT_TRUE((frc::IsStabilizable<2, 1>(
130 Eigen::Matrix<double, 2, 2>{{0.2, 0}, {0, 0.5}}, B)));
Austin Schuh1e69f942020-11-14 15:06:14 -0800131
132 // First eigenvalue is uncontrollable and stable.
133 // Second eigenvalue is controllable and unstable.
Austin Schuh812d0d12021-11-04 20:16:48 -0700134 EXPECT_TRUE((frc::IsStabilizable<2, 1>(
135 Eigen::Matrix<double, 2, 2>{{0.2, 0}, {0, 1.2}}, B)));
136}
137
138TEST(StateSpaceUtilTest, IsDetectable) {
139 Eigen::Matrix<double, 1, 2> C{0, 1};
140
141 // First eigenvalue is unobservable and unstable.
142 // Second eigenvalue is observable and stable.
143 EXPECT_FALSE((frc::IsDetectable<2, 1>(
144 Eigen::Matrix<double, 2, 2>{{1.2, 0}, {0, 0.5}}, C)));
145
146 // First eigenvalue is unobservable and marginally stable.
147 // Second eigenvalue is observable and stable.
148 EXPECT_FALSE((frc::IsDetectable<2, 1>(
149 Eigen::Matrix<double, 2, 2>{{1, 0}, {0, 0.5}}, C)));
150
151 // First eigenvalue is unobservable and stable.
152 // Second eigenvalue is observable and stable.
153 EXPECT_TRUE((frc::IsDetectable<2, 1>(
154 Eigen::Matrix<double, 2, 2>{{0.2, 0}, {0, 0.5}}, C)));
155
156 // First eigenvalue is unobservable and stable.
157 // Second eigenvalue is observable and unstable.
158 EXPECT_TRUE((frc::IsDetectable<2, 1>(
159 Eigen::Matrix<double, 2, 2>{{0.2, 0}, {0, 1.2}}, C)));
Austin Schuh1e69f942020-11-14 15:06:14 -0800160}