<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1"> <title>CRejectionSamplingRangeOnlyLocalization.h Source File</title> <link href="doxygen.css" rel="stylesheet" type="text/css"> <link href="tabs.css" rel="stylesheet" type="text/css"> </head><body> <div align="left"><a href="http://www.mrpt.org/">Main MRPT website</a> > <b>C++ reference</b> </div> <div align="right"> <a href="index.html"><img border="0" src="mrpt_logo.png" alt="MRPT logo"></a> </div> <!-- Generated by Doxygen 1.7.5 --> <script type="text/javascript"> var searchBox = new SearchBox("searchBox", "search",false,'Search'); </script> <div id="navrow1" class="tabs"> <ul class="tablist"> <li><a href="index.html"><span>Main Page</span></a></li> <li><a href="pages.html"><span>Related Pages</span></a></li> <li><a href="modules.html"><span>Modules</span></a></li> <li><a href="namespaces.html"><span>Namespaces</span></a></li> <li><a href="annotated.html"><span>Classes</span></a></li> <li class="current"><a href="files.html"><span>Files</span></a></li> <li> <div id="MSearchBox" class="MSearchBoxInactive"> <div class="left"> <form id="FSearchBox" action="search.php" method="get"> <img id="MSearchSelect" src="search/mag.png" alt=""/> <input type="text" id="MSearchField" name="query" value="Search" size="20" accesskey="S" onfocus="searchBox.OnSearchFieldFocus(true)" onblur="searchBox.OnSearchFieldFocus(false)"/> </form> </div><div class="right"></div> </div> </li> </ul> </div> <div id="navrow2" class="tabs2"> <ul class="tablist"> <li><a href="files.html"><span>File List</span></a></li> <li><a href="globals.html"><span>File Members</span></a></li> </ul> </div> <div class="header"> <div class="headertitle"> <div class="title">CRejectionSamplingRangeOnlyLocalization.h</div> </div> </div> <div class="contents"> <a href="_c_rejection_sampling_range_only_localization_8h.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/* +---------------------------------------------------------------------------+</span> <a name="l00002"></a>00002 <span class="comment"> | The Mobile Robot Programming Toolkit (MRPT) C++ library |</span> <a name="l00003"></a>00003 <span class="comment"> | |</span> <a name="l00004"></a>00004 <span class="comment"> | http://www.mrpt.org/ |</span> <a name="l00005"></a>00005 <span class="comment"> | |</span> <a name="l00006"></a>00006 <span class="comment"> | Copyright (C) 2005-2011 University of Malaga |</span> <a name="l00007"></a>00007 <span class="comment"> | |</span> <a name="l00008"></a>00008 <span class="comment"> | This software was written by the Machine Perception and Intelligent |</span> <a name="l00009"></a>00009 <span class="comment"> | Robotics Lab, University of Malaga (Spain). |</span> <a name="l00010"></a>00010 <span class="comment"> | Contact: Jose-Luis Blanco <jlblanco@ctima.uma.es> |</span> <a name="l00011"></a>00011 <span class="comment"> | |</span> <a name="l00012"></a>00012 <span class="comment"> | This file is part of the MRPT project. |</span> <a name="l00013"></a>00013 <span class="comment"> | |</span> <a name="l00014"></a>00014 <span class="comment"> | MRPT is free software: you can redistribute it and/or modify |</span> <a name="l00015"></a>00015 <span class="comment"> | it under the terms of the GNU General Public License as published by |</span> <a name="l00016"></a>00016 <span class="comment"> | the Free Software Foundation, either version 3 of the License, or |</span> <a name="l00017"></a>00017 <span class="comment"> | (at your option) any later version. |</span> <a name="l00018"></a>00018 <span class="comment"> | |</span> <a name="l00019"></a>00019 <span class="comment"> | MRPT is distributed in the hope that it will be useful, |</span> <a name="l00020"></a>00020 <span class="comment"> | but WITHOUT ANY WARRANTY; without even the implied warranty of |</span> <a name="l00021"></a>00021 <span class="comment"> | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |</span> <a name="l00022"></a>00022 <span class="comment"> | GNU General Public License for more details. |</span> <a name="l00023"></a>00023 <span class="comment"> | |</span> <a name="l00024"></a>00024 <span class="comment"> | You should have received a copy of the GNU General Public License |</span> <a name="l00025"></a>00025 <span class="comment"> | along with MRPT. If not, see <http://www.gnu.org/licenses/>. |</span> <a name="l00026"></a>00026 <span class="comment"> | |</span> <a name="l00027"></a>00027 <span class="comment"> +---------------------------------------------------------------------------+ */</span> <a name="l00028"></a>00028 <span class="preprocessor">#ifndef CRejectionSamplingRangeOnlyLocalization_H</span> <a name="l00029"></a>00029 <span class="preprocessor"></span><span class="preprocessor">#define CRejectionSamplingRangeOnlyLocalization_H</span> <a name="l00030"></a>00030 <span class="preprocessor"></span> <a name="l00031"></a>00031 <span class="preprocessor">#include <<a class="code" href="_c_pose2_d_8h.html">mrpt/poses/CPose2D.h</a>></span> <a name="l00032"></a>00032 <span class="preprocessor">#include <<a class="code" href="_c_point3_d_8h.html">mrpt/poses/CPoint3D.h</a>></span> <a name="l00033"></a>00033 <span class="preprocessor">#include <<a class="code" href="_c_point2_d_8h.html">mrpt/poses/CPoint2D.h</a>></span> <a name="l00034"></a>00034 <span class="preprocessor">#include <<a class="code" href="_c_rejection_sampling_capable_8h.html">mrpt/bayes/CRejectionSamplingCapable.h</a>></span> <a name="l00035"></a>00035 <span class="preprocessor">#include <<a class="code" href="lightweight__geom__data_8h.html">mrpt/math/lightweight_geom_data.h</a>></span> <a name="l00036"></a>00036 <a name="l00037"></a>00037 <span class="preprocessor">#include <<a class="code" href="slam_2include_2mrpt_2slam_2link__pragmas_8h.html">mrpt/slam/link_pragmas.h</a>></span> <a name="l00038"></a>00038 <a name="l00039"></a>00039 <span class="keyword">namespace </span>mrpt <a name="l00040"></a>00040 { <a name="l00041"></a>00041 <span class="keyword">namespace </span>slam <a name="l00042"></a>00042 { <a name="l00043"></a>00043 <span class="keyword">using namespace </span>mrpt::poses; <a name="l00044"></a>00044 <span class="keyword">using namespace </span>mrpt::math; <a name="l00045"></a>00045 <a name="l00046"></a>00046 <span class="keyword">class </span>CLandmarksMap; <a name="l00047"></a>00047 <span class="keyword">class </span>CObservationBeaconRanges; <a name="l00048"></a>00048 <span class="comment"></span> <a name="l00049"></a>00049 <span class="comment"> /** An implementation of rejection sampling for generating 2D robot pose from range-only measurements within a landmarks (beacons) map.</span> <a name="l00050"></a>00050 <span class="comment"> * Before calling the method "rejectionSampling" to generate the samples, you must call "setParams".</span> <a name="l00051"></a>00051 <span class="comment"> * It is assumed a planar scenario, where the robot is at a fixed height (default=0).</span> <a name="l00052"></a>00052 <span class="comment"> * \sa bayes::CRejectionSamplingCapable \ingroup mrpt_slam_grp </span> <a name="l00053"></a>00053 <span class="comment"> */</span> <a name="l00054"></a>00054 <span class="keyword">class </span><a class="code" href="slam_2include_2mrpt_2slam_2link__pragmas_8h.html#a26118d9c67fb641718c989b57c9acf64">SLAM_IMPEXP</a> CRejectionSamplingRangeOnlyLocalization : <span class="keyword">public</span> bayes::CRejectionSamplingCapable<poses::CPose2D> <a name="l00055"></a>00055 { <a name="l00056"></a>00056 <a name="l00057"></a>00057 <span class="keyword">public</span>:<span class="comment"></span> <a name="l00058"></a>00058 <span class="comment"> /** Constructor</span> <a name="l00059"></a>00059 <span class="comment"> */</span> <a name="l00060"></a>00060 CRejectionSamplingRangeOnlyLocalization(); <a name="l00061"></a>00061 <span class="comment"></span> <a name="l00062"></a>00062 <span class="comment"> /** Destructor</span> <a name="l00063"></a>00063 <span class="comment"> */</span> <a name="l00064"></a><a class="code" href="classmrpt_1_1slam_1_1_c_rejection_sampling_range_only_localization.html#ae3faa7fa066aa35c773116fa925cf15d">00064</a> <span class="keyword">virtual</span> <a class="code" href="classmrpt_1_1slam_1_1_c_rejection_sampling_range_only_localization.html#ae3faa7fa066aa35c773116fa925cf15d" title="Destructor.">~CRejectionSamplingRangeOnlyLocalization</a>() { } <a name="l00065"></a>00065 <span class="comment"></span> <a name="l00066"></a>00066 <span class="comment"> /** The parameters used in the generation of random samples:</span> <a name="l00067"></a>00067 <span class="comment"> * \param beaconsMap The map containing the N beacons (indexed by their "beacon ID"s). Only the mean 3D position of the beacons is used, the covariance is ignored.</span> <a name="l00068"></a>00068 <span class="comment"> * \param observation An observation with, at least ONE range measurement.</span> <a name="l00069"></a>00069 <span class="comment"> * \param sigmaRanges The standard deviation of the "range measurement noise".</span> <a name="l00070"></a>00070 <span class="comment"> * \param robot_z The height of the robot on the floor (default=0). Note that the beacon sensor on the robot may be at a different height, according to data within the observation object.</span> <a name="l00071"></a>00071 <span class="comment"> * \param autoCheckAngleRanges Whether to make a simple check for potential good angles from the beacons to generate samples (disable to speed-up the preparation vs. making slower the drawn).</span> <a name="l00072"></a>00072 <span class="comment"> * This method fills out the member "m_dataPerBeacon".</span> <a name="l00073"></a>00073 <span class="comment"> * \return true if at least ONE beacon has been successfully loaded, false otherwise. In this case do not call "rejectionSampling" or an exception will be launch, since there is no information to generate samples.</span> <a name="l00074"></a>00074 <span class="comment"> */</span> <a name="l00075"></a>00075 <span class="keywordtype">bool</span> setParams( <a name="l00076"></a>00076 <span class="keyword">const</span> <a class="code" href="classmrpt_1_1slam_1_1_c_landmarks_map.html" title="A class for storing a map of 3D probabilistic landmarks.">CLandmarksMap</a> &beaconsMap, <a name="l00077"></a>00077 <span class="keyword">const</span> <a class="code" href="classmrpt_1_1slam_1_1_c_observation_beacon_ranges.html" title="Declares a class derived from "CObservation" that represents one (or more) range measurements to labe...">CObservationBeaconRanges</a> &observation, <a name="l00078"></a>00078 <span class="keywordtype">float</span> sigmaRanges, <a name="l00079"></a>00079 <span class="keyword">const</span> <a class="code" href="classmrpt_1_1poses_1_1_c_pose2_d.html" title="A class used to store a 2D pose.">CPose2D</a> &oldPose, <a name="l00080"></a>00080 <span class="keywordtype">float</span> robot_z = 0, <a name="l00081"></a>00081 <span class="keywordtype">bool</span> autoCheckAngleRanges = <span class="keyword">true</span>); <a name="l00082"></a>00082 <a name="l00083"></a>00083 <span class="keyword">protected</span>:<span class="comment"></span> <a name="l00084"></a>00084 <span class="comment"> /** Generates one sample, drawing from some proposal distribution.</span> <a name="l00085"></a>00085 <span class="comment"> */</span> <a name="l00086"></a>00086 <span class="keywordtype">void</span> RS_drawFromProposal( <a class="code" href="classmrpt_1_1poses_1_1_c_pose2_d.html" title="A class used to store a 2D pose.">CPose2D</a> &outSample ); <a name="l00087"></a>00087 <span class="comment"></span> <a name="l00088"></a>00088 <span class="comment"> /** Returns the NORMALIZED observation likelihood (linear, not exponential!!!) at a given point of the state space (values in the range [0,1]).</span> <a name="l00089"></a>00089 <span class="comment"> */</span> <a name="l00090"></a>00090 <span class="keywordtype">double</span> RS_observationLikelihood( <span class="keyword">const</span> <a class="code" href="classmrpt_1_1poses_1_1_c_pose2_d.html" title="A class used to store a 2D pose.">CPose2D</a> &x); <a name="l00091"></a>00091 <span class="comment"></span> <a name="l00092"></a>00092 <span class="comment"> /** Z coordinate of the robot.</span> <a name="l00093"></a>00093 <span class="comment"> */</span> <a name="l00094"></a><a class="code" href="classmrpt_1_1slam_1_1_c_rejection_sampling_range_only_localization.html#a4a440d115a0c8fbf2d0ae9cf85748b7d">00094</a> <span class="keywordtype">float</span> <a class="code" href="classmrpt_1_1slam_1_1_c_rejection_sampling_range_only_localization.html#a4a440d115a0c8fbf2d0ae9cf85748b7d" title="Z coordinate of the robot.">m_z_robot</a>; <a name="l00095"></a>00095 <a name="l00096"></a><a class="code" href="classmrpt_1_1slam_1_1_c_rejection_sampling_range_only_localization.html#ad0e510ddb67cf33b95eeea287035dbf4">00096</a> <span class="keywordtype">float</span> <a class="code" href="classmrpt_1_1slam_1_1_c_rejection_sampling_range_only_localization.html#ad0e510ddb67cf33b95eeea287035dbf4">m_sigmaRanges</a>; <a name="l00097"></a><a class="code" href="classmrpt_1_1slam_1_1_c_rejection_sampling_range_only_localization.html#abc282871eefad1761526a6bf5ac868f9">00097</a> <a class="code" href="classmrpt_1_1poses_1_1_c_pose2_d.html" title="A class used to store a 2D pose.">CPose2D</a> <a class="code" href="classmrpt_1_1slam_1_1_c_rejection_sampling_range_only_localization.html#abc282871eefad1761526a6bf5ac868f9">m_oldPose</a>; <a name="l00098"></a>00098 <span class="comment"></span> <a name="l00099"></a>00099 <span class="comment"> /** The index in "m_dataPerBeacon" used to draw samples (the rest will be used to evaluate the likelihood)</span> <a name="l00100"></a>00100 <span class="comment"> */</span> <a name="l00101"></a><a class="code" href="classmrpt_1_1slam_1_1_c_rejection_sampling_range_only_localization.html#ac3c0e5f57f71f9759848f59371e0bb29">00101</a> <span class="keywordtype">size_t</span> <a class="code" href="classmrpt_1_1slam_1_1_c_rejection_sampling_range_only_localization.html#ac3c0e5f57f71f9759848f59371e0bb29" title="The index in "m_dataPerBeacon" used to draw samples (the rest will be used to evaluate the likelihood...">m_drawIndex</a>; <a name="l00102"></a>00102 <span class="comment"></span> <a name="l00103"></a>00103 <span class="comment"> /** Data for each beacon observation with a correspondence with the map.</span> <a name="l00104"></a>00104 <span class="comment"> */</span> <a name="l00105"></a>00105 <span class="keyword">struct </span><a class="code" href="slam_2include_2mrpt_2slam_2link__pragmas_8h.html#a26118d9c67fb641718c989b57c9acf64">SLAM_IMPEXP</a> <a class="code" href="structmrpt_1_1slam_1_1_c_rejection_sampling_range_only_localization_1_1_t_data_per_beacon.html" title="Data for each beacon observation with a correspondence with the map.">TDataPerBeacon</a> <a name="l00106"></a>00106 { <a name="l00107"></a><a class="code" href="structmrpt_1_1slam_1_1_c_rejection_sampling_range_only_localization_1_1_t_data_per_beacon.html#a40df814087601111c2af1e60ffabb62b">00107</a> <a class="code" href="structmrpt_1_1slam_1_1_c_rejection_sampling_range_only_localization_1_1_t_data_per_beacon.html" title="Data for each beacon observation with a correspondence with the map.">TDataPerBeacon</a>() : sensorOnRobot(), beaconPosition(), radiusAtRobotPlane(0),minAngle(0),maxAngle(0) <a name="l00108"></a>00108 {} <a name="l00109"></a>00109 <a name="l00110"></a><a class="code" href="structmrpt_1_1slam_1_1_c_rejection_sampling_range_only_localization_1_1_t_data_per_beacon.html#a139804e2d722cf0870ed5df72ec79214">00110</a> <a class="code" href="structmrpt_1_1math_1_1_t_point3_d.html" title="Lightweight 3D point.">TPoint3D</a> <a class="code" href="structmrpt_1_1slam_1_1_c_rejection_sampling_range_only_localization_1_1_t_data_per_beacon.html#a139804e2d722cf0870ed5df72ec79214">sensorOnRobot</a>; <a name="l00111"></a><a class="code" href="structmrpt_1_1slam_1_1_c_rejection_sampling_range_only_localization_1_1_t_data_per_beacon.html#a04b7c07cfe857be3c0e441e5917abd45">00111</a> <a class="code" href="structmrpt_1_1math_1_1_t_point2_d.html" title="Lightweight 2D point.">TPoint2D</a> <a class="code" href="structmrpt_1_1slam_1_1_c_rejection_sampling_range_only_localization_1_1_t_data_per_beacon.html#a04b7c07cfe857be3c0e441e5917abd45">beaconPosition</a>; <a name="l00112"></a><a class="code" href="structmrpt_1_1slam_1_1_c_rejection_sampling_range_only_localization_1_1_t_data_per_beacon.html#a65a32608669e0d0137f732e3e4e5b0fb">00112</a> <span class="keywordtype">float</span> <a class="code" href="structmrpt_1_1slam_1_1_c_rejection_sampling_range_only_localization_1_1_t_data_per_beacon.html#a65a32608669e0d0137f732e3e4e5b0fb">radiusAtRobotPlane</a>; <a name="l00113"></a><a class="code" href="structmrpt_1_1slam_1_1_c_rejection_sampling_range_only_localization_1_1_t_data_per_beacon.html#a36fa19cf6a6f6f27cd4ae385f39ccc41">00113</a> <span class="keywordtype">float</span> <a class="code" href="structmrpt_1_1slam_1_1_c_rejection_sampling_range_only_localization_1_1_t_data_per_beacon.html#a36fa19cf6a6f6f27cd4ae385f39ccc41">minAngle</a>,maxAngle; <a name="l00114"></a>00114 }; <a name="l00115"></a>00115 <span class="comment"></span> <a name="l00116"></a>00116 <span class="comment"> /** Data for each beacon observation with a correspondence with the map.</span> <a name="l00117"></a>00117 <span class="comment"> */</span> <a name="l00118"></a><a class="code" href="classmrpt_1_1slam_1_1_c_rejection_sampling_range_only_localization.html#a14315a60da41d6abb9cb9a6561f53df5">00118</a> std<a class="code" href="classstd_1_1deque.html">::deque<TDataPerBeacon></a> <a class="code" href="classmrpt_1_1slam_1_1_c_rejection_sampling_range_only_localization.html#a14315a60da41d6abb9cb9a6561f53df5" title="Data for each beacon observation with a correspondence with the map.">m_dataPerBeacon</a>; <a name="l00119"></a>00119 <a name="l00120"></a>00120 }; <a name="l00121"></a>00121 <a name="l00122"></a>00122 } <span class="comment">// End of namespace</span> <a name="l00123"></a>00123 } <span class="comment">// End of namespace</span> <a name="l00124"></a>00124 <a name="l00125"></a>00125 <span class="preprocessor">#endif</span> </pre></div></div> </div> <br><hr><br> <table border="0" width="100%"> <tr> <td> Page generated by <a href="http://www.doxygen.org" target="_blank">Doxygen 1.7.5</a> for MRPT 0.9.5 SVN: at Sun Sep 25 17:20:18 UTC 2011</td><td></td> <td width="100"> </td> <td width="150"> </td></tr> </table> </body></html>