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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? robotlabmate.cpp

?? 多機(jī)器人合作中的動態(tài)角色分配仿真算法是多機(jī)器人合作領(lǐng)域的一個比較著名的仿真軟件
?? CPP
?? 第 1 頁 / 共 2 頁
字號:
// RobotLabmate.cpp: implementation of the CRobotLabmate class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "simulator.h"
#include "RobotLabmate.h"
#include "const.h"
#include <math.h>

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


#define MAX_ARM_DISP 35


//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
IMPLEMENT_SERIAL(CRobotLabmate, CRobotNonHolonomic, 1 )

// onstructor
CRobotLabmate::CRobotLabmate(double x, double y, double theta, short status, short id, CString name) : CRobotNonHolonomic(x, y, theta, status, id, name)
{
	m_sizex = 70;
	m_sizey = 30;
	m_beginLead = 0;
		
	for (short i=0; i<3; i++){
		m_force[i] = 0;
		m_force_w[i] = 0;
	}

	// transformations between World (W), Robot (R) amd Arm (A) coordinates
	m_tR2A[0] = -m_sizex/2;
	m_tR2A[1] = 0;
	m_tR2A[2] = 0;

	m_tA2R[0] = +m_sizex/2;
	m_tA2R[1] = 0;
	m_tA2R[2] = 0;

	// Position of the ARM in the three coordinates
	m_armA[0] = MAX_ARM_DISP;
	m_armA[1] = 0;
	m_armA[2] = 0;

	m_armR[0] = m_armA[0] * cos(m_tA2R[2]) - m_armA[1] * sin(m_tA2R[2]) + m_tA2R[0];
	m_armR[1] = m_armA[0] * sin(m_tA2R[2]) + m_armA[1] * cos(m_tA2R[2]) + m_tA2R[1];
	m_armR[2] = m_armA[2] + m_tA2R[2];

	m_armW[0] = m_armR[0] * cos(m_theta) - m_armR[1] * sin(m_theta) + m_x;
	m_armW[1] = m_armR[0] * sin(m_theta) + m_armR[1] * cos(m_theta) + m_y;
	m_armW[2] = m_armR[2] + m_theta;

	ComputeArmPos();

	double a = m_sizex/2, b = m_sizey; // robot dimensions
	m_polygon.AddPoint( CPoint( round( m_x - a*cos(m_theta) + b*sin(m_theta) ), round( m_y - a*sin(m_theta) - b*cos(m_theta) ) ) );
	m_polygon.AddPoint( CPoint( round( m_x + a*cos(m_theta) + b*sin(m_theta) ), round( m_y - b*cos(m_theta) ) ) );
	m_polygon.AddPoint( CPoint( round( m_x + a*cos(m_theta) - b*sin(m_theta) ), round( m_y + b*cos(m_theta) ) ) );
	m_polygon.AddPoint( CPoint( round( m_x - a*cos(m_theta) - b*sin(m_theta) ), round( m_y - a*sin(m_theta) + b*cos(m_theta) ) ) );
	m_polygon.ComputeCenter();
	m_polygon.SetPointsCenterFrame();
	m_rect = m_polygon.m_rect;
}

// Empty constructor
CRobotLabmate::CRobotLabmate()
{	
	m_sizex = 70;
	m_sizey = 30;
}

CRobotLabmate::~CRobotLabmate()
{

}

// Update robot's position
void CRobotLabmate::Update(CArray<CRobot*, CRobot*> *robots, double simTime, double dt, CBox* box, CMapPath *globalMap)
{
	CDataMsg *dataMsg;
	CControlMsg *controlMsg;

	// calling the sensor method (from CRobot)
	Sensor(globalMap,box);

	// If there is no box, Put the robot in the LEAD mode
	if (!box->m_exist)
		m_status = LEAD;

	// Docking
	if (m_status == DOCK) {
		m_v = 80;
		m_x += m_v * cos(m_theta) * dt;

		// If not in ontact, test if in contact
		if (!m_inContactBox) {
			DetectBox(box);
			
			// if in contact, Initialize arm position related to the box and send message DOCKOK
			if (m_inContactBox) {
				InitializeArmBox(CPoint(round(m_armW[0]), round(m_armW[1])), box, m_theta);

				m_v = 0;
				m_status = WAIT;
				controlMsg = new CControlMsg;
				controlMsg->m_code = DOCKOK;
				controlMsg->m_from = m_id;
				controlMsg->m_tstamp = simTime;
				SendControlMsg(controlMsg);
				return;
			}
		}
	}

	// Pushing the box. When the arm is in position, send message PUSHOK 
	if (m_status == PUSH) {
		if (m_armA[0] >= MAX_ARM_DISP - 10){
			m_v = 10;
			m_x += m_v * cos(m_theta) * dt;
		}
		else {
			m_status = WAIT;
			controlMsg = new CControlMsg;
			controlMsg->m_code = PUSHOK;
			controlMsg->m_tstamp = simTime;
			controlMsg->m_from = m_id;
			controlMsg->m_x = m_x;
			controlMsg->m_y = m_y;
			SendControlMsg(controlMsg);
		}
	}
	
	// If status is leading, the robot follow the planned path. If backing up, it has
	// a special planner. In both cases it broadcasts a data mesage to the other robots.
	if ( (m_status == LEAD) || (m_status == BACKUP) ){

		m_x += m_v * cos(m_theta) * dt;
		m_y += m_v * sin(m_theta) * dt;
		m_theta += m_w * dt;

		if (m_status == LEAD)
			FollowPath(simTime, m_localMap);
		else
			BackupManeuver(simTime, dt);

		// send data message each 0.01 "seconds"
		m_timer += dt;
		if ( m_timer > 0.01 ) {
			m_timer = 0;
			dataMsg = new CDataMsg;
			dataMsg->m_v = m_v;
			dataMsg->m_w = m_w;
			dataMsg->m_theta = m_theta;
			dataMsg->m_tstamp = simTime;
			SendDataMsg(dataMsg);
		}

	}
	// for the follow case, the velocity is set when the robot receives a data msg.
	else if (m_status == FOLLOW) {
	
		m_x += m_v * cos(m_theta) * dt;
		m_y += m_v * sin(m_theta) * dt;
		m_theta += m_w * dt;

	}

	// compute forces applied by the compliant arm
	ComputeForces(box);

	// recompute robot shape (polygon)
	m_polygon.Recompute(m_x, m_y, m_theta);
}


