class mrpt::hmtslam::CHierarchicalMapMHPartition

Represents a set of nodes and arcs, posibly only a part of the whole hierarchical, multi-hypothesis map.

A usar will never create an instance of this class, rather it will employ CHierarchicalMHMap.

See also:

CHierarchicalMHMap, CHMHMapArc, CHMHMapNode

#include <mrpt/hmtslam/CHierarchicalMapMHPartition.h>

class CHierarchicalMapMHPartition: public mrpt::system::COutputLogger
{
public:
    // typedefs

    typedef std::vector<CHMHMapNode::TNodeID> TNodeIDsList;

    // construction

    CHierarchicalMapMHPartition();

    //
methods

    const_iterator begin() const;
    iterator begin();
    const_iterator end() const;
    iterator end();
    size_t nodeCount() const;
    size_t arcCount() const;
    CHMHMapNode::Ptr getFirstNode();
    CHMHMapNode::Ptr getNodeByID(CHMHMapNode::TNodeID id);
    const CHMHMapNode::Ptr getNodeByID(CHMHMapNode::TNodeID id) const;
    CHMHMapNode::Ptr getNodeByLabel(const std::string& label, const THypothesisID& hypothesisID);
    const CHMHMapNode::Ptr getNodeByLabel(const std::string& label, const THypothesisID& hypothesisID) const;
    void saveAreasDiagramForMATLAB(const std::string& filName, const CHMHMapNode::TNodeID& idReferenceNode, const THypothesisID& hypothesisID) const;

    void saveAreasDiagramWithEllipsedForMATLAB(
        const std::string& filName,
        const CHMHMapNode::TNodeID& idReferenceNode,
        const THypothesisID& hypothesisID,
        float uncertaintyExagerationFactor = 1.0f,
        bool drawArcs = false,
        unsigned int numberOfIterationsForOptimalGlobalPoses = 4
        ) const;

    void saveGlobalMapForMATLAB(const std::string& filName, const THypothesisID& hypothesisID, const CHMHMapNode::TNodeID& idReferenceNode) const;

    void findPathBetweenNodes(
        const CHMHMapNode::TNodeID& nodeFrom,
        const CHMHMapNode::TNodeID& nodeTo,
        const THypothesisID& hypothesisID,
        TArcList& out_path,
        bool direction = false
        ) const;

    void computeCoordinatesTransformationBetweenNodes(
        const CHMHMapNode::TNodeID& nodeFrom,
        const CHMHMapNode::TNodeID& nodeTo,
        mrpt::poses::CPose3DPDFParticles& posePDF,
        const THypothesisID& hypothesisID,
        unsigned int particlesCount = 100,
        float additionalNoiseXYratio = 0.02,
        float additionalNoisePhiRad = mrpt::DEG2RAD(0.1)
        ) const;

    float computeMatchProbabilityBetweenNodes(
        const CHMHMapNode::TNodeID& nodeFrom,
        const CHMHMapNode::TNodeID& nodeTo,
        float& maxMatchProb,
        mrpt::poses::CPose3DPDFSOG& estimatedRelativePose,
        const THypothesisID& hypothesisID,
        unsigned int monteCarloSamplesPose = 300
        );

    void findArcsBetweenNodes(const CHMHMapNode::TNodeID& node1, const CHMHMapNode::TNodeID& node2, const THypothesisID& hypothesisID, TArcList& out_listArcs) const;

    void findArcsOfTypeBetweenNodes(
        const CHMHMapNode::TNodeID& node1id,
        const CHMHMapNode::TNodeID& node2id,
        const THypothesisID& hypothesisID,
        const std::string& arcType,
        TArcList& ret
        ) const;

    CHMHMapArc::Ptr findArcOfTypeBetweenNodes(
        const CHMHMapNode::TNodeID& node1id,
        const CHMHMapNode::TNodeID& node2id,
        const THypothesisID& hypothesisID,
        const std::string& arcType,
        bool& isInverted
        ) const;

    bool areNodesNeightbour(
        const CHMHMapNode::TNodeID& node1,
        const CHMHMapNode::TNodeID& node2,
        const THypothesisID& hypothesisID,
        const char* requiredAnnotation = nullptr
        ) const;

    void computeGloballyConsistentNodeCoordinates(
        std::map<CHMHMapNode::TNodeID, mrpt::poses::CPose3DPDFGaussian>& nodePoses,
        const CHMHMapNode::TNodeID& idReferenceNode,
        const THypothesisID& hypothesisID,
        const unsigned int& numberOfIterations = 2
        ) const;

    void getAs3DScene(
        mrpt::opengl::COpenGLScene& outScene,
        const CHMHMapNode::TNodeID& idReferenceNode,
        const THypothesisID& hypothesisID,
        const unsigned int& numberOfIterationsForOptimalGlobalPoses = 5,
        bool showRobotPoseIDs = true
        ) const;

    void dumpAsText(std::vector<std::string>& s) const;

