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

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

?? robotholonomic.cpp

?? 多機器人合作中的動態角色分配仿真算法是多機器人合作領域的一個比較著名的仿真軟件
?? CPP
字號:
//////////////////////////////////////////////////////////////////////
// MuRoS - Multi Robot Simulator
//
// Luiz Chaimowicz
// GRASP Lab. University of Pennsylvania
// VERLab - DCC - UFMG - Brasil
//
// RobotHolonomic.cpp: implementation of the CRobotHolonomic class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "simulator.h"
#include "RobotHolonomic.h"
#include "RobotNonHolonomic.h"

#include "const.h"
#include <math.h>

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

#include "myglobals.h"

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
IMPLEMENT_SERIAL(CRobotHolonomic, CRobot, 1 )

// Empty Constructor
CRobotHolonomic::CRobotHolonomic()
{
}

// Constructor
CRobotHolonomic::CRobotHolonomic(double x, double y, double theta, short status, short id, CString name) : CRobot(x, y, theta, status, id, name)
{
	m_vx = 0;
	m_vy = 0;
	m_radius = 10;
}

CRobotHolonomic::~CRobotHolonomic()
{
}

// Update robot's position
void CRobotHolonomic::Update(CArray<CRobot*, CRobot*> *robots, double simTime, double dt, CBox* box, CMapPath *globalMap)
{
	// call the update of the upper class
	CRobot::Update(robots, simTime, dt, box, globalMap);

	// Keep trak of robots position
	CPoint p = CPoint(round(m_x), round(m_y));
	if (m_path.GetSize() > 0) {
		if (p != m_path[m_path.GetSize()-1])
			m_path.Add(p);
	}
	else
		m_path.Add(p);


	// Potential controller
	Potential(robots, dt, globalMap, box, simTime);
		
	// Integration
	m_x += m_vx * dt;
	m_y += m_vy * dt;
}

// Draw the robot
void CRobotHolonomic::Draw(CDC *pDC)
{
	CPoint line[2];

	m_rect = CRect( round(m_x - m_radius), round(m_y - m_radius), round(m_x + m_radius), round(m_y + m_radius) );

	pDC->SelectObject(&RED_PEN);

	if (m_status == TRANSPORT)
		pDC->SelectStockObject(BLACK_BRUSH);
	else if (m_status == DOCK)
		pDC->SelectStockObject(GRAY_BRUSH);
	else if (m_status == STOPPED)
		pDC->SelectStockObject(WHITE_BRUSH);
	else if (m_status == WAIT)
		pDC->SelectObject(&BLUE);

	pDC->Ellipse(m_rect);
}

void CRobotHolonomic::Serialize(CArchive& ar)
{
	CRobot::Serialize(ar);

	if (ar.IsStoring()) {
		ar << m_vx;
		ar << m_vy;
	}
	else {
		ar >> m_vx;
		ar >> m_vy;
	}
}