// compute forces applied by the compliant arm
void CRobotLabmate::ComputeForces(CBox* box)
{
	double k, c;
	double delta_p[3];	
	double delta_v[3];	
	double delta_va[3];
	double vbox_r[3];
	
	if ( (m_inContactBox) ) { 

		// computing arm position in the world frame, using the position of the box.
		m_armW[0] = m_armB[0] * cos(box->m_theta) - m_armB[1] * sin(box->m_theta) + box->m_x;
		m_armW[1] = m_armB[0] * sin(box->m_theta) + m_armB[1] * cos(box->m_theta) + box->m_y;
		m_armW[2] = m_armB[2] + box->m_theta;
		
		// Converting arm position from world coordinates to robot coordinates
		m_armR[0] = cos(m_theta) * m_armW[0] + sin(m_theta) * m_armW[1] - m_x * cos(m_theta) - m_y * sin(m_theta);
		m_armR[1] = -sin(m_theta) * m_armW[0] + cos(m_theta) * m_armW[1] - m_y * cos(m_theta) + m_x * sin(m_theta);
		m_armR[2] = m_armW[2] - m_theta;
		
		// Converting arm position from robot coordinates to arm coordinates
		m_armA[0] = m_armR[0] * cos(m_tR2A[2]) - m_armR[1] * sin(m_tR2A[2]) + m_tR2A[0];
		m_armA[1] = m_armR[0] * sin(m_tR2A[2]) + m_armR[1] * cos(m_tR2A[2]) + m_tR2A[1];
		m_armA[2] = m_armR[2] + m_tR2A[2];
		
		//Computing the arm displacements relative to the arm frame
		delta_p[0] =  MAX_ARM_DISP - m_armA[0];
		delta_p[1] =  0 - m_armA[1];
		delta_p[2] =  0 - m_armA[2];

		// Rotating box velocity from world coordinates to robot coordinates
		vbox_r[0] = cos(m_theta) * box->m_v[0] + sin(m_theta) * box->m_v[1];
		vbox_r[1] = -sin(m_theta) * box->m_v[0] + cos(m_theta) * box->m_v[1];
		vbox_r[2] = box->m_v[2];
		
		//Computing velocities relative to the robot
		delta_v[0] =  m_v - vbox_r[0];
		delta_v[1] =  -vbox_r[1];
		delta_v[2] =  -vbox_r[2];

		//Rotating resultant velocities to arm coordinates
		delta_va[0] = cos(m_tR2A[2]) * delta_v[0] - sin(m_tR2A[2]) * delta_v[1];
		delta_va[1] = sin(m_tR2A[2]) * delta_v[0] + cos(m_tR2A[2]) * delta_v[1];
		delta_va[2] = delta_v[2];

		k = 50;
		c = 1;
		
		m_force[0] = k * delta_p[0] + c * delta_va[0]; 
		m_force[1] = k * delta_p[1] + c * delta_va[1]; 
		m_force[2] = k * delta_p[2] + c * delta_va[2]; 
		
		if ( m_force[0] < 0 )	// the robots onlt apply positive forces in x
			m_force[0] = 0;
		
		// Putting the forces in world coordinates to compute the resultant forces.
		m_force_w[0] = m_force[0] * cos(m_theta - m_tR2A[2]) - m_force[1] * sin(m_theta - m_tR2A[2]);  //-m_tR2A[2] = +m_tA2R[2]
		m_force_w[1] = m_force[0] * sin(m_theta - m_tR2A[2]) + m_force[1] * cos(m_theta - m_tR2A[2]);
		m_force_w[2] = m_force[2];
	}
	else
		ComputeArmPos();
}

// Compute th arm position when the robots are not in contact with the box
void CRobotLabmate::ComputeArmPos()
{
	m_force_w[0] = 0;
	m_force_w[1] = 0;
	m_force_w[2] = 0;

	m_armA[0] = MAX_ARM_DISP;
	m_armA[1] = 0;
	m_armA[2] = 0;

	m_armR[0] = m_armA[0] * cos(m_tA2R[2]) - m_armA[1] * sin(m_tA2R[2]) + m_tA2R[0];
	m_armR[1] = m_armA[0] * sin(m_tA2R[2]) + m_armA[1] * cos(m_tA2R[2]) + m_tA2R[1];
	m_armR[2] = m_armA[2] + m_tA2R[2];

	m_armW[0] = m_armR[0] * cos(m_theta) - m_armR[1] * sin(m_theta) + m_x;
	m_armW[1] = m_armR[0] * sin(m_theta) + m_armR[1] * cos(m_theta) + m_y;
	m_armW[2] = m_armR[2] + m_theta;
}

