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 CRawlog_H
00029 #define CRawlog_H
00030
00031 #include <mrpt/poses/CPose2D.h>
00032 #include <mrpt/slam/CSensoryFrame.h>
00033 #include <mrpt/slam/CActionCollection.h>
00034 #include <mrpt/slam/CObservationComment.h>
00035
00036 namespace mrpt
00037 {
00038 namespace slam
00039 {
00040 DEFINE_SERIALIZABLE_PRE( CRawlog )
00041
00042 using namespace mrpt::utils;
00043
00044 typedef std::pair<mrpt::system::TTimeStamp, CObservationPtr> TTimeObservationPair;
00045 typedef std::multimap<mrpt::system::TTimeStamp, CObservationPtr> TListTimeAndObservations;
00046
00047
00069 class MRPTDLLIMPEXP CRawlog : public mrpt::utils::CSerializable
00070 {
00071
00072 DEFINE_SERIALIZABLE( CRawlog )
00073
00074 private:
00075 typedef std::deque<CSerializablePtr> TListObjects;
00076 TListObjects m_seqOfActObs;
00077
00078 CObservationComment m_commentTexts;
00079
00080 public:
00081
00082 void getCommentText( std::string &t) const;
00083 void setCommentText( const std::string &t);
00084
00088 enum TEntryType
00089 {
00090 etSensoryFrame = 0,
00091 etActionCollection,
00092 etObservation
00093 };
00094
00097 CRawlog();
00098
00102
00103
00104
00107 virtual ~CRawlog();
00108
00111 void clear();
00112
00115 void clearWithoutDelete();
00116
00120 void addAction( CAction &action );
00121
00125 void addActions( CActionCollection &action );
00126
00130 void addObservations( CSensoryFrame &observations );
00131
00135 void addActionsMemoryReference( const CActionCollectionPtr &action );
00136
00140 void addObservationsMemoryReference( const CSensoryFramePtr &observations );
00141
00145 void addObservationMemoryReference( const CObservationPtr &observation );
00146
00152 bool loadFromRawLogFile( const std::string &fileName );
00153
00158 bool saveToRawLogFile( const std::string &fileName );
00159
00162 size_t size();
00163
00169 MRPT_DEPRECATED_PRE bool isAction( size_t index ) MRPT_DEPRECATED_POST;
00170
00174 TEntryType getType( size_t index ) const;
00175
00179 void remove( size_t index );
00180
00186 CActionCollectionPtr getAsAction( size_t index );
00187
00193 CSensoryFramePtr getAsObservations( size_t index );
00194
00199 CSerializablePtr getAsGeneric( size_t index );
00200
00207 CObservationPtr getAsObservation( size_t index );
00208
00209
00212 class iterator
00213 {
00214 protected:
00215 TListObjects::iterator m_it;
00216
00217 public:
00218 iterator() : m_it() { }
00219 iterator(const TListObjects::iterator& it) : m_it(it) { }
00220 virtual ~iterator() { }
00221
00222 iterator & operator = (const iterator& o) { m_it = o.m_it; return *this; }
00223
00224 bool operator == (const iterator& o) { return m_it == o.m_it; }
00225 bool operator != (const iterator& o) { return m_it != o.m_it; }
00226
00227 CSerializablePtr operator *() { return *m_it; }
00228
00229 iterator operator ++(int) { m_it++; return *this; }
00230 iterator operator --(int) { m_it--; return *this; }
00231
00232 MRPT_DEPRECATED_PRE bool isAction() const MRPT_DEPRECATED_POST { return (*m_it)->GetRuntimeClass()->derivedFrom( CLASS_ID(CActionCollection) ); }
00233 MRPT_DEPRECATED_PRE bool isObservation() const MRPT_DEPRECATED_POST { return (*m_it)->GetRuntimeClass()->derivedFrom( CLASS_ID(CSensoryFrame) ); }
00234
00235 TEntryType getType() const
00236 {
00237 if ( (*m_it)->GetRuntimeClass()->derivedFrom( CLASS_ID(CObservation) ) )
00238 return etObservation;
00239 else if ( (*m_it)->GetRuntimeClass()->derivedFrom( CLASS_ID(CSensoryFrame) ) )
00240 return etSensoryFrame;
00241 else
00242 return etActionCollection;
00243 }
00244
00245 static iterator erase( TListObjects& lst, const iterator &it) { return lst.erase(it.m_it); }
00246 };
00247
00250 class const_iterator
00251 {
00252 protected:
00253 TListObjects::const_iterator m_it;
00254
00255 public:
00256 const_iterator() : m_it() { }
00257 const_iterator(const TListObjects::const_iterator& it) : m_it(it) { }
00258 virtual ~const_iterator() { }
00259
00260 bool operator == (const const_iterator& o) { return m_it == o.m_it; }
00261 bool operator != (const const_iterator& o) { return m_it != o.m_it; }
00262
00263 const CSerializablePtr operator *() const { return *m_it; }
00264
00265 const_iterator operator ++(int) { m_it++; return *this; }
00266 const_iterator operator --(int) { m_it--; return *this; }
00267
00268 MRPT_DEPRECATED_PRE bool isAction() const MRPT_DEPRECATED_POST { return (*m_it)->GetRuntimeClass()->derivedFrom( CLASS_ID(CActionCollection) ); }
00269 MRPT_DEPRECATED_PRE bool isObservation() const MRPT_DEPRECATED_POST { return (*m_it)->GetRuntimeClass()->derivedFrom( CLASS_ID(CSensoryFrame) ); }
00270
00271 TEntryType getType() const
00272 {
00273 if ( (*m_it)->GetRuntimeClass()->derivedFrom( CLASS_ID(CObservation) ) )
00274 return etObservation;
00275 else if ( (*m_it)->GetRuntimeClass()->derivedFrom( CLASS_ID(CSensoryFrame) ) )
00276 return etSensoryFrame;
00277 else
00278 return etActionCollection;
00279 }
00280
00281 };
00282
00283
00284 const_iterator begin() const { return m_seqOfActObs.begin(); }
00285 iterator begin() { return m_seqOfActObs.begin(); }
00286 const_iterator end() const { return m_seqOfActObs.end(); }
00287 iterator end() { return m_seqOfActObs.end(); }
00288
00289 iterator erase(const iterator &it) { return iterator::erase(m_seqOfActObs, it); }
00290
00295 void findObservationsByClassInRange(
00296 mrpt::system::TTimeStamp time_start,
00297 mrpt::system::TTimeStamp time_end,
00298 const mrpt::utils::TRuntimeClassId *class_type,
00299 TListTimeAndObservations &out_found,
00300 size_t guess_start_position = 0
00301 ) const;
00302
00303
00306 void moveFrom( CRawlog &obj);
00307
00310 void swap( CRawlog &obj);
00311
00319 static bool readActionObservationPair(
00320 CStream &inStream,
00321 CActionCollectionPtr &action,
00322 CSensoryFramePtr &observations,
00323 size_t & rawlogEntry );
00324
00332 bool getActionObservationPair(
00333 CActionCollectionPtr &action,
00334 CSensoryFramePtr &observations,
00335 size_t &rawlogEntry );
00336
00337
00338 };
00339
00340 }
00341 }
00342
00343 #endif