ndt_mcl.h
Go to the documentation of this file.
00001 #ifndef NDT_MCL_HPP_
00002 #define NDT_MCL_HPP_
00003 //#include <pcl/ros/conversions.h> deprecated
00004 #include <pcl/conversions.h> 
00005 #include <pcl/point_cloud.h>
00006 #include <pcl/io/pcd_io.h>
00007 #include <pcl/point_types.h>
00008 #include <tf_conversions/tf_eigen.h>
00009 #include <cstdio>
00010 #include <Eigen/Eigen>
00011 #include <Eigen/Geometry>
00012 #include <fstream>
00013 
00014 #include <ndt_map/ndt_map.h>
00015 #include <ndt_map/ndt_cell.h>
00016 #include <ndt_map/pointcloud_utils.h>
00017 
00018 #include "ndt_mcl/CParticleFilter.h"
00022 class NDTMCL{
00023     public:
00024         lslgeneric::NDTMap map;                 
00025         mcl::CParticleFilter pf;                                                
00026         double resolution;
00027         int counter;
00028         double zfilt_min;
00029         bool forceSIR;
00033         NDTMCL(double map_resolution, lslgeneric::NDTMap &nd_map, double zfilter):
00034             map(new lslgeneric::LazyGrid(map_resolution))
00035         {
00036             isInit = false;
00037             forceSIR = false;
00038             resolution=map_resolution;
00039             counter = 0;
00040             zfilt_min = zfilter;
00041             sinceSIR = 0;
00044             double cx,cy,cz;
00045             if(!nd_map.getCentroid(cx, cy, cz)){
00046                 fprintf(stderr,"Centroid NOT Given-abort!\n");
00047                 exit(1);
00048             }else{
00049                 fprintf(stderr,"Centroid(%lf,%lf,%lf)\n",cx,cy,cz);
00050             }
00051 
00052             double wx,wy,wz;
00053 
00054             if(!nd_map.getGridSizeInMeters(wx, wy, wz)){
00055                 fprintf(stderr,"Grid size NOT Given-abort!\n");
00056                 exit(1);
00057             }else{
00058                 fprintf(stderr,"GridSize(%lf,%lf,%lf)\n",wx,wy,wz);
00059             }
00060 
00061             map.initialize(cx,cy,cz,wx,wy,wz);
00062 
00063             std::vector<lslgeneric::NDTCell*> ndts;
00064             ndts = nd_map.getAllCells();
00065             fprintf(stderr,"NDT MAP with %u components",ndts.size());
00066             for(unsigned int i=0;i<ndts.size();i++){
00067                 Eigen::Vector3d m = ndts[i]->getMean(); 
00068                 if(m[2]>zfilter){
00069                     Eigen::Matrix3d cov = ndts[i]->getCov();
00070                     unsigned int nump = ndts[i]->getN();
00071                     //fprintf(stderr,"-%d-",nump);
00072                     map.addDistributionToCell(cov, m,nump);
00073                 }
00074             }
00075         }
00076 
00081         void initializeFilter(double x, double y, double yaw,double x_e, double y_e, double yaw_e, int numParticles){
00082             pf.initializeNormalRandom(mcl::pose(x,y,yaw), mcl::pose(x_e,y_e,yaw_e),numParticles);
00083         }
00084 
00085         void updateAndPredict(Eigen::Affine3d Tmotion, pcl::PointCloud<pcl::PointXYZ> &cloud); 
00086 
00087         Eigen::Vector3d getMean(){
00088             mcl::pose m = pf.getDistributionMean(true);
00089             Eigen::Vector3d mm; mm<<m.x,m.y,m.a;
00090             return mm;
00091         }
00092 
00093 
00094     private:
00095         bool isInit;
00096         int sinceSIR;
00097         Eigen::Affine3d getAsAffine(int i){
00098             Eigen::Matrix3d m;
00099             m = Eigen::AngleAxisd(0, Eigen::Vector3d::UnitX())
00100                 * Eigen::AngleAxisd(0, Eigen::Vector3d::UnitY())
00101                 * Eigen::AngleAxisd(pf.Particles[i].a, Eigen::Vector3d::UnitZ());
00102             Eigen::Translation3d v(pf.Particles[i].x,pf.Particles[i].y,0);
00103             Eigen::Affine3d T = v*m;
00104             return T;
00105         }
00106 
00107 };
00108 
00109 #endif
00110 


ndt_mcl
Author(s): Jari Saarinen
autogenerated on Wed Aug 26 2015 15:25:02