demo.cpp
来自「足球机器人功能demo」· C++ 代码 · 共 427 行
CPP
427 行
// Demo.cpp: implementation of the CDemo class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "Demo.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CDemo::CDemo()
{
m_nDistance = 30;
m_BehShow = NULL;
showcount = 0;
Active = FALSE;
pos = 0;
m_CV.SetParam(&m_para);
}
CDemo::~CDemo()
{
}
void CDemo::AfterUpdateInfrared(UCHAR *Infrared,BOOL *EnableIR,UINT nState)
{
//红外信号更新
}
double FindMinUSonic (DOUBLE *Ultrasonic,unsigned char StartNum,unsigned char EndNum)
{
unsigned char i = StartNum;
double TempDouble = 1000;
if(StartNum<=EndNum)
{
for(i=StartNum;i<=EndNum;i++)
{
if(TempDouble > Ultrasonic[i] )
TempDouble = Ultrasonic[i];
}
}
else
{
for(i=StartNum;i<=23;i++)
{
if(TempDouble > Ultrasonic[i] )
TempDouble = Ultrasonic[i];
}
for(i=0;i<=EndNum;i++)
{
if(TempDouble > Ultrasonic[i] )
TempDouble = Ultrasonic[i];
}
}
return TempDouble;
}
void CDemo::AfterUpdateUSonic(DOUBLE *Ultrasonic,BOOL *EnableUS,UINT nState)
{/*
unsigned int RoboState = 0,SpeedTurnVp = 1000,SpeedForthVp = 3000;
signed int TempSpeedForth=0,TempSpeedTurn=0;
signed int MaxSpeedForth = 2000,MaxSpeedTurn = 800;
double TempMinDistance;
double distance_F = 0.5;
double distance_F_Max = 0.3;
double distance_F_Nin = 0.3;
double distance_L = 0.5;
double distance_R = 0.5;
//超声信号更新
if ( //前方有障碍物
Ultrasonic[0] < distance_F ||
Ultrasonic[1] < distance_F ||
Ultrasonic[2] < distance_F ||
Ultrasonic[20] < distance_F ||
Ultrasonic[21] < distance_F ||
Ultrasonic[22] < distance_F ||
Ultrasonic[23] < distance_F
)
{
//判断较好的转动方向
if (m_bFindDirection(Ultrasonic,EnableUS))
{
TempSpeedForth = 0;
TempSpeedTurn = MaxSpeedTurn;
}
else
{
TempSpeedForth = 0;
TempSpeedTurn = 0-MaxSpeedTurn;
}
if(nState == RIGHT)
{
TempSpeedForth = 0;
TempSpeedTurn = MaxSpeedTurn;
}
else if(nState == LEFT)
{
TempSpeedForth = 0;
TempSpeedTurn = 0-MaxSpeedTurn;
}
m_pCmd->SetBothMotorsSpeed(TempSpeedForth+TempSpeedTurn,
TempSpeedForth-TempSpeedTurn);
//前方distance距离内有障碍物,进入转向状态
m_strShow.Format("前方障碍物 : %d,%d",TempSpeedForth+TempSpeedTurn,TempSpeedForth-TempSpeedTurn);
output(&m_strShow);
}
else if( //左方可能有障碍物干扰
Ultrasonic[19] < distance_L ||
Ultrasonic[18] < distance_L
)
{
TempMinDistance = FindMinUSonic (Ultrasonic,18,19);
TempSpeedTurn = (signed int)((distance_L-TempMinDistance)*SpeedTurnVp);
if(TempSpeedTurn > MaxSpeedTurn)
TempSpeedTurn = MaxSpeedTurn/2;
TempMinDistance = FindMinUSonic (Ultrasonic,22,0);
TempSpeedForth = (signed int)((TempMinDistance-distance_F_Nin)*SpeedForthVp);
if(TempSpeedForth > MaxSpeedForth)
TempSpeedForth = MaxSpeedForth;
m_pCmd->SetBothMotorsSpeed(TempSpeedForth+TempSpeedTurn,
TempSpeedForth-TempSpeedTurn);
//前方distance距离内有障碍物,进入转向状态
m_strShow.Format("左有障碍 : %d,%d",TempSpeedForth+TempSpeedTurn,TempSpeedForth-TempSpeedTurn);
output(&m_strShow);
}
else if( //右方可能有障碍物干扰
Ultrasonic[4] < distance_R ||
Ultrasonic[5] < distance_R
)
{
TempMinDistance = FindMinUSonic (Ultrasonic,4,5);
TempSpeedTurn = (signed int)((distance_R-TempMinDistance)*SpeedTurnVp);
if(TempSpeedTurn > MaxSpeedTurn)
TempSpeedTurn = MaxSpeedTurn/2;
TempMinDistance = FindMinUSonic (Ultrasonic,22,1);
TempSpeedForth = (signed int)((TempMinDistance-distance_F_Nin)*SpeedForthVp);
if(TempSpeedForth > MaxSpeedForth)
TempSpeedForth = MaxSpeedForth;
m_pCmd->SetBothMotorsSpeed(TempSpeedForth-TempSpeedTurn,
TempSpeedForth+TempSpeedTurn);
//前方distance距离内有障碍物,进入转向状态
m_strShow.Format("右有障碍 : %d,%d",TempSpeedForth-TempSpeedTurn,TempSpeedForth+TempSpeedTurn);
output(&m_strShow);
}
else
{
TempMinDistance = FindMinUSonic (Ultrasonic,22,0);
TempSpeedForth = (signed int)((TempMinDistance-distance_F_Nin)*SpeedForthVp);
if(TempSpeedForth > MaxSpeedForth)
TempSpeedForth = MaxSpeedForth;
if(nState == LEFT || nState == RIGHT)
{
TempSpeedForth /=2;
}
TempSpeedTurn = 0;
m_pCmd->SetBothMotorsSpeed(TempSpeedForth+TempSpeedTurn,
TempSpeedForth-TempSpeedTurn);
//前方distance距离内有障碍物,进入转向状态
m_strShow.Format("无障前进 : %d,%d",TempSpeedForth+TempSpeedTurn,TempSpeedForth+TempSpeedTurn);
output(&m_strShow);
}
/*
switch(nState)
{
case STOP: //机器人处于停止状态
//判断前方是否有障碍物
if (
Ultrasonic[0] < distance_L ||
Ultrasonic[1] < distance_L ||
Ultrasonic[2] < distance_L ||
Ultrasonic[20] < distance_L ||
Ultrasonic[21] < distance_L ||
Ultrasonic[22] < distance_L ||
Ultrasonic[23] < distance_L
)
{
//前方distance距离内有障碍物,进入转向状态
m_strShow.Format("前方障碍物");
output(&m_strShow);
//判断较好的转动方向
if (m_bFindDirection(Ultrasonic,EnableUS))
{
m_pCmd->SetBothMotorsSpeed(100,-100);
}
else
{
m_pCmd->SetBothMotorsSpeed(-100,100);
}
}
else
{
}
break;
case FORWARD: //机器人处于往前直行状态
//前方障碍物距离大于distance
if (Ultrasonic[0] > distance &&
Ultrasonic[1] > distance &&
Ultrasonic[2] > distance &&
Ultrasonic[20] > distance &&
Ultrasonic[21] > distance &&
Ultrasonic[22] > distance &&
Ultrasonic[23] > distance)
{
break;
}
else
{
//前方有障碍物,根据障碍物情况选择转动方向
m_strShow.Format("前方障碍物");
output(&m_strShow);
if (m_bFindDirection(Ultrasonic,EnableUS))
{
m_pCmd->SetBothMotorsSpeed(100,-100);
}
else
{
m_pCmd->SetBothMotorsSpeed(-100,100);
}
}
break;
case BACKWARD: //机器人处于往后直行状态
break;
case RIGHT: //机器人处于原地右转状态
case RIGHTFRONT: //机器人处于右转前行状态
//break;
case LEFT: //机器人处于原地左转状态
case LEFTFRONT: //机器人处于左转前行状态
if (
Ultrasonic[20] > m_nDistance &&
Ultrasonic[21] > m_nDistance &&
Ultrasonic[22] > m_nDistance &&
Ultrasonic[23] > m_nDistance &&
Ultrasonic[1] > m_nDistance &&
Ultrasonic[2] > m_nDistance &&
Ultrasonic[3] > m_nDistance
)
{
m_strShow.Format("前方无障碍物");
output(&m_strShow);
m_pCmd->SetBothMotorsSpeed(150,150);
}
break;
default: //机器人处于不明状态
m_pCmd->Brake(1);
nState = STOP;
break;
}
*/
}
void CDemo::AfterUpdateVideoSample(BYTE *pBuffer, long lWidth, long lHeight,double dbTime,UINT nState)
{
if (pos != 1)
{
return;
}
//摄像头图像祯更新
m_CV.ImageBuf(lWidth,lHeight,pBuffer);
m_CV.FindSplash(TRUE);
if (m_para.Uen == TRUE)
{
m_strShow.Format("U分量:(%d,%d):%d",m_para.Ux,m_para.Uy,m_para.Usum);
output(&m_strShow);
}
if (m_para.Ven == TRUE)
{
m_strShow.Format("V分量:(%d,%d):%d",m_para.Vx,m_para.Vy,m_para.Vsum);
output(&m_strShow);
}
if (m_para.Ysum == 0 && m_para.Usum == 0 && m_para.Vsum == 0)
{ //针对某些线程阻塞的情况
m_para.bBusy = FALSE;
}
}
void CDemo::AfterSendCommand(BYTE *pBuffer, int iLength,UINT nState)
{
//发送了新的指令
}
BOOL CDemo::m_bFindDirection(DOUBLE *Ultrasonic,BOOL *EnableUS)
{
double distance = 0; //用于计算最佳移动方向的中间变量
int direction = 0; //用于计算最佳方向的中间变量
bool found = false; //标记是否找到移动最佳方向
for (int i=0;i<24;i++) //循环扫描8个方向
{
if (Ultrasonic[i] == 120 && EnableUS[i]==true ) //如果有一个方向无障碍物,中断扫描,确定此方向为移动
{
direction = i;
found = true;
break;
}
if (Ultrasonic[i] > distance && EnableUS[i]==true)
{
distance = Ultrasonic[i]; //如果该方向距离比历史记录大,刷新历史记录
direction = i; //记录距离最大方向
found = true; //找到一个方向,做标记
}
}
if (found == FALSE)
{
return true;
}
//if (dRightSum >= dLeftSum)
if(direction < 12)
{
return true;
}
else
{
return false;
}
}
void CDemo::AfterUpdateOverlook(BYTE *pBuffer, long lWidth, long lHeight, double dbTime, UINT nState)
{
if (pos != 2)
{
return;
}
//全景摄像头图像祯更新
m_CV.ImageBuf(lWidth,lHeight,pBuffer);
m_CV.FindSplash(TRUE);
if (m_para.Uen == TRUE)
{
m_strShow.Format("U分量:(%d,%d):%d",m_para.Ux,m_para.Uy,m_para.Usum);
output(&m_strShow);
}
if (m_para.Ven == TRUE)
{
m_strShow.Format("V分量:(%d,%d):%d",m_para.Vx,m_para.Vy,m_para.Vsum);
output(&m_strShow);
}
if (m_para.Ysum == 0 && m_para.Usum == 0 && m_para.Vsum == 0)
{ //针对某些线程阻塞的情况
m_para.bBusy = FALSE;
}
}
void CDemo::output(CString *strShow)
{
if (m_BehShow != NULL)
{
m_BehShow->AddString(*strShow);
m_BehShow->SetCurSel(m_BehShow->GetCount()-1);
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?