⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rangereading.cpp

📁 Particle filtering implementation and application to people tracking.
💻 CPP
字号:
#include <iostream>#include <assert.h>#include <values.h>#include "rangereading.h"namespace GMapping{using namespace std;RangeReading::RangeReading(const RangeSensor* rs, double time):	SensorReading(rs,time){}RangeReading::RangeReading(unsigned int n_beams, const double* d, const RangeSensor* rs, double time):	SensorReading(rs,time){	assert(n_beams==rs->beams().size());	resize(n_beams);	for (unsigned int i=0; i<size(); i++)		(*this)[i]=d[i];}RangeReading::~RangeReading(){//	cerr << __PRETTY_FUNCTION__ << ": CAZZZZZZZZZZZZZZZZZZZZOOOOOOOOOOO" << endl;}unsigned int RangeReading::rawView(double* v, double density) const{	if (density==0){		for (unsigned int i=0; i<size(); i++)			v[i]=(*this)[i];	} else {		Point lastPoint(0,0);		uint suppressed=0;		for (unsigned int i=0; i<size(); i++){			const RangeSensor* rs=dynamic_cast<const RangeSensor*>(getSensor());			assert(rs);			Point lp(				cos(rs->beams()[i].pose.theta)*(*this)[i],				sin(rs->beams()[i].pose.theta)*(*this)[i]);			Point dp=lastPoint-lp;			double distance=sqrt(dp*dp);			if (distance<density){				v[i]=MAXDOUBLE;				suppressed++;			}			else{				lastPoint=lp;				v[i]=(*this)[i];			}			//std::cerr<< __PRETTY_FUNCTION__ << std::endl;			//std::cerr<< "suppressed " << suppressed <<"/"<<size() << std::endl;		}	}	return size();};unsigned int RangeReading::activeBeams(double density) const{	if (density==0.)		return size();		int ab=0;	Point lastPoint(0,0);	uint suppressed=0;	for (unsigned int i=0; i<size(); i++){		const RangeSensor* rs=dynamic_cast<const RangeSensor*>(getSensor());		assert(rs);		Point lp(			cos(rs->beams()[i].pose.theta)*(*this)[i],			sin(rs->beams()[i].pose.theta)*(*this)[i]);		Point dp=lastPoint-lp;		double distance=sqrt(dp*dp);		if (distance<density){			suppressed++;		}		else{			lastPoint=lp;			ab++;		}		//std::cerr<< __PRETTY_FUNCTION__ << std::endl;		//std::cerr<< "suppressed " << suppressed <<"/"<<size() << std::endl;	}	return ab;}std::vector<Point> RangeReading::cartesianForm(double maxRange) const{	const RangeSensor* rangeSensor=dynamic_cast<const RangeSensor*>(getSensor());	assert(rangeSensor && rangeSensor->beams().size());	uint m_beams=rangeSensor->beams().size();	std::vector<Point> cartesianPoints(m_beams);	double px,py,ps,pc;	px=rangeSensor->getPose().x;	py=rangeSensor->getPose().y;	ps=sin(rangeSensor->getPose().theta);	pc=cos(rangeSensor->getPose().theta);	for (unsigned int i=0; i<m_beams; i++){		const double& rho=(*this)[i];		const double& s=rangeSensor->beams()[i].s;		const double& c=rangeSensor->beams()[i].c;		if (rho>=maxRange){			cartesianPoints[i]=Point(0,0);		} else {			Point p=Point(rangeSensor->beams()[i].pose.x+c*rho, rangeSensor->beams()[i].pose.y+s*rho);			cartesianPoints[i].x=px+pc*p.x-ps*p.y;			cartesianPoints[i].y=py+ps*p.x+pc*p.y;		}	}	return cartesianPoints;}};

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -