亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? localmap.cpp

?? InnovLabSimu在vc++下實現
?? CPP
字號:
#include "LocalMap.h"



template <class type>
bool CheckAngleLimitedBeyond(type & Angle,int Add_Pos_Dec_Neg)
{
	//=180或-180度均不超界
	if (Add_Pos_Dec_Neg==1) //->當Add_Pos_Dec_Neg==1時限幅同時任一方向過界均報錯
	{
		if (Angle>360) //->i,j越界處理
		{
			Angle=Angle-360;
			return true;//->返回過界標志
			//	AfxMessageBox("角度>180范圍");
		}
		else if (Angle<0) 
		{
			Angle=360+Angle;
			return true;//->返回過界標志
			//		AfxMessageBox("角度<-180范圍");
		}
		else
		{return false;}

	}
	else if(Add_Pos_Dec_Neg==0)//->當Add_Pos_Dec_Neg==0時,表示不再區分從哪個方向過界,僅將輸入的角度限制在-180~180
	{
		if (Angle>360)//->i,j越界處理
		{
			Angle=Angle-360;
			return true;//->返回過界標志
		}//->錯誤報警			
		else if (Angle<0) 
		{
			Angle=360+Angle;
			return true;//->返回過界標志
		}
		else
		{
			return false;//->未過界
		}
	}		
	else if (Add_Pos_Dec_Neg>0)//->假如是檢測正方向是否過界
	{
		if (Angle>360) //->i,j越界處理
		{
			Angle=Angle-360;
			return true;//->返回過界標志
		}
		else if (Angle<0) 
		{

			// 				Angle=360+Angle;//AfxMessageBox("+方向搜索的角度<-180范圍");
			// 				return true
		}
		else
		{
			return false;//->未過界
		}
	}
	else//->Add_Pos_Dec_Neg<0假如是檢測-方向是否過界
	{
		if (Angle>360)//->i,j越界處理
		{//AfxMessageBox("-方向搜索的角度>180范圍");
		}//->錯誤報警			
		else if (Angle<0) 
		{
			Angle=360+Angle;
			return true;//->返回過界標志
		}
		else
		{
			return false;//->未過界
		}
	}
}
CLocalVisionMap::CLocalVisionMap(void)
{
	m_dExpandRadius=SAFE_WIDTH*(0.5+0.1);//0.1部分為安全寬度富余0.5部分為機器人自身寬度的1半
}

CLocalVisionMap::~CLocalVisionMap(void)
{
}
bool CLocalVisionMap::ExpandObstacleRegion(ObjectPolePos *pObstacleTobeExpand)//,int indexOfmaObstacleStruct
{
//	ObjectPolePos* pObstacleTmp;//暫存指針
	m_aObstacleStruct.push_back(*pObstacleTobeExpand);//將障礙物另存一份
	std::vector<PthPlSpa::ObjectPolePos>::iterator itTobeExpand=m_aObstacleStruct.end()-1;
	//pObstacleTmp=&itTobeExpand;//為了不影響外面傳進來的障礙物 內容,在類里另存一份于數組中
	double AngleAdd;//膨脹時的角度增量暫存
	if (pObstacleTobeExpand->distance-m_dExpandRadius<0)//若將障礙物膨脹后已把自己包進障礙物,即已無法避開
	{//m_dExpandRadius為物體膨脹半徑
		AngleAdd=90;
		itTobeExpand->distance=0.02;
	}
	else//正常情況下膨脹
	{
		AngleAdd=asin(m_dExpandRadius/(pObstacleTobeExpand->distance))*180*ONE_DEVIDE_PI;
		itTobeExpand->distance=pObstacleTobeExpand->distance-m_dExpandRadius;
	}
	// robot_console_printf("AngleAdd=%f\n",AngleAdd);
	if (CheckObstacleIsBehind(pObstacleTobeExpand->LBoundaryAngle,pObstacleTobeExpand->angle,pObstacleTobeExpand->RBoundaryAngle))
	{
		itTobeExpand->LBoundaryAngle+=AngleAdd;
		itTobeExpand->RBoundaryAngle-=AngleAdd;
	}
	else
	{	
		itTobeExpand->LBoundaryAngle-=AngleAdd;
		itTobeExpand->RBoundaryAngle+=AngleAdd;
	}
	CheckAngleLimitedBeyond(itTobeExpand->LBoundaryAngle,0);
	CheckAngleLimitedBeyond(itTobeExpand->RBoundaryAngle,0);
	/*萬一膨脹后出現左角度大于右角度的情況應該將他們交換*/
	if (itTobeExpand->LBoundaryAngle > itTobeExpand->RBoundaryAngle)
	{
		AngleAdd=itTobeExpand->LBoundaryAngle;
		itTobeExpand->LBoundaryAngle=itTobeExpand->RBoundaryAngle;
		itTobeExpand->RBoundaryAngle=AngleAdd;
	}
	return true;
}