// Potential ontroller. The robot is attrated by the goal and the box depending on its state.
// There is a repulsion from other robots and obstacles, an the collisions are also treated
// Constants are defined in the file myglobals.h, initialized  in the file simulator.cpp and 
// can be modified dynamically
void CRobotHolonomic::Potential(CArray<CRobot*, CRobot*> *robots, double dt, CMapPath *map, CBox* box, double simTime)
{
	short i;

	double fx = 0;
	double fy = 0;

	double dist;
	double angle;

	// Repulsive and contact forces from other robots
	for (i=0; i<robots->GetSize(); i++) 
		if (robots->GetAt(i)->m_id != m_id)
			ForceFromRobots(robots->GetAt(i), fx, fy);


	// Repulsive and contact forces from obstacles
	for (i=0; i<m_localMap->m_obstacles.GetSize(); i++){
		ForceFromObstacles(m_localMap->m_obstacles[i], fx, fy);
	}

	// Atractive force from box (Docking or waiting)
	// Repulsive if dist < 0 in all cases
	if (box->m_exist) {
		ForceFromBoxes(box, fx, fy);
	}
	else {
		m_status = TRANSPORT;
	}

	// Atractive force from goal
	if ( (m_localMap->m_goalReal.x != -1) && (m_status == TRANSPORT) ) {

		DistanceCircleCircle(map->m_goalReal.x, map->m_goalReal.y, m_x, m_y, 0, 0, dist, angle);
		fx += Ka_rg * dist * cos(angle);
		fy += Ka_rg * dist * sin(angle);

	}

	// Damping
	fx += - Cr * m_vx;
	fy += - Cr * m_vy;

	// Computing velocities
	m_vx += fx * dt;
	m_vy += fy * dt;

	
	//Saturation (keeping scale between vx and vy)
	double factor;
	if ( (m_vx > 200) || (m_vy > 200) )
		if (m_vx > m_vy) {
		factor = m_vx / 200;
			m_vx = m_vx / factor;
			m_vy = m_vy / factor;
		}
		else{
			factor = m_vy / 200;
			m_vy = m_vy / factor;
			m_vx = m_vx / factor;
		}
	if ( (m_vx < -200) || (m_vy < -200) )
		if (m_vx < m_vy) {
			factor = m_vx / -200;
			m_vx = m_vx / factor;
			m_vy = m_vy / factor;
		}
		else{
			factor = m_vy / -200;
			m_vy = m_vy / factor;
			m_vx = m_vx / factor;
		}


	// Change to WAIT status if close to the box and the distance is small,
	// and send a message to the other robots
	if ( (m_status == DOCK) && (fabs(m_vx) < 10) && ( fabs(m_vy) < 10) && (m_distBox < 5) ) {
		m_status = WAIT;
		m_timer = simTime;

		CControlMsg *controlMsg;
		controlMsg = new CControlMsg;
		controlMsg->m_code = BOXLOCKED;
		controlMsg->m_from = m_id;
		controlMsg->m_to = 0;
		controlMsg->m_x = m_x;
		controlMsg->m_y = m_y;
		
		SendControlMsg(controlMsg);
	}
	// If not all robots are ready, after timeout, send a message to other robots and start transportation
	else if ( (m_status == WAIT) && ( (simTime - m_timer) > 10) ) {
		CControlMsg *controlMsg;
		controlMsg = new CControlMsg;
		controlMsg->m_code = TIMEOUT;
		controlMsg->m_from = m_id;
		controlMsg->m_to = 0;

		SendControlMsg(controlMsg);
	}
	// If lose contact with the box, stop and send a message to the others
	else if ( (box->m_exist) && (m_status == TRANSPORT) && (m_distBox > (m_sensorRange - m_radius) ) ) {
		m_status = STOPPED;

		CControlMsg *controlMsg;
		controlMsg = new CControlMsg;
		controlMsg->m_code = LOSTBOX;
		controlMsg->m_from = m_id;
		controlMsg->m_to = 0;
		
		SendControlMsg(controlMsg);
	}
}


// Compute the fores due to the obstales
// Constants are defined in the file myglobals.h, initialized  in the file 
// simulator.cpp and can be modified dynamically
void CRobotHolonomic::ForceFromObstacles(CObstacle *obst, double &fx, double &fy)
{
	double angle;
	double deltaN;
	double deltaNDot;
	double lambdaN;

	if (obst->m_inRange) {
		angle = obst->m_angle + PI;
		
		if (obst->m_inContact) {
			// contact forces
			deltaN = obst->m_dist;
			deltaNDot = m_vx * cos(angle) + m_vy * sin(angle); // velocity in the normal direction
			lambdaN = Kc_ro * deltaN - Cc_ro * deltaNDot;

			fx +=  lambdaN * cos(angle);
			fy +=  lambdaN * sin(angle);
		}
		else if (obst->m_dist < m_sensorRange) {
			// potential forces (repulsion)
			fx += -Kr_ro * cos(angle-PI) * 1/fabs(obst->m_dist);
			fy += -Kr_ro * sin(angle-PI) * 1/fabs(obst->m_dist);
		}
	}
}

// Compute the forces due to the boxes
// Constants are defined in the file myglobals.h, initialized  in the file 
// simulator.cpp and can be modified dynamically
void CRobotHolonomic::ForceFromBoxes(CBox *box, double &fx, double &fy)
{
	double deltaN;
	double deltaNDot;
	double lambdaN;

	double angle = m_angleBox + PI;

	if ( (m_status == DOCK) || (m_status == WAIT) || ( (boxAttraction) && (m_status == TRANSPORT) ) )
		if (!m_inContactBox) {

			// Attractive force
			fx += Ka_rb * m_distBox * cos(angle-PI);
			fy += Ka_rb * m_distBox * sin(angle-PI);
		}
		
	if ( (m_inContactBox) ) {
		// Contact forces
		deltaN = m_distBox;
		deltaNDot = (m_vx - box->m_v[0]) * cos(angle) + (m_vy - box->m_v[1]) * sin(angle); // velocity in the normal direction
		lambdaN = Kc_rb * deltaN - Cc_rb * deltaNDot;

		fx += lambdaN * cos(angle);
		fy += lambdaN * sin(angle);
	}
}