    double computeOverlapProbabilityBetweenNodes(
        const CHMHMapNode::TNodeID& nodeFrom,
        const CHMHMapNode::TNodeID& nodeTo,
        const THypothesisID& hypothesisID,
        size_t monteCarloSamples = 100,
        const float margin_to_substract = 6
        ) const;
};

// direct descendants

class CHierarchicalMHMap;

Inherited Members

public:
    // structs

    struct TMsg;

Typedefs

typedef std::vector<CHMHMapNode::TNodeID> TNodeIDsList

A type that reprensents a sequence of node IDs.

Methods

const_iterator begin() const

Returns an iterator to the first node in the graph.

iterator begin()

Returns an iterator to the first node in the graph.

const_iterator end() const

Returns an iterator to the end of the list of nodes in the graph.

iterator end()

Returns an iterator to the end of the list of nodes in the graph.

size_t nodeCount() const

Returns the number of nodes in the partition:

size_t arcCount() const

Returns the number of arcs in the partition:

CHMHMapNode::Ptr getFirstNode()

Returns the first node in the graph, or nullptr if it does not exist.

Returns:

A pointer to the object. DO NOT DELETE this object, if you want to modify it in someway, first obtain a copy by invoking “CSerializable::duplicate”

CHMHMapNode::Ptr getNodeByID(CHMHMapNode::TNodeID id)

Returns the node with the given ID, or nullptr if it does not exist.

Returns:

A pointer to the object. DO NOT DELETE this object, if you want to modify it in someway, first obtain a copy by invoking “CSerializable::duplicate”

const CHMHMapNode::Ptr getNodeByID(CHMHMapNode::TNodeID id) const

Returns the node with the given ID, or nullptr if it does not exist.

Returns:

A pointer to the object. DO NOT DELETE this object, if you want to modify it in someway, first obtain a copy by invoking “CSerializable::duplicate”

CHMHMapNode::Ptr getNodeByLabel(const std::string& label, const THypothesisID& hypothesisID)

Returns the node with the given label (case insensitive) for some given hypothesis ID, or nullptr if it does not exist.

Returns:

A pointer to the object. DO NOT DELETE this object, if you want to modify it in someway, first obtain a copy by invoking “CSerializable::duplicate”

const CHMHMapNode::Ptr getNodeByLabel(const std::string& label, const THypothesisID& hypothesisID) const

Returns the node with the given label (case insensitive) for some given hypothesis ID, or nullptr if it does not exist.

Returns:

A pointer to the object. DO NOT DELETE this object, if you want to modify it in someway, first obtain a copy by invoking “CSerializable::duplicate”

void saveAreasDiagramForMATLAB(
    const std::string& filName,
    const CHMHMapNode::TNodeID& idReferenceNode,
    const THypothesisID& hypothesisID
    ) const

Returns a partition of this graph only with nodes at a given level in the hierarchy (0=ground level,1=parent level,etc)

  • The partition may be empty if no node fulfills the condition.

  • All arcs STARTING at each node from the partition will be added to the partition as well.

  • Levels in the hierarchy here stands for arcs of type “arcType_Belongs” only.

  • Coordinates are computed simply as the mean value of the first arc with an annotation “RelativePose”, added to the pose of the original node.

  • If the coordinates of any node can not be computed (no arcs,…), an exception will be raised.

See also:

CHMHMapArc Saves a MATLAB script that represents graphically the nodes with type =”Area” in this hierarchical-map(partition), using the stated node as global coordinates reference. ADDITIONAL NOTES:

void saveAreasDiagramWithEllipsedForMATLAB(
    const std::string& filName,
    const CHMHMapNode::TNodeID& idReferenceNode,
    const THypothesisID& hypothesisID,
    float uncertaintyExagerationFactor = 1.0f,
    bool drawArcs = false,
    unsigned int numberOfIterationsForOptimalGlobalPoses = 4
    ) const

Saves a MATLAB script that represents graphically the nodes with type =”Area” in this hierarchical-map(partition), using the stated node as global coordinates reference, and drawing the ellipses of the localization uncertainty for each node.

ADDITIONAL NOTES:

  • Coordinates are computed simply as the mean value of the first arc with an annotation “RelativePose”, added to the pose of the original node.

  • If the coordinates of any node can not be computed (no arcs,…), an exception will be raised.

void saveGlobalMapForMATLAB(
    const std::string& filName,
    const THypothesisID& hypothesisID,
    const CHMHMapNode::TNodeID& idReferenceNode
    ) const

Saves a MATLAB script that represents graphically the reconstructed “global map” ADDITIONAL NOTES:

  • Coordinates are computed simply as the mean value of the first arc with an annotation “RelativePose”, added to the pose of the original node.

  • If the coordinates of any node can not be computed (no arcs,…), an exception will be raised.

void findPathBetweenNodes(
    const CHMHMapNode::TNodeID& nodeFrom,
    const CHMHMapNode::TNodeID& nodeTo,
    const THypothesisID& hypothesisID,
    TArcList& out_path,
    bool direction = false
    ) const