/**
*判斷障礙物的有效性,不能過近過遠,以及角度的0~360度
*/
bool CLocalVisionMap::ConfirmObstacleList(PthPlSpa::ObjectPolePos* Obstacle,float TargetDis)
{
	if (Obstacle->angle<0||Obstacle->angle>360) 
	{
		return false;
	}
	if (Obstacle->distance)
	{
		if (TargetDis<Obstacle->distance)//0.2為余量,單位是毫米
		{
			return false;//該障礙物無效
		}
		if (Obstacle->distance>MAX_OBJ_DIS)//->距離太遠的不需要考慮避障
		{
			return false;
		}
		if (Obstacle->distance<MIN_OBJ_DIS) 
		{
			return false;
		}
		return true;
	}
	return false;
}
bool CLocalVisionMap::AddObject2RoadMap(PthPlSpa::ObjectPolePos *pObstacleList,int numOb,float TargetDis)
{
	//robot_console_printf(" numOb_inAddObject2RoadMap=%d\n",numOb);
	PretreatObstacle(pObstacleList,numOb,TargetDis);
	std::vector<PthPlSpa::ObjectPolePos>::iterator pObstacleAferExpand=m_aObstacleStruct.end()-1;		
//	PthPlSpa::ObjectPolePos * pObstacleAferExpand;
	//按障礙物面積從小到大的順序排列它與目標的夾角
	if (CheckObstacleIsBehind(pObstacleAferExpand->LBoundaryAngle,pObstacleAferExpand->angle,pObstacleAferExpand->RBoundaryAngle))
		//>障礙物在身后橫跨360度分界線
	{
		/*對橫跨在背后的障礙物,其信息寫入時
		*要分兩批寫入,第一批:j從RBoundaryAngle加到360度
		*第二批:j從LBoundaryAngle減到0度*/
		//	robot_console_printf("BehindObstacleNum=%d\n",numOb);
		int j=0;
		for (j=(int)pObstacleAferExpand->RBoundaryAngle;j<=360;j++)
			//第一批寫入信息pObstacleAferExpand->RBoundaryAngle為大的角度也是0~180,
		{
			WriteObject2Map(pObstacleAferExpand,j,numOb+1);
		}
		for (j=(int)pObstacleAferExpand->LBoundaryAngle;j>=0;j--)//>障礙物在后面時左半邊的寫入。pObstacleAferExpand->LBoundaryAngle也是-180~180
			//第二批寫入信息pObstacleAferExpand->LBoundaryAngle為大的角度也是-180~0,
		{
			WriteObject2Map(pObstacleAferExpand,j,numOb+1);
		}			
	}
	else//>障礙物并非橫跨后方左右時
	{
		for (int j=(int)pObstacleAferExpand->LBoundaryAngle;j<=pObstacleAferExpand->RBoundaryAngle;j++)
		{
			WriteObject2Map(pObstacleAferExpand,j,numOb+1);
		}
	}
	return true;
}
void CLocalVisionMap::SetRoadMap(PthPlSpa::ObjectPolePos *pObstacleList,int nObstacleMaxNum,float TargetDis)
{
	memset(m_nFreRoadMap,0,sizeof(m_nFreRoadMap));
//	memset(m_apObstaclePointerContainer,0,sizeof(m_apObstaclePointerContainer));
	m_aObstacleStruct.clear();
	int numOb;//障礙物的編號
	numOb=0;//0表示沒障礙物
//	ObjectPolePos * pObstacleAferExpand;
	if (nObstacleMaxNum>11)//障礙物最大11個
	{
		return;
	}
	for (int i=0;i<nObstacleMaxNum;i++) 
	{
		if (!pObstacleList)
		{
			break;
		}
		if (!ConfirmObstacleList(pObstacleList,TargetDis))//>若無效
		{	
			pObstacleList=pObstacleList->next;//去掉無效的
			continue;
		}
		//PretreatObstacle(pObstacleList,numOb,TargetDis);
		AddObject2RoadMap(pObstacleList,numOb,TargetDis);
		//	robot_console_printf("oneObsOver=%d\n",numOb);
		pObstacleList=pObstacleList->next;
		numOb++;//>經確認的障礙物個數為numOb+1個
	}
}
/************************************************************************/
/*         CLocalMapFromLaser                                           */
/************************************************************************/