// Forces and torque applied on the boxes by the robot
// Constants are defined in the file myglobals.h, initialized  in the file 
// simulator.cpp and can be modified dynamically
void CRobotHolonomic::ForceOnBoxes(CBox *box, double &fx, double &fy, double &ftheta)
{
	double deltaN;
	double deltaNDot;
	double lambdaN;
	double angle;
	double dist;

	double kw = 0.0001;  // constant for angular velocity of the box

	double fx_Box;
	double fy_Box;

	if (m_status == TRANSPORT) {
		if (m_inContactBox) {
			deltaN = m_distBox;
			angle = m_angleBox; // don't need to add PI here. m_angle box is computed in the robot frame!
				
			deltaNDot = (m_vx - box->m_v[0]) * cos(angle + PI) + (m_vy - box->m_v[1]) * sin(angle + PI); // velocity in the normal direction
			lambdaN = Kc_rb * deltaN - Cc_rb * deltaNDot;
			
			// The robot can never pull the box. So the force in the inverse normal direction 
			// of the box must be always positive
			if (lambdaN < 0)
				lambdaN = 0;

			fx_Box = lambdaN * cos(angle);
			fy_Box = lambdaN * sin(angle);

			fx += fx_Box;
			fy += fy_Box;

			// Computing torque
			DistanceCircleCircle(m_contactPoint.x, m_contactPoint.y, box->m_x, box->m_y, 0, 0, dist, angle);
			double ftheta_Box = fy_Box * cos(angle) -fx_Box * sin(angle);
			ftheta += kw * ftheta_Box * dist;
		}
	}
}

