1 #define BIORBD_API_EXPORTS
2 #include "RigidBody/KalmanRecons.h"
4 #include "BiorbdModel.h"
5 #include "Utils/Matrix.h"
6 #include "Utils/Vector.h"
7 #include "RigidBody/GeneralizedCoordinates.h"
8 #include "RigidBody/GeneralizedVelocity.h"
9 #include "RigidBody/GeneralizedAcceleration.h"
13 m_Te(std::make_shared<double>(1.0/(m_params->acquisitionFrequency()))),
14 m_nbDof(std::make_shared<unsigned int>()),
15 m_nMeasure(std::make_shared<unsigned int>()),
16 m_xp(std::make_shared<biorbd::utils::Vector>()),
17 m_A(std::make_shared<biorbd::utils::Matrix>()),
18 m_Q(std::make_shared<biorbd::utils::Matrix>()),
19 m_R(std::make_shared<biorbd::utils::Matrix>()),
20 m_Pp(std::make_shared<biorbd::utils::Matrix>())
26 unsigned int nbMeasure,
29 m_Te(std::make_shared<double>(1.0/(m_params->acquisitionFrequency()))),
30 m_nbDof(std::make_shared<unsigned int>(model.dof_count)),
31 m_nMeasure(std::make_shared<unsigned int>(nbMeasure)),
32 m_xp(std::make_shared<biorbd::utils::Vector>()),
33 m_A(std::make_shared<biorbd::utils::Matrix>()),
34 m_Q(std::make_shared<biorbd::utils::Matrix>()),
35 m_R(std::make_shared<biorbd::utils::Matrix>()),
36 m_Pp(std::make_shared<biorbd::utils::Matrix>())
63 const std::vector<unsigned int> &occlusion){
70 manageOcclusionDuringIteration(InvTp, measure, occlusion);
73 *m_xp = xkm+K*(measure-projectedMeasure);
74 const RigidBodyDynamics::Math::MatrixNd& temp(biorbd::utils::Matrix::Identity(3* *m_nbDof, 3* *m_nbDof) - K*Hessian);
75 *m_Pp = temp * Pkm * temp.transpose() + K* *m_R*K.transpose();
82 const std::vector<unsigned int> &occlusion){
83 for (
unsigned int i = 0; i < occlusion.size(); ++i)
84 for (
unsigned int j=occlusion[i]; j< occlusion[i]+1; ++j){
96 *Q = m_xp->block(0, 0, *m_nbDof, 1);
99 *Qdot = m_xp->block(*m_nbDof, 0, *m_nbDof, 1);
101 if (Qddot !=
nullptr)
102 *Qddot = m_xp->block(2* *m_nbDof, 0, *m_nbDof, 1);
107 const unsigned int nQ,
117 for (
unsigned int i=2; i<n+1; ++i){
119 unsigned int j=(i-1) * nQ;
123 for (
unsigned int cmp=0; cmp<nQ*n-j; ++cmp)
124 A(0+cmp,j+cmp) += c*
static_cast<double>(std::pow(Te,(
static_cast<double>(i)-1.0)));
131 const unsigned int nbQ,
135 double c1 = 1.0/20.0 * pow(Te,5);
136 double c2 = 1.0/8.0 * pow(Te,4);
137 double c3 = 1.0/6.0 * pow(Te,3);
138 double c4 = 1.0/3.0 * pow(Te,3);
139 double c5 = 1.0/2.0 * pow(Te,2);
144 for (
unsigned int j=0; j<nbQ; ++j){
149 Q( nbQ+j, nbQ+j) = c4;
150 Q( nbQ+j, 2*nbQ+j) = c5;
152 Q(2*nbQ+j, nbQ+j) = c5;
153 Q(2*nbQ+j, 2*nbQ+j) = c6;
163 *m_A = evolutionMatrix(*m_nbDof, 2, *m_Te);
166 *m_Q = processNoiseMatrix(*m_nbDof, *m_Te);
169 *m_R = measurementNoiseMatrix(*m_nMeasure, m_params->noiseFactor());
172 *m_xp = initState(*m_nbDof);
175 *m_Pp = initCovariance(*m_nbDof, m_params->errorFactor());
180 const unsigned int nbT,
183 for (
unsigned int i=0; i<nbT; ++i)
189 const unsigned int nbQ){
190 return biorbd::rigidbody::GeneralizedCoordinates::Zero(3*nbQ);
198 m_xp->block(0, 0, *m_nbDof, 1) = *Q;
201 m_xp->block(*m_nbDof, 0, *m_nbDof, 1) = *Qdot;
203 if (Qddot !=
nullptr)
204 m_xp->block(2* *m_nbDof, 0, *m_nbDof, 1) = *Qddot;
211 for (
unsigned int i=0; i<3*nbQ; ++i)
224 m_acquisitionFrequency(frequency),
225 m_noiseFactor(noiseFactor),
226 m_errorFactor(errorFactor){}
229 return m_acquisitionFrequency;
234 return m_noiseFactor;
239 return m_errorFactor;