RunCore.c 7.1 KB
#include "RunCore.h"

//雷达避障减速处理
int laserSlowDownProcess(int baseSpeed)
{
    if (agv.Public.i_DoubleReduction && baseSpeed > 50) //先执行二级避障,如果速度大于50减速到50
    {
        baseSpeed = 50;
    }
    else if (agv.Public.i_Reduction && baseSpeed > 100) //没有二级避障就执行一级避障,减速到100
    {
        baseSpeed = 100;
    }
    return baseSpeed;
}

void setMotorSpeedSlope(float speedSlope)
{
    TongyiStruct1.speedSlope = speedSlope;

    TongyiStruct3.speedSlope = speedSlope;
}

void StopChassis(float speedSlope)
{
    TongyiStruct1.setSpeed = 0;
		TongyiStruct3.setSpeed = 0;
}

void StopAgv(int speedSlope)
{
		TongyiStruct1.setSpeed = 0;
		TongyiStruct3.setSpeed = 0;
		Lifter1.setSpeed = 0;
		Rotate1.setSpeed = 0;
		
}

//报警代码处理,返回1代表没有报警,返回0代表报警
u8 alarmCodeProcess(u32 ErrorFlag)
{
    static int i = 0, i2 = 0;
    if (ErrorFlag & 0x1f9a) //碰撞/急停/脱轨/系统预停车停车PLC急停
    {
        if (ErrorFlag & 0x1000) //
        {
            LED_color(LED_red, 1000);

            agv.Command.MusicFlag = Music_Derail; //语音提示
        }
				else if (ErrorFlag & 0x0100) //急停停车
        {
            LED_color(LED_red, 0);

            agv.Command.MusicFlag = Music_Emg; //语音提示
        }
				else if (ErrorFlag & 0x0400) //货架丢失报警
        {
            LED_color(LED_red, 1000);

            agv.Command.MusicFlag = UpDwMoterMs;
        }
        else if (ErrorFlag & 0x0200) //目标停车
        {
            LED_color(LED_blue, 1000);
            agv.Command.MusicFlag = Music_Arrivel; //语音提示
            StopChassis(10);
        }
        else if (ErrorFlag & 0x0008) //脱轨
        {
            LED_color(LED_all, 1000);

            agv.Command.MusicFlag = Music_Derail;
        }
        else if (ErrorFlag & 0x0080) //
        {
            LED_color(LED_all, 1000);
        }
        else if (ErrorFlag & 0x0800) //驱动器报警
        {
            LED_color(LED_red, 1000);

            agv.Command.MusicFlag = Music_Driver;
        }
        else if (ErrorFlag & 0x0002) //碰撞停车
        {
            LED_color(LED_rg, 0);

            agv.Command.MusicFlag = Music_Et; //语音提示
        }
        else
        {
            LED_color(LED_red, 500);
        }
        StopAgv(50);

        return 0;
    }
    else if (ErrorFlag & 0x60E7) //红外/暂停/单机停车/系统停车/二维码对中心
    {
        if (ErrorFlag & 0x4000) //低电量
        {
            LED_color(LED_gy, 1000);

            agv.Command.MusicFlag = Music_Power; //语音提示
        }
				else if (ErrorFlag & 0x0080) //二维码对中心
        {
            LED_color(LED_rg, 1000);
        }
        else if (ErrorFlag & 0x0020) //货架纠偏
        {
            LED_color(LED_rg, 1000);
        }
        else if (ErrorFlag & 0x0040) //系统停车
        {
            LED_color(LED_yellow, 0);
						
						agv.Command.MusicFlag = Music_close;
						
            agv.Public.i_UpdatePathSig = 1;
					
            StopChassis(10);
            return 1;
        }
        else if (ErrorFlag & 0x0004) //暂停
        {
					if(Camera.UpdataFlag)
					{
						LED_color(LED_yellow, 100);
					}
					else
						LED_color(LED_yellow, 1000);

						agv.Command.MusicFlag = Music_Pause;
        }
        else if (ErrorFlag & 0x0001) //红外
        {
            LED_color(LED_ry, 0);

            agv.Command.MusicFlag = Music_Laser; //语音提示
        }
				else if (ErrorFlag & 0x2000) //定位失败
        {
            LED_color(LED_all, 1000);

            agv.Command.MusicFlag = Music_close;
        }
        else
        {
            LED_color(LED_red, 500);
        }
        StopAgv(5);

        return 0;
    }
    else
    {
			if(Camera.UpdataFlag)
			{
        LED_color(LED_blue, 100);
			}
			else
				LED_color(LED_blue, 1000);

        agv.Command.MusicFlag = Music; //正常音乐播放
							
        return 1;
    }
}


