SaDVIO
marginalization.hpp
Go to the documentation of this file.
1 #include <ceres/ceres.h>
2 #include <unordered_map>
3 
4 #include "isaeslam/data/frame.h"
7 #include "isaeslam/typedefs.h"
8 
9 namespace isae {
10 
15 
16  MarginalizationBlockInfo(ceres::CostFunction *cost_function,
17  std::vector<int> parameter_idx,
18  std::vector<double *> parameter_blocks)
19  : _cost_function(cost_function), _parameter_idx(parameter_idx), _parameter_blocks(parameter_blocks) {}
20 
21  void Evaluate();
22 
23  ceres::CostFunction *_cost_function;
24  std::vector<int> _parameter_idx;
25  std::vector<double *> _parameter_blocks;
26 
27  double **_raw_jacobians;
28  std::vector<Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor>> _jacobians;
29  Eigen::VectorXd _residuals;
30 };
31 
40  public:
47  void preMarginalize(std::shared_ptr<Frame> &frame0,
48  std::shared_ptr<Frame> &frame1,
49  std::shared_ptr<Marginalization> &marginalization_last);
50 
56  void preMarginalizeRelative(std::shared_ptr<Frame> &frame0, std::shared_ptr<Frame> &frame1);
57 
61  bool sparsifyVIO();
62 
66  bool sparsifyVO();
67 
74  void computeInformationAndGradient(std::vector<std::shared_ptr<MarginalizationBlockInfo>> blocks,
75  Eigen::MatrixXd &A,
76  Eigen::VectorXd &b);
77 
84  void rankReveallingDecomposition(Eigen::MatrixXd A, Eigen::MatrixXd &U, Eigen::VectorXd &d);
85 
90 
95 
99  double computeEntropy(std::shared_ptr<ALandmark> lmk);
100 
104  double computeMutualInformation(std::shared_ptr<ALandmark> lmk_i, std::shared_ptr<ALandmark> lmk_j);
105 
109  double computeOffDiag(std::shared_ptr<ALandmark> lmk_i, std::shared_ptr<ALandmark> lmk_j);
110 
115  double computeKLD(Eigen::MatrixXd A_p, Eigen::MatrixXd A_q);
116 
117  int _m;
118  int _n;
119  int _n_full;
120  const double _eps = 1e-12;
121 
122  // Bookeeping of the variables to keep and to marginalize
123  std::shared_ptr<Frame> _frame_to_marg;
124  std::shared_ptr<Frame> _frame_to_keep;
127  std::unordered_map<std::shared_ptr<Frame>, int> _map_frame_idx;
128  std::unordered_map<std::shared_ptr<ALandmark>, int> _map_lmk_idx;
129  std::unordered_map<std::shared_ptr<Frame>, Eigen::MatrixXd>
131  std::vector<std::shared_ptr<MarginalizationBlockInfo>>
133 
134  // Sparsification info
135  std::unordered_map<std::shared_ptr<ALandmark>, Eigen::Matrix3d>
137  std::unordered_map<std::shared_ptr<ALandmark>, Eigen::Vector3d>
139  std::shared_ptr<ALandmark> _lmk_with_prior;
140  Eigen::Matrix3d _info_lmk;
141  Eigen::Vector3d _prior_lmk;
142 
143  // Matrices and vectors of the dense prior
144  Eigen::MatrixXd _Ak;
145  Eigen::VectorXd _bk;
146  Eigen::MatrixXd _Sigma_k;
147  Eigen::MatrixXd _U;
148  Eigen::VectorXd _Lambda;
149  Eigen::VectorXd _Sigma;
150  Eigen::MatrixXd _marginalization_jacobian;
151  Eigen::VectorXd _marginalization_residual;
152 };
153 
157 class MarginalizationFactor : public ceres::CostFunction {
158  public:
159  MarginalizationFactor(std::shared_ptr<Marginalization> marginalization_info)
160  : _marginalization_info(marginalization_info) {
161 
162  // Add frame block size
163  if (_marginalization_info->_frame_to_keep) {
164  this->mutable_parameter_block_sizes()->push_back(6);
165  this->mutable_parameter_block_sizes()->push_back(3);
166  this->mutable_parameter_block_sizes()->push_back(3);
167  this->mutable_parameter_block_sizes()->push_back(3);
168  }
169 
170  // Add landmark block size
171  for (auto tlmk : _marginalization_info->_lmk_to_keep) {
172  for (auto lmk : tlmk.second) {
173  (tlmk.first == "pointxd" ? this->mutable_parameter_block_sizes()->push_back(3)
174  : this->mutable_parameter_block_sizes()->push_back(6));
175  }
176  }
177 
178  // Set the number of residuals
179  this->set_num_residuals(_marginalization_info->_n_full);
180  }
181 
182  virtual bool Evaluate(double const *const *parameters, double *residuals, double **jacobians) const {
183  int n = _marginalization_info->_n_full;
184  Eigen::VectorXd dx(_marginalization_info->_n);
185  dx.setZero();
186 
187  // Add frame dx
188  int block_id = 0;
189  if (_marginalization_info->_frame_to_keep) {
190  dx.segment<6>(_marginalization_info->_map_frame_idx.at(_marginalization_info->_frame_to_keep)) =
191  Eigen::Map<const Eigen::Matrix<double, 6, 1>>(parameters[block_id]);
192  block_id++;
193  dx.segment<3>(_marginalization_info->_map_frame_idx.at(_marginalization_info->_frame_to_keep) + 6) =
194  Eigen::Map<const Eigen::Vector3d>(parameters[block_id]);
195  block_id++;
196  dx.segment<3>(_marginalization_info->_map_frame_idx.at(_marginalization_info->_frame_to_keep) + 9) =
197  Eigen::Map<const Eigen::Vector3d>(parameters[block_id]);
198  block_id++;
199  dx.segment<3>(_marginalization_info->_map_frame_idx.at(_marginalization_info->_frame_to_keep) + 12) =
200  Eigen::Map<const Eigen::Vector3d>(parameters[block_id]);
201  block_id++;
202  }
203 
204  // Add landmarks dx
205  for (auto tlmk : _marginalization_info->_lmk_to_keep) {
206  for (auto lmk : tlmk.second) {
207  if (_marginalization_info->_map_lmk_idx.at(lmk) == -1)
208  continue;
209 
210  dx.segment<3>(_marginalization_info->_map_lmk_idx.at(lmk)) =
211  Eigen::Map<const Eigen::Vector3d>(parameters[block_id]);
212  block_id++;
213  }
214  }
215 
216  // Compute the residual
217  Eigen::Map<Eigen::VectorXd>(residuals, n) =
218  _marginalization_info->_marginalization_residual + _marginalization_info->_marginalization_jacobian * dx;
219 
220  // Fill the jacobians
221  if (jacobians) {
222 
223  block_id = 0;
224 
225  // Jacobians on frame
226  if (_marginalization_info->_frame_to_keep) {
227  if (jacobians[block_id]) {
228 
229  Eigen::Map<Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor>> jacobian(
230  jacobians[block_id], n, 6);
231  jacobian.setZero();
232  jacobian.leftCols(6) = _marginalization_info->_marginalization_jacobian.middleCols(
233  _marginalization_info->_map_frame_idx.at(_marginalization_info->_frame_to_keep), 6);
234  }
235  block_id++;
236  if (jacobians[block_id]) {
237 
238  Eigen::Map<Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor>> jacobian(
239  jacobians[block_id], n, 3);
240  jacobian.setZero();
241  jacobian.leftCols(3) = _marginalization_info->_marginalization_jacobian.middleCols(
242  _marginalization_info->_map_frame_idx.at(_marginalization_info->_frame_to_keep) + 6, 3);
243  }
244  block_id++;
245  if (jacobians[block_id]) {
246 
247  Eigen::Map<Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor>> jacobian(
248  jacobians[block_id], n, 3);
249  jacobian.setZero();
250  jacobian.leftCols(3) = _marginalization_info->_marginalization_jacobian.middleCols(
251  _marginalization_info->_map_frame_idx.at(_marginalization_info->_frame_to_keep) + 9, 3);
252  }
253  block_id++;
254  if (jacobians[block_id]) {
255 
256  Eigen::Map<Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor>> jacobian(
257  jacobians[block_id], n, 3);
258  jacobian.setZero();
259  jacobian.leftCols(3) = _marginalization_info->_marginalization_jacobian.middleCols(
260  _marginalization_info->_map_frame_idx.at(_marginalization_info->_frame_to_keep) + 12, 3);
261  }
262  block_id++;
263  }
264 
265  // Jacobians on landmarks
266  for (auto tlmk : _marginalization_info->_lmk_to_keep) {
267  for (auto lmk : tlmk.second) {
268  if (_marginalization_info->_map_lmk_idx.at(lmk) == -1)
269  continue;
270 
271  if (jacobians[block_id]) {
272 
273  Eigen::Map<Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor>> jacobian(
274  jacobians[block_id], n, 3);
275  jacobian.setZero();
276  jacobian.leftCols(3) = _marginalization_info->_marginalization_jacobian.middleCols(
277  _marginalization_info->_map_lmk_idx.at(lmk), 3);
278  }
279  block_id++;
280  }
281  }
282  }
283  return true;
284  }
285 
286  std::shared_ptr<Marginalization> _marginalization_info;
287 };
288 
289 } // namespace isae
isae::Marginalization::computeJacobiansAndResiduals
bool computeJacobiansAndResiduals()
Compute the jacobian and the residual of the dense prior factor.
Definition: marginalization.cpp:503
isae::MarginalizationBlockInfo::Evaluate
void Evaluate()
Definition: marginalization.cpp:8
isae::Marginalization::_map_frame_idx
std::unordered_map< std::shared_ptr< Frame >, int > _map_frame_idx
Map between frames and indices in _Ak.
Definition: marginalization.hpp:127
isae::Marginalization::_eps
const double _eps
Threshold to consider a null eigen value.
Definition: marginalization.hpp:120
isae::Marginalization::preMarginalizeRelative
void preMarginalizeRelative(std::shared_ptr< Frame > &frame0, std::shared_ptr< Frame > &frame1)
Select all the variables to keep and marginalize to derive the relative pose factor between two frame...
Definition: marginalization.cpp:519
isae::MarginalizationBlockInfo
Marginalization block struct that stores a factor and the indices of the variables involved.
Definition: marginalization.hpp:14
isae::MarginalizationBlockInfo::_cost_function
ceres::CostFunction * _cost_function
Definition: marginalization.hpp:23
isae::MarginalizationFactor::MarginalizationFactor
MarginalizationFactor(std::shared_ptr< Marginalization > marginalization_info)
Definition: marginalization.hpp:159
isae::Marginalization::computeSchurComplement
bool computeSchurComplement()
Compute the dense prior with the Schur complement on _Ak.
Definition: marginalization.cpp:207
isae::Marginalization::preMarginalize
void preMarginalize(std::shared_ptr< Frame > &frame0, std::shared_ptr< Frame > &frame1, std::shared_ptr< Marginalization > &marginalization_last)
Select all the variables to keep and to marginalize in the Markov Blanket for fixed lag smoothing.
Definition: marginalization.cpp:23
isae::Marginalization::_info_lmk
Eigen::Matrix3d _info_lmk
Information matrix of the landmark absolute prior.
Definition: marginalization.hpp:140
isae::Marginalization::computeEntropy
double computeEntropy(std::shared_ptr< ALandmark > lmk)
Compute the Entropy of a given landmark.
Definition: marginalization.cpp:256
isae::MarginalizationFactor::_marginalization_info
std::shared_ptr< Marginalization > _marginalization_info
Definition: marginalization.hpp:286
isae::Marginalization::_Lambda
Eigen::VectorXd _Lambda
Non null Eigen values.
Definition: marginalization.hpp:148
isae::Marginalization::_bk
Eigen::VectorXd _bk
Gradient of the subproblem.
Definition: marginalization.hpp:145
isae::Marginalization::computeOffDiag
double computeOffDiag(std::shared_ptr< ALandmark > lmk_i, std::shared_ptr< ALandmark > lmk_j)
Approximate the Mutual Information between two landmarks using off diagonal blocks of _Ak.
Definition: marginalization.cpp:293
isae::Marginalization::_marginalization_blocks
std::vector< std::shared_ptr< MarginalizationBlockInfo > > _marginalization_blocks
Vector of Marginalization blocks to derive _Ak.
Definition: marginalization.hpp:132
isae::Marginalization
Marginalization class that handles marginalization (and sparsification) for fixed-lag smoothing.
Definition: marginalization.hpp:39
isae::Marginalization::rankReveallingDecomposition
void rankReveallingDecomposition(Eigen::MatrixXd A, Eigen::MatrixXd &U, Eigen::VectorXd &d)
Compute the SVD of a given matrix to reveal its rank.
Definition: marginalization.cpp:305
isae::MarginalizationBlockInfo::_raw_jacobians
double ** _raw_jacobians
Definition: marginalization.hpp:27
isae::Marginalization::_lmk_with_prior
std::shared_ptr< ALandmark > _lmk_with_prior
Landmark that has an absolute prior factor.
Definition: marginalization.hpp:139
isae::Marginalization::_map_lmk_idx
std::unordered_map< std::shared_ptr< ALandmark >, int > _map_lmk_idx
Map between landmarks and indices in _Ak.
Definition: marginalization.hpp:128
isae::MarginalizationBlockInfo::_parameter_blocks
std::vector< double * > _parameter_blocks
Definition: marginalization.hpp:25
isae::Marginalization::_frame_to_marg
std::shared_ptr< Frame > _frame_to_marg
Frame to marginalize.
Definition: marginalization.hpp:123
isae::Marginalization::_prior_lmk
Eigen::Vector3d _prior_lmk
Prior of the landmark absolute prior.
Definition: marginalization.hpp:141
isae::Marginalization::_n
int _n
Parametric size of the variables to keep.
Definition: marginalization.hpp:118
isae::Marginalization::_marginalization_residual
Eigen::VectorXd _marginalization_residual
Residual of the dense prior factor.
Definition: marginalization.hpp:151
isae::Marginalization::_U
Eigen::MatrixXd _U
Eigen vectors that have non null eigen values.
Definition: marginalization.hpp:147
typedefs.h
ALandmark.h
isae::Marginalization::_Sigma
Eigen::VectorXd _Sigma
Inverse of _Lambda.
Definition: marginalization.hpp:149
isae::MarginalizationFactor::Evaluate
virtual bool Evaluate(double const *const *parameters, double *residuals, double **jacobians) const
Definition: marginalization.hpp:182
isae::MarginalizationBlockInfo::_residuals
Eigen::VectorXd _residuals
Definition: marginalization.hpp:29
isae::Marginalization::computeMutualInformation
double computeMutualInformation(std::shared_ptr< ALandmark > lmk_i, std::shared_ptr< ALandmark > lmk_j)
Compute the Mutual Information between two landmarks.
Definition: marginalization.cpp:265
isae::Marginalization::_Sigma_k
Eigen::MatrixXd _Sigma_k
Covariance of the dense prior.
Definition: marginalization.hpp:146
frame.h
isae
Definition: AFeature2D.h:8
isae::Marginalization::_map_lmk_inf
std::unordered_map< std::shared_ptr< ALandmark >, Eigen::Matrix3d > _map_lmk_inf
Map between landmarks and info mat of sparse relative prior factors.
Definition: marginalization.hpp:136
isae::typed_vec_landmarks
std::unordered_map< std::string, std::vector< std::shared_ptr< isae::ALandmark > > > typed_vec_landmarks
A typed vector of landmarks to handle hetereogeneous landmark sets.
Definition: typedefs.h:30
isae::Marginalization::_lmk_to_keep
typed_vec_landmarks _lmk_to_keep
Set of landmarks to keep.
Definition: marginalization.hpp:125
isae::Marginalization::_map_frame_inf
std::unordered_map< std::shared_ptr< Frame >, Eigen::MatrixXd > _map_frame_inf
Map between frame and their marginal information matrix.
Definition: marginalization.hpp:130
isae::Marginalization::_n_full
int _n_full
Parametric size of the variables to keep after rank reveilling.
Definition: marginalization.hpp:119
isae::Marginalization::computeInformationAndGradient
void computeInformationAndGradient(std::vector< std::shared_ptr< MarginalizationBlockInfo >> blocks, Eigen::MatrixXd &A, Eigen::VectorXd &b)
Compute the information matrix and the gradient for a set of factors.
Definition: marginalization.cpp:145
isae::Marginalization::_Ak
Eigen::MatrixXd _Ak
Information matrix of the subproblem.
Definition: marginalization.hpp:144
isae::MarginalizationBlockInfo::MarginalizationBlockInfo
MarginalizationBlockInfo(ceres::CostFunction *cost_function, std::vector< int > parameter_idx, std::vector< double * > parameter_blocks)
Definition: marginalization.hpp:16
isae::MarginalizationBlockInfo::_jacobians
std::vector< Eigen::Matrix< double, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor > > _jacobians
Definition: marginalization.hpp:28
isae::Marginalization::_map_lmk_prior
std::unordered_map< std::shared_ptr< ALandmark >, Eigen::Vector3d > _map_lmk_prior
Map between landmarks and priors of sparse prior relative factors.
Definition: marginalization.hpp:138
isae::Marginalization::sparsifyVIO
bool sparsifyVIO()
Sparsify the dense prior factor in the VIO case.
Definition: marginalization.cpp:349
isae::Marginalization::_marginalization_jacobian
Eigen::MatrixXd _marginalization_jacobian
Jacobian of the dense prior factor.
Definition: marginalization.hpp:150
isae::Marginalization::computeKLD
double computeKLD(Eigen::MatrixXd A_p, Eigen::MatrixXd A_q)
Compute the KLD between the multivariate Gaussian with their Information Matrix assuming their mean i...
Definition: marginalization.cpp:331
isae::MarginalizationFactor
Ceres cost function of the dense prior factor.
Definition: marginalization.hpp:157
isae::MarginalizationBlockInfo::_parameter_idx
std::vector< int > _parameter_idx
Definition: marginalization.hpp:24
isae::Marginalization::_frame_to_keep
std::shared_ptr< Frame > _frame_to_keep
Frame to keep.
Definition: marginalization.hpp:124
isae::Marginalization::_m
int _m
Parametric size of the variables to marginalize.
Definition: marginalization.hpp:117
isae::Marginalization::_lmk_to_marg
typed_vec_landmarks _lmk_to_marg
Set of landmarks to marginalize.
Definition: marginalization.hpp:126
isae::Marginalization::sparsifyVO
bool sparsifyVO()
Sparsify the dense prior factor in the VO case.
Definition: marginalization.cpp:397
localmap.h