⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 avoiddlg.cpp

📁 上海广茂达as-r机器人避障程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
         ReleaseInterface(m_pImageCap);
    }

	if( m_pMotion )
	{
	    m_pMotion->Abort(WHEEL_LEFT);
		m_pMotion->Abort(WHEEL_RIGHT);

		m_pMotion->End();
		ReleaseInterface(m_pMotion);
	}

	if( m_pRobot )
	{
		m_pRobot->DestroyInstance();
		m_pRobot = NULL;
	}
}


unsigned __stdcall CAVOIDDlg::PsdProc(LONG nOwner,void* lpParam)
{
	float* pValue = (float*)lpParam;
	CAVOIDDlg* pThis = (CAVOIDDlg*)nOwner;
   
  if(pThis->bRun)
  { 
	for( int i = 0;i<MAX_PSD;i++ )
	{	if(pValue[i]>80)
			{pThis->m_getPsd[i]=80;}
	    else if(pValue[i]<0)
			{pThis->m_getPsd[i] =0;}
	    else 
			{pThis->m_getPsd[i] = pValue[i];}
      
	}
  pThis->MOVE(pThis->m_getPsd,pThis->m_getSonar);

  }

  else 
  {
	for( int i = 0;i<MAX_PSD;i++ )
	{
    pThis->m_getPsd[i] =0;
    pThis->MOVE(pThis->m_getPsd,pThis->m_getSonar);
	}
  }

    return 0;
}

unsigned __stdcall CAVOIDDlg::SonarProc(LONG nOwner,void* lpParam)
{
	double* pValue = (double*)lpParam;
	CAVOIDDlg* pThis = (CAVOIDDlg*)nOwner;
    
	
if(pThis->bRun)
	{	
	for( int i = 0;i<MAX_Sonar;i++ )
		{
    	if(pValue[i]>3)
			{pThis->m_getSonar[i] =3;}
	    else if(pValue[i]<0)
			{pThis->m_getSonar[i] =0;}
	    else 
			{pThis->m_getSonar[i] = pValue[i];}
      
		}
      
	}
 else 
	{
	 for( int i = 0;i<MAX_Sonar;i++ )
		{
         pThis->m_getSonar[i] =0;
		}
	}	
	return 0;
}

void CAVOIDDlg::OnDestroy() 
{   
	EndEnv();
	CDialog::OnDestroy();
	
	// TODO: Add your message handler code here
	
}

void CAVOIDDlg::OnRun() 
{
	
   bRun =TRUE;
   
}



