diff --git a/include/bodydynamics/factor/factor_force_torque.h b/include/bodydynamics/factor/factor_force_torque.h deleted file mode 100644 index 958398a325c0e6c77fd5b70a2cabb4497fec746b..0000000000000000000000000000000000000000 --- a/include/bodydynamics/factor/factor_force_torque.h +++ /dev/null @@ -1,282 +0,0 @@ -//--------LICENSE_START-------- -// -// Copyright (C) 2020,2021,2022 Institut de Robòtica i Informà tica Industrial, CSIC-UPC. -// Authors: Joan Solà Ortega (jsola@iri.upc.edu) -// All rights reserved. -// -// This file is part of WOLF -// WOLF is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with this program. If not, see <http://www.gnu.org/licenses/>. -// -//--------LICENSE_END-------- -/** - * \file factor_force_torque.h - * - * Created on: Feb 19, 2020 - * \author: mfourmy - * - * Works only for 2 limbs - */ - - - -#ifndef FACTOR_FORCE_TORQUE_H_ -#define FACTOR_FORCE_TORQUE_H_ - -#include <core/math/rotations.h> -#include <core/math/covariance.h> -#include <core/factor/factor_autodiff.h> -#include <core/feature/feature_base.h> - -#include "bodydynamics/feature/feature_force_torque.h" - -namespace wolf -{ - -WOLF_PTR_TYPEDEFS(FactorForceTorque); - -class FactorForceTorque : public FactorAutodiff<FactorForceTorque, 9, 3,3,3, 3,3,3,3,4> -{ - public: - FactorForceTorque(const FeatureBasePtr& _feat, - const FrameBasePtr& _frame_other, - const StateBlockPtr& _sb_bp_other, - const ProcessorBasePtr& _processor_ptr, - bool _apply_loss_function, - FactorStatus _status = FAC_ACTIVE); - - ~FactorForceTorque() override { /* nothing */ } - - /* - _ck : COM position in world frame, time k - _cdk : COM velocity in world frame, time k - _Lck : Angular momentum in world frame, time k - _ckm : COM position in world frame, time k-1 - _cdkm : COM velocity in world frame, time k-1 - _Lckm : Angular momentum in world frame, time k-1 - _bpkm : COM position measurement bias, time k-1 - _qkm : Base orientation in world frame, time k-1 - */ - template<typename T> - bool operator () ( - const T* const _ck, - const T* const _cdk, - const T* const _Lck, - const T* const _ckm, - const T* const _cdkm, - const T* const _Lckm, - const T* const _bpkm, - const T* const _qkm, - T* _res) const; - - void computeJac(const FeatureForceTorqueConstPtr& _feat, - const double& _mass, - const double& _dt, - const Eigen::VectorXd& _bp, - Eigen::Matrix<double, 9, 15> & _J_ny_nz) const; - - // void recomputeJac(const FeatureForceTorquePtr& _feat, - // const double& _dt, - // const Eigen::VectorXd& _bp, - // Eigen::Matrix<double, 9, 15>& _J_ny_nz) const; - - void retrieveMeasurementCovariance(const FeatureForceTorquePtr& feat, Eigen::Matrix<double,15,15>& cov); - - StateBlockPtr sb_bp_other_; - double mass_; - double dt_; - Eigen::Matrix<double,15,15> cov_meas_; - // Eigen::Matrix<double, 9, 15> J_ny_nz_; // cannot be modified in operator() since const function - // Eigen::Matrix9d errCov_; -}; - -} /* namespace wolf */ - - -namespace wolf { - -FactorForceTorque::FactorForceTorque( - const FeatureBasePtr& _feat, - const FrameBasePtr& _frame_other, - const StateBlockPtr& _sb_bp_other, - const ProcessorBasePtr& _processor_ptr, - bool _apply_loss_function, - FactorStatus _status) : - FactorAutodiff("FactorForceTorque", - TOP_GEOM, - _feat, - _frame_other, // _frame_other_ptr - nullptr, // _capture_other_ptr - nullptr, // _feature_other_ptr - nullptr, // _landmark_other_ptr - _processor_ptr, - _apply_loss_function, - _status, - _feat->getFrame()->getStateBlock('C'), // COM position, current - _feat->getFrame()->getStateBlock('D'), // COM velocity (bad name), current - _feat->getFrame()->getStateBlock('L'), // Angular momentum, current - _frame_other->getStateBlock('C'), // COM position, previous - _frame_other->getStateBlock('D'), // COM velocity (bad name), previous - _frame_other->getStateBlock('L'), // Angular momentum, previous - _sb_bp_other, // BC relative position bias, previous - _frame_other->getStateBlock('O') // Base orientation, previous - ), - sb_bp_other_(_sb_bp_other) -{ - FeatureForceTorquePtr feat = std::static_pointer_cast<FeatureForceTorque>(_feat); - mass_ = feat->getMass(); - dt_ = feat->getDt(); - retrieveMeasurementCovariance(feat, cov_meas_); -} - - -void FactorForceTorque::retrieveMeasurementCovariance(const FeatureForceTorquePtr& feat, Eigen::Matrix<double,15,15>& cov) -{ - cov.setZero(); - cov.block<6,6>(0,0) = feat->getCovForcesMeas(); // reset some extra zeros - cov.block<6,6>(6,6) = feat->getCovTorquesMeas(); // reset some extra zeros - cov.block<3,3>(12,12) = feat->getCovPbcMeas(); -} - - -void FactorForceTorque::computeJac(const FeatureForceTorqueConstPtr& _feat, - const double& _mass, - const double& _dt, - const Eigen::VectorXd& _bp, - Eigen::Matrix<double, 9, 15>& _J_ny_nz) const -{ - _J_ny_nz.setZero(); - - // Measurements retrieval - Eigen::Map<const Eigen::Vector3d> f1 (_feat->getForcesMeas().data()); - Eigen::Map<const Eigen::Vector3d> f2 (_feat->getForcesMeas().data() + 3 ); - Eigen::Map<const Eigen::Vector3d> tau1(_feat->getTorquesMeas().data()); - Eigen::Map<const Eigen::Vector3d> tau2(_feat->getTorquesMeas().data() + 3 ); - Eigen::Map<const Eigen::Vector3d> pbl1(_feat->getKinMeas().data()); - Eigen::Map<const Eigen::Vector3d> pbl2(_feat->getKinMeas().data() + 3 ); - Eigen::Map<const Eigen::Quaterniond> bql1(_feat->getKinMeas().data() + 6); - Eigen::Map<const Eigen::Quaterniond> bql2(_feat->getKinMeas().data() + 10); - Eigen::Map<const Eigen::Vector3d> pbc (_feat->getPbcMeas().data()); - - Eigen::Matrix3d bRl1 = q2R(bql1); - Eigen::Matrix3d bRl2 = q2R(bql2); - _J_ny_nz.block<3,3>(0,0) = 0.5*bRl1*pow(_dt,2)/_mass; - _J_ny_nz.block<3,3>(0,3) = 0.5*bRl2*pow(_dt,2)/_mass; - _J_ny_nz.block<3,3>(3,0) = bRl1*_dt/_mass; - _J_ny_nz.block<3,3>(3,3) = bRl2*_dt/_mass; - _J_ny_nz.block<3,3>(6,0) = skew(pbl1 - pbc + _bp)*bRl1*_dt; - _J_ny_nz.block<3,3>(6,3) = skew(pbl2 - pbc + _bp)*bRl2*_dt; - _J_ny_nz.block<3,3>(6,6) = bRl1*_dt; - _J_ny_nz.block<3,3>(6,9) = bRl2*_dt; - _J_ny_nz.block<3,3>(6,12) = (skew(bRl1*f1) + skew(bRl2*f2))*_dt; -} - -// void FactorForceTorque::recomputeJac(const FeatureForceTorquePtr& _feat, -// const double& _dt, -// const Eigen::VectorXd& _bp, -// Eigen::Matrix<double, 9, 15>& _J_ny_nz) -// { -// FeatureForceTorquePtr feat = std::static_pointer_cast<FeatureForceTorque>(_feat); - -// // Measurements retrieval -// // Eigen::Map<const Eigen::Vector3d> f1 (feat->getForcesMeas().data()); -// // Eigen::Map<const Eigen::Vector3d> f2 (feat->getForcesMeas().data() + 3 ); -// // Eigen::Map<const Eigen::Vector3d> tau1(feat->getTorquesMeas().data()); -// // Eigen::Map<const Eigen::Vector3d> tau2(feat->getTorquesMeas().data() + 3 ); -// Eigen::Map<const Eigen::Vector3d> pbl1(feat->getKinMeas().data()); -// Eigen::Map<const Eigen::Vector3d> pbl2(feat->getKinMeas().data() + 3 ); -// Eigen::Map<const Eigen::Quaterniond> bql1(feat->getKinMeas().data() + 6); -// Eigen::Map<const Eigen::Quaterniond> bql2(feat->getKinMeas().data() + 10); -// Eigen::Map<const Eigen::Vector3d> pbc (feat->getPbcMeas().data()); - -// Eigen::Matrix3d bRl1 = q2R(bql1); -// Eigen::Matrix3d bRl2 = q2R(bql2); -// // _J_ny_nz.block<3,3>(0,0) = 0.5*bRl1*pow(_dt,2)/_mass; -// // _J_ny_nz.block<3,3>(0,3) = 0.5*bRl2*pow(_dt,2)/_mass; -// // _J_ny_nz.block<3,3>(3,0) = bRl1*_dt/_mass; -// // _J_ny_nz.block<3,3>(3,3) = bRl2*_dt/_mass; -// _J_ny_nz.block<3,3>(6,0) = skew(pbl1 - pbc + _bp)*bRl1*_dt; -// _J_ny_nz.block<3,3>(6,3) = skew(pbl2 - pbc + _bp)*bRl2*_dt; -// // _J_ny_nz.block<3,3>(6,6) = bRl1*_dt; -// // _J_ny_nz.block<3,3>(6,9) = bRl2*_dt; -// // _J_ny_nz.block<3,3>(6,12) = (skew(bRl1*f1) + skew(bRl2*f2))*_dt; -// } - - -template<typename T> -bool FactorForceTorque::operator () ( - const T* const _ck, - const T* const _cdk, - const T* const _Lck, - const T* const _ckm, - const T* const _cdkm, - const T* const _Lckm, - const T* const _bpkm, - const T* const _qkm, - T* _res) const -{ - auto feat = std::static_pointer_cast<const FeatureForceTorque>(getFeature()); - - // State variables instanciation - Eigen::Map<const Eigen::Matrix<T,3,1> > ck(_ck); - Eigen::Map<const Eigen::Matrix<T,3,1> > cdk(_cdk); - Eigen::Map<const Eigen::Matrix<T,3,1> > Lck(_Lck); - Eigen::Map<const Eigen::Matrix<T,3,1> > ckm(_ckm); - Eigen::Map<const Eigen::Matrix<T,3,1> > cdkm(_cdkm); - Eigen::Map<const Eigen::Matrix<T,3,1> > Lckm(_Lckm); - Eigen::Map<const Eigen::Matrix<T,3,1> > bpkm(_bpkm); - Eigen::Map<const Eigen::Quaternion<T> > qkm(_qkm); - Eigen::Map<Eigen::Matrix<T,9,1> > res(_res); - - // Retrieve all measurements - Eigen::Map<const Eigen::Vector3d> f1 (feat->getForcesMeas().data()); - Eigen::Map<const Eigen::Vector3d> f2 (feat->getForcesMeas().data() + 3 ); - Eigen::Map<const Eigen::Vector3d> tau1(feat->getTorquesMeas().data()); - Eigen::Map<const Eigen::Vector3d> tau2(feat->getTorquesMeas().data() + 3 ); - Eigen::Map<const Eigen::Vector3d> pbc (feat->getPbcMeas().data()); - Eigen::Map<const Eigen::Vector3d> pbl1(feat->getKinMeas().data()); - Eigen::Map<const Eigen::Vector3d> pbl2(feat->getKinMeas().data() + 3 ); - Eigen::Map<const Eigen::Quaterniond> bql1(feat->getKinMeas().data() + 6); - Eigen::Map<const Eigen::Quaterniond> bql2(feat->getKinMeas().data() + 10); - - // Recompute the error variable covariance according to the new bias bp estimation - - Eigen::Matrix<double, 9, 15> J_ny_nz; - computeJac(feat, mass_, dt_, sb_bp_other_->getState(), J_ny_nz); // bp - Eigen::Matrix9d errCov = J_ny_nz * cov_meas_ * J_ny_nz.transpose(); - errCov.block<6,6>(0,0) = errCov.block<6,6>(0,0) + 1e-12 * Eigen::Matrix6d::Identity(); - - // Error variable instanciation - Eigen::Matrix<T, 9, 1> err; - Eigen::Map<Eigen::Matrix<T, 3, 1> > err_c (err.data()); - Eigen::Map<Eigen::Matrix<T, 3, 1> > err_cd(err.data() + 3); - Eigen::Map<Eigen::Matrix<T, 3, 1> > err_Lc(err.data() + 6); - - err_c = qkm.conjugate()*(ck - ckm - cdkm * dt_ - 0.5*wolf::gravity()*pow(dt_, 2)) - - (0.5/mass_) * (bql1 * f1 * pow(dt_,2) + bql2 * f2 * pow(dt_,2)); - - err_cd = qkm.conjugate()*(cdk - cdkm - wolf::gravity()*dt_) - - (1/mass_) * (bql1 * f1 * dt_ + bql2 * f2 * dt_); - - err_Lc = qkm.conjugate()*(Lck - Lckm) - - ( bql1 * tau1 + (pbl1 - pbc + bpkm).cross(bql1 * f1) - + bql2 * tau2 + (pbl2 - pbc + bpkm).cross(bql2 * f2)); - - res = wolf::computeSqrtUpper(errCov.inverse()) * err; - - return true; -} - -} // namespace wolf - -#endif /* FACTOR_FORCE_TORQUE_H_ */ diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 425d6f1291d02b80f53ced0bcbe614bc88c402c1..93fddc94887955cdc786b13b1e1b8dccc5879e81 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -16,8 +16,6 @@ wolf_add_gtest(gtest_feature_inertial_kinematics gtest_feature_inertial_kinemati wolf_add_gtest(gtest_factor_inertial_kinematics gtest_factor_inertial_kinematics.cpp) -wolf_add_gtest(gtest_factor_force_torque gtest_factor_force_torque.cpp) - wolf_add_gtest(gtest_factor_force_torque_inertial gtest_factor_force_torque_inertial.cpp) wolf_add_gtest(gtest_factor_force_torque_inertial_dynamics gtest_factor_force_torque_inertial_dynamics.cpp) diff --git a/test/gtest_factor_force_torque.cpp b/test/gtest_factor_force_torque.cpp deleted file mode 100644 index 0ccf5135e3d1bbe45a2c07cdbd68cf530dc9c571..0000000000000000000000000000000000000000 --- a/test/gtest_factor_force_torque.cpp +++ /dev/null @@ -1,865 +0,0 @@ -//--------LICENSE_START-------- -// -// Copyright (C) 2020,2021,2022 Institut de Robòtica i Informà tica Industrial, CSIC-UPC. -// Authors: Joan Solà Ortega (jsola@iri.upc.edu) -// All rights reserved. -// -// This file is part of WOLF -// WOLF is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with this program. If not, see <http://www.gnu.org/licenses/>. -// -//--------LICENSE_END-------- - -/** - * \file gtest_factor_inertial_kinematics.cpp - * - * Created on: Janv 29, 2020 - * \author: Mederic Fourmy - */ - -/* - - -Organisation: For each test, the problem, sensors, factors (if possible) are instanciated in a base class inheriting fromtesting::Test only. -Then, each test case is derived in a child class which defines the data processed by the different sensors and expected estimated test values. -Finally, each of these child classes is used in one or several Test in which basically the expected values are compared against estimation and -solve is done with a perturbated system. - -Tests list: - -FactorInertialKinematics_2KF_Meas0_bpfix,ZeroMvt: -FactorInertialKinematics_2KF_1p_bpfix,ZeroMvt: -FactorInertialKinematics_2KF_m1p_pfix,ZeroMvt: -FactorInertialKinematics_2KF_1v_bfix,ZeroMvt: -*/ - - -// debug -#include <iostream> -#include <fstream> - -#include <core/utils/utils_gtest.h> -#include <core/utils/logging.h> - -// WOLF -#include <core/problem/problem.h> -#include <core/ceres_wrapper/solver_ceres.h> -#include <core/math/rotations.h> -#include <core/capture/capture_base.h> -#include <core/feature/feature_base.h> -#include <core/factor/factor_block_absolute.h> -#include <core/state_block/state_block_derived.h> - -// Imu -// #include "imu/internal/config.h" -// #include "imu/capture/capture_imu.h" -// #include "imu/processor/processor_imu.h" -// #include "imu/sensor/sensor_imu.h" - -// BODYDYNAMICS -#include "bodydynamics/internal/config.h" -#include "bodydynamics/sensor/sensor_inertial_kinematics.h" -#include "bodydynamics/capture/capture_inertial_kinematics.h" -#include "bodydynamics/feature/feature_inertial_kinematics.h" -#include "bodydynamics/factor/factor_inertial_kinematics.h" -#include "bodydynamics/feature/feature_force_torque.h" -#include "bodydynamics/factor/factor_force_torque.h" - -// ODOM3d -#include "core/capture/capture_pose.h" -#include "core/feature/feature_pose.h" -#include "core/factor/factor_relative_pose_3d.h" - -#include <Eigen/Eigenvalues> - -using namespace wolf; -using namespace Eigen; -using namespace std; - - -// SOME CONSTANTS -const double Acc1 = 1; -const double Acc2 = 3; -const Vector3d zero3 = Vector3d::Zero(); -const Vector6d zero6 = Vector6d::Zero(); - - - -Matrix9d computeKinJac(const Vector3d& w_unb, - const Vector3d& p_unb, - const Matrix3d& Iq) -{ - Matrix9d J; J.setZero(); - - Matrix3d wx = skew(w_unb); - Matrix3d px = skew(p_unb); - // Starting from top left, to the right and then next row - J.topLeftCorner<3,3>() = Matrix3d::Identity(); - // J.block<3,3>(0,3) = Matrix3d::Zero(); - // J.topRightCorner<3,3>() = Matrix3d::Zero(); - J.block<3,3>(3,0) = -wx; - J.block<3,3>(3,3) = -Matrix3d::Identity(); - J.block<3,3>(3,6) = px; - // J.bottomLeftCorner<3,3>() = Matrix3d::Zero(); - // J.block<3,3>(6,3) = Matrix3d::Zero(); - J.bottomRightCorner<3,3>() = -Iq; - - return J; -} - -Matrix9d computeKinCov(const Matrix3d& Qp, - const Matrix3d& Qv, - const Matrix3d& Qw, - const Vector3d& w_unb, - const Vector3d& p_unb, - const Matrix3d& Iq) -{ - Matrix9d cov; cov.setZero(); - - Matrix3d wx = skew(w_unb); - Matrix3d px = skew(p_unb); - // Starting from top left, to the right and then next row - cov.topLeftCorner<3,3>() = Qp; - cov.block<3,3>(0,3) = Qp * wx; - // cov.topRightCorner<3,3>() = Matrix3d::Zero(); - cov.block<3,3>(3,0) = cov.block<3,3>(0,3).transpose(); - cov.block<3,3>(3,3) = -wx*Qp*wx + Qv - px*Qw*px; - cov.block<3,3>(3,6) = -px*Qw*Iq; - // cov.bottomLeftCorner<3,3>() = Matrix3d::Zero(); - cov.block<3,3>(6,3) = Iq*Qw*px; - cov.bottomRightCorner<3,3>() = Iq*Qw*Iq; - - return cov; -} - - -void perturbateIfUnFixed(const FrameBasePtr& KF, char sb_name){ - if(!KF->getStateBlock(sb_name)->isFixed()) - { - if (sb_name == 'O') - { - double max_rad_pert = M_PI / 3; - Vector3d do_pert = max_rad_pert*Vector3d::Random(); - Quaterniond curr_state_q(KF->getO()->getState().data()); - KF->getStateBlock('O')->setState((curr_state_q * exp_q(do_pert)).coeffs()); - } - else - { - VectorXd pert; - pert.resize(KF->getStateBlock(sb_name)->getSize()); - pert.setRandom(); pert *= 0.5; - KF->getStateBlock(sb_name)->setState(KF->getStateBlock(sb_name)->getState() + pert); - } - } -} - -void perturbateAllIfUnFixed(const FrameBasePtr& KF) -{ - for (auto it: KF->getStateBlockMap()){ - perturbateIfUnFixed(KF, it.first); - } -} - -FrameBasePtr createKFWithCDLI(const ProblemPtr& problem, - const TimeStamp& t, - VectorComposite x_origin, - Vector3d c, - Vector3d cd, - Vector3d Lc, - Vector6d bias_imu) -{ - FrameBasePtr KF = FrameBase::emplace<FrameBase>(problem->getTrajectory(), t, "POV", x_origin); - StateBlockPtr sbc = make_shared<StatePoint3d>(c); - KF->addStateBlock('C', sbc, problem); - StateBlockPtr sbd = make_shared<StateVector3d>(cd); - KF->addStateBlock('D', sbd, problem); - StateBlockPtr sbL = make_shared<StateVector3d>(Lc); - KF->addStateBlock('L', sbL, problem); - StateBlockPtr sbbimu = make_shared<StateParams6>(bias_imu); - KF->addStateBlock('I', sbbimu, problem); // Simulating IMU - return KF; -} - -class FactorInertialKinematics_2KF : public testing::Test -{ - public: - double mass_; - wolf::TimeStamp tA_; - wolf::TimeStamp tB_; - ProblemPtr problem_; - SolverCeresPtr solver_; - VectorComposite x_origin_; // initial state - VectorComposite s_origin_; // initial sigmas for prior - SensorInertialKinematicsPtr SIK_; - CaptureInertialKinematicsPtr CIKA_, CIKB_; - FrameBasePtr KFA_; - FrameBasePtr KFB_; - Matrix3d Qp_, Qv_, Qw_; - Vector3d bias_p_; - Vector6d bias_imu_; - FeatureInertialKinematicsPtr FIKA_; - FeatureInertialKinematicsPtr FIKB_; - FeatureForceTorquePtr FFTAB_; - // SensorImuPtr sen_imu_; - // ProcessorImuPtr processor_imu_; - - protected: - void SetUp() override - { - - std::string bodydynamics_root = _WOLF_BODYDYNAMICS_ROOT_DIR; - - mass_ = 10.0; // Small 10 kg robot - //===================================================== SETTING PROBLEM - // WOLF PROBLEM - problem_ = Problem::create("POV", 3); - - VectorXd extr_ik(0); - ParamsSensorInertialKinematicsPtr intr_ik = std::make_shared<ParamsSensorInertialKinematics>(); - intr_ik->std_pbc = 0.1; - intr_ik->std_vbc = 0.1; - auto senik = problem_->installSensor("SensorInertialKinematics", "senIK", extr_ik, intr_ik); - SIK_ = std::static_pointer_cast<SensorInertialKinematics>(senik); - - // CERES WRAPPER - solver_ = std::make_shared<SolverCeres>(problem_); - solver_->getSolverOptions().max_num_iterations = 1e3; - // solver_->getSolverOptions().minimizer_type = ceres::TRUST_REGION; //ceres::TRUST_REGION;ceres::LINE_SEARCH - // solver_->getSolverOptions().max_line_search_step_contraction = 1e-3; - - // INSTALL Imu SENSOR - // Vector7d extrinsics; extrinsics << 0,0,0,0,0,0,1; - // SensorBasePtr sen_imu = problem_->installSensor("SensorImu", "Main Imu Sensor", extrinsics, bodydynamics_root + "/demos/sensor_imu.yaml"); - // sen_imu_ = std::static_pointer_cast<SensorImu>(sen_imu); - // ProcessorBasePtr prc_imu = problem_->installProcessor("ProcessorImu", "Imu PROC", "Main Imu Sensor", bodydynamics_root + "/demos/processor_imu.yaml"); - // Vector6d data = zero6; - // wolf::CaptureImuPtr imu_ptr = std::make_shared<CaptureImu>(0, sen_imu_, data, sen_imu_->getNoiseCov(), zero6); - // // sen_imu_->process(imu_ptr); - - // ======================= INITIALIZATION KFA WITH PRIOR + INERTIAL KINEMATIC FACTOR - tA_.set(0); - x_origin_ = VectorComposite("POV", {Vector3d(0,0,0), Quaterniond::Identity().coeffs(), Vector3d(0,0,0)}); - s_origin_ = VectorComposite("POV", {1e-3*Vector3d(1,1,1), 1e-3*Vector3d(1,1,1), 1e-3*Vector3d(1,1,1)}); - KFA_ = problem_->setPriorFactor(x_origin_, s_origin_, tA_); - - - // ADD THE STATEBLOCKS AND SET THEIR DEFAULT VALUES - bias_p_ = zero3; - bias_imu_ = zero6; - StateBlockPtr sbcA = make_shared<StatePoint3d>(zero3); KFA_->addStateBlock('C', sbcA, problem_); - StateBlockPtr sbdA = make_shared<StateVector3d>(zero3); KFA_->addStateBlock('D', sbdA, problem_); - StateBlockPtr sbLA = make_shared<StateVector3d>(zero3); KFA_->addStateBlock('L', sbLA, problem_); - StateBlockPtr sbbimuA = make_shared<StateParams6>(bias_imu_); KFA_->addStateBlock('I', sbbimuA, problem_); - - // Fix the one we cannot estimate - // KFA_->getP()->fix(); - // KFA_->getO()->fix(); - // KFA_->getV()->fix(); - KFA_->getStateBlock('I')->fix(); // Imu - - // INERTIAL KINEMATICS FACTOR - // Measurements - Vector3d pBC_measA = zero3; - Vector3d vBC_measA = zero3; - Vector3d w_measA = zero3; - Vector9d meas_ikinA; meas_ikinA << pBC_measA, vBC_measA, w_measA; - // momentum parameters - Matrix3d Iq; Iq.setIdentity(); - Vector3d Lq = zero3; - - Qp_ = pow(1e-2, 2)*Matrix3d::Identity(); - Qv_ = pow(1e-2, 2)*Matrix3d::Identity(); - Qw_ = pow(1e-2, 2)*Matrix3d::Identity(); - Eigen::Matrix9d Q_ikin_err = computeKinCov(Qp_, Qv_, Qw_, meas_ikinA.head<3>()-bias_p_, meas_ikinA.tail<3>()-bias_imu_.tail<3>(), Iq); - - CIKA_ = CaptureBase::emplace<CaptureInertialKinematics>(KFA_, tA_, SIK_, meas_ikinA, Iq, Lq, bias_p_); - CIKA_->getStateBlock('I')->fix(); // IK bias - FIKA_ = FeatureBase::emplace<FeatureInertialKinematics>(CIKA_, meas_ikinA, Q_ikin_err, Iq, Lq, FeatureBase::UncertaintyType::UNCERTAINTY_IS_COVARIANCE); - FactorBase::emplace<FactorInertialKinematics>(FIKA_, FIKA_, sbbimuA, nullptr, false); - - - // =============== NEW KFB WITH CORRESPONDING STATEBLOCKS - tB_.set(1); - - KFB_ = createKFWithCDLI(problem_, tB_, x_origin_, - zero3, zero3, zero3, bias_imu_); - // Fix the one we cannot estimate - // KFB_->getP()->fix(); - KFB_->getO()->fix(); // Not in the FT factor, so should be fixed (or absolute factor) - // KFB_->getV()->fix(); - KFB_->getStateBlock('I')->fix(); // Imu - - - // // ================ PROCESS Imu DATA - // Vector6d data_imu; - // data_imu << -wolf::gravity(), 0,0,0; - // CaptureImuPtr cap_imu = std::make_shared<CaptureImu>(tB_, sen_imu_, data_imu, sen_imu_->getNoiseCov(), bias_imu_); //set data on Imu (measure only gravity here) - // // process data in capture - // // sen_imu_->process(cap_imu); - - // ================ FACTOR INERTIAL KINEMATICS ON KFB - Vector3d pBC_measB = zero3; - Vector3d vBC_measB = zero3; - Vector3d w_measB = zero3; - Vector9d meas_ikinB; meas_ikinB << pBC_measB, vBC_measB, w_measB; - CIKB_ = CaptureBase::emplace<CaptureInertialKinematics>(KFB_, tB_, SIK_, meas_ikinB, Iq, Lq, bias_p_); - CIKB_->getSensorIntrinsic()->fix(); // IK bias - FIKB_ = FeatureBase::emplace<FeatureInertialKinematics>(CIKB_, meas_ikinB, Q_ikin_err, Iq, Lq, FeatureBase::UncertaintyType::UNCERTAINTY_IS_COVARIANCE); - auto fac_inkinB = FactorBase::emplace<FactorInertialKinematics>(FIKB_, FIKB_, KFB_->getStateBlock('I'), nullptr, false); - - - // FORCE TORQUE FACTOR BETWEEEN KFA AND KFB - Vector3d f1; f1 << -mass_*wolf::gravity()/2; // Only gravity -> static robot on both feet - Vector3d tau1; tau1 << 0,0,0; - Vector3d pbl1; pbl1 << 0,0,0; - Vector4d bql1; bql1 << 0,0,0,1; - Vector3d f2; f2 << -mass_*wolf::gravity()/2; // Only gravity -> static robot on both feet - Vector3d tau2; tau2 << 0,0,0; - Vector3d pbl2; pbl2 << 0,0,0; - Vector4d bql2; bql2 << 0,0,0,1; - Vector3d pbc; pbc << 0,0,0; - // aggregated meas - Vector6d f_meas; f_meas << f1, f2; - Vector6d tau_meas; tau_meas << tau1, tau2; - Matrix<double,14,1> kin_meas; kin_meas << pbl1, pbl2, bql1, bql2; - - Matrix6d cov_f = 1e-4 * Matrix6d::Identity(); - Matrix6d cov_tau = 1e-4 * Matrix6d::Identity(); - Matrix3d cov_pbc = 1e-4 * Matrix3d::Identity(); - - CaptureBasePtr cap_ftB = CaptureBase::emplace<CaptureBase>(KFB_, "CaptureForceTorque", tB_, nullptr); - FFTAB_ = FeatureBase::emplace<FeatureForceTorque>(cap_ftB, - tB_ - tA_, mass_, - f_meas, tau_meas, pbc, kin_meas, - cov_f, cov_tau, cov_pbc); - - FactorForceTorquePtr fac_ftAB = FactorBase::emplace<FactorForceTorque>(FFTAB_, FFTAB_, KFA_, CIKA_->getSensorIntrinsic(), nullptr, false); - - } -}; - - -class FactorInertialKinematics_2KF_foot1turned : public FactorInertialKinematics_2KF -{ - protected: - void SetUp() override - { - cout << "\n\n\nFactorInertialKinematics_2KF_foot1turned" << endl; - FactorInertialKinematics_2KF::SetUp(); - problem_->print(3,false,true,true); - Vector4d WqL; WqL.setRandom(); WqL.normalize(); // random unitary quaternion - Quaterniond quat_WqL(WqL.data()); - Matrix<double, 14, 1> kin_meas; kin_meas << zero3, zero3, WqL, 0,0,0,1; - Vector3d f1 = -mass_*wolf::gravity()/2; - f1 = quat_WqL.conjugate() * f1; // Rotate force meas accordingly - Vector3d f2 = -mass_*wolf::gravity()/2; - Vector6d fmeas; fmeas << f1, f2; - FFTAB_->setKinMeas(kin_meas); - FFTAB_->setForcesMeas(fmeas); - // problem_->print(3,false,true,true); - } -}; - -class FactorInertialKinematics_2KF_foot2turned : public FactorInertialKinematics_2KF -{ - protected: - void SetUp() override - { - FactorInertialKinematics_2KF::SetUp(); - Vector4d WqL; WqL.setRandom(); WqL.normalize(); // random unitary quaternion - Quaterniond quat_WqL(WqL.data()); - Matrix<double, 14, 1> kin_meas; kin_meas << zero3, zero3, 0,0,0,1, WqL; - Vector3d f1 = -mass_*wolf::gravity()/2; - Vector3d f2 = -mass_*wolf::gravity()/2; - f2 = quat_WqL.conjugate() * f2; // Rotate force meas accordingly - Vector6d fmeas; fmeas << f1, f2; - FFTAB_->setKinMeas(kin_meas); - FFTAB_->setForcesMeas(fmeas); - } -}; - -class FactorInertialKinematics_2KF_singleContactFoot2turned : public FactorInertialKinematics_2KF -{ - protected: - void SetUp() override - { - FactorInertialKinematics_2KF::SetUp(); - Vector4d WqL; WqL.setRandom(); WqL.normalize(); // random unitary quaternion - Quaterniond quat_WqL(WqL.data()); - Matrix<double, 14, 1> kin_meas; kin_meas << zero3, zero3, WqL, 0,0,0,1; - Vector3d f1 = -mass_*wolf::gravity(); - f1 = quat_WqL.conjugate() * f1; // Rotate force meas accordingly - Vector3d f2 = zero3; - Vector6d fmeas; fmeas << f1, f2; - FFTAB_->setKinMeas(kin_meas); - FFTAB_->setForcesMeas(fmeas); - } -}; - -class FactorInertialKinematics_2KF_singleContactFoot1turned : public FactorInertialKinematics_2KF -{ - protected: - void SetUp() override - { - FactorInertialKinematics_2KF::SetUp(); - Vector4d WqL; WqL.setRandom(); WqL.normalize(); // random unitary quaternion - Quaterniond quat_WqL(WqL.data()); - Matrix<double, 14, 1> kin_meas; kin_meas << zero3, zero3, 0,0,0,1, WqL; - Vector3d f1 = zero3; - Vector3d f2 = -mass_*wolf::gravity(); - f2 = quat_WqL.conjugate() * f2; // Rotate force meas accordingly - Vector6d fmeas; fmeas << f1, f2; - FFTAB_->setKinMeas(kin_meas); - FFTAB_->setForcesMeas(fmeas); - } -}; - - - - -class FactorInertialKinematics_2KF_ForceX : public FactorInertialKinematics_2KF -{ - protected: - void SetUp() override - { - FactorInertialKinematics_2KF::SetUp(); - Vector3d f1 = -mass_*wolf::gravity()/2 + ((Vector3d()<<mass_*Acc1/2,0,0).finished()); - Vector3d f2 = -mass_*wolf::gravity()/2 + ((Vector3d()<<mass_*Acc1/2,0,0).finished()); - Vector6d fmeas; fmeas << f1, f2; - FFTAB_->setForcesMeas(fmeas); - } -}; - -class FactorInertialKinematics_2KF_ForceY : public FactorInertialKinematics_2KF -{ - protected: - void SetUp() override - { - FactorInertialKinematics_2KF::SetUp(); - Vector3d f1 = -mass_*wolf::gravity()/2 + ((Vector3d()<<0,mass_*Acc2/2,0).finished()); - Vector3d f2 = -mass_*wolf::gravity()/2 + ((Vector3d()<<0,mass_*Acc2/2,0).finished()); - Vector6d fmeas; fmeas << f1, f2; - FFTAB_->setForcesMeas(fmeas); - } -}; - -class FactorInertialKinematics_2KF_ForceZ : public FactorInertialKinematics_2KF -{ - protected: - void SetUp() override - { - FactorInertialKinematics_2KF::SetUp(); - Vector3d f1 = -mass_*wolf::gravity()/2 + ((Vector3d()<<0,0,mass_*Acc1/2).finished()); - Vector3d f2 = -mass_*wolf::gravity()/2 + ((Vector3d()<<0,0,mass_*Acc1/2).finished()); - Vector6d fmeas; fmeas << f1, f2; - FFTAB_->setForcesMeas(fmeas); - } -}; - -class FactorInertialKinematics_3KF_ForceX : public FactorInertialKinematics_2KF_ForceX -{ - public: - FrameBasePtr KFC_; - CaptureInertialKinematicsPtr CIKC_; - TimeStamp tC_; - - protected: - void SetUp() override - { - FactorInertialKinematics_2KF_ForceX::SetUp(); - tC_.set(2); - - // KFB_->getStateBlock("O")->unfix(); - - KFC_ = createKFWithCDLI(problem_, tC_, x_origin_, - zero3, zero3, zero3, bias_imu_); - // Fix the one we cannot estimate - // KFB_->getP()->fix(); - // KFC_->getO()->fix(); // Not in the FT factor, so should be fixed (or absolute factor) - // KFB_->getV()->fix(); - KFC_->getStateBlock('I')->fix(); - - // ================ FACTOR INERTIAL KINEMATICS ON KFB - Vector3d pBC_measC = zero3; - Vector3d vBC_measC = zero3; - Vector3d w_measC = zero3; - Vector9d meas_ikinC; meas_ikinC << pBC_measC, vBC_measC, w_measC; - Matrix3d Iq; Iq.setIdentity(); - Vector3d Lq = zero3; - Eigen::Matrix9d Q_ikin_errC = computeKinCov(Qp_, Qv_, Qw_, meas_ikinC.head<3>()-bias_p_, meas_ikinC.tail<3>()-bias_imu_.tail<3>(), Iq); - - CIKC_ = CaptureBase::emplace<CaptureInertialKinematics>(KFC_, tC_, SIK_, meas_ikinC, Iq, Lq, bias_p_); - CIKC_->getStateBlock('I')->fix(); // IK bias - auto feat_ikin_C = FeatureBase::emplace<FeatureInertialKinematics>(CIKC_, meas_ikinC, Q_ikin_errC, Iq, Lq, FeatureBase::UncertaintyType::UNCERTAINTY_IS_COVARIANCE); - FactorBase::emplace<FactorInertialKinematics>(feat_ikin_C, feat_ikin_C, CIKC_->getStateBlock('I'), nullptr, false); - - - // FORCE TORQUE FACTOR BETWEEEN KFA AND KFB - Vector3d f1; f1 << -mass_*wolf::gravity()/2; // Only gravity -> static robot on both feet - Vector3d tau1; tau1 << 0,0,0; - Vector3d pbl1; pbl1 << 0,0,0; - Vector4d bql1; bql1 << 0,0,0,1; - Vector3d f2; f2 << -mass_*wolf::gravity()/2; // Only gravity -> static robot on both feet - Vector3d tau2; tau2 << 0,0,0; - Vector3d pbl2; pbl2 << 0,0,0; - Vector4d bql2; bql2 << 0,0,0,1; - Vector3d pbc; pbc << 0,0,0; - // aggregated meas - Vector6d f_meas; f_meas << f1, f2; - Vector6d tau_meas; tau_meas << tau1, tau2; - Matrix<double,14,1> kin_meas; kin_meas << pbl1, pbl2, bql1, bql2; - - Matrix6d cov_f = 1e-4 * Matrix6d::Identity(); - Matrix6d cov_tau = 1e-4 * Matrix6d::Identity(); - Matrix3d cov_pbc = 1e-4 * Matrix3d::Identity(); - - CaptureBasePtr cap_ftC = CaptureBase::emplace<CaptureBase>(KFC_, "CaptureForceTorque", tC_, nullptr); - auto feat_ftBC = FeatureBase::emplace<FeatureForceTorque>(cap_ftC, - tC_ - tB_, mass_, - f_meas, tau_meas, pbc, kin_meas, - cov_f, cov_tau, cov_pbc); - FactorForceTorquePtr fac_ftBC = FactorBase::emplace<FactorForceTorque>(feat_ftBC, feat_ftBC, KFB_, CIKB_->getSensorIntrinsic(), nullptr, false); - } -}; - -class FactorInertialKinematics_2KF_ForceX_Odom3d : public FactorInertialKinematics_2KF_ForceX -{ - protected: - void SetUp() override - { - FactorInertialKinematics_2KF_ForceX::SetUp(); - - Vector7d pose_A_B; pose_A_B << (tB_-tA_)*Acc1/2,0,0, 0,0,0,1; - Matrix6d rel_pose_cov = Matrix6d::Identity(); - rel_pose_cov.topLeftCorner(3, 3) *= pow(1e-3, 2); - rel_pose_cov.bottomRightCorner(3, 3) *= pow(M_TORAD*1e-3, 2); - - CaptureBasePtr cap_pose_base = CaptureBase::emplace<CapturePose>(KFB_, tB_, nullptr, pose_A_B, rel_pose_cov); - FeatureBasePtr ftr_pose_base = FeatureBase::emplace<FeaturePose>(cap_pose_base, pose_A_B, rel_pose_cov); - FactorBase::emplace<FactorRelativePose3d>(ftr_pose_base, ftr_pose_base, KFA_, nullptr, false, TOP_MOTION); - - // With Odom3d the bias on relative base COM position is observable, we unfix the KFB state block - CIKB_->getStateBlock('I')->unfix(); - // However this test is not sufficient to observe the bias at KFA - // CIKA_->getStateBlock('I')->unfix(); // this is not observable - } -}; - - - - - -//////////////////////////////////////////////////////// -//////////////////////////////////////////////////////// -//////////////////////////////////////////////////////// -// =============== TEST FONCTIONS ====================== -//////////////////////////////////////////////////////// -//////////////////////////////////////////////////////// -//////////////////////////////////////////////////////// - - -TEST_F(FactorInertialKinematics_2KF,ZeroMvt) -{ - Vector3d c_exp = zero3; - Vector3d cd_exp = zero3; - Vector3d Lc_exp = zero3; - Vector3d bp_exp = zero3; - - string report = solver_->solve(SolverManager::ReportVerbosity::BRIEF); // 0: nothing, 1: BriefReport, 2: FullReport; - - perturbateAllIfUnFixed(KFA_); - perturbateAllIfUnFixed(KFB_); - - // problem_->print(4,true,true,true); - report = solver_->solve(SolverManager::ReportVerbosity::BRIEF); // 0: nothing, 1: BriefReport, 2: FullReport; - // std::cout << report << std::endl; - // problem_->print(4,true,true,true); - - ASSERT_MATRIX_APPROX(KFA_->getP()->getState(), x_origin_.at('P'), 1e-5); - // ASSERT_MATRIX_APPROX(KFA_->getO()->getState(), x_origin_.at('O'), 1e-5); // due to opposite - ASSERT_MATRIX_APPROX(KFA_->getV()->getState(), x_origin_.at('V'), 1e-5); - ASSERT_MATRIX_APPROX(KFA_->getStateBlock('C')->getState(), c_exp, 1e-5); - ASSERT_MATRIX_APPROX(KFA_->getStateBlock('D')->getState(), cd_exp, 1e-5); - ASSERT_MATRIX_APPROX(KFA_->getStateBlock('L')->getState(), Lc_exp, 1e-5); - ASSERT_MATRIX_APPROX(CIKA_->getStateBlock('I')->getState(), bp_exp, 1e-5); - ASSERT_MATRIX_APPROX(KFB_->getStateBlock('C')->getState(), c_exp, 1e-5); - ASSERT_MATRIX_APPROX(KFB_->getStateBlock('D')->getState(), cd_exp, 1e-5); - ASSERT_MATRIX_APPROX(KFB_->getStateBlock('L')->getState(), Lc_exp, 1e-5); - ASSERT_MATRIX_APPROX(CIKB_->getStateBlock('I')->getState(), bp_exp, 1e-5); -} - -TEST_F(FactorInertialKinematics_2KF_foot1turned,ZeroMvt) -{ - Vector3d c_exp = zero3; - Vector3d cd_exp = zero3; - Vector3d Lc_exp = zero3; - Vector3d bp_exp = zero3; - - string report = solver_->solve(SolverManager::ReportVerbosity::BRIEF); // 0: nothing, 1: BriefReport, 2: FullReport; - - perturbateAllIfUnFixed(KFA_); - perturbateAllIfUnFixed(KFB_); - - // problem_->print(4,true,true,true); - report = solver_->solve(SolverManager::ReportVerbosity::BRIEF); // 0: nothing, 1: BriefReport, 2: FullReport; - // std::cout << report << std::endl; - // problem_->print(4,true,true,true); - - ASSERT_MATRIX_APPROX(KFA_->getP()->getState(), x_origin_.at('P'), 1e-5); - // ASSERT_MATRIX_APPROX(KFA_->getO()->getState(), x_origin_.at('O'), 1e-5); // due to opposite - ASSERT_MATRIX_APPROX(KFA_->getV()->getState(), x_origin_.at('V'), 1e-5); - ASSERT_MATRIX_APPROX(KFA_->getStateBlock('C')->getState(), c_exp, 1e-5); - ASSERT_MATRIX_APPROX(KFA_->getStateBlock('D')->getState(), cd_exp, 1e-5); - ASSERT_MATRIX_APPROX(KFA_->getStateBlock('L')->getState(), Lc_exp, 1e-5); - ASSERT_MATRIX_APPROX(CIKA_->getStateBlock('I')->getState(), bp_exp, 1e-5); - ASSERT_MATRIX_APPROX(KFB_->getStateBlock('C')->getState(), c_exp, 1e-5); - ASSERT_MATRIX_APPROX(KFB_->getStateBlock('D')->getState(), cd_exp, 1e-5); - ASSERT_MATRIX_APPROX(KFB_->getStateBlock('L')->getState(), Lc_exp, 1e-5); - ASSERT_MATRIX_APPROX(CIKB_->getStateBlock('I')->getState(), bp_exp, 1e-5); -} - -TEST_F(FactorInertialKinematics_2KF_foot2turned,ZeroMvt) -{ - Vector3d c_exp = zero3; - Vector3d cd_exp = zero3; - Vector3d Lc_exp = zero3; - Vector3d bp_exp = zero3; - - string report = solver_->solve(SolverManager::ReportVerbosity::BRIEF); // 0: nothing, 1: BriefReport, 2: FullReport; - - perturbateAllIfUnFixed(KFA_); - perturbateAllIfUnFixed(KFB_); - - // problem_->print(4,true,true,true); - report = solver_->solve(SolverManager::ReportVerbosity::BRIEF); // 0: nothing, 1: BriefReport, 2: FullReport; - // std::cout << report << std::endl; - // problem_->print(4,true,true,true); - - ASSERT_MATRIX_APPROX(KFA_->getP()->getState(), x_origin_.at('P'), 1e-5); - // ASSERT_MATRIX_APPROX(KFA_->getO()->getState(), x_origin_.at('O'), 1e-5); // due to opposite - ASSERT_MATRIX_APPROX(KFA_->getV()->getState(), x_origin_.at('V'), 1e-5); - ASSERT_MATRIX_APPROX(KFA_->getStateBlock('C')->getState(), c_exp, 1e-5); - ASSERT_MATRIX_APPROX(KFA_->getStateBlock('D')->getState(), cd_exp, 1e-5); - ASSERT_MATRIX_APPROX(KFA_->getStateBlock('L')->getState(), Lc_exp, 1e-5); - ASSERT_MATRIX_APPROX(CIKA_->getStateBlock('I')->getState(), bp_exp, 1e-5); - ASSERT_MATRIX_APPROX(KFB_->getStateBlock('C')->getState(), c_exp, 1e-5); - ASSERT_MATRIX_APPROX(KFB_->getStateBlock('D')->getState(), cd_exp, 1e-5); - ASSERT_MATRIX_APPROX(KFB_->getStateBlock('L')->getState(), Lc_exp, 1e-5); - ASSERT_MATRIX_APPROX(CIKB_->getStateBlock('I')->getState(), bp_exp, 1e-5); -} - - -TEST_F(FactorInertialKinematics_2KF_singleContactFoot1turned,ZeroMvt) -{ - Vector3d c_exp = zero3; - Vector3d cd_exp = zero3; - Vector3d Lc_exp = zero3; - Vector3d bp_exp = zero3; - - string report = solver_->solve(SolverManager::ReportVerbosity::BRIEF); // 0: nothing, 1: BriefReport, 2: FullReport; - - perturbateAllIfUnFixed(KFA_); - perturbateAllIfUnFixed(KFB_); - - // problem_->print(4,true,true,true); - report = solver_->solve(SolverManager::ReportVerbosity::BRIEF); // 0: nothing, 1: BriefReport, 2: FullReport; - // std::cout << report << std::endl; - // problem_->print(4,true,true,true); - - ASSERT_MATRIX_APPROX(KFA_->getP()->getState(), x_origin_.at('P'), 1e-5); - // ASSERT_MATRIX_APPROX(KFA_->getO()->getState(), x_origin_.at('O'), 1e-5); // due to opposite - ASSERT_MATRIX_APPROX(KFA_->getV()->getState(), x_origin_.at('V'), 1e-5); - ASSERT_MATRIX_APPROX(KFA_->getStateBlock('C')->getState(), c_exp, 1e-5); - ASSERT_MATRIX_APPROX(KFA_->getStateBlock('D')->getState(), cd_exp, 1e-5); - ASSERT_MATRIX_APPROX(KFA_->getStateBlock('L')->getState(), Lc_exp, 1e-5); - ASSERT_MATRIX_APPROX(CIKA_->getStateBlock('I')->getState(), bp_exp, 1e-5); - ASSERT_MATRIX_APPROX(KFB_->getStateBlock('C')->getState(), c_exp, 1e-5); - ASSERT_MATRIX_APPROX(KFB_->getStateBlock('D')->getState(), cd_exp, 1e-5); - ASSERT_MATRIX_APPROX(KFB_->getStateBlock('L')->getState(), Lc_exp, 1e-5); - ASSERT_MATRIX_APPROX(CIKB_->getStateBlock('I')->getState(), bp_exp, 1e-5); -} - - -TEST_F(FactorInertialKinematics_2KF_singleContactFoot2turned,ZeroMvt) -{ - Vector3d c_exp = zero3; - Vector3d cd_exp = zero3; - Vector3d Lc_exp = zero3; - Vector3d bp_exp = zero3; - - string report = solver_->solve(SolverManager::ReportVerbosity::BRIEF); // 0: nothing, 1: BriefReport, 2: FullReport; - - perturbateAllIfUnFixed(KFA_); - perturbateAllIfUnFixed(KFB_); - - // problem_->print(4,true,true,true); - report = solver_->solve(SolverManager::ReportVerbosity::BRIEF); // 0: nothing, 1: BriefReport, 2: FullReport; - // std::cout << report << std::endl; - // problem_->print(4,true,true,true); - - ASSERT_MATRIX_APPROX(KFA_->getP()->getState(), x_origin_.at('P'), 1e-5); - // ASSERT_MATRIX_APPROX(KFA_->getO()->getState(), x_origin_.at('O'), 1e-5); - ASSERT_MATRIX_APPROX(KFA_->getV()->getState(), x_origin_.at('V'), 1e-5); - ASSERT_MATRIX_APPROX(KFA_->getStateBlock('C')->getState(), c_exp, 1e-5); - ASSERT_MATRIX_APPROX(KFA_->getStateBlock('D')->getState(), cd_exp, 1e-5); - ASSERT_MATRIX_APPROX(KFA_->getStateBlock('L')->getState(), Lc_exp, 1e-5); - ASSERT_MATRIX_APPROX(CIKA_->getStateBlock('I')->getState(), bp_exp, 1e-5); - ASSERT_MATRIX_APPROX(KFB_->getStateBlock('C')->getState(), c_exp, 1e-5); - ASSERT_MATRIX_APPROX(KFB_->getStateBlock('D')->getState(), cd_exp, 1e-5); - ASSERT_MATRIX_APPROX(KFB_->getStateBlock('L')->getState(), Lc_exp, 1e-5); - ASSERT_MATRIX_APPROX(CIKB_->getStateBlock('I')->getState(), bp_exp, 1e-5); -} - - - -TEST_F(FactorInertialKinematics_2KF_ForceX,ZeroMvt) -{ - // problem_->print(4,true,true,true); - string report = solver_->solve(SolverManager::ReportVerbosity::BRIEF); // 0: nothing, 1: BriefReport, 2: FullReport; - - perturbateAllIfUnFixed(KFA_); - perturbateAllIfUnFixed(KFB_); - - // problem_->print(4,true,true,true); - report = solver_->solve(SolverManager::ReportVerbosity::BRIEF); // 0: nothing, 1: BriefReport, 2: FullReport; - // std::cout << report << std::endl; - // problem_->print(4,true,true,true); - - ASSERT_MATRIX_APPROX(KFA_->getP()->getState(), x_origin_.at('P'), 1e-5); - ASSERT_MATRIX_APPROX(KFA_->getO()->getState(), x_origin_.at('O'), 1e-5); - ASSERT_MATRIX_APPROX(KFA_->getV()->getState(), x_origin_.at('V'), 1e-5); - ASSERT_MATRIX_APPROX(KFA_->getStateBlock('C')->getState(), zero3, 1e-5); - ASSERT_MATRIX_APPROX(KFA_->getStateBlock('D')->getState(), zero3, 1e-5); - ASSERT_MATRIX_APPROX(KFA_->getStateBlock('L')->getState(), zero3, 1e-5); - ASSERT_MATRIX_APPROX(CIKA_->getStateBlock('I')->getState(), zero3, 1e-5); - ASSERT_MATRIX_APPROX(KFB_->getStateBlock('C')->getState(), (Vector3d()<<(tB_-tA_)*Acc1/2, 0, 0).finished(), 1e-5); - ASSERT_MATRIX_APPROX(KFB_->getStateBlock('D')->getState(), (Vector3d()<<(tB_-tA_)*Acc1, 0, 0).finished(), 1e-5); - ASSERT_MATRIX_APPROX(KFB_->getStateBlock('L')->getState(), zero3, 1e-5); - ASSERT_MATRIX_APPROX(CIKB_->getStateBlock('I')->getState(), zero3, 1e-5); -} - - -TEST_F(FactorInertialKinematics_2KF_ForceY,ZeroMvt) -{ - string report = solver_->solve(SolverManager::ReportVerbosity::BRIEF); // 0: nothing, 1: BriefReport, 2: FullReport; - - perturbateAllIfUnFixed(KFA_); - perturbateAllIfUnFixed(KFB_); - - // problem_->print(4,true,true,true); - report = solver_->solve(SolverManager::ReportVerbosity::BRIEF); // 0: nothing, 1: BriefReport, 2: FullReport; - // std::cout << report << std::endl; - // problem_->print(4,true,true,true); - - ASSERT_MATRIX_APPROX(KFA_->getP()->getState(), x_origin_.at('P'), 1e-5); - // ASSERT_MATRIX_APPROX(KFA_->getO()->getState(), x_origin_.at('O'), 1e-5); - ASSERT_MATRIX_APPROX(KFA_->getV()->getState(), x_origin_.at('V'), 1e-5); - ASSERT_MATRIX_APPROX(KFA_->getStateBlock('C')->getState(), zero3, 1e-5); - ASSERT_MATRIX_APPROX(KFA_->getStateBlock('D')->getState(), zero3, 1e-5); - ASSERT_MATRIX_APPROX(KFA_->getStateBlock('L')->getState(), zero3, 1e-5); - ASSERT_MATRIX_APPROX(CIKA_->getStateBlock('I')->getState(), zero3, 1e-5); - ASSERT_MATRIX_APPROX(KFB_->getStateBlock('C')->getState(), (Vector3d()<<0, (tB_ - tA_)*Acc2/2, 0).finished(), 1e-5); - ASSERT_MATRIX_APPROX(KFB_->getStateBlock('D')->getState(), (Vector3d()<<0, (tB_ - tA_)*Acc2, 0).finished(), 1e-5); - ASSERT_MATRIX_APPROX(KFB_->getStateBlock('L')->getState(), zero3, 1e-5); - ASSERT_MATRIX_APPROX(CIKB_->getStateBlock('I')->getState(), zero3, 1e-5); -} - - -TEST_F(FactorInertialKinematics_2KF_ForceZ,ZeroMvt) -{ - string report = solver_->solve(SolverManager::ReportVerbosity::BRIEF); // 0: nothing, 1: BriefReport, 2: FullReport; - - perturbateAllIfUnFixed(KFA_); - perturbateAllIfUnFixed(KFB_); - - // problem_->print(4,true,true,true); - report = solver_->solve(SolverManager::ReportVerbosity::BRIEF); // 0: nothing, 1: BriefReport, 2: FullReport; - // std::cout << report << std::endl; - // problem_->print(4,true,true,true); - - ASSERT_MATRIX_APPROX(KFA_->getP()->getState(), x_origin_.at('P'), 1e-5); - // ASSERT_MATRIX_APPROX(KFA_->getO()->getState(), x_origin_.at('O'), 1e-5); - ASSERT_MATRIX_APPROX(KFA_->getV()->getState(), x_origin_.at('V'), 1e-5); - ASSERT_MATRIX_APPROX(KFA_->getStateBlock('C')->getState(), zero3, 1e-5); - ASSERT_MATRIX_APPROX(KFA_->getStateBlock('D')->getState(), zero3, 1e-5); - ASSERT_MATRIX_APPROX(KFA_->getStateBlock('L')->getState(), zero3, 1e-5); - ASSERT_MATRIX_APPROX(CIKA_->getStateBlock('I')->getState(), zero3, 1e-5); - ASSERT_MATRIX_APPROX(KFB_->getStateBlock('C')->getState(), (Vector3d()<<0, 0, (tB_-tA_)*Acc1/2).finished(), 1e-5); - ASSERT_MATRIX_APPROX(KFB_->getStateBlock('D')->getState(), (Vector3d()<<0, 0, (tB_-tA_)*Acc1).finished(), 1e-5); - ASSERT_MATRIX_APPROX(KFB_->getStateBlock('L')->getState(), zero3, 1e-5); - ASSERT_MATRIX_APPROX(CIKB_->getStateBlock('I')->getState(), zero3, 1e-5); -} - -// TEST_F(FactorInertialKinematics_3KF_ForceX,ZeroMvt) -// { -// string report = solver_->solve(SolverManager::ReportVerbosity::BRIEF); // 0: nothing, 1: BriefReport, 2: FullReport; - -// perturbateAllIfUnFixed(KFA_); -// perturbateAllIfUnFixed(KFB_); -// perturbateAllIfUnFixed(KFC_); - -// // problem_->print(4,true,true,true); -// report = solver_->solve(SolverManager::ReportVerbosity::BRIEF); // 0: nothing, 1: BriefReport, 2: FullReport; -// // std::cout << report << std::endl; -// // problem_->print(4,true,true,true); - -// ASSERT_MATRIX_APPROX(KFA_->getP()->getState(), x_origin_.at('P'), 1e-5); -// // ASSERT_MATRIX_APPROX(KFA_->getO()->getState(), x_origin_.at('O'), 1e-5); -// ASSERT_MATRIX_APPROX(KFA_->getV()->getState(), x_origin_.at('V'), 1e-5); -// ASSERT_MATRIX_APPROX(KFA_->getStateBlock('C')->getState(), zero3, 1e-5); -// ASSERT_MATRIX_APPROX(KFA_->getStateBlock('D')->getState(), zero3, 1e-5); -// ASSERT_MATRIX_APPROX(KFA_->getStateBlock('L')->getState(), zero3, 1e-5); -// ASSERT_MATRIX_APPROX(CIKA_->getStateBlock('I')->getState(), zero3, 1e-5); -// ASSERT_MATRIX_APPROX(KFB_->getStateBlock('C')->getState(), (Vector3d()<<(tB_-tA_)*Acc1/2, 0, 0).finished(), 1e-5); -// ASSERT_MATRIX_APPROX(KFB_->getStateBlock('D')->getState(), (Vector3d()<<(tB_-tA_)*Acc1, 0, 0).finished(), 1e-5); -// ASSERT_MATRIX_APPROX(KFB_->getStateBlock('L')->getState(), zero3, 1e-5); -// ASSERT_MATRIX_APPROX(CIKB_->getStateBlock('I')->getState(), zero3, 1e-5); -// ASSERT_MATRIX_APPROX(KFC_->getStateBlock('C')->getState(), (Vector3d()<<(tC_-tB_)*Acc1/2 + (tB_-tA_)*Acc1, 0, 0).finished(), 1e-5); // + -> due to initial vel of KFB -// ASSERT_MATRIX_APPROX(KFC_->getStateBlock('D')->getState(), (Vector3d()<<(tC_-tB_)*Acc1, 0, 0).finished(), 1e-5); // No acc btw B and C -> same vel -// ASSERT_MATRIX_APPROX(KFC_->getStateBlock('L')->getState(), zero3, 1e-5); -// ASSERT_MATRIX_APPROX(CIKC_->getStateBlock('I')->getState(), zero3, 1e-5); -// } - - -TEST_F(FactorInertialKinematics_2KF_ForceX_Odom3d,ZeroMvt) -{ - string report = solver_->solve(SolverManager::ReportVerbosity::BRIEF); // 0: nothing, 1: BriefReport, 2: FullReport; - - perturbateAllIfUnFixed(KFA_); - perturbateAllIfUnFixed(KFB_); - - // problem_->print(4,true,true,true); - report = solver_->solve(SolverManager::ReportVerbosity::BRIEF); // 0: nothing, 1: BriefReport, 2: FullReport; - // std::cout << report << std::endl; - // problem_->print(4,true,true,true); - - ASSERT_MATRIX_APPROX(KFA_->getP()->getState(), x_origin_.at('P'), 1e-5); - // ASSERT_MATRIX_APPROX(KFA_->getO()->getState(), x_origin_.at('O'), 1e-5); - ASSERT_MATRIX_APPROX(KFA_->getV()->getState(), x_origin_.at('V'), 1e-5); - ASSERT_MATRIX_APPROX(KFA_->getStateBlock('C')->getState(), zero3, 1e-5); - ASSERT_MATRIX_APPROX(KFA_->getStateBlock('D')->getState(), zero3, 1e-5); - ASSERT_MATRIX_APPROX(KFA_->getStateBlock('L')->getState(), zero3, 1e-5); - ASSERT_MATRIX_APPROX(CIKA_->getStateBlock('I')->getState(), zero3, 1e-5); - ASSERT_MATRIX_APPROX(KFB_->getStateBlock('C')->getState(), (Vector3d()<<(tB_-tA_)*Acc1/2, 0, 0).finished(), 1e-5); - ASSERT_MATRIX_APPROX(KFB_->getStateBlock('D')->getState(), (Vector3d()<<(tB_-tA_)*Acc1, 0, 0).finished(), 1e-5); - ASSERT_MATRIX_APPROX(KFB_->getStateBlock('L')->getState(), zero3, 1e-5); - ASSERT_MATRIX_APPROX(CIKB_->getStateBlock('I')->getState(), zero3, 1e-5); -} - - -int main(int argc, char **argv) -{ - testing::InitGoogleTest(&argc, argv); - - return RUN_ALL_TESTS(); -}