Skip to content
Snippets Groups Projects
Commit a6221b11 authored by Joan Solà Ortega's avatar Joan Solà Ortega
Browse files

Use Sensor/ProcessorPose to account for pose measurements

parent 1413ed82
No related branches found
No related tags found
2 merge requests!31devel->main,!30Complete UAV identification setup
...@@ -38,6 +38,8 @@ ...@@ -38,6 +38,8 @@
#include <core/ceres_wrapper/solver_ceres.h> #include <core/ceres_wrapper/solver_ceres.h>
#include <core/math/rotations.h> #include <core/math/rotations.h>
#include <core/tree_manager/tree_manager_sliding_window.h> #include <core/tree_manager/tree_manager_sliding_window.h>
#include <core/capture/capture_pose.h>
#include <Eigen/Dense> #include <Eigen/Dense>
#include <Eigen/Geometry> #include <Eigen/Geometry>
...@@ -56,17 +58,27 @@ class Test_SimulationProblemForceTorqueInertialDynamics_yaml : public testing::T ...@@ -56,17 +58,27 @@ class Test_SimulationProblemForceTorqueInertialDynamics_yaml : public testing::T
{ {
public: public:
ProblemPtr P; ProblemPtr P;
SolverCeresPtr solver;
// FTI sensor
SensorForceTorqueInertialPtr S; SensorForceTorqueInertialPtr S;
ProcessorForceTorqueInertialDynamicsPtr p; ProcessorForceTorqueInertialDynamicsPtr p;
SolverCeresPtr solver;
Vector6d bias_true; Vector6d bias_true;
Vector3d cdm_true; Vector3d cdm_true;
Vector3d inertia_true; Vector3d inertia_true;
double mass_true; double mass_true;
std::vector<double> time_stamp;
double dt; double dt;
// Pose sensor
SensorBasePtr SP;
Vector7d pose;
// Reading csv data
std::vector<double> time_stamp;
std::vector<Vector3d> position, vlin, vang, force, torque, a_meas; std::vector<Vector3d> position, vlin, vang, force, torque, a_meas;
std::vector<Quaterniond> quaternion; std::vector<Quaterniond> quaternion;
// Fitxer CSV // Fitxer CSV
std::fstream fout; std::fstream fout;
...@@ -218,9 +230,12 @@ class Test_SimulationProblemForceTorqueInertialDynamics_yaml : public testing::T ...@@ -218,9 +230,12 @@ class Test_SimulationProblemForceTorqueInertialDynamics_yaml : public testing::T
// solver->getSolverOptions().gradient_tolerance = 1e-15; // solver->getSolverOptions().gradient_tolerance = 1e-15;
// solver->getSolverOptions().parameter_tolerance = 1e-15; // solver->getSolverOptions().parameter_tolerance = 1e-15;
S = std::static_pointer_cast<SensorForceTorqueInertial>(P->getHardware()->getSensorList().front()); // FTI sensor and processor
S = std::static_pointer_cast<SensorForceTorqueInertial>(P->findSensor("sensor FTI"));
p = std::static_pointer_cast<ProcessorForceTorqueInertialDynamics>(S->getProcessorList().front()); p = std::static_pointer_cast<ProcessorForceTorqueInertialDynamics>(S->getProcessorList().front());
// Pose sensor
SP = P->findSensor("sensor Pose");
} }
}; };
...@@ -380,11 +395,10 @@ TEST_F(Test_SimulationProblemForceTorqueInertialDynamics_yaml, simulation_online ...@@ -380,11 +395,10 @@ TEST_F(Test_SimulationProblemForceTorqueInertialDynamics_yaml, simulation_online
int i_init = 0; int i_init = 0;
// fix measured position and orientation // Pose
p->getOrigin()->getFrame()->getStateBlock('P')->fix(); pose << position[i_init] , quaternion[i_init].coeffs();
p->getOrigin()->getFrame()->getStateBlock('P')->setState(position[i_init]); CaptureBasePtr CP = std::make_shared<CapturePose>(time_stamp[i_init], SP, pose, SP->getNoiseCov());
p->getOrigin()->getFrame()->getStateBlock('O')->fix(); CP->process();
p->getOrigin()->getFrame()->getStateBlock('O')->setState(quaternion[i_init].coeffs());
unsigned int last_kf_id = p->getOrigin()->getFrame()->id(); unsigned int last_kf_id = p->getOrigin()->getFrame()->id();
...@@ -402,25 +416,23 @@ TEST_F(Test_SimulationProblemForceTorqueInertialDynamics_yaml, simulation_online ...@@ -402,25 +416,23 @@ TEST_F(Test_SimulationProblemForceTorqueInertialDynamics_yaml, simulation_online
data.segment<3>(9) = torque[i]; data.segment<3>(9) = torque[i];
MatrixXd data_cov = S->getNoiseCov(); MatrixXd data_cov = S->getNoiseCov();
pose << position[i] , quaternion[i].coeffs();
// ESTIMATOR // ESTIMATOR
CaptureMotionPtr C = std::make_shared<CaptureForceTorqueInertial>(t, S, data, data_cov, nullptr); CaptureMotionPtr C = std::make_shared<CaptureForceTorqueInertial>(t, S, data, data_cov, nullptr);
C->process(); C->process();
// check if new KF CaptureBasePtr CP = std::make_shared<CapturePose>(t, SP, pose, SP->getNoiseCov());
CP->process();
// check if new KF and solve
if (last_kf_id != p->getOrigin()->getFrame()->id()) if (last_kf_id != p->getOrigin()->getFrame()->id())
{ {
last_kf_id = p->getOrigin()->getFrame()->id(); last_kf_id = p->getOrigin()->getFrame()->id();
// fix measured position and orientation
p->getOrigin()->getFrame()->getStateBlock('P')->fix();
p->getOrigin()->getFrame()->getStateBlock('P')->setState(position[i]);
p->getOrigin()->getFrame()->getStateBlock('O')->fix();
p->getOrigin()->getFrame()->getStateBlock('O')->setState(quaternion[i].coeffs());
// solve! // solve!
report = solver->solve(wolf::SolverManager::ReportVerbosity::BRIEF); report = solver->solve(wolf::SolverManager::ReportVerbosity::BRIEF);
// results of this iteration // results of this iteration
WOLF_INFO("Time : ", t, " s."); WOLF_INFO("Time : ", t, " s.");
...@@ -434,12 +446,7 @@ TEST_F(Test_SimulationProblemForceTorqueInertialDynamics_yaml, simulation_online ...@@ -434,12 +446,7 @@ TEST_F(Test_SimulationProblemForceTorqueInertialDynamics_yaml, simulation_online
} }
} }
report = solver->solve(wolf::SolverManager::ReportVerbosity::BRIEF);
// FINAL RESULTS // FINAL RESULTS
WOLF_INFO(report);
WOLF_INFO("True bias * : ", bias_true.transpose(), " m/s2 - rad/s."); WOLF_INFO("True bias * : ", bias_true.transpose(), " m/s2 - rad/s.");
WOLF_INFO("Guess bias : ", bias_guess.transpose(), " m/s2 - rad/s."); WOLF_INFO("Guess bias : ", bias_guess.transpose(), " m/s2 - rad/s.");
WOLF_INFO("Estimated bias : ", S->getStateBlock('I')->getState().transpose(), " m/s2 - rad/s."); WOLF_INFO("Estimated bias : ", S->getStateBlock('I')->getState().transpose(), " m/s2 - rad/s.");
...@@ -455,7 +462,7 @@ TEST_F(Test_SimulationProblemForceTorqueInertialDynamics_yaml, simulation_online ...@@ -455,7 +462,7 @@ TEST_F(Test_SimulationProblemForceTorqueInertialDynamics_yaml, simulation_online
WOLF_INFO("-----------------------------"); WOLF_INFO("-----------------------------");
ASSERT_MATRIX_APPROX(bias_true , S->getStateBlock('I')->getState(), 0.11); ASSERT_MATRIX_APPROX(bias_true , S->getStateBlock('I')->getState(), 0.11);
ASSERT_MATRIX_APPROX(cdm_true , S->getStateBlock('C')->getState(), 1e-3); ASSERT_MATRIX_APPROX(cdm_true , S->getStateBlock('C')->getState(), 1e-2);
ASSERT_MATRIX_APPROX(inertia_true, S->getStateBlock('i')->getState(), 1e-2); ASSERT_MATRIX_APPROX(inertia_true, S->getStateBlock('i')->getState(), 1e-2);
ASSERT_NEAR (mass_true , S->getStateBlock('m')->getState()(0), 2e-2); ASSERT_NEAR (mass_true , S->getStateBlock('m')->getState()(0), 2e-2);
} }
...@@ -493,27 +500,23 @@ TEST_F(Test_SimulationProblemForceTorqueInertialDynamics_yaml, simulation_batch) ...@@ -493,27 +500,23 @@ TEST_F(Test_SimulationProblemForceTorqueInertialDynamics_yaml, simulation_batch)
// S->addPriorParameter('m', // mass // S->addPriorParameter('m', // mass
// Vector1d(mass_guess), // mass // Vector1d(mass_guess), // mass
// 0.1 * 0.1 * Matrix1d::Identity()); // cov // 0.01 * 0.01 * Matrix1d::Identity()); // cov
// Force processor to make a KF at t=0 int i_init = 0;
// Force FTI processor to make a KF at t=0
CaptureMotionPtr C0 = CaptureMotionPtr C0 =
std::make_shared<CaptureForceTorqueInertial>(0, S, VectorXd::Zero(12), MatrixXd::Identity(12, 12), nullptr); std::make_shared<CaptureForceTorqueInertial>(0, S, VectorXd::Zero(12), MatrixXd::Identity(12, 12), nullptr);
C0->process(); C0->process();
int i_init = 0; // Pose
pose << position[i_init] , quaternion[i_init].coeffs();
// fix measured position and orientation CaptureBasePtr CP = std::make_shared<CapturePose>(time_stamp[i_init], SP, pose, SP->getNoiseCov());
p->getOrigin()->getFrame()->getStateBlock('P')->fix(); CP->process();
p->getOrigin()->getFrame()->getStateBlock('P')->setState(position[i_init]);
p->getOrigin()->getFrame()->getStateBlock('O')->fix();
p->getOrigin()->getFrame()->getStateBlock('O')->setState(quaternion[i_init].coeffs());
unsigned int last_kf_id = p->getOrigin()->getFrame()->id();
for (int i = i_init + 1; i < time_stamp.size(); i++) // start with second data for (int i = i_init + 1; i < time_stamp.size(); i++) // start with second data
{ {
// SIMULATOR // SIMULATOR
TimeStamp t = time_stamp[i]; TimeStamp t = time_stamp[i];
// Data // Data
...@@ -523,23 +526,18 @@ TEST_F(Test_SimulationProblemForceTorqueInertialDynamics_yaml, simulation_batch) ...@@ -523,23 +526,18 @@ TEST_F(Test_SimulationProblemForceTorqueInertialDynamics_yaml, simulation_batch)
data.segment<3>(6) = force[i]; data.segment<3>(6) = force[i];
data.segment<3>(9) = torque[i]; data.segment<3>(9) = torque[i];
MatrixXd data_cov = S->getNoiseCov(); MatrixXd data_cov = S->getNoiseCov();
pose << position[i] , quaternion[i].coeffs();
// ESTIMATOR // ESTIMATOR
// FTI
CaptureMotionPtr C = std::make_shared<CaptureForceTorqueInertial>(t, S, data, data_cov, nullptr); CaptureMotionPtr C = std::make_shared<CaptureForceTorqueInertial>(t, S, data, data_cov, nullptr);
C->process(); C->process();
// check if new KF // Pose
if (last_kf_id != p->getOrigin()->getFrame()->id()) CaptureBasePtr CP = std::make_shared<CapturePose>(t, SP, pose, SP->getNoiseCov());
{ CP->process();
last_kf_id = p->getOrigin()->getFrame()->id();
// fix measured position and orientation
p->getOrigin()->getFrame()->getStateBlock('P')->fix();
p->getOrigin()->getFrame()->getStateBlock('P')->setState(position[i]);
p->getOrigin()->getFrame()->getStateBlock('O')->fix();
p->getOrigin()->getFrame()->getStateBlock('O')->setState(quaternion[i].coeffs());
}
} }
std::string report = solver->solve(wolf::SolverManager::ReportVerbosity::BRIEF); std::string report = solver->solve(wolf::SolverManager::ReportVerbosity::BRIEF);
...@@ -565,7 +563,7 @@ TEST_F(Test_SimulationProblemForceTorqueInertialDynamics_yaml, simulation_batch) ...@@ -565,7 +563,7 @@ TEST_F(Test_SimulationProblemForceTorqueInertialDynamics_yaml, simulation_batch)
ASSERT_MATRIX_APPROX(bias_true , S->getStateBlock('I')->getState(), 0.21); ASSERT_MATRIX_APPROX(bias_true , S->getStateBlock('I')->getState(), 0.21);
ASSERT_MATRIX_APPROX(cdm_true , S->getStateBlock('C')->getState(), 2e-3); ASSERT_MATRIX_APPROX(cdm_true , S->getStateBlock('C')->getState(), 2e-3);
ASSERT_MATRIX_APPROX(inertia_true, S->getStateBlock('i')->getState(), 1e-2); ASSERT_MATRIX_APPROX(inertia_true, S->getStateBlock('i')->getState(), 1e-2);
ASSERT_NEAR (mass_true , S->getStateBlock('m')->getState()(0), 3e-2); ASSERT_NEAR (mass_true , S->getStateBlock('m')->getState()(0), 4e-2);
} }
int main(int argc, char** argv) int main(int argc, char** argv)
......
...@@ -49,6 +49,19 @@ config: ...@@ -49,6 +49,19 @@ config:
inertia: [0.015,0.015,0.030] # moments of inertia i_xx, i_yy, i_zz [kg m2] inertia: [0.015,0.015,0.030] # moments of inertia i_xx, i_yy, i_zz [kg m2]
mass: 2.00 # mass [kg] mass: 2.00 # mass [kg]
-
name: sensor Pose
type: SensorPose
plugin: core
extrinsic:
pose: [0,0,0, 0,0,0,1]
std_px: 0.001
std_py: 0.001
std_pz: 0.001
std_ox: 0.001
std_oy: 0.001
std_oz: 0.001
processors: processors:
- -
name: "proc FTID" name: "proc FTID"
...@@ -67,3 +80,14 @@ config: ...@@ -67,3 +80,14 @@ config:
max_buff_length: 999 # motion deltas max_buff_length: 999 # motion deltas
dist_traveled: 999 # meters dist_traveled: 999 # meters
angle_turned: 999 # radians (1 rad approx 57 deg, approx 60 deg) angle_turned: 999 # radians (1 rad approx 57 deg, approx 60 deg)
-
name: prc Pose
type: ProcessorPose
plugin: core
sensor_name: sensor Pose
time_tolerance: 0.01
keyframe_vote:
voting_active: true
apply_loss_function: false
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment