diff --git a/include/core/common/factory.h b/include/core/common/factory.h index 1e18985f9a047dea575af0852b24eac6ff6305bd..cc55ef5229a4ab876d4f4b845bfe294c4d5b2aec 100644 --- a/include/core/common/factory.h +++ b/include/core/common/factory.h @@ -329,7 +329,7 @@ class Factory template<class TypeBase, typename... TypeInput> inline Factory<TypeBase, TypeInput...>::~Factory<TypeBase, TypeInput...>() { - std::cout << " Factory destructor " << this->getClass() << std::endl; + //std::cout << " Factory destructor " << this->getClass() << std::endl; } template<class TypeBase, typename... TypeInput> diff --git a/include/core/sensor/sensor_base.h b/include/core/sensor/sensor_base.h index 1b76c1b4800156c25a1bf932c6721456d6055e91..1157e55c2a5613a3bf3e43fdc5bcfca4fc275103 100644 --- a/include/core/sensor/sensor_base.h +++ b/include/core/sensor/sensor_base.h @@ -141,7 +141,9 @@ class SensorBase : public NodeBase, public HasStateBlocks, public std::enable_sh * * Constructor with parameter vector * \param _tp Type of the sensor (types defined at wolf.h) - * \param _priors priors of the sensor states + * \param _unique_name Name of the sensor + * \param _dim Problem dimension + * \param _priors priors of the sensor state blocks * \param _params params struct * **/ @@ -154,9 +156,12 @@ class SensorBase : public NodeBase, public HasStateBlocks, public std::enable_sh /** \brief Constructor with ParamServer and keys * * Constructor with parameter vector + * TODO: update * \param _tp Type of the sensor (types defined at wolf.h) + * \param _unique_name Name of the sensor + * \param _dim Problem dimension * \param _server parameter server - * \param _keys keys of the states of the derived sensor + * \param _keys_types_apart_from_PO Map containing the keys and the types of the state blocks (apart from extrinsics: P, O) * **/ SensorBase(const std::string& _type, @@ -222,6 +227,11 @@ class SensorBase : public NodeBase, public HasStateBlocks, public std::enable_sh StateBlockConstPtr getIntrinsic() const; StateBlockPtr getIntrinsic(); + std::map<char, FeatureBaseConstPtr> getPriorFeatures() const; + std::map<char, FeatureBasePtr> getPriorFeatures(); + FeatureBaseConstPtr getPriorFeature(char) const; + FeatureBasePtr getPriorFeature(char); + protected: virtual void registerNewStateBlocks(ProblemPtr _problem) override; @@ -257,8 +267,8 @@ class SensorBase : public NodeBase, public HasStateBlocks, public std::enable_sh void setNoiseStd(const Eigen::VectorXd & _noise_std); void setNoiseCov(const Eigen::MatrixXd & _noise_cov); - void setDriftStd(char, const Eigen::VectorXd & _drift_rate_std); - void setDriftCov(char, const Eigen::MatrixXd & _drift_rate_cov); + void setDriftStd(char _key, const Eigen::VectorXd & _drift_rate_std); + void setDriftCov(char _key, const Eigen::MatrixXd & _drift_rate_cov); Eigen::VectorXd getNoiseStd() const; Eigen::MatrixXd getNoiseCov() const; Eigen::VectorXd getDriftStd(char) const; @@ -365,7 +375,7 @@ inline Eigen::MatrixXd SensorBase::getNoiseCov() const inline Eigen::VectorXd SensorBase::getDriftStd(char _key) const { if (drift_covs_.count(_key) == 0) - return Eigen::MatrixXd(0,0); + return Eigen::VectorXd(0); else return drift_covs_.at(_key).diagonal().cwiseSqrt(); } @@ -378,9 +388,6 @@ inline Eigen::MatrixXd SensorBase::getDriftCov(char _key) const return drift_covs_.at(_key); } -void setDriftRateStd(char, const Eigen::VectorXd & _drift_rate_std); -void setDriftRateCov(char, const Eigen::MatrixXd & _drift_rate_cov); - inline HardwareBaseConstPtr SensorBase::getHardware() const { return hardware_ptr_.lock(); @@ -411,6 +418,35 @@ inline void SensorBase::addPriorIntrinsics(const Eigen::VectorXd& _x, const Eige addPriorParameter('I', _x, _cov, _start_idx); } +inline std::map<char, FeatureBaseConstPtr> SensorBase::getPriorFeatures() const +{ + std::map<char, FeatureBaseConstPtr> map_const; + for (auto&& pair : params_prior_map_) + map_const[pair.first] = pair.second; + return map_const; +} + +inline std::map<char, FeatureBasePtr> SensorBase::getPriorFeatures() +{ + return params_prior_map_; +} + + +inline FeatureBaseConstPtr SensorBase::getPriorFeature(char key) const +{ + if (params_prior_map_.count(key) == 0) + return nullptr; + return params_prior_map_.at(key); +} + +inline FeatureBasePtr SensorBase::getPriorFeature(char key) +{ + if (params_prior_map_.count(key) == 0) + return nullptr; + return params_prior_map_.at(key); +} + + } // namespace wolf #endif diff --git a/include/core/state_block/prior.h b/include/core/state_block/prior.h index 1dc7b33839282579e412bc0928a882d28cb121a8..38bce67d8e53439f78122d9bcca370cebb29f433 100644 --- a/include/core/state_block/prior.h +++ b/include/core/state_block/prior.h @@ -38,8 +38,8 @@ class Prior { private: std::string type_; // State type - std::string mode_; // Prior mode. Can be 'initial_guess', 'fix' or 'factor' Eigen::VectorXd state_; // state values + std::string mode_; // Prior mode. Can be 'initial_guess', 'fix' or 'factor' Eigen::VectorXd noise_std_; // factor noise std, sqrt of the diagonal of the covariance mtrix (ONLY IF mode == 'factor') bool dynamic_; // State dynamic Eigen::VectorXd drift_std_; // OPTIONAL std of the state drift [in units/sqrt(s)] diagonal elements (ONLY IF if dynamic) diff --git a/include/core/utils/converter.h b/include/core/utils/converter.h index 1c53906c6c624ef4e88ac95785fa1871b9b5c122..0e2fd206dc03fdc325bf1f901d0294a1b8bdc44a 100644 --- a/include/core/utils/converter.h +++ b/include/core/utils/converter.h @@ -195,6 +195,15 @@ struct converter<std::string>{ if (result.size() > 0) result = result.substr(1, result.size()); return "[" + result + "]"; } + template<typename A> + static std::string convert(std::set<A> val){ + std::string result = ""; + for(auto it : val){ + result += "," + converter<std::string>::convert(it); + } + if(result.size() > 0) result = result.substr(1,result.size()); + return "[" + result + "]"; + } template<typename A, typename B> static std::string convert(std::pair<A,B> val){ return "{" + converter<std::string>::convert(val.first) + ":" + converter<std::string>::convert(val.second) + "}"; diff --git a/src/sensor/sensor_base.cpp b/src/sensor/sensor_base.cpp index 9b8f70f7ba6b6943c4a45d04386ea4cedb1042c3..ecd199c2ef098d4e942dc777018226938b30432e 100644 --- a/src/sensor/sensor_base.cpp +++ b/src/sensor/sensor_base.cpp @@ -44,7 +44,8 @@ SensorBase::SensorBase(const std::string& _type, sensor_id_(++sensor_id_count_), // simple ID factory state_block_dynamic_(), params_prior_map_(), - last_capture_(nullptr) + last_capture_(nullptr), + noise_cov_(0,0) { assert(_dim == 2 or _dim == 3); @@ -68,6 +69,7 @@ SensorBase::SensorBase(const std::string& _type, params_prior_map_(), last_capture_(nullptr) { + assert(_dim == 2 or _dim == 3); assert(_keys_types_apart_from_PO.count('P') == 0 and _keys_types_apart_from_PO.count('O') == 0 and "SensorBase: _keys_types_apart_from_PO should not contain 'P' or 'O' keys"); @@ -84,7 +86,7 @@ SensorBase::SensorBase(const std::string& _type, keys_types['O'] = "O"; // equivalent to (_dim == 2 ? "StateAngle" : "StateQuaternion"); Priors priors; for (auto pair : keys_types) - priors[pair.first] = Prior("sensor/" + _unique_name, pair.second, _server); + priors[pair.first] = Prior("sensor/" + _unique_name + "/" + std::string(1, pair.first), pair.second, _server); // load priors loadPriors(priors, _dim); @@ -142,7 +144,7 @@ void SensorBase::loadPriors(const Priors& _priors, SizeEigen _dim) // Drift covariance rates if (prior.isDynamic()) - setDriftStd(key, prior.getDriftStd().cwiseAbs2().asDiagonal()); + setDriftStd(key, prior.getDriftStd()); } if (not hasStateBlock('P') or not hasStateBlock('O')) @@ -284,7 +286,7 @@ void SensorBase::registerNewStateBlocks(ProblemPtr _problem) void SensorBase::setNoiseStd(const Eigen::VectorXd& _noise_std) { - noise_cov_ = _noise_std.array().square().matrix().asDiagonal(); + noise_cov_ = _noise_std.cwiseAbs2().asDiagonal(); } void SensorBase::setNoiseCov(const Eigen::MatrixXd& _noise_cov) diff --git a/src/state_block/prior.cpp b/src/state_block/prior.cpp index 3849ccb814b9fc2aad7ed3a36ab289fb7e86f621..a58824ece6d2e3fb0a986d1a1fa690d734cbd97c 100644 --- a/src/state_block/prior.cpp +++ b/src/state_block/prior.cpp @@ -32,14 +32,14 @@ Prior::Prior(const std::string& _type, const Eigen::VectorXd& _noise_std, bool _dynamic, const Eigen::VectorXd& _drift_std) - : type_(_type), mode_(_mode), state_(_state), noise_std_(_noise_std), dynamic_(_dynamic), drift_std_(_drift_std) + : type_(_type), state_(_state), mode_(_mode), noise_std_(_noise_std), dynamic_(_dynamic), drift_std_(_drift_std) { check(); } -Prior::Prior(const std::string& _prefix, const std::string& _type, const ParamsServer& _server) +Prior::Prior(const std::string& _prefix, const std::string& _type, const ParamsServer& _server) + : type_(_type) { - type_ = _type; state_ = _server.getParam<Eigen::VectorXd>(_prefix + "/state"); mode_ = _server.getParam<std::string>(_prefix + "/mode"); @@ -64,6 +64,10 @@ void Prior::check() const throw std::runtime_error("Prior::check() wrong mode value: " + mode_ + ", it should be: 'initial_guess', 'fix' or 'factor'. " + print()); + // check empty state + if (state_.size() == 0) + throw std::runtime_error("Prior::check() Prior " + type_ + " state size zero. " + print()); + // try to create a state block and check for local parameterization and dimensions consistency StateBlockPtr sb; try { diff --git a/src/yaml/parser_yaml.cpp b/src/yaml/parser_yaml.cpp index a813f71b2246d53d0056bb8ab26ec1f9db5ee000..ecc7aa088a21acc492ee0fbc16a22c94ae3a33fa 100644 --- a/src/yaml/parser_yaml.cpp +++ b/src/yaml/parser_yaml.cpp @@ -517,20 +517,14 @@ void ParserYaml::parse() tags.push_back("ROS publisher"); walkTreeR(it.n_, tags, "ROS publisher/" + it.type_ + " - " + it.topic_); } - std::list<std::string> plugins, packages_subscriber, packages_publisher; + std::set<std::string> plugins, packages_subscriber, packages_publisher; for (auto pair : params_) if (pair.first.find("plugin") != std::string::npos and pair.first != "plugins") - plugins.push_back(pair.second); + plugins.insert(pair.second); for (const auto& it : subscriber_managers_) - packages_subscriber.push_back(it.package_); + packages_subscriber.insert(it.package_); for (const auto& it : publisher_managers_) - packages_publisher.push_back(it.package_); - plugins.sort(); - plugins.unique(); - packages_subscriber.sort(); - packages_subscriber.unique(); - packages_publisher.sort(); - packages_publisher.unique(); + packages_publisher.insert(it.package_); insert_register("plugins", wolf::converter<std::string>::convert(plugins)); insert_register("packages_subscriber", wolf::converter<std::string>::convert(packages_subscriber)); insert_register("packages_publisher", wolf::converter<std::string>::convert(packages_publisher)); diff --git a/test/gtest_prior.cpp b/test/gtest_prior.cpp index 990c07d5dfe9caaa2a56df3618600987781c2d4f..1985c80b6c3e4e630898bcb2d8c421d54d230355 100644 --- a/test/gtest_prior.cpp +++ b/test/gtest_prior.cpp @@ -338,7 +338,7 @@ TEST(Prior, StateQuaternion) TEST(Prior, ParamsServer) { - ParserYaml parser = ParserYaml("test/yaml/params_prior.yaml", wolf_root); + ParserYaml parser = ParserYaml("test/yaml/params_prior.yaml", wolf_root, true); ParamsServer server = ParamsServer(parser.getParams()); std::vector<std::string> keys({"P","O"}); @@ -363,7 +363,7 @@ TEST(Prior, ParamsServer) if (not dynamic and drift) continue; - std::string prefix = key + to_string(dim) + "_" + mode + (dynamic ? "_dynamic" : "") + (drift ? "_drift" : ""); + std::string prefix = key + "_" + to_string(dim) + "D_" + mode + (dynamic ? "_dynamic" : "") + (drift ? "_drift" : ""); WOLF_INFO("Creating prior from prefix ", prefix); auto P = Prior(prefix, key, server); @@ -420,7 +420,7 @@ TEST(Prior, ParamsServer) TEST(Prior, ParamsServerWrong) { - ParserYaml parser = ParserYaml("test/yaml/params_prior_wrong.yaml", wolf_root); + ParserYaml parser = ParserYaml("test/yaml/params_prior_wrong.yaml", wolf_root, true); ParamsServer server = ParamsServer(parser.getParams()); std::vector<std::string> keys({"P","O"}); @@ -440,7 +440,7 @@ TEST(Prior, ParamsServerWrong) if (not dynamic and drift) continue; - std::string prefix = key + to_string(dim) + "_" + mode + (dynamic ? "_dynamic" : "") + (drift ? "_drift" : ""); + std::string prefix = key + "_" + to_string(dim) + "D_" + mode + (dynamic ? "_dynamic" : "") + (drift ? "_drift" : ""); WOLF_INFO("Creating prior from prefix ", prefix); ASSERT_THROW(auto P = Prior(prefix, key, server),std::runtime_error); diff --git a/test/gtest_sensor_base.cpp b/test/gtest_sensor_base.cpp index f2ef98beed7eeae2c9928bc0abcdd982df69e435..1b98fed3c06c6f08977be4305116170bae8ebf5b 100644 --- a/test/gtest_sensor_base.cpp +++ b/test/gtest_sensor_base.cpp @@ -27,24 +27,74 @@ */ #include "core/sensor/sensor_base.h" - #include "core/utils/utils_gtest.h" +#include "core/yaml/parser_yaml.h" +#include "core/utils/params_server.h" using namespace wolf; using namespace Eigen; +std::string wolf_root = _WOLF_ROOT_DIR; + +VectorXd vector0 = VectorXd(0); VectorXd p_state_2D = VectorXd::Random(2); VectorXd p_state_3D = VectorXd::Random(3); VectorXd o_state_2D = VectorXd::Random(1); VectorXd o_state_3D = VectorXd::Random(4).normalized(); -VectorXd p_sigma_2D = VectorXd::Random(2).cwiseAbs(); -VectorXd p_sigma_3D = VectorXd::Random(3).cwiseAbs(); -VectorXd o_sigma_2D = VectorXd::Random(1).cwiseAbs(); -VectorXd o_sigma_3D = VectorXd::Random(3).cwiseAbs(); - +VectorXd p_std_2D = VectorXd::Random(2).cwiseAbs(); +VectorXd p_std_3D = VectorXd::Random(3).cwiseAbs(); +VectorXd o_std_2D = VectorXd::Random(1).cwiseAbs(); +VectorXd o_std_3D = VectorXd::Random(3).cwiseAbs(); +MatrixXd p_cov_2D = p_std_2D.cwiseAbs2().asDiagonal(); +MatrixXd p_cov_3D = p_std_3D.cwiseAbs2().asDiagonal(); +MatrixXd o_cov_2D = o_std_2D.cwiseAbs2().asDiagonal(); +MatrixXd o_cov_3D = o_std_3D.cwiseAbs2().asDiagonal(); VectorXd noise_std = Vector2d::Constant(0.1); MatrixXd noise_cov = noise_std.cwiseAbs2().asDiagonal(); +void testSensor(SensorBasePtr S, + char _key, + const VectorXd& _state, + bool _fixed, + const VectorXd& _noise_std, + bool _dynamic, + const VectorXd& _drift_std) +{ + MatrixXd noise_cov = _noise_std.cwiseAbs2().asDiagonal(); + MatrixXd drift_cov = _drift_std.cwiseAbs2().asDiagonal(); + + // state + ASSERT_MATRIX_APPROX(_state, S->getStateBlockDynamic(_key)->getState(), Constants::EPS); + // fixed + ASSERT_EQ(S->getStateBlockDynamic(_key)->isFixed(), _fixed); + // dynamic + ASSERT_EQ(S->isStateBlockDynamic(_key), _dynamic); + // drift + ASSERT_EQ(_drift_std.size(), S->getDriftStd(_key).size()); + ASSERT_EQ(drift_cov.size(), S->getDriftCov(_key).size()); + if (_drift_std.size() != 0) + { + ASSERT_MATRIX_APPROX(_drift_std, S->getDriftStd(_key), Constants::EPS); + ASSERT_MATRIX_APPROX(drift_cov, S->getDriftCov(_key), Constants::EPS); + } + // factor + if (_noise_std.size() != 0) + { + ASSERT_TRUE(S->getPriorFeature(_key) != nullptr); + ASSERT_EQ(_state.size(), S->getPriorFeature(_key)->getMeasurement().size()); + ASSERT_MATRIX_APPROX(_state, + S->getPriorFeature(_key)->getMeasurement(), + Constants::EPS); + ASSERT_EQ(noise_cov.size(), S->getPriorFeature(_key)->getMeasurementCovariance().size()); + ASSERT_MATRIX_APPROX(noise_cov, + S->getPriorFeature(_key)->getMeasurementCovariance(), + Constants::EPS); + } + else + { + ASSERT_TRUE(S->getPriorFeature(_key) == nullptr); + } +} // CONSTRUCTOR WITH PRIORS AND PARAMS // 2D Fix @@ -53,19 +103,18 @@ TEST(SensorBase, POfix2D) auto params = std::make_shared<ParamsSensorBase>(); params->noise_std = noise_std; - auto S = std::make_shared<SensorBase>("SensorBase", - "sensor1", - 2, + auto S = std::make_shared<SensorBase>("SensorBase", "sensor1", 2, Priors({{'P',Prior("P", p_state_2D)}, //default "fix", not dynamic {'O',Prior("O", o_state_2D)}}), params); - ASSERT_MATRIX_APPROX(noise_std, S->getNoiseStd(), 1e-8); - ASSERT_MATRIX_APPROX(noise_cov, S->getNoiseCov(), 1e-8); - ASSERT_MATRIX_APPROX(p_state_2D, S->getP()->getState(), 1e-8); - ASSERT_MATRIX_APPROX(o_state_2D, S->getO()->getState(), 1e-8); - ASSERT_TRUE(S->getP()->isFixed()); - ASSERT_TRUE(S->getO()->isFixed()); + // noise + ASSERT_MATRIX_APPROX(S->getNoiseStd(), noise_std, Constants::EPS); + ASSERT_MATRIX_APPROX(S->getNoiseCov(), noise_cov, Constants::EPS); + + // checks + testSensor(S, 'P', p_state_2D, true, vector0, false, vector0); + testSensor(S, 'O', o_state_2D, true, vector0, false, vector0); } // 3D Fix @@ -74,19 +123,21 @@ TEST(SensorBase, POfix3D) auto params = std::make_shared<ParamsSensorBase>(); params->noise_std = noise_std; - auto S = std::make_shared<SensorBase>("SensorBase", - "sensor1", - 3, + auto S = std::make_shared<SensorBase>("SensorBase", "sensor1", 3, Priors({{'P',Prior("P", p_state_3D)}, //default "fix", not dynamic {'O',Prior("O", o_state_3D)}}), params); - ASSERT_MATRIX_APPROX(noise_std, S->getNoiseStd(), 1e-8); - ASSERT_MATRIX_APPROX(noise_cov, S->getNoiseCov(), 1e-8); - ASSERT_MATRIX_APPROX(p_state_3D, S->getP()->getState(), 1e-8); - ASSERT_MATRIX_APPROX(o_state_3D, S->getO()->getState(), 1e-8); - ASSERT_TRUE(S->getP()->isFixed()); - ASSERT_TRUE(S->getO()->isFixed()); + // noise + ASSERT_MATRIX_APPROX(S->getNoiseStd(), noise_std, Constants::EPS); + ASSERT_MATRIX_APPROX(S->getNoiseCov(), noise_cov, Constants::EPS); + + // factors + ASSERT_EQ(S->getPriorFeatures().size(), 0); + + // check + testSensor(S, 'P', p_state_3D, true, vector0, false, vector0); + testSensor(S, 'O', o_state_3D, true, vector0, false, vector0); } // 2D Initial guess @@ -95,19 +146,21 @@ TEST(SensorBase, POinitial_guess2D) auto params = std::make_shared<ParamsSensorBase>(); params->noise_std = noise_std; - auto S = std::make_shared<SensorBase>("SensorBase", - "sensor1", - 2, + auto S = std::make_shared<SensorBase>("SensorBase", "sensor1", 2, Priors({{'P',Prior("P", p_state_2D, "initial_guess")}, {'O',Prior("O", o_state_2D, "initial_guess")}}), params); - ASSERT_MATRIX_APPROX(noise_std, S->getNoiseStd(), 1e-8); - ASSERT_MATRIX_APPROX(noise_cov, S->getNoiseCov(), 1e-8); - ASSERT_MATRIX_APPROX(p_state_2D, S->getP()->getState(), 1e-8); - ASSERT_MATRIX_APPROX(o_state_2D, S->getO()->getState(), 1e-8); - ASSERT_FALSE(S->getP()->isFixed()); - ASSERT_FALSE(S->getO()->isFixed()); + // noise + ASSERT_MATRIX_APPROX(S->getNoiseStd(), noise_std, Constants::EPS); + ASSERT_MATRIX_APPROX(S->getNoiseCov(), noise_cov, Constants::EPS); + + // factors + ASSERT_EQ(S->getPriorFeatures().size(), 0); + + // check + testSensor(S, 'P', p_state_2D, false, vector0, false, vector0); + testSensor(S, 'O', o_state_2D, false, vector0, false, vector0); } // 3D Initial guess @@ -116,19 +169,21 @@ TEST(SensorBase, POinitial_guess3D) auto params = std::make_shared<ParamsSensorBase>(); params->noise_std = noise_std; - auto S = std::make_shared<SensorBase>("SensorBase", - "sensor1", - 3, + auto S = std::make_shared<SensorBase>("SensorBase", "sensor1", 3, Priors({{'P',Prior("P", p_state_3D, "initial_guess")}, {'O',Prior("O", o_state_3D, "initial_guess")}}), params); - ASSERT_MATRIX_APPROX(noise_std, S->getNoiseStd(), 1e-8); - ASSERT_MATRIX_APPROX(noise_cov, S->getNoiseCov(), 1e-8); - ASSERT_MATRIX_APPROX(p_state_3D, S->getP()->getState(), 1e-8); - ASSERT_MATRIX_APPROX(o_state_3D, S->getO()->getState(), 1e-8); - ASSERT_FALSE(S->getP()->isFixed()); - ASSERT_FALSE(S->getO()->isFixed()); + // noise + ASSERT_MATRIX_APPROX(S->getNoiseStd(), noise_std, Constants::EPS); + ASSERT_MATRIX_APPROX(S->getNoiseCov(), noise_cov, Constants::EPS); + + // factors + ASSERT_EQ(S->getPriorFeatures().size(), 0); + + // check + testSensor(S, 'P', p_state_3D, false, vector0, false, vector0); + testSensor(S, 'O', o_state_3D, false, vector0, false, vector0); } // 2D Factor @@ -137,19 +192,21 @@ TEST(SensorBase, POfactor2D) auto params = std::make_shared<ParamsSensorBase>(); params->noise_std = noise_std; - auto S = std::make_shared<SensorBase>("SensorBase", - "sensor1", - 2, - Priors({{'P',Prior("P", p_state_2D, "factor", p_sigma_2D)}, - {'O',Prior("O", o_state_2D, "factor", o_sigma_2D)}}), + auto S = std::make_shared<SensorBase>("SensorBase", "sensor1", 2, + Priors({{'P',Prior("P", p_state_2D, "factor", p_std_2D)}, + {'O',Prior("O", o_state_2D, "factor", o_std_2D)}}), params); - ASSERT_MATRIX_APPROX(noise_std, S->getNoiseStd(), 1e-8); - ASSERT_MATRIX_APPROX(noise_cov, S->getNoiseCov(), 1e-8); - ASSERT_MATRIX_APPROX(p_state_2D, S->getP()->getState(), 1e-8); - ASSERT_MATRIX_APPROX(o_state_2D, S->getO()->getState(), 1e-8); - ASSERT_FALSE(S->getP()->isFixed()); - ASSERT_FALSE(S->getO()->isFixed()); + // noise + ASSERT_MATRIX_APPROX(S->getNoiseStd(), noise_std, Constants::EPS); + ASSERT_MATRIX_APPROX(S->getNoiseCov(), noise_cov, Constants::EPS); + + // factors + ASSERT_EQ(S->getPriorFeatures().size(), 2); + + // check + testSensor(S, 'P', p_state_2D, false, p_std_2D, false, vector0); + testSensor(S, 'O', o_state_2D, false, o_std_2D, false, vector0); } // 3D Factor @@ -158,19 +215,21 @@ TEST(SensorBase, POfactor3D) auto params = std::make_shared<ParamsSensorBase>(); params->noise_std = noise_std; - auto S = std::make_shared<SensorBase>("SensorBase", - "sensor1", - 3, - Priors({{'P',Prior("P", p_state_3D, "factor", p_sigma_3D)}, - {'O',Prior("O", o_state_3D, "factor", o_sigma_3D)}}), + auto S = std::make_shared<SensorBase>("SensorBase", "sensor1", 3, + Priors({{'P',Prior("P", p_state_3D, "factor", p_std_3D)}, + {'O',Prior("O", o_state_3D, "factor", o_std_3D)}}), params); - ASSERT_MATRIX_APPROX(noise_std, S->getNoiseStd(), 1e-8); - ASSERT_MATRIX_APPROX(noise_cov, S->getNoiseCov(), 1e-8); - ASSERT_MATRIX_APPROX(p_state_3D, S->getP()->getState(), 1e-8); - ASSERT_MATRIX_APPROX(o_state_3D, S->getO()->getState(), 1e-8); - ASSERT_FALSE(S->getP()->isFixed()); - ASSERT_FALSE(S->getO()->isFixed()); + // noise + ASSERT_MATRIX_APPROX(S->getNoiseStd(), noise_std, Constants::EPS); + ASSERT_MATRIX_APPROX(S->getNoiseCov(), noise_cov, Constants::EPS); + + // factors + ASSERT_EQ(S->getPriorFeatures().size(), 2); + + // check + testSensor(S, 'P', p_state_3D, false, p_std_3D, false, vector0); + testSensor(S, 'O', o_state_3D, false, o_std_3D, false, vector0); } // 2D Initial guess dynamic @@ -179,19 +238,21 @@ TEST(SensorBase, POinitial_guess_dynamic2D) auto params = std::make_shared<ParamsSensorBase>(); params->noise_std = noise_std; - auto S = std::make_shared<SensorBase>("SensorBase", - "sensor1", - 2, - Priors({{'P',Prior("P", p_state_2D, "initial_guess", p_sigma_2D, true, p_sigma_2D)}, - {'O',Prior("O", o_state_2D, "initial_guess", o_sigma_2D, true, o_sigma_2D)}}), + auto S = std::make_shared<SensorBase>("SensorBase", "sensor1", 2, + Priors({{'P',Prior("P", p_state_2D, "initial_guess", vector0, true)}, + {'O',Prior("O", o_state_2D, "initial_guess", vector0, true)}}), params); - ASSERT_MATRIX_APPROX(noise_std, S->getNoiseStd(), 1e-8); - ASSERT_MATRIX_APPROX(noise_cov, S->getNoiseCov(), 1e-8); - ASSERT_MATRIX_APPROX(p_state_2D, S->getP()->getState(), 1e-8); - ASSERT_MATRIX_APPROX(o_state_2D, S->getO()->getState(), 1e-8); - ASSERT_FALSE(S->getP()->isFixed()); - ASSERT_FALSE(S->getO()->isFixed()); + // noise + ASSERT_MATRIX_APPROX(S->getNoiseStd(), noise_std, Constants::EPS); + ASSERT_MATRIX_APPROX(S->getNoiseCov(), noise_cov, Constants::EPS); + + // factors + ASSERT_EQ(S->getPriorFeatures().size(), 0); + + // check + testSensor(S, 'P', p_state_2D, false, vector0, true, vector0); + testSensor(S, 'O', o_state_2D, false, vector0, true, vector0); } // 3D Initial guess dynamic @@ -200,19 +261,178 @@ TEST(SensorBase, POinitial_guess_dynamic3D) auto params = std::make_shared<ParamsSensorBase>(); params->noise_std = noise_std; - auto S = std::make_shared<SensorBase>("SensorBase", - "sensor1", - 3, - Priors({{'P',Prior("P", p_state_3D, "initial_guess", p_sigma_3D, true, p_sigma_3D)}, - {'O',Prior("O", o_state_3D, "initial_guess", o_sigma_3D, true, o_sigma_3D)}}), + auto S = std::make_shared<SensorBase>("SensorBase", "sensor1", 3, + Priors({{'P',Prior("P", p_state_3D, "initial_guess", vector0, true)}, + {'O',Prior("O", o_state_3D, "initial_guess", vector0, true)}}), + params); + + // noise + ASSERT_MATRIX_APPROX(S->getNoiseStd(), noise_std, Constants::EPS); + ASSERT_MATRIX_APPROX(S->getNoiseCov(), noise_cov, Constants::EPS); + + // factors + ASSERT_EQ(S->getPriorFeatures().size(), 0); + + // check + testSensor(S, 'P', p_state_3D, false, vector0, true, vector0); + testSensor(S, 'O', o_state_3D, false, vector0, true, vector0); +} + +// 2D Initial guess dynamic drift +TEST(SensorBase, POinitial_guess_dynamic2D_drift) +{ + auto params = std::make_shared<ParamsSensorBase>(); + params->noise_std = noise_std; + + auto S = std::make_shared<SensorBase>("SensorBase", "sensor1", 2, + Priors({{'P',Prior("P", p_state_2D, "initial_guess", vector0, true, p_std_2D)}, + {'O',Prior("O", o_state_2D, "initial_guess", vector0, true, o_std_2D)}}), + params); + + // noise + ASSERT_MATRIX_APPROX(S->getNoiseStd(), noise_std, Constants::EPS); + ASSERT_MATRIX_APPROX(S->getNoiseCov(), noise_cov, Constants::EPS); + + // factors + ASSERT_EQ(S->getPriorFeatures().size(), 0); + + // check + testSensor(S, 'P', p_state_2D, false, vector0, true, p_std_2D); + testSensor(S, 'O', o_state_2D, false, vector0, true, o_std_2D); +} + +// 3D Initial guess dynamic drift +TEST(SensorBase, POinitial_guess_dynamic3D_drift) +{ + auto params = std::make_shared<ParamsSensorBase>(); + params->noise_std = noise_std; + + auto S = std::make_shared<SensorBase>("SensorBase", "sensor1", 3, + Priors({{'P',Prior("P", p_state_3D, "initial_guess", vector0, true, p_std_3D)}, + {'O',Prior("O", o_state_3D, "initial_guess", vector0, true, o_std_3D)}}), + params); + + // noise + ASSERT_MATRIX_APPROX(S->getNoiseStd(), noise_std, Constants::EPS); + ASSERT_MATRIX_APPROX(S->getNoiseCov(), noise_cov, Constants::EPS); + + // factors + ASSERT_EQ(S->getPriorFeatures().size(), 0); + + // check + testSensor(S, 'P', p_state_3D, false, vector0, true, p_std_3D); + testSensor(S, 'O', o_state_3D, false, vector0, true, o_std_3D); +} + +// 3D POI mixed +TEST(SensorBase, POI_mixed) +{ + auto params = std::make_shared<ParamsSensorBase>(); + params->noise_std = noise_std; + + VectorXd i_state_3D = VectorXd::Random(5); + + auto S = std::make_shared<SensorBase>("SensorBase", "sensor1", 3, + Priors({{'P',Prior("P", p_state_3D, "fix", vector0, true)}, + {'O',Prior("O", o_state_3D, "factor", o_std_3D, true, o_std_3D)}, + {'I',Prior("StateBlock", i_state_3D, "initial_guess")}, + {'A',Prior("StateQuaternion", o_state_3D, "factor", o_std_3D)}}), params); - ASSERT_MATRIX_APPROX(noise_std, S->getNoiseStd(), 1e-8); - ASSERT_MATRIX_APPROX(noise_cov, S->getNoiseCov(), 1e-8); - ASSERT_MATRIX_APPROX(p_state_3D, S->getP()->getState(), 1e-8); - ASSERT_MATRIX_APPROX(o_state_3D, S->getO()->getState(), 1e-8); - ASSERT_FALSE(S->getP()->isFixed()); - ASSERT_FALSE(S->getO()->isFixed()); + // noise + ASSERT_MATRIX_APPROX(S->getNoiseStd(), noise_std, Constants::EPS); + ASSERT_MATRIX_APPROX(S->getNoiseCov(), noise_cov, Constants::EPS); + + // factors + ASSERT_EQ(S->getPriorFeatures().size(), 2); + + // check + testSensor(S, 'P', p_state_3D, true, vector0, true, vector0); + testSensor(S, 'O', o_state_3D, false, o_std_3D, true, o_std_3D); + testSensor(S, 'I', i_state_3D, false, vector0, false, vector0); + testSensor(S, 'A', o_state_3D, false, o_std_3D, false, vector0); +} + +// CONSTRUCTOR WITH PARAM SERVER and KEY_TYPES +// 2D Fix +TEST(SensorBase, POfix2D_server) +{ + ParserYaml parser = ParserYaml("test/yaml/sensor_base.yaml", wolf_root, true); + ParamsServer server = ParamsServer(parser.getParams()); + + std::vector<int> dims({2, 3}); + std::vector<std::string> modes({"fix", "initial_guess", "factor"}); + std::vector<bool> dynamics({false, true}); + std::vector<bool> drifts({false, true}); + + VectorXd p_state(4), o_state(4), po_std(4); + p_state << 1, 2, 3, 4; + o_state << 1, 0, 0, 0; + po_std << 0.1, 0.2, 0.3, 0.4; + + // P & O + for (auto dim : dims) + for (auto mode : modes) + for (auto dynamic : dynamics) + for (auto drift : drifts) + { + // nonsense combination + if (not dynamic and drift) + continue; + + // CORRECT YAML + std::string name = "sensor_PO_" + to_string(dim) + "D_" + mode + (dynamic ? "_dynamic" : "") + (drift ? "_drift" : ""); + WOLF_INFO("Creating sensor from name ", name); + + auto S = std::make_shared<SensorBase>("SensorBase", name, dim, server); + + auto p_size = dim; + auto o_size = dim == 2 ? 1 : 4; + auto p_size_std = mode == "factor" ? dim : 0; + auto o_size_std = mode == "factor" ? (dim == 2 ? 1 : 3) : 0; + auto p_size_std_drift = drift ? dim : 0; + auto o_size_std_drift = drift ? (dim == 2 ? 1 : 3) : 0; + + // noise + ASSERT_MATRIX_APPROX(S->getNoiseStd(), po_std.head<2>(), Constants::EPS); + ASSERT_MATRIX_APPROX(S->getNoiseCov(), MatrixXd(po_std.head<2>().cwiseAbs2().asDiagonal()), Constants::EPS); + + // factors + ASSERT_EQ(S->getPriorFeatures().size(), mode == "factor" ? 2 : 0); + + // check + testSensor(S, 'P', p_state.head(p_size), mode == "fix", po_std.head(p_size_std), dynamic, po_std.head(p_size_std_drift)); + testSensor(S, 'O', o_state.head(o_size), mode == "fix", po_std.head(o_size_std), dynamic, po_std.head(o_size_std_drift)); + + + // INCORRECT YAML + WOLF_INFO("Creating sensor from name ", name + "_wrong"); + ASSERT_THROW(std::make_shared<SensorBase>("SensorBase", name + "_wrong", dim, server),std::runtime_error); + } + + // P & O & I & A - 3D + // CORRECT YAML + WOLF_INFO("Creating sensor from name sensor_POIA_3D"); + + auto S = std::make_shared<SensorBase>("SensorBase", + "sensor_POIA_3D", + 3, + server, + std::unordered_map<char, std::string>({{'I',"StateBlock"}, + {'A',"StateQuaternion"}})); + + // noise + ASSERT_MATRIX_APPROX(S->getNoiseStd(), po_std.head<2>(), Constants::EPS); + ASSERT_MATRIX_APPROX(S->getNoiseCov(), MatrixXd(po_std.head<2>().cwiseAbs2().asDiagonal()), Constants::EPS); + + // factors + ASSERT_EQ(S->getPriorFeatures().size(), 2); + + // check + testSensor(S, 'P', p_state.head(3), false, po_std.head(3), true, vector0); + testSensor(S, 'O', o_state.head(4), true, vector0, false, vector0); + testSensor(S, 'I', p_state.head(4), false, vector0, true, po_std.head(4)); + testSensor(S, 'A', o_state.head(4), false, po_std.head(3), true, po_std.head(3)); } int main(int argc, char **argv) diff --git a/test/yaml/params_prior.yaml b/test/yaml/params_prior.yaml index 00c6f18916822a0f62a9436b2aff54ea14f1dcb7..eea5d70f1b1738291f2961d6fbabe61e0f1fa20f 100644 --- a/test/yaml/params_prior.yaml +++ b/test/yaml/params_prior.yaml @@ -1,263 +1,259 @@ -config: - problem: - dim: 2 - - # P in 2D - P2_initial_guess: - mode: initial_guess - state: [1, 2] - dynamic: false - - P2_fix: - mode: fix - state: [1, 2] - dynamic: false - - P2_factor: - mode: factor - state: [1, 2] - noise_std: [0.1, 0.2] - dynamic: false - - P2_initial_guess_dynamic_drift: - mode: initial_guess - state: [1, 2] - dynamic: true - drift_std: [0.1, 0.2] - - P2_fix_dynamic_drift: - mode: fix - state: [1, 2] - dynamic: true - drift_std: [0.1, 0.2] - - P2_factor_dynamic_drift: - mode: factor - state: [1, 2] - noise_std: [0.1, 0.2] - dynamic: true - drift_std: [0.1, 0.2] - - P2_initial_guess_dynamic: - mode: initial_guess - state: [1, 2] - dynamic: true - - P2_fix_dynamic: - mode: fix - state: [1, 2] - dynamic: true - - P2_factor_dynamic: - mode: factor - state: [1, 2] - noise_std: [0.1, 0.2] - dynamic: true - - # P in 3D - P3_initial_guess: - mode: initial_guess - state: [1, 2, 3] - dynamic: false - - P3_fix: - mode: fix - state: [1, 2, 3] - dynamic: false - - P3_factor: - mode: factor - state: [1, 2, 3] - noise_std: [0.1, 0.2, 0.3] - dynamic: false - - P3_initial_guess_dynamic_drift: - mode: initial_guess - state: [1, 2, 3] - dynamic: true - drift_std: [0.1, 0.2, 0.3] - - P3_fix_dynamic_drift: - mode: fix - state: [1, 2, 3] - dynamic: true - drift_std: [0.1, 0.2, 0.3] - - P3_factor_dynamic_drift: - mode: factor - state: [1, 2, 3] - noise_std: [0.1, 0.2, 0.3] - dynamic: true - drift_std: [0.1, 0.2, 0.3] - - P3_initial_guess_dynamic: - mode: initial_guess - state: [1, 2, 3] - dynamic: true - - P3_fix_dynamic: - mode: fix - state: [1, 2, 3] - dynamic: true - - P3_factor_dynamic: - mode: factor - state: [1, 2, 3] - noise_std: [0.1, 0.2, 0.3] - dynamic: true - - # O in 2D - O2_initial_guess: - mode: initial_guess - state: [1] - dynamic: false - - O2_fix: - mode: fix - state: [1] - dynamic: false - - O2_factor: - mode: factor - state: [1] - noise_std: [0.1] - dynamic: false - - O2_initial_guess_dynamic_drift: - mode: initial_guess - state: [1] - dynamic: true - drift_std: [0.1] - - O2_fix_dynamic_drift: - mode: fix - state: [1] - dynamic: true - drift_std: [0.1] - - O2_factor_dynamic_drift: - mode: factor - state: [1] - noise_std: [0.1] - dynamic: true - drift_std: [0.1] - - O2_initial_guess_dynamic: - mode: initial_guess - state: [1] - dynamic: true - - O2_fix_dynamic: - mode: fix - state: [1] - dynamic: true - - O2_factor_dynamic: - mode: factor - state: [1] - noise_std: [0.1] - dynamic: true - - # O in 3D - O3_initial_guess: - mode: initial_guess - state: [1, 0, 0, 0] - dynamic: false - - O3_fix: - mode: fix - state: [1, 0, 0, 0] - dynamic: false - - O3_factor: - mode: factor - state: [1, 0, 0, 0] - noise_std: [0.1, 0.2, 0.3] - dynamic: false - - O3_initial_guess_dynamic_drift: - mode: initial_guess - state: [1, 0, 0, 0] - dynamic: true - drift_std: [0.1, 0.2, 0.3] - - O3_fix_dynamic_drift: - mode: fix - state: [1, 0, 0, 0] - dynamic: true - drift_std: [0.1, 0.2, 0.3] - - O3_factor_dynamic_drift: - mode: factor - state: [1, 0, 0, 0] - noise_std: [0.1, 0.2, 0.3] - dynamic: true - drift_std: [0.1, 0.2, 0.3] - - O3_initial_guess_dynamic: - mode: initial_guess - state: [1, 0, 0, 0] - dynamic: true - - O3_fix_dynamic: - mode: fix - state: [1, 0, 0, 0] - dynamic: true - - O3_factor_dynamic: - mode: factor - state: [1, 0, 0, 0] - noise_std: [0.1, 0.2, 0.3] - dynamic: true - - # I - I_initial_guess: - mode: initial_guess - state: [1, 2, 3, 4] - dynamic: false - - I_fix: - mode: fix - state: [1, 2, 3, 4] - dynamic: false - - I_factor: - mode: factor - state: [1, 2, 3, 4] - noise_std: [0.1, 0.2, 0.3, 0.4] - dynamic: false - - I_initial_guess_dynamic_drift: - mode: initial_guess - state: [1, 2, 3, 4] - dynamic: true - drift_std: [0.1, 0.2, 0.3, 0.4] - - I_fix_dynamic_drift: - mode: fix - state: [1, 2, 3, 4] - dynamic: true - drift_std: [0.1, 0.2, 0.3, 0.4] - - I_factor_dynamic_drift: - mode: factor - state: [1, 2, 3, 4] - noise_std: [0.1, 0.2, 0.3, 0.4] - dynamic: true - drift_std: [0.1, 0.2, 0.3, 0.4] - - I_initial_guess_dynamic: - mode: initial_guess - state: [1, 2, 3, 4] - dynamic: true - - I_fix_dynamic: - mode: fix - state: [1, 2, 3, 4] - dynamic: true - - I_factor_dynamic: - mode: factor - state: [1, 2, 3, 4] - noise_std: [0.1, 0.2, 0.3, 0.4] - dynamic: true \ No newline at end of file +# P in 2D +P_2D_initial_guess: + mode: initial_guess + state: [1, 2] + dynamic: false + +P_2D_fix: + mode: fix + state: [1, 2] + dynamic: false + +P_2D_factor: + mode: factor + state: [1, 2] + noise_std: [0.1, 0.2] + dynamic: false + +P_2D_initial_guess_dynamic_drift: + mode: initial_guess + state: [1, 2] + dynamic: true + drift_std: [0.1, 0.2] + +P_2D_fix_dynamic_drift: + mode: fix + state: [1, 2] + dynamic: true + drift_std: [0.1, 0.2] + +P_2D_factor_dynamic_drift: + mode: factor + state: [1, 2] + noise_std: [0.1, 0.2] + dynamic: true + drift_std: [0.1, 0.2] + +P_2D_initial_guess_dynamic: + mode: initial_guess + state: [1, 2] + dynamic: true + +P_2D_fix_dynamic: + mode: fix + state: [1, 2] + dynamic: true + +P_2D_factor_dynamic: + mode: factor + state: [1, 2] + noise_std: [0.1, 0.2] + dynamic: true + +# P in 3D +P_3D_initial_guess: + mode: initial_guess + state: [1, 2, 3] + dynamic: false + +P_3D_fix: + mode: fix + state: [1, 2, 3] + dynamic: false + +P_3D_factor: + mode: factor + state: [1, 2, 3] + noise_std: [0.1, 0.2, 0.3] + dynamic: false + +P_3D_initial_guess_dynamic_drift: + mode: initial_guess + state: [1, 2, 3] + dynamic: true + drift_std: [0.1, 0.2, 0.3] + +P_3D_fix_dynamic_drift: + mode: fix + state: [1, 2, 3] + dynamic: true + drift_std: [0.1, 0.2, 0.3] + +P_3D_factor_dynamic_drift: + mode: factor + state: [1, 2, 3] + noise_std: [0.1, 0.2, 0.3] + dynamic: true + drift_std: [0.1, 0.2, 0.3] + +P_3D_initial_guess_dynamic: + mode: initial_guess + state: [1, 2, 3] + dynamic: true + +P_3D_fix_dynamic: + mode: fix + state: [1, 2, 3] + dynamic: true + +P_3D_factor_dynamic: + mode: factor + state: [1, 2, 3] + noise_std: [0.1, 0.2, 0.3] + dynamic: true + +# O in 2D +O_2D_initial_guess: + mode: initial_guess + state: [1] + dynamic: false + +O_2D_fix: + mode: fix + state: [1] + dynamic: false + +O_2D_factor: + mode: factor + state: [1] + noise_std: [0.1] + dynamic: false + +O_2D_initial_guess_dynamic_drift: + mode: initial_guess + state: [1] + dynamic: true + drift_std: [0.1] + +O_2D_fix_dynamic_drift: + mode: fix + state: [1] + dynamic: true + drift_std: [0.1] + +O_2D_factor_dynamic_drift: + mode: factor + state: [1] + noise_std: [0.1] + dynamic: true + drift_std: [0.1] + +O_2D_initial_guess_dynamic: + mode: initial_guess + state: [1] + dynamic: true + +O_2D_fix_dynamic: + mode: fix + state: [1] + dynamic: true + +O_2D_factor_dynamic: + mode: factor + state: [1] + noise_std: [0.1] + dynamic: true + +# O in 3D +O_3D_initial_guess: + mode: initial_guess + state: [1, 0, 0, 0] + dynamic: false + +O_3D_fix: + mode: fix + state: [1, 0, 0, 0] + dynamic: false + +O_3D_factor: + mode: factor + state: [1, 0, 0, 0] + noise_std: [0.1, 0.2, 0.3] + dynamic: false + +O_3D_initial_guess_dynamic_drift: + mode: initial_guess + state: [1, 0, 0, 0] + dynamic: true + drift_std: [0.1, 0.2, 0.3] + +O_3D_fix_dynamic_drift: + mode: fix + state: [1, 0, 0, 0] + dynamic: true + drift_std: [0.1, 0.2, 0.3] + +O_3D_factor_dynamic_drift: + mode: factor + state: [1, 0, 0, 0] + noise_std: [0.1, 0.2, 0.3] + dynamic: true + drift_std: [0.1, 0.2, 0.3] + +O_3D_initial_guess_dynamic: + mode: initial_guess + state: [1, 0, 0, 0] + dynamic: true + +O_3D_fix_dynamic: + mode: fix + state: [1, 0, 0, 0] + dynamic: true + +O_3D_factor_dynamic: + mode: factor + state: [1, 0, 0, 0] + noise_std: [0.1, 0.2, 0.3] + dynamic: true + +# I +I_initial_guess: + mode: initial_guess + state: [1, 2, 3, 4] + dynamic: false + +I_fix: + mode: fix + state: [1, 2, 3, 4] + dynamic: false + +I_factor: + mode: factor + state: [1, 2, 3, 4] + noise_std: [0.1, 0.2, 0.3, 0.4] + dynamic: false + +I_initial_guess_dynamic_drift: + mode: initial_guess + state: [1, 2, 3, 4] + dynamic: true + drift_std: [0.1, 0.2, 0.3, 0.4] + +I_fix_dynamic_drift: + mode: fix + state: [1, 2, 3, 4] + dynamic: true + drift_std: [0.1, 0.2, 0.3, 0.4] + +I_factor_dynamic_drift: + mode: factor + state: [1, 2, 3, 4] + noise_std: [0.1, 0.2, 0.3, 0.4] + dynamic: true + drift_std: [0.1, 0.2, 0.3, 0.4] + +I_initial_guess_dynamic: + mode: initial_guess + state: [1, 2, 3, 4] + dynamic: true + +I_fix_dynamic: + mode: fix + state: [1, 2, 3, 4] + dynamic: true + +I_factor_dynamic: + mode: factor + state: [1, 2, 3, 4] + noise_std: [0.1, 0.2, 0.3, 0.4] + dynamic: true \ No newline at end of file diff --git a/test/yaml/params_prior_wrong.yaml b/test/yaml/params_prior_wrong.yaml index 31b919571be9a6e9bfa0cae6255d077ce2e037b5..afdaa97e76af653b6674fb7c62fa49fd5d514676 100644 --- a/test/yaml/params_prior_wrong.yaml +++ b/test/yaml/params_prior_wrong.yaml @@ -1,275 +1,260 @@ -config: - problem: - dim: 2 - - # P in 2D - P2_initial_guess: - mode: initial_guess - #state: [1, 2] # missing - dynamic: false - - P2_fix: - mode: fix - #state: [1, 2] # missing - dynamic: false - - P2_factor: - mode: factor - state: [1, 2] - noise_std: [0.1, 0.2, 0.3] # wrong size - dynamic: false - - P2_initial_guess_dynamic: - mode: initial_guess - state: [1, 2] - #dynamic: true #missing - - P2_fix_dynamic: - mode: fix - state: [1] # wrong size - dynamic: true - - P2_factor_dynamic: - mode: factor - state: [1, 2] - #noise_std: [0.1, 0.2] # missing - dynamic: true - - P2_initial_guess_dynamic_drift: - mode: initial_guess - state: [1, 2] - dynamic: true - #drift_std: [0.1, 0.2] #missing - - P2_fix_dynamic_drift: - mode: fix - state: [1, 2] - dynamic: true - drift_std: [0.1, 0.2, 0.3] # wrong size - - P2_factor_dynamic_drift: - mode: factor - state: [1, 2] - #noise_std: [0.1, 0.2] # missing - dynamic: true - drift_std: [0.1, 0.2] - - # P in 3D - P3_initial_guess: - #mode: initial_guess # missing - state: [1, 2, 3] - dynamic: false - - P3_fix: - mode: fix - state: [1, 2, 3, 4] # wrong size - dynamic: false - - P3_factor: - mode: factor - state: [1, 2, 3] - noise_std: [0.1, 0.2] # wrong size - dynamic: false - - P3_initial_guess_dynamic: - mode: initial_guess - state: [1, 2, 3] - dynamic: true - drift_std: [0.1, 0.2] # wrong size - - P3_fix_dynamic: - mode: fix - state: [1, 2, 3] - dynamic: true - #drift_std: [0.1, 0.2] # missing - - P3_factor_dynamic: - mode: factor - state: [1, 2, 3] - noise_std: [0.1, 0.2] # wrong size - dynamic: true - drift_std: [0.1, 0.2, 0.3] - - P3_initial_guess_dynamic_drift: - mode: initial_guess - state: [1, 2, 3] - dynamic: true - drift_std: [0.1, 0.2] # wrong size - - P3_fix_dynamic_drift: - mode: fix - state: [1, 2, 3] - dynamic: true - #drift_std: [0.1, 0.2] # missing - - P3_factor_dynamic_drift: - mode: factor - state: [1, 2, 3] - noise_std: [0.1, 0.2] # wrong size - dynamic: true - drift_std: [0.1, 0.2, 0.3] - - # O in 2D - O2_initial_guess: - mode: initial_guess - state: [1, 2] # wrong size - dynamic: false - - O2_fix: - mode: fix - state: [1] - #dynamic: false # missing - - O2_factor: - mode: factor - state: [1] - noise_std: [0.1, 0.2] # wrong size - dynamic: false - - O2_initial_guess_dynamic: - mode: initial_guess - state: [1] - dynamic: true - #drift_std: [0.1] # missing - - O2_fix_dynamic: - mode: fix - state: [1 2] # wrong size - dynamic: true - drift_std: [0.1] - - O2_factor_dynamic: - mode: factor - state: [1] - noise_std: [0.1 0.2] # wrong size - dynamic: true - drift_std: [0.1] - - O2_initial_guess_dynamic_drift: - mode: initial_guess - state: [1] - dynamic: true - #drift_std: [0.1] # missing - - O2_fix_dynamic_drift: - mode: fix - state: [1 2] # wrong size - dynamic: true - drift_std: [0.1] - - O2_factor_dynamic_drift: - mode: factor - state: [1] - noise_std: [0.1 0.2] # wrong size - dynamic: true - drift_std: [0.1] - - # O in 3D - O3_initial_guess: - mode: initial_guess - #state: [1, 0, 0, 0] # missing - dynamic: false - - O3_fix: - mode: fix - state: [1, 0, 0, 0] - #dynamic: false # missing - - O3_factor: - mode: factor - state: [1, 0, 0, 0] - noise_std: [0.1, 0.2] # wrong size - dynamic: false - - O3_initial_guess_dynamic: - mode: initial_guess - state: [1, 0, 0] # wrong size - dynamic: true - drift_std: [0.1, 0.2, 0.3] - - O3_fix_dynamic: - mode: fix - state: [1, 0, 0, 0] - dynamic: true - #drift_std: [0.1, 0.2, 0.3] # missing - - O3_factor_dynamic: - mode: factor - state: [1, 0, 0, 0] - noise_std: [0.1, 0.2, 0.3] - dynamic: true - drift_std: [0.1, 0.2] # wrong size - - O3_initial_guess_dynamic_drift: - mode: initial_guess - state: [1, 0, 0] # wrong size - dynamic: true - drift_std: [0.1, 0.2, 0.3] - - O3_fix_dynamic_drift: - mode: fix - state: [1, 0, 0, 0] - dynamic: true - #drift_std: [0.1, 0.2, 0.3] # missing - - O3_factor_dynamic_drift: - mode: factor - state: [1, 0, 0, 0] - noise_std: [0.1, 0.2, 0.3] - dynamic: true - drift_std: [0.1, 0.2] # wrong size - - # I - I_initial_guess: - #mode: initial_guess # missing - state: [1, 2, 3, 4] - dynamic: false - - I_fix: - mode: fix - #state: [1, 2, 3, 4] # missing - dynamic: false - - I_factor: - mode: factor - state: [1, 2, 3, 4] - noise_std: [0.1, 0.2, 0.3] # wrong size - dynamic: false - - I_initial_guess_dynamic: - mode: initial_guess - state: [1, 2, 3, 4] - dynamic: true - drift_std: [0.1, 0.2, 0.3] # wrong size - - I_fix_dynamic: - mode: fix - state: [1, 2, 3] # wrong size - dynamic: true - drift_std: [0.1, 0.2, 0.3, 0.4] - - I_factor_dynamic: - mode: factor - state: [1, 2, 3, 4] - noise_std: [0.1, 0.2, 0.3] # wrong size - dynamic: true - drift_std: [0.1, 0.2, 0.3, 0.4] - - I_initial_guess_dynamic_drift: - mode: initial_guess - state: [1, 2, 3, 4] - dynamic: true - drift_std: [0.1, 0.2, 0.3] # wrong size - - I_fix_dynamic_drift: - mode: fix - state: [1, 2, 3] # wrong size - dynamic: true - drift_std: [0.1, 0.2, 0.3, 0.4] - - I_factor_dynamic_drift: - mode: factor - state: [1, 2, 3, 4] - noise_std: [0.1, 0.2, 0.3] # wrong size - dynamic: true - drift_std: [0.1, 0.2, 0.3, 0.4] \ No newline at end of file +# P in _2D_ +P_2D_initial_guess: + mode: initial_guess + #state: [1, 2] # missing + dynamic: false + +P_2D_fix: + mode: fix + #state: [1, 2] # missing + dynamic: false + +P_2D_factor: + mode: factor + state: [1, 2] + noise_std: [0.1, 0.2, 0.3] # wrong size + dynamic: false + +P_2D_initial_guess_dynamic: + mode: initial_guess + state: [1, 2] + #dynamic: true #missing + +P_2D_fix_dynamic: + mode: fix + state: [1] # wrong size + dynamic: true + +P_2D_factor_dynamic: + mode: factor + state: [1, 2] + #noise_std: [0.1, 0.2] # missing + dynamic: true + +P_2D_initial_guess_dynamic_drift: + mode: initial_guess + state: [1, 2] + dynamic: true + drift_std: [0.1, 0.2, 0.3] # wrong size + +P_2D_fix_dynamic_drift: + mode: fix + state: [1, 2] + dynamic: true + drift_std: [0.1] # wrong size + +P_2D_factor_dynamic_drift: + mode: factor + state: [1, 2] + #noise_std: [0.1, 0.2] # missing + dynamic: true + drift_std: [0.1, 0.2] + +# P in _3D_ +P_3D_initial_guess: + #mode: initial_guess # missing + state: [1, 2, 3] + dynamic: false + +P_3D_fix: + mode: fix + state: [1, 2, 3, 4] # wrong size + dynamic: false + +P_3D_factor: + mode: factor + state: [1, 2, 3] + noise_std: [0.1, 0.2] # wrong size + dynamic: false + +P_3D_initial_guess_dynamic: + mode: initial_guess + state: [1, 2, 3, 4] # wrong size + dynamic: true + +P_3D_fix_dynamic: + mode: fix + state: [1, 2, 3] + # dynamic: true # missing + +P_3D_factor_dynamic: + mode: factor + state: [1, 2, 3] + noise_std: [0.1, 0.2] # wrong size + dynamic: true + drift_std: [0.1, 0.2, 0.3] + +P_3D_initial_guess_dynamic_drift: + mode: initial_guess + state: [1, 2, 3] + dynamic: true + drift_std: [0.1, 0.2] # wrong size + +P_3D_fix_dynamic_drift: + #mode: fix + state: [1, 2, 3] + dynamic: true + drift_std: [0.1, 0.2] + +P_3D_factor_dynamic_drift: + mode: factor + state: [1, 2, 3] + noise_std: [0.1, 0.2] # wrong size + dynamic: true + drift_std: [0.1, 0.2, 0.3] + +# O in _2D_ +O_2D_initial_guess: + mode: initial_guess + state: [1, 2] # wrong size + dynamic: false + +O_2D_fix: + mode: fix + state: [1] + #dynamic: false # missing + +O_2D_factor: + mode: factor + state: [1] + noise_std: [0.1, 0.2] # wrong size + dynamic: false + +O_2D_initial_guess_dynamic: + mode: initial_guess + state: [1, 2] #wrong size + dynamic: true + +O_2D_fix_dynamic: + mode: fix + state: [1 2] # wrong size + dynamic: true + +O_2D_factor_dynamic: + mode: factor + state: [1] + noise_std: [0.1 0.2] # wrong size + dynamic: true + +O_2D_initial_guess_dynamic_drift: + mode: initial_guess + state: [1] + dynamic: true + drift_std: [0.1, 0.2] # wrong size + +O_2D_fix_dynamic_drift: + mode: fix + state: [1 2] # wrong size + dynamic: true + drift_std: [0.1] + +O_2D_factor_dynamic_drift: + mode: factor + state: [1] + noise_std: [0.1 0.2] # wrong size + dynamic: true + drift_std: [0.1] + +# O in _3D_ +O_3D_initial_guess: + mode: initial_guess + #state: [1, 0, 0, 0] # missing + dynamic: false + +O_3D_fix: + mode: fix + state: [1, 0, 0, 0] + #dynamic: false # missing + +O_3D_factor: + mode: factor + state: [1, 0, 0, 0] + noise_std: [0.1, 0.2] # wrong size + dynamic: false + +O_3D_initial_guess_dynamic: + mode: initial_guess + state: [1, 0, 0] # wrong size + dynamic: true + +O_3D_fix_dynamic: + mode: fix + state: [1, 0, 0, 0] + #dynamic: true + +O_3D_factor_dynamic: + mode: factor + state: [1, 0, 0, 0] + noise_std: [0.1, 0.2, 0.3, 0.4] # wrong size + dynamic: true + +O_3D_initial_guess_dynamic_drift: + mode: initial_guess + state: [1, 0, 0] # wrong size + dynamic: true + drift_std: [0.1, 0.2, 0.3] + +O_3D_fix_dynamic_drift: + mode: fix + state: [1, 0, 0, 0] + dynamic: true + drift_std: [0.1, 0.2, 0.3, 0.4] #wrong size + +O_3D_factor_dynamic_drift: + mode: factor + state: [1, 0, 0, 0] + noise_std: [0.1, 0.2, 0.3] + dynamic: true + drift_std: [0.1, 0.2] # wrong size + +# I +I_initial_guess: + #mode: initial_guess # missing + state: [1, 2, 3, 4] + dynamic: false + +I_fix: + mode: fix + #state: [1, 2, 3, 4] # missing + dynamic: false + +I_factor: + mode: factor + state: [1, 2, 3, 4] + noise_std: [0.1, 0.2, 0.3] # wrong size + dynamic: false + +I_initial_guess_dynamic: + #mode: initial_guess # missing + state: [1, 2, 3, 4] + dynamic: true + +I_fix_dynamic: + mode: fix + state: [] # wrong size + dynamic: true + +I_factor_dynamic: + mode: factor + state: [1, 2, 3, 4] + noise_std: [0.1, 0.2, 0.3] # wrong size + dynamic: true + +I_initial_guess_dynamic_drift: + mode: initial_guess + state: [1, 2, 3, 4] + dynamic: true + drift_std: [0.1, 0.2, 0.3] # wrong size + +I_fix_dynamic_drift: + mode: fix + state: [1, 2, 3] # wrong size + dynamic: true + drift_std: [0.1, 0.2, 0.3, 0.4] + +I_factor_dynamic_drift: + mode: factor + state: [1, 2, 3, 4] + noise_std: [0.1, 0.2, 0.3] # wrong size + dynamic: true + drift_std: [0.1, 0.2, 0.3, 0.4] \ No newline at end of file diff --git a/test/yaml/sensor_base.yaml b/test/yaml/sensor_base.yaml new file mode 100644 index 0000000000000000000000000000000000000000..469dbd637fc87f3b381d6e339f87eb13c55852e8 --- /dev/null +++ b/test/yaml/sensor_base.yaml @@ -0,0 +1,476 @@ +sensor: + + ############################################################################################# + ########################################## CORRECT ########################################## + ############################################################################################# + + sensor_PO_2D_fix: + P: + mode: fix + state: [1, 2] + dynamic: false + O: + mode: fix + state: [1] + dynamic: false + noise_std: [0.1, 0.2] + + sensor_PO_3D_fix: + P: + mode: fix + state: [1, 2, 3] + dynamic: false + O: + mode: fix + state: [1, 0, 0, 0] + dynamic: false + noise_std: [0.1, 0.2] + + sensor_PO_2D_initial_guess: + P: + mode: initial_guess + state: [1, 2] + dynamic: false + O: + mode: initial_guess + state: [1] + dynamic: false + noise_std: [0.1, 0.2] + + sensor_PO_3D_initial_guess: + P: + mode: initial_guess + state: [1, 2, 3] + dynamic: false + O: + mode: initial_guess + state: [1, 0, 0, 0] + dynamic: false + noise_std: [0.1, 0.2] + + sensor_PO_2D_factor: + P: + mode: factor + state: [1, 2] + noise_std: [0.1, 0.2] + dynamic: false + O: + mode: factor + state: [1] + noise_std: [0.1] + dynamic: false + noise_std: [0.1, 0.2] + + sensor_PO_3D_factor: + P: + mode: factor + state: [1, 2, 3] + noise_std: [0.1, 0.2, 0.3] + dynamic: false + O: + mode: factor + state: [1, 0, 0, 0] + noise_std: [0.1, 0.2, 0.3] + dynamic: false + noise_std: [0.1, 0.2] + + sensor_PO_2D_fix_dynamic: + P: + mode: fix + state: [1, 2] + dynamic: true + O: + mode: fix + state: [1] + dynamic: true + noise_std: [0.1, 0.2] + + sensor_PO_3D_fix_dynamic: + P: + mode: fix + state: [1, 2, 3] + dynamic: true + O: + mode: fix + state: [1, 0, 0, 0] + dynamic: true + noise_std: [0.1, 0.2] + + sensor_PO_2D_initial_guess_dynamic: + P: + mode: initial_guess + state: [1, 2] + dynamic: true + O: + mode: initial_guess + state: [1] + dynamic: true + noise_std: [0.1, 0.2] + + sensor_PO_3D_initial_guess_dynamic: + P: + mode: initial_guess + state: [1, 2, 3] + dynamic: true + O: + mode: initial_guess + state: [1, 0, 0, 0] + dynamic: true + noise_std: [0.1, 0.2] + + sensor_PO_2D_factor_dynamic: + P: + mode: factor + state: [1, 2] + noise_std: [0.1, 0.2] + dynamic: true + O: + mode: factor + state: [1] + noise_std: [0.1] + dynamic: true + noise_std: [0.1, 0.2] + + sensor_PO_3D_factor_dynamic: + P: + mode: factor + state: [1, 2, 3] + noise_std: [0.1, 0.2, 0.3] + dynamic: true + O: + mode: factor + state: [1, 0, 0, 0] + noise_std: [0.1, 0.2, 0.3] + dynamic: true + noise_std: [0.1, 0.2] + + sensor_PO_2D_fix_dynamic_drift: + P: + mode: fix + state: [1, 2] + dynamic: true + drift_std: [0.1, 0.2] + O: + mode: fix + state: [1] + dynamic: true + drift_std: [0.1] + noise_std: [0.1, 0.2] + + sensor_PO_3D_fix_dynamic_drift: + P: + mode: fix + state: [1, 2, 3] + dynamic: true + drift_std: [0.1, 0.2, 0.3] + O: + mode: fix + state: [1, 0, 0, 0] + dynamic: true + drift_std: [0.1, 0.2, 0.3] + noise_std: [0.1, 0.2] + + sensor_PO_2D_initial_guess_dynamic_drift: + P: + mode: initial_guess + state: [1, 2] + dynamic: true + drift_std: [0.1, 0.2] + O: + mode: initial_guess + state: [1] + dynamic: true + drift_std: [0.1] + noise_std: [0.1, 0.2] + + sensor_PO_3D_initial_guess_dynamic_drift: + P: + mode: initial_guess + state: [1, 2, 3] + dynamic: true + drift_std: [0.1, 0.2, 0.3] + O: + mode: initial_guess + state: [1, 0, 0, 0] + dynamic: true + drift_std: [0.1, 0.2, 0.3] + noise_std: [0.1, 0.2] + + sensor_PO_2D_factor_dynamic_drift: + P: + mode: factor + state: [1, 2] + noise_std: [0.1, 0.2] + dynamic: true + drift_std: [0.1, 0.2] + O: + mode: factor + state: [1] + noise_std: [0.1] + dynamic: true + drift_std: [0.1] + noise_std: [0.1, 0.2] + + sensor_PO_3D_factor_dynamic_drift: + P: + mode: factor + state: [1, 2, 3] + noise_std: [0.1, 0.2, 0.3] + dynamic: true + drift_std: [0.1, 0.2, 0.3] + O: + mode: factor + state: [1, 0, 0, 0] + noise_std: [0.1, 0.2, 0.3] + dynamic: true + drift_std: [0.1, 0.2, 0.3] + noise_std: [0.1, 0.2] + + sensor_POIA_3D: + P: + mode: factor + state: [1, 2, 3] + noise_std: [0.1, 0.2, 0.3] + dynamic: true + O: + mode: fix + state: [1, 0, 0, 0] + dynamic: false + I: + mode: initial_guess + state: [1, 2, 3, 4] + dynamic: true + drift_std: [0.1, 0.2, 0.3, 0.4] + A: + mode: factor + state: [1, 0, 0, 0] + noise_std: [0.1, 0.2, 0.3] + dynamic: true + drift_std: [0.1, 0.2, 0.3] + noise_std: [0.1, 0.2] + + ############################################################################################# + ######################################### INCORRECT ######################################### + ############################################################################################# + + sensor_PO_2D_fix_wrong: + P: + mode: fix + state: [1, 2] + #dynamic: false #missing + O: + mode: fix + state: [1] + dynamic: false + noise_std: [0.1, 0.2] + + sensor_PO_3D_fix_wrong: + P: + mode: fix + state: [1, 2, 3] + dynamic: false + O: + mode: fix + state: [1, 0, 0, 0] + dynamic: false + #noise_std: [0.1, 0.2] #missing + + sensor_PO_2D_initial_guess_wrong: + P: + mode: initial_guess + state: [1, 2] + dynamic: false + O: + #mode: initial_guess #missing + state: [1] + dynamic: false + noise_std: [0.1, 0.2] + + sensor_PO_3D_initial_guess_wrong: + P: + mode: initial_guess + state: [1, 2, 3] + dynamic: false + # O: #missing + # mode: initial_guess + # state: [1, 0, 0, 0] + # dynamic: false + noise_std: [0.1, 0.2] + + sensor_PO_2D_factor_wrong: + P: + mode: factor + state: [1, 2] + noise_std: [0.1, 0.2] + dynamic: false + O: + mode: factor + #state: [1] #missing + noise_std: [0.1] + dynamic: false + noise_std: [0.1, 0.2] + + sensor_PO_3D_factor_wrong: + P: + mode: factor + state: [1, 2, 3] + #noise_std: [0.1, 0.2, 0.3] #missing + dynamic: false + O: + mode: factor + state: [1, 0, 0, 0] + noise_std: [0.1, 0.2, 0.3] + dynamic: false + noise_std: [0.1, 0.2] + + sensor_PO_2D_fix_dynamic_wrong: + P: + mode: fix + state: [1, 2, 3] # wrong size + dynamic: true + O: + mode: fix + state: [1] + dynamic: true + noise_std: [0.1, 0.2] + + sensor_PO_3D_fix_dynamic_wrong: + P: + mode: fix + state: [1, 2, 3] + dynamic: true + O: + mode: fix + state: [1, 0, 0, 1] # not normalized + dynamic: true + noise_std: [0.1, 0.2] + + sensor_PO_2D_initial_guess_dynamic_wrong: + # P: #missing + # mode: initial_guess + # state: [1, 2] + # dynamic: true + O: + mode: initial_guess + state: [1] + dynamic: true + noise_std: [0.1, 0.2] + + sensor_PO_3D_initial_guess_dynamic_wrong: + P: + mode: initial_guess + state: [1, 2] # wrong size + dynamic: true + O: + mode: initial_guess + state: [1, 0, 0, 0] + dynamic: true + noise_std: [0.1, 0.2] + + sensor_PO_2D_factor_dynamic_wrong: + P: + mode: factor + state: [1, 2] + noise_std: [0.1, 0.2, 0.3] #wrong size + dynamic: true + O: + mode: factor + state: [1] + noise_std: [0.1] + dynamic: true + noise_std: [0.1, 0.2] + + sensor_PO_3D_factor_dynamic_wrong: + P: + mode: factor + state: [1, 2, 3] + noise_std: [0.1, 0.2, 0.3] + dynamic: true + O: + mode: factor + state: [1, 0, 0, 0] + noise_std: [0.1, 0.2, 0.3, 0.4] # wrong size + dynamic: true + noise_std: [0.1, 0.2] + + sensor_PO_2D_fix_dynamic_drift_wrong: + P: + mode: fix + state: [1, 2] + dynamic: true + drift_std: [0.1, 0.2, 0.3] #wrong size + O: + mode: fix + state: [1] + dynamic: true + drift_std: [0.1] + noise_std: [0.1, 0.2] + + sensor_PO_3D_fix_dynamic_drift_wrong: + P: + mode: fix + state: [1, 2, 3] + dynamic: true + drift_std: [0.1, 0.2, 0.3] + O: + mode: fix + state: [1, 0, 0, 0] + #dynamic: true #missing + drift_std: [0.1, 0.2, 0.3] + noise_std: [0.1, 0.2] + + sensor_PO_2D_initial_guess_dynamic_drift_wrong: + P: + mode: initial_guess + state: [1] #wrong size + dynamic: true + drift_std: [0.1, 0.2] + O: + mode: initial_guess + state: [1] + dynamic: true + drift_std: [0.1] + noise_std: [0.1, 0.2] + + sensor_PO_3D_initial_guess_dynamic_drift_wrong: + P: + mode: initial_guess + state: [1, 2, 3] + dynamic: true + drift_std: [0.1, 0.2, 0.3] + O: + #mode: initial_guess #missing + state: [1, 0, 0, 0] + dynamic: true + drift_std: [0.1, 0.2, 0.3] + noise_std: [0.1, 0.2] + + sensor_PO_2D_factor_dynamic_drift_wrong: + P: + mode: factor + state: [1, 2] + noise_std: [0.1, 0.2] + dynamic: true + drift_std: [0.1] #wrong size + O: + mode: factor + state: [1] + noise_std: [0.1] + dynamic: true + drift_std: [0.1] + noise_std: [0.1, 0.2] + + sensor_PO_3D_factor_dynamic_drift_wrong: + P: + mode: factor + state: [1, 2, 3] + noise_std: [0.1, 0.2, 0.3] + dynamic: true + drift_std: [0.1, 0.2, 0.3] + O: + mode: factor + state: [1, 0, 0, 0] + noise_std: [0.1, 0.2, 0.3, 0.4] #wrong size + dynamic: true + drift_std: [0.1, 0.2, 0.3] + noise_std: [0.1, 0.2] \ No newline at end of file