RIT VEXU Core API
Loading...
Searching...
No Matches
linear_system.h
1#pragma once
2
3#include "math/eigen_interface.h"
4
5#include "math/systems/discretization.h"
6
16template <int STATES, int INPUTS, int OUTPUTS>
18 public:
19 using MatrixA = EMat<STATES, STATES>;
20 using MatrixB = EMat<STATES, INPUTS>;
21 using MatrixC = EMat<OUTPUTS, STATES>;
22 using MatrixD = EMat<OUTPUTS, INPUTS>;
23
24 using VectorX = EVec<STATES>;
25 using VectorU = EVec<INPUTS>;
26 using VectorY = EVec<OUTPUTS>;
27
36 LinearSystem(const MatrixA &A, const MatrixB &B, const MatrixC &C, const MatrixD &D) : m_Ac(A), m_Bc(B), m_C(C), m_D(D) {}
37
41 MatrixA A() { return m_Ac; }
42
46 MatrixB B() { return m_Bc; }
47
51 const std::tuple<std::tuple<MatrixA, MatrixB>> &discAB(const double &dt) { return discretize_AB(m_Ac, m_Bc, dt); }
52
56 MatrixC C() { return m_C; }
57
61 MatrixD D() { return m_D; }
62
73 VectorX compute_X(const VectorX &x, const VectorU &u, double dt) {
74 // Discretize A and B
75 auto [Ad, Bd] = discretize_AB(m_Ac, m_Bc, dt);
76
77 return Ad * x + Bd * u;
78 }
79
88 VectorY compute_Y(const VectorX &x, const VectorU &u) {
89 return m_C * x + m_D * u;
90 }
91
92 private:
93 // Continuous system matrix
94 MatrixA m_Ac;
95 // Continuous input matrix
96 MatrixB m_Bc;
97 // Output matrix
98 MatrixC m_C;
99 // Feedthrough matrix
100 MatrixD m_D;
101};
VectorX compute_X(const VectorX &x, const VectorU &u, double dt)
Definition linear_system.h:73
MatrixB B()
Definition linear_system.h:46
const std::tuple< std::tuple< MatrixA, MatrixB > > & discAB(const double &dt)
Definition linear_system.h:51
LinearSystem(const MatrixA &A, const MatrixB &B, const MatrixC &C, const MatrixD &D)
Definition linear_system.h:36
MatrixC C()
Definition linear_system.h:56
MatrixD D()
Definition linear_system.h:61
MatrixA A()
Definition linear_system.h:41
VectorY compute_Y(const VectorX &x, const VectorU &u)
Definition linear_system.h:88