Laser.c 6.55 KB
#include "Laser.h"
//#if P_SETUP_NAV_TYPE == 2
uint16_t SlamAddCheckSumCRC(unsigned char *cBuffer, unsigned short iBufLen)
{
    uint16_t wCrc = 0;
    unsigned char Sum = 0, i = 0;
    for (i = 1; i < iBufLen; i++)
    {
        Sum += cBuffer[i];
    }
    return Sum;
}


unsigned int Prepare_UartToROS_Send(unsigned char string_out[])
{
    short i = 0;
    unsigned char sum = 0,MoveState = 0;
    static unsigned char string_len = 0;
		float X1speed = 0, X2speed = 0, Xspeed = 0,Y1speed = 0, Y2speed = 0, Yspeed = 0;
		if(TongyiStruct1.setSpeed == 0 && TongyiStruct3.setSpeed == 0)
			MoveState = 0;
		else
			MoveState = 1;
    X1speed = (float)TongyiStruct1.encodeSpeed / 1000.0f*cos(TongyiStruct2.encodeAngleNum/57.3);
    X2speed = (float)TongyiStruct3.encodeSpeed / 1000.0f*cos(TongyiStruct4.encodeAngleNum/57.3);
    Xspeed = (X1speed + X2speed) / 2;
		
		Y1speed = (float)TongyiStruct1.encodeSpeed / 1000.0f*sin(TongyiStruct2.encodeAngleNum/57.3);
    Y2speed = (float)TongyiStruct3.encodeSpeed / 1000.0f*sin(TongyiStruct4.encodeAngleNum/57.3);
    Yspeed = (Y1speed + Y2speed) / 2;

    //  double TimeStamp = ((double)TIM_GetCounter(TIM7)) / (4000.0f / 0.95);
    //	TIM_SetCounter(TIM7, 0);

    string_len = sprintf((char *)string_out, "$%.3f,%.3f,%.3f,%d,%d,%d,%d*", Xspeed, Yspeed, 0.02, 1,0,MoveState,0);
    for (i = 1; i < string_len - 1; i++)
    {
        sum += string_out[i];
    }
    string_len += sprintf((char *)string_out + string_len, "%02X#\r\n", sum);
    return string_len;
}

void UartToROS_Send_Info_To_Server()
{
    static u32 LastTime = 0;
    unsigned char atSendBuf[400] = {0};
    unsigned int len;
    len = Prepare_UartToROS_Send(atSendBuf);
    if (agv.Public.SystemTime - LastTime >= 12)
    {
        LastTime = agv.Public.SystemTime;
        WriteUart(COM2, atSendBuf, len);
    }
}

unsigned int Prepare_UartToROS_SendTwo(unsigned char string_out[])
{
    short i = 0;
    unsigned char sum = 0;
    static unsigned char string_len = 0;

    string_len = sprintf((char *)string_out, "!%d,%d,%d,%d,%d,%d,%d*",85,agv.Command.Length1,agv.Command.Width1,agv.Command.Length2,agv.Command.Width2,agv.Command.Length3,agv.Command.Width3);
    for (i = 1; i < string_len - 1; i++)
    {
        sum += string_out[i];
    }
    string_len += sprintf((char *)string_out + string_len, "%02X#\r\n", sum);
    return string_len;
}

void UartToROS_Send_Info_To_ServerTwo()
{
    static u32 LastTime = 0;
    unsigned char atSendBuf[400] = {0};
    unsigned int len;
    len = Prepare_UartToROS_SendTwo(atSendBuf);
    if (agv.Public.SystemTime - LastTime >= 500)
    {
        LastTime = agv.Public.SystemTime;
        WriteUart(COM2, atSendBuf, len);
    }
}