// Draw the robot and the compliant arm
void CRobotLabmate::Draw(CDC *pDC)
{
	CPoint arm[5];

	if (m_tA2R[2] == 0) {
		arm[0] = m_polygon.GetPoint(1);
		arm[1] = CPoint( round( m_armW[0] + m_sizey * sin(m_armW[2]) ),
			             round( m_armW[1] - m_sizey * cos(m_armW[2]) ) );
		arm[2] = CPoint( round( m_armW[0] - m_sizey * sin(m_armW[2]) ),
			             round( m_armW[1] + m_sizey * cos(m_armW[2]) ) );
		arm[3] = m_polygon.GetPoint(2);
		arm[4] = arm[2];

	}
	else {
		double x_r = m_tA2R[0];
		double y_r = m_tA2R[1];

		double x_w = x_r * cos(m_theta) - y_r * sin(m_theta) + m_x;
		double y_w = x_r * sin(m_theta) + y_r * cos(m_theta) + m_y;

		arm[0] = CPoint( round( x_w ),
			             round( y_w ) );
		arm[1] = CPoint( round( m_armW[0] + m_sizey * sin(m_armW[2]) ),
			             round( m_armW[1] - m_sizey * cos(m_armW[2]) ) );
		arm[2] = CPoint( round( m_armW[0] - m_sizey * sin(m_armW[2]) ),
			             round( m_armW[1] + m_sizey * cos(m_armW[2]) ) );
		arm[3] = arm[0];

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品国产三级国产a| 一区二区三区高清| 91黄色激情网站| 精品一区二区三区免费播放| 亚洲精品中文字幕在线观看| www一区二区| 欧美日韩黄色影视| 97国产一区二区| 国产精品资源网| 五月综合激情日本mⅴ| 国产精品成人网| 久久毛片高清国产| 欧美大胆一级视频| 欧美日韩国产免费一区二区| 91尤物视频在线观看| 国产精品影视在线观看| 天天色天天操综合| 亚洲一区在线播放| 国产精品国产自产拍高清av王其| 国产精品激情偷乱一区二区∴| 日本aⅴ精品一区二区三区| 亚洲欧美自拍偷拍色图| 国产视频一区二区三区在线观看| 国产精品一品视频| 免费国产亚洲视频| 亚洲午夜精品17c| 亚洲欧美另类久久久精品2019| 91成人免费网站| av资源站一区| 成人精品高清在线| 国产传媒日韩欧美成人| 麻豆中文一区二区| 爽好久久久欧美精品| 午夜欧美一区二区三区在线播放| 精品国产成人在线影院 | 精品三级av在线| 欧美日韩一卡二卡三卡| 欧美午夜精品一区二区三区| 一本久久a久久免费精品不卡| 五月天丁香久久| 亚洲国产精品精华液网站| 夜夜精品浪潮av一区二区三区| 欧美一级国产精品| 7777精品伊人久久久大香线蕉的| 国产91精品一区二区| 国产精品资源网站| 风间由美一区二区三区在线观看| 亚洲伊人伊色伊影伊综合网| 一区二区三区四区五区视频在线观看| 91精品欧美福利在线观看| 欧美日韩精品一区二区三区蜜桃| 国产成人精品一区二| 丰满白嫩尤物一区二区| 不卡视频免费播放| 91麻豆产精品久久久久久| 欧美专区日韩专区| 欧美日韩中文一区| 日韩写真欧美这视频| 欧美成人女星排行榜| 久久久综合精品| 国产精品久久久久久久久久免费看| 欧美一区二区三区免费大片 | 日本女优在线视频一区二区 | 日韩一区精品字幕| 五月天亚洲精品| 日韩精品欧美精品| 国产中文一区二区三区| 成人禁用看黄a在线| 欧美主播一区二区三区| 日韩欧美一二三区| 国产精品灌醉下药二区| 亚洲成在人线免费| 国产精品一二三四五| 成人av高清在线| 欧美乱妇15p| 久久女同精品一区二区| 亚洲天堂2014| 日本成人在线视频网站| 国产不卡高清在线观看视频| 色av成人天堂桃色av| 欧美白人最猛性xxxxx69交| 国产欧美日韩卡一| 丝瓜av网站精品一区二区| 国产黄色91视频| 欧美午夜精品一区二区蜜桃| 久久综合999| 亚洲图片有声小说| 国产麻豆精品视频| 欧美日韩精品一区二区三区四区| 欧美日韩中文另类| 国产清纯白嫩初高生在线观看91 | 国产永久精品大片wwwapp| 91同城在线观看| 精品国产人成亚洲区| 亚洲综合一二区| 成人av动漫在线| 久久这里只有精品6| 亚洲成人第一页| 丁香婷婷综合网| 精品国产青草久久久久福利| 亚洲一区二区三区四区五区中文| 国产精品久久久久久久久久免费看 | 欧美精品第一页| 最好看的中文字幕久久| 青娱乐精品在线视频| 99国产精品久久| 久久精品一区四区| 丝袜美腿亚洲色图| 欧洲精品一区二区| 亚洲视频综合在线| 国产成人无遮挡在线视频| 欧美一区二区福利在线| 一区二区三区四区亚洲| 91视频你懂的| 国产欧美精品日韩区二区麻豆天美| 国产精品国产三级国产aⅴ无密码| 中文字幕色av一区二区三区| 国产一区二区三区电影在线观看| 国产一区高清在线| 欧美一个色资源| 视频一区欧美精品| 欧美日韩高清影院| 亚洲小少妇裸体bbw| 欧美在线免费播放| 亚洲在线中文字幕| 欧美性猛交xxxx乱大交退制版 | 国产精品自拍在线| 精品久久久久久久久久久久包黑料 | 一区二区三区免费观看| 99re视频这里只有精品| 国产精品久久久久一区| 大美女一区二区三区| 国产片一区二区三区| 丁香婷婷综合色啪| 国产精品成人一区二区三区夜夜夜| 亚洲一区自拍偷拍| 色综合视频一区二区三区高清| 91精品久久久久久蜜臀| 亚洲成人自拍一区| 777久久久精品| 麻豆免费精品视频| 欧美精品一区二区三区视频| 国产在线精品一区二区三区不卡 | 亚洲午夜在线电影| 欧美性xxxxxx少妇| 婷婷亚洲久悠悠色悠在线播放| 国产精品一区二区久久不卡| 久久亚洲精品国产精品紫薇| 国产久卡久卡久卡久卡视频精品| 欧美唯美清纯偷拍| 亚洲国产日韩一区二区| 欧美男人的天堂一二区| 麻豆精品一区二区| 久久精品欧美一区二区三区不卡| 亚洲成人免费观看| 日韩欧美一区中文| 国产揄拍国内精品对白| 国产精品理论片在线观看| 色老汉av一区二区三区| 亚洲一区二区四区蜜桃| 91精品欧美综合在线观看最新 | 午夜精品久久久久影视| 在线不卡的av| 国产精品一区二区三区99| 国产精品盗摄一区二区三区| 欧美日韩一区二区三区四区| 麻豆精品视频在线| 国产精品久久二区二区| 欧美日韩国产在线观看| 激情成人午夜视频| 日韩理论在线观看| 欧美一区二区三区小说| 成人禁用看黄a在线| 性感美女极品91精品| 久久亚洲欧美国产精品乐播| 欧洲一区在线观看| 久久福利视频一区二区| 亚洲日本在线a| 欧美大片日本大片免费观看| 91偷拍与自偷拍精品| 久久99深爱久久99精品| 亚洲欧美中日韩| 欧美xxxxx牲另类人与| 色婷婷综合久久| 精品一区二区三区在线视频| 亚洲免费三区一区二区| 精品国产一区二区亚洲人成毛片| 蜜桃一区二区三区在线| 国产精品少妇自拍| 欧美日韩精品一区二区三区四区 | 国产日韩欧美不卡在线| 欧美性视频一区二区三区| 国产不卡在线一区| 香蕉成人啪国产精品视频综合网| 欧美综合亚洲图片综合区| 国产伦理精品不卡| 丝袜亚洲精品中文字幕一区| 亚洲免费在线看| 国产精品色哟哟| 欧美成人艳星乳罩|