8#include "akreon/linalg/assert.hpp"
12#include "akreon/convex/convex_problem.hpp"
13#include "akreon/convex/intersection.hpp"
14#include "akreon/convex/sets/lmi.hpp"
15#include "akreon/convex/variable.hpp"
16#include "akreon/linalg/operator/matrix_inverse.hpp"
17#include "akreon/linalg/operator/matrix_pencil.hpp"
43template <ContinuousPlantModelLike ObsModel>
46 using Model = linalg::remove_cvref_t<ObsModel>;
54 using QMat = linalg::Matrix<T, StateDim, StateDim>;
55 using WMat = linalg::Matrix<T, StateDim, OutputDim>;
56 using LMat = linalg::Matrix<T, StateDim, OutputDim>;
63 using ZSpace = linalg::RowVector<T, ZDim>;
64 using Fs = linalg::Vector<FMat, ZDim>;
74 template <convex::AtomLike ZVar>
88 template <convex::AtomLike ZVar>
91 static_assert(convex::is_var_type_v<ZVar>,
"Input atom is not a var");
92 using ZDom = convex::meta_dom_t<convex::atom_meta_t<ZVar>>;
93 static_assert(convex::dom_vartype_v<ZDom> == convex::VarType::FREE,
94 "Merged decision var must be free");
95 using ZVarSpace = convex::dom_space_t<ZDom>;
96 static_assert(std::same_as<ZVarSpace, ZSpace>,
97 "Expected merged decision size [svec(Q); vec(W)]");
112 template <convex::AtomLike ZVar>
114 const auto I = linalg::make_identity<T, StateDim>();
134 template <convex::AtomLike ZVar>
136 const ZVar&
Z)
const {
138 const auto& A =
model.dynamics_matrix();
139 return T(-1) * (linalg::transpose(A) *
E +
E * A);
143 const auto C_y =
model.measurement_matrix();
144 return E *
C_y + linalg::transpose(
C_y) * linalg::transpose(
E);
184template <ContinuousPlantModelLike ObsModel, convex::AtomLike ZVar>
205template <ContinuousPlantModelLike ObsModel, convex::AtomLike ZVar>
constexpr bool is_continuous_v
check if continuous or not
constexpr auto make_observer_problem(const ObsModel &model, const ZVar &Z, const auto &obj, plant_type_t< ObsModel > margin=1e-6)
make observer problem
constexpr auto recover_state_observer_gain(const QMat &Q, const WMat &W)
recover state-observer gain from a lifted gain variable
typename plant_traits< linalg::remove_cvref_t< Plant > >::State plant_state_vec_t
extract state vector from plant
typename plant_traits< linalg::remove_cvref_t< Plant > >::T plant_type_t
extract scalar type from plant
constexpr auto apply(const ObsModel &model, const ZVar &Z, T margin=1e-6) const
apply
linalg::Matrix< T, StateDim, OutputDim > LMat
static constexpr std::size_t ZDim
static constexpr std::size_t StateDim
static constexpr std::size_t WDim
linalg::Vector< FMat, ZDim > Fs
linalg::RowVector< T, ZDim > ZSpace
constexpr auto q_constraint(const ZVar &Z, T margin=1e-6) const
q_constraint
static constexpr std::size_t QDim
constexpr auto stability_constraint(const ObsModel &model, const ZVar &Z) const
stability_constraint
static constexpr std::size_t OutputDim
linalg::Matrix< T, StateDim, OutputDim > WMat
constexpr auto L(const QMat &Q, const WMat &W) const
L.
linalg::Matrix< T, StateDim, StateDim > QMat
plant_state_vec_t< Model > State
constexpr auto operator()(const ObsModel &model, const ZVar &Z, T margin=1e-6) const
operator overload (form luenberger observer)
linalg::remove_cvref_t< ObsModel > Model
extracting alias and types
base type traits for plant model