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-2014, 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 using namespace mrpt;
15 using namespace mrpt::math;
16 using namespace std;
17 
18 /*******************************************
19  compute_minus_gradient
20 
21  grad = J^t * (h(x)-z)
22  *******************************************/
23 template <class KF2KF_POSE_TYPE,class LM_TYPE,class OBS_TYPE,class RBA_OPTIONS>
25  Eigen::VectorXd & minus_grad,
26  const std::vector<typename TSparseBlocksJacobians_dh_dAp::col_t*> & sparse_jacobs_Ap,
27  const std::vector<typename TSparseBlocksJacobians_dh_df::col_t*> & sparse_jacobs_f,
28  const vector_residuals_t & residuals,
29  const std::map<size_t,size_t> &obs_global_idx2residual_idx
30  ) const
31 {
32  // Problem dimensions:
33  const size_t POSE_DIMS = KF2KF_POSE_TYPE::REL_POSE_DIMS;
34  const size_t LM_DIMS = LM_TYPE::LM_DIMS;
35 
36  const size_t nUnknowns_k2k = sparse_jacobs_Ap.size();
37  const size_t nUnknowns_k2f = sparse_jacobs_f.size();
38 
39  const size_t idx_start_f = POSE_DIMS*nUnknowns_k2k;
40  const size_t nUnknowns_scalars = POSE_DIMS*nUnknowns_k2k + LM_DIMS*nUnknowns_k2f;
41 
42  if (static_cast<size_t>(minus_grad.size())!=nUnknowns_scalars)
43  minus_grad.resize(nUnknowns_scalars);
44 
45  //size_t running_idx_obs=0; // for the precomputed "sequential_obs_indices"
46 
47  // grad_Ap:
48  for (size_t i=0;i<nUnknowns_k2k;i++)
49  {
50  const typename TSparseBlocksJacobians_dh_dAp::col_t & col_i = *sparse_jacobs_Ap[i];
51 
52  array_pose_t accum_g_i;
53  accum_g_i.zeros();
54 
55  for (typename TSparseBlocksJacobians_dh_dAp::col_t::const_iterator itJ = col_i.begin();itJ != col_i.end();++itJ)
56  {
57  //const size_t resid_idx = sequential_obs_indices[running_idx_obs++];
58  const size_t obs_idx = itJ->first;
59  map<size_t,size_t>::const_iterator it_obs = obs_global_idx2residual_idx.find(obs_idx);
60  ASSERT_(it_obs!=obs_global_idx2residual_idx.end())
61  const size_t resid_idx = it_obs->second;
62 
63  // Accumulate sub-gradient: // g += J^t * \Lambda * residual
64  RBA_OPTIONS::obs_noise_matrix_t::template accum_Jtr(accum_g_i, itJ->second.num, residuals[ resid_idx ], obs_idx, this->parameters.obs_noise );
65  }
66  // Do scaling (if applicable):
67  RBA_OPTIONS::obs_noise_matrix_t::template scale_Jtr(accum_g_i, this->parameters.obs_noise );
68 
69  minus_grad.block<POSE_DIMS,1>(i*POSE_DIMS,0) = accum_g_i;
70  }
71  // grad_Af:
72  for (size_t i=0;i<nUnknowns_k2f;i++)
73  {
74  const typename TSparseBlocksJacobians_dh_df::col_t & col_i = *sparse_jacobs_f[i];
75 
76  array_landmark_t accum_g_i;
77  accum_g_i.zeros();
78 
79  for (typename TSparseBlocksJacobians_dh_df::col_t::const_iterator itJ = col_i.begin();itJ != col_i.end();++itJ)
80  {
81  //const size_t resid_idx = sequential_obs_indices[running_idx_obs++];
82  const size_t obs_idx = itJ->first;
83  map<size_t,size_t>::const_iterator it_obs = obs_global_idx2residual_idx.find(obs_idx);
84  ASSERT_(it_obs!=obs_global_idx2residual_idx.end())
85  const size_t resid_idx = it_obs->second;
86 
87  // Accumulate sub-gradient: // g += J^t * \Lambda * residual
88  RBA_OPTIONS::obs_noise_matrix_t::template accum_Jtr(accum_g_i, itJ->second.num, residuals[ resid_idx ], obs_idx, this->parameters.obs_noise );
89  }
90  // Do scaling (if applicable):
91  RBA_OPTIONS::obs_noise_matrix_t::template scale_Jtr(accum_g_i, this->parameters.obs_noise );
92 
93  minus_grad.block<LM_DIMS,1>(idx_start_f+i*LM_DIMS,0) = accum_g_i;
94  }
95 }
96 
97 } } // end namespaces
observation_traits_t::vector_residuals_t vector_residuals_t
Definition: RbaEngine.h:109
STL namespace.
const Scalar * const_iterator
Definition: eigen_plugins.h:24
This base provides a set of functions for maths stuff.
Definition: CArray.h:18
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.8 for MRPT 1.2.2 SVN:Unversioned directory at Tue Oct 14 02:14:08 UTC 2014