void ProccessAGVInfo(unsigned char *RecvBuffer, unsigned short BufferLength)
{
    unsigned char i = 1;
    float XbiasFromros = 0, YbiasFromros = 0, TheataFromros = 0,Theta = 0,locT = 0,palstance = 0;
    int Location_State_ = 0;
    int SLAMerror = 0,Online_State_ = 0;
		static float lastXdata = 0,lastYdata = 0;
		static int laserState1 = 0,laserState2 = 0,laserState3 = 0;
    if (strncmp("$", (const char *)RecvBuffer, 1) == 0) //地标动作命令
    {
        unsigned char Sum = 0;
        unsigned char GetSum = 0;
//				DATA	GetSum = 0;
//				int tmp = 0;
        sscanf((const char *)RecvBuffer + 1, "%f,%f,%f,%d,%d,%f,%f,%f,%d,%d,%d*%02X#",\
					&XbiasFromros, &YbiasFromros, &TheataFromros, &Online_State_, &SLAMerror, &locT, &Theta,&palstance,&laserState1,&laserState2,&laserState3,&GetSum);
				
				
        while (RecvBuffer[i] != '*') /*校验起始到结束信号*/
        {
            Sum += RecvBuffer[i];
            i++;
            if (i > BufferLength)
            {
                return;
            }
        }

        if (Sum == GetSum)
        {

#if P_SETUP_LIDAR2BASE_THETA != 0
            TheataFromros += ((float)P_SETUP_LIDAR2BASE_THETA / 10) * 0.017453; //得到车体正前方角度
#endif

            agv.Public.Coordinate_X = XbiasFromros * 1000 ;
					
            
						agv.Public.Coordinate_Y = YbiasFromros * 1000;

					
						if (TheataFromros <= -PI)
								TheataFromros += 2.0f * PI;

						if (TheataFromros >= PI)
								TheataFromros -= 2.0f * PI;

            agv.Public.Coordinate_W = (TheataFromros);

#if P_SETUP_LIDAR2BASE_X != 0
            agv.Public.Coordinate_X -= cos(TheataFromros) * (float)P_SETUP_LIDAR2BASE_X;
            agv.Public.Coordinate_Y -= sin(TheataFromros) * (float)P_SETUP_LIDAR2BASE_X;
#endif

#if P_SETUP_LIDAR2BASE_Y != 0
            agv.Public.Coordinate_X += sin(TheataFromros) * (float)P_SETUP_LIDAR2BASE_Y;
            agv.Public.Coordinate_Y -= cos(TheataFromros) * (float)P_SETUP_LIDAR2BASE_Y;
#endif
						agv.Public.OnlineState  = Online_State_;//上线状态
						agv.Public.RosState 		= SLAMerror;//ROS状态
						agv.Public.locT					= locT;//可信度
						
						agv.Public.i_RadarSigBack_1 = laserState1;
						agv.Public.i_RadarSigBack_2 = laserState2;
						agv.Public.i_RadarSigBack_3 = laserState3;
						
						if(lastXdata!=0&&(sqrt(pow((XbiasFromros * 1000 - lastXdata), 2.0f) + pow((YbiasFromros * 1000 - lastYdata), 2.0f))>250))
						{
							SetAlarm(0x1000);
						}
						IMU.angle = Theta;
						
						IMU.palstance = palstance;
						
						if(Camera.UpdataFlag == 1)//有码
						{		
								IMU.angleCompensation = Camera.angle - IMU.angle;
						}
						IMU.angle += IMU.angleCompensation;
         }
    }
}

void ProccessAGVDATAInfo(unsigned char *Res) //获取到完整一帧数据
{
    static unsigned char Buffer2[120];
    static unsigned short iii = 0;

    if (iii > 100)
    {
        iii = 0;
    }
    if (*Res == '$') // $
    {
        iii = 0;
    }
    Buffer2[iii++] = *Res;
    if (*Res == '#') // #
    {
        ProccessAGVInfo((unsigned char *)Buffer2, iii);
        iii = 0;
    }
}

void ProcessDataFormUartSlam()
{
    static int ConnectSlamTime = 0, iii = 0;
    unsigned char buff[64];
    unsigned int len;
    unsigned i;
    len = ReadUart(COM2, buff, 64);

    if (len > 0)
    {
        for (i = 0; i < len; i++)
        {
            ProccessAGVDATAInfo(buff + i);
        }
        ConnectSlamTime = 0;
        agv.Public.SlamConnectError = 0;
        Reset_Alarm(0x2000);
    }
    else
    {
        ConnectSlamTime++;

        if (ConnectSlamTime >= 500)
        {
            agv.Public.SlamConnectError = 1;
            SetAlarm(0x2000);
            if (iii++ > 500)
            {
                iii = 0;
                Uart_Printf(COM1, "激光定位丢失!!!\r\n");
            }
        }
    }
}

void SlamDataProcess()
{
    UartToROS_Send_Info_To_Server(); //串口发送给ROS
	
//		UartToROS_Send_Info_To_ServerTwo(); //串口发送给ROS

    ProcessDataFormUartSlam(); //串口读取ROS数据
}
//#endif