00001 #ifndef NDT_MCL_HPP_
00002 #define NDT_MCL_HPP_
00003
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
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