12 namespace mrpt {
namespace srba {
14 template <
class KF2KF_POSE_TYPE,
class LM_TYPE,
class OBS_TYPE,
class RBA_OPTIONS>
18 class K2K_EDGE_VISITOR,
19 class K2F_EDGE_VISITOR
24 const bool rely_on_prebuilt_spanning_trees,
25 KF_VISITOR & kf_visitor,
26 FEAT_VISITOR & feat_visitor,
27 K2K_EDGE_VISITOR & k2k_edge_visitor,
28 K2F_EDGE_VISITOR & k2f_edge_visitor )
const
30 set<TLandmarkID> lm_visited;
31 set<const k2k_edge_t*> k2k_visited;
32 set<const k2f_edge_t*> k2f_visited;
34 if (!rely_on_prebuilt_spanning_trees)
37 set<TKeyFrameID> kf_visited;
38 queue<TKeyFrameID> pending;
39 map<TKeyFrameID,topo_dist_t> distances;
41 pending.push(root_id);
42 kf_visited.insert(root_id);
43 distances[root_id] = 0;
45 while (!pending.empty())
52 kf_visitor.visit_kf(next_kf,cur_dist);
55 ASSERTDEB_(next_kf < rba_state.keyframes.size())
59 for (
size_t i=0;i<kfi.adjacent_k2f_edges.size();i++)
61 const k2f_edge_t* ed = kfi.adjacent_k2f_edges[i];
63 if (!lm_visited.count(lm_ID))
65 if (feat_visitor.visit_filter_feat(lm_ID,cur_dist) )
66 feat_visitor.visit_feat(lm_ID,cur_dist);
67 lm_visited.insert(lm_ID);
69 if (!k2f_visited.count(ed))
71 if (k2f_edge_visitor.visit_filter_k2f(next_kf,ed,cur_dist) )
72 k2f_edge_visitor.visit_k2f(next_kf,ed,cur_dist);
73 k2f_visited.insert(ed);
78 if (cur_dist>=max_distance)
82 for (
size_t i=0;i<kfi.adjacent_k2k_edges.size();i++)
84 const k2k_edge_t* ed = kfi.adjacent_k2k_edges[i];
86 if (!kf_visited.count(new_kf))
88 if (kf_visitor.visit_filter_kf(new_kf,cur_dist) )
91 distances[new_kf]=cur_dist+1;
93 kf_visited.insert(new_kf);
95 if (!k2k_visited.count(ed))
97 if (k2k_edge_visitor.visit_filter_k2k(next_kf,new_kf,ed,cur_dist) )
98 k2k_edge_visitor.visit_k2k(next_kf,new_kf,ed,cur_dist);
99 k2k_visited.insert(ed);
106 const typename rba_problem_state_t::TSpanningTree::TSpanningTreeSym & st_sym = rba_state.spanning_tree.sym;
109 if (it_ste == st_sym.next_edge.end())
112 const std::map<TKeyFrameID,TSpanTreeEntry> & root_ST = it_ste->second;
115 std::vector< std::pair<TKeyFrameID,topo_dist_t> > KFs;
116 KFs.reserve(root_ST.size()+1);
118 KFs.push_back( std::pair<TKeyFrameID,topo_dist_t>(root_id, 0 ) );
120 KFs.push_back( std::pair<TKeyFrameID,topo_dist_t>(it->first,it->second.distance) );
123 for (
size_t i=0;i<KFs.size();i++)
126 const size_t cur_dist = KFs[i].second;
129 if (cur_dist>max_distance)
133 if (kf_visitor.visit_filter_kf(kf_id,cur_dist) )
135 kf_visitor.visit_kf(kf_id, cur_dist);
139 ASSERTDEB_(kf_id < rba_state.keyframes.size())
143 for (
size_t i=0;i<kfi.adjacent_k2f_edges.size();i++)
145 const k2f_edge_t* ed = kfi.adjacent_k2f_edges[i];
147 if (!lm_visited.count(lm_ID))
149 if (feat_visitor.visit_filter_feat(lm_ID,cur_dist) )
150 feat_visitor.visit_feat(lm_ID,cur_dist);
151 lm_visited.insert(lm_ID);
153 if (!k2f_visited.count(ed))
155 if (k2f_edge_visitor.visit_filter_k2f(kf_id,ed,cur_dist) )
156 k2f_edge_visitor.visit_k2f(kf_id,ed,cur_dist);
157 k2f_visited.insert(ed);
162 for (
size_t i=0;i<kfi.adjacent_k2k_edges.size();i++)
164 const k2k_edge_t* ed = kfi.adjacent_k2k_edges[i];
167 if (!k2k_visited.count(ed))
169 if (k2k_edge_visitor.visit_filter_k2k(kf_id,new_kf,ed,cur_dist) )
170 k2k_edge_visitor.visit_k2k(kf_id,new_kf,ed,cur_dist);
171 k2k_visited.insert(ed);
obs_traits_t::observation_t obs
Observation data.
TLandmarkID feat_id
Observed what.
uint64_t TLandmarkID
Numeric IDs for landmarks.
const Scalar * const_iterator
Keyframe-to-keyframe edge: an unknown of the problem.
uint64_t topo_dist_t
Unsigned integral type for topological distances in a graph/tree.
This is the global namespace for all Mobile Robot Programming Toolkit (MRPT) libraries.
#define ASSERTDEB_(f)
Defines an assertion mechanism - only when compiled in debug.
Information per key-frame needed for RBA.
void bfs_visitor(const TKeyFrameID root_id, const topo_dist_t max_distance, const bool rely_on_prebuilt_spanning_trees, KF_VISITOR &kf_visitor, FEAT_VISITOR &feat_visitor, K2K_EDGE_VISITOR &k2k_edge_visitor, K2F_EDGE_VISITOR &k2f_edge_visitor) const
Visits all k2k & k2f edges following a BFS starting at a given starting node and up to a given maximu...
Keyframe-to-feature edge: observation data stored for each keyframe.
V getTheOtherFromPair2(const V one, const K2K_EDGE &p)
For usage with K2K_EDGE = typename kf2kf_pose_traits
::k2k_edge_t.
uint64_t TKeyFrameID
Numeric IDs for key-frames (KFs)