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

📄 samplepredictmodel.h

📁 InnovLabSimu在vc++下实现
💻 H
字号:
#pragma once
//#include "CoderBasePosePredict.h"

#include "boost/random.hpp"
#include "../SelfLoc/GlobalMap.h"
/********************************************************************
	created:	2008/07/09
	created:	9:7:2008   9:12
	filename: 	c:\RoboCupSimu\RoboCupSimu2\RoboCupSimu\controllers\Robot2005_V2\SamplePredictModel.h
	file path:	c:\RoboCupSimu\RoboCupSimu2\RoboCupSimu\controllers\Robot2005_V2
	file base:	SamplePredictModel
	file ext:	h
	author:		GaoYang
	
	purpose:	对存在噪声的预测模型进行采样,外部输入精确预测模型,本类对其加噪声进行采样,产生粒子供粒子滤波器使用
*********************************************************************/
//typedef boost::mt11213b base_generator_type;
#define EXPECT 0
#define SIGMA_WHEELDIS 30///<空置量,或者说轮位移的高斯分布的标准差或者叫均方差
#define SIGMA_ORINT 0.8///<空置量,或者说轮位移的高斯分布的标准差或者叫均方差
typedef boost::rand48 base_generator_type1;
typedef boost::normal_distribution<> distribution_type1;

//typedef CCoderBasePosePredict predict_model_type;
//typedef RobotLoc state_type;
//typedef WheelDis control_type;

template<class control_type,class predict_model_type,class particle_type>//control_type类型中必须有AddNoise函数进行噪声叠加,PredictModel必须重载()进行预测运算,state_type被直接输入PredictModel,因此是状态模型,非粒子
class CSamplePredictModel//:public CGlobalMap
{
public:
	CSamplePredictModel(void):Randomgenerator((unsigned __int64)45),NormDist(EXPECT,SIGMA_WHEELDIS),
		NormRandom(Randomgenerator,NormDist),NormDist_Ori(EXPECT,SIGMA_ORINT),m_OriRandomgenerator(Randomgenerator,NormDist_Ori)
	{

	}
public:
	~CSamplePredictModel(void)
	{

	}
	/**
	*@brief对预测模型进行采样,control_type类型中必须有AddNoise函数进行噪声叠加,PredictModel必须重载()进行预测运算,可只由设定随机种子
	*返回说采样得到的粒子
	*
	*@parm PredictModel 预测模型
	*@parm PreState 上一状态
	*@parm ControlVarible 控制量
	*@parm RandomRumberSeed随机变量发生器种子
	*/
	particle_type SampleModel(predict_model_type& PredictModel,particle_type& PreState,control_type& NoisyControlVarible,unsigned RandomRumberSeed)
	{
		Randomgenerator.seed(RandomRumberSeed);
		NormRandom(Randomgenerator,NormDist);///正态分布随机数发生器
		//NoisyWheelDis NoisyControlVarible(ControlVarible);
		NoisyControlVarible.AddNoise(NormRandom);//噪声叠加
		
		return PredictModel(NoisyControlVarible,PreState,m_OriRandomgenerator());//PredictModel.fx(ControlVarible,PreState);
	}
	/**
	*@brief对预测模型进行采样,control_type类型中必须有AddNoise函数进行噪声叠加,PredictModel必须重载()进行预测运算
	*返回说采样得到的粒子
	*
	*@parm PredictModel 预测模型
	*@parm PreState 上一状态
	*@parm ControlVarible 控制量
	*/
	particle_type SampleModel(predict_model_type& PredictModel,particle_type& PreState,control_type& NoisyControlVarible)
	{
		NoisyControlVarible.AddNoise(NormRandom);//噪声叠加
		return PredictModel(NoisyControlVarible,PreState,m_OriRandomgenerator());//PredictModel.fx(ControlVarible,PreState);
	}
	
	/**
	*@brief考虑地图的影响,对预测模型进行采样使采样点不落入障碍物内部,
	*control_type类型中必须有AddNoise函数进行噪声叠加,PredictModel必须重载()进行预测运算
	*返回说采样得到的粒子
	*
	*@parm PredictModel 预测模型
	*@parm PreState 上一状态
	*@parm ControlVarible 控制量
	*/
	particle_type SampleModelConsiderMap(predict_model_type& PredictModel,particle_type& PreState,control_type& NoisyControlVarible,CGlobalMap& GlobalMap)
	{
		NoisyControlVarible.AddNoise(NormRandom);//噪声叠加
		particle_type SampledParticle;
		SampledParticle.AddRobotLoc(PredictModel(NoisyControlVarible,PreState,m_OriRandomgenerator()));
		SampledParticle.TransferRealCoord2MapCoord();//将实际坐标转化为地图坐标去查地图
		if (GlobalMap.QueryboolMap(SampledParticle.XCoord,SampledParticle.YCoord))//得到的位置在空白处的话
		{
			SampledParticle.Weight=1;//权值设为1
		}
		else//得到的位置在障碍物内部的话
		{
			SampledParticle.Weight=0;
		}
		SampledParticle.TransferMapCoord2RealCoord();//将地图坐标转化实际坐标
		return SampledParticle;
	}
protected:
	//static unsigned __int64 Randomseed;
	base_generator_type1 Randomgenerator;///<boost中的随机数发生器,给轮子读数加噪声
	distribution_type1 NormDist;///<boost中的分布发生器给轮子读数加噪声用
	distribution_type1 NormDist_Ori;///<boost中的分布发生器给朝向值加噪声
	boost::variate_generator<base_generator_type1&, distribution_type1 >m_OriRandomgenerator;///<boost中的随机变量发生器,给朝向值加噪声
	boost::variate_generator<base_generator_type1&, distribution_type1 > NormRandom;///<boost中的随机变量发生器
};

⌨️ 快捷键说明

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