12 namespace mrpt {
namespace srba {
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,
25 const std::map<size_t,size_t> &obs_global_idx2residual_idx
29 const size_t POSE_DIMS = KF2KF_POSE_TYPE::REL_POSE_DIMS;
30 const size_t LM_DIMS = LM_TYPE::LM_DIMS;
32 const size_t nUnknowns_k2k = sparse_jacobs_Ap.size();
33 const size_t nUnknowns_k2f = sparse_jacobs_f.size();
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;
38 if (static_cast<size_t>(minus_grad.size())!=nUnknowns_scalars)
39 minus_grad.resize(nUnknowns_scalars);
44 for (
size_t i=0;i<nUnknowns_k2k;i++)
46 const typename TSparseBlocksJacobians_dh_dAp::col_t & col_i = *sparse_jacobs_Ap[i];
54 const size_t obs_idx = itJ->first;
56 ASSERT_(it_obs!=obs_global_idx2residual_idx.end())
57 const size_t resid_idx = it_obs->second;
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 );
63 RBA_OPTIONS::obs_noise_matrix_t::template scale_Jtr(accum_g_i, this->parameters.obs_noise );
65 minus_grad.block<POSE_DIMS,1>(i*POSE_DIMS,0) = accum_g_i;
68 for (
size_t i=0;i<nUnknowns_k2f;i++)
70 const typename TSparseBlocksJacobians_dh_df::col_t & col_i = *sparse_jacobs_f[i];
78 const size_t obs_idx = itJ->first;
80 ASSERT_(it_obs!=obs_global_idx2residual_idx.end())
81 const size_t resid_idx = it_obs->second;
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 );
87 RBA_OPTIONS::obs_noise_matrix_t::template scale_Jtr(accum_g_i, this->parameters.obs_noise );
89 minus_grad.block<LM_DIMS,1>(idx_start_f+i*LM_DIMS,0) = accum_g_i;
observation_traits_t::vector_residuals_t vector_residuals_t
const Scalar * const_iterator
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.
A partial specialization of CArrayNumeric for double numbers.