Main MRPT website > C++ reference
MRPT logo
compute_minus_gradient.h
Go to the documentation of this file.
1 /* +---------------------------------------------------------------------------+
2  | Mobile Robot Programming Toolkit (MRPT) |
3  | http://www.mrpt.org/ |
4  | |
5  | Copyright (c) 2005-2015, Individual contributors, see AUTHORS file |
6  | See: http://www.mrpt.org/Authors - All rights reserved. |
7  | Released under BSD License. See details in http://www.mrpt.org/License |
8  +---------------------------------------------------------------------------+ */
9 
10 #pragma once
11 
12 namespace mrpt { namespace srba {
13 
14 /*******************************************
15  compute_minus_gradient
16 
17  grad = J^t * (h(x)-z)
18  *******************************************/
19 template <class KF2KF_POSE_TYPE,class LM_TYPE,class OBS_TYPE,class RBA_OPTIONS>
21  Eigen::VectorXd & minus_grad,
22  const std::vector<typename TSparseBlocksJacobians_dh_dAp::col_t*> & sparse_jacobs_Ap,
23  const std::vector<typename TSparseBlocksJacobians_dh_df::col_t*> & sparse_jacobs_f,
24  const vector_residuals_t & residuals,
25  const std::map<size_t,size_t> &obs_global_idx2residual_idx
26  ) const
27 {
28  // Problem dimensions:
29  const size_t POSE_DIMS = KF2KF_POSE_TYPE::REL_POSE_DIMS;
30  const size_t LM_DIMS = LM_TYPE::LM_DIMS;
31 
32  const size_t nUnknowns_k2k = sparse_jacobs_Ap.size();
33  const size_t nUnknowns_k2f = sparse_jacobs_f.size();
34 
35  const size_t idx_start_f = POSE_DIMS*nUnknowns_k2k;
36  const size_t nUnknowns_scalars = POSE_DIMS*nUnknowns_k2k + LM_DIMS*nUnknowns_k2f;
37 
38  if (static_cast<size_t>(minus_grad.size())!=nUnknowns_scalars)
39  minus_grad.resize(nUnknowns_scalars);
40 
41  //size_t running_idx_obs=0; // for the precomputed "sequential_obs_indices"
42 
43  // grad_Ap:
44  for (size_t i=0;i<nUnknowns_k2k;i++)
45  {
46  const typename TSparseBlocksJacobians_dh_dAp::col_t & col_i = *sparse_jacobs_Ap[i];
47 
48  array_pose_t accum_g_i;
49  accum_g_i.zeros();
50 
51  for (typename TSparseBlocksJacobians_dh_dAp::col_t::const_iterator itJ = col_i.begin();itJ != col_i.end();++itJ)
52  {
53  //const size_t resid_idx = sequential_obs_indices[running_idx_obs++];
54  const size_t obs_idx = itJ->first;
55  std::map<size_t,size_t>::const_iterator it_obs = obs_global_idx2residual_idx.find(obs_idx);
56  ASSERT_(it_obs!=obs_global_idx2residual_idx.end())
57  const size_t resid_idx = it_obs->second;
58 
59  // Accumulate sub-gradient: // g += J^t * \Lambda * residual
60  RBA_OPTIONS::obs_noise_matrix_t::template accum_Jtr(accum_g_i, itJ->second.num, residuals[ resid_idx ], obs_idx, this->parameters.obs_noise );
61  }
62  // Do scaling (if applicable):
63  RBA_OPTIONS::obs_noise_matrix_t::template scale_Jtr(accum_g_i, this->parameters.obs_noise );
64 
65  minus_grad.block<POSE_DIMS,1>(i*POSE_DIMS,0) = accum_g_i;
66  }
67  // grad_Af:
68  for (size_t i=0;i<nUnknowns_k2f;i++)
69  {
70  const typename TSparseBlocksJacobians_dh_df::col_t & col_i = *sparse_jacobs_f[i];
71 
72  array_landmark_t accum_g_i;
73  accum_g_i.zeros();
74 
75  for (typename TSparseBlocksJacobians_dh_df::col_t::const_iterator itJ = col_i.begin();itJ != col_i.end();++itJ)
76  {
77  //const size_t resid_idx = sequential_obs_indices[running_idx_obs++];
78  const size_t obs_idx = itJ->first;
79  std::map<size_t,size_t>::const_iterator it_obs = obs_global_idx2residual_idx.find(obs_idx);
80  ASSERT_(it_obs!=obs_global_idx2residual_idx.end())
81  const size_t resid_idx = it_obs->second;
82 
83  // Accumulate sub-gradient: // g += J^t * \Lambda * residual
84  RBA_OPTIONS::obs_noise_matrix_t::template accum_Jtr(accum_g_i, itJ->second.num, residuals[ resid_idx ], obs_idx, this->parameters.obs_noise );
85  }
86  // Do scaling (if applicable):
87  RBA_OPTIONS::obs_noise_matrix_t::template scale_Jtr(accum_g_i, this->parameters.obs_noise );
88 
89  minus_grad.block<LM_DIMS,1>(idx_start_f+i*LM_DIMS,0) = accum_g_i;
90  }
91 }
92 
93 } } // end namespaces
observation_traits_t::vector_residuals_t vector_residuals_t
Definition: RbaEngine.h:107
const Scalar * const_iterator
Definition: eigen_plugins.h:24
void compute_minus_gradient(Eigen::VectorXd &minus_grad, const std::vector< typename TSparseBlocksJacobians_dh_dAp::col_t * > &sparse_jacobs_Ap, const std::vector< typename TSparseBlocksJacobians_dh_df::col_t * > &sparse_jacobs_f, const vector_residuals_t &residuals, const std::map< size_t, size_t > &obs_global_idx2residual_idx) const
This is the global namespace for all Mobile Robot Programming Toolkit (MRPT) libraries.
#define ASSERT_(f)
A partial specialization of CArrayNumeric for double numbers.
Definition: CArrayNumeric.h:74



Page generated by Doxygen 1.8.9.1 for MRPT 1.3.0 SVN: at Sun Sep 13 03:55:12 UTC 2015