diff --git a/src/sensor_base.cpp b/src/sensor_base.cpp index fa7e4273fd524d46655263df68270a54beb39e7e..4bd789f671a8571105c6df5c69e95c39973c88e3 100644 --- a/src/sensor_base.cpp +++ b/src/sensor_base.cpp @@ -82,8 +82,6 @@ void SensorBase::removeStateBlocks() } } - - void SensorBase::fix() { for( auto sbp : state_block_vec_) @@ -144,52 +142,14 @@ void SensorBase::unfixIntrinsics() updateCalibSize(); } -void SensorBase::addPriorParameterStatic(const StateBlockPtr& _sb, const Eigen::VectorXs& _x, const Eigen::MatrixXs& _cov, unsigned int _start_idx, int _size) +void SensorBase::addPriorParameter(const unsigned int _i, const Eigen::VectorXs& _x, const Eigen::MatrixXs& _cov, unsigned int _start_idx, int _size) { - bool is_quaternion = (std::dynamic_pointer_cast<StateQuaternion>(_sb) != nullptr); - - assert(std::find(state_block_vec_.begin(),state_block_vec_.end(),_sb) != state_block_vec_.end() && "adding prior to unknown state block"); - assert(((!is_quaternion && _x.size() == _cov.rows() && _x.size() == _cov.cols()) || - (is_quaternion && _x.size() == 4 &&_cov.rows() == 3 && _cov.cols() == 3)) && "bad prior/covariance dimensions"); - assert((_size == -1 && _start_idx == 0) || (_size+_start_idx <= _sb->getSize())); - assert(_size == -1 || _size == _x.size()); - assert(!(_size != -1 && is_quaternion) && "prior of a segment of state not available for quaternion"); - - // set StateBlock state - if (_size == -1) - _sb->setState(_x); - else - { - Eigen::VectorXs new_x = _sb->getState(); - new_x.segment(_start_idx,_size) = _x; - _sb->setState(new_x); - } + assert(!isStateBlockDynamic(_i) && "SensorBase::addPriorParameter only allowed for static parameters"); + assert(_i < state_block_vec_.size() && "State block not found"); - // remove previous prior (if any) - if (params_prior_map_.find(_sb) != params_prior_map_.end()) - params_prior_map_[_sb]->remove(); - - // create feature - FeatureBasePtr ftr_prior = std::make_shared<FeatureBase>("ABSOLUTE",_x,_cov); - - // set feature problem - ftr_prior->setProblem(getProblem()); - - // create & add constraint absolute - if (is_quaternion) - ftr_prior->addConstraint(std::make_shared<ConstraintQuaternionAbsolute>(_sb)); - else - ftr_prior->addConstraint(std::make_shared<ConstraintBlockAbsolute>(_sb, _start_idx, _size)); - - // store feature in params_prior_map_ - params_prior_map_[_sb] = ftr_prior; -} - -void SensorBase::addPriorParameterDynamic(const StateBlockPtr& _sb, const Eigen::VectorXs& _x, const Eigen::MatrixXs& _cov, unsigned int _start_idx, int _size) -{ + StateBlockPtr _sb = getStateBlockPtrStatic(_i); bool is_quaternion = (std::dynamic_pointer_cast<StateQuaternion>(_sb) != nullptr); - assert(std::find(state_block_vec_.begin(),state_block_vec_.end(),_sb) != state_block_vec_.end() && "adding prior to unknown state block"); assert(((!is_quaternion && _x.size() == _cov.rows() && _x.size() == _cov.cols()) || (is_quaternion && _x.size() == 4 &&_cov.rows() == 3 && _cov.cols() == 3)) && "bad prior/covariance dimensions"); assert((_size == -1 && _start_idx == 0) || (_size+_start_idx <= _sb->getSize())); @@ -207,8 +167,8 @@ void SensorBase::addPriorParameterDynamic(const StateBlockPtr& _sb, const Eigen: } // remove previous prior (if any) - if (params_prior_map_.find(_sb) != params_prior_map_.end()) - params_prior_map_[_sb]->remove(); + if (params_prior_map_.find(_i) != params_prior_map_.end()) + params_prior_map_[_i]->remove(); // create feature FeatureBasePtr ftr_prior = std::make_shared<FeatureBase>("ABSOLUTE",_x,_cov); @@ -223,7 +183,7 @@ void SensorBase::addPriorParameterDynamic(const StateBlockPtr& _sb, const Eigen: ftr_prior->addConstraint(std::make_shared<ConstraintBlockAbsolute>(_sb, _start_idx, _size)); // store feature in params_prior_map_ - params_prior_map_[_sb] = ftr_prior; + params_prior_map_[_i] = ftr_prior; } void SensorBase::registerNewStateBlocks() diff --git a/src/sensor_base.h b/src/sensor_base.h index f4d4563f379e737b541cfd71aee10727bf603c55..d65567b94a6338cacb5e681d0e8e229c8afe8b73 100644 --- a/src/sensor_base.h +++ b/src/sensor_base.h @@ -150,46 +150,17 @@ class SensorBase : public NodeBase, public std::enable_shared_from_this<SensorBa * \param _size state segment size (-1: whole state) (not used in quaternions) * **/ - void addParameterStaticPrior(const StateBlockPtr& _sb, + void addPriorParameter(const StateBlockPtr& _sb, const Eigen::VectorXs& _x, const Eigen::MatrixXs& _cov, unsigned int _start_idx = 0, int _size = -1); - - void addParameterDynamicPrior(const CaptureBase& _cap, - const StateBlockPtr& _sb, - const Eigen::VectorXs& _x, - const Eigen::MatrixXs& _cov, - unsigned int _start_idx = 0, - int _size = -1); - - void addParameterPrior(const unsigned int _i, - const Eigen::VectorXs& _x, - const Eigen::MatrixXs& _cov, - unsigned int _start_idx = 0, - int _size = -1); - - void addParameterPrior(const unsigned int _i, - const TimeStamp _ts, + void addPriorParameter(const unsigned int _i, const Eigen::VectorXs& _x, const Eigen::MatrixXs& _cov, unsigned int _start_idx = 0, int _size = -1); - void addPPrior(const TimeStamp _ts, - const Eigen::VectorXs& _x, - const Eigen::MatrixXs& _cov, - unsigned int _start_idx = 0, - int _size = -1); - void addOPrior(const TimeStamp _ts, - const Eigen::VectorXs& _x, - const Eigen::MatrixXs& _cov); - void addIntrinsicsPrior(const TimeStamp _ts, - const Eigen::VectorXs& _x, - const Eigen::MatrixXs& _cov, - unsigned int _start_idx = 0, - int _size = -1); - void addPriorP(const Eigen::VectorXs& _x, const Eigen::MatrixXs& _cov, unsigned int _start_idx = 0, @@ -321,41 +292,8 @@ inline void SensorBase::setHardwarePtr(const HardwareBasePtr _hw_ptr) hardware_ptr_ = _hw_ptr; } -inline void SensorBase::addParameterPrior(const unsigned int _i, const TimeStamp _ts, const Eigen::VectorXs& _x, - const Eigen::MatrixXs& _cov, unsigned int _start_idx, int _size) -{ - CaptureBasePtr cap; - // i is dynamic? //TODO - if (isStateBlockDynamic(_i, _ts, cap)) - addParameterDynamicPrior(cap, cap->getStateBlockPtr(_i), _x, _cov, _start_idx, _size); - else - addParameterStaticPrior(getStateBlockPtrStatic(_i), _x, _cov, _start_idx, _size); -} - inline void SensorBase::addPriorParameter(const unsigned int _i, const Eigen::VectorXs& _x, const Eigen::MatrixXs& _cov, unsigned int _start_idx, int _size) -{ - CaptureBasePtr cap; - // i is dynamic? //TODO - if (isStateBlockDynamic(_i, cap)) - addParameterDynamicPrior(cap, cap->getStateBlockPtr(_i), _x, _cov, _start_idx, _size); - else - addParameterStaticPrior(getStateBlockPtrStatic(_i), _x, _cov, _start_idx, _size); -} - -inline void SensorBase::addPPrior(const TimeStamp _ts, const Eigen::VectorXs& _x, const Eigen::MatrixXs& _cov, unsigned int _start_idx, - int _size) -{ - addParameterPrior(0, _ts, _x, _cov, _start_idx, _size); -} - -inline void SensorBase::addOPrior(const TimeStamp _ts, const Eigen::VectorXs& _x, const Eigen::MatrixXs& _cov) -{ - addParameterPrior(1, _ts, _x, _cov); -} - -inline void SensorBase::addIntrinsicsPrior(const TimeStamp _ts, const Eigen::VectorXs& _x, const Eigen::MatrixXs& _cov, - unsigned int _start_idx, int _size) { addPriorParameter(getStateBlockPtrStatic(_i), _x, _cov, _start_idx, _size); }