The Dijkstra algorithm for finding the shortest path between a pair of nodes.

Returns:

The sequence of arcs connecting the nodes.It will be empty if no path is found or when the starting and ending node coincide.

void computeCoordinatesTransformationBetweenNodes(
    const CHMHMapNode::TNodeID& nodeFrom,
    const CHMHMapNode::TNodeID& nodeTo,
    mrpt::poses::CPose3DPDFParticles& posePDF,
    const THypothesisID& hypothesisID,
    unsigned int particlesCount = 100,
    float additionalNoiseXYratio = 0.02,
    float additionalNoisePhiRad = mrpt::DEG2RAD(0.1)
    ) const

Draw a number of samples according to the PDF of the coordinates transformation between a pair of “Area“‘s nodes.

Parameters:

std::exception

If there is not enough information in arcs to compute the PDF

See also:

computeGloballyConsistentNodeCoordinates

float computeMatchProbabilityBetweenNodes(
    const CHMHMapNode::TNodeID& nodeFrom,
    const CHMHMapNode::TNodeID& nodeTo,
    float& maxMatchProb,
    mrpt::poses::CPose3DPDFSOG& estimatedRelativePose,
    const THypothesisID& hypothesisID,
    unsigned int monteCarloSamplesPose = 300
    )

Computes the probability [0,1] of two areas’ gridmaps to “match” (loop closure), according to the grid maps and pose uncertainty from information in arcs (uses a Monte Carlo aproximation) If there is not enough information or a robust estimation cannot be found, there will not be particles in “estimatedRelativePose”.

void findArcsBetweenNodes(
    const CHMHMapNode::TNodeID& node1,
    const CHMHMapNode::TNodeID& node2,
    const THypothesisID& hypothesisID,
    TArcList& out_listArcs
    ) const

Returns all the arcs between a pair of nodes:

void findArcsOfTypeBetweenNodes(
    const CHMHMapNode::TNodeID& node1id,
    const CHMHMapNode::TNodeID& node2id,
    const THypothesisID& hypothesisID,
    const std::string& arcType,
    TArcList& ret
    ) const

Returns the arcs between a pair of nodes of a given type.

CHMHMapArc::Ptr findArcOfTypeBetweenNodes(
    const CHMHMapNode::TNodeID& node1id,
    const CHMHMapNode::TNodeID& node2id,
    const THypothesisID& hypothesisID,
    const std::string& arcType,
    bool& isInverted
    ) const

Returns the first arc between a pair of nodes of a given type, and if it is in the opposite direction.

Returns:

The arc, or nullptr if not found.

bool areNodesNeightbour(
    const CHMHMapNode::TNodeID& node1,
    const CHMHMapNode::TNodeID& node2,
    const THypothesisID& hypothesisID,
    const char* requiredAnnotation = nullptr
    ) const

Returns whether two nodes are “neightbour”, i.e.

have a direct arc between them

void computeGloballyConsistentNodeCoordinates(
    std::map<CHMHMapNode::TNodeID, mrpt::poses::CPose3DPDFGaussian>& nodePoses,
    const CHMHMapNode::TNodeID& idReferenceNode,
    const THypothesisID& hypothesisID,
    const unsigned int& numberOfIterations = 2
    ) const

This methods implements a Lu&Milios-like globally optimal estimation for the global coordinates of all the nodes in the graph according to all available arcs with relative pose information.

Global coordinates will be computed relative to the node “idReferenceNode”.

Parameters:

std::exception

If there is any node without a pose arc, invalid (non invertible) matrixes, etc…

See also:

computeCoordinatesTransformationBetweenNodes

void getAs3DScene(
    mrpt::opengl::COpenGLScene& outScene,
    const CHMHMapNode::TNodeID& idReferenceNode,
    const THypothesisID& hypothesisID,
    const unsigned int& numberOfIterationsForOptimalGlobalPoses = 5,
    bool showRobotPoseIDs = true
    ) const

Returns a 3D scene reconstruction of the hierarchical map.

See “computeGloballyConsistentNodeCoordinates” for the meaning of “numberOfIterationsForOptimalGlobalPoses”

void dumpAsText(std::vector<std::string>& s) const

Return a textual description of the whole graph.

double computeOverlapProbabilityBetweenNodes(
    const CHMHMapNode::TNodeID& nodeFrom,
    const CHMHMapNode::TNodeID& nodeTo,
    const THypothesisID& hypothesisID,
    size_t monteCarloSamples = 100,
    const float margin_to_substract = 6
    ) const

Computes the probability [0,1] of two areas’ gridmaps to overlap, via a Monte Carlo aproximation.

Parameters:

std::exception

If there is not enough information in arcs, etc…

margin_to_substract

In meters, the area of each gridmap is “eroded” this amount to compensate the area in excess usually found in gridmaps.