Files
rtabmap/api/latest/namespacertabmap_1_1graph.html
T

2230 lines
137 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!-- HTML header for doxygen 1.9.8-->
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=11"/>
<meta name="generator" content="Doxygen 1.9.8"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>RTAB-Map: rtabmap::graph Namespace Reference</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="resize.js"></script>
<script type="text/javascript" src="navtreedata.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
<link href="doxygen-awesome.css" rel="stylesheet" type="text/css"/>
<link href="custom.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript">window.RTABMAP_DOC_ROOT="";</script>
<script type="text/javascript" src="../versions.js"></script>
<script type="text/javascript" src="version-switcher.js"></script>
<script type="text/javascript" src="doxygen-awesome-darkmode-toggle.js"></script>
<script type="text/javascript">DoxygenAwesomeDarkModeToggle.init();</script>
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr id="projectrow">
<td id="projectalign">
<div id="projectname">RTAB-Map<span id="projectnumber">&#160;0.23.12</span>
</div>
<div id="projectbrief">Real-Time Appearance-Based Mapping</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.9.8 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
var searchBox = new SearchBox("searchBox", "search/",'.html');
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
$(function() {
initMenu('',true,false,'search.php','Search');
$(document).ready(function() { init_search(); });
});
/* @license-end */
</script>
<div id="main-nav"></div>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
<div id="nav-tree">
<div id="nav-tree-contents">
<div id="nav-sync" class="sync"></div>
</div>
</div>
<div id="splitbar" style="-moz-user-select:none;"
class="ui-resizable-handle">
</div>
</div>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
$(document).ready(function(){initNavTree('namespacertabmap_1_1graph.html',''); initResizable(); });
/* @license-end */
</script>
<div id="doc-content">
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<div id="MSearchResults">
<div class="SRPage">
<div id="SRIndex">
<div id="SRResults"></div>
<div class="SRStatus" id="Loading">Loading...</div>
<div class="SRStatus" id="Searching">Searching...</div>
<div class="SRStatus" id="NoMatches">No Matches</div>
</div>
</div>
</div>
</div>
<div class="header">
<div class="summary">
<a href="#nested-classes">Classes</a> &#124;
<a href="#func-members">Functions</a> </div>
<div class="headertitle"><div class="title">rtabmap::graph Namespace Reference</div></div>
</div><!--header-->
<div class="contents">
<p>Pose-graph I/O, trajectory metrics, link utilities, and path planning.
<a href="namespacertabmap_1_1graph.html#details">More...</a></p>
<table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="nested-classes" name="nested-classes"></a>
Classes</h2></td></tr>
<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structrtabmap_1_1graph_1_1MaxGraphErrors.html">MaxGraphErrors</a></td></tr>
<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Largest pose-graph constraint violations after optimization. <a href="structrtabmap_1_1graph_1_1MaxGraphErrors.html#details">More...</a><br /></td></tr>
<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table><table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="func-members" name="func-members"></a>
Functions</h2></td></tr>
<tr class="memitem:af5622dec3112ea0b5154056bde132d46" id="r_af5622dec3112ea0b5154056bde132d46"><td class="memItemLeft" align="right" valign="top">bool RTABMAP_CORE_EXPORT&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacertabmap_1_1graph.html#af5622dec3112ea0b5154056bde132d46">exportPoses</a> (const std::string &amp;filePath, int format, const std::map&lt; int, <a class="el" href="classrtabmap_1_1Transform.html">Transform</a> &gt; &amp;poses, const std::multimap&lt; int, <a class="el" href="classrtabmap_1_1Link.html">Link</a> &gt; &amp;constraints=std::multimap&lt; int, <a class="el" href="classrtabmap_1_1Link.html">Link</a> &gt;(), const std::map&lt; int, double &gt; &amp;stamps=std::map&lt; int, double &gt;(), const <a class="el" href="namespacertabmap.html#ad08b6f1796a27dd7316c99c385e2cc55">ParametersMap</a> &amp;parameters=<a class="el" href="namespacertabmap.html#ad08b6f1796a27dd7316c99c385e2cc55">ParametersMap</a>())</td></tr>
<tr class="memdesc:af5622dec3112ea0b5154056bde132d46"><td class="mdescLeft">&#160;</td><td class="mdescRight">Writes poses (and optional constraints) to disk. <br /></td></tr>
<tr class="separator:af5622dec3112ea0b5154056bde132d46"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a5c0eb890db7dba1c353d57595ccbdc6e" id="r_a5c0eb890db7dba1c353d57595ccbdc6e"><td class="memItemLeft" align="right" valign="top">bool RTABMAP_CORE_EXPORT&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacertabmap_1_1graph.html#a5c0eb890db7dba1c353d57595ccbdc6e">importPoses</a> (const std::string &amp;filePath, int format, std::map&lt; int, <a class="el" href="classrtabmap_1_1Transform.html">Transform</a> &gt; &amp;poses, std::multimap&lt; int, <a class="el" href="classrtabmap_1_1Link.html">Link</a> &gt; *constraints=0, std::map&lt; int, double &gt; *stamps=0)</td></tr>
<tr class="memdesc:a5c0eb890db7dba1c353d57595ccbdc6e"><td class="mdescLeft">&#160;</td><td class="mdescRight">Loads poses (and optional constraints) from disk. <br /></td></tr>
<tr class="separator:a5c0eb890db7dba1c353d57595ccbdc6e"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a96a6c2e8348e3d9cfd8b1770d17da9b2" id="r_a96a6c2e8348e3d9cfd8b1770d17da9b2"><td class="memItemLeft" align="right" valign="top">bool RTABMAP_CORE_EXPORT&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacertabmap_1_1graph.html#a96a6c2e8348e3d9cfd8b1770d17da9b2">exportGPS</a> (const std::string &amp;filePath, const std::map&lt; int, <a class="el" href="classrtabmap_1_1GPS.html">GPS</a> &gt; &amp;gpsValues, unsigned int rgba=0xFFFFFFFF)</td></tr>
<tr class="memdesc:a96a6c2e8348e3d9cfd8b1770d17da9b2"><td class="mdescLeft">&#160;</td><td class="mdescRight">Exports <a class="el" href="classrtabmap_1_1GPS.html" title="WGS84 GPS fix attached to a sensor sample or graph node.">GPS</a> samples to a PLY point cloud. <br /></td></tr>
<tr class="separator:a96a6c2e8348e3d9cfd8b1770d17da9b2"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a3c9effdb0d7c235dc1b8d7e3f8487c67" id="r_a3c9effdb0d7c235dc1b8d7e3f8487c67"><td class="memItemLeft" align="right" valign="top">void RTABMAP_CORE_EXPORT&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacertabmap_1_1graph.html#a3c9effdb0d7c235dc1b8d7e3f8487c67">calcKittiSequenceErrors</a> (const std::vector&lt; <a class="el" href="classrtabmap_1_1Transform.html">Transform</a> &gt; &amp;poses_gt, const std::vector&lt; <a class="el" href="classrtabmap_1_1Transform.html">Transform</a> &gt; &amp;poses_result, float &amp;t_err, float &amp;r_err)</td></tr>
<tr class="memdesc:a3c9effdb0d7c235dc1b8d7e3f8487c67"><td class="mdescLeft">&#160;</td><td class="mdescRight">KITTI odometry benchmark error over fixed trajectory segments. <br /></td></tr>
<tr class="separator:a3c9effdb0d7c235dc1b8d7e3f8487c67"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a83c41a7cdd595ae6f76d3f1c5140c215" id="r_a83c41a7cdd595ae6f76d3f1c5140c215"><td class="memItemLeft" align="right" valign="top">void RTABMAP_CORE_EXPORT&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacertabmap_1_1graph.html#a83c41a7cdd595ae6f76d3f1c5140c215">calcRelativeErrors</a> (const std::vector&lt; <a class="el" href="classrtabmap_1_1Transform.html">Transform</a> &gt; &amp;poses_gt, const std::vector&lt; <a class="el" href="classrtabmap_1_1Transform.html">Transform</a> &gt; &amp;poses_result, float &amp;t_err, float &amp;r_err)</td></tr>
<tr class="memdesc:a83c41a7cdd595ae6f76d3f1c5140c215"><td class="mdescLeft">&#160;</td><td class="mdescRight">Mean frame-to-frame relative pose error (RPE-style, one step). <br /></td></tr>
<tr class="separator:a83c41a7cdd595ae6f76d3f1c5140c215"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a5c36e32a4acd10ac3cdbbf7d73591f88" id="r_a5c36e32a4acd10ac3cdbbf7d73591f88"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classrtabmap_1_1Transform.html">Transform</a> RTABMAP_CORE_EXPORT&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacertabmap_1_1graph.html#a5c36e32a4acd10ac3cdbbf7d73591f88">calcRMSE</a> (const std::map&lt; int, <a class="el" href="classrtabmap_1_1Transform.html">Transform</a> &gt; &amp;groundTruth, const std::map&lt; int, <a class="el" href="classrtabmap_1_1Transform.html">Transform</a> &gt; &amp;poses, float &amp;translational_rmse, float &amp;translational_mean, float &amp;translational_median, float &amp;translational_std, float &amp;translational_min, float &amp;translational_max, float &amp;rotational_rmse, float &amp;rotational_mean, float &amp;rotational_median, float &amp;rotational_std, float &amp;rotational_min, float &amp;rotational_max, bool align2D=false)</td></tr>
<tr class="memdesc:a5c36e32a4acd10ac3cdbbf7d73591f88"><td class="mdescLeft">&#160;</td><td class="mdescRight">Absolute trajectory error (ATE) with Sim(3)-style alignment (TUM RGB-D tool). <br /></td></tr>
<tr class="separator:a5c36e32a4acd10ac3cdbbf7d73591f88"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a4691b760dfafe6d93de514c96fa55e0e" id="r_a4691b760dfafe6d93de514c96fa55e0e"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structrtabmap_1_1graph_1_1MaxGraphErrors.html">MaxGraphErrors</a> RTABMAP_CORE_EXPORT&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacertabmap_1_1graph.html#a4691b760dfafe6d93de514c96fa55e0e">computeMaxGraphErrors</a> (const std::map&lt; int, <a class="el" href="classrtabmap_1_1Transform.html">Transform</a> &gt; &amp;poses, const std::multimap&lt; int, <a class="el" href="classrtabmap_1_1Link.html">Link</a> &gt; &amp;links, bool for3DoF=false)</td></tr>
<tr class="memdesc:a4691b760dfafe6d93de514c96fa55e0e"><td class="mdescLeft">&#160;</td><td class="mdescRight">Finds the worst pose-graph constraint residuals after optimization. <br /></td></tr>
<tr class="separator:a4691b760dfafe6d93de514c96fa55e0e"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a6c009c4c819abe37ec2ca6d041edd92b" id="r_a6c009c4c819abe37ec2ca6d041edd92b"><td class="memItemLeft" align="right" valign="top">std::vector&lt; double &gt; RTABMAP_CORE_EXPORT&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacertabmap_1_1graph.html#a6c009c4c819abe37ec2ca6d041edd92b">getMaxOdomInf</a> (const std::multimap&lt; int, <a class="el" href="classrtabmap_1_1Link.html">Link</a> &gt; &amp;links)</td></tr>
<tr class="memdesc:a6c009c4c819abe37ec2ca6d041edd92b"><td class="mdescLeft">&#160;</td><td class="mdescRight">Maximum information-matrix diagonal over odometry neighbor links. <br /></td></tr>
<tr class="separator:a6c009c4c819abe37ec2ca6d041edd92b"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:aaa0b06795dea514ad1d5fdd4626d32ec" id="r_aaa0b06795dea514ad1d5fdd4626d32ec"><td class="memItemLeft" align="right" valign="top">std::multimap&lt; int, <a class="el" href="classrtabmap_1_1Link.html">Link</a> &gt;::iterator RTABMAP_CORE_EXPORT&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacertabmap_1_1graph.html#aaa0b06795dea514ad1d5fdd4626d32ec">findLink</a> (std::multimap&lt; int, <a class="el" href="classrtabmap_1_1Link.html">Link</a> &gt; &amp;links, int from, int to, bool checkBothWays=true, <a class="el" href="classrtabmap_1_1Link.html#a925bb7ca93eb95a3a873b0a9e8d5e91e">Link::Type</a> type=<a class="el" href="classrtabmap_1_1Link.html#a925bb7ca93eb95a3a873b0a9e8d5e91ea8a720d632258ba1b468af0319ae8e7d4">Link::kUndef</a>)</td></tr>
<tr class="memdesc:aaa0b06795dea514ad1d5fdd4626d32ec"><td class="mdescLeft">&#160;</td><td class="mdescRight">Finds the first link from <code>from</code> to <code>to</code> in a multimap keyed by source id. <br /></td></tr>
<tr class="separator:aaa0b06795dea514ad1d5fdd4626d32ec"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ad91079c9cdd934c8ba8927d3c52b40e5" id="r_ad91079c9cdd934c8ba8927d3c52b40e5"><td class="memItemLeft" align="right" valign="top">std::multimap&lt; int, std::pair&lt; int, <a class="el" href="classrtabmap_1_1Link.html#a925bb7ca93eb95a3a873b0a9e8d5e91e">Link::Type</a> &gt; &gt;::iterator RTABMAP_CORE_EXPORT&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacertabmap_1_1graph.html#ad91079c9cdd934c8ba8927d3c52b40e5">findLink</a> (std::multimap&lt; int, std::pair&lt; int, <a class="el" href="classrtabmap_1_1Link.html#a925bb7ca93eb95a3a873b0a9e8d5e91e">Link::Type</a> &gt; &gt; &amp;links, int from, int to, bool checkBothWays=true, <a class="el" href="classrtabmap_1_1Link.html#a925bb7ca93eb95a3a873b0a9e8d5e91e">Link::Type</a> type=<a class="el" href="classrtabmap_1_1Link.html#a925bb7ca93eb95a3a873b0a9e8d5e91ea8a720d632258ba1b468af0319ae8e7d4">Link::kUndef</a>)</td></tr>
<tr class="separator:ad91079c9cdd934c8ba8927d3c52b40e5"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a06ed3112247c13dcf494665c1d9df327" id="r_a06ed3112247c13dcf494665c1d9df327"><td class="memItemLeft" align="right" valign="top">std::multimap&lt; int, int &gt;::iterator RTABMAP_CORE_EXPORT&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacertabmap_1_1graph.html#a06ed3112247c13dcf494665c1d9df327">findLink</a> (std::multimap&lt; int, int &gt; &amp;links, int from, int to, bool checkBothWays=true)</td></tr>
<tr class="separator:a06ed3112247c13dcf494665c1d9df327"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a7695c60c6bb375057586449674d42eea" id="r_a7695c60c6bb375057586449674d42eea"><td class="memItemLeft" align="right" valign="top">std::multimap&lt; int, <a class="el" href="classrtabmap_1_1Link.html">Link</a> &gt;::const_iterator RTABMAP_CORE_EXPORT&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacertabmap_1_1graph.html#a7695c60c6bb375057586449674d42eea">findLink</a> (const std::multimap&lt; int, <a class="el" href="classrtabmap_1_1Link.html">Link</a> &gt; &amp;links, int from, int to, bool checkBothWays=true, <a class="el" href="classrtabmap_1_1Link.html#a925bb7ca93eb95a3a873b0a9e8d5e91e">Link::Type</a> type=<a class="el" href="classrtabmap_1_1Link.html#a925bb7ca93eb95a3a873b0a9e8d5e91ea8a720d632258ba1b468af0319ae8e7d4">Link::kUndef</a>)</td></tr>
<tr class="separator:a7695c60c6bb375057586449674d42eea"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a8200ae3a6bd27ee2cee4b71d85ace3e9" id="r_a8200ae3a6bd27ee2cee4b71d85ace3e9"><td class="memItemLeft" align="right" valign="top">std::multimap&lt; int, std::pair&lt; int, <a class="el" href="classrtabmap_1_1Link.html#a925bb7ca93eb95a3a873b0a9e8d5e91e">Link::Type</a> &gt; &gt;::const_iterator RTABMAP_CORE_EXPORT&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacertabmap_1_1graph.html#a8200ae3a6bd27ee2cee4b71d85ace3e9">findLink</a> (const std::multimap&lt; int, std::pair&lt; int, <a class="el" href="classrtabmap_1_1Link.html#a925bb7ca93eb95a3a873b0a9e8d5e91e">Link::Type</a> &gt; &gt; &amp;links, int from, int to, bool checkBothWays=true, <a class="el" href="classrtabmap_1_1Link.html#a925bb7ca93eb95a3a873b0a9e8d5e91e">Link::Type</a> type=<a class="el" href="classrtabmap_1_1Link.html#a925bb7ca93eb95a3a873b0a9e8d5e91ea8a720d632258ba1b468af0319ae8e7d4">Link::kUndef</a>)</td></tr>
<tr class="separator:a8200ae3a6bd27ee2cee4b71d85ace3e9"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:aecdcc01682092f4c89257d070aa2a437" id="r_aecdcc01682092f4c89257d070aa2a437"><td class="memItemLeft" align="right" valign="top">std::multimap&lt; int, int &gt;::const_iterator RTABMAP_CORE_EXPORT&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacertabmap_1_1graph.html#aecdcc01682092f4c89257d070aa2a437">findLink</a> (const std::multimap&lt; int, int &gt; &amp;links, int from, int to, bool checkBothWays=true)</td></tr>
<tr class="separator:aecdcc01682092f4c89257d070aa2a437"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a308c9331cd3dd36a776517e64b33bd82" id="r_a308c9331cd3dd36a776517e64b33bd82"><td class="memItemLeft" align="right" valign="top">std::list&lt; <a class="el" href="classrtabmap_1_1Link.html">Link</a> &gt; RTABMAP_CORE_EXPORT&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacertabmap_1_1graph.html#a308c9331cd3dd36a776517e64b33bd82">findLinks</a> (const std::multimap&lt; int, <a class="el" href="classrtabmap_1_1Link.html">Link</a> &gt; &amp;links, int from)</td></tr>
<tr class="memdesc:a308c9331cd3dd36a776517e64b33bd82"><td class="mdescLeft">&#160;</td><td class="mdescRight">Lists all links incident on node <code>from</code>. <br /></td></tr>
<tr class="separator:a308c9331cd3dd36a776517e64b33bd82"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a5d11e3cccfeca97d570c528858863dd2" id="r_a5d11e3cccfeca97d570c528858863dd2"><td class="memItemLeft" align="right" valign="top">std::multimap&lt; int, <a class="el" href="classrtabmap_1_1Link.html">Link</a> &gt; RTABMAP_CORE_EXPORT&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacertabmap_1_1graph.html#a5d11e3cccfeca97d570c528858863dd2">filterDuplicateLinks</a> (const std::multimap&lt; int, <a class="el" href="classrtabmap_1_1Link.html">Link</a> &gt; &amp;links)</td></tr>
<tr class="memdesc:a5d11e3cccfeca97d570c528858863dd2"><td class="mdescLeft">&#160;</td><td class="mdescRight">Removes duplicate undirected links. <br /></td></tr>
<tr class="separator:a5d11e3cccfeca97d570c528858863dd2"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a592918d54b32d6f13236de85958da300" id="r_a592918d54b32d6f13236de85958da300"><td class="memItemLeft" align="right" valign="top">std::multimap&lt; int, <a class="el" href="classrtabmap_1_1Link.html">Link</a> &gt; RTABMAP_CORE_EXPORT&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacertabmap_1_1graph.html#a592918d54b32d6f13236de85958da300">filterLinks</a> (const std::multimap&lt; int, <a class="el" href="classrtabmap_1_1Link.html">Link</a> &gt; &amp;links, <a class="el" href="classrtabmap_1_1Link.html#a925bb7ca93eb95a3a873b0a9e8d5e91e">Link::Type</a> filteredType, bool inverted=false)</td></tr>
<tr class="memdesc:a592918d54b32d6f13236de85958da300"><td class="mdescLeft">&#160;</td><td class="mdescRight">Filters links by type or self-reference. <br /></td></tr>
<tr class="separator:a592918d54b32d6f13236de85958da300"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:af4dffb2a3eced519378d18bca8fa4419" id="r_af4dffb2a3eced519378d18bca8fa4419"><td class="memItemLeft" align="right" valign="top">std::map&lt; int, <a class="el" href="classrtabmap_1_1Link.html">Link</a> &gt; RTABMAP_CORE_EXPORT&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacertabmap_1_1graph.html#af4dffb2a3eced519378d18bca8fa4419">filterLinks</a> (const std::map&lt; int, <a class="el" href="classrtabmap_1_1Link.html">Link</a> &gt; &amp;links, <a class="el" href="classrtabmap_1_1Link.html#a925bb7ca93eb95a3a873b0a9e8d5e91e">Link::Type</a> filteredType, bool inverted=false)</td></tr>
<tr class="separator:af4dffb2a3eced519378d18bca8fa4419"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a8213a5876c86611ee4c832981eb1e7de" id="r_a8213a5876c86611ee4c832981eb1e7de"><td class="memItemLeft" align="right" valign="top">std::map&lt; int, <a class="el" href="classrtabmap_1_1Transform.html">Transform</a> &gt; RTABMAP_CORE_EXPORT&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacertabmap_1_1graph.html#a8213a5876c86611ee4c832981eb1e7de">frustumPosesFiltering</a> (const std::map&lt; int, <a class="el" href="classrtabmap_1_1Transform.html">Transform</a> &gt; &amp;poses, const <a class="el" href="classrtabmap_1_1Transform.html">Transform</a> &amp;cameraPose, float horizontalFOV=45.0f, float verticalFOV=45.0f, float nearClipPlaneDistance=0.1f, float farClipPlaneDistance=100.0f, bool negative=false)</td></tr>
<tr class="memdesc:a8213a5876c86611ee4c832981eb1e7de"><td class="mdescLeft">&#160;</td><td class="mdescRight">Keeps poses inside (or outside) a camera frustum. <br /></td></tr>
<tr class="separator:a8213a5876c86611ee4c832981eb1e7de"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a1906b8b4ad4b7ffc955d22c4996b1506" id="r_a1906b8b4ad4b7ffc955d22c4996b1506"><td class="memItemLeft" align="right" valign="top">std::map&lt; int, <a class="el" href="classrtabmap_1_1Transform.html">Transform</a> &gt; RTABMAP_CORE_EXPORT&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacertabmap_1_1graph.html#a1906b8b4ad4b7ffc955d22c4996b1506">radiusPosesFiltering</a> (const std::map&lt; int, <a class="el" href="classrtabmap_1_1Transform.html">Transform</a> &gt; &amp;poses, float radius, float angle, bool keepLatest=true)</td></tr>
<tr class="memdesc:a1906b8b4ad4b7ffc955d22c4996b1506"><td class="mdescLeft">&#160;</td><td class="mdescRight">Subsamples poses that are spatially (and optionally angularly) redundant. <br /></td></tr>
<tr class="separator:a1906b8b4ad4b7ffc955d22c4996b1506"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:acaf3e4ffcfc830747c3c3cb02a8ea155" id="r_acaf3e4ffcfc830747c3c3cb02a8ea155"><td class="memItemLeft" align="right" valign="top">std::multimap&lt; int, int &gt; RTABMAP_CORE_EXPORT&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacertabmap_1_1graph.html#acaf3e4ffcfc830747c3c3cb02a8ea155">radiusPosesClustering</a> (const std::map&lt; int, <a class="el" href="classrtabmap_1_1Transform.html">Transform</a> &gt; &amp;poses, float radius, float angle)</td></tr>
<tr class="memdesc:acaf3e4ffcfc830747c3c3cb02a8ea155"><td class="mdescLeft">&#160;</td><td class="mdescRight">Radius-neighbor clustering of poses. <br /></td></tr>
<tr class="separator:acaf3e4ffcfc830747c3c3cb02a8ea155"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:aabda884597e6b8df053d04ee56cfaf6f" id="r_aabda884597e6b8df053d04ee56cfaf6f"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacertabmap_1_1graph.html#aabda884597e6b8df053d04ee56cfaf6f">reduceGraph</a> (const std::map&lt; int, <a class="el" href="classrtabmap_1_1Transform.html">Transform</a> &gt; &amp;poses, const std::multimap&lt; int, <a class="el" href="classrtabmap_1_1Link.html">Link</a> &gt; &amp;links, std::multimap&lt; int, int &gt; &amp;hyperNodes, std::multimap&lt; int, <a class="el" href="classrtabmap_1_1Link.html">Link</a> &gt; &amp;hyperLinks)</td></tr>
<tr class="memdesc:aabda884597e6b8df053d04ee56cfaf6f"><td class="mdescLeft">&#160;</td><td class="mdescRight">Reduces a pose graph into hyper-nodes and hyper-links. <br /></td></tr>
<tr class="separator:aabda884597e6b8df053d04ee56cfaf6f"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a5ec6c3883f73181d9458c5905c0aa0ea" id="r_a5ec6c3883f73181d9458c5905c0aa0ea"><td class="memItemLeft" align="right" valign="top">std::list&lt; std::pair&lt; int, <a class="el" href="classrtabmap_1_1Transform.html">Transform</a> &gt; &gt; RTABMAP_CORE_EXPORT&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacertabmap_1_1graph.html#a5ec6c3883f73181d9458c5905c0aa0ea">computePath</a> (const std::map&lt; int, <a class="el" href="classrtabmap_1_1Transform.html">rtabmap::Transform</a> &gt; &amp;poses, const std::multimap&lt; int, int &gt; &amp;links, int from, int to, bool updateNewCosts=false)</td></tr>
<tr class="memdesc:a5ec6c3883f73181d9458c5905c0aa0ea"><td class="mdescLeft">&#160;</td><td class="mdescRight">A* shortest path on a pose graph with Euclidean edge costs. <br /></td></tr>
<tr class="separator:a5ec6c3883f73181d9458c5905c0aa0ea"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a8acc34fed4cb4e452e8e14d05dafc578" id="r_a8acc34fed4cb4e452e8e14d05dafc578"><td class="memItemLeft" align="right" valign="top">std::map&lt; int, int &gt; RTABMAP_CORE_EXPORT&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacertabmap_1_1graph.html#a8acc34fed4cb4e452e8e14d05dafc578">computePathDepths</a> (const std::multimap&lt; int, int &gt; &amp;links, int from, int maxDepth=0)</td></tr>
<tr class="memdesc:a8acc34fed4cb4e452e8e14d05dafc578"><td class="mdescLeft">&#160;</td><td class="mdescRight">Single-source graph depth via BFS. <br /></td></tr>
<tr class="separator:a8acc34fed4cb4e452e8e14d05dafc578"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ae21d02d613df461d6163f9d9a3db7ad2" id="r_ae21d02d613df461d6163f9d9a3db7ad2"><td class="memItemLeft" align="right" valign="top">std::list&lt; int &gt; RTABMAP_CORE_EXPORT&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacertabmap_1_1graph.html#ae21d02d613df461d6163f9d9a3db7ad2">computePath</a> (const std::multimap&lt; int, <a class="el" href="classrtabmap_1_1Link.html">Link</a> &gt; &amp;links, int from, int to, bool updateNewCosts=false, bool useSameCostForAllLinks=false)</td></tr>
<tr class="memdesc:ae21d02d613df461d6163f9d9a3db7ad2"><td class="mdescLeft">&#160;</td><td class="mdescRight">Dijkstra shortest path on link constraints. <br /></td></tr>
<tr class="separator:ae21d02d613df461d6163f9d9a3db7ad2"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a1ec6b9506985624f31fb2091219cb142" id="r_a1ec6b9506985624f31fb2091219cb142"><td class="memItemLeft" align="right" valign="top">std::list&lt; std::pair&lt; int, <a class="el" href="classrtabmap_1_1Transform.html">Transform</a> &gt; &gt; RTABMAP_CORE_EXPORT&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacertabmap_1_1graph.html#a1ec6b9506985624f31fb2091219cb142">computePath</a> (int fromId, int toId, const <a class="el" href="classrtabmap_1_1Memory.html">Memory</a> *memory, bool lookInDatabase=true, bool updateNewCosts=false, float linearVelocity=0.0f, float angularVelocity=0.0f, bool ignoreDirectLinks=false)</td></tr>
<tr class="memdesc:a1ec6b9506985624f31fb2091219cb142"><td class="mdescLeft">&#160;</td><td class="mdescRight">Dijkstra path through the live <a class="el" href="classrtabmap_1_1Memory.html">Memory</a> pose graph. <br /></td></tr>
<tr class="separator:a1ec6b9506985624f31fb2091219cb142"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a3d6e74a018b07cd52151e3e168f6384c" id="r_a3d6e74a018b07cd52151e3e168f6384c"><td class="memItemLeft" align="right" valign="top">int RTABMAP_CORE_EXPORT&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacertabmap_1_1graph.html#a3d6e74a018b07cd52151e3e168f6384c">findNearestNode</a> (const std::map&lt; int, <a class="el" href="classrtabmap_1_1Transform.html">rtabmap::Transform</a> &gt; &amp;poses, const <a class="el" href="classrtabmap_1_1Transform.html">rtabmap::Transform</a> &amp;targetPose, float *distance=0)</td></tr>
<tr class="memdesc:a3d6e74a018b07cd52151e3e168f6384c"><td class="mdescLeft">&#160;</td><td class="mdescRight">Id of the nearest pose to <code>targetPose</code>. <br /></td></tr>
<tr class="separator:a3d6e74a018b07cd52151e3e168f6384c"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a92dfe14b22f897e11bf5bf3f7a7c9157" id="r_a92dfe14b22f897e11bf5bf3f7a7c9157"><td class="memItemLeft" align="right" valign="top">std::map&lt; int, float &gt; RTABMAP_CORE_EXPORT&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacertabmap_1_1graph.html#a92dfe14b22f897e11bf5bf3f7a7c9157">findNearestNodes</a> (int nodeId, const std::map&lt; int, <a class="el" href="classrtabmap_1_1Transform.html">Transform</a> &gt; &amp;poses, float radius, float angle=0.0f, int k=0)</td></tr>
<tr class="memdesc:a92dfe14b22f897e11bf5bf3f7a7c9157"><td class="mdescLeft">&#160;</td><td class="mdescRight">Spatial neighbors of a node (KD-tree radius or k-NN search). <br /></td></tr>
<tr class="separator:a92dfe14b22f897e11bf5bf3f7a7c9157"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a70a5f4b17aa3bb54cad151c9f290ff7f" id="r_a70a5f4b17aa3bb54cad151c9f290ff7f"><td class="memItemLeft" align="right" valign="top">std::map&lt; int, float &gt; RTABMAP_CORE_EXPORT&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacertabmap_1_1graph.html#a70a5f4b17aa3bb54cad151c9f290ff7f">findNearestNodes</a> (const <a class="el" href="classrtabmap_1_1Transform.html">Transform</a> &amp;targetPose, const std::map&lt; int, <a class="el" href="classrtabmap_1_1Transform.html">Transform</a> &gt; &amp;poses, float radius, float angle=0.0f, int k=0)</td></tr>
<tr class="memdesc:a70a5f4b17aa3bb54cad151c9f290ff7f"><td class="mdescLeft">&#160;</td><td class="mdescRight">Spatial neighbors of a pose (KD-tree radius or k-NN search). <br /></td></tr>
<tr class="separator:a70a5f4b17aa3bb54cad151c9f290ff7f"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a8cd823f440a4512407ef78d76ff1dbbf" id="r_a8cd823f440a4512407ef78d76ff1dbbf"><td class="memItemLeft" align="right" valign="top"><a id="a8cd823f440a4512407ef78d76ff1dbbf" name="a8cd823f440a4512407ef78d76ff1dbbf"></a>
std::map&lt; int, <a class="el" href="classrtabmap_1_1Transform.html">Transform</a> &gt; RTABMAP_CORE_EXPORT&#160;</td><td class="memItemRight" valign="bottom"><b>findNearestPoses</b> (int nodeId, const std::map&lt; int, <a class="el" href="classrtabmap_1_1Transform.html">Transform</a> &gt; &amp;poses, float radius, float angle=0.0f, int k=0)</td></tr>
<tr class="memdesc:a8cd823f440a4512407ef78d76ff1dbbf"><td class="mdescLeft">&#160;</td><td class="mdescRight">Like <a class="el" href="namespacertabmap_1_1graph.html#a92dfe14b22f897e11bf5bf3f7a7c9157">findNearestNodes(int,const std::map&lt;int,Transform&gt;&amp;,float,float,int)</a> but returns full <a class="el" href="classrtabmap_1_1Transform.html">Transform</a> values. <br /></td></tr>
<tr class="separator:a8cd823f440a4512407ef78d76ff1dbbf"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a236de727a38e51699fe73ff61b459d95" id="r_a236de727a38e51699fe73ff61b459d95"><td class="memItemLeft" align="right" valign="top">std::map&lt; int, <a class="el" href="classrtabmap_1_1Transform.html">Transform</a> &gt; RTABMAP_CORE_EXPORT&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacertabmap_1_1graph.html#a236de727a38e51699fe73ff61b459d95">findNearestPoses</a> (const <a class="el" href="classrtabmap_1_1Transform.html">Transform</a> &amp;targetPose, const std::map&lt; int, <a class="el" href="classrtabmap_1_1Transform.html">Transform</a> &gt; &amp;poses, float radius, float angle=0.0f, int k=0)</td></tr>
<tr class="separator:a236de727a38e51699fe73ff61b459d95"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a52dbbfb5099e97699f2ead9139891a5f" id="r_a52dbbfb5099e97699f2ead9139891a5f"><td class="memItemLeft" align="right" valign="top">RTABMAP_DEPRECATED std::map&lt; int, float &gt; RTABMAP_CORE_EXPORT&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacertabmap_1_1graph.html#a52dbbfb5099e97699f2ead9139891a5f">findNearestNodes</a> (const std::map&lt; int, <a class="el" href="classrtabmap_1_1Transform.html">rtabmap::Transform</a> &gt; &amp;nodes, const <a class="el" href="classrtabmap_1_1Transform.html">rtabmap::Transform</a> &amp;targetPose, int k)</td></tr>
<tr class="separator:a52dbbfb5099e97699f2ead9139891a5f"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:af9e81a0b31730adb292591b79f45c87e" id="r_af9e81a0b31730adb292591b79f45c87e"><td class="memItemLeft" align="right" valign="top">RTABMAP_DEPRECATED std::map&lt; int, float &gt; RTABMAP_CORE_EXPORT&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacertabmap_1_1graph.html#af9e81a0b31730adb292591b79f45c87e">getNodesInRadius</a> (int nodeId, const std::map&lt; int, <a class="el" href="classrtabmap_1_1Transform.html">Transform</a> &gt; &amp;nodes, float radius)</td></tr>
<tr class="separator:af9e81a0b31730adb292591b79f45c87e"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a4f7f712868babb4cc74f7fe2cc366620" id="r_a4f7f712868babb4cc74f7fe2cc366620"><td class="memItemLeft" align="right" valign="top">RTABMAP_DEPRECATED std::map&lt; int, float &gt; RTABMAP_CORE_EXPORT&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacertabmap_1_1graph.html#a4f7f712868babb4cc74f7fe2cc366620">getNodesInRadius</a> (const <a class="el" href="classrtabmap_1_1Transform.html">Transform</a> &amp;targetPose, const std::map&lt; int, <a class="el" href="classrtabmap_1_1Transform.html">Transform</a> &gt; &amp;nodes, float radius)</td></tr>
<tr class="separator:a4f7f712868babb4cc74f7fe2cc366620"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ae487257302634dff8248188e2ed69043" id="r_ae487257302634dff8248188e2ed69043"><td class="memItemLeft" align="right" valign="top">RTABMAP_DEPRECATED std::map&lt; int, <a class="el" href="classrtabmap_1_1Transform.html">Transform</a> &gt; RTABMAP_CORE_EXPORT&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacertabmap_1_1graph.html#ae487257302634dff8248188e2ed69043">getPosesInRadius</a> (int nodeId, const std::map&lt; int, <a class="el" href="classrtabmap_1_1Transform.html">Transform</a> &gt; &amp;nodes, float radius, float angle=0.0f)</td></tr>
<tr class="separator:ae487257302634dff8248188e2ed69043"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a0851e81af5d331032ec790a10bb4302f" id="r_a0851e81af5d331032ec790a10bb4302f"><td class="memItemLeft" align="right" valign="top">RTABMAP_DEPRECATED std::map&lt; int, <a class="el" href="classrtabmap_1_1Transform.html">Transform</a> &gt; RTABMAP_CORE_EXPORT&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacertabmap_1_1graph.html#a0851e81af5d331032ec790a10bb4302f">getPosesInRadius</a> (const <a class="el" href="classrtabmap_1_1Transform.html">Transform</a> &amp;targetPose, const std::map&lt; int, <a class="el" href="classrtabmap_1_1Transform.html">Transform</a> &gt; &amp;nodes, float radius, float angle=0.0f)</td></tr>
<tr class="separator:a0851e81af5d331032ec790a10bb4302f"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a3cd2009752bc8e39ec00f7f08cfd4a39" id="r_a3cd2009752bc8e39ec00f7f08cfd4a39"><td class="memItemLeft" align="right" valign="top">float RTABMAP_CORE_EXPORT&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacertabmap_1_1graph.html#a3cd2009752bc8e39ec00f7f08cfd4a39">computePathLength</a> (const std::vector&lt; std::pair&lt; int, <a class="el" href="classrtabmap_1_1Transform.html">Transform</a> &gt; &gt; &amp;path)</td></tr>
<tr class="memdesc:a3cd2009752bc8e39ec00f7f08cfd4a39"><td class="mdescLeft">&#160;</td><td class="mdescRight">Path length along an ordered list of poses. <br /></td></tr>
<tr class="separator:a3cd2009752bc8e39ec00f7f08cfd4a39"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a14376d7f2365ab41e5c361876c999277" id="r_a14376d7f2365ab41e5c361876c999277"><td class="memItemLeft" align="right" valign="top">float RTABMAP_CORE_EXPORT&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacertabmap_1_1graph.html#a14376d7f2365ab41e5c361876c999277">computePathLength</a> (const std::map&lt; int, <a class="el" href="classrtabmap_1_1Transform.html">Transform</a> &gt; &amp;path)</td></tr>
<tr class="memdesc:a14376d7f2365ab41e5c361876c999277"><td class="mdescLeft">&#160;</td><td class="mdescRight">Path length in map iteration order. <br /></td></tr>
<tr class="separator:a14376d7f2365ab41e5c361876c999277"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a0a04ab5289c258725555d6c18a076094" id="r_a0a04ab5289c258725555d6c18a076094"><td class="memItemLeft" align="right" valign="top">std::list&lt; std::map&lt; int, <a class="el" href="classrtabmap_1_1Transform.html">Transform</a> &gt; &gt; RTABMAP_CORE_EXPORT&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacertabmap_1_1graph.html#a0a04ab5289c258725555d6c18a076094">getPaths</a> (std::map&lt; int, <a class="el" href="classrtabmap_1_1Transform.html">Transform</a> &gt; poses, const std::multimap&lt; int, <a class="el" href="classrtabmap_1_1Link.html">Link</a> &gt; &amp;links)</td></tr>
<tr class="memdesc:a0a04ab5289c258725555d6c18a076094"><td class="mdescLeft">&#160;</td><td class="mdescRight">Splits poses into chains connected only by neighbor links. <br /></td></tr>
<tr class="separator:a0a04ab5289c258725555d6c18a076094"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a39f8c9011cb5b7652003df9275c88410" id="r_a39f8c9011cb5b7652003df9275c88410"><td class="memItemLeft" align="right" valign="top">void RTABMAP_CORE_EXPORT&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacertabmap_1_1graph.html#a39f8c9011cb5b7652003df9275c88410">computeMinMax</a> (const std::map&lt; int, <a class="el" href="classrtabmap_1_1Transform.html">Transform</a> &gt; &amp;poses, cv::Vec3f &amp;min, cv::Vec3f &amp;max)</td></tr>
<tr class="memdesc:a39f8c9011cb5b7652003df9275c88410"><td class="mdescLeft">&#160;</td><td class="mdescRight">Axis-aligned bounding box of pose positions. <br /></td></tr>
<tr class="separator:a39f8c9011cb5b7652003df9275c88410"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table>
<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
<div class="textblock"><p>Pose-graph I/O, trajectory metrics, link utilities, and path planning. </p>
<p>Functions operate on maps of signature ids to <a class="el" href="classrtabmap_1_1Transform.html">Transform</a> poses and <a class="el" href="classrtabmap_1_1Link.html">Link</a> constraints (typically stored as <code>std::multimap&lt;int, <a class="el" href="classrtabmap_1_1Link.html" title="Directed constraint between two nodes in RTAB-Map&#39;s pose graph.">Link</a>&gt;</code> keyed by the source node id).</p>
<p>Main groups:</p><ul>
<li><b>I/O:</b> <a class="el" href="namespacertabmap_1_1graph.html#af5622dec3112ea0b5154056bde132d46">exportPoses()</a>, <a class="el" href="namespacertabmap_1_1graph.html#a5c0eb890db7dba1c353d57595ccbdc6e">importPoses()</a>, <a class="el" href="namespacertabmap_1_1graph.html#a96a6c2e8348e3d9cfd8b1770d17da9b2">exportGPS()</a></li>
<li><b>Evaluation:</b> <a class="el" href="namespacertabmap_1_1graph.html#a3c9effdb0d7c235dc1b8d7e3f8487c67">calcKittiSequenceErrors()</a>, <a class="el" href="namespacertabmap_1_1graph.html#a83c41a7cdd595ae6f76d3f1c5140c215">calcRelativeErrors()</a>, <a class="el" href="namespacertabmap_1_1graph.html#a5c36e32a4acd10ac3cdbbf7d73591f88">calcRMSE()</a>, <a class="el" href="namespacertabmap_1_1graph.html#a4691b760dfafe6d93de514c96fa55e0e">computeMaxGraphErrors()</a></li>
<li><b>Links:</b> <a class="el" href="namespacertabmap_1_1graph.html#aaa0b06795dea514ad1d5fdd4626d32ec">findLink()</a>, <a class="el" href="namespacertabmap_1_1graph.html#a308c9331cd3dd36a776517e64b33bd82">findLinks()</a>, <a class="el" href="namespacertabmap_1_1graph.html#a592918d54b32d6f13236de85958da300">filterLinks()</a>, <a class="el" href="namespacertabmap_1_1graph.html#a5d11e3cccfeca97d570c528858863dd2">filterDuplicateLinks()</a></li>
<li><b>Spatial queries:</b> <a class="el" href="namespacertabmap_1_1graph.html#a3d6e74a018b07cd52151e3e168f6384c">findNearestNode()</a>, <a class="el" href="namespacertabmap_1_1graph.html#a92dfe14b22f897e11bf5bf3f7a7c9157">findNearestNodes()</a>, <a class="el" href="namespacertabmap_1_1graph.html#a8213a5876c86611ee4c832981eb1e7de">frustumPosesFiltering()</a>, <a class="el" href="namespacertabmap_1_1graph.html#a1906b8b4ad4b7ffc955d22c4996b1506">radiusPosesFiltering()</a></li>
<li><b>Planning:</b> <a class="el" href="namespacertabmap_1_1graph.html#a5ec6c3883f73181d9458c5905c0aa0ea">computePath()</a>, <a class="el" href="namespacertabmap_1_1graph.html#a3cd2009752bc8e39ec00f7f08cfd4a39">computePathLength()</a>, <a class="el" href="namespacertabmap_1_1graph.html#a0a04ab5289c258725555d6c18a076094">getPaths()</a> </li>
</ul>
</div><h2 class="groupheader">Function Documentation</h2>
<a id="af5622dec3112ea0b5154056bde132d46" name="af5622dec3112ea0b5154056bde132d46"></a>
<h2 class="memtitle"><span class="permalink"><a href="#af5622dec3112ea0b5154056bde132d46">&#9670;&#160;</a></span>exportPoses()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">bool RTABMAP_CORE_EXPORT rtabmap::graph::exportPoses </td>
<td>(</td>
<td class="paramtype">const std::string &amp;&#160;</td>
<td class="paramname"><em>filePath</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int&#160;</td>
<td class="paramname"><em>format</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const std::map&lt; int, <a class="el" href="classrtabmap_1_1Transform.html">Transform</a> &gt; &amp;&#160;</td>
<td class="paramname"><em>poses</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const std::multimap&lt; int, <a class="el" href="classrtabmap_1_1Link.html">Link</a> &gt; &amp;&#160;</td>
<td class="paramname"><em>constraints</em> = <code>std::multimap&lt;&#160;int,&#160;<a class="el" href="classrtabmap_1_1Link.html">Link</a>&#160;&gt;()</code>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const std::map&lt; int, double &gt; &amp;&#160;</td>
<td class="paramname"><em>stamps</em> = <code>std::map&lt;&#160;int,&#160;double&#160;&gt;()</code>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const <a class="el" href="namespacertabmap.html#ad08b6f1796a27dd7316c99c385e2cc55">ParametersMap</a> &amp;&#160;</td>
<td class="paramname"><em>parameters</em> = <code><a class="el" href="namespacertabmap.html#ad08b6f1796a27dd7316c99c385e2cc55">ParametersMap</a>()</code>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Writes poses (and optional constraints) to disk. </p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramname">filePath</td><td>Output path; extension may be appended from <code>format</code>. </td></tr>
<tr><td class="paramname">format</td><td>Export format:<ul>
<li><code>0</code> Raw text (<code>.txt</code>): r11 r12 r13 tx r21 r22 r23 ty r31 r32 r33 tz</li>
<li><code>1</code> RGBD-SLAM format, in motion capture frame like the ground truth of RGB-D SLAM Dataset (requires <code>stamps</code>) : stamp x y z qx qy qz qw</li>
<li><code>10</code> Like <code>1</code> without coordinate-frame change (i.e., in base frame) : stamp x y z qx qy qz qw</li>
<li><code>11</code> Like <code>10</code> with landmark ids after positive ids : stamp x y z qx qy qz qw id</li>
<li><code>2</code> KITTI odometry format : r11 r12 r13 tx r21 r22 r23 ty r31 r32 r33 tz</li>
<li><code>3</code> TORO graph (requires <code>constraints</code>; uses <code>parameters</code>)</li>
<li><code>4</code> g2o (requires <code>constraints</code>; uses <code>parameters</code>) </li>
</ul>
</td></tr>
<tr><td class="paramname">poses</td><td>Node id → pose. </td></tr>
<tr><td class="paramname">constraints</td><td>Required for formats <code>3</code> and <code>4</code>. </td></tr>
<tr><td class="paramname">stamps</td><td>Required for formats <code>1</code>, <code>10</code>, and <code>11</code> (same size as <code>poses</code>). </td></tr>
<tr><td class="paramname">parameters</td><td>Optional optimizer parameters for formats <code>3</code> and <code>4</code>. </td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>Returns</dt><dd>False on I/O or validation error. </dd></dl>
</div>
</div>
<a id="a5c0eb890db7dba1c353d57595ccbdc6e" name="a5c0eb890db7dba1c353d57595ccbdc6e"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a5c0eb890db7dba1c353d57595ccbdc6e">&#9670;&#160;</a></span>importPoses()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">bool RTABMAP_CORE_EXPORT rtabmap::graph::importPoses </td>
<td>(</td>
<td class="paramtype">const std::string &amp;&#160;</td>
<td class="paramname"><em>filePath</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int&#160;</td>
<td class="paramname"><em>format</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">std::map&lt; int, <a class="el" href="classrtabmap_1_1Transform.html">Transform</a> &gt; &amp;&#160;</td>
<td class="paramname"><em>poses</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">std::multimap&lt; int, <a class="el" href="classrtabmap_1_1Link.html">Link</a> &gt; *&#160;</td>
<td class="paramname"><em>constraints</em> = <code>0</code>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">std::map&lt; int, double &gt; *&#160;</td>
<td class="paramname"><em>stamps</em> = <code>0</code>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Loads poses (and optional constraints) from disk. </p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramname">filePath</td><td>Input path. </td></tr>
<tr><td class="paramname">format</td><td>Import format:<ul>
<li><code>0</code> Raw text: 3×4 matrix per line (<code><a class="el" href="classrtabmap_1_1Transform.html#a8358aacfcddec4ab82c43c758cad0b75" title="Parses a transform from a string representation. Supported formats:">Transform::fromString()</a></code>)</li>
<li><code>1</code> RGBD-SLAM motion capture: stamp x y z qw qx qy qz (applies optical-frame conversion)</li>
<li><code>2</code> KITTI odometry: 3×4 matrix per line (applies optical-frame conversion)</li>
<li><code>3</code> TORO graph (fills <code>constraints</code>)</li>
<li><code>4</code> g2o (not supported yet)</li>
<li><code>5</code> NewCollege: stamp x y (2D; first pose is origin)</li>
<li><code>6</code> Malaga Urban <a class="el" href="classrtabmap_1_1GPS.html" title="WGS84 GPS fix attached to a sensor sample or graph node.">GPS</a>: 25-field <code>*_GPS.txt</code> line (local X/Y/Z)</li>
<li><code>7</code> St Lucia INS: 12-field log (<a class="el" href="classrtabmap_1_1GPS.html" title="WGS84 GPS fix attached to a sensor sample or graph node.">GPS</a> → local ENU + roll/pitch/yaw)</li>
<li><code>8</code> Karlsruhe: timestamp lat lon alt x y z roll pitch yaw (first pose is origin)</li>
<li><code>9</code> EuRoC MAV: stamp x y z qw qx qy qz vx vy vz vr vp vy ax ay az (17 CSV fields)</li>
<li><code>10</code> RGBD-SLAM like <code>1</code> without coordinate-frame change</li>
<li><code>11</code> RGBD-SLAM like <code>10</code> with node id as 9th field: stamp x y z qw qx qy qz id</li>
<li><code>12</code> RGBD Bonn dynamic dataset format (stamp + pose; Bonn-specific frame conversion) </li>
</ul>
</td></tr>
<tr><td class="paramname">poses</td><td>Output node id → pose. </td></tr>
<tr><td class="paramname">constraints</td><td>Optional output links (format <code>3</code> only). </td></tr>
<tr><td class="paramname">stamps</td><td>Optional output timestamps (formats <code>1</code>, <code>5</code>–<code>9</code>, <code>10</code>–<code>12</code> when present in file). </td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>Returns</dt><dd>False on I/O or parse error. </dd></dl>
</div>
</div>
<a id="a96a6c2e8348e3d9cfd8b1770d17da9b2" name="a96a6c2e8348e3d9cfd8b1770d17da9b2"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a96a6c2e8348e3d9cfd8b1770d17da9b2">&#9670;&#160;</a></span>exportGPS()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">bool RTABMAP_CORE_EXPORT rtabmap::graph::exportGPS </td>
<td>(</td>
<td class="paramtype">const std::string &amp;&#160;</td>
<td class="paramname"><em>filePath</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const std::map&lt; int, <a class="el" href="classrtabmap_1_1GPS.html">GPS</a> &gt; &amp;&#160;</td>
<td class="paramname"><em>gpsValues</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">unsigned int&#160;</td>
<td class="paramname"><em>rgba</em> = <code>0xFFFFFFFF</code>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Exports <a class="el" href="classrtabmap_1_1GPS.html" title="WGS84 GPS fix attached to a sensor sample or graph node.">GPS</a> samples to a PLY point cloud. </p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramname">filePath</td><td>Output <code>.ply</code> path. </td></tr>
<tr><td class="paramname">gpsValues</td><td>Node id → <a class="el" href="classrtabmap_1_1GPS.html">GPS</a> fix. </td></tr>
<tr><td class="paramname">rgba</td><td>Point color (default opaque white). </td></tr>
</table>
</dd>
</dl>
</div>
</div>
<a id="a3c9effdb0d7c235dc1b8d7e3f8487c67" name="a3c9effdb0d7c235dc1b8d7e3f8487c67"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a3c9effdb0d7c235dc1b8d7e3f8487c67">&#9670;&#160;</a></span>calcKittiSequenceErrors()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void RTABMAP_CORE_EXPORT rtabmap::graph::calcKittiSequenceErrors </td>
<td>(</td>
<td class="paramtype">const std::vector&lt; <a class="el" href="classrtabmap_1_1Transform.html">Transform</a> &gt; &amp;&#160;</td>
<td class="paramname"><em>poses_gt</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const std::vector&lt; <a class="el" href="classrtabmap_1_1Transform.html">Transform</a> &gt; &amp;&#160;</td>
<td class="paramname"><em>poses_result</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">float &amp;&#160;</td>
<td class="paramname"><em>t_err</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">float &amp;&#160;</td>
<td class="paramname"><em>r_err</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>KITTI odometry benchmark error over fixed trajectory segments. </p>
<p>For each start pose (every 10 frames) and segment length in {100, 200, …, 800} m along <code>poses_gt</code>, compares the relative transform GT vs estimate and accumulates normalized errors. The returned values are the mean over all valid segments.</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramname">poses_gt</td><td>Ground-truth poses in temporal order (one per frame). </td></tr>
<tr><td class="paramname">poses_result</td><td>Estimated poses (same length and ordering as <code>poses_gt</code>). </td></tr>
<tr><td class="paramname">t_err</td><td>Output mean translation error (%): segment translation error (m) divided by segment length, averaged, then × 100. </td></tr>
<tr><td class="paramname">r_err</td><td>Output mean rotation error (deg/m): segment rotation error (rad) divided by segment length, averaged, then converted to deg/m. </td></tr>
</table>
</dd>
</dl>
<dl class="section see"><dt>See also</dt><dd><a href="http://www.cvlibs.net/datasets/kitti/eval_odometry.php">http://www.cvlibs.net/datasets/kitti/eval_odometry.php</a> </dd></dl>
</div>
</div>
<a id="a83c41a7cdd595ae6f76d3f1c5140c215" name="a83c41a7cdd595ae6f76d3f1c5140c215"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a83c41a7cdd595ae6f76d3f1c5140c215">&#9670;&#160;</a></span>calcRelativeErrors()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void RTABMAP_CORE_EXPORT rtabmap::graph::calcRelativeErrors </td>
<td>(</td>
<td class="paramtype">const std::vector&lt; <a class="el" href="classrtabmap_1_1Transform.html">Transform</a> &gt; &amp;&#160;</td>
<td class="paramname"><em>poses_gt</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const std::vector&lt; <a class="el" href="classrtabmap_1_1Transform.html">Transform</a> &gt; &amp;&#160;</td>
<td class="paramname"><em>poses_result</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">float &amp;&#160;</td>
<td class="paramname"><em>t_err</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">float &amp;&#160;</td>
<td class="paramname"><em>r_err</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Mean frame-to-frame relative pose error (RPE-style, one step). </p>
<p>For each consecutive pair <code>(i, i+1)</code>, builds the relative motion in ground truth and in the estimate, then measures how much they differ:</p><ul>
<li>translation: Euclidean distance between the two relative transforms (m)</li>
<li>rotation: angle between the two relative transforms (rad → deg)</li>
</ul>
<p>Returns the arithmetic mean over all <code>N-1</code> pairs (<code>N</code> = trajectory length). Unlike <a class="el" href="namespacertabmap_1_1graph.html#a3c9effdb0d7c235dc1b8d7e3f8487c67">calcKittiSequenceErrors()</a>, there is no fixed segment length and no path-length normalization.</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramname">poses_gt</td><td>Ground-truth poses in temporal order (one per frame). </td></tr>
<tr><td class="paramname">poses_result</td><td>Estimated poses (same length and ordering as <code>poses_gt</code>). </td></tr>
<tr><td class="paramname">t_err</td><td>Output mean translation error over consecutive pairs (m). </td></tr>
<tr><td class="paramname">r_err</td><td>Output mean rotation error over consecutive pairs (deg). </td></tr>
</table>
</dd>
</dl>
</div>
</div>
<a id="a5c36e32a4acd10ac3cdbbf7d73591f88" name="a5c36e32a4acd10ac3cdbbf7d73591f88"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a5c36e32a4acd10ac3cdbbf7d73591f88">&#9670;&#160;</a></span>calcRMSE()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="classrtabmap_1_1Transform.html">Transform</a> RTABMAP_CORE_EXPORT rtabmap::graph::calcRMSE </td>
<td>(</td>
<td class="paramtype">const std::map&lt; int, <a class="el" href="classrtabmap_1_1Transform.html">Transform</a> &gt; &amp;&#160;</td>
<td class="paramname"><em>groundTruth</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const std::map&lt; int, <a class="el" href="classrtabmap_1_1Transform.html">Transform</a> &gt; &amp;&#160;</td>
<td class="paramname"><em>poses</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">float &amp;&#160;</td>
<td class="paramname"><em>translational_rmse</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">float &amp;&#160;</td>
<td class="paramname"><em>translational_mean</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">float &amp;&#160;</td>
<td class="paramname"><em>translational_median</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">float &amp;&#160;</td>
<td class="paramname"><em>translational_std</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">float &amp;&#160;</td>
<td class="paramname"><em>translational_min</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">float &amp;&#160;</td>
<td class="paramname"><em>translational_max</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">float &amp;&#160;</td>
<td class="paramname"><em>rotational_rmse</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">float &amp;&#160;</td>
<td class="paramname"><em>rotational_mean</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">float &amp;&#160;</td>
<td class="paramname"><em>rotational_median</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">float &amp;&#160;</td>
<td class="paramname"><em>rotational_std</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">float &amp;&#160;</td>
<td class="paramname"><em>rotational_min</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">float &amp;&#160;</td>
<td class="paramname"><em>rotational_max</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">bool&#160;</td>
<td class="paramname"><em>align2D</em> = <code>false</code>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Absolute trajectory error (ATE) with Sim(3)-style alignment (TUM RGB-D tool). </p>
<p>Only poses whose id exists in both <code>groundTruth</code> and <code>poses</code> are compared. An alignment transform <code>t</code> is estimated so that per-pose error is measured after bringing the estimate into the reference frame:</p><ul>
<li>If more than five poses match: <code>t</code> from SVD on position correspondences (estimate positions → ground-truth positions; z ignored when <code>align2D</code> is true).</li>
<li>Otherwise: <code>t</code> = groundTruth[firstId] * poses[firstId]⁻¹ using the first matched id.</li>
</ul>
<p>For each matched pose, after <code>aligned = t * poses[id]</code>:</p><ul>
<li><b>Translational error:</b> Euclidean distance between <code>aligned</code> and <code>groundTruth[id]</code> (m).</li>
<li><b>Rotational error:</b> Angle between the poses' +X axes (deg).</li>
</ul>
<p>The eight <code>@p translational_*</code> and <code>@p rotational_*</code> outputs are statistics over those per-pose errors (all matched poses). They are set to <code>0</code> when no id matches.</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramname">groundTruth</td><td>Reference trajectory (node id → pose). </td></tr>
<tr><td class="paramname">poses</td><td>Estimated trajectory; ids not in <code>groundTruth</code> are skipped. </td></tr>
<tr><td class="paramname">translational_rmse</td><td>Root mean square of translational errors (m). </td></tr>
<tr><td class="paramname">translational_mean</td><td>Arithmetic mean of translational errors (m). </td></tr>
<tr><td class="paramname">translational_median</td><td>Middle sample in matched-pose iteration order (m). </td></tr>
<tr><td class="paramname">translational_std</td><td>Standard deviation of translational errors (m). </td></tr>
<tr><td class="paramname">translational_min</td><td>Minimum translational error (m). </td></tr>
<tr><td class="paramname">translational_max</td><td>Maximum translational error (m). </td></tr>
<tr><td class="paramname">rotational_rmse</td><td>Root mean square of rotational errors (deg). </td></tr>
<tr><td class="paramname">rotational_mean</td><td>Arithmetic mean of rotational errors (deg). </td></tr>
<tr><td class="paramname">rotational_median</td><td>Middle sample in matched-pose iteration order (deg). </td></tr>
<tr><td class="paramname">rotational_std</td><td>Standard deviation of rotational errors (deg). </td></tr>
<tr><td class="paramname">rotational_min</td><td>Minimum rotational error (deg). </td></tr>
<tr><td class="paramname">rotational_max</td><td>Maximum rotational error (deg). </td></tr>
<tr><td class="paramname">align2D</td><td>If true, alignment uses x/y only (z set to 0 for correspondence); 3D if false. </td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>Returns</dt><dd>Alignment transform <code>t</code> applied as <code>t * poses[id]</code> before error computation. </dd></dl>
<dl class="section see"><dt>See also</dt><dd><a href="https://vision.in.tum.de/data/datasets/rgbd-dataset">https://vision.in.tum.de/data/datasets/rgbd-dataset</a> </dd></dl>
</div>
</div>
<a id="a4691b760dfafe6d93de514c96fa55e0e" name="a4691b760dfafe6d93de514c96fa55e0e"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a4691b760dfafe6d93de514c96fa55e0e">&#9670;&#160;</a></span>computeMaxGraphErrors()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="structrtabmap_1_1graph_1_1MaxGraphErrors.html">MaxGraphErrors</a> RTABMAP_CORE_EXPORT rtabmap::graph::computeMaxGraphErrors </td>
<td>(</td>
<td class="paramtype">const std::map&lt; int, <a class="el" href="classrtabmap_1_1Transform.html">Transform</a> &gt; &amp;&#160;</td>
<td class="paramname"><em>poses</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const std::multimap&lt; int, <a class="el" href="classrtabmap_1_1Link.html">Link</a> &gt; &amp;&#160;</td>
<td class="paramname"><em>links</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">bool&#160;</td>
<td class="paramname"><em>for3DoF</em> = <code>false</code>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Finds the worst pose-graph constraint residuals after optimization. </p>
<p>Iterates over <code>links</code> and, for each non-self-referenced edge (<code>from != to</code>):</p><ol type="1">
<li>Looks up <code>T_from</code> and <code>T_to</code> in <code>poses</code> (returns default <a class="el" href="structrtabmap_1_1graph_1_1MaxGraphErrors.html">MaxGraphErrors</a> if any endpoint pose is missing, null, or not invertible).</li>
<li>Builds the relative pose implied by the optimized poses:<ul>
<li>Normal link: <code>t = T_from⁻¹ · T_to</code></li>
<li><a class="el" href="classrtabmap_1_1Landmark.html" title="Optimized pose of a visual landmark (e.g. ArUco/AprilTag) in the map.">Landmark</a> (<code>from &lt; 0</code>): <code>t = T_to⁻¹ · T_from</code>, link measurement inverted</li>
</ul>
</li>
<li>Compares <code>t</code> to the link transform:<ul>
<li><b>Linear error:</b> max |Δx|, |Δy|, and |Δz| (z ignored when <code>for3DoF</code> is true).</li>
<li><b>Angular error:</b> full 3D angle between <code>t</code> and the link, or yaw-only if <code>for3DoF</code>; skipped for <a class="el" href="classrtabmap_1_1Link.html#a925bb7ca93eb95a3a873b0a9e8d5e91ea22912bbbcacce5ee39e61da7ec4640b9">Link::kLandmark</a> when the information matrix does not constrain yaw.</li>
</ul>
</li>
<li>Normalizes by link uncertainty: <code>error / sqrt(variance)</code> using the link information matrix (largest diagonal variance for translation/rotation).</li>
</ol>
<p>The returned <a class="el" href="structrtabmap_1_1graph_1_1MaxGraphErrors.html">MaxGraphErrors</a> holds the link with the highest linear and angular <em>ratios</em> (not necessarily the largest absolute error).</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramname">poses</td><td>Optimized node poses (must contain every <code>from</code> and <code>to</code> id used). </td></tr>
<tr><td class="paramname">links</td><td>Graph constraints (typically <code>std::multimap&lt;int, <a class="el" href="classrtabmap_1_1Link.html" title="Directed constraint between two nodes in RTAB-Map&#39;s pose graph.">Link</a>&gt;</code> keyed by <code>from</code>). </td></tr>
<tr><td class="paramname">for3DoF</td><td>If true, linear error uses x/y only and angular error compares yaw only. </td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>Returns</dt><dd><a class="el" href="structrtabmap_1_1graph_1_1MaxGraphErrors.html">MaxGraphErrors</a>; fields stay <code>-1</code> when no valid link was checked or on early abort. </dd></dl>
</div>
</div>
<a id="a6c009c4c819abe37ec2ca6d041edd92b" name="a6c009c4c819abe37ec2ca6d041edd92b"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a6c009c4c819abe37ec2ca6d041edd92b">&#9670;&#160;</a></span>getMaxOdomInf()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">std::vector&lt; double &gt; RTABMAP_CORE_EXPORT rtabmap::graph::getMaxOdomInf </td>
<td>(</td>
<td class="paramtype">const std::multimap&lt; int, <a class="el" href="classrtabmap_1_1Link.html">Link</a> &gt; &amp;&#160;</td>
<td class="paramname"><em>links</em></td><td>)</td>
<td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Maximum information-matrix diagonal over odometry neighbor links. </p>
<p>Scans <code>links</code> of type <a class="el" href="classrtabmap_1_1Link.html#a925bb7ca93eb95a3a873b0a9e8d5e91ea8f60efd83d5fad3493573bef3d4a8adf">Link::kNeighbor</a> or <a class="el" href="classrtabmap_1_1Link.html#a925bb7ca93eb95a3a873b0a9e8d5e91ea8fbb6dbe2d16e19ad8fecb6bac65e9db">Link::kNeighborMerged</a> and, for each dof (x, y, z, roll, pitch, yaw), keeps the largest diagonal entry of the 6×6 information matrix.</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramname">links</td><td>Graph constraints (multimap keyed by source id). </td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>Returns</dt><dd>Six maximum information values, or an empty vector if no neighbor links exist. </dd></dl>
</div>
</div>
<a id="aaa0b06795dea514ad1d5fdd4626d32ec" name="aaa0b06795dea514ad1d5fdd4626d32ec"></a>
<h2 class="memtitle"><span class="permalink"><a href="#aaa0b06795dea514ad1d5fdd4626d32ec">&#9670;&#160;</a></span>findLink() <span class="overload">[1/6]</span></h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">std::multimap&lt; int, <a class="el" href="classrtabmap_1_1Link.html">Link</a> &gt;::iterator RTABMAP_CORE_EXPORT rtabmap::graph::findLink </td>
<td>(</td>
<td class="paramtype">std::multimap&lt; int, <a class="el" href="classrtabmap_1_1Link.html">Link</a> &gt; &amp;&#160;</td>
<td class="paramname"><em>links</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int&#160;</td>
<td class="paramname"><em>from</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int&#160;</td>
<td class="paramname"><em>to</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">bool&#160;</td>
<td class="paramname"><em>checkBothWays</em> = <code>true</code>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="classrtabmap_1_1Link.html#a925bb7ca93eb95a3a873b0a9e8d5e91e">Link::Type</a>&#160;</td>
<td class="paramname"><em>type</em> = <code><a class="el" href="classrtabmap_1_1Link.html#a925bb7ca93eb95a3a873b0a9e8d5e91ea8a720d632258ba1b468af0319ae8e7d4">Link::kUndef</a></code>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Finds the first link from <code>from</code> to <code>to</code> in a multimap keyed by source id. </p>
<p>Iterates all entries with key <code>from</code> and matches the destination (and optionally <code>type</code>). When <code>checkBothWays</code> is true, also searches key <code>to</code> for a link back to <code>from</code>.</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramname">links</td><td><a class="el" href="classrtabmap_1_1Link.html" title="Directed constraint between two nodes in RTAB-Map&#39;s pose graph.">Link</a> multimap (<code>key</code> = source node id). </td></tr>
<tr><td class="paramname">from</td><td>Source node id. </td></tr>
<tr><td class="paramname">to</td><td>Destination node id. </td></tr>
<tr><td class="paramname">checkBothWays</td><td>If true, also match <code>to → from</code>. </td></tr>
<tr><td class="paramname">type</td><td>Required link type, or <a class="el" href="classrtabmap_1_1Link.html#a925bb7ca93eb95a3a873b0a9e8d5e91ea8a720d632258ba1b468af0319ae8e7d4">Link::kUndef</a> to accept any type. </td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>Returns</dt><dd>Iterator to the link, or <code>links.end()</code> if not found. </dd></dl>
</div>
</div>
<a id="ad91079c9cdd934c8ba8927d3c52b40e5" name="ad91079c9cdd934c8ba8927d3c52b40e5"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ad91079c9cdd934c8ba8927d3c52b40e5">&#9670;&#160;</a></span>findLink() <span class="overload">[2/6]</span></h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">std::multimap&lt; int, std::pair&lt; int, <a class="el" href="classrtabmap_1_1Link.html#a925bb7ca93eb95a3a873b0a9e8d5e91e">Link::Type</a> &gt; &gt;::iterator RTABMAP_CORE_EXPORT rtabmap::graph::findLink </td>
<td>(</td>
<td class="paramtype">std::multimap&lt; int, std::pair&lt; int, <a class="el" href="classrtabmap_1_1Link.html#a925bb7ca93eb95a3a873b0a9e8d5e91e">Link::Type</a> &gt; &gt; &amp;&#160;</td>
<td class="paramname"><em>links</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int&#160;</td>
<td class="paramname"><em>from</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int&#160;</td>
<td class="paramname"><em>to</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">bool&#160;</td>
<td class="paramname"><em>checkBothWays</em> = <code>true</code>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="classrtabmap_1_1Link.html#a925bb7ca93eb95a3a873b0a9e8d5e91e">Link::Type</a>&#160;</td>
<td class="paramname"><em>type</em> = <code><a class="el" href="classrtabmap_1_1Link.html#a925bb7ca93eb95a3a873b0a9e8d5e91ea8a720d632258ba1b468af0319ae8e7d4">Link::kUndef</a></code>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>This is an overloaded member function, provided for convenience. It differs from the above function only in what argument(s) it accepts. <code>std::multimap&lt;int, std::pair&lt;int, <a class="el" href="classrtabmap_1_1Link.html#a925bb7ca93eb95a3a873b0a9e8d5e91e" title="Link category and filter sentinels.">Link::Type</a>&gt;&gt;</code>. </p>
</div>
</div>
<a id="a06ed3112247c13dcf494665c1d9df327" name="a06ed3112247c13dcf494665c1d9df327"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a06ed3112247c13dcf494665c1d9df327">&#9670;&#160;</a></span>findLink() <span class="overload">[3/6]</span></h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">std::multimap&lt; int, int &gt;::iterator RTABMAP_CORE_EXPORT rtabmap::graph::findLink </td>
<td>(</td>
<td class="paramtype">std::multimap&lt; int, int &gt; &amp;&#160;</td>
<td class="paramname"><em>links</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int&#160;</td>
<td class="paramname"><em>from</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int&#160;</td>
<td class="paramname"><em>to</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">bool&#160;</td>
<td class="paramname"><em>checkBothWays</em> = <code>true</code>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>This is an overloaded member function, provided for convenience. It differs from the above function only in what argument(s) it accepts. <code>std::multimap&lt;int, int&gt;</code>. </p>
</div>
</div>
<a id="a7695c60c6bb375057586449674d42eea" name="a7695c60c6bb375057586449674d42eea"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a7695c60c6bb375057586449674d42eea">&#9670;&#160;</a></span>findLink() <span class="overload">[4/6]</span></h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">std::multimap&lt; int, <a class="el" href="classrtabmap_1_1Link.html">Link</a> &gt;::const_iterator RTABMAP_CORE_EXPORT rtabmap::graph::findLink </td>
<td>(</td>
<td class="paramtype">const std::multimap&lt; int, <a class="el" href="classrtabmap_1_1Link.html">Link</a> &gt; &amp;&#160;</td>
<td class="paramname"><em>links</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int&#160;</td>
<td class="paramname"><em>from</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int&#160;</td>
<td class="paramname"><em>to</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">bool&#160;</td>
<td class="paramname"><em>checkBothWays</em> = <code>true</code>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="classrtabmap_1_1Link.html#a925bb7ca93eb95a3a873b0a9e8d5e91e">Link::Type</a>&#160;</td>
<td class="paramname"><em>type</em> = <code><a class="el" href="classrtabmap_1_1Link.html#a925bb7ca93eb95a3a873b0a9e8d5e91ea8a720d632258ba1b468af0319ae8e7d4">Link::kUndef</a></code>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>This is an overloaded member function, provided for convenience. It differs from the above function only in what argument(s) it accepts. Const <code>std::multimap&lt;int, <a class="el" href="classrtabmap_1_1Link.html" title="Directed constraint between two nodes in RTAB-Map&#39;s pose graph.">Link</a>&gt;</code>. </p>
</div>
</div>
<a id="a8200ae3a6bd27ee2cee4b71d85ace3e9" name="a8200ae3a6bd27ee2cee4b71d85ace3e9"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a8200ae3a6bd27ee2cee4b71d85ace3e9">&#9670;&#160;</a></span>findLink() <span class="overload">[5/6]</span></h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">std::multimap&lt; int, std::pair&lt; int, <a class="el" href="classrtabmap_1_1Link.html#a925bb7ca93eb95a3a873b0a9e8d5e91e">Link::Type</a> &gt; &gt;::const_iterator RTABMAP_CORE_EXPORT rtabmap::graph::findLink </td>
<td>(</td>
<td class="paramtype">const std::multimap&lt; int, std::pair&lt; int, <a class="el" href="classrtabmap_1_1Link.html#a925bb7ca93eb95a3a873b0a9e8d5e91e">Link::Type</a> &gt; &gt; &amp;&#160;</td>
<td class="paramname"><em>links</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int&#160;</td>
<td class="paramname"><em>from</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int&#160;</td>
<td class="paramname"><em>to</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">bool&#160;</td>
<td class="paramname"><em>checkBothWays</em> = <code>true</code>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="classrtabmap_1_1Link.html#a925bb7ca93eb95a3a873b0a9e8d5e91e">Link::Type</a>&#160;</td>
<td class="paramname"><em>type</em> = <code><a class="el" href="classrtabmap_1_1Link.html#a925bb7ca93eb95a3a873b0a9e8d5e91ea8a720d632258ba1b468af0319ae8e7d4">Link::kUndef</a></code>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>This is an overloaded member function, provided for convenience. It differs from the above function only in what argument(s) it accepts. Const <code>std::multimap&lt;int, std::pair&lt;int, <a class="el" href="classrtabmap_1_1Link.html#a925bb7ca93eb95a3a873b0a9e8d5e91e" title="Link category and filter sentinels.">Link::Type</a>&gt;&gt;</code>. </p>
</div>
</div>
<a id="aecdcc01682092f4c89257d070aa2a437" name="aecdcc01682092f4c89257d070aa2a437"></a>
<h2 class="memtitle"><span class="permalink"><a href="#aecdcc01682092f4c89257d070aa2a437">&#9670;&#160;</a></span>findLink() <span class="overload">[6/6]</span></h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">std::multimap&lt; int, int &gt;::const_iterator RTABMAP_CORE_EXPORT rtabmap::graph::findLink </td>
<td>(</td>
<td class="paramtype">const std::multimap&lt; int, int &gt; &amp;&#160;</td>
<td class="paramname"><em>links</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int&#160;</td>
<td class="paramname"><em>from</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int&#160;</td>
<td class="paramname"><em>to</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">bool&#160;</td>
<td class="paramname"><em>checkBothWays</em> = <code>true</code>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>This is an overloaded member function, provided for convenience. It differs from the above function only in what argument(s) it accepts. Const <code>std::multimap&lt;int, int&gt;</code>. </p>
</div>
</div>
<a id="a308c9331cd3dd36a776517e64b33bd82" name="a308c9331cd3dd36a776517e64b33bd82"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a308c9331cd3dd36a776517e64b33bd82">&#9670;&#160;</a></span>findLinks()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">std::list&lt; <a class="el" href="classrtabmap_1_1Link.html">Link</a> &gt; RTABMAP_CORE_EXPORT rtabmap::graph::findLinks </td>
<td>(</td>
<td class="paramtype">const std::multimap&lt; int, <a class="el" href="classrtabmap_1_1Link.html">Link</a> &gt; &amp;&#160;</td>
<td class="paramname"><em>links</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int&#160;</td>
<td class="paramname"><em>from</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Lists all links incident on node <code>from</code>. </p>
<p>Outgoing links (<code>link.from() == from</code>) are returned as stored; for incoming links (<code>link.to() == from</code>), the inverse link is returned so the pose of <code>from</code> is always the source frame.</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramname">links</td><td>Graph constraints. </td></tr>
<tr><td class="paramname">from</td><td>Node id to query. </td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>Returns</dt><dd>Incident links (may be empty). </dd></dl>
</div>
</div>
<a id="a5d11e3cccfeca97d570c528858863dd2" name="a5d11e3cccfeca97d570c528858863dd2"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a5d11e3cccfeca97d570c528858863dd2">&#9670;&#160;</a></span>filterDuplicateLinks()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">std::multimap&lt; int, <a class="el" href="classrtabmap_1_1Link.html">Link</a> &gt; RTABMAP_CORE_EXPORT rtabmap::graph::filterDuplicateLinks </td>
<td>(</td>
<td class="paramtype">const std::multimap&lt; int, <a class="el" href="classrtabmap_1_1Link.html">Link</a> &gt; &amp;&#160;</td>
<td class="paramname"><em>links</em></td><td>)</td>
<td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Removes duplicate undirected links. </p>
<p>Keeps the first occurrence of each <code>(from, to)</code> or <code>(to, from)</code> pair with the same <a class="el" href="classrtabmap_1_1Link.html#a925bb7ca93eb95a3a873b0a9e8d5e91e">Link::Type</a> (see <a class="el" href="namespacertabmap_1_1graph.html#aaa0b06795dea514ad1d5fdd4626d32ec">findLink()</a> with <code>checkBothWays</code>).</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramname">links</td><td>Input link multimap. </td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>Returns</dt><dd>Copy without duplicates. </dd></dl>
</div>
</div>
<a id="a592918d54b32d6f13236de85958da300" name="a592918d54b32d6f13236de85958da300"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a592918d54b32d6f13236de85958da300">&#9670;&#160;</a></span>filterLinks() <span class="overload">[1/2]</span></h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">std::multimap&lt; int, <a class="el" href="classrtabmap_1_1Link.html">Link</a> &gt; RTABMAP_CORE_EXPORT rtabmap::graph::filterLinks </td>
<td>(</td>
<td class="paramtype">const std::multimap&lt; int, <a class="el" href="classrtabmap_1_1Link.html">Link</a> &gt; &amp;&#160;</td>
<td class="paramname"><em>links</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="classrtabmap_1_1Link.html#a925bb7ca93eb95a3a873b0a9e8d5e91e">Link::Type</a>&#160;</td>
<td class="paramname"><em>filteredType</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">bool&#160;</td>
<td class="paramname"><em>inverted</em> = <code>false</code>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Filters links by type or self-reference. </p>
<ul>
<li>If <code>filteredType</code> is <a class="el" href="classrtabmap_1_1Link.html#a925bb7ca93eb95a3a873b0a9e8d5e91ead52adb0176a83a02833e89111f66497e">kSelfRefLink</a>: exclude self-references (<code>from == to</code>), or include only them when <code>inverted</code> is true.</li>
<li>Otherwise: exclude links of <code>filteredType</code>, or keep only that type when <code>inverted</code> is true.</li>
</ul>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramname">links</td><td>Input links. </td></tr>
<tr><td class="paramname">filteredType</td><td>Type to filter, or <a class="el" href="classrtabmap_1_1Link.html#a925bb7ca93eb95a3a873b0a9e8d5e91ead52adb0176a83a02833e89111f66497e">Link::kSelfRefLink</a> for self-reference filtering. </td></tr>
<tr><td class="paramname">inverted</td><td>If true, keep the filtered set instead of removing it. </td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>Returns</dt><dd>Filtered link container (same structure as input). </dd></dl>
</div>
</div>
<a id="af4dffb2a3eced519378d18bca8fa4419" name="af4dffb2a3eced519378d18bca8fa4419"></a>
<h2 class="memtitle"><span class="permalink"><a href="#af4dffb2a3eced519378d18bca8fa4419">&#9670;&#160;</a></span>filterLinks() <span class="overload">[2/2]</span></h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">std::map&lt; int, <a class="el" href="classrtabmap_1_1Link.html">Link</a> &gt; RTABMAP_CORE_EXPORT rtabmap::graph::filterLinks </td>
<td>(</td>
<td class="paramtype">const std::map&lt; int, <a class="el" href="classrtabmap_1_1Link.html">Link</a> &gt; &amp;&#160;</td>
<td class="paramname"><em>links</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="classrtabmap_1_1Link.html#a925bb7ca93eb95a3a873b0a9e8d5e91e">Link::Type</a>&#160;</td>
<td class="paramname"><em>filteredType</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">bool&#160;</td>
<td class="paramname"><em>inverted</em> = <code>false</code>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>This is an overloaded member function, provided for convenience. It differs from the above function only in what argument(s) it accepts. For <code>std::map&lt;int, <a class="el" href="classrtabmap_1_1Link.html" title="Directed constraint between two nodes in RTAB-Map&#39;s pose graph.">Link</a>&gt;</code>. </p>
</div>
</div>
<a id="a8213a5876c86611ee4c832981eb1e7de" name="a8213a5876c86611ee4c832981eb1e7de"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a8213a5876c86611ee4c832981eb1e7de">&#9670;&#160;</a></span>frustumPosesFiltering()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">std::map&lt; int, <a class="el" href="classrtabmap_1_1Transform.html">Transform</a> &gt; RTABMAP_CORE_EXPORT rtabmap::graph::frustumPosesFiltering </td>
<td>(</td>
<td class="paramtype">const std::map&lt; int, <a class="el" href="classrtabmap_1_1Transform.html">Transform</a> &gt; &amp;&#160;</td>
<td class="paramname"><em>poses</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const <a class="el" href="classrtabmap_1_1Transform.html">Transform</a> &amp;&#160;</td>
<td class="paramname"><em>cameraPose</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">float&#160;</td>
<td class="paramname"><em>horizontalFOV</em> = <code>45.0f</code>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">float&#160;</td>
<td class="paramname"><em>verticalFOV</em> = <code>45.0f</code>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">float&#160;</td>
<td class="paramname"><em>nearClipPlaneDistance</em> = <code>0.1f</code>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">float&#160;</td>
<td class="paramname"><em>farClipPlaneDistance</em> = <code>100.0f</code>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">bool&#160;</td>
<td class="paramname"><em>negative</em> = <code>false</code>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Keeps poses inside (or outside) a camera frustum. </p>
<p>Transforms each pose position into the frustum defined by <code>cameraPose</code> using <a class="el" href="group__FrustumFiltering.html#gad05921639a3371d2ee0f684b77542330">util3d::frustumFiltering()</a> (this assumes the cameraPose includes the optical rotation of the camera (X right, Y down, Z forward).</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramname">poses</td><td>Input poses (null poses are skipped) in base frame (X forward, Y left, Z up), </td></tr>
<tr><td class="paramname">cameraPose</td><td>Frustum origin and orientation including the optical rotation of the camera (X right, Y down, Z forward). </td></tr>
<tr><td class="paramname">horizontalFOV</td><td>Horizontal field of view (deg); see <a class="el" href="classrtabmap_1_1CameraModel.html#a12abd4cac897f48bf862a96f0eba1d65">CameraModel::horizontalFOV()</a>. </td></tr>
<tr><td class="paramname">verticalFOV</td><td>Vertical field of view (deg); see <a class="el" href="classrtabmap_1_1CameraModel.html#af6226e43afcb69259b137bbe50099537">CameraModel::verticalFOV()</a>. </td></tr>
<tr><td class="paramname">nearClipPlaneDistance</td><td>Near clipping distance (m). </td></tr>
<tr><td class="paramname">farClipPlaneDistance</td><td>Far clipping distance (m). </td></tr>
<tr><td class="paramname">negative</td><td>If false, keep poses inside the frustum; if true, keep poses outside. </td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>Returns</dt><dd>Subset of <code>poses</code> passing the filter. </dd></dl>
</div>
</div>
<a id="a1906b8b4ad4b7ffc955d22c4996b1506" name="a1906b8b4ad4b7ffc955d22c4996b1506"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a1906b8b4ad4b7ffc955d22c4996b1506">&#9670;&#160;</a></span>radiusPosesFiltering()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">std::map&lt; int, <a class="el" href="classrtabmap_1_1Transform.html">Transform</a> &gt; RTABMAP_CORE_EXPORT rtabmap::graph::radiusPosesFiltering </td>
<td>(</td>
<td class="paramtype">const std::map&lt; int, <a class="el" href="classrtabmap_1_1Transform.html">Transform</a> &gt; &amp;&#160;</td>
<td class="paramname"><em>poses</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">float&#160;</td>
<td class="paramname"><em>radius</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">float&#160;</td>
<td class="paramname"><em>angle</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">bool&#160;</td>
<td class="paramname"><em>keepLatest</em> = <code>true</code>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Subsamples poses that are spatially (and optionally angularly) redundant. </p>
<p>For each pose not yet processed, finds all poses within <code>radius</code> (KD-tree). When <code>angle</code> &gt; 0, only poses whose +X axis differs by at most <code>angle</code> (rad) are grouped. From each group, keeps one pose: the latest in map order if <code>keepLatest</code>, otherwise the earliest. The first and last poses of the input map are always kept.</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramname">poses</td><td>Input trajectory (map iteration order defines “latest/oldest”). </td></tr>
<tr><td class="paramname">radius</td><td>Clustering radius (m); if <code>≤ 0</code> or fewer than three poses, returns <code>poses</code> unchanged. </td></tr>
<tr><td class="paramname">angle</td><td>Max heading difference within a cluster (rad); <code>0</code> ignores orientation. </td></tr>
<tr><td class="paramname">keepLatest</td><td>If true, keep the latest pose per cluster; otherwise the earliest. </td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>Returns</dt><dd>Subsampled poses. </dd></dl>
</div>
</div>
<a id="acaf3e4ffcfc830747c3c3cb02a8ea155" name="acaf3e4ffcfc830747c3c3cb02a8ea155"></a>
<h2 class="memtitle"><span class="permalink"><a href="#acaf3e4ffcfc830747c3c3cb02a8ea155">&#9670;&#160;</a></span>radiusPosesClustering()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">std::multimap&lt; int, int &gt; RTABMAP_CORE_EXPORT rtabmap::graph::radiusPosesClustering </td>
<td>(</td>
<td class="paramtype">const std::map&lt; int, <a class="el" href="classrtabmap_1_1Transform.html">Transform</a> &gt; &amp;&#160;</td>
<td class="paramname"><em>poses</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">float&#160;</td>
<td class="paramname"><em>radius</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">float&#160;</td>
<td class="paramname"><em>angle</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Radius-neighbor clustering of poses. </p>
<p>For each pose, inserts <code>(queryId, neighborId)</code> into the output for every other pose within <code>radius</code> (and within <code>angle</code> of the query heading when <code>angle</code> &gt; 0).</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramname">poses</td><td>Input poses. </td></tr>
<tr><td class="paramname">radius</td><td>Search radius (m); no pairs if <code>≤ 0</code> or fewer than two poses. </td></tr>
<tr><td class="paramname">angle</td><td>Max heading difference (rad); <code>0</code> ignores orientation. </td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>Returns</dt><dd>Multimap of pose id → neighbor id (both ids from <code>poses</code>). </dd></dl>
</div>
</div>
<a id="aabda884597e6b8df053d04ee56cfaf6f" name="aabda884597e6b8df053d04ee56cfaf6f"></a>
<h2 class="memtitle"><span class="permalink"><a href="#aabda884597e6b8df053d04ee56cfaf6f">&#9670;&#160;</a></span>reduceGraph()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void rtabmap::graph::reduceGraph </td>
<td>(</td>
<td class="paramtype">const std::map&lt; int, <a class="el" href="classrtabmap_1_1Transform.html">Transform</a> &gt; &amp;&#160;</td>
<td class="paramname"><em>poses</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const std::multimap&lt; int, <a class="el" href="classrtabmap_1_1Link.html">Link</a> &gt; &amp;&#160;</td>
<td class="paramname"><em>links</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">std::multimap&lt; int, int &gt; &amp;&#160;</td>
<td class="paramname"><em>hyperNodes</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">std::multimap&lt; int, <a class="el" href="classrtabmap_1_1Link.html">Link</a> &gt; &amp;&#160;</td>
<td class="paramname"><em>hyperLinks</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Reduces a pose graph into hyper-nodes and hyper-links. </p>
<p><b>Hyper-nodes:</b> clusters poses connected by non-neighbor loop-closure links. Clustering starts from the largest id downward; each cluster is keyed by its parent (hyper-node) id.</p>
<p><b>Hyper-links:</b> for each <a class="el" href="classrtabmap_1_1Link.html#a925bb7ca93eb95a3a873b0a9e8d5e91ea8f60efd83d5fad3493573bef3d4a8adf">Link::kNeighbor</a> or <a class="el" href="classrtabmap_1_1Link.html#a925bb7ca93eb95a3a873b0a9e8d5e91ea8fbb6dbe2d16e19ad8fecb6bac65e9db">Link::kNeighborMerged</a> link between different clusters, builds one merged <a class="el" href="classrtabmap_1_1Link.html">Link</a> along the shortest path through intra-cluster closure links (Dijkstra with unit cost).</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramname">poses</td><td>Input optimized poses. </td></tr>
<tr><td class="paramname">links</td><td>Input constraints (should be unique per directed edge for closure links). </td></tr>
<tr><td class="paramname">hyperNodes</td><td>Output <code>hyperNodeId → childPoseId</code> membership. </td></tr>
<tr><td class="paramname">hyperLinks</td><td>Output links between hyper-nodes (one per hyper-edge, most recent kept). </td></tr>
</table>
</dd>
</dl>
</div>
</div>
<a id="a5ec6c3883f73181d9458c5905c0aa0ea" name="a5ec6c3883f73181d9458c5905c0aa0ea"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a5ec6c3883f73181d9458c5905c0aa0ea">&#9670;&#160;</a></span>computePath() <span class="overload">[1/3]</span></h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">std::list&lt; std::pair&lt; int, <a class="el" href="classrtabmap_1_1Transform.html">Transform</a> &gt; &gt; RTABMAP_CORE_EXPORT rtabmap::graph::computePath </td>
<td>(</td>
<td class="paramtype">const std::map&lt; int, <a class="el" href="classrtabmap_1_1Transform.html">rtabmap::Transform</a> &gt; &amp;&#160;</td>
<td class="paramname"><em>poses</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const std::multimap&lt; int, int &gt; &amp;&#160;</td>
<td class="paramname"><em>links</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int&#160;</td>
<td class="paramname"><em>from</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int&#160;</td>
<td class="paramname"><em>to</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">bool&#160;</td>
<td class="paramname"><em>updateNewCosts</em> = <code>false</code>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>A* shortest path on a pose graph with Euclidean edge costs. </p>
<p>Edge cost between adjacent nodes is the Euclidean distance between their poses in <code>poses</code>. Uses <code>costSoFar + distToEnd</code> where <code>distToEnd</code> is the distance to the goal pose.</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramname">poses</td><td>Node id → pose (must contain every node reached by <code>links</code>). </td></tr>
<tr><td class="paramname">links</td><td>Directed edges (<code>from</code> → <code>to</code>) keyed by source id. </td></tr>
<tr><td class="paramname">from</td><td>Start node id. </td></tr>
<tr><td class="paramname">to</td><td>Goal node id. </td></tr>
<tr><td class="paramname">updateNewCosts</td><td>If true, use a multimap queue that can decrease keys when a shorter path is found. </td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>Returns</dt><dd>Ordered path from <code>from</code> to <code>to</code> (inclusive) with poses; empty if unreachable. </dd></dl>
</div>
</div>
<a id="a8acc34fed4cb4e452e8e14d05dafc578" name="a8acc34fed4cb4e452e8e14d05dafc578"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a8acc34fed4cb4e452e8e14d05dafc578">&#9670;&#160;</a></span>computePathDepths()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">std::map&lt; int, int &gt; RTABMAP_CORE_EXPORT rtabmap::graph::computePathDepths </td>
<td>(</td>
<td class="paramtype">const std::multimap&lt; int, int &gt; &amp;&#160;</td>
<td class="paramname"><em>links</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int&#160;</td>
<td class="paramname"><em>from</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int&#160;</td>
<td class="paramname"><em>maxDepth</em> = <code>0</code>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Single-source graph depth via BFS. </p>
<p>Runs one breadth-first search from <code>from</code> and returns, for every reached node, its depth from <code>from</code> (i.e., the number of links on the shortest path, <code>from</code> itself having depth 0).</p>
<dl class="section note"><dt>Note</dt><dd>The depth is a number of hops, not a distance: it counts links, and the poses of the nodes play no part in it. The path it stands for is thus not the one <a class="el" href="namespacertabmap_1_1graph.html#a5ec6c3883f73181d9458c5905c0aa0ea">computePath()</a> returns, which minimizes the Euclidean length instead and can walk more links to save meters.</dd></dl>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramname">links</td><td>Directed edges (<code>from</code> → <code>to</code>) keyed by source id. </td></tr>
<tr><td class="paramname">from</td><td>Start node id. </td></tr>
<tr><td class="paramname">maxDepth</td><td>If &gt; 0, only nodes with depth ≤ this value are returned (the frontier is not expanded further); <code>0</code> explores the whole component. </td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>Returns</dt><dd>Node id → depth mapping. </dd></dl>
</div>
</div>
<a id="ae21d02d613df461d6163f9d9a3db7ad2" name="ae21d02d613df461d6163f9d9a3db7ad2"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ae21d02d613df461d6163f9d9a3db7ad2">&#9670;&#160;</a></span>computePath() <span class="overload">[2/3]</span></h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">std::list&lt; int &gt; RTABMAP_CORE_EXPORT rtabmap::graph::computePath </td>
<td>(</td>
<td class="paramtype">const std::multimap&lt; int, <a class="el" href="classrtabmap_1_1Link.html">Link</a> &gt; &amp;&#160;</td>
<td class="paramname"><em>links</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int&#160;</td>
<td class="paramname"><em>from</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int&#160;</td>
<td class="paramname"><em>to</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">bool&#160;</td>
<td class="paramname"><em>updateNewCosts</em> = <code>false</code>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">bool&#160;</td>
<td class="paramname"><em>useSameCostForAllLinks</em> = <code>false</code>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Dijkstra shortest path on link constraints. </p>
<p>Explores outgoing links keyed by <code>link.from()</code>. Edge cost is <code>1</code> when <code>useSameCostForAllLinks</code> is true, otherwise the translation norm of the link transform.</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramname">links</td><td>Constraints keyed by source node id. </td></tr>
<tr><td class="paramname">from</td><td>Start node id. </td></tr>
<tr><td class="paramname">to</td><td>Goal node id. </td></tr>
<tr><td class="paramname">updateNewCosts</td><td>If true, allow cost improvements on open nodes. </td></tr>
<tr><td class="paramname">useSameCostForAllLinks</td><td>If true, unit edge cost; else use <code>link.transform().getNorm()</code>. </td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>Returns</dt><dd>Node ids from <code>from</code> to <code>to</code> (inclusive); empty if unreachable. </dd></dl>
</div>
</div>
<a id="a1ec6b9506985624f31fb2091219cb142" name="a1ec6b9506985624f31fb2091219cb142"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a1ec6b9506985624f31fb2091219cb142">&#9670;&#160;</a></span>computePath() <span class="overload">[3/3]</span></h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">std::list&lt; std::pair&lt; int, <a class="el" href="classrtabmap_1_1Transform.html">Transform</a> &gt; &gt; RTABMAP_CORE_EXPORT rtabmap::graph::computePath </td>
<td>(</td>
<td class="paramtype">int&#160;</td>
<td class="paramname"><em>fromId</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int&#160;</td>
<td class="paramname"><em>toId</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const <a class="el" href="classrtabmap_1_1Memory.html">Memory</a> *&#160;</td>
<td class="paramname"><em>memory</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">bool&#160;</td>
<td class="paramname"><em>lookInDatabase</em> = <code>true</code>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">bool&#160;</td>
<td class="paramname"><em>updateNewCosts</em> = <code>false</code>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">float&#160;</td>
<td class="paramname"><em>linearVelocity</em> = <code>0.0f</code>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">float&#160;</td>
<td class="paramname"><em>angularVelocity</em> = <code>0.0f</code>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">bool&#160;</td>
<td class="paramname"><em>ignoreDirectLinks</em> = <code>false</code>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Dijkstra path through the live <a class="el" href="classrtabmap_1_1Memory.html">Memory</a> pose graph. </p>
<p>Loads links from <a class="el" href="classrtabmap_1_1Memory.html">Memory</a> (optionally from the database), chains transforms along the chosen path, and returns the accumulated poses. Self-referenced links are skipped.</p>
<p>By default (<code>linearVelocity</code> and <code>angularVelocity</code> ≤ 0), edge cost is translation distance (m) only. When set &gt; 0, costs are expressed in seconds of motion:</p><ul>
<li><code>linearVelocity</code> adds <code>linkTranslation / linearVelocity</code> (time to drive the edge at that speed). Used alone it scales every edge by the same factor, so the <b>shortest path is unchanged</b>; set it to your robot’s typical forward speed (e.g. <code>0.5</code> m/s) when you also use <code>angularVelocity</code> so translation and rotation costs are comparable.</li>
<li><code>angularVelocity</code> adds <code>headingMismatch / angularVelocity</code>, where heading mismatch is the angle between the displacement to the next node and that node’s forward (+X) axis. This is what changes which path is chosen: a chain followed <b>mostly forward</b> (small mismatch) can beat a shorter route through loop closures that require large reorientations (e.g. <code>angularVelocity = 1.0</code> rad/s with <code>linearVelocity = 0.5</code> m/s). With <code>angularVelocity</code> &gt; 0 and <code>linearVelocity</code> ≤ 0, translation is ignored and the path minimizes heading mismatch only (forward-following paths, regardless of distance). This can help loop-closure detection when the map was built with a forward-facing camera: the path stays aligned with how places were observed while driving forward.</li>
</ul>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramname">fromId</td><td>Start signature id (<code>≥ 0</code>). </td></tr>
<tr><td class="paramname">toId</td><td>Goal signature id (<code>≠ 0</code>). </td></tr>
<tr><td class="paramname">memory</td><td>Graph memory (must not be null). </td></tr>
<tr><td class="paramname">lookInDatabase</td><td>If true, load links from the database when not already in RAM. </td></tr>
<tr><td class="paramname">updateNewCosts</td><td>If true, allow cost improvements on open nodes. </td></tr>
<tr><td class="paramname">linearVelocity</td><td>If &gt; 0, add <code>translationNorm / linearVelocity</code> to edge cost (m/s). </td></tr>
<tr><td class="paramname">angularVelocity</td><td>If &gt; 0, add rotation time from motion direction change (rad/s). </td></tr>
<tr><td class="paramname">ignoreDirectLinks</td><td>If true, skip the direct edge between <code>fromId</code> and <code>toId</code>. </td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>Returns</dt><dd>Path as <code>(nodeId, pose)</code> pairs; first pose is identity at <code>fromId</code>. Empty if unreachable. </dd></dl>
</div>
</div>
<a id="a3d6e74a018b07cd52151e3e168f6384c" name="a3d6e74a018b07cd52151e3e168f6384c"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a3d6e74a018b07cd52151e3e168f6384c">&#9670;&#160;</a></span>findNearestNode()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">int RTABMAP_CORE_EXPORT rtabmap::graph::findNearestNode </td>
<td>(</td>
<td class="paramtype">const std::map&lt; int, <a class="el" href="classrtabmap_1_1Transform.html">rtabmap::Transform</a> &gt; &amp;&#160;</td>
<td class="paramname"><em>poses</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const <a class="el" href="classrtabmap_1_1Transform.html">rtabmap::Transform</a> &amp;&#160;</td>
<td class="paramname"><em>targetPose</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">float *&#160;</td>
<td class="paramname"><em>distance</em> = <code>0</code>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Id of the nearest pose to <code>targetPose</code>. </p>
<p>Wrapper around <a class="el" href="namespacertabmap_1_1graph.html#a92dfe14b22f897e11bf5bf3f7a7c9157">findNearestNodes()</a> with <code>radius=0</code>, <code>k=1</code> (1-NN in 3D).</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramname">poses</td><td>Nodes to search. </td></tr>
<tr><td class="paramname">targetPose</td><td>Query position (x, y, z only; orientation is not used). </td></tr>
<tr><td class="paramname">distance</td><td>If not null, set to the squared Euclidean distance of the match. </td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>Returns</dt><dd>Closest node id, or <code>0</code> if <code>poses</code> is empty. </dd></dl>
</div>
</div>
<a id="a92dfe14b22f897e11bf5bf3f7a7c9157" name="a92dfe14b22f897e11bf5bf3f7a7c9157"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a92dfe14b22f897e11bf5bf3f7a7c9157">&#9670;&#160;</a></span>findNearestNodes() <span class="overload">[1/3]</span></h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">std::map&lt; int, float &gt; RTABMAP_CORE_EXPORT rtabmap::graph::findNearestNodes </td>
<td>(</td>
<td class="paramtype">int&#160;</td>
<td class="paramname"><em>nodeId</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const std::map&lt; int, <a class="el" href="classrtabmap_1_1Transform.html">Transform</a> &gt; &amp;&#160;</td>
<td class="paramname"><em>poses</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">float&#160;</td>
<td class="paramname"><em>radius</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">float&#160;</td>
<td class="paramname"><em>angle</em> = <code>0.0f</code>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int&#160;</td>
<td class="paramname"><em>k</em> = <code>0</code>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Spatial neighbors of a node (KD-tree radius or k-NN search). </p>
<p><code>nodeId</code> is removed from the search set. Requires <code>radius &amp;gt; 0</code> or <code>k &amp;gt; 0</code>. When <code>radius &amp;gt; 0</code>, returns all poses within <code>radius</code> (up to <code>k</code> if <code>k &amp;gt; 0</code>). When <code>radius == 0</code>, returns the <code>k</code> nearest neighbors.</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramname">nodeId</td><td>Query node (must exist in <code>poses</code>); excluded from results. </td></tr>
<tr><td class="paramname">poses</td><td>Candidate poses. </td></tr>
<tr><td class="paramname">radius</td><td>Search radius (m). </td></tr>
<tr><td class="paramname">angle</td><td>Max +X axis angle difference (rad); <code>0</code> ignores heading. </td></tr>
<tr><td class="paramname">k</td><td>Max neighbors (<code>0</code> = all within radius). </td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>Returns</dt><dd>Neighbor id → squared Euclidean distance. </dd></dl>
</div>
</div>
<a id="a70a5f4b17aa3bb54cad151c9f290ff7f" name="a70a5f4b17aa3bb54cad151c9f290ff7f"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a70a5f4b17aa3bb54cad151c9f290ff7f">&#9670;&#160;</a></span>findNearestNodes() <span class="overload">[2/3]</span></h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">std::map&lt; int, float &gt; RTABMAP_CORE_EXPORT rtabmap::graph::findNearestNodes </td>
<td>(</td>
<td class="paramtype">const <a class="el" href="classrtabmap_1_1Transform.html">Transform</a> &amp;&#160;</td>
<td class="paramname"><em>targetPose</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const std::map&lt; int, <a class="el" href="classrtabmap_1_1Transform.html">Transform</a> &gt; &amp;&#160;</td>
<td class="paramname"><em>poses</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">float&#160;</td>
<td class="paramname"><em>radius</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">float&#160;</td>
<td class="paramname"><em>angle</em> = <code>0.0f</code>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int&#160;</td>
<td class="paramname"><em>k</em> = <code>0</code>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Spatial neighbors of a pose (KD-tree radius or k-NN search). </p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramname">targetPose</td><td>Query pose (position used; orientation used when <code>angle</code> &gt; 0). </td></tr>
<tr><td class="paramname">poses</td><td>Candidate poses (not modified). </td></tr>
<tr><td class="paramname">radius</td><td>Search radius (m). </td></tr>
<tr><td class="paramname">angle</td><td>Max +X axis angle difference (rad); <code>0</code> ignores heading. </td></tr>
<tr><td class="paramname">k</td><td>Max neighbors (<code>0</code> = all within radius). </td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>Returns</dt><dd>Neighbor id → squared Euclidean distance. </dd></dl>
</div>
</div>
<a id="a236de727a38e51699fe73ff61b459d95" name="a236de727a38e51699fe73ff61b459d95"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a236de727a38e51699fe73ff61b459d95">&#9670;&#160;</a></span>findNearestPoses()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">std::map&lt; int, <a class="el" href="classrtabmap_1_1Transform.html">Transform</a> &gt; RTABMAP_CORE_EXPORT rtabmap::graph::findNearestPoses </td>
<td>(</td>
<td class="paramtype">const <a class="el" href="classrtabmap_1_1Transform.html">Transform</a> &amp;&#160;</td>
<td class="paramname"><em>targetPose</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const std::map&lt; int, <a class="el" href="classrtabmap_1_1Transform.html">Transform</a> &gt; &amp;&#160;</td>
<td class="paramname"><em>poses</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">float&#160;</td>
<td class="paramname"><em>radius</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">float&#160;</td>
<td class="paramname"><em>angle</em> = <code>0.0f</code>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int&#160;</td>
<td class="paramname"><em>k</em> = <code>0</code>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>This is an overloaded member function, provided for convenience. It differs from the above function only in what argument(s) it accepts. Query by <a class="el" href="classrtabmap_1_1Transform.html">Transform</a> instead of node id. </p>
</div>
</div>
<a id="a52dbbfb5099e97699f2ead9139891a5f" name="a52dbbfb5099e97699f2ead9139891a5f"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a52dbbfb5099e97699f2ead9139891a5f">&#9670;&#160;</a></span>findNearestNodes() <span class="overload">[3/3]</span></h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">RTABMAP_DEPRECATED std::map&lt; int, float &gt; RTABMAP_CORE_EXPORT rtabmap::graph::findNearestNodes </td>
<td>(</td>
<td class="paramtype">const std::map&lt; int, <a class="el" href="classrtabmap_1_1Transform.html">rtabmap::Transform</a> &gt; &amp;&#160;</td>
<td class="paramname"><em>nodes</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const <a class="el" href="classrtabmap_1_1Transform.html">rtabmap::Transform</a> &amp;&#160;</td>
<td class="paramname"><em>targetPose</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int&#160;</td>
<td class="paramname"><em>k</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<dl class="deprecated"><dt><b><a class="el" href="deprecated.html#_deprecated000001">Deprecated:</a></b></dt><dd>Use <a class="el" href="namespacertabmap_1_1graph.html#a70a5f4b17aa3bb54cad151c9f290ff7f">findNearestNodes(const Transform&amp;,const std::map&lt;int,Transform&gt;&amp;,float,float,int)</a> with <code>radius=0</code>, <code>k</code> set. </dd></dl>
</div>
</div>
<a id="af9e81a0b31730adb292591b79f45c87e" name="af9e81a0b31730adb292591b79f45c87e"></a>
<h2 class="memtitle"><span class="permalink"><a href="#af9e81a0b31730adb292591b79f45c87e">&#9670;&#160;</a></span>getNodesInRadius() <span class="overload">[1/2]</span></h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">RTABMAP_DEPRECATED std::map&lt; int, float &gt; RTABMAP_CORE_EXPORT rtabmap::graph::getNodesInRadius </td>
<td>(</td>
<td class="paramtype">int&#160;</td>
<td class="paramname"><em>nodeId</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const std::map&lt; int, <a class="el" href="classrtabmap_1_1Transform.html">Transform</a> &gt; &amp;&#160;</td>
<td class="paramname"><em>nodes</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">float&#160;</td>
<td class="paramname"><em>radius</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<dl class="deprecated"><dt><b><a class="el" href="deprecated.html#_deprecated000002">Deprecated:</a></b></dt><dd>Use <a class="el" href="namespacertabmap_1_1graph.html#a92dfe14b22f897e11bf5bf3f7a7c9157">findNearestNodes(int,const std::map&lt;int,Transform&gt;&amp;,float,float,int)</a>. </dd></dl>
</div>
</div>
<a id="a4f7f712868babb4cc74f7fe2cc366620" name="a4f7f712868babb4cc74f7fe2cc366620"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a4f7f712868babb4cc74f7fe2cc366620">&#9670;&#160;</a></span>getNodesInRadius() <span class="overload">[2/2]</span></h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">RTABMAP_DEPRECATED std::map&lt; int, float &gt; RTABMAP_CORE_EXPORT rtabmap::graph::getNodesInRadius </td>
<td>(</td>
<td class="paramtype">const <a class="el" href="classrtabmap_1_1Transform.html">Transform</a> &amp;&#160;</td>
<td class="paramname"><em>targetPose</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const std::map&lt; int, <a class="el" href="classrtabmap_1_1Transform.html">Transform</a> &gt; &amp;&#160;</td>
<td class="paramname"><em>nodes</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">float&#160;</td>
<td class="paramname"><em>radius</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<dl class="deprecated"><dt><b><a class="el" href="deprecated.html#_deprecated000003">Deprecated:</a></b></dt><dd>Use <a class="el" href="namespacertabmap_1_1graph.html#a70a5f4b17aa3bb54cad151c9f290ff7f">findNearestNodes(const Transform&amp;,const std::map&lt;int,Transform&gt;&amp;,float,float,int)</a>. </dd></dl>
</div>
</div>
<a id="ae487257302634dff8248188e2ed69043" name="ae487257302634dff8248188e2ed69043"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ae487257302634dff8248188e2ed69043">&#9670;&#160;</a></span>getPosesInRadius() <span class="overload">[1/2]</span></h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">RTABMAP_DEPRECATED std::map&lt; int, <a class="el" href="classrtabmap_1_1Transform.html">Transform</a> &gt; RTABMAP_CORE_EXPORT rtabmap::graph::getPosesInRadius </td>
<td>(</td>
<td class="paramtype">int&#160;</td>
<td class="paramname"><em>nodeId</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const std::map&lt; int, <a class="el" href="classrtabmap_1_1Transform.html">Transform</a> &gt; &amp;&#160;</td>
<td class="paramname"><em>nodes</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">float&#160;</td>
<td class="paramname"><em>radius</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">float&#160;</td>
<td class="paramname"><em>angle</em> = <code>0.0f</code>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<dl class="deprecated"><dt><b><a class="el" href="deprecated.html#_deprecated000004">Deprecated:</a></b></dt><dd>Use <a class="el" href="namespacertabmap_1_1graph.html#a8cd823f440a4512407ef78d76ff1dbbf">findNearestPoses(int,const std::map&lt;int,Transform&gt;&amp;,float,float,int)</a>. </dd></dl>
</div>
</div>
<a id="a0851e81af5d331032ec790a10bb4302f" name="a0851e81af5d331032ec790a10bb4302f"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a0851e81af5d331032ec790a10bb4302f">&#9670;&#160;</a></span>getPosesInRadius() <span class="overload">[2/2]</span></h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">RTABMAP_DEPRECATED std::map&lt; int, <a class="el" href="classrtabmap_1_1Transform.html">Transform</a> &gt; RTABMAP_CORE_EXPORT rtabmap::graph::getPosesInRadius </td>
<td>(</td>
<td class="paramtype">const <a class="el" href="classrtabmap_1_1Transform.html">Transform</a> &amp;&#160;</td>
<td class="paramname"><em>targetPose</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const std::map&lt; int, <a class="el" href="classrtabmap_1_1Transform.html">Transform</a> &gt; &amp;&#160;</td>
<td class="paramname"><em>nodes</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">float&#160;</td>
<td class="paramname"><em>radius</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">float&#160;</td>
<td class="paramname"><em>angle</em> = <code>0.0f</code>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<dl class="deprecated"><dt><b><a class="el" href="deprecated.html#_deprecated000005">Deprecated:</a></b></dt><dd>Use <a class="el" href="namespacertabmap_1_1graph.html#a236de727a38e51699fe73ff61b459d95">findNearestPoses(const Transform&amp;,const std::map&lt;int,Transform&gt;&amp;,float,float,int)</a>. </dd></dl>
</div>
</div>
<a id="a3cd2009752bc8e39ec00f7f08cfd4a39" name="a3cd2009752bc8e39ec00f7f08cfd4a39"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a3cd2009752bc8e39ec00f7f08cfd4a39">&#9670;&#160;</a></span>computePathLength() <span class="overload">[1/2]</span></h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">float RTABMAP_CORE_EXPORT rtabmap::graph::computePathLength </td>
<td>(</td>
<td class="paramtype">const std::vector&lt; std::pair&lt; int, <a class="el" href="classrtabmap_1_1Transform.html">Transform</a> &gt; &gt; &amp;&#160;</td>
<td class="paramname"><em>path</em></td><td>)</td>
<td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Path length along an ordered list of poses. </p>
<p>Sums <code>path[i].second.getDistance(path[i+1].second)</code> for consecutive entries.</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramname">path</td><td>Ordered <code>(nodeId, pose)</code> pairs. </td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>Returns</dt><dd>Total length (m), or <code>0</code> if fewer than two poses. </dd></dl>
</div>
</div>
<a id="a14376d7f2365ab41e5c361876c999277" name="a14376d7f2365ab41e5c361876c999277"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a14376d7f2365ab41e5c361876c999277">&#9670;&#160;</a></span>computePathLength() <span class="overload">[2/2]</span></h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">float RTABMAP_CORE_EXPORT rtabmap::graph::computePathLength </td>
<td>(</td>
<td class="paramtype">const std::map&lt; int, <a class="el" href="classrtabmap_1_1Transform.html">Transform</a> &gt; &amp;&#160;</td>
<td class="paramname"><em>path</em></td><td>)</td>
<td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Path length in map iteration order. </p>
<p>Sums distances between consecutive poses in ascending map key order (does not verify that entries form a connected path in the graph).</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramname">path</td><td>Poses keyed by node id (sorted by key). </td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>Returns</dt><dd>Total length (m), or <code>0</code> if fewer than two poses. </dd></dl>
</div>
</div>
<a id="a0a04ab5289c258725555d6c18a076094" name="a0a04ab5289c258725555d6c18a076094"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a0a04ab5289c258725555d6c18a076094">&#9670;&#160;</a></span>getPaths()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">std::list&lt; std::map&lt; int, <a class="el" href="classrtabmap_1_1Transform.html">Transform</a> &gt; &gt; RTABMAP_CORE_EXPORT rtabmap::graph::getPaths </td>
<td>(</td>
<td class="paramtype">std::map&lt; int, <a class="el" href="classrtabmap_1_1Transform.html">Transform</a> &gt;&#160;</td>
<td class="paramname"><em>poses</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const std::multimap&lt; int, <a class="el" href="classrtabmap_1_1Link.html">Link</a> &gt; &amp;&#160;</td>
<td class="paramname"><em>links</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Splits poses into chains connected only by neighbor links. </p>
<p>Repeatedly builds a path starting from the lowest remaining id: adds the next pose in map order only if a <a class="el" href="classrtabmap_1_1Link.html#a925bb7ca93eb95a3a873b0a9e8d5e91ea8f60efd83d5fad3493573bef3d4a8adf">Link::kNeighbor</a> or <a class="el" href="classrtabmap_1_1Link.html#a925bb7ca93eb95a3a873b0a9e8d5e91ea8fbb6dbe2d16e19ad8fecb6bac65e9db">Link::kNeighborMerged</a> link exists from the previous pose to it. Stops at the first gap, pushes the chain, and continues until <code>poses</code> is empty.</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramname">poses</td><td>Input poses (cleared as segments are extracted). </td></tr>
<tr><td class="paramname">links</td><td>Graph constraints keyed by source id. </td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>Returns</dt><dd>List of pose maps, each a contiguous neighbor chain. </dd></dl>
</div>
</div>
<a id="a39f8c9011cb5b7652003df9275c88410" name="a39f8c9011cb5b7652003df9275c88410"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a39f8c9011cb5b7652003df9275c88410">&#9670;&#160;</a></span>computeMinMax()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void RTABMAP_CORE_EXPORT rtabmap::graph::computeMinMax </td>
<td>(</td>
<td class="paramtype">const std::map&lt; int, <a class="el" href="classrtabmap_1_1Transform.html">Transform</a> &gt; &amp;&#160;</td>
<td class="paramname"><em>poses</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">cv::Vec3f &amp;&#160;</td>
<td class="paramname"><em>min</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">cv::Vec3f &amp;&#160;</td>
<td class="paramname"><em>max</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Axis-aligned bounding box of pose positions. </p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramname">poses</td><td>Input poses (no effect if empty). </td></tr>
<tr><td class="paramname">min</td><td>Output minimum (x, y, z) in meters. </td></tr>
<tr><td class="paramname">max</td><td>Output maximum (x, y, z) in meters. </td></tr>
</table>
</dd>
</dl>
</div>
</div>
</div><!-- contents -->
</div><!-- doc-content -->
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
<ul>
<li class="navelem"><a class="el" href="namespacertabmap.html">rtabmap</a></li><li class="navelem"><a class="el" href="namespacertabmap_1_1graph.html">graph</a></li>
<li class="footer">Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.8 </li>
</ul>
</div>
</body>
</html>