// Forces due to the other robots
// Constants are defined in the file myglobals.h, initialized  in the file 
// simulator.cpp and can be modified dynamically
void CRobotHolonomic::ForceFromRobots(CRobot *robot, double &fx, double &fy)
{
	double deltaN;
	double deltaNDot;
	double lambdaN;

	double dist;
	double angle;

	DistanceCircleCircle(robot->m_x, robot->m_y, m_x, m_y, robot->m_radius, m_radius, dist, angle);
	angle += PI;

	double vx;
	double vy;
			
	if (dist < 0) {

		// contact forces
		if (robot->IsKindOf( RUNTIME_CLASS(CRobotHolonomic) ) ) {
			vx = ( (CRobotHolonomic *) robot)->m_vx;
			vy = ( (CRobotHolonomic *) robot)->m_vy;
		}
		else {
			vx = ( (CRobotNonHolonomic *) robot)->m_v * cos(robot->m_theta);
			vy = ( (CRobotNonHolonomic *) robot)->m_v * sin(robot->m_theta);
		}
		deltaN = -dist;
		deltaNDot = (m_vx - vx) * cos(angle) + (m_vy - vy) * sin(angle); // velocity in the normal direction
		lambdaN = Kc_rr * deltaN - Cc_rr * deltaNDot;

		fx +=  lambdaN * cos(angle);
		fy +=  lambdaN * sin(angle);
	}
	else if (dist < m_sensorRange ){
		// potential forces
		fx += -Kr_rr * cos(angle-PI) * 1/fabs(dist);
		fy += -Kr_rr * sin(angle-PI) * 1/fabs(dist);
	}
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩av中文在线观看| 成人动漫一区二区在线| 国产成人av电影在线播放| 欧美日韩小视频| 亚洲国产成人一区二区三区| 一区二区三区成人| 成人黄色a**站在线观看| 日韩精品一区二区三区中文不卡 | 一区二区三区在线高清| 国产主播一区二区三区| 91麻豆精品国产91久久久更新时间| 国产精品免费久久久久| 国模冰冰炮一区二区| 欧美日韩国产影片| 最新热久久免费视频| 国产成人8x视频一区二区| 精品国产一区二区三区四区四| 欧美日韩美少妇| 91视频国产观看| 国产精品一区在线观看你懂的| 免费在线观看成人| 日韩电影在线观看网站| 欧美经典一区二区三区| 欧美一区二区女人| 欧美亚洲日本一区| 成人av网址在线| 国内精品在线播放| 国产一区二区在线看| 成人精品视频.| 欧美日韩五月天| 亚洲在线中文字幕| 欧美理论电影在线| 一级特黄大欧美久久久| 色欧美日韩亚洲| 亚洲午夜在线视频| 欧美人伦禁忌dvd放荡欲情| 亚洲午夜羞羞片| 7777女厕盗摄久久久| 麻豆成人av在线| 26uuu精品一区二区三区四区在线| 激情五月播播久久久精品| 欧美成人video| 国产一区二区三区免费| 国产精品萝li| 欧美综合视频在线观看| 日韩在线a电影| 国产午夜亚洲精品午夜鲁丝片 | 色综合中文字幕国产 | 日韩欧美另类在线| 国产精品99久久久久久有的能看 | 青青国产91久久久久久| 日韩你懂的在线播放| 国产米奇在线777精品观看| 国产日韩v精品一区二区| a级高清视频欧美日韩| 一区二区三国产精华液| 欧美日韩国产另类一区| 久久99精品国产麻豆不卡| 国产亚洲福利社区一区| 在线欧美日韩精品| 九九热在线视频观看这里只有精品| 欧美精品一区二区在线观看| 不卡视频免费播放| 一区二区三区欧美激情| 中文字幕五月欧美| 看片的网站亚洲| 国产精品亲子乱子伦xxxx裸| 秋霞av亚洲一区二区三| 91免费国产在线| 国产精品视频一区二区三区不卡| 亚洲午夜在线视频| 在线观看av不卡| 久久久精品日韩欧美| 日韩av电影免费观看高清完整版在线观看 | 国产91在线看| 一区二区三区成人| 久久久久久日产精品| 欧美午夜片在线看| 懂色av一区二区三区蜜臀| 日本网站在线观看一区二区三区| 国产午夜一区二区三区| 7777精品伊人久久久大香线蕉最新版| 懂色av一区二区三区蜜臀| 青青青伊人色综合久久| 一级做a爱片久久| 欧美激情综合在线| 91精品国产综合久久久久久漫画 | 琪琪久久久久日韩精品| 亚洲精品免费一二三区| 精品粉嫩超白一线天av| 欧美丰满美乳xxx高潮www| 91视视频在线直接观看在线看网页在线看| 日韩国产在线一| 一二三四区精品视频| 国产精品另类一区| 久久综合色婷婷| 欧美一级淫片007| 欧美日韩一区二区三区不卡| 91亚洲国产成人精品一区二三| 看电视剧不卡顿的网站| 亚洲第一成人在线| 国产欧美一区二区精品婷婷| 欧美乱妇23p| 欧美性三三影院| 91在线高清观看| 国产·精品毛片| 国产高清在线精品| 亚洲人成小说网站色在线| 欧美女孩性生活视频| 欧美一a一片一级一片| 国产亚洲福利社区一区| 欧美日韩你懂的| 一本大道av一区二区在线播放| 亚洲国产cao| 亚洲一区二区三区中文字幕在线| 欧美午夜精品免费| 国产suv精品一区二区6| 色综合欧美在线| 精品成人佐山爱一区二区| 精品中文字幕一区二区小辣椒| 肉肉av福利一精品导航| 日韩和欧美一区二区三区| 麻豆一区二区在线| 久久99国产精品久久99| 国产乱人伦偷精品视频不卡| 国产精品99久久久久久似苏梦涵| 风间由美性色一区二区三区| 99久久综合国产精品| 91麻豆精品在线观看| 欧美最猛黑人xxxxx猛交| 欧美日韩国产小视频| 日韩精品一区二区三区视频在线观看 | 亚洲制服欧美中文字幕中文字幕| 亚洲一区二区中文在线| 免费观看日韩av| 国产麻豆精品在线| av电影在线观看完整版一区二区| 日韩精品电影一区亚洲| 色偷偷成人一区二区三区91 | 91精品国产福利| 欧美电视剧免费全集观看| 日本一区二区三区视频视频| 中文字幕一区二区三区在线播放 | 国产欧美日韩一区二区三区在线观看| 国产精品美女久久久久久久久久久| 亚洲美女电影在线| 美女一区二区视频| 99视频热这里只有精品免费| 欧美色图第一页| 久久久久久久综合| 亚洲综合区在线| 国产精品自拍毛片| 在线看日本不卡| 国产三级一区二区| 在线观看视频一区二区欧美日韩| 日韩一二三区不卡| 亚洲精品综合在线| 欧美大片日本大片免费观看| 日韩高清一区在线| 欧美一区二区三区在| 97se亚洲国产综合自在线观| 国产精品每日更新| 美女网站视频久久| 欧美一区午夜精品| 亚洲精品v日韩精品| 婷婷国产v国产偷v亚洲高清| 亚洲欧洲制服丝袜| 成人国产一区二区三区精品| 日韩一区二区三区在线| 亚洲午夜三级在线| 91高清视频免费看| 欧美一区二区黄| 国产专区欧美精品| 日韩精品三区四区| 99vv1com这只有精品| 精品播放一区二区| 日韩av网站在线观看| 在线观看日韩毛片| 中文字幕日韩精品一区| 狠狠狠色丁香婷婷综合激情| 69p69国产精品| 亚洲成a人片在线不卡一二三区 | 一区二区三区在线视频播放| 国产成人av在线影院| 日韩一区二区三区观看| 亚洲图片一区二区| 色激情天天射综合网| 亚洲欧洲精品成人久久奇米网| 韩国理伦片一区二区三区在线播放| 欧美一区二区三区日韩| 欧美日韩另类国产亚洲欧美一级| 中文字幕一区在线| 国产91丝袜在线播放0| 日韩午夜小视频| 日本最新不卡在线| 欧美一级欧美一级在线播放| 日韩精品福利网| 欧美一区欧美二区| 精品亚洲porn| 久久综合九色综合97婷婷女人|