10 #ifndef CLOOPCLOSERERD_H
11 #define CLOOPCLOSERERD_H
213 template <
class GRAPH_T =
typename mrpt::graphs::CNetworkOfPoses2DInf>
226 using pose_t =
typename GRAPH_T::constraint_t::type_value;
239 std::map<std::pair<hypot_t*, hypot_t*>,
double>;
257 const std::map<std::string, bool>& events_occurred);
258 void getEdgesStats(std::map<std::string, int>* edge_types_to_num)
const;
300 using namespace mrpt;
315 o <<
params.getAsString() << endl;
324 using group_t = std::map<mrpt::graphs::TNodeID, node_props_t>;
343 const std::vector<uint32_t>& groupA,
344 const std::vector<uint32_t>& groupB,
hypotsp_t* generated_hypots,
365 const std::vector<uint32_t>& groupA,
366 const std::vector<uint32_t>& groupB,
const hypotsp_t& hypots_pool,
368 const paths_t* groupA_opt_paths = NULL,
369 const paths_t* groupB_opt_paths = NULL);
399 const std::map<mrpt::graphs::TNodeID, node_props_t>& group_params,
422 void loadFromConfigFile(
425 void dumpToTextStream(std::ostream& out)
const;
468 void loadFromConfigFile(
471 void dumpToTextStream(std::ostream& out)
const;
543 std::set<mrpt::graphs::TNodeID>* nodes_set);
562 bool full_update =
false,
bool is_first_time_node_reg =
false);
585 const std::vector<uint32_t>& nodes_list,
586 std::pair<double, double>* centroid_coords)
const;
612 bool use_power_method =
false);
692 const hypotsp_t& vec_hypots,
const size_t&
id,
bool throw_exc =
true);
740 std::set<path_t*>* pool_of_paths)
const;
750 std::set<path_t*>* pool_of_paths,
const path_t& curr_path,
751 const std::set<mrpt::graphs::TNodeID>& neibors)
const;
783 std::vector<uint32_t>& partition, std::vector<uint32_t>* groupA,
784 std::vector<uint32_t>* groupB,
int max_nodes_in_group = 5);
This class allows loading and storing values and vectors of different types from a configuration text...
This is a virtual base class for sets of options than can be loaded from and/or saved to configuratio...
Class acts as a container for storing pointers to mrpt::gui::CDisplayWindow3D, mrpt::graphslam::CWind...
Edge Registration Decider scheme specialized in Loop Closing.
void evaluatePartitionsForLC(const partitions_t &partitions)
Evaluate the given partitions for loop closures.
void generateHypotsPool(const std::vector< uint32_t > &groupA, const std::vector< uint32_t > &groupB, hypotsp_t *generated_hypots, const TGenerateHypotsPoolAdParams *ad_params=NULL)
Generate the hypothesis pool for all the inter-group constraints between two groups of nodes.
bool computeDominantEigenVector(const mrpt::math::CMatrixDouble &consist_matrix, mrpt::math::dynamic_vector< double > *eigvec, bool use_power_method=false)
void updateCurrCovarianceVisualization()
TLoopClosureParams m_lc_params
const partitions_t & getCurrentPartitions() const
void registerNewEdge(const mrpt::graphs::TNodeID &from, const mrpt::graphs::TNodeID &to, const constraint_t &rel_edge)
std::vector< hypot_t > hypots_t
void setDijkstraExecutionThresh(size_t new_thresh)
void splitPartitionToGroups(std::vector< uint32_t > &partition, std::vector< uint32_t > *groupA, std::vector< uint32_t > *groupB, int max_nodes_in_group=5)
Split an existing partition to Groups.
std::map< mrpt::graphs::TNodeID, path_t * > m_node_optimal_paths
Map that stores the lowest uncertainty path towards a node.
bool getPropsOfNodeID(const mrpt::graphs::TNodeID &nodeID, global_pose_t *pose, mrpt::obs::CObservation2DRangeScan::Ptr &scan, const node_props_t *node_props=NULL) const
Fill the pose and LaserScan for the given nodeID.
void getMinUncertaintyPath(const mrpt::graphs::TNodeID from, const mrpt::graphs::TNodeID to, path_t *path) const
Given two nodeIDs compute and return the path connecting them.
size_t getDijkstraExecutionThresh() const
Return the minimum number of nodes that should exist in the graph prior to running Dijkstra.
double m_consec_icp_constraint_factor
Factor used for accepting an ICP Constraint as valid.
mrpt::obs::CObservation2DRangeScan::Ptr m_last_laser_scan2D
Keep the last laser scan for visualization purposes.
typename GRAPH_T::global_pose_t global_pose_t
partitions_t m_last_partitions
Previous partitions vector.
virtual bool updateState(mrpt::obs::CActionCollection::Ptr action, mrpt::obs::CSensoryFrame::Ptr observations, mrpt::obs::CObservation::Ptr observation)
virtual void addScanMatchingEdges(const mrpt::graphs::TNodeID &curr_nodeID)
Addd ICP constraints from X previous nodeIDs up to the given nodeID.
void initCurrCovarianceVisualization()
static const path_t * findPathByEnds(const paths_t &vec_paths, const mrpt::graphs::TNodeID &src, const mrpt::graphs::TNodeID &dst, bool throw_exc=true)
Given a vector of TUncertaintyPath objects, find the one that has the given source and destination no...
std::vector< path_t > paths_t
bool fillNodePropsFromGroupParams(const mrpt::graphs::TNodeID &nodeID, const std::map< mrpt::graphs::TNodeID, node_props_t > &group_params, node_props_t *node_props)
Fill the TNodeProps instance using the parameters from the map.
double m_lc_icp_constraint_factor
Factor used for accepting an ICP Constraint in the loop closure proc.
int m_text_index_curr_node_covariance
std::vector< hypot_t * > hypotsp_t
mrpt::graphslam::TUncertaintyPath< GRAPH_T > * popMinUncertaintyPath(std::set< path_t * > *pool_of_paths) const
Find the minimum uncertainty path from te given pool of TUncertaintyPath instances.
bool m_is_first_time_node_reg
Track the first node registration occurance.
std::map< std::string, int > m_edge_types_to_nums
Keep track of the registered edge types.
typename parent_t::nodes_to_scans2D_t nodes_to_scans2D_t
mrpt::slam::CIncrementalMapPartitioner m_partitioner
Instance responsible for partitioning the map.
void updateLaserScansVisualization()
mrpt::obs::CObservation2DRangeScan::Ptr m_first_laser_scan
Keep track of the first recorded laser scan so that it can be assigned to the root node when the NRD ...
void initLaserScansVisualization()
void loadParams(const std::string &source_fname)
void setWindowManagerPtr(mrpt::graphslam::CWindowManager *win_manager)
static hypot_t * findHypotByEnds(const hypotsp_t &vec_hypots, const mrpt::graphs::TNodeID &from, const mrpt::graphs::TNodeID &to, bool throw_exc=true)
Given a vector of THypothesis objects, find the one that has the given start and end nodes.
typename GRAPH_T::edges_map_t::iterator edges_iterator
bool m_partitions_full_update
Indicate whether the partitions have been updated recently.
void registerHypothesis(const hypot_t &h)
Wrapper around the registerNewEdge method which accepts a THypothesis object instead.
std::vector< std::vector< uint32_t > > partitions_t
Typedef for referring to a list of partitions.
bool mahalanobisDistanceOdometryToICPEdge(const mrpt::graphs::TNodeID &from, const mrpt::graphs::TNodeID &to, const constraint_t &rel_edge)
brief Compare the suggested ICP edge against the initial node difference.
void updateMapPartitionsVisualization()
Update the map partitions visualization.
static hypot_t * findHypotByID(const hypotsp_t &vec_hypots, const size_t &id, bool throw_exc=true)
Given a vector of THypothesis objects, find the one that has the given ID.
void getEdgesStats(std::map< std::string, int > *edge_types_to_num) const
void execDijkstraProjection(mrpt::graphs::TNodeID starting_node=0, mrpt::graphs::TNodeID ending_node=INVALID_NODEID)
compute the minimum uncertainty of each node position with regards to the graph root.
virtual ~CLoopCloserERD()
void computeCentroidOfNodesVector(const std::vector< uint32_t > &nodes_list, std::pair< double, double > *centroid_coords) const
Compute the Centroid of a group of a vector of node positions.
void setLastLaserScan2D(mrpt::obs::CObservation2DRangeScan::Ptr scan)
Assign the last recorded 2D Laser scan.
TLaserParams m_laser_params
typename mrpt::graphs::detail::THypothesis< GRAPH_T > hypot_t
partitions_t m_curr_partitions
Current partitions vector.
typename GRAPH_T::edges_map_t::const_iterator edges_citerator
mrpt::graphslam::TUncertaintyPath< GRAPH_T > * queryOptimalPath(const mrpt::graphs::TNodeID node) const
Query for the optimal path of a nodeID.
typename parent_t::range_ops_t range_ops_t
void dumpVisibilityErrorMsg(std::string viz_flag, int sleep_time=500)
void updateMapPartitions(bool full_update=false, bool is_first_time_node_reg=false)
Split the currently registered graph nodes into partitions.
void toggleLaserScansVisualization()
togle the LaserScans visualization on and off
void getDescriptiveReport(std::string *report_str) const
typename GRAPH_T::constraint_t::type_value pose_t
type of underlying poses (2D/3D).
void generatePWConsistenciesMatrix(const std::vector< uint32_t > &groupA, const std::vector< uint32_t > &groupB, const hypotsp_t &hypots_pool, mrpt::math::CMatrixDouble *consist_matrix, const paths_t *groupA_opt_paths=NULL, const paths_t *groupB_opt_paths=NULL)
Compute the pair-wise consistencies Matrix.
void notifyOfWindowEvents(const std::map< std::string, bool > &events_occurred)
virtual void fetchNodeIDsForScanMatching(const mrpt::graphs::TNodeID &curr_nodeID, std::set< mrpt::graphs::TNodeID > *nodes_set)
Fetch a list of nodes with regards prior to the given nodeID for which to try and add scan matching e...
void checkPartitionsForLC(partitions_t *partitions_for_LC)
Check the registered so far partitions for potential loop closures.
void initMapPartitionsVisualization()
Initialize the visualization of the map partition objects.
double generatePWConsistencyElement(const mrpt::graphs::TNodeID &a1, const mrpt::graphs::TNodeID &a2, const mrpt::graphs::TNodeID &b1, const mrpt::graphs::TNodeID &b2, const hypotsp_t &hypots, const paths_t *opt_paths=NULL)
Return the pair-wise consistency between the observations of the given nodes.
double m_offset_y_curr_node_covariance
const mrpt::img::TColor m_curr_node_covariance_color
void addToPaths(std::set< path_t * > *pool_of_paths, const path_t &curr_path, const std::set< mrpt::graphs::TNodeID > &neibors) const
Append the paths starting from the current node.
virtual bool getICPEdge(const mrpt::graphs::TNodeID &from, const mrpt::graphs::TNodeID &to, constraint_t *rel_edge, mrpt::slam::CICP::TReturnInfo *icp_info=NULL, const TGetICPEdgeAdParams *ad_params=NULL)
Get the ICP Edge between the provided nodes.
void evalPWConsistenciesMatrix(const mrpt::math::CMatrixDouble &consist_matrix, const hypotsp_t &hypots_pool, hypotsp_t *valid_hypots)
Evalute the consistencies matrix, fill the valid hypotheses.
bool m_visualize_curr_node_covariance
std::map< std::pair< hypot_t *, hypot_t * >, double > hypotsp_to_consist_t
size_t m_dijkstra_node_count_thresh
Node Count lower bound before executing dijkstra.
typename GRAPH_T::constraint_t constraint_t
Handy typedefs.
void toggleMapPartitionsVisualization()
Toggle the map partitions visualization objects.
std::map< int, std::vector< uint32_t > > m_partitionID_to_prev_nodes_list
Keep track of the evaluated partitions so they are not checked again if nothing changed in them.
Edge Registration Decider Interface from which RangeScanner-based ERDs can inherit from.
std::map< mrpt::graphs::TNodeID, mrpt::obs::CObservation2DRangeScan::Ptr > nodes_to_scans2D_t
mrpt::graphslam::deciders::CRangeScanOps< GRAPH_T > range_ops_t
Typedef for accessing methods of the RangeScanRegistrationDecider_t parent class.
Column vector, like Eigen::MatrixX*, but automatically initialized to zeros since construction.
std::shared_ptr< CActionCollection > Ptr
std::shared_ptr< CObservation2DRangeScan > Ptr
std::shared_ptr< CObservation > Ptr
std::shared_ptr< CSensoryFrame > Ptr
Several implementations of ICP (Iterative closest point) algorithms for aligning two point maps or a ...
Finds partitions in metric maps based on N-cut graph partition theory.
const Scalar * const_iterator
GLenum const GLfloat * params
GLsizei const GLchar ** string
GLsizei GLsizei GLchar * source
std::string format(const char *fmt,...) MRPT_printf_format_check(1
A std::string version of C sprintf.
uint64_t TNodeID
A generic numeric type for unique IDs of nodes or entities.
This is the global namespace for all Mobile Robot Programming Toolkit (MRPT) libraries.
An edge hypothesis between two nodeIDs.
Class to monitor the evolution of a statistical quantity.
Holds the data of an information path.
Struct for passing additional parameters to the generateHypotsPool call.
std::map< mrpt::graphs::TNodeID, node_props_t > group_t
Struct for passing additional parameters to the getICPEdge call.
node_props_t to_params
Ad.
pose_t init_estim
Initial ICP estimation.
node_props_t from_params
Ad.
friend std::ostream & operator<<(std::ostream &o, const self_t ¶ms)
std::string getAsString() const
void getAsString(std::string *str) const
Struct for storing together the parameters needed for ICP matching, laser scans visualization etc.
TSlidingWindow goodness_threshold_win
Keep track of ICP Goodness values for ICP between nearby nodes and adapt the Goodness threshold based...
int prev_nodes_for_ICP
How many nodes back to check ICP against?
TSlidingWindow mahal_distance_ICP_odom_win
Keep track of the mahalanobis distance between the initial pose difference and the suggested new edge...
bool visualize_laser_scans
std::string keystroke_laser_scans
const mrpt::img::TColor laser_scans_color
see Constructor for initialization
bool use_scan_matching
Indicate whethet to use scan-matching at all during graphSLAM [on by default].
Struct for storing together the loop-closing related parameters.
bool LC_check_curr_partition_only
flag indicating whether to check only the partition of the last registered node for potential loop cl...
size_t LC_min_nodeid_diff
nodeID difference for detecting potential loop closure in a partition.
const mrpt::img::TColor balloon_std_color
int text_index_map_partitions
double LC_eigenvalues_ratio_thresh
Eigenvalues ratio for accepting/rejecting a hypothesis set.
const double balloon_radius
bool visualize_map_partitions
const mrpt::img::TColor connecting_lines_color
std::string keystroke_map_partitions
int full_partition_per_nodes
Full partition of map only afer X new nodes have been registered.
const double balloon_elevation
const mrpt::img::TColor balloon_curr_color
double offset_y_map_partitions
int LC_min_remote_nodes
how many remote nodes (large nodID difference should there be before I consider the potential loop cl...
void getAsString(std::string *str) const
The ICP algorithm return information.