void CAVOIDDlg::MOVE(double m_getPsd[],double m_getSonar[]) 
{
	// TODO: Add your control notification handler code here
	if( !m_pMotion)
	{
		return;
	}

	if( !bRun)
	{
		return;
	}
        
    if (m_getPsd[0] ==80)
	{
		dData[0]=m_getSonar[0]<m_getSonar [1]?m_getSonar[0]:m_getSonar [1];
        dData[0]=dData[0]*100;
	}
    else
	{
	  dData[0]=m_getPsd [0];
	}

    if (m_getPsd[3] ==80)
	{
	  dData[2]=m_getSonar[3]<m_getSonar [4]?m_getSonar[3]:m_getSonar [4];
      dData[2]=dData[2]*100;
	}
    else
	{
	  dData[2]=m_getPsd [3];
	}

     if (m_getPsd[1] ==80 && m_getPsd [2] ==80)
	{
      dData[1]=m_getSonar [2]*100;
	}
     else if (m_getPsd[1] ==80 || m_getPsd [2] ==80)
	 {
	  dData[1]=m_getPsd[2] ==80 ?m_getPsd[1]:m_getPsd [2];
	 }
   
	 else if (m_getPsd[1] <80&& m_getPsd [2] <80)
   {
	dData[1]=m_getPsd[1]<m_getPsd [2]?m_getPsd[1]:m_getPsd [2];
   }

 
  m_graph.SetData(dData,sizeof(dData));

  if(dData[1]<m_dSafeDis) 
{
	if(dData[0]<m_dSafeDis && dData[2]<m_dSafeDis) 
  { 
     if (dData[0]<dData[2])
       {m_pMotion->Move(WHEEL_LEFT,-m_dTurnSpeed);      
        m_pMotion->Move(WHEEL_RIGHT,-m_dTurnSpeed-0.1);}
     else 
		{m_pMotion->Move(WHEEL_LEFT,-m_dTurnSpeed-0.1);                                            
         m_pMotion->Move(WHEEL_RIGHT,-m_dTurnSpeed);}
		}
  else if(dData[0]<m_dSafeDis && dData[2]>m_dSafeDis && dData[2]-m_dSafeDis>100 ) 
	 {
		m_pMotion->Move(WHEEL_LEFT,m_dTurnSpeed+0.1);                          
        m_pMotion->Move(WHEEL_RIGHT,m_dTurnSpeed);
	 }
  else if ( dData[0]>m_dSafeDis&&dData[0]-m_dSafeDis >100 && dData[2]<m_dSafeDis) 
	 {
		m_pMotion->Move(WHEEL_LEFT,m_dTurnSpeed);                     
		m_pMotion->Move(WHEEL_RIGHT, m_dTurnSpeed+0.1);
	 }
  else if ( dData[0]>m_dSafeDis && dData[2]>m_dSafeDis && dData[0]-m_dSafeDis >100 && dData[2]-m_dSafeDis >100) 
	 {  
		m_pMotion->Move(WHEEL_LEFT,m_dTurnSpeed+0.1);                          
        m_pMotion->Move(WHEEL_RIGHT, m_dTurnSpeed);
	 }

  else 
	 {
        m_pMotion->Move(WHEEL_LEFT,m_dTurnSpeed);      
        m_pMotion->Move(WHEEL_RIGHT,-m_dTurnSpeed);
	 }

}

else if( dData[1]>m_dSafeDis) 
{ 
  if (dData[0]<m_dSafeDis && dData[2]>m_dSafeDis && dData[2]-m_dSafeDis >100)
  {
	 m_pMotion->Move(WHEEL_LEFT,m_dTurnSpeed+0.1);                                    
	 m_pMotion->Move(WHEEL_RIGHT, m_dTurnSpeed);
  }
  else if (dData[0]>m_dSafeDis && dData[0]-m_dSafeDis >100 && dData[2]<m_dSafeDis)
  { 
	 m_pMotion->Move(WHEEL_LEFT,m_dTurnSpeed);                            
     m_pMotion->Move(WHEEL_RIGHT,m_dTurnSpeed+0.1);
  }	
 
  else if (dData[0]>m_dSafeDis && dData[2]>m_dSafeDis && dData[0]-m_dSafeDis >100 && dData[1]-m_dSafeDis >100 && dData[2]-m_dSafeDis >100)
  {	 
	 bRun =FALSE;
	 bGOGO=TRUE;

  }
  else 
  {
     m_pMotion->SetDCC(WHEEL_LEFT,m_dDcc);                              
     m_pMotion->SetDCC(WHEEL_RIGHT,m_dDcc);
  }
}  
     
}


