#include #include "scanmatcherprocessor.h" #include "eig3.h" //#define SCANMATHCERPROCESSOR_DEBUG namespace GMapping { using namespace std; ScanMatcherProcessor::ScanMatcherProcessor(const ScanMatcherMap& m) : m_map(m.getCenter(), m.getWorldSizeX(), m.getWorldSizeY(), m.getResolution()), m_pose(0,0,0){ m_regScore=300; m_critScore=.5*m_regScore; m_maxMove=1; m_beams=0; m_computeCovariance=false; //m_eigenspace=gsl_eigen_symmv_alloc(3); useICP=false; } ScanMatcherProcessor::ScanMatcherProcessor (double xmin, double ymin, double xmax, double ymax, double delta, double patchdelta): m_map(Point((xmax+xmin)*.5, (ymax+ymin)*.5), xmax-xmin, ymax-ymin, patchdelta), m_pose(0,0,0){ m_regScore=300; m_critScore=.5*m_regScore; m_maxMove=1; m_beams=0; m_computeCovariance=false; //m_eigenspace=gsl_eigen_symmv_alloc(3); useICP=false; } ScanMatcherProcessor::~ScanMatcherProcessor (){ //gsl_eigen_symmv_free(m_eigenspace); } void ScanMatcherProcessor::setSensorMap(const SensorMap& smap, std::string sensorName){ m_sensorMap=smap; /* Construct the angle table for the sensor FIXME has to be extended to more than one laser... */ SensorMap::const_iterator laser_it=m_sensorMap.find(sensorName); assert(laser_it!=m_sensorMap.end()); const RangeSensor* rangeSensor=dynamic_cast((laser_it->second)); assert(rangeSensor && rangeSensor->beams().size()); m_beams=static_cast(rangeSensor->beams().size()); double* angles=new double[rangeSensor->beams().size()]; for (unsigned int i=0; ibeams()[i].pose.theta; } m_matcher.setLaserParameters(m_beams, angles, rangeSensor->getPose()); delete [] angles; } void ScanMatcherProcessor::init(){ m_first=true; m_pose=OrientedPoint(0,0,0); m_count=0; } void ScanMatcherProcessor::processScan(const RangeReading & reading){ /**retireve the position from the reading, and compute the odometry*/ OrientedPoint relPose=reading.getPose(); if (!m_count){ m_odoPose=relPose; } //compute the move in the scan m_matcher //reference frame OrientedPoint move=relPose-m_odoPose; double dth=m_odoPose.theta-m_pose.theta; // cout << "rel-move x="<< move.x << " y=" << move.y << " theta=" << move.theta << endl; double lin_move=move*move; if (lin_move>m_maxMove){ cerr << "Too big jump in the log file: " << lin_move << endl; cerr << "relPose=" << relPose.x << " " <