//agv主要任务处理
void AGVRunCore()
{
	static u8 HandAutiSelect = 1;
	LEDprocess();//小车指示灯处理
	if (!agv.Command.Au_Hand)//手动模式
	{
		HandAutiSelect = 1;
		LED_color(LED_yellow, 1000);//手动模式黄色

		agv.Command.MusicFlag = Music_close;//关闭音乐播放
		
		if(agv.Public.i_HandCentringDown)//下对中
		{
			LookforQRCodeCenter();
			
			if(!(agv.Public.Error_Flag & 0x0100))//不是急停情况下
			{
				LookforQRCodeCenterSetSpeed();//地面纠偏速度发送
			}
			else
			{
				TongyiStruct1.setSpeed = 0;
		TongyiStruct3.setSpeed = 0;
			}
//			platformControlAuto();//联动旋转
		}
		else
		{
			chassisControlManual();		//底盘点动控制

			platformControlManual(); 	//平台点动控制

			clearPathInfomation();	//清除路径信息
		}
			
	}
	else //自动模式
	{
		if(HandAutiSelect && TongyiStruct4.initStep==4)
		{
			HandAutiSelect = 0;
			TongyiStruct2.angleNum = 0;
			TongyiStruct4.angleNum = 0;
		}
		static int icount = 0;
		
		pathUpdate(&agv.Command.standSiteID); //执行路径更新 和站点++判断。
		
		//如果当前在二维码上,就必须用二维码导航
		
		if(agv.Command.RunMode)		
			slamNavigation();//激光导航
		else	
			QRcodeNavigation();//二维码导航

		if (alarmCodeProcess(agv.Public.Error_Flag))//报警代码处理返回1(待完成超距、通讯超时报警),证明没有报警,进入运动控制部分
		{
			chassisGetAutoSpeed(&agv.Command.CurDirection);															//****行走计算部分****根据不同运动方向 平移 直行 旋转 转弯以及距离目的地距离 确定agv速度

				platformControlAuto();																											//****平台计算和执行部分****待完成不同底盘上部结构运动处理 平台状态可能会要求agv减速或停车已完成对接

			agv.Command.SetBaseSpeed = laserSlowDownProcess(agv.Command.SetBaseSpeed); 	//****雷达判断部分****雷达避障减速处理 agv整体速度减速
				
			chassisControlAuto();																												//****行走执行部分****根据不同底盘 agv整体速度 通过pid值计算差速agv的速度差或者舵轮agv的角度等 设置驱动器速度,避障减速处理
			
		}
		if(agv.Public.Error_Flag == 0x200 || agv.Public.Error_Flag == 0x040)//路径走完有停稳信号可以旋转
		{
			platformControlAuto();
				chassisControlManual();//充电旋转
		}
		//以货架二维码停车
		if(agv.Public.i_PlatformStopFlag)//寻找货架二维码中心位置
		{
			LookforPlatformPos();
			
			if(!(agv.Public.Error_Flag & 0x0100))//不是急停情况下
			{
				LookforPlatformaSetSpeed();//货架纠偏速度发送
			}
		}
		//以地面二维码停车
		if(agv.Public.i_QRCodeCenterStopFlag)//寻找货架二维码中心位置
		{
			LookforQRCodeCenter();
			
			if(!(agv.Public.Error_Flag & 0x0100))//不是急停情况下
			{
				LookforQRCodeCenterSetSpeed();//地面纠偏速度发送
			}
			platformControlAuto();//联动旋转
		}
	}
//	if(Lifter1.liftState == 1)
//		agv.Parameter.HandTurnSpeed = 100;
//	else
//		agv.Parameter.HandTurnSpeed = 200;
}


void _AppTaskRunCoreUpdate(void)
{
	static int reportTime = 300;
	
	SlamDataProcess(); 	//工控机SLAM通讯

	platformDataProcess();//根据不同平台IO数据处理

	reportRPTPose(reportTime);	//上报调度信息

	SendDataToHMI(); 			//发送数据给到触摸屏
	
	ReceiDataformHMI();
//	if(agv.Command.HandMotorState||agv.Command.CurDirection == 3 || agv.Command.CurDirection == 4)
//	{
//		agv.Command.LaserArea = 3;//旋转区域设置
//	}
//	agv.Command.LaserArea = 0;
	Laser_Run(agv.Command.LaserArea); 	//激光区域选择
//	HMIDataUpdate();
	
	Laser_RosRun(agv.Command.LaserArea);

//  UartReceiveDataFromSystem(); 				//获取调度系统下发数据

	AGVRunCore(); 											//agv运动控制和逻辑处理
}