void CAVOIDDlg::TraceDecide(int nArea,int x,int y)//跟踪程序段开始
{
    //TRACER_PARAM nState;
	CUR_STATE	curState = UNKNOWN;//设置状态变量初值

	if(nArea>0)//目标在成像平面中的情况
	{
		if( x<X1 )
		{
			curState |= HORZ_LEFT;//在左边
		}
		else if(x>X2) 
		{
			curState |= HORZ_RIGHT;//在右边
		}
		else
		{
			curState |= HORZ_MIDDLE;//在中间
		}
		
		if(y<Y1)
		{
			curState |= VERT_FOR;//在前面
		}
		else if(y>Y2)
		{
			curState |= VERT_BACK;//在后面
		}
		else
		{
			curState |= VERT_MIDDLE;//在中间
		}
	}
	else
	{   
		curState = OUTSIGHT;//不在成像平面	
	}

	if(curState&VERT_MIDDLE)//按位取与判断状态值
	{
		 if(curState&HORZ_MIDDLE)
		 {	TRACE("Keep\n");
			m_pMotion->Stop(WHEEL_LEFT);
			m_pMotion->Stop(WHEEL_RIGHT);
		 }
		 else if(curState&HORZ_LEFT)
		 {
			TRACE("MIDDLE AND LEFT\n");
			m_pMotion->Move(WHEEL_LEFT,-m_dTurnSpeed);
			m_pMotion->Move(WHEEL_RIGHT,m_dTurnSpeed+0.1);
		 }
		 else if(curState&HORZ_RIGHT)
		 {
			TRACE("MIDDLE AND RIGHT\n");
		
			m_pMotion->Move(WHEEL_LEFT,m_dTurnSpeed+0.1);
			m_pMotion->Move(WHEEL_RIGHT,-m_dTurnSpeed);
		 }

	}
	
	else if(curState&VERT_FOR)
	{
		if(curState&HORZ_MIDDLE)
		{
			TRACE("FOR and MIDDLE\n");
			m_pMotion->Move(WHEEL_LEFT,m_dTurnSpeed);
			m_pMotion->Move(WHEEL_RIGHT,m_dTurnSpeed);
		}
		else if(curState&HORZ_LEFT)
		{
			TRACE("FOR and LEFT\n");
			m_pMotion->Move(WHEEL_LEFT,m_dTurnSpeed-0.05);
			m_pMotion->Move(WHEEL_RIGHT,m_dTurnSpeed);
		}
		else if(curState&HORZ_RIGHT)
		{
			TRACE("FOR and RIGHT\n");
			m_pMotion->Move(WHEEL_LEFT,m_dTurnSpeed);
			m_pMotion->Move(WHEEL_RIGHT,m_dTurnSpeed-0.05);
		}
	
	}
	
	else if(curState&VERT_BACK)
	{
		if(curState&HORZ_MIDDLE)
		{
			TRACE("BACK and MIDDLE\n");
			m_pMotion->Move(WHEEL_LEFT,-m_dTurnSpeed);
			m_pMotion->Move(WHEEL_RIGHT,-m_dTurnSpeed);
		}
		else if(curState&HORZ_LEFT)
		{
			TRACE("BACK and LEFT\n");
			m_pMotion->Move(WHEEL_LEFT,-m_dTurnSpeed-0.1);
			m_pMotion->Move(WHEEL_RIGHT,-m_dTurnSpeed);
		}
		else if(curState&HORZ_RIGHT)
		{
			TRACE("BACK and RIGHT\n");
			m_pMotion->Move(WHEEL_LEFT,-m_dTurnSpeed);
			m_pMotion->Move(WHEEL_RIGHT,-m_dTurnSpeed-0.1);
		}
	
	}
  
	else if(curState == OUTSIGHT) 
	{	
		if(nState & HORZ_LEFT)
		{
			TRACE("OUT to unclock\n");
			m_pMotion->Move(WHEEL_LEFT,-m_dTurnSpeed+0.1);
			m_pMotion->Move(WHEEL_RIGHT,m_dTurnSpeed);
		}
		else if(nState & HORZ_RIGHT)
		{
			TRACE("OUT to clock\n");
			m_pMotion->Move(WHEEL_LEFT,m_dTurnSpeed);
			m_pMotion->Move(WHEEL_RIGHT,-m_dTurnSpeed+0.1);
		}
		else
		{
		   TRACE("Still OUT\n");
		   
		}
		
	  
	}
     nState = curState;
	 bRun=TRUE;
	 bGOGO=FALSE;
}


void CAVOIDDlg::OnStop() 
{  
	bRun=FALSE;
    m_pMotion->Move(WHEEL_LEFT,0); 
	m_pMotion->Move(WHEEL_RIGHT,0);
}

IASRFootball* CAVOIDDlg::GetImageProcess()
{
	return m_pImageProcess;
}

⌨️ 快捷键说明

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