1 #define BIORBD_API_EXPORTS
2 #include "RigidBody/KalmanReconsIMU.h"
4 #include <rbdl/Model.h>
5 #include <rbdl/Kinematics.h>
6 #include "BiorbdModel.h"
7 #include "Utils/Error.h"
8 #include "Utils/Matrix.h"
9 #include "Utils/Rotation.h"
10 #include "RigidBody/GeneralizedCoordinates.h"
11 #include "RigidBody/GeneralizedVelocity.h"
12 #include "RigidBody/GeneralizedAcceleration.h"
13 #include "RigidBody/IMU.h"
17 m_PpInitial(std::make_shared<biorbd::utils::Matrix>()),
18 m_firstIteration(std::make_shared<bool>(true))
26 biorbd::rigidbody::
KalmanRecons(model, model.nbTechIMUs()*9, params),
27 m_PpInitial(std::make_shared<biorbd::utils::Matrix>()),
28 m_firstIteration(std::make_shared<bool>(true))
59 const std::vector<unsigned int> &occlusion)
61 for (
unsigned int i = 0; i < occlusion.size(); ++i)
62 for (
unsigned int j=occlusion[i] * 9; j< occlusion[i] * 9+9; ++j){
70 return *m_firstIteration;
75 const std::vector<biorbd::rigidbody::IMU> &IMUobs,
82 for (
unsigned int i=0; i<IMUobs.size(); ++i)
83 for (
unsigned int j=0; j<3; ++j)
84 T.block(9*i+3*j, 0, 3, 1) = IMUobs[i].block(0,j,3,1);
87 reconstructFrame(m, T, Q, Qdot, Qddot);
99 if (*m_firstIteration){
100 *m_firstIteration =
false;
101 for (
unsigned int i=0; i<300; ++i){
103 reconstructFrame(model, IMUobs,
nullptr,
nullptr,
nullptr);
107 m_xp->block(*m_nbDof, 0, *m_nbDof*2, 1) = biorbd::utils::Vector::Zero(*m_nbDof*2);
117 const std::vector<biorbd::rigidbody::IMU>& zest_tp = model.
technicalIMU(Q_tp,
false);
123 std::vector<unsigned int> occlusionIdx;
124 for (
unsigned int i=0; i<*m_nMeasure/9; ++i){
125 biorbd::utils::Scalar sum = 0;
126 for (
unsigned int j = 0; j < 9; ++j)
127 sum += IMUobs(i*9+j)*IMUobs(i*9+j);
128 #ifdef BIORBD_USE_CASADI_MATH
131 if (sum != 0.0 && !std::isnan(sum)){
133 H.block(i*9,0,9,*m_nbDof) = J_tp[i];
135 for (
unsigned int j = 0; j < 3; ++j)
136 zest.block(i*9+j*3, 0, 3, 1) = rot.block(0, j, 3, 1);
139 occlusionIdx.push_back(i);
143 iteration(IMUobs, zest, H, occlusionIdx);
145 getState(Q, Qdot, Qddot);