Main MRPT website > C++ reference
MRPT logo
define_new_keyframe.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 // The main entry point of SRBA. See .h and papers for docs.
15 template <class KF2KF_POSE_TYPE,class LM_TYPE,class OBS_TYPE,class RBA_OPTIONS>
17  const typename traits_t::new_kf_observations_t & obs,
18  TNewKeyFrameInfo & out_new_kf_info,
19  const bool run_local_optimization )
20 {
21  m_profiler.enter("define_new_keyframe");
22 
23  out_new_kf_info.clear();
24 
25  // Update KFs data structures ; O(1)
26  // ------------------------------------
27  const TKeyFrameID new_kf_id = alloc_keyframe();
28 
29  // Apply edge-creation policy to decide how to handle loop closures, etc.
30  // -----------------------------------------------------------------------------
31  // ==== Determine what edges to create: O(TBD) ====
32  m_profiler.enter("define_new_keyframe.determine_edges");
33 
34  // Keep a list of the new kf2kf edges, whose initial values are indeterminate:
35  std::vector<TNewEdgeInfo> new_k2k_edge_ids;
36  determine_kf2kf_edges_to_create(new_kf_id,obs, new_k2k_edge_ids); // ***** here's the beef! *****
37 
38  m_profiler.leave("define_new_keyframe.determine_edges");
39 
40 
41  // Expand symbolic Jacobians to accomodate new observations: O( No * (P+log C) )
42  // -----------------------------------------------------------------------------
43  m_profiler.enter("define_new_keyframe.add_observations");
44 
45  for (typename new_kf_observations_t::const_iterator it_obs = obs.begin();it_obs != obs.end();++it_obs)
46  {
47  const typename landmark_traits_t::array_landmark_t *fixed_rel_pos = it_obs->is_fixed ? &it_obs->feat_rel_pos : NULL;
48  const typename landmark_traits_t::array_landmark_t *unk_rel_pos_initval = it_obs->is_unknown_with_init_val ? &it_obs->feat_rel_pos : NULL;
49 
50  this->add_observation( new_kf_id, it_obs->obs, fixed_rel_pos, unk_rel_pos_initval );
51  }
52 
53  m_profiler.leave("define_new_keyframe.add_observations");
54 
55  // Update SLAM estimation:
56  // -----------------------------------------------------------------------------
57  if (run_local_optimization)
58  {
59  // Try to initialize the new edges in separate optimizations?
60  if (parameters.srba.optimize_new_edges_alone)
61  {
62  // Do it one by one so we can detect rank-deficient situations, etc.
63  if (!new_k2k_edge_ids.empty())
64  {
65  m_profiler.enter("define_new_keyframe.opt_new_edges");
66 
67  // temporarily disable robust kernel for initialization (faster)
68  const bool old_kernel = parameters.srba.use_robust_kernel;
69  parameters.srba.use_robust_kernel= parameters.srba.use_robust_kernel_stage1;
70 
71  std::vector<size_t> k2f_edges_to_opt; // Empty: only initialize k2k edges.
72  std::vector<size_t> k2k_edges_to_opt(1);
73 
74  for (size_t i=0;i<new_k2k_edge_ids.size();i++)
75  {
76  if (new_k2k_edge_ids[i].has_aprox_init_val)
77  continue; // Already initialized, can skip it.
78  k2k_edges_to_opt[0] = new_k2k_edge_ids[i].id ;
79 
80  //TOptimizeExtraOutputInfo init_opt_info;
81  this->optimize_edges(
82  k2k_edges_to_opt,
83  k2f_edges_to_opt,
84  out_new_kf_info.optimize_results_stg1 /*init_opt_info*/
85  );
86  }
87 
88  parameters.srba.use_robust_kernel = old_kernel;
89 
90  m_profiler.leave("define_new_keyframe.opt_new_edges");
91  }
92  }
93 
94  m_profiler.enter("define_new_keyframe.optimize");
95 
96  TOptimizeLocalAreaParams opt_params; // Default values
97 
98  this->optimize_local_area(
99  new_kf_id, // root node
100  parameters.srba.max_optimize_depth, // win size
101  out_new_kf_info.optimize_results,
102  opt_params
103  );
104 
105  m_profiler.leave("define_new_keyframe.optimize");
106  }
107 
108 
109  // Fill out_new_kf_info
110  // -----------------------------------------
111  out_new_kf_info.kf_id = new_kf_id;
112  out_new_kf_info.created_edge_ids.swap( new_k2k_edge_ids ); // swap, faster than copy
113 
114  m_profiler.leave("define_new_keyframe");
115 
116  VERBOSE_LEVEL(1) << "[define_new_keyframe] Done. New KF #" << out_new_kf_info.kf_id << " with " << out_new_kf_info.created_edge_ids.size() << " new edges.\n";
117 } // end of RbaEngine::define_new_keyframe
118 
119 
120 } } // end NS
TKeyFrameID kf_id
The ID of the newly created KF.
Definition: RbaEngine.h:160
TOptimizeExtraOutputInfo optimize_results_stg1
Results from the least-squares optimization.
Definition: RbaEngine.h:163
const Scalar * const_iterator
Definition: eigen_plugins.h:24
std::deque< new_kf_observation_t > new_kf_observations_t
A set of all the observations made from a new KF, as provided by the user.
Definition: srba_types.h:422
void define_new_keyframe(const typename traits_t::new_kf_observations_t &obs, TNewKeyFrameInfo &out_new_kf_info, const bool run_local_optimization=true)
The most common entry point for SRBA: append a new keyframe (KF) to the map, automatically creates th...
Parameters for optimize_local_area()
Definition: RbaEngine.h:190
TOptimizeExtraOutputInfo optimize_results
Results from the least-squares optimization.
Definition: RbaEngine.h:162
This is the global namespace for all Mobile Robot Programming Toolkit (MRPT) libraries.
#define VERBOSE_LEVEL(_LEVEL)
Definition: RbaEngine.h:25
std::vector< TNewEdgeInfo > created_edge_ids
The newly created edges (minimum: 1 edge)
Definition: RbaEngine.h:161
A partial specialization of CArrayNumeric for double numbers.
Definition: CArrayNumeric.h:74
Information returned by RbaEngine::define_new_keyframe()
Definition: RbaEngine.h:158
uint64_t TKeyFrameID
Numeric IDs for key-frames (KFs)
Definition: srba_types.h:31



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