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
31 set<TLandmarkID> lm_visited;
32 set<const k2k_edge_t*> k2k_visited;
33 set<const k2f_edge_t*> k2f_visited;
35 if (!rely_on_prebuilt_spanning_trees)
38 set<TKeyFrameID> kf_visited;
39 queue<TKeyFrameID> pending;
40 map<TKeyFrameID,topo_dist_t> distances;
42 pending.push(root_id);
43 kf_visited.insert(root_id);
44 distances[root_id] = 0;
46 while (!pending.empty())
53 kf_visitor.visit_kf(next_kf,cur_dist);
56 ASSERTDEB_(next_kf < rba_state.keyframes.size())
60 for (
size_t i=0;i<kfi.adjacent_k2f_edges.size();i++)
62 const k2f_edge_t* ed = kfi.adjacent_k2f_edges[i];
64 if (!lm_visited.count(lm_ID))
66 if (feat_visitor.visit_filter_feat(lm_ID,cur_dist) )
67 feat_visitor.visit_feat(lm_ID,cur_dist);
68 lm_visited.insert(lm_ID);
70 if (!k2f_visited.count(ed))
72 if (k2f_edge_visitor.visit_filter_k2f(next_kf,ed,cur_dist) )
73 k2f_edge_visitor.visit_k2f(next_kf,ed,cur_dist);
74 k2f_visited.insert(ed);
79 if (cur_dist>=max_distance)
83 for (
size_t i=0;i<kfi.adjacent_k2k_edges.size();i++)
85 const k2k_edge_t* ed = kfi.adjacent_k2k_edges[i];
87 if (!kf_visited.count(new_kf))
89 if (kf_visitor.visit_filter_kf(new_kf,cur_dist) )
92 distances[new_kf]=cur_dist+1;
94 kf_visited.insert(new_kf);
96 if (!k2k_visited.count(ed))
98 if (k2k_edge_visitor.visit_filter_k2k(next_kf,new_kf,ed,cur_dist) )
99 k2k_edge_visitor.visit_k2k(next_kf,new_kf,ed,cur_dist);
100 k2k_visited.insert(ed);
107 const typename rba_problem_state_t::TSpanningTree::TSpanningTreeSym & st_sym = rba_state.spanning_tree.sym;
110 if (it_ste == st_sym.next_edge.end())
113 const std::map<TKeyFrameID,TSpanTreeEntry> & root_ST = it_ste->second;
116 std::vector< std::pair<TKeyFrameID,topo_dist_t> > KFs;
117 KFs.reserve(root_ST.size()+1);
119 KFs.push_back( std::pair<TKeyFrameID,topo_dist_t>(root_id, 0 ) );
121 KFs.push_back( std::pair<TKeyFrameID,topo_dist_t>(it->first,it->second.distance) );
124 for (
size_t i=0;i<KFs.size();i++)
127 const size_t cur_dist = KFs[i].second;
130 if (cur_dist>max_distance)
134 if (kf_visitor.visit_filter_kf(kf_id,cur_dist) )
136 kf_visitor.visit_kf(kf_id, cur_dist);
140 ASSERTDEB_(kf_id < rba_state.keyframes.size())
144 for (
size_t i=0;i<kfi.adjacent_k2f_edges.size();i++)
146 const k2f_edge_t* ed = kfi.adjacent_k2f_edges[i];
148 if (!lm_visited.count(lm_ID))
150 if (feat_visitor.visit_filter_feat(lm_ID,cur_dist) )
151 feat_visitor.visit_feat(lm_ID,cur_dist);
152 lm_visited.insert(lm_ID);
154 if (!k2f_visited.count(ed))
156 if (k2f_edge_visitor.visit_filter_k2f(kf_id,ed,cur_dist) )
157 k2f_edge_visitor.visit_k2f(kf_id,ed,cur_dist);
158 k2f_visited.insert(ed);
163 for (
size_t i=0;i<kfi.adjacent_k2k_edges.size();i++)
165 const k2k_edge_t* ed = kfi.adjacent_k2k_edges[i];
168 if (!k2k_visited.count(ed))
170 if (k2k_edge_visitor.visit_filter_k2k(kf_id,new_kf,ed,cur_dist) )
171 k2k_edge_visitor.visit_k2k(kf_id,new_kf,ed,cur_dist);
172 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)