CLocalMapFromLaser::CLocalMapFromLaser(void)
{
	m_dExpandRadius=SAFE_WIDTH*(0.5+0.1);//0.1部分為安全寬度富余0.5部分為機器人自身寬度的1半
}
CLocalMapFromLaser::~CLocalMapFromLaser(void)
{

}
bool CLocalMapFromLaser::WriteLocalLaserMap(float* pLaserDataChunk,float TargetDis)
{
	memset(LocalLaserMap,0,sizeof(LocalLaserMap));
	for (unsigned i=0;i<NumOfData;i++)
	{
		float* pCurrentAngleVal=pLaserDataChunk+i;
		if (ConfirmLaserData(pCurrentAngleVal,TargetDis))
		{
			ExpandObstacleCell(pCurrentAngleVal,i);//膨脹并寫入
			//LocalLaserMap[i]=*(pLaserDataChunk);//寫入
		}
	}
	return true;
}
bool CLocalMapFromLaser::ExpandObstacleCell(float* pLaserData,unsigned IndexInLocalMapStruct)
{
	float AngleAdd;//膨脹時的角度增量暫存
	if (*pLaserData-m_dExpandRadius<0)//若將障礙物膨脹后已把自己包進障礙物,即已無法避開
	{//m_dExpandRadius為物體膨脹半徑
		AngleAdd=90;
		ExpandObstacleNeighborCell(AngleAdd,0.02,IndexInLocalMapStruct);
		//LocalLaserMap[IndexInLocalMapStruct]=0.02;
	}
	else//正常情況下膨脹
	{
		AngleAdd=asin(m_dExpandRadius/(*pLaserData))*180*ONE_DEVIDE_PI;
		ExpandObstacleNeighborCell(AngleAdd,*pLaserData-m_dExpandRadius,IndexInLocalMapStruct);
	}
	return true;
}
void CLocalMapFromLaser::ExpandObstacleNeighborCell(float AngleRegion,float Dis,unsigned IndexInLocalMapStruct)
{
	unsigned InfluncedCellNum=ceil(AngleRegion*2);//本次擴充在LocalLaserMap中影響到的最大范圍
	for(unsigned i=0;i<=InfluncedCellNum;i++)//+方向的擴充
	{
		if (!CheckExpandAble(Dis,i+IndexInLocalMapStruct))//若碰到不能擴充的則不再擴充
		{
			break;
		}				
	}
	for (unsigned i=1;i<=InfluncedCellNum;i++)//-方向的擴充
	{
		if (!CheckExpandAble(Dis,IndexInLocalMapStruct-i))//若碰到不能擴充的則不再擴充
		{
			break;
		}
	}
	
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美一卡2卡3卡4卡| 国产精品乱人伦一区二区| 久久久久久久性| 亚洲一区二区三区视频在线| 精品影院一区二区久久久| 91丝袜美腿高跟国产极品老师 | 午夜av一区二区三区| 国产精品99久久久久| 欧美精品久久一区二区三区| 亚洲视频1区2区| 国产美女娇喘av呻吟久久| 日本道在线观看一区二区| 国产精品蜜臀av| 国产成人精品三级麻豆| 精品欧美久久久| 蜜桃一区二区三区在线| 欧美美女一区二区三区| 亚洲精品少妇30p| 成年人网站91| 国产精品久久久久影院| 国产精品影视天天线| 精品1区2区在线观看| 久久精品国产一区二区| 51精品久久久久久久蜜臀| 亚洲国产综合色| 欧美日韩高清影院| 性做久久久久久| 精品视频123区在线观看| 亚洲精品免费播放| 一本一道波多野结衣一区二区| 日本一区二区三区免费乱视频| 国产精品18久久久久| 久久久噜噜噜久久人人看| 国产乱国产乱300精品| 久久久精品日韩欧美| 国产精品99久| 中文av一区二区| 99精品视频一区二区| 国产精品网友自拍| 91在线视频播放地址| 亚洲激情在线激情| 欧美在线色视频| 日日摸夜夜添夜夜添精品视频 | 欧美不卡一区二区| 国产寡妇亲子伦一区二区| 国产精品久久久99| 色综合久久六月婷婷中文字幕| 亚洲资源中文字幕| 欧美一区二区三区视频免费| 久久99国产精品成人| 久久久激情视频| 91香蕉视频mp4| 亚洲国产精品一区二区久久恐怖片 | 毛片av一区二区| 欧美精品一区二区三区高清aⅴ| 国产suv精品一区二区三区| 中文字幕一区二区三区蜜月| 一本久久a久久免费精品不卡| 亚洲国产精品嫩草影院| 日韩欧美高清一区| 成人app网站| 午夜视频一区二区| 国产视频一区二区在线| 91亚洲国产成人精品一区二区三| 亚洲成av人片在www色猫咪| 精品福利一区二区三区| 色婷婷综合久久久中文一区二区| 五月天久久比比资源色| 国产欧美视频在线观看| 欧美中文字幕久久 | 日精品一区二区三区| 亚洲精品在线免费播放| 在线观看一区不卡| 狠狠狠色丁香婷婷综合激情| 中文字幕免费观看一区| 91.麻豆视频| 91亚洲精品一区二区乱码| 青青草一区二区三区| 亚洲欧美日韩一区| 日韩免费一区二区| 日本道免费精品一区二区三区| 亚洲成av人片在线观看| 国产精品久久久久一区| 精品免费国产一区二区三区四区| 91猫先生在线| 成人网在线播放| 久久精品国产亚洲高清剧情介绍| 亚洲乱码精品一二三四区日韩在线| 欧美mv日韩mv国产网站| 欧美精品成人一区二区三区四区| 99久久久久免费精品国产| 狠狠色丁香婷综合久久| 日韩精品一级中文字幕精品视频免费观看 | 国产日韩精品久久久| 欧美一区二区黄| 欧美日韩国产综合视频在线观看| 成人av午夜电影| 国产美女久久久久| 狠狠久久亚洲欧美| 狂野欧美性猛交blacked| 一区二区成人在线| 亚洲欧洲另类国产综合| 国产片一区二区| 久久综合九色欧美综合狠狠| 欧美精品在线视频| 欧美在线免费观看亚洲| 在线日韩av片| 色香色香欲天天天影视综合网| zzijzzij亚洲日本少妇熟睡| 成人午夜av在线| 国产精品一二三四区| 国产一区 二区| 国产黑丝在线一区二区三区| 国产麻豆9l精品三级站| 国产一区在线观看麻豆| 国产精品资源在线| 成人精品电影在线观看| fc2成人免费人成在线观看播放| 波多野结衣一区二区三区| 成人妖精视频yjsp地址| www.亚洲精品| 91麻豆高清视频| 色女孩综合影院| 欧美日韩美少妇| 91精品国产麻豆| 久久精品人人做人人爽人人| 中文字幕欧美激情| 亚洲精选视频在线| 石原莉奈在线亚洲三区| 精品一区二区三区欧美| 国产成人欧美日韩在线电影| 成人在线视频首页| 91亚洲永久精品| 在线成人小视频| 26uuu久久综合| 亚洲欧洲日韩女同| 午夜久久久久久久久| 国内成+人亚洲+欧美+综合在线| 国产美女精品在线| 在线观看亚洲精品视频| 日韩欧美中文字幕公布| 国产日韩三级在线| 亚洲国产欧美在线人成| 蜜臀久久99精品久久久久久9| 国产成人精品影视| 欧美色图天堂网| 精品国内片67194| 亚洲视频网在线直播| 亚洲444eee在线观看| 国产精品一区二区在线看| 色婷婷综合久久久中文一区二区 | 欧美自拍丝袜亚洲| 久久这里只有精品首页| 一区二区三区国产豹纹内裤在线| 日本最新不卡在线| 91色porny蝌蚪| 337p粉嫩大胆噜噜噜噜噜91av| 一区二区三区在线观看欧美| 久久99精品国产麻豆婷婷洗澡| 一本大道久久a久久综合| 精品电影一区二区三区| 亚洲色图都市小说| 国产综合色产在线精品| 在线国产亚洲欧美| 国产精品久久久久久久浪潮网站 | 欧美电视剧免费全集观看| 中文字幕中文乱码欧美一区二区| 免费视频一区二区| 在线免费亚洲电影| 亚洲国产精品成人综合| 天堂影院一区二区| 日本二三区不卡| 国产精品久久久久三级| 精品一区二区三区蜜桃| 欧美亚洲综合在线| 最近中文字幕一区二区三区| 国产老妇另类xxxxx| 69久久夜色精品国产69蝌蚪网| 自拍偷拍欧美激情| 国产91对白在线观看九色| 欧美sm极限捆绑bd| 日本成人在线网站| 欧美日本一区二区在线观看| 亚洲伦理在线精品| 97精品国产露脸对白| 久久精品一级爱片| 国产一区二区免费视频| 日韩欧美一级在线播放| 日本在线观看不卡视频| 欧美日韩精品一区二区三区四区| 亚洲人一二三区| 成人18视频在线播放| 国产精品美女久久久久av爽李琼| 国产精品一区二区三区99| 久久影院电视剧免费观看| 久久电影网站中文字幕| 欧美精品一区二区精品网| 久久99久久99精品免视看婷婷| 日韩免费视频线观看| 韩国成人福利片在线播放|