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 
00029 #ifndef _hectormapproccontainer_h__
00030 #define _hectormapproccontainer_h__
00031 
00032 #include "../map/GridMap.h"
00033 #include "../map/OccGridMapUtilConfig.h"
00034 #include "../matcher/ScanMatcher.h"
00035 #include "../util/MapLockerInterface.h"
00036 
00037 class GridMap;
00038 class ConcreteOccGridMapUtil;
00039 class DataContainer;
00040 
00041 namespace hectorslam{
00042 
00043 class MapProcContainer
00044 {
00045 public:
00046   MapProcContainer(GridMap* gridMapIn, OccGridMapUtilConfig<GridMap>* gridMapUtilIn, ScanMatcher<OccGridMapUtilConfig<GridMap> >* scanMatcherIn)
00047     : gridMap(gridMapIn)
00048     , gridMapUtil(gridMapUtilIn)
00049     , scanMatcher(scanMatcherIn)
00050     , mapMutex(0)
00051   {}
00052 
00053   virtual ~MapProcContainer()
00054   {}
00055 
00056   void cleanup()
00057   {
00058     delete gridMap;
00059     delete gridMapUtil;
00060     delete scanMatcher;
00061 
00062     if (mapMutex){
00063       delete mapMutex;
00064     }
00065   }
00066 
00067   void reset()
00068   {
00069     gridMap->reset();
00070     gridMapUtil->resetCachedData();
00071   }
00072 
00073   void resetCachedData()
00074   {
00075     gridMapUtil->resetCachedData();
00076   }
00077 
00078   float getScaleToMap() const { return gridMap->getScaleToMap(); };
00079 
00080   const GridMap& getGridMap() const { return *gridMap; };
00081   GridMap& getGridMap() { return *gridMap; };
00082 
00083   void addMapMutex(MapLockerInterface* mapMutexIn)
00084   {
00085     if (mapMutex)
00086     {
00087       delete mapMutex;
00088     }
00089 
00090     mapMutex = mapMutexIn;
00091   }
00092 
00093   MapLockerInterface* getMapMutex()
00094   {
00095     return mapMutex;
00096   }
00097 
00098   Eigen::Vector3f matchData(const Eigen::Vector3f& beginEstimateWorld, const DataContainer& dataContainer, Eigen::Matrix3f& covMatrix, int maxIterations)
00099   {
00100     return scanMatcher->matchData(beginEstimateWorld, *gridMapUtil, dataContainer, covMatrix, maxIterations);
00101   }
00102 
00103   void updateByScan(const DataContainer& dataContainer, const Eigen::Vector3f& robotPoseWorld)
00104   {
00105     if (mapMutex)
00106     {
00107       mapMutex->lockMap();
00108     }
00109 
00110     gridMap->updateByScan(dataContainer, robotPoseWorld);
00111 
00112     if (mapMutex)
00113     {
00114       mapMutex->unlockMap();
00115     }
00116   }
00117 
00118   GridMap* gridMap;
00119   OccGridMapUtilConfig<GridMap>* gridMapUtil;
00120   ScanMatcher<OccGridMapUtilConfig<GridMap> >* scanMatcher;
00121   MapLockerInterface* mapMutex;
00122 };
00123 
00124 }
00125 
00126 #endif