Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #ifndef CMultiMetricMapPDF_H
00029 #define CMultiMetricMapPDF_H
00030
00031 #include <mrpt/slam/CMultiMetricMap.h>
00032 #include <mrpt/slam/CSimpleMap.h>
00033 #include <mrpt/poses/CPosePDFParticles.h>
00034 #include <mrpt/poses/CPose3DPDFParticles.h>
00035
00036 #include <mrpt/poses/CPoseRandomSampler.h>
00037
00038 #include <mrpt/bayes/CParticleFilterCapable.h>
00039 #include <mrpt/utils/CLoadableOptions.h>
00040 #include <mrpt/slam/CICP.h>
00041
00042 #include <mrpt/slam/PF_implementations_data.h>
00043
00044 #include <mrpt/slam/link_pragmas.h>
00045
00046 namespace mrpt
00047 {
00048 namespace slam
00049 {
00050 DEFINE_SERIALIZABLE_PRE_CUSTOM_BASE_LINKAGE( CRBPFParticleData, mrpt::utils::CSerializable, SLAM_IMPEXP )
00051
00052
00053
00054
00055 class SLAM_IMPEXP CRBPFParticleData : public mrpt::utils::CSerializable
00056 {
00057
00058 DEFINE_SERIALIZABLE( CRBPFParticleData )
00059 public:
00060 CRBPFParticleData( const TSetOfMetricMapInitializers *mapsInitializers = NULL ) :
00061 mapTillNow( mapsInitializers ),
00062 robotPath()
00063 {
00064 }
00065
00066 CMultiMetricMap mapTillNow;
00067 std::deque<TPose3D> robotPath;
00068 };
00069
00070
00071 DEFINE_SERIALIZABLE_PRE_CUSTOM_BASE_LINKAGE( CMultiMetricMapPDF, mrpt::utils::CSerializable, SLAM_IMPEXP )
00072
00073
00074
00075
00076
00077
00078
00079 class SLAM_IMPEXP CMultiMetricMapPDF :
00080 public mrpt::utils::CSerializable,
00081 public mrpt::bayes::CParticleFilterData<CRBPFParticleData>,
00082 public mrpt::bayes::CParticleFilterCapable,
00083 public mrpt::slam::PF_implementation<CRBPFParticleData,CMultiMetricMapPDF>
00084 {
00085 friend class CMetricMapBuilderRBPF;
00086
00087
00088
00089 DEFINE_SERIALIZABLE( CMultiMetricMapPDF )
00090
00091
00092 IMPLEMENT_PARTICLE_FILTER_CAPABLE(CRBPFParticleData);
00093
00094 protected:
00095
00096
00097 void prediction_and_update_pfStandardProposal(
00098 const mrpt::slam::CActionCollection * action,
00099 const mrpt::slam::CSensoryFrame * observation,
00100 const bayes::CParticleFilter::TParticleFilterOptions &PF_options );
00101
00102
00103
00104 void prediction_and_update_pfOptimalProposal(
00105 const mrpt::slam::CActionCollection * action,
00106 const mrpt::slam::CSensoryFrame * observation,
00107 const bayes::CParticleFilter::TParticleFilterOptions &PF_options );
00108
00109
00110
00111 void prediction_and_update_pfAuxiliaryPFOptimal(
00112 const mrpt::slam::CActionCollection * action,
00113 const mrpt::slam::CSensoryFrame * observation,
00114 const bayes::CParticleFilter::TParticleFilterOptions &PF_options );
00115
00116
00117 private:
00118
00119
00120 CMultiMetricMap averageMap;
00121 bool averageMapIsUpdated;
00122
00123
00124
00125 CSimpleMap SFs;
00126
00127
00128
00129 std::vector<uint32_t> SF2robotPath;
00130
00131
00132
00133
00134 float H(float p);
00135
00136 public:
00137
00138
00139
00140
00141
00142 struct SLAM_IMPEXP TPredictionParams : public utils::CLoadableOptions
00143 {
00144
00145
00146 TPredictionParams();
00147
00148
00149
00150 void loadFromConfigFile(
00151 const mrpt::utils::CConfigFileBase &source,
00152 const std::string §ion);
00153
00154
00155
00156 void dumpToTextStream(CStream &out) const;
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166
00167 int pfOptimalProposal_mapSelection;
00168
00169
00170
00171
00172 float ICPGlobalAlign_MinQuality;
00173
00174
00175
00176 COccupancyGridMap2D::TLikelihoodOptions update_gridMapLikelihoodOptions;
00177
00178 TKLDParams KLD_params;
00179
00180 CICP::TConfigParams icp_params;
00181
00182 } options;
00183
00184
00185
00186 CMultiMetricMapPDF(
00187 const bayes::CParticleFilter::TParticleFilterOptions &opts = bayes::CParticleFilter::TParticleFilterOptions(),
00188 const mrpt::slam::TSetOfMetricMapInitializers *mapsInitializers = NULL,
00189 const TPredictionParams *predictionOptions = NULL );
00190
00191
00192
00193 virtual ~CMultiMetricMapPDF();
00194
00195
00196 void clear( const CPose2D &initialPose );
00197
00198
00199 void clear( const CPose3D &initialPose );
00200
00201
00202
00203
00204 void getEstimatedPosePDFAtTime(
00205 size_t timeStep,
00206 CPose3DPDFParticles &out_estimation ) const;
00207
00208
00209
00210
00211 void getEstimatedPosePDF( CPose3DPDFParticles &out_estimation ) const;
00212
00213
00214
00215 CMultiMetricMap * getCurrentMetricMapEstimation( );
00216
00217
00218
00219 CMultiMetricMap * getCurrentMostLikelyMetricMap( );
00220
00221
00222 size_t getNumberOfObservationsInSimplemap() const { return SFs.size(); }
00223
00224
00225
00226
00227 void insertObservation(CSensoryFrame &sf);
00228
00229
00230
00231
00232 void getPath(size_t i, std::deque<math::TPose3D> &out_path) const;
00233
00234
00235
00236 double getCurrentEntropyOfPaths();
00237
00238
00239
00240 double getCurrentJointEntropy();
00241
00242
00243
00244 void updateSensoryFrameSequence();
00245
00246
00247
00248 void saveCurrentPathEstimationToTextFile( const std::string &fil );
00249
00250
00251
00252 float newInfoIndex;
00253
00254 private:
00255
00256
00257 void rebuildAverageMap();
00258
00259
00260
00261
00262 public:
00263
00264
00265
00266
00267 const TPose3D * getLastPose(const size_t i) const;
00268
00269 void PF_SLAM_implementation_custom_update_particle_with_new_pose(
00270 CParticleDataContent *particleData,
00271 const TPose3D &newPose) const;
00272
00273
00274
00275
00276 bool PF_SLAM_implementation_doWeHaveValidObservations(
00277 const CParticleList &particles,
00278 const CSensoryFrame *sf) const;
00279
00280 bool PF_SLAM_implementation_skipRobotMovement() const;
00281
00282
00283 double PF_SLAM_computeObservationLikelihoodForParticle(
00284 const CParticleFilter::TParticleFilterOptions &PF_options,
00285 const size_t particleIndexForMap,
00286 const CSensoryFrame &observation,
00287 const CPose3D &x ) const;
00288
00289
00290
00291 };
00292
00293 }
00294 }
00295
00296 #endif