diff --git a/include/core/ceres_wrapper/qr_manager.h b/include/core/ceres_wrapper/qr_manager.h index 855b5dab5691c7a951de72a169e44ec279a5f348..8608d894d5f5536c28adef9c23dc40eeeba249c6 100644 --- a/include/core/ceres_wrapper/qr_manager.h +++ b/include/core/ceres_wrapper/qr_manager.h @@ -36,23 +36,23 @@ class QRManager : public SolverManager virtual std::string solve(const unsigned int& _report_level); - virtual void computeCovariances(CovarianceBlocksToBeComputed _blocks = CovarianceBlocksToBeComputed::ROBOT_LANDMARKS); + virtual void computeCovariances(CovarianceBlocksToBeComputed _blocks = CovarianceBlocksToBeComputed::ROBOT_LANDMARKS) override; - virtual void computeCovariances(const std::vector<StateBlockPtr>& _sb_list); + virtual void computeCovariances(const std::vector<StateBlockPtr>& _sb_list) override; private: bool computeDecomposition(); - virtual void addFactor(FactorBasePtr _fac_ptr); + virtual void addFactor(const FactorBasePtr& _fac_ptr) override; - virtual void removeFactor(FactorBasePtr _fac_ptr); + virtual void removeFactor(const FactorBasePtr& _fac_ptr) override; - virtual void addStateBlock(StateBlockPtr _st_ptr); + virtual void addStateBlock(const StateBlockPtr& _st_ptr) override; - virtual void removeStateBlock(StateBlockPtr _st_ptr); + virtual void removeStateBlock(const StateBlockPtr& _st_ptr) override; - virtual void updateStateBlockStatus(StateBlockPtr _st_ptr); + virtual void updateStateBlockStatus(const StateBlockPtr& _st_ptr) override; void relinearizeFactor(FactorBasePtr _fac_ptr); }; diff --git a/include/core/solver_suitesparse/sparse_utils.h b/include/core/solver_suitesparse/sparse_utils.h index 7f5e0a0d0d2a56c9c798509c8b092eba0a35d855..ba372158622f37a5c962ee7f5041c344e4ff2ee2 100644 --- a/include/core/solver_suitesparse/sparse_utils.h +++ b/include/core/solver_suitesparse/sparse_utils.h @@ -16,12 +16,12 @@ namespace wolf void eraseBlockRow(Eigen::SparseMatrixd& A, const unsigned int& _row, const unsigned int& _n_rows) { - A.prune([](int i, int, double) { return i >= _row && i < _row + _n_rows; }); + A.prune([&](int i, int, double) { return i >= _row && i < _row + _n_rows; }); } void eraseBlockCol(Eigen::SparseMatrixd& A, const unsigned int& _col, const unsigned int& _n_cols) { - A.prune([](int, int j, double) { return j >= _col && j < _col + _n_cols; }); + A.prune([&](int, int j, double) { return j >= _col && j < _col + _n_cols; }); } void addSparseBlock(const Eigen::MatrixXd& ins, Eigen::SparseMatrixd& original, const unsigned int& row, const unsigned int& col) diff --git a/src/ceres_wrapper/qr_manager.cpp b/src/ceres_wrapper/qr_manager.cpp index 2a7c21aa363f364a294528dd7a1a1abed7c71177..6322b1d547efd6efe1b7d2a2e340e5292a5ff964 100644 --- a/src/ceres_wrapper/qr_manager.cpp +++ b/src/ceres_wrapper/qr_manager.cpp @@ -42,7 +42,7 @@ std::string QRManager::solve(const unsigned int& _report_level) // update state blocks for (auto sb_pair : sb_2_col_) - sb_pair.first->setState(sb_pair.first->getState() + x_incr.segment(sb_pair.second, sb_pair.first->getSize()), false); + sb_pair.first->setState(sb_pair.first->getState() + x_incr.segment(sb_pair.second, sb_pair.first->getSize()), false); // FIXME use LocalParam->Plus() if (_report_level == 1) return std::string("Success!\n"); @@ -102,14 +102,14 @@ bool QRManager::computeDecomposition() for (auto sb_pair : sb_2_col_) { sb_2_col_[sb_pair.first] = state_size; - state_size += sb_pair.first->getSize(); + state_size += sb_pair.first->getSize(); // FIXME use getLocalSize() } unsigned int meas_size = 0; for (auto fac_pair : fac_2_row_) { fac_2_row_[fac_pair.first] = meas_size; - meas_size += fac_pair.first->getSize(); + meas_size += fac_pair.first->getSize(); // FIXME use getLocalSize() } // resize and setZero A, b @@ -138,7 +138,7 @@ bool QRManager::computeDecomposition() return true; } -void QRManager::addFactor(FactorBasePtr _fac_ptr) +void QRManager::addFactor(const FactorBasePtr& _fac_ptr) { //std::cout << "add factor " << _fac_ptr->id() << std::endl; assert(fac_2_row_.find(_fac_ptr) == fac_2_row_.end() && "adding existing factor"); @@ -154,7 +154,7 @@ void QRManager::addFactor(FactorBasePtr _fac_ptr) pending_changes_ = true; } -void QRManager::removeFactor(FactorBasePtr _fac_ptr) +void QRManager::removeFactor(const FactorBasePtr& _fac_ptr) { //std::cout << "remove factor " << _fac_ptr->id() << std::endl; assert(fac_2_row_.find(_fac_ptr) != fac_2_row_.end() && "removing unknown factor"); @@ -164,7 +164,7 @@ void QRManager::removeFactor(FactorBasePtr _fac_ptr) pending_changes_ = true; } -void QRManager::addStateBlock(StateBlockPtr _st_ptr) +void QRManager::addStateBlock(const StateBlockPtr& _st_ptr) { //std::cout << "add state block " << _st_ptr.get() << std::endl; assert(sb_2_col_.find(_st_ptr) == sb_2_col_.end() && "adding existing state block"); @@ -175,7 +175,7 @@ void QRManager::addStateBlock(StateBlockPtr _st_ptr) pending_changes_ = true; } -void QRManager::removeStateBlock(StateBlockPtr _st_ptr) +void QRManager::removeStateBlock(const StateBlockPtr& _st_ptr) { //std::cout << "remove state block " << _st_ptr.get() << std::endl; assert(sb_2_col_.find(_st_ptr) != sb_2_col_.end() && "removing unknown state block"); @@ -189,7 +189,7 @@ void QRManager::removeStateBlock(StateBlockPtr _st_ptr) pending_changes_ = true; } -void QRManager::updateStateBlockStatus(StateBlockPtr _st_ptr) +void QRManager::updateStateBlockStatus(const StateBlockPtr& _st_ptr) { //std::cout << "update state block " << _st_ptr.get() << std::endl; if (_st_ptr->isFixed()) @@ -202,35 +202,35 @@ void QRManager::updateStateBlockStatus(StateBlockPtr _st_ptr) addStateBlock(_st_ptr); } -void QRManager::relinearizeFactor(FactorBasePtr _fac_ptr) +void QRManager::relinearizeFactor(FactorBasePtr _fac_ptr) // FIXME consider the Jacobian 'M' of the local param of each SB in the factor { - // evaluate factor - std::vector<const double*> fac_states_ptr; - for (auto sb : _fac_ptr->getStateBlockPtrVector()){ - fac_states_ptr.push_back(sb->getStateData()); - } - - Eigen::VectorXd residual(_fac_ptr->getSize()); - std::vector<Eigen::MatrixXd> jacobians; - _fac_ptr->evaluate(fac_states_ptr,residual,jacobians); - - // Fill jacobians - Eigen::SparseMatrixd A_block_row(_fac_ptr->getSize(), A_.cols()); - for (auto i = 0; i < jacobians.size(); i++) - { - if (!_fac_ptr->getStateBlockPtrVector()[i]->isFixed()) - { - assert(sb_2_col_.find(_fac_ptr->getStateBlockPtrVector()[i]) != sb_2_col_.end() && "factor involving a state block not added"); - assert(A_.cols() >= sb_2_col_[_fac_ptr->getStateBlockPtrVector()[i]] + jacobians[i].cols() - 1 && "bad A number of cols"); - // insert since A_block_row has just been created so it's empty for sure - insertSparseBlock(jacobians[i], A_block_row, 0, sb_2_col_[_fac_ptr->getStateBlockPtrVector()[i]]); - } - } - - assignBlockRow(A_, A_block_row, fac_2_row_[_fac_ptr]); - - // Fill residual - b_.segment(fac_2_row_[_fac_ptr], _fac_ptr->getSize()) = residual; +// // evaluate factor +// std::vector<const double*> fac_states_ptr; +// for (auto sb : _fac_ptr->getStateBlockPtrVector()){ +// fac_states_ptr.push_back(sb->getStateData()); +// } +// +// Eigen::VectorXd residual(_fac_ptr->getSize()); +// std::vector<Eigen::MatrixXd> jacobians; +// _fac_ptr->evaluate(fac_states_ptr,residual,jacobians); +// +// // Fill jacobians +// Eigen::SparseMatrixd A_block_row(_fac_ptr->getSize(), A_.cols()); +// for (auto i = 0; i < jacobians.size(); i++) +// { +// if (!_fac_ptr->getStateBlockPtrVector()[i]->isFixed()) +// { +// assert(sb_2_col_.find(_fac_ptr->getStateBlockPtrVector()[i]) != sb_2_col_.end() && "factor involving a state block not added"); +// assert(A_.cols() >= sb_2_col_[_fac_ptr->getStateBlockPtrVector()[i]] + jacobians[i].cols() - 1 && "bad A number of cols"); +// // insert since A_block_row has just been created so it's empty for sure +// insertSparseBlock(jacobians[i], A_block_row, 0, sb_2_col_[_fac_ptr->getStateBlockPtrVector()[i]]); +// } +// } +// +// assignBlockRow(A_, A_block_row, fac_2_row_[_fac_ptr]); +// +// // Fill residual +// b_.segment(fac_2_row_[_fac_ptr], _fac_ptr->getSize()) = residual; } } /* namespace wolf */