getmeasureprobability.cpp

来自「InnovLabSimu在vc++下实现」· C++ 代码 · 共 46 行

CPP
46
字号
#include "GetMeasureProbability.h"


PROBABILITY_TYPE CGetMeasureProbability::GetProbOnLikelihoodFieldMod(float* ScannerData,size_t ScanDataSize,RobotLoc& SelfLoc,CGlobalMap& GlobalMap)
{
	//double Probability=1;
	ScanDataSize=ScanDataSize-1;//改为从0开始数起
	PROBABILITY_TYPE PSingleDirec;//单一方向测量值的概率
	PROBABILITY_TYPE PAllMeasure=1;//所有测量值,总的概率
	for (unsigned i=0;i<ScanDataSize;i++)
	{
		if (*(ScannerData+i)<MAX_DETECT_RANGE)//检测到物体,反求该检测的概率,但是当没有检测到物体,即方向距离值为MAX_DETECT_RANGE时,还没有考虑到该怎么办。
		{
			
			STATE_STYLE PointWorldCoord=LocalDegreePoleCoord2WorldCoord(i*ANGLE_RESOLVING, *(ScannerData+i),SelfLoc);//将测量值转化为世界坐标
			PointWorldCoord(0)=SelfLoc.TransferRealCoord2MapCoord(PointWorldCoord(0));//将测量点的实际坐标转化为像素单位去查地图
			PointWorldCoord(1)=SelfLoc.TransferRealCoord2MapCoord(PointWorldCoord(1));//将测量点的实际坐标转化为像素单位去查地图,调用的函数是robotloc的成员函数
			float TargetValueOnMap=GlobalMap.QueryGridValOnMap(PointWorldCoord(0),PointWorldCoord(1));//返回的是距离值,距离的单位是毫米
			if (TargetValueOnMap<1e-9)//若查到该目标点是黑色,即认为该点不靠近任何边界,
			{
				if (GlobalMap.IsEdgePoint(PointWorldCoord(0),PointWorldCoord(1)))//看看是否一个障碍物的边界点
				{
					PSingleDirec=1;
				}
				else//属障碍物内部,不靠边界的不确定点,统一设定概率
				{
					PSingleDirec=NORMALIZE_FACTOR_IN_SINGLE_DIRECT*m_AverageProb;
				}
				
			}
			else if (TargetValueOnMap==GlobalMap.TransferMapVal2RealDis(NON_OBJECT_VAL))//确定为非障碍物点
			{
				PSingleDirec=0.00001;
			}
			else//计算概率
			{
				PROBABILITY_TYPE Phit=Prob_StandardNormalDistribution(TargetValueOnMap,MESURE_NOISE_DEVIATION);
				PSingleDirec=NORMALIZE_FACTOR_IN_SINGLE_DIRECT*(Weighted_RandomNoise+NormalizerOfNormalDistribution*Phit*MESURE_NOISE_WEIGHT);
			}
			PAllMeasure=PAllMeasure*PSingleDirec;
		}	
		
	}
	return PAllMeasure;
}

⌨️ 快捷键说明

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