#include "ivdecision_brain.h"

#include <QCoreApplication>
#include "common/obs_predict.h"
#include "ivlog.h"
#include "xmlparam.h"

extern iv::Ivlog * givlog;

bool handPark;
long handParkTime;
bool rapidStop;
int gpsMissCount;
bool changeRoad;
double avoidX;
bool parkBesideRoad;
double steerSpeed;
bool transferPieriod;
bool transferPieriod2;
double traceDevi;


using namespace  iv::decition;

namespace iv {


ivdecision_brain::ivdecision_brain()
{
    mvehState = VehState::normalRun;
    loadxml();
}


int ivdecision_brain::getdecision(brain::decition &xdecition,iv::brain::brainstate & xbs)
{
    static qint64 nlastdecisiontime = 0;
    static qint64 nLastMapUpdate = 0;
    iv::GPSData now_gps_ins;

    std::shared_ptr<iv::hmi::hmimsg> hmi_ptr;
    if(GetHMImsg(hmi_ptr) == true)
    {
        ServiceCarStatus.mbRunPause = hmi_ptr->mbpause();
        if(hmi_ptr->mbbochemode())
        {
            ServiceCarStatus.bocheMode = true;
        }
        ServiceCarStatus.busmode = hmi_ptr->mbbusmode();
    }

    if(ServiceCarStatus.mbRunPause)
    {
        return 0;
    }

    if(GetGPS(now_gps_ins) == false)
    {
        return -1;   //No GPS Position
    }
    if(IsMAPUpdate(nLastMapUpdate))
    {
        GetMAP(mgpsMapLine,nLastMapUpdate);
        mbisFirstRun = true;
    }

    iv::LidarGridPtr lidarptr;
    GetLIDARGrid(lidarptr);

    std::vector<iv::Perception::PerceptionOutput> xvectorper;

    iv::TrafficLight xtrafficlight;
    std::shared_ptr<iv::vbox::vbox> xvbox_ptr;
    if(Getvboxmsg(xvbox_ptr))
    {
        xtrafficlight.leftColor=xvbox_ptr->st_left();
        xtrafficlight.rightColor=xvbox_ptr->st_right();
        xtrafficlight.straightColor=xvbox_ptr->st_straight();
        xtrafficlight.uturnColor=xvbox_ptr->st_turn();
        xtrafficlight.leftTime=xvbox_ptr->time_left();
        xtrafficlight.rightTime=xvbox_ptr->time_right();
        xtrafficlight.straightTime=xvbox_ptr->time_straight();
        xtrafficlight.uturnTime=xvbox_ptr->time_turn();
    }

    updatev2x();
    updateultra();
    updateradar();
    updategroupinfo();

    if(mgpsMapLine.size()<10)
    {
        return 0;
    }

    iv::decition::Decition decition= getDecideFromGPS(*now_gps_ins,mgpsMapLine,lidarptr,xvectorper,xtrafficlight);

    xdecition.set_accelerator(decition->accelerator);
    xdecition.set_brake(decition->brake);
    xdecition.set_leftlamp(decition->leftlamp);
    xdecition.set_rightlamp(decition->rightlamp);
    xdecition.set_speed(decition->speed);
    xdecition.set_wheelangle(decition->wheel_angle);
    xdecition.set_wheelspeed(decition->angSpeed);
    xdecition.set_torque(decition->torque);
    xdecition.set_mode(decition->mode);
    xdecition.set_gear(decition->dangWei);
    xdecition.set_handbrake(decition->handBrake);
    xdecition.set_grade(decition->grade);
    xdecition.set_engine(decition->engine);
    xdecition.set_brakelamp(decition->brakeLight);
    xdecition.set_ttc(ServiceCarStatus.mfttc);
    xdecition.set_air_enable(decition->air_enable);
    xdecition.set_air_temp(decition->air_temp);
    xdecition.set_air_mode(decition->air_mode);
    xdecition.set_wind_level(decition->wind_level);
    xdecition.set_roof_light(decition->roof_light);
    xdecition.set_home_light(decition->home_light);
    xdecition.set_air_worktime(decition->air_worktime);
    xdecition.set_air_offtime(decition->air_offtime);
    xdecition.set_air_on(decition->air_on);
    xdecition.set_door(decition->door);

    xbs.set_mbbocheenable(ServiceCarStatus.bocheEnable);
    xbs.set_mbbrainrunning(true);  //apollo_fu debug ui 20200417
    xbs.set_mflidarobs(ServiceCarStatus.mLidarObs);
    xbs.set_mfradarobs(ServiceCarStatus.mRadarObs);
    xbs.set_mfobs(ServiceCarStatus.mObs);
    xbs.set_decision_period((QDateTime::currentMSecsSinceEpoch() - nlastdecisiontime));
    nlastdecisiontime = QDateTime::currentMSecsSinceEpoch();

    return 1;
}

void ivdecision_brain::updategroupinfo()
{
    std::shared_ptr<iv::radio::radio_send> groupmsg_ptr;

    if(false == Getp900(groupmsg_ptr))
    {
        return;
    }

    ServiceCarStatus.group_server_status = groupmsg_ptr->server_status();
    ServiceCarStatus.group_comm_speed= (float)groupmsg_ptr->car_control_speed();
    ServiceCarStatus.group_state= groupmsg_ptr->cmd_mode();

    if(ServiceCarStatus.group_state!=2){
        ServiceCarStatus.group_comm_speed=0;
    }
}

void ivdecision_brain::updatechassistocarstatus()
{
    std::shared_ptr<iv::chassis> xchassis_ptr;
    if(false == Getchassis(xchassis_ptr))
    {
        return;
    }

    ServiceCarStatus.epb = xchassis_ptr->epbfault();
    ServiceCarStatus.grade = xchassis_ptr->shift();
    ServiceCarStatus.driverMode = xchassis_ptr->drivemode();
    if(xchassis_ptr->has_epsmode()){
        ServiceCarStatus.epsMode = xchassis_ptr->epsmode();
        ServiceCarStatus.receiveEps=true;
        if(ServiceCarStatus.epsMode == 0)
        {
            ServiceCarStatus.mbRunPause = true;
        }
    }
    if(xchassis_ptr->has_torque())
    {
         ServiceCarStatus.torque_st = xchassis_ptr->torque();
        if(ServiceCarStatus.msysparam.mvehtype=="bus"){
            ServiceCarStatus.torque_st = xchassis_ptr->torque()*0.4;
        }
         std::cout<<"******* xchassis.torque:"<< xchassis_ptr->torque()<<std::endl;
        std::cout<<"******* ServiceCarStatus.torque_st:"<< ServiceCarStatus.torque_st<<std::endl;
        givlog->warn(" ServiceCarStatus.torque_st: is %f",ServiceCarStatus.torque_st);

    }

    if(xchassis_ptr->has_engine_speed())
    {
         ServiceCarStatus.engine_speed = xchassis_ptr->engine_speed();

         std::cout<<"******* xchassis.engine_speed:"<< xchassis_ptr->engine_speed()<<std::endl;


    }

}

void ivdecision_brain::loadxml()
{
    QString strpath = QCoreApplication::applicationDirPath();
    strpath = strpath + "/ADS_decision.xml";
    iv::xmlparam::Xmlparam xp(strpath.toStdString());
    ServiceCarStatus.msysparam.mstrvin = xp.GetParam("vin","10000000000000001");
    ServiceCarStatus.msysparam.mstrid = xp.GetParam("id","1");
    ServiceCarStatus.msysparam.mstriccid = xp.GetParam("iccid","11111111111111111111");
    ServiceCarStatus.msysparam.mvehtype= xp.GetParam("vehType","yuhesen");

    ServiceCarStatus.msysparam.vehWidth = atof(xp.GetParam("vehWidth","2.1").data());
    ServiceCarStatus.msysparam.vehLenth = atof(xp.GetParam("vehLenth","4.6").data());


    /*=============     20200113 apollo_fu  add ===========*/
    std::string str_zhuchetime = xp.GetParam("zhuchetime","16");
    ServiceCarStatus.msysparam.mzhuchetime =atoi(str_zhuchetime.data());
    /*============= end ================================== */

    std::string strepsoff = xp.GetParam("epsoff","0.0");
    ServiceCarStatus.mfEPSOff = atof(strepsoff.data());

    std::string strroadmode_vel = xp.GetParam("roadmode0","10");
    ServiceCarStatus.mroadmode_vel.mfmode0 = atof(strroadmode_vel.data());

    strroadmode_vel = xp.GetParam("roadmode11","30");
    ServiceCarStatus.mroadmode_vel.mfmode11 = atof(strroadmode_vel.data());


    strroadmode_vel = xp.GetParam("roadmode14","15");
    ServiceCarStatus.mroadmode_vel.mfmode14 = atof(strroadmode_vel.data());

    //float a = ServiceCarStatus.mroadmode_vel.mfmode14;
    //cout<<"........"<<a<<endl;

    strroadmode_vel = xp.GetParam("roadmode15","15");
    ServiceCarStatus.mroadmode_vel.mfmode15 = atof(strroadmode_vel.data());

    /*==================== 20200113    apollo_fu add =================*/
    strroadmode_vel = xp.GetParam("roadmode5","10");
    ServiceCarStatus.mroadmode_vel.mfmode5 = atof(strroadmode_vel.data());

    strroadmode_vel = xp.GetParam("roadmode13","5");
    ServiceCarStatus.mroadmode_vel.mfmode13 = atof(strroadmode_vel.data());

    strroadmode_vel = xp.GetParam("roadmode16","8");
    ServiceCarStatus.mroadmode_vel.mfmode16 = atof(strroadmode_vel.data());

    strroadmode_vel = xp.GetParam("roadmode17","8");
    ServiceCarStatus.mroadmode_vel.mfmode17 = atof(strroadmode_vel.data());

    strroadmode_vel = xp.GetParam("roadmode18","5");
    ServiceCarStatus.mroadmode_vel.mfmode18 = atof(strroadmode_vel.data());



    /*=========================    end   =============================*/

    std::string group_cotrol = xp.GetParam("group","false");
    if(group_cotrol=="true"){
        ServiceCarStatus.group_control=true;
    }else{
        ServiceCarStatus.group_control=false;
    }

    std::string speed_control = xp.GetParam("speed","false");
    if(speed_control=="true"){
        ServiceCarStatus.speed_control=true;
    }else{
        ServiceCarStatus.speed_control=false;
    }



    std::string strparklat = xp.GetParam("parklat","39.0624557");
    std::string strparklng = xp.GetParam("parklng","117.3575493");
    std::string strparkheading = xp.GetParam("parkheading","112.5");
    std::string strparktype = xp.GetParam("parktype","1");

    ServiceCarStatus.mfParkLat = atof(strparklat.data());
    ServiceCarStatus.mfParkLng = atof(strparklng.data());
    ServiceCarStatus.mfParkHeading = atof(strparkheading.data());
    ServiceCarStatus.mnParkType = atoi(strparktype.data());

    ServiceCarStatus.mLidarRotation = atof(xp.GetParam("LidarRotation","90.0").data());
    ServiceCarStatus.mLidarRangeUnit = atof(xp.GetParam("LidarRangeUnit","5.0").data());



    std::string lightlon = xp.GetParam("lightlon","0");
    std::string lightlat = xp.GetParam("lightlat","0");
    ServiceCarStatus.iTrafficeLightLat=atof(lightlat.data());
    ServiceCarStatus.iTrafficeLightLon=atof(lightlon.data());



    //mobileEye
    std::string   timeWidth =xp.GetParam("waitGpsTimeWidth","5000");
    std::string   garageLong =xp.GetParam("outGarageLong","10");
    ServiceCarStatus.waitGpsTimeWidth=atof(timeWidth.data());
    ServiceCarStatus.outGarageLong=atof(garageLong.data());
    //mobileEye end


    //lidar start
    std::string lidarGpsXiuzheng = xp.GetParam("lidarGpsXiuzheng","1.0");
    std::string radarGpsXiuzheng = xp.GetParam("radarGpsXiuzheng","3.0");
    std::string rearRadarGpsXiuzheng = xp.GetParam("rearRadarGpsXiuzheng","0.5");
    std::string rearLidarGpsXiuzheng = xp.GetParam("rearLidarGpsXiuzheng","1.0");
    std::string frontGpsXiuzheng = xp.GetParam("frontGpsXiuzheng","3.0");
    std::string rearGpsXiuzheng = xp.GetParam("rearGpsXiuzheng","1.0");
    std::string gpsOffset_x = xp.GetParam("gpsOffset_X","0");
    std::string gpsOffset_y = xp.GetParam("gpsOffset_Y","0");
    std::string strexternmpc = xp.GetParam("ExternMPC","false");  //If Use MPC set true


    adjuseGpsLidarPosition();

    if(strexternmpc == "true")
    {
//        mbUseExternMPC = true;
    }

    ServiceCarStatus.msysparam.lidarGpsXiuzheng = atof(lidarGpsXiuzheng.data());
    ServiceCarStatus.msysparam.radarGpsXiuzheng = atof(radarGpsXiuzheng.data());
    ServiceCarStatus.msysparam.rearRadarGpsXiuzheng = atof(rearRadarGpsXiuzheng.data());
    ServiceCarStatus.msysparam.rearLidarGpsXiuzheng = atof(rearLidarGpsXiuzheng.data());
    ServiceCarStatus.msysparam.frontGpsXiuzheng = atof(frontGpsXiuzheng.data());
    ServiceCarStatus.msysparam.rearGpsXiuzheng = atof(rearGpsXiuzheng.data());
    ServiceCarStatus.msysparam.gpsOffset_x = atof(gpsOffset_x.data());
    ServiceCarStatus.msysparam.gpsOffset_y = atof(gpsOffset_y.data());
    // lidar end

    std::string strObsPredict = xp.GetParam("obsPredict","false");  //If Use MPC set true
    if(strObsPredict == "true")
    {
        ServiceCarStatus.useObsPredict = true;
    }

    std::string inRoadAvoid = xp.GetParam("inRoadAvoid","false");  //If Use MPC set true
    if(inRoadAvoid == "true")
    {
        ServiceCarStatus.inRoadAvoid = true;
    }else{
        ServiceCarStatus.inRoadAvoid = false;
    }

    std::string avoidObs = xp.GetParam("avoidObs","false");  //If Use MPC set true
    if(avoidObs == "true")
    {
        ServiceCarStatus.avoidObs = true;
    }else{
        ServiceCarStatus.avoidObs = false;
    }

    //map

 //   mstrmemmap_index = xp.GetParam("msg_mapindex","map_index");
}

void ivdecision_brain::updatev2x()
{
    std::shared_ptr<iv::v2x::v2x> xv2x_ptr;

    if(false == Getv2xmsg(xv2x_ptr))
    {
        return;
    }

    ServiceCarStatus.stationCmd.received=true;

    ServiceCarStatus.stationCmd.has_carID=xv2x_ptr->has_carid();
    if(ServiceCarStatus.stationCmd.has_carID)
    {
            ServiceCarStatus.stationCmd.carID=xv2x_ptr->carid();
    }

    ServiceCarStatus.stationCmd.has_carMode=xv2x_ptr->has_carmode();
    if(ServiceCarStatus.stationCmd.has_carMode)
    {
            ServiceCarStatus.stationCmd.carMode=xv2x_ptr->carmode();

            qDebug("ServiceCarStatus.stationCmd.carMode:",ServiceCarStatus.stationCmd.carMode);
            givlog->debug("brain_v2x","ServiceCarStatus.stationCmd.carMode:%d",ServiceCarStatus.stationCmd.carMode);
    }

    ServiceCarStatus.stationCmd.has_emergencyStop=xv2x_ptr->has_emergencystop();
    if(ServiceCarStatus.stationCmd.has_emergencyStop)
    {
            ServiceCarStatus.stationCmd.emergencyStop=xv2x_ptr->emergencystop();

            qDebug("ServiceCarStatus.stationCmd.emergencyStop:",ServiceCarStatus.stationCmd.emergencyStop);
            givlog->debug("brain_v2x","ServiceCarStatus.stationCmd.emergencyStop:%d",ServiceCarStatus.stationCmd.emergencyStop);
    }

    ServiceCarStatus.stationCmd.has_stationStop=xv2x_ptr->has_stationstop();
    if(ServiceCarStatus.stationCmd.has_stationStop)
    {
            ServiceCarStatus.stationCmd.stationStop=xv2x_ptr->stationstop();

            qDebug("ServiceCarStatus.stationCmd.stationStop:",ServiceCarStatus.stationCmd.stationStop);
            givlog->debug("brain_v2x","ServiceCarStatus.stationCmd.stationStop:%d",ServiceCarStatus.stationCmd.stationStop);
    }
    int num=xv2x_ptr->stationid_size();
    if(num>0)
    {
        ServiceCarStatus.stationCmd.stationTotalNum=num;
        for(int i=0;i<ServiceCarStatus.stationCmd.stationTotalNum;i++)
        {
            ServiceCarStatus.stationCmd.stationGps[i].gps_lat=xv2x_ptr->stgps(i).lat();
            ServiceCarStatus.stationCmd.stationGps[i].gps_lng=xv2x_ptr->stgps(i).lon();

            qDebug("stationGps: %d, lat: %.7f, lon: %.7f", xv2x_ptr->stationid(i), ServiceCarStatus.stationCmd.stationGps[i].gps_lat, ServiceCarStatus.stationCmd.stationGps[i].gps_lng);
            givlog->debug("brain_v2x","stationGps: %d, lat: %.7f, lon: %.7f",
                           xv2x_ptr->stationid(i),ServiceCarStatus.stationCmd.stationGps[i].gps_lat,
                          ServiceCarStatus.stationCmd.stationGps[i].gps_lng);
        }
        ServiceCarStatus.mbRunPause=false;
    }

}

void ivdecision_brain::adjuseGpsLidarPosition()
{
    ServiceCarStatus.msysparam.lidarGpsXiuzheng -=  ServiceCarStatus.msysparam.gpsOffset_y;
    ServiceCarStatus.msysparam.radarGpsXiuzheng -=  ServiceCarStatus.msysparam.gpsOffset_y;
    ServiceCarStatus.msysparam.rearRadarGpsXiuzheng +=  ServiceCarStatus.msysparam.gpsOffset_y;
    ServiceCarStatus.msysparam.rearLidarGpsXiuzheng +=  ServiceCarStatus.msysparam.gpsOffset_y;
    ServiceCarStatus.msysparam.frontGpsXiuzheng -=  ServiceCarStatus.msysparam.gpsOffset_y;
    ServiceCarStatus.msysparam.rearGpsXiuzheng +=  ServiceCarStatus.msysparam.gpsOffset_y;
}

void ivdecision_brain::updateultra()
{
    std::shared_ptr<iv::ultrasonic::ultrasonic> xultra_ptr;

    if(false == Getultrasonic(xultra_ptr))
    {
        return;
    }

    ServiceCarStatus.ultraDistance[1]=xultra_ptr->sigobjdist_flcorner();
    ServiceCarStatus.ultraDistance[2]=xultra_ptr->sigobjdist_flmiddle();
    ServiceCarStatus.ultraDistance[3]=xultra_ptr->sigobjdist_flside();
    ServiceCarStatus.ultraDistance[4]=xultra_ptr->sigobjdist_frcorner();
    ServiceCarStatus.ultraDistance[5]=xultra_ptr->sigobjdist_frmiddle();
    ServiceCarStatus.ultraDistance[6]=xultra_ptr->sigobjdist_frside();
    ServiceCarStatus.ultraDistance[7]=xultra_ptr->sigobjdist_rlcorner();
    ServiceCarStatus.ultraDistance[8]=xultra_ptr->sigobjdist_rlmiddle();
    ServiceCarStatus.ultraDistance[9]=xultra_ptr->sigobjdist_rlside();
    ServiceCarStatus.ultraDistance[10]=xultra_ptr->sigobjdist_rrcorner();
    ServiceCarStatus.ultraDistance[11]=xultra_ptr->sigobjdist_rrmiddle();
    ServiceCarStatus.ultraDistance[12]=xultra_ptr->sigobjdist_rrside();
}

void ivdecision_brain::updateradar()
{
    std::shared_ptr<iv::radar::radarobjectarray> xradar_ptr
            = std::shared_ptr<iv::radar::radarobjectarray>(new iv::radar::radarobjectarray);

    unsigned int i;
    if(false == GetRADAR(xradar_ptr))
    {
        for(i=0;i<64;i++)
        {
            ServiceCarStatus.obs_radar[i].valid = false;
        }
        return;
    }

    for(i=0;i<64;i++)
    {
        iv::radar::radarobject * pradarobj = xradar_ptr->mutable_obj(i);
        ServiceCarStatus.obs_radar[i].valid = pradarobj->bvalid();
        ServiceCarStatus.obs_radar[i].nomal_x = pradarobj->x();
        ServiceCarStatus.obs_radar[i].nomal_y = pradarobj->y();
        ServiceCarStatus.obs_radar[i].speed_relative = pradarobj->vel();
        ServiceCarStatus.obs_radar[i].speed_x = pradarobj->vx();
        ServiceCarStatus.obs_radar[i].speed_y = pradarobj->vy();
    }


}


//int ivdecision_brain::getdecision_normal(brain::decition &xdecition)
//{

//    iv::decition::Decition gps_decition(new iv::decition::DecitionBasic);

//    double obsDistance = -1;
//    int esrLineIndex = -1;
//    double lidarDistance = -1;
//    int roadPre = -1;

//    return 0;
//}

//std::vector<iv::Perception::PerceptionOutput> lidar_per,



iv::decition::Decition ivdecision_brain::decision_reverseCar(GPS_INS now_gps_ins)
{
    iv::decition::Compute00().bocheCompute(now_gps_ins, aim_gps_ins);

    vehState = reversing;
    qiedianCount=true;
    return decision_reversing(now_gps_ins);
}




iv::decition::Decition ivdecision_brain::decision_reversing(GPS_INS now_gps_ins)
{

    iv::decition::Decition gps_decition(new iv::decition::DecitionBasic);

    double dis = GetDistance(now_gps_ins, iv::decition::Compute00().nearTpoint);
    if (dis<2.0)//0.5
    {
        vehState = reverseCircle;
        qiedianCount = true;
        cout<<"到达近切点+++++++++++++++++++++++++++++++++"<<endl;
        return decision_reverseCircle(now_gps_ins);
    }
    else {
        controlAng = 0;
        dSpeed = 2;
        dSecSpeed = dSpeed / 3.6;
        gps_decition->wheel_angle = 0;
        gps_decition->speed = dSpeed;
        obsDistance=-1;
        phaseSpeedDecition(gps_decition, secSpeed, -1, 0, now_gps_ins);
        //	gps_decition->accelerator = 0;
        return gps_decition;
    }
}


iv::decition::Decition ivdecision_brain::decision_reverseCircle(GPS_INS now_gps_ins)
{
    iv::decition::Decition gps_decition(new iv::decition::DecitionBasic);
    double dis = GetDistance(now_gps_ins, iv::decition::Compute00().farTpoint);
    double angdis =abs(now_gps_ins.ins_heading_angle - aim_gps_ins.ins_heading_angle);
    if((((angdis<5)||(angdis>355)))&&(dis<3.0))
        //       if((((angdis<4)||(angdis>356)))&&(dis<2.0))
    {
        vehState = reverseDirect;
        qiedianCount = true;
        cout<<"到达远切点+++++++++++++++++++++++++++++++++"<<endl;
        return decision_reverseDirect(now_gps_ins);

    }
    else {
        if (qiedianCount && trumpet()<0)
            //         if (qiedianCount && trumpet()<1500)
        {

            //                gps_decition->brake = 10;
            //                gps_decition->torque = 0;
            dSpeed=0;
            minDecelerate=min(minDecelerate,-0.5f);
            phaseSpeedDecition(gps_decition, secSpeed, -1, 0, now_gps_ins);
        }
        else
        {
            qiedianCount = false;
            trumpetFirstCount = true;


            dSpeed = 2;
            dSecSpeed = dSpeed / 3.6;
            gps_decition->speed = dSpeed;
            obsDistance=-1;
            phaseSpeedDecition(gps_decition, secSpeed, -1, 0, now_gps_ins);

        }

        controlAng = iv::decition::Compute00().bocheAngle*16.5;
        gps_decition->wheel_angle = 0 - controlAng*1.05;

        cout<<"farTpointDistance================"<<dis<<endl;

        return gps_decition;
    }
}

iv::decition::Decition ivdecision_brain::decision_reverseDirect(GPS_INS now_gps_ins)
{
    iv::decition::Decition gps_decition(new iv::decition::DecitionBasic);

    Point2D pt = Coordinate_Transfer(now_gps_ins.gps_x,now_gps_ins.gps_y, aim_gps_ins);

    if ((pt.y)<0.5)
    {

        qiedianCount=true;
        vehState=reverseArr;
        cout<<"到达泊车点+++++++++++++++++++++++++++++++++"<<endl;
        //            gps_decition->accelerator = -3;
        //            gps_decition->brake = 10;
        //            gps_decition->torque = 0;
        gps_decition->wheel_angle=0;
        dSpeed=0;
        minDecelerate=min(minDecelerate,-0.5f);
        phaseSpeedDecition(gps_decition, secSpeed, -1, 0, now_gps_ins);
        return gps_decition;




    }
    else {

        //if (qiedianCount && trumpet()<0)
        if (qiedianCount && trumpet()<1000)
        {

            //                gps_decition->brake = 10;
            //                gps_decition->torque = 0;
            dSpeed=0;
            minDecelerate=min(minDecelerate,-0.5f);
            phaseSpeedDecition(gps_decition, secSpeed, -1, 0, now_gps_ins);
        }
        else
        {
            qiedianCount = false;
            trumpetFirstCount = true;
            dSpeed = 1;
            dSecSpeed = dSpeed / 3.6;
            gps_decition->speed = dSpeed;
            obsDistance=-1;
            phaseSpeedDecition(gps_decition, secSpeed, -1, 0, now_gps_ins);
        }



        controlAng = 0;

        gps_decition->wheel_angle = 0;

        return gps_decition;
    }
}


iv::decition::Decition ivdecision_brain::decision_reverseArr(iv::GPS_INS now_gps_ins)
{
    iv::decition::Decition gps_decition(new iv::decition::DecitionBasic);

    ServiceCarStatus.bocheMode=false;
    if (qiedianCount && trumpet()<1500)
    {

        //            gps_decition->brake = 10;
        //            gps_decition->torque = 0;
        dSpeed=0;
        minDecelerate=min(minDecelerate,-0.5f);
        phaseSpeedDecition(gps_decition, secSpeed, -1, 0, now_gps_ins);
        ServiceCarStatus.bocheMode=false;
    }
    else
    {
        qiedianCount = false;
        trumpetFirstCount = true;
        ServiceCarStatus.bocheEnable=0;
        vehState=normalRun;
        ServiceCarStatus.mbRunPause=true;
        ServiceCarStatus.mnBocheComplete=100;
        cout<<"泊车daowei mbRunPause+++++++++++++++++++++++++++++++++"<<endl;
    }


    gps_decition->wheel_angle = 0 ;



    return gps_decition;


}

iv::decition::Decition ivdecision_brain::decision_dRever(GPS_INS now_gps_ins)
{
    GaussProjCal(aim_gps_ins.gps_lng, aim_gps_ins.gps_lat, &aim_gps_ins.gps_x, &aim_gps_ins.gps_y);

    iv::decition::Compute00().bocheDirectCompute(now_gps_ins, aim_gps_ins);

    vehState = dRever0;
    qiedianCount=true;


    std::cout<<"enter side boche mode"<<std::endl;

    return decision_dRever0(now_gps_ins);
}

iv::decition::Decition ivdecision_brain::decision_dRever0(GPS_INS now_gps_ins)
{
    iv::decition::Decition gps_decition(new iv::decition::DecitionBasic);

    double dis = GetDistance(now_gps_ins, iv::decition::Compute00().dTpoint0);
    if (dis<2.0)
    {
        vehState = dRever1;
        qiedianCount = true;
        cout<<"到达近切点+++++++++++++++++++++++++++++++++"<<endl;
        return decision_dRever1(now_gps_ins);
    }
    else {
        controlAng = 0;
        dSpeed = 2;
        dSecSpeed = dSpeed / 3.6;
        gps_decition->wheel_angle = 0;
        gps_decition->speed = dSpeed;
        obsDistance=-1;
        phaseSpeedDecition(gps_decition, secSpeed, -1, 0, now_gps_ins);
        //	gps_decition->accelerator = 0;
        return gps_decition;
    }
}



iv::decition::Decition ivdecision_brain::decision_dRever1(GPS_INS now_gps_ins)
{
    iv::decition::Decition gps_decition(new iv::decition::DecitionBasic);

    double dis = GetDistance(now_gps_ins, iv::decition::Compute00().dTpoint1);

    if(dis<2.0)
    {
        vehState = dRever2;
        qiedianCount = true;
        cout<<"到达远切点+++++++++++++++++++++++++++++++++"<<endl;

        return decision_dRever2(now_gps_ins);

    }
    else {
        if (qiedianCount && trumpet()<1000)

        {

            //                gps_decition->brake = 10;
            //                gps_decition->torque = 0;
            dSpeed=0;
            minDecelerate=min(minDecelerate,-0.5f);
            phaseSpeedDecition(gps_decition, secSpeed, -1, 0, now_gps_ins);
        }
        else
        {
            qiedianCount = false;
            trumpetFirstCount = true;


            dSpeed = 2;
            dSecSpeed = dSpeed / 3.6;
            gps_decition->speed = dSpeed;
            obsDistance=-1;
            phaseSpeedDecition(gps_decition, secSpeed, -1, 0, now_gps_ins);

        }

        controlAng = iv::decition::Compute00().dBocheAngle*16.5;
        gps_decition->wheel_angle = 0 - controlAng;

        cout<<"farTpointDistance================"<<dis<<endl;

        return gps_decition;
    }
}
iv::decition::Decition ivdecision_brain::decision_dRever2(GPS_INS now_gps_ins)
{
    iv::decition::Decition gps_decition(new iv::decition::DecitionBasic);

    double dis = GetDistance(now_gps_ins, iv::decition::Compute00().dTpoint2);
    Point2D pt1 = Coordinate_Transfer(now_gps_ins.gps_x,now_gps_ins.gps_y, aim_gps_ins);
    Point2D pt2 = Coordinate_Transfer(iv::decition::Compute00().dTpoint2.gps_x,iv::decition::Compute00().dTpoint2.gps_y, aim_gps_ins);
    double xx= (pt1.x-pt2.x);
    // if(xx>0)
    if(xx>-0.5)
    {
        GaussProjCal(aim_gps_ins.gps_lng, aim_gps_ins.gps_lat, &aim_gps_ins.gps_x, &aim_gps_ins.gps_y);
        Point2D ptt = Coordinate_Transfer(now_gps_ins.gps_x,now_gps_ins.gps_y, aim_gps_ins);
        double xxx=ptt.x;
        double yyy =ptt.y;
        //            if(xxx<-1.5||xx>1){
        //                int a=0;
        //            }
        vehState = dRever3;
        qiedianCount = true;
        cout<<"到达远切点+++++++++++++++++++++++++++++++++"<<endl;
        cout<<"xxx+++++++++++++++++++++++++++++++++"<<xxx<<endl;
        cout<<"yyy+++++++++++++++++++++++++++++++++"<<yyy<<endl;

        return decision_dRever3(now_gps_ins);


    }
    else {
        if (qiedianCount && trumpet()<1000)

        {

            /*  gps_decition->brake = 10;
            gps_decition->torque = 0;  */
            dSpeed=0;
            minDecelerate=min(minDecelerate,-0.5f);
            phaseSpeedDecition(gps_decition, secSpeed, -1, 0, now_gps_ins);
        }
        else
        {
            qiedianCount = false;
            trumpetFirstCount = true;


            dSpeed = 2;
            dSecSpeed = dSpeed / 3.6;
            gps_decition->speed = dSpeed;
            obsDistance=-1;
            phaseSpeedDecition(gps_decition, secSpeed, -1, 0, now_gps_ins);

        }


        gps_decition->wheel_angle = 0 ;

        cout<<"farTpointDistance================"<<dis<<endl;

        return gps_decition;
    }
}
iv::decition::Decition ivdecision_brain::decision_dRever3(GPS_INS now_gps_ins)
{
    iv::decition::Decition gps_decition(new iv::decition::DecitionBasic);
    double dis = GetDistance(now_gps_ins, iv::decition::Compute00().dTpoint3);
    double angdis =abs(now_gps_ins.ins_heading_angle - aim_gps_ins.ins_heading_angle);
    if((((angdis<5)||(angdis>355)))&&(dis<10.0))
    {
        vehState = dRever4;
        qiedianCount = true;
        cout<<"到达远切点+++++++++++++++++++++++++++++++++"<<endl;
        return decision_dRever4(now_gps_ins);

    }
    else {
        if (qiedianCount && trumpet()<1000)

        {

            //                gps_decition->brake = 10;
            //                gps_decition->torque = 0;
            dSpeed=0;
            minDecelerate=min(minDecelerate,-0.5f);
            phaseSpeedDecition(gps_decition, secSpeed, -1, 0, now_gps_ins);
        }
        else
        {
            qiedianCount = false;
            trumpetFirstCount = true;


            dSpeed = 2;
            dSecSpeed = dSpeed / 3.6;
            gps_decition->speed = dSpeed;
            obsDistance=-1;
            phaseSpeedDecition(gps_decition, secSpeed, -1, 0, now_gps_ins);

        }

        controlAng = 0-iv::decition::Compute00().dBocheAngle*16.5;
        gps_decition->wheel_angle = 0 - controlAng*0.95;

        cout<<"farTpointDistance================"<<dis<<endl;

        return gps_decition;
    }
}
iv::decition::Decition ivdecision_brain::decision_dRever4(GPS_INS now_gps_ins)
{
    iv::decition::Decition gps_decition(new iv::decition::DecitionBasic);

    //	double dis = GetDistance(now_gps_ins, aim_gps_ins);
    Point2D pt = Coordinate_Transfer(now_gps_ins.gps_x,now_gps_ins.gps_y, aim_gps_ins);

    if ((pt.y)<0.5)
    {

        qiedianCount=true;
        vehState=reverseArr;
        cout<<"到达泊车点+++++++++++++++++++++++++++++++++"<<endl;
        //            gps_decition->accelerator = -3;
        //            gps_decition->brake =10 ;
        dSpeed=0;
        minDecelerate=min(minDecelerate,-0.5f);
        phaseSpeedDecition(gps_decition, secSpeed, -1, 0, now_gps_ins);

        gps_decition->wheel_angle=0;
        return gps_decition;




    }
    else {

        //if (qiedianCount && trumpet()<0)
        if (qiedianCount && trumpet()<1000)
        {

            //                gps_decition->brake = 10;
            //                gps_decition->torque = 0;
            dSpeed=0;
            minDecelerate=min(minDecelerate,-0.5f);
            phaseSpeedDecition(gps_decition, secSpeed, -1, 0, now_gps_ins);
        }
        else
        {
            qiedianCount = false;
            trumpetFirstCount = true;
            dSpeed = 2;
            dSecSpeed = dSpeed / 3.6;
            gps_decition->speed = dSpeed;
            obsDistance=-1;
            phaseSpeedDecition(gps_decition, secSpeed, -1, 0, now_gps_ins);
        }



        controlAng = 0;

        gps_decition->wheel_angle = 0;

        return gps_decition;
    }
}


void ivdecision_brain::decision_firstRun(GPS_INS now_gps_ins,
                                         const std::vector<GPSData> & gpsMapLine)
{

    if (isFirstRun)
    {
        initMethods();
        vehState = normalRun;
        startAvoid_gps_ins = now_gps_ins;
        init();
        PathPoint = iv::decition::Compute00().getFirstNearestPointIndex(now_gps_ins, gpsMapLine,
                                                          lastGpsIndex,
                                                          minDis,
                                                          maxAngle);
        lastGpsIndex = PathPoint;

        if(ServiceCarStatus.speed_control==true){
            iv::decition::Compute00().getDesiredSpeed(gpsMapLine);   //add by zj
        }

        //	ServiceCarStatus.carState = 1;
        //        roadOri = gpsMapLine[PathPoint]->roadOri;
        //        roadNow = roadOri;
        //        roadSum = gpsMapLine[PathPoint]->roadSum;
        //  busMode = false;
        //  vehState = dRever;

        double dis =  iv::decition::GetDistance(*gpsMapLine[0], *gpsMapLine[gpsMapLine.size()-1]);
        if(dis<15){
            circleMode=true;  //201200102
        }else{
            circleMode=false;
        }
        //     circleMode = true;


        getV2XTrafficPositionVector(gpsMapLine);
        //        group_ori_gps=*gpsMapLine[0];
        ServiceCarStatus.bocheMode=false;
        ServiceCarStatus.daocheMode=false;
        parkMode=false;
        readyParkMode=false;
        finishPointNum=-1;
        isFirstRun = false;
    }


}

int ivdecision_brain::decision_ParkCalc(GPS_INS now_gps_ins,iv::decition::Decition & gps_decition)
{
    //sidePark

    if(ServiceCarStatus.mnParkType==1){

        if( vehState!=dRever &&  vehState!=dRever0  &&  vehState!=dRever1 &&  vehState!=dRever2  &&  vehState!=dRever3 && vehState!=dRever4 && vehState!=reverseArr ){
            int bocheEN=iv::decition::Compute00().bocheDirectCompute(now_gps_ins, aim_gps_ins);
            if(bocheEN==1){
                ServiceCarStatus.bocheEnable=1;
            }else if(bocheEN==0){
                ServiceCarStatus.bocheEnable=0;
            }
        }else{
            ServiceCarStatus.bocheEnable=2;
        }



        if(ServiceCarStatus.bocheMode && vehState!=dRever &&  vehState!=dRever0  &&  vehState!=dRever1 &&
                vehState!=dRever2  &&  vehState!=dRever3 && vehState!=dRever4&&  vehState!=reverseArr ){
            if(abs(realspeed)>0.1){
                dSpeed=0;
                minDecelerate=min(minDecelerate,-0.5f);
                phaseSpeedDecition(gps_decition, secSpeed, -1, 0, now_gps_ins);
                gps_decition->wheel_angle=0;
                return 1;
            }else{
                if(trumpet()>3000){
                    trumpetFirstCount=true;
                    vehState=dRever;
                }

            }
            //         ServiceCarStatus.bocheMode=false;
        }

    }


    //chuizhiPark

    if(ServiceCarStatus.mnParkType==0){
        if( vehState!=reverseCar &&  vehState!=reversing  &&  vehState!=reverseCircle &&  vehState!=reverseDirect &&  vehState!=reverseArr ){
            int bocheEN=iv::decition::Compute00().bocheCompute(now_gps_ins, aim_gps_ins);
            if(bocheEN==1){
                ServiceCarStatus.bocheEnable=1;
            }else if(bocheEN==0){
                ServiceCarStatus.bocheEnable=0;
            }
        }else{
            ServiceCarStatus.bocheEnable=2;
        }



        if(ServiceCarStatus.bocheMode && vehState!=reverseCar &&  vehState!=reversing  &&  vehState!=reverseCircle &&  vehState!=reverseDirect&&  vehState!=reverseArr ){

            if(abs(realspeed)>0.1){
                dSpeed=0;
                minDecelerate=min(minDecelerate,-0.5f);
                phaseSpeedDecition(gps_decition, secSpeed, -1, 0, now_gps_ins);
                gps_decition->wheel_angle=0;
                return 1;
            }else{
                if(trumpet()>3000){
                    trumpetFirstCount=true;
                    vehState=reverseCar;
                }

            }
            //     ServiceCarStatus.bocheMode=false;

        }
    }

    return 0;


}

void ivdecision_brain::decision_readyZhucheMode(GPS_INS now_gps_ins, const std::vector<GPSData> &gpsMapLine)
{
    cout<<"ready ZHECHE STATE+++++++++++++++++++++++++++++++++"<<endl;
    cout<<"zhuche point : "<<zhuchePointNum<<endl;

    double dis = GetDistance(*gpsMapLine[zhuchePointNum], now_gps_ins);

    if (dis<35)
    {
        Point2D pt = Coordinate_Transfer((*gpsMapLine[zhuchePointNum]).gps_x, (*gpsMapLine[zhuchePointNum]).gps_y, now_gps_ins);
        double zhucheDistance = pt.y;
#if 0

        if (dSpeed > 15)
        {
            dSpeed = 15;
        }



        if (zhucheDistance < 20 && dis < 25)
        {
            dSpeed = min(dSpeed, 5.0);
        }
#else
        if (dSpeed > 12)
        {
            dSpeed = 12;
        }



        if (zhucheDistance < 9 && dis < 9)
        {
            dSpeed = min(dSpeed, 5.0);
        }
#endif


        if (zhucheDistance < 3.0 && dis < 3.5)
        {
            dSpeed = min(dSpeed, 5.0);
            zhucheMode = true;
            readyZhucheMode = false;
            cout<<"jinru ZHECHE STATE+++++++++++++++++++++++++++++++++"<<endl;

            //1125
            //                 gps_decition->brake=20;
            //                 gps_decition->accelerator = -3;
            //                 gps_decition->wheel_angle = 0-controlAng;
            //                 gps_decition->speed = 0;
            //                 gps_decition->torque=0;
            //                 return gps_decition;





        }

    }

}

void ivdecision_brain::decision_readyParkMode(GPS_INS now_gps_ins, const std::vector<GPSData> &gpsMapLine)
{
    double parkDis = GetDistance(now_gps_ins, *gpsMapLine[finishPointNum]);
    hasZhuched = true;

    if (parkDis < 25)
    {
        Point2D pt = Coordinate_Transfer((*gpsMapLine[finishPointNum]).gps_x, (*gpsMapLine[finishPointNum]).gps_y, now_gps_ins);
        double parkDistance = pt.y;


        if (dSpeed > 15)
        {
            dSpeed = 15;
        }

        //dSpeed = 15;//////////////////////////////

        if (parkDistance < 15 && parkDistance >= 12.5 && parkDis<20)
        {
            dSpeed = min(dSpeed, 8.0);
        }else if (parkDistance < 12.5 && parkDistance >= 8.5 && parkDis<15.0){
            dSpeed = min(dSpeed, 5.0);
        }else if (parkDistance < 8.5 && parkDistance >= 5.5 && parkDis<9.0){
            dSpeed = min(dSpeed, 3.0);
        }else if(parkDistance < 5.5 && parkDis<6.0){
            dSpeed = min(dSpeed, 1.0);
        }


        //            float stopDis=2;
        //            if(ServiceCarStatus.msysparam.mvehtype=="ge3"){
        //                stopDis=1.6;
        //            } else if(ServiceCarStatus.msysparam.mvehtype=="vv7"){
        //                stopDis=1.8;
        //            }

        if (parkDistance < 1.6  && parkDis<2.0)
        {
            // dSpeed = 0;
            parkMode = true;
            readyParkMode = false;
        }


    }
}

void ivdecision_brain::decision_speedctrl(Decition &gps_decition,const std::vector<GPSData> & gpsMapLine)
{
    if (gpsMapLine[PathPoint]->roadMode ==0)
    {
        //dSpeed = min(10.0,dSpeed);

        dSpeed = min(ServiceCarStatus.mroadmode_vel.mfmode0,dSpeed);
        gps_decition->leftlamp = false;
        gps_decition->rightlamp = false;

    }else  if (gpsMapLine[PathPoint]->roadMode == 5)
    {
        //dSpeed = min(8.0,dSpeed);

        dSpeed = min(ServiceCarStatus.mroadmode_vel.mfmode5,dSpeed);
        gps_decition->leftlamp = false;
        gps_decition->rightlamp = false;

    }else if (gpsMapLine[PathPoint]->roadMode == 11)
    {
        dSpeed = min(ServiceCarStatus.mroadmode_vel.mfmode11,dSpeed);
        gps_decition->leftlamp = false;
        gps_decition->rightlamp = false;

    }else if (gpsMapLine[PathPoint]->roadMode == 14)
    {
        //dSpeed = min(8.0,dSpeed);

        dSpeed = min(ServiceCarStatus.mroadmode_vel.mfmode14,dSpeed);
        gps_decition->leftlamp = true;
        gps_decition->rightlamp = false;
    }else if (gpsMapLine[PathPoint]->roadMode == 15)
    {
        //dSpeed = min(8.0,dSpeed);

        dSpeed = min(ServiceCarStatus.mroadmode_vel.mfmode15,dSpeed);
        gps_decition->leftlamp = false;
        gps_decition->rightlamp = true;
    }else if (gpsMapLine[PathPoint]->roadMode == 16)
    {
        // dSpeed = min(10.0,dSpeed);
        dSpeed = min(ServiceCarStatus.mroadmode_vel.mfmode16,dSpeed);
        //gps_decition->leftlamp = true;
        //gps_decition->rightlamp = false;
    }else if (gpsMapLine[PathPoint]->roadMode == 17)
    {
        //  dSpeed = min(10.0,dSpeed);
        dSpeed = min(ServiceCarStatus.mroadmode_vel.mfmode17,dSpeed);
        //gps_decition->leftlamp = false;
        //gps_decition->rightlamp = true;
    }else if (gpsMapLine[PathPoint]->roadMode == 18)
    {
        // dSpeed = min(10.0,dSpeed);
        dSpeed = min(ServiceCarStatus.mroadmode_vel.mfmode18,dSpeed);
        gps_decition->leftlamp = false;
        gps_decition->rightlamp = false;

        /*if(gpsMapLine[PathPoint]->light_left_or_right == 1)
        {
            gps_decition->leftlamp = true;
            gps_decition->rightlamp = false;
        }
        else if(gpsMapLine[PathPoint]->light_left_or_right == 2)
        {
            gps_decition->leftlamp = false;
            gps_decition->rightlamp = true;
        }*/
    }else if (gpsMapLine[PathPoint]->roadMode == 1)
    {
        dSpeed = min(10.0,dSpeed);
    }else if (gpsMapLine[PathPoint]->roadMode == 2)
    {
        dSpeed = min(15.0,dSpeed);
    }
    else if (gpsMapLine[PathPoint]->roadMode == 7)
    {
        dSpeed = min(15.0,dSpeed);
        xiuzhengCs=1.5;
    }else if (gpsMapLine[PathPoint]->roadMode == 4) //1220
    {
        dSpeed = min(4.0,dSpeed);

    }else{
        dSpeed = min(ServiceCarStatus.mroadmode_vel.mfmode0,dSpeed);
        gps_decition->leftlamp = false;
        gps_decition->rightlamp = false;

    }





    if (gpsMapLine[PathPoint]->speed_mode == 2)
    {
        dSpeed = min(25.0,dSpeed);

    }

    if((gpsMapLine[PathPoint]->speed)>0.001)
    {
        dSpeed = min((gpsMapLine[PathPoint]->speed*3.6),dSpeed);
    }


    dSecSpeed = dSpeed / 3.6;

    std::cout<<"juecesudu2="<<dSpeed<<std::endl;
}

//std::vector<iv::Perception::PerceptionOutput> lidar_per,
iv::decition::Decition ivdecision_brain::getDecideFromGPS(GPS_INS now_gps_ins,
                                                                   const std::vector<GPSData> gpsMapLine,
                                                                   iv::LidarGridPtr lidarGridPtr,
                                                          std::vector<iv::Perception::PerceptionOutput> lidar_per,
                                                                   iv::TrafficLight trafficLight)
{

    iv::decition::Decition gps_decition(new iv::decition::DecitionBasic);


    //如果useFrenet、useOldAvoid两者不互为相异,则采用原来的方法。“^”为异或运算符。
    if(!(useFrenet^useOldAvoid)){
        useFrenet = false;
        useOldAvoid = true;
    }


    if (isFirstRun)
    {
        decision_firstRun(now_gps_ins,gpsMapLine);
    }


    if(ServiceCarStatus.msysparam.gpsOffset_x!=0 || ServiceCarStatus.msysparam.gpsOffset_y!=0 ){
        GPS_INS gpsOffset = Coordinate_UnTransfer(ServiceCarStatus.msysparam.gpsOffset_x, ServiceCarStatus.msysparam.gpsOffset_y, now_gps_ins);
        now_gps_ins.gps_x=gpsOffset.gps_x;
        now_gps_ins.gps_y=gpsOffset.gps_y;
        GaussProjInvCal(now_gps_ins.gps_x,  now_gps_ins.gps_y, &now_gps_ins.gps_lng, &now_gps_ins.gps_lat);
    }


    changingDangWei=false;

    minDecelerate=0;
    if(now_gps_ins.gps_lat<0||now_gps_ins.gps_lat>90){
        //  int a=0;
        gps_decition->wheel_angle = 0;
        gps_decition->speed = dSpeed;

        gps_decition->accelerator = -0.5;
        gps_decition->brake=10;
        return gps_decition;
    }


    if(ServiceCarStatus.daocheMode){

        now_gps_ins.ins_heading_angle=now_gps_ins.ins_heading_angle+180;
        if( now_gps_ins.ins_heading_angle>=360)
            now_gps_ins.ins_heading_angle= now_gps_ins.ins_heading_angle-360;
    }

    //1125 traficc
    traffic_light_gps.gps_lat=ServiceCarStatus.iTrafficeLightLat;
    traffic_light_gps.gps_lng=ServiceCarStatus.iTrafficeLightLon;
    GaussProjCal(traffic_light_gps.gps_lng,traffic_light_gps.gps_lat, &traffic_light_gps.gps_x, &traffic_light_gps.gps_y);


    //xiesi
    ///kkcai, 2020-01-03
    //ServiceCarStatus.busmode=true;
    //ServiceCarStatus.busmode=false;//20200102
    ///////////////////////////////////////////////////


    //busMode = ServiceCarStatus.busmode;
    nearStation=false;

    gps_decition->leftlamp = false;
    gps_decition->rightlamp = false;
    //    qDebug("heading is %g",now_gps_ins.ins_heading_angle);


    aim_gps_ins.gps_lat= ServiceCarStatus.mfParkLat;
    aim_gps_ins.gps_lng= ServiceCarStatus.mfParkLng;

    aim_gps_ins.ins_heading_angle= ServiceCarStatus.mfParkHeading;

    GaussProjCal(aim_gps_ins.gps_lng,aim_gps_ins.gps_lat, &aim_gps_ins.gps_x, &aim_gps_ins.gps_y);
    is_arrivaled = false;

    xiuzhengCs=0;

    realspeed = now_gps_ins.speed;

    secSpeed = realspeed / 3.6;



    if(decision_ParkCalc(now_gps_ins,gps_decition) == 1)
    {
        return gps_decition;
    }

    switch (vehState) {
    // ChuiZhiTingChe
    case reverseCar:
        return decision_reverseCar(now_gps_ins);
        break;
    case reversing:
        return decision_reversing(now_gps_ins);
        break;
    case reverseCircle:
        return decision_reverseCircle(now_gps_ins);
        break;
    case reverseDirect:
        return decision_reverseDirect(now_gps_ins);
        break;
    case reverseArr:
        return decision_reverseArr(now_gps_ins);
        break;
         //ceFangWeiBoChe
    case dRever:
        return decision_dRever(now_gps_ins);
        break;
    case dRever0:
        return decision_dRever0(now_gps_ins);
        break;
    case dRever1:
        return decision_dRever1(now_gps_ins);
        break;
    case dRever2:
        return decision_dRever2(now_gps_ins);
        break;
    case dRever3:
        return decision_dRever3(now_gps_ins);
        break;
    case dRever4:
        return decision_dRever4(now_gps_ins);
        break;
    default:
        break;
    }



    obsDistance = -1;
    esrIndex = -1;
    lidarDistance = -1;

    obsDistanceAvoid = -1;
    esrIndexAvoid = -1;
    roadPre = -1;

    gpsTraceOri.clear();
    gpsTraceNow.clear();
    gpsTraceAim.clear();
    gpsTraceAvoid.clear();
    gpsTraceBack.clear();


    if (!isFirstRun)
    {
        //   PathPoint = iv::decition::Compute00().getNearestPointIndex(now_gps_ins, gpsMapLine, lastGpsIndex, minDis, maxAngle);
        //    if(PathPoint<0){
        PathPoint = iv::decition::Compute00().getFirstNearestPointIndex(now_gps_ins, gpsMapLine, lastGpsIndex, minDis, maxAngle);
        //    }

    }


    if (PathPoint<0)
    {

        minDecelerate=-1.0;
        phaseSpeedDecition(gps_decition, secSpeed, -1, 0,now_gps_ins);
        return gps_decition;

    }

    lastGpsIndex = PathPoint;

    //2020-01-03, kkcai
    //if(!circleMode && PathPoint>gpsMapLine.size()-200){
    if(!circleMode && PathPoint>gpsMapLine.size()-100){
        minDecelerate=-1.0;
        std::cout<<"map finish brake"<<std::endl;
    }



    if(!ServiceCarStatus.inRoadAvoid){
        roadOri = gpsMapLine[PathPoint]->roadOri;
        roadSum = gpsMapLine[PathPoint]->roadSum;
    }else{
        roadOri=gpsMapLine[PathPoint]->roadOri*3+1;
        roadSum = gpsMapLine[PathPoint]->roadSum*3;
    }

    if(ServiceCarStatus.avoidObs){
         gpsMapLine[PathPoint]->runMode=1;
    }else{
         gpsMapLine[PathPoint]->runMode=0;
    }

    if(roadNowStart){
        roadNow=roadOri;
        roadNowStart=false;
    }

 //   avoidX = (roadOri-roadNow)*roadWidth;
    avoidX=computeAvoidX(roadNow,roadOri,gpsMapLine[PathPoint],ServiceCarStatus.msysparam.vehWidth);


    if ( gpsMapLine[PathPoint]->runMode == 0 &&(vehState == avoidObs||vehState ==stopObs||vehState == preAvoid
                                                ||vehState == avoiding||vehState == backOri||vehState ==preBack||vehState ==waitAvoid ) )
    {
        vehState = normalRun;
        roadNow = roadOri;
    }


    gpsTraceOri= getGpsTrace(now_gps_ins, gpsMapLine, lastGpsIndex,circleMode);
    //    gpsTraceOri = laneChangePlanner->getPath(now_gps_ins,gpsMapLine,PathPoint,0,lidarGridPtr);
    if(gpsTraceOri.empty()){
        gps_decition->wheel_angle = 0;
        gps_decition->speed = dSpeed;

        gps_decition->accelerator = -0.5;
        gps_decition->brake=10;
        return gps_decition;
    }



    traceDevi=gpsTraceOri[0].x;

    //起步进行frenet规划后,车辆行驶至地图路线上,起步操作完毕。
    //如果车辆本身启动位置在地图路线上,可不用进行frenet规划。
    //    if(GetDistance(now_gps_ins,*gpsMapLine[PathPoint]) < 1){
    //        startingFlag = false;
    //    }
    startingFlag = false;
    if(startingFlag){
        //        gpsTraceAim = gpsTraceOri;
        if(abs(gpsTraceOri[0].x)>1){
            cout<<"frenetPlanner->getPath:pre"<<endl;
            gpsTraceNow = frenetPlanner->getPath(now_gps_ins,gpsMapLine,PathPoint,0,lidarGridPtr);
            cout<<"frenetPlanner->getPath,gpsTraceNow.size: "<<gpsTraceNow.size()<<endl;
            if(gpsTraceNow.size()==0){
                gps_decition->accelerator = 0;
                gps_decition->brake=10;
                gps_decition->wheel_angle = lastAngle;
                gps_decition->speed = 0;
                return gps_decition;
            }
        }else{
            startingFlag = false;
        }
    }


    if(useFrenet){
        //如果车辆在变道中,启用frenet规划局部路径
        if(vehState == avoiding || vehState == backOri){
            //avoidX = (roadOri - roadNow)*roadWidth;
             avoidX=computeAvoidX(roadNow,roadOri,gpsMapLine[PathPoint],ServiceCarStatus.msysparam.vehWidth);
            gpsTraceNow = frenetPlanner->getPath(now_gps_ins,gpsMapLine,PathPoint,avoidX,lidarGridPtr);
            //gpsTraceAim = laneChangePlanner->getPath(now_gps_ins,gpsMapLine,PathPoint,avoidX,lidarGridPtr);
            gpsTraceAim = getGpsTraceOffset(gpsTraceOri, avoidX);
            if(gpsTraceNow.size()==0){
                gps_decition->accelerator = 0;
                gps_decition->brake=10;
                gps_decition->wheel_angle = lastAngle;
                gps_decition->speed = 0;
                return gps_decition;
            }
        }
    }

    if(gpsTraceNow.size()==0){
        if (roadNow==roadOri)
        {
            gpsTraceNow.assign(gpsTraceOri.begin(), gpsTraceOri.end());
            //gpsTraceNow = getGpsTrace(now_gps_ins, gpsMapLine, lastGpsIndex);
        }else
        {
            //	gpsTraceNow = getGpsTrace(now_gps_ins, gmapsR[int(abs(roadWidth * 2)*(roadOri-roadNow))], lastGpsIndex);
            gpsTraceNow = getGpsTraceOffset(gpsTraceOri, avoidX);
            //gpsTraceNow = laneChangePlanner->getPath(now_gps_ins,gpsMapLine,PathPoint,avoidX,lidarGridPtr);
        }
    }


    //  dSpeed = getSpeed(gpsTraceNow);
    dSpeed = 80;

    //   planTrace = gpsTraceNow; //Add By YuChuli, 2020.11.26

    planTrace.clear();
    for(int i=0;i<gpsTraceNow.size();i++){
        TracePoint pt(gpsTraceNow[i].x,gpsTraceNow[i].y);
        planTrace.push_back(pt);
    }


    dSpeed = limitSpeed(controlAng, dSpeed);



    controlAng= getAngle(gpsTraceNow,now_gps_ins,gps_decition);
    if(!circleMode && PathPoint>(gpsMapLine.size()-100)){
        controlAng=0;
    }



    //1220
    if(ServiceCarStatus.daocheMode){
        controlAng=0-controlAng;
    }

    //2020-0106
    if(vehState==avoiding){
        controlAng=max(-150.0,controlAng);
        controlAng=min(150.0,controlAng);
    }
    if(vehState==backOri){
        controlAng=max(-120.0,controlAng);
        controlAng=min(120.0,controlAng);
    }

    //准备驻车

    if (readyZhucheMode)
    {
        decision_readyZhucheMode(now_gps_ins,gpsMapLine);
    }


    if (readyParkMode)
    {
        decision_readyParkMode(now_gps_ins,gpsMapLine);
    }

    decision_speedctrl(gps_decition,gpsMapLine);

    if(vehState==changingRoad){
        if(gpsTraceNow[0].x>1.0){
            gps_decition->leftlamp = false;
            gps_decition->rightlamp = true;
        }else if(gpsTraceNow[0].x<-1.0){
            gps_decition->leftlamp = true;
            gps_decition->rightlamp = false;
        }else{
            vehState==normalRun;
        }
    }

    //    qDebug("decide0 time is %d",xTime.elapsed());

    //1220
    if(!ServiceCarStatus.daocheMode){
        computeObsOnRoad(lidarGridPtr, gpsTraceNow, roadNow,gpsMapLine,lidar_per);
    }else{
        gpsTraceRear.clear();
        for(int i=0;i<gpsTraceNow.size();i++){
            Point2D pt;
            pt.x=0-gpsTraceNow[i].x;
            pt.y=0-gpsTraceNow[i].y;
            gpsTraceRear.push_back(pt);
        }
        computeObsOnRoad(lidarGridPtr, gpsTraceNow, roadNow,gpsMapLine,lidar_per);
        //  obsDistance=-1; //1227
    }




    //old_bz--------------------------------------------------------------------------------------------------

    if (vehState == avoiding)
    {
        cout<<"\n==================avoiding=================\n"<<endl;
        //  vehState=normalRun; //1025
        if (dSpeed > 10) {
            dSpeed = 10;
        }
        //若车辆到达变道后的路径,改变车辆状态,关闭frenet规划
        if (useFrenet && abs(gpsTraceAim[0].x)<1.0) {
            vehState = normalRun;
            //            useFrenet = false;
            //            useOldAvoid = true;
        }
        else if (useOldAvoid && abs(gpsTraceNow[0].x)<1.0) {
            // vehState = avoidObs; 0929
            vehState = normalRun;
        }
        else if (gpsTraceNow[0].x>0)
        {
            gps_decition->leftlamp = false;
            gps_decition->rightlamp = true;
        }
        else if(gpsTraceNow[0].x<0)
        {
            gps_decition->leftlamp = true;
            gps_decition->rightlamp = false;
        }
    }


    if (vehState==preBack)
    {
        vehState = backOri;
    }


    if (vehState==backOri)
    {
        cout<<"\n================backOri===========\n"<<endl;
        //  vehState=normalRun; //1025
        if (dSpeed > 10) {
            dSpeed = 10;
        }

        //若车辆到达变道后的路径,改变车辆状态,关闭frenet规划
        if (useFrenet && abs(gpsTraceAim[0].x)<1.0) {
            vehState = normalRun;
            //            useFrenet = false;
            //            useOldAvoid = true;
        }
        else if (useOldAvoid && abs(gpsTraceNow[0].x)<1.0) {
            // vehState = avoidObs; 0929
            vehState = normalRun;
        }
        else if (gpsTraceNow[0].x>0)
        {
            gps_decition->leftlamp = false;
            gps_decition->rightlamp = true;
        }
        else if (gpsTraceNow[0].x<0)
        {
            gps_decition->leftlamp = true;
            gps_decition->rightlamp = false;
        }
    }

    std::cout<<"\n原始RoadOri:%d\n"<<roadOri<<endl;

    cout<<"\n当前RoadNum:%d\n"<<roadNow<<endl;









    //   计算回归原始路线

    if (roadNow!=roadOri)
    {
        //        useFrenet = true;
        //        useOldAvoid = false;

        if(useFrenet){
            if ((GetDistance(now_gps_ins, startAvoidGpsInsVector[roadOri])>max(avoidMinDistanceVector[roadOri],30.0)))
            {
                double offsetL = -(roadSum - 1)*roadWidth;
                double offsetR = (roadOri - 0)*roadWidth;
                roadPre = frenetPlanner->chooseRoadByFrenet(now_gps_ins,gpsMapLine,PathPoint,offsetL,offsetR,lidarGridPtr,roadNow);
            }
        }
        else if(useOldAvoid){
            roadPre = chooseBackRoad(lidarGridPtr, now_gps_ins, gpsMapLine,lidar_per);
          //  avoidX = (roadOri - roadNow)*roadWidth; //1012
             avoidX=computeAvoidX(roadNow,roadOri,gpsMapLine[PathPoint],ServiceCarStatus.msysparam.vehWidth);
        }
    }
    if (roadNow != roadOri && roadPre!=-1)
    {

        roadNow = roadPre;
     //   avoidX = (roadOri - roadNow)*roadWidth;
         avoidX=computeAvoidX(roadNow,roadOri,gpsMapLine[PathPoint],ServiceCarStatus.msysparam.vehWidth);
        gpsTraceNow.clear();
        if(useOldAvoid){
            gpsTraceNow = getGpsTraceOffset(gpsTraceOri, avoidX);
        }
        else if(useFrenet){
            gpsTraceNow = frenetPlanner->getPath(now_gps_ins,gpsMapLine,PathPoint,avoidX,lidarGridPtr);
        }

        vehState = backOri;
        hasCheckedBackLidar = false;
        //  checkBackObsTimes = 0;

        cout<<"\n回归RoadNum:%d\n"<< roadNow<<endl;

    }

    //shiyanbizhang 0929
    if(obsDistance>0&& (obsDistance<ServiceCarStatus.socfDis+20.0) &&(abs(realspeed)<1.0) &&
            (vehState==normalRun||vehState==backOri || vehState==avoiding) &&(ObsTimeStart==-1)
            && (gpsMapLine[PathPoint]->runMode==1)){
        ObsTimeStart=GetTickCount();
        cout<<"\n====================preAvoid time count start==================\n"<<endl;
    }
    if(ObsTimeStart!=-1){
        ObsTimeEnd=GetTickCount();
    }
    if(ObsTimeEnd!=-1){
        ObsTimeSpan=ObsTimeEnd-ObsTimeStart;
    }
    if(ObsTimeSpan>ObsTimeWidth &&(obsDistance>1.5||obsDistance<0) && (gpsMapLine[PathPoint]->runMode==1)){ //1026
        vehState=avoidObs;
        ObsTimeStart=-1;
        ObsTimeEnd=-1;
        ObsTimeSpan=-1;
        cout<<"\n====================preAvoid time count finish==================\n"<<endl;
    }

    if(obsDistance<0 ||obsDistance>ServiceCarStatus.socfDis){
        ObsTimeStart=-1;
        ObsTimeEnd=-1;
        ObsTimeSpan=-1;

    }


    //避障模式


    if (vehState == avoidObs   || vehState==waitAvoid ) {

        //      if (obsDistance <20 && obsDistance >0)
        if (obsDistance <ServiceCarStatus.aocfDis && obsDistance >0)
        {
            dSpeed = min(7.0,dSpeed);
            avoidTimes++;
            //          if (avoidTimes>=6)
            if (avoidTimes>=ServiceCarStatus.aocfTimes)
            {
                vehState = preAvoid;
                avoidTimes = 0;
            }

        }
        //        else if (obsDistance < 35 && obsDistance >0 && dSpeed>10)
        //        {
        //            dSpeed = 10;
        //            avoidTimes = 0;
        //        }
        else if (obsDistance < 40 && obsDistance >0 && dSpeed>15)
        {
            dSpeed =  min(15.0,dSpeed);
            avoidTimes = 0;
        }
        else
        {
            avoidTimes = 0;
        }

    }


    if (vehState == preAvoid)
    {
        cout<<"\n====================preAvoid==================\n"<<endl;
        /* if (obsDisVector[roadNow]>30)*/  //if (obsDisVector[roadNow]>30||obsDisVector[roadNow]<0)
        if (obsDisVector[roadNow]>ServiceCarStatus.aocfDis)
        {
            // vehState = avoidObs; 0929
            vehState=normalRun;
        }
        else
        {
            //roadPre = chooseAvoidRoad(lidarGridPtr, now_gps_ins,gpsMapLine);
            if(useOldAvoid){
                roadPre = chooseAvoidRoad(lidarGridPtr, now_gps_ins,gpsMapLine,lidar_per);
              //  avoidX = (roadOri - roadNow)*roadWidth;  //1012
                 avoidX=computeAvoidX(roadNow,roadOri,gpsMapLine[PathPoint],ServiceCarStatus.msysparam.vehWidth);
            }
            else if(useFrenet){
                double offsetL = -(roadSum - 1)*roadWidth;
                double offsetR = (roadOri - 0)*roadWidth;
                roadPre = frenetPlanner->chooseRoadByFrenet(now_gps_ins,gpsMapLine,PathPoint,offsetL,offsetR,lidarGridPtr,roadNow);
            }

            if (roadPre == -1 && obsDisVector[roadNow]<1.5 && obsDisVector[roadNow]>0)
            {
                //  vehState = waitAvoid; 0929
                vehState = avoidObs;
            }
            else if (roadPre != -1)
            {
                if(useOldAvoid){
                    roadNow = roadPre;
                //    avoidX = (roadOri - roadNow)*roadWidth;
                     avoidX=computeAvoidX(roadNow,roadOri,gpsMapLine[PathPoint],ServiceCarStatus.msysparam.vehWidth);
                    gpsTraceNow.clear();
                    gpsTraceNow = getGpsTraceOffset(gpsTraceOri, avoidX);
                }
                else if(useFrenet){
                    if(roadPre != roadNow){
                        avoidMinDistanceVector[roadNow] = obsDisVector[roadNow] + ServiceCarStatus.msysparam.vehLenth;
                        startAvoidGpsInsVector[roadNow] = now_gps_ins;
                    }
                    roadNow = roadPre;
                 //   avoidX = (roadOri - roadNow)*roadWidth;
                     avoidX=computeAvoidX(roadNow,roadOri,gpsMapLine[PathPoint],ServiceCarStatus.msysparam.vehWidth);
                    gpsTraceNow = frenetPlanner->getPath(now_gps_ins,gpsMapLine,PathPoint,avoidX,lidarGridPtr);
                }


                vehState = avoiding;

                hasCheckedAvoidLidar = false;

                cout<<"\n避障到RoadNum:%d\n"<<roadNow<<endl;

            }
        }
    }

    //--------------------------------------------------------------------------------old_bz_end




    if (parkMode)
    {
        minDecelerate=-0.4;

        if(finishPointNum<0||finishPointNum>=gpsMapLine.size()){
            parkMode=false;
        }else if(GetDistance(now_gps_ins, *gpsMapLine[finishPointNum])>4){
            parkMode=false;
        }

    }



    //驻车

    if (zhucheMode)
    {
        int mzcTime = ServiceCarStatus.msysparam.mzhuchetime * 1000;

        //        if(trumpet()<16000)
        if (trumpet()<mzcTime)
        {
            //            if (trumpet()<12000){
            cout<<"ZHECHE ING STATE+++++++++++++++++++++++++++++++++"<<endl;
            minDecelerate=-1.0;
            if(abs(realspeed)<0.2){
                controlAng=0;  //tju
            }
        }
        else
        {
            hasZhuched = true; //1125
            zhucheMode = false;
            trumpetFirstCount = true;
            cout<<"ZHECHE STATE JIESHU +++++++++++++++++++++++++++++++++"<<endl;
        }

    }


    //判断驻车标志位
    if (hasZhuched && GetDistance(now_gps_ins,*gpsMapLine[zhuchePointNum])>20)
    {
        hasZhuched = false;
    }


    if ( vehState==changingRoad || vehState==chaocheBack)
    {
        double lastAng = 0.0 - lastAngle;
        if (controlAng>40)
        {
            controlAng =40;
        }
        else if (controlAng<-40)
        {
            controlAng = - 40;
        }


    }


    //速度结合角度的限制
    controlAng = limitAngle(realspeed, controlAng);


    std::cout << "\n呼车指令状态:%d\n" <<  ServiceCarStatus.carState << std::endl;



    //1220
    if(PathPoint+80<gpsMapLine.size()-1){
        if(gpsMapLine[PathPoint+80]->roadMode==4  && !ServiceCarStatus.daocheMode){
            changingDangWei=true;
        }
    }

    if(changingDangWei){
        if(abs(realspeed)>0.1){
            dSpeed=0;
        }else{
            dSpeed=0;
            gps_decition->dangWei=2;
            ServiceCarStatus.daocheMode=true;
        }
    }
    //1220 end




    for(int i = 0;i<ServiceCarStatus.car_stations.size();i++)
    {
        GPS_INS gpsIns;
        GaussProjCal(ServiceCarStatus.car_stations[i].longtitude, ServiceCarStatus.car_stations[i].latitude,  &gpsIns.gps_x, &gpsIns.gps_y);

        double dis = GetDistance(gpsIns, now_gps_ins);
        if(dis<20)
            ServiceCarStatus.currentstation = ServiceCarStatus.car_stations[i].ID;
    }


    //  解析云平台数据
    if(ServiceCarStatus.stationCmd.received==true)
    {
        std::vector<Station>  station_received;
        Station station_aa,station_nearest;

        if(ServiceCarStatus.stationCmd.has_emergencyStop)
        {
            if(ServiceCarStatus.stationCmd.emergencyStop==0x01)
            {
                //ServiceCarStatus.carState = 0;
                //busMode=true;
                ServiceCarStatus.emergencyStop=1;
            }
            else
            {
                //ServiceCarStatus.carState = 1;
                //busMode=false;
                ServiceCarStatus.emergencyStop=0;
            }
        }

        if(ServiceCarStatus.stationCmd.has_stationStop)
        {
            //寻找最近站点
            station_received.clear();
            for(int i=0;i<ServiceCarStatus.stationCmd.stationTotalNum;i++)
            {
                station_aa.index=i;
                station_aa.station_location.gps_lat=ServiceCarStatus.stationCmd.stationGps[i].gps_lat;
                station_aa.station_location.gps_lng=ServiceCarStatus.stationCmd.stationGps[i].gps_lng;
                GaussProjCal(station_aa.station_location.gps_lng,station_aa.station_location.gps_lat, &station_aa.station_location.gps_x, &station_aa.station_location.gps_y);
                station_received.push_back(station_aa);
            }
            station_nearest=getNearestStation(now_gps_ins,station_received,gpsMapLine);

            qDebug("station_nearest: %d, lat: %.7f, lon: %.7f", station_nearest.map_index, station_nearest.station_location.gps_lat, ServiceCarStatus.amilng=station_nearest.station_location.gps_lng);
            givlog->debug("brain_v2x","station_nearest: %d, lat: %.7f, lon: %.7f",
                          station_nearest.map_index, station_nearest.station_location.gps_lat,
                          station_nearest.station_location.gps_lng);
            //进入站点模式
            if((ServiceCarStatus.stationCmd.stationStop==0x00))
            {
                ServiceCarStatus.carState = 2;
                ServiceCarStatus.amilat=station_nearest.station_location.gps_lat;
                ServiceCarStatus.amilng=station_nearest.station_location.gps_lng;
                busMode=true;
            }else
            {
                ServiceCarStatus.carState = 1;
                busMode=false;
                ServiceCarStatus.station_control_door=0;
                ServiceCarStatus.station_control_door_option=false;
            }
        }
        if(ServiceCarStatus.stationCmd.has_carMode)
        {
            if(ServiceCarStatus.stationCmd.carMode==0x00)
            {
                ServiceCarStatus.stationCmd.mode_manual_drive=true;
            }else
            {
                ServiceCarStatus.stationCmd.mode_manual_drive=false;
            }
        }

        ServiceCarStatus.stationCmd.received=false;
    }




    //carState == 0,紧急停车
    if ((ServiceCarStatus.emergencyStop==1))  //||(adjuseultra()==true))
    {
        minDecelerate=-1.0;
    }

    if (ServiceCarStatus.carState == 3 && busMode)
    {

        if(realspeed<0.1){
            ServiceCarStatus.carState=0;
            minDecelerate=-1.0;
        }else{
            nearStation=true;
            dSpeed=0;
        }

    }

    //carState==2,站点停车
    if ((ServiceCarStatus.carState==2)&&busMode)
    {

        aim_gps_ins.gps_lat=ServiceCarStatus.amilat;
        aim_gps_ins.gps_lng=ServiceCarStatus.amilng;

        GaussProjCal( aim_gps_ins.gps_lng, aim_gps_ins.gps_lat,  &aim_gps_ins.gps_x, &aim_gps_ins.gps_y);
        double dis = GetDistance(aim_gps_ins, now_gps_ins);
        Point2D pt = Coordinate_Transfer((aim_gps_ins).gps_x, (aim_gps_ins).gps_y, now_gps_ins);

        if (dis<20 && pt.y<5 && abs(pt.x)<3)
        {
            dSpeed = 0;
            nearStation=true;
            //is_arrivaled = true;
            //ServiceCarStatus.status[0] = true;
            ServiceCarStatus.istostation=1;
            minDecelerate=-1.0;
        }
        else if (dis<20 && pt.y<15 && abs(pt.x)<3)
        {
            nearStation=true;
            dSpeed = min(8.0, dSpeed);
        }
        else if (dis<30 && pt.y<20 && abs(pt.x)<3)
        {
            dSpeed = min(15.0, dSpeed);
        }
        else if (dis<50 && abs(pt.x)<3)
        {
            dSpeed = min(20.0, dSpeed);
        }

        if((pt.y<5)&&(abs(realspeed)<0.1)&&(ServiceCarStatus.station_control_door==0))
        {
            ServiceCarStatus.station_control_door=1;   //open door
        }

        //站点停车log
        givlog->debug("brain_v2x","aim_gps_ins.gps_lat: %.7f, aim_gps_ins.gps_lng: %.7f, dis: %.2f, dSpeed: %.1f",
                      aim_gps_ins.gps_lat, aim_gps_ins.gps_lng,
                      dis,dSpeed);

    }


    dSecSpeed = dSpeed / 3.6;
    gps_decition->speed = dSpeed;



    if (gpsMapLine[PathPoint]->runMode == 2)
    {
        obsDistance = -1;
    }

    std::cout<<"juecesudu0="<<dSpeed<<std::endl;

    //-------------------------------traffic light----------------------------------------------------------------------------------------

    if(traffic_light_gps.gps_lat!=0 && traffic_light_gps.gps_lng!=0){
        traffic_light_pathpoint = iv::decition::Compute00().getNoAngleNearestPointIndex(traffic_light_gps, gpsMapLine);
        //    traffic_light_pathpoint=130;
        float traffic_speed=ComputeTrafficLightSpeed(ServiceCarStatus.iTrafficeLightColor,ServiceCarStatus.iTrafficeLightTime,gpsMapLine,
                                                     traffic_light_pathpoint ,PathPoint,secSpeed,dSpeed);
        dSpeed = min((double)traffic_speed,dSpeed);
        if(traffic_speed==0){
            minDecelerate=-2.0;
        }
    }
    //-------------------------------traffic light  end-----------------------------------------------------------------------------------------------


    //-------------------------------v2x traffic light-----------------------------------------------------------------------------------------


    double v2xTrafficSpeed= ComputeV2XTrafficLightSpeed( trafficLight,  gpsMapLine, v2xTrafficVector,
                                                         PathPoint, secSpeed, dSpeed,  circleMode);


    dSpeed = min(v2xTrafficSpeed,dSpeed);

    //------------------------------v2x traffic light end--------------------------------------------------------------------------------------


    transferGpsMode2(gpsMapLine);



    if((ServiceCarStatus.msysparam.mvehtype=="hapo")&&(abs(realspeed)<18)){
        if(obsDistance>0 && obsDistance<6){
            dSpeed=0;
        }
    }else if(obsDistance>0 && obsDistance<10){
        dSpeed=0;
    }

    //  obsDistance=-1; //1227

    if(ServiceCarStatus.group_control){
        dSpeed = ServiceCarStatus.group_comm_speed;
    }
    if(dSpeed==0){
        minDecelerate=min(-1.0f,minDecelerate);
    }

    std::cout<<"dSpeed= "<<dSpeed<<std::endl;

    // givlog->debug("SPEED","dSpeed is %f",dSpeed);
    gps_decition->wheel_angle = 0.0 - controlAng;
    phaseSpeedDecition(gps_decition, secSpeed, obsDistance, obsSpeed,now_gps_ins);



    lastAngle=gps_decition->wheel_angle;

    //   qDebug("decide1 time is %d",xTime.elapsed());

    for(int i=0;i<ServiceCarStatus.obsTraceLeft.size();i++){
        givlog->debug("obs_distance","obsTraceLeftX: %f, obsTraceLeftY: %f",
                      ServiceCarStatus.obsTraceLeft.at(i).x, ServiceCarStatus.obsTraceLeft.at(i).y);
    }


    return gps_decition;
}






iv::Station  ivdecision_brain::getNearestStation(iv::GPS_INS now_gps_ins,std::vector<Station> station_n,std::vector<GPSData> gpsMap){

    int now_index=0,front_index=0;
    int station_size=station_n.size();

    for(int i=0;i<station_size;i++)
    {
        int minDistance=10;
        for (int j = 0; j < gpsMap.size(); j++)
        {
            double tmpdis = GetDistance(station_n[i].station_location, (*gpsMap[j]));
            if (tmpdis < minDistance )
            {
                minDistance = tmpdis;
                station_n[i].map_index=j;
            }
        }
        givlog->debug("brain_v2x","stationi: %d, map_index: %d",
                      i,station_n[i].map_index);

    }
    int minDistance=10;
    for (int j = 0; j < gpsMap.size(); j++)
    {
        double tmpdis = GetDistance(now_gps_ins, (*gpsMap[j]));
        if (tmpdis < minDistance )
        {
            minDistance = tmpdis;
            now_index=j;
        }
    }

    givlog->debug("brain_v2x","now_index: %d",
                  now_index);

    int min_index=gpsMap.size()-1;
    int station_index=0;
    for(int i=0;i<station_size;i++)
    {
        if(station_n[i].map_index>now_index)
        {
            front_index=station_n[i].map_index;
            if(front_index<min_index)
            {
                min_index=front_index;
                station_index=i;
            }
        }
    }

    qDebug("station_index:%d",station_index);

    return station_n[station_index];

}

void  ivdecision_brain::initMethods(){

    pid_Controller= new PIDController();
    ge3_Adapter = new Ge3Adapter();
    qingyuan_Adapter = new QingYuanAdapter();
    vv7_Adapter = new VV7Adapter();
    zhongche_Adapter = new ZhongcheAdapter();
    bus_Adapter = new BusAdapter();
    hapo_Adapter = new HapoAdapter();
    yuhesen_Adapter = new YuHeSenAdapter();


    mpid_Controller.reset(pid_Controller);
    mbus_Adapter.reset(bus_Adapter);
    mhapo_Adapter.reset(hapo_Adapter);
    myuhesen_Adapter.reset(yuhesen_Adapter);

    frenetPlanner = new FrenetPlanner();
    //    laneChangePlanner = new LaneChangePlanner();

    mfrenetPlanner.reset(frenetPlanner);
    //    mlaneChangePlanner.reset(laneChangePlanner);

}


void  ivdecision_brain::phaseSpeedDecition(iv::decition::Decition  decition, double secSpeed, double obsDis, double obsSpeed, GPS_INS gpsIns ) {

    pid_Controller->getControlDecition( gpsIns, gpsTraceNow,  dSpeed,  obsDis,  obsSpeed, false, true, &decition);

    if(ServiceCarStatus.msysparam.mvehtype=="ge3"){
        ge3_Adapter->getAdapterDeciton(gpsIns, gpsTraceNow, dSpeed, obsDis,obsSpeed,  decition->accelerator,ServiceCarStatus.mfCalAcc  ,changingDangWei, &decition);
    }else if( ServiceCarStatus.msysparam.mvehtype=="qingyuan"){
        qingyuan_Adapter->getAdapterDeciton(gpsIns, gpsTraceNow, dSpeed, obsDis,obsSpeed,  decition->accelerator,ServiceCarStatus.mfCalAcc  ,changingDangWei, &decition);
    }else if( ServiceCarStatus.msysparam.mvehtype=="vv7"){
        vv7_Adapter->getAdapterDeciton(gpsIns, gpsTraceNow, dSpeed, obsDis,obsSpeed,  decition->accelerator,ServiceCarStatus.mfCalAcc  ,changingDangWei, &decition);
    }else if( ServiceCarStatus.msysparam.mvehtype=="zhongche"){
        zhongche_Adapter->getAdapterDeciton(gpsIns, gpsTraceNow, dSpeed, obsDis,obsSpeed,  decition->accelerator,ServiceCarStatus.mfCalAcc  ,changingDangWei, &decition);
    }else if(ServiceCarStatus.msysparam.mvehtype=="bus"){
        bus_Adapter->getAdapterDeciton(gpsIns, gpsTraceNow, dSpeed, obsDis,obsSpeed,  decition->accelerator,ServiceCarStatus.mfCalAcc  ,changingDangWei, &decition);
    }else if(ServiceCarStatus.msysparam.mvehtype=="hapo"){
        hapo_Adapter->getAdapterDeciton(gpsIns, gpsTraceNow, dSpeed, obsDis,obsSpeed,  decition->accelerator,ServiceCarStatus.mfCalAcc  ,changingDangWei, &decition);
    }
    else if(ServiceCarStatus.msysparam.mvehtype=="yuhesen"){
        yuhesen_Adapter->getAdapterDeciton(gpsIns, gpsTraceNow, dSpeed, obsDis,obsSpeed,  decition->accelerator,ServiceCarStatus.mfCalAcc  ,changingDangWei, &decition);
    }
}



std::vector<iv::Point2D>  ivdecision_brain::getGpsTrace(iv::GPS_INS now_gps_ins, const std::vector<GPSData> gpsMapLine, int lastIndex, bool circleMode) {
    vector<iv::Point2D> trace;
    //	int  PathPoint = iv::decition::Compute00().getNearestPointIndex(now_gps_ins, gpsMapLine, lastGpsIndex, minDis, maxAngle);
    /*if (PathPoint != -1)
        lastGpsIndex = PathPoint;*/

    if (gpsMapLine.size() > 600 && PathPoint >= 0) {
        int aimIndex;
        if(circleMode){
            aimIndex=PathPoint+600;
        }else{
            aimIndex=min((PathPoint+600),(int)gpsMapLine.size());
        }

        for (int i = PathPoint; i < aimIndex; i++)
        {
            int index = i % gpsMapLine.size();
            Point2D pt = Coordinate_Transfer((*gpsMapLine[index]).gps_x, (*gpsMapLine[index]).gps_y, now_gps_ins);
            pt.x += offset_real * 0.032;
            pt.v1 = (*gpsMapLine[index]).speed_mode;
            pt.v2 = (*gpsMapLine[index]).mode2;
            pt.roadMode=(*gpsMapLine[index]).roadMode;
            if (gpsMapLine[index]->roadMode==3 && !hasZhuched)
            {
                readyZhucheMode = true;
                zhuchePointNum = index;
            }



            if (gpsMapLine[index]->roadMode==3 && !hasZhuched)
            {
                readyZhucheMode = true;
                zhuchePointNum = index;
            }

            //csvv7
            if (gpsMapLine[index]->speed_mode==22 || gpsMapLine[index]->speed_mode==23)
            {
                readyParkMode = true;
                finishPointNum = index;
            }

            //			if (pt.v1 == 22 || pt.v1 == 23)
            //			{
            //				readyParkMode = true;
            //				finishPointNum = i;
            //			}


            switch (pt.v1)
            {
            case 0:
                pt.speed = 80;
                break;
            case 1:
                pt.speed = 25;
                break;
            case 2:
                pt.speed =25;
                break;
            case 3:
                pt.speed = 20;
                break;
            case 4:
                pt.speed =18;
                break;
            case 5:
                pt.speed = 18;
                break;
            case 7:
                pt.speed = 10;
                break;
            case 22:
                pt.speed = 5;
                break;
            case 23:
                pt.speed = 5;
                break;
            default:
                break;
            }
            trace.push_back(pt);
        }
    }
    return trace;
}

std::vector<iv::Point2D>   ivdecision_brain::getGpsTraceOffset(std::vector<Point2D> gpsTrace, double offset) {

    if (offset==0)
    {
        return gpsTrace;
    }

    std::vector<iv::Point2D> trace;
    for (int j = 0; j < gpsTrace.size(); j++)
    {
        double sumx1 = 0, sumy1 = 0, count1 = 0;
        double sumx2 = 0, sumy2 = 0, count2 = 0;
        for (int k = max(0, j - 4); k <= j; k++)
        {
            count1 = count1 + 1;
            sumx1 += gpsTrace[k].x;
            sumy1 += gpsTrace[k].y;
        }
        for (int k = j; k <= min(gpsTrace.size() - 1, (size_t)(j + 4)); k++)
        {
            count2 = count2 + 1;
            sumx2 += gpsTrace[k].x;
            sumy2 += gpsTrace[k].y;
        }
        sumx1 /= count1; sumy1 /= count1;
        sumx2 /= count2; sumy2 /= count2;

        double anglevalue = atan2(sumy2 - sumy1, sumx2 - sumx1);

        double carFrontx = gpsTrace[j].x;// -Form1.CarRear * Math.Cos(anglevalue);
        double carFronty = gpsTrace[j].y;// -Form1.CarRear * Math.Sin(anglevalue);

        double avoidLenth = abs(offset);
        if (offset<0)
        {
            Point2D ptLeft(carFrontx + avoidLenth * cos(anglevalue + M_PI / 2),
                           carFronty + avoidLenth  * sin(anglevalue + M_PI / 2));
            ptLeft.speed = gpsTrace[j].speed;
            ptLeft.v1 = gpsTrace[j].v1;
            ptLeft.v2 = gpsTrace[j].v2;
            trace.push_back(ptLeft);
        }
        else
        {
            Point2D ptRight(carFrontx + avoidLenth  * cos(anglevalue - M_PI / 2),
                            carFronty + avoidLenth  * sin(anglevalue - M_PI / 2));
            ptRight.speed = gpsTrace[j].speed;
            ptRight.v1 = gpsTrace[j].v1;
            ptRight.v2 = gpsTrace[j].v2;


            trace.push_back(ptRight);
        }
    }
    return trace;
}


double  ivdecision_brain::getAngle(std::vector<Point2D> gpsTrace,GPS_INS gpsIns,iv::decition::Decition decition) {
    double angle=0;
    if ( abs(minDis) < 20 && abs(maxAngle) < 100)
    {
        //   angle = iv::decition::iv::decition::Compute00().getDecideAngle(gpsTrace, realspeed);
        pid_Controller->getControlDecition(gpsIns, gpsTrace,  -1,  -1,  -1, true, false, &decition);
        angle= decition->wheel_angle;
    }
    return angle;
}

double  ivdecision_brain::getSpeed(std::vector<Point2D> gpsTrace) {
    double speed=0;
    int speedPoint = iv::decition::Compute00().getSpeedPointIndex(gpsTrace, max(10.0, realspeed));
    speed = gpsTrace[speedPoint].speed;
    for (int i = 0; i < speedPoint; i++) {
        speed = min(speed, gpsTrace[i].speed);
    }
    return speed;
}




//void  ivdecision_brain::getEsrObs(std::vector<iv::ObstacleBasic> obsRadars) {
//
//	if (!obsRadars.empty())
//	{
//		esrIndex = iv::decition::iv::decition::Compute00().getEsrIndex(gpsTrace, obsRadars);
//
//		if (esrIndex != -1)
//		{
//			 esrDistance = obsRadars[esrIndex].nomal_y;
//
//
//
//			obsSpeed = obsRadars[esrIndex].speed_y;
//
//		}
//		else {
//			esrDistance = -1;
//		}
//
//	}
//	else
//	{
//		esrIndex = -1;
//		esrDistance = -1;
//	}
//	if (esrDistance < 0) {
//		ODS("\n------------------>ESR障碍物距离:%f\n", esrDistance);
//	}
//	else {
//		ODS("\n------------------>ESR障碍物距离:%f   ( %.05f , %.05f )\n", esrDistance, obsRadars[esrIndex].nomal_x, obsRadars[esrIndex].nomal_y);
//	}
//
//	ODS("\n------------------>ESR障碍物速度:%f\n", obsSpeed);
//}



void  ivdecision_brain::getEsrObsDistance(std::vector<Point2D> gpsTrace, int roadNum) {


    int esrPathpoint;

    esrIndex = iv::decition::Compute00().getEsrIndex(gpsTrace, roadNum, &esrPathpoint,xiuzhengCs);

    if (esrIndex != -1)
    {
        //优化
        //        double distance = 0.0;
        //        for(int i=0; i<esrPathpoint; ++i){
        //            distance+=DirectDistance(gpsTrace[i].x,gpsTrace[i].y,gpsTrace[i+1].x,gpsTrace[i+1].y);
        //        }
        //        esrDistance = distance - Esr_Y_Offset;
        //        if(esrDistance<=0){
        //            esrDistance=1;
        //        }


        esrDistance = ServiceCarStatus.obs_radar[esrIndex].nomal_y;
        obsSpeed = ServiceCarStatus.obs_radar[esrIndex].speed_y;

    }
    else {
        esrDistance = -1;
    }
}




void  ivdecision_brain::getEsrObsDistanceAvoid() {

    esrIndexAvoid = iv::decition::Compute00().getEsrIndexAvoid(gpsTraceAvoid);

    if (esrIndexAvoid != -1)
    {
        esrDistanceAvoid = ServiceCarStatus.obs_radar[esrIndexAvoid].nomal_y;
        obsSpeedAvoid = ServiceCarStatus.obs_radar[esrIndexAvoid].speed_y;

    }
    else {
        esrDistanceAvoid = -1;
    }

    if (esrDistanceAvoid < 0) {
        std::cout << "\nESR障碍物距离Avoid:%f\n" << esrDistanceAvoid << std::endl;
    }
    else {
        std::cout << "\nESR障碍物距离Avoid:%f   %d:( %.05f , %.05f ,%.05f )\n" << esrDistanceAvoid << esrIndexAvoid << ServiceCarStatus.obs_radar[esrIndexAvoid].nomal_x << ServiceCarStatus.obs_radar[esrIndexAvoid].nomal_y << std::endl;
    }

    std::cout << "\nESR障碍物速度Avoid:%f\n" << obsSpeedAvoid <<std::endl;
}




double  ivdecision_brain::limitAngle(double speed, double angle) {
    double preAngle = angle;

    if (speed > 15)
    {
        if (preAngle > 350)
        {
            preAngle = 350;
        }
        if (preAngle < -350)
        {
            preAngle = -350;
        }
    }
    if (speed > 22)
    {
        if (preAngle > 200)
        {
            preAngle = 200;
        }
        if (preAngle < -200)
        {
            preAngle = -200;
        }
    }
    if (speed > 25)
    {
        if (preAngle > 150)
        {
            preAngle = 150;
        }
        if (preAngle < -150)
        {
            preAngle = -150;
        }
    }
    if (speed > 30)
    {
        if (preAngle > 70)
        {
            preAngle = 70;
        }
        if (preAngle < -70)
        {
            preAngle = -70;
        }
    }
    if (speed > 45)                     //20
    {
        if (preAngle > 15)
        {
            preAngle = 15;
        }
        if (preAngle < -15)
        {
            preAngle = -15;
        }
    }
    return preAngle;
}



double  ivdecision_brain::limitSpeed(double angle, double speed) {

    if (abs(angle) > 500 && speed > 8) speed = 8;
    else if (abs(angle) > 350 && speed > 14) speed = 14;
    else if (abs(angle) > 200 && speed > 21) speed = 21;
    else if (abs(angle) > 150 && speed > 24) speed = 24;
    else if (abs(angle) > 60 && speed > 29) speed = 29;
    else if (abs(angle) > 20 && speed > 34) speed = 34;
    return max(0.0, speed);
}


bool  ivdecision_brain::checkAvoidEnable(double avoidX, iv::LidarGridPtr lidarGridPtr,int roadNum) {

    if ((obsDisVector[roadNum]>0 && obsDisVector[roadNum]<obsDisVector[roadNow]+ServiceCarStatus.msysparam.vehLenth)||
            (obsDisVector[roadNum]>0 && obsDisVector[roadNum]<15))
    {
        return false;
    }

    if (roadNum-roadNow>1)
    {
        for (int i = roadNow+1; i < roadNum; i++)
        {
            if (obsDisVector[i] < 8 + (i-roadNow) * 2 && obsDisVector[i]>0) {
                return false;
            }
        }

    }

    else if (roadNow-roadNum>1)
    {
        for (int i = roadNow-1; i >roadNum; i--)
        {
            if (obsDisVector[i] < 8 + (roadNow-i) * 2 && obsDisVector[i]>0) {
                return false;
            }
        }
    }
    return true;
}



bool  ivdecision_brain::checkReturnEnable(double avoidX, iv::LidarGridPtr lidarGridPtr, int roadNum) {
    //lsn
    if (obsDisVector[roadNum]>0 && obsDisVector[roadNum]<20)
    {
        return false;
    }
    if ((obsDisVector[roadNum]>0 && obsDisVector[roadNum]<50 && obsDisVector[roadNum]< obsDisVector[roadNow]) ||
            (obsDisVector[roadNum]>0 && obsDisVector[roadNum]<50 && obsDisVector[roadNow]<0))
    {
        return false;
    }


    if (roadNum - roadNow>1)
    {
        for (int i = roadNow + 1; i < roadNum; i++)
        {
            if (obsDisVector[i] < 8 + (i-roadNow) * 2 && obsDisVector[i]>0) {
                return false;
            }
        }

    }

    else if (roadNow - roadNum>1)
    {
        for (int i = roadNow - 1; i >roadNum; i--)
        {
            if (obsDisVector[i] < 8 + (roadNow-i) * 2 && obsDisVector[i]>0) {
                return false;
            }
        }
    }
    return true;
}


void  ivdecision_brain::getObsAvoid(iv::LidarGridPtr lidarGridPtr) {



    if (lidarGridPtr == NULL)
    {
        lidarDistanceAvoid = lastLidarDisAvoid;
    }
    else {
        obsPointAvoid = iv::decition::Compute00().getLidarObsPointAvoid(gpsTraceAvoid, lidarGridPtr,lidarDistanceAvoid);
        lastLidarDisAvoid = lidarDistanceAvoid;
    }
    std::cout << "\nLidarAvoid距离:%f\n" << lidarDistanceAvoid << std::endl;
    getEsrObsDistanceAvoid();

    //lidarDistanceAvoid = -1;   //20200103 apollo_fu

    if (esrDistanceAvoid>0 && lidarDistanceAvoid > 0)
    {
        if (lidarDistanceAvoid >= esrDistanceAvoid)
        {
            obsDistanceAvoid = esrDistanceAvoid;
            obsSpeedAvoid = ServiceCarStatus.obs_radar[esrIndexAvoid].speed_y;
        }
        else if (!ServiceCarStatus.obs_radar.empty())
        {
            obsDistanceAvoid = lidarDistanceAvoid;
            obsSpeedAvoid = iv::decition::Compute00().getObsSpeed(obsPointAvoid, secSpeed);
            std::cout << "\n计算obsSpeed:%f\n" << obsSpeedAvoid << std::endl;
        }
        else
        {
            obsDistanceAvoid = lidarDistanceAvoid;
            obsSpeedAvoid = obsSpeedAvoid = 0 - secSpeed;;
            std::cout << "\n毫米波无数据,计算obsSpeed:%f\n" << obsSpeedAvoid << std::endl;
        }
    }
    else if (esrDistanceAvoid>0)
    {
        obsDistanceAvoid = esrDistanceAvoid;
        obsSpeedAvoid = ServiceCarStatus.obs_radar[esrIndexAvoid].speed_y;
    }
    else if (lidarDistanceAvoid > 0)
    {
        obsDistanceAvoid = lidarDistanceAvoid;
        obsSpeedAvoid = iv::decition::Compute00().getObsSpeed(obsPointAvoid, secSpeed);
        std::cout << "\n计算obsSpeed:%f\n" << obsSpeedAvoid << std::endl;
    }
    else {
        obsDistanceAvoid = esrDistanceAvoid;
        obsSpeedAvoid = 0 - secSpeed;
    }

    std::cout << "\n最终得出的obsDistanceAvoid:%f\n" << obsDistanceAvoid << std::endl;





    if (obsDistanceAvoid <0 && obsLostTimeAvoid<4)
    {
        obsDistanceAvoid = lastDistanceAvoid;
        obsLostTimeAvoid++;
    }
    else
    {
        obsLostTimeAvoid = 0;
        lastDistanceAvoid = -1;
    }




    if (obsDistanceAvoid>0)
    {
        lastDistanceAvoid = obsDistanceAvoid;
    }

    std::cout << "\nODSAvoid距离:%f\n" << obsDistanceAvoid << std::endl;
}

void  ivdecision_brain::init() {
    for (int i = 0; i < roadSum; i++)
    {
        lastEsrIdVector.push_back(-1);
        lastEsrCountVector.push_back(0);
        GPS_INS gps_ins;
        gps_ins.gps_x = 0;
        gps_ins.gps_y = 0;
        startAvoidGpsInsVector.push_back(gps_ins);
        avoidMinDistanceVector.push_back(0);
    }
}



#include <QTime>

void  ivdecision_brain::computeObsOnRoad(iv::LidarGridPtr lidarGridPtr, std::vector<Point2D> gpsTrace, int roadNum,
                                                 const std::vector<GPSData> gpsMapLine, std::vector<iv::Perception::PerceptionOutput> lidar_per) {

    //    QTime xTime;
    //   xTime.start();
    //    qDebug("time 0 is %d ",xTime.elapsed());
    double obs,obsSd;
    if (lidarGridPtr == NULL)
    {
        lidarDistance = lastLidarDis;
        //	lidarDistance = lastlidarDistance;

    }
    else {
        obsPoint = iv::decition::Compute00().getLidarObsPoint(gpsTrace, lidarGridPtr);
        float lidarXiuZheng=0;
        if(!ServiceCarStatus.useMobileEye){
            lidarXiuZheng=0-ServiceCarStatus.msysparam.frontGpsXiuzheng;
        }
        lidarDistance = obsPoint.y + lidarXiuZheng;   //激光距离推到车头  gjw20191110 lidar
        //    lidarDistance=-1;
        if (lidarDistance<0)
        {
            lidarDistance = -1;
        }
        lastLidarDis = lidarDistance;
    }


    // obsPredict start
    if(ServiceCarStatus.useObsPredict){
        float preObsDis=200;
        if(!lidar_per.empty()){
            preObsDis=PredictObsDistance(  secSpeed,  gpsTrace, lidar_per);
            lastPreObsDistance=preObsDis;
        }else{
            preObsDis=lastPreObsDistance;
        }
        if(preObsDis<lidarDistance || lidarDistance==-1){
            lidarDistance=preObsDis;
        }
    }
    // obsPredict end

    //    qDebug("time 1 is %d ",xTime.elapsed());
    //    if(gpsMapLine[PathPoint]->roadMode==14||gpsMapLine[PathPoint]->roadMode==15){
    //        lidarDistance=-1;
    //    }

    getEsrObsDistance(gpsTrace, roadNum);

    double mobieye_ttc,mobieye_obsid,mobieye_speed,mobieye_distance;

    double fveh_width = 2.0;
#ifdef USE_MOBIEYE_OBS
    MobieyeInst.GetObsFromMobieye(&gpsTrace,mobieye_distance,mobieye_speed,mobieye_ttc,mobieye_obsid,fveh_width);
#endif
    //   qDebug("time 2 is %d ",xTime.elapsed());
    //  esrDistance=-1;

    //    if(PathPoint>2992 && PathPoint<4134){
    //        lidarDistance=-1;
    //    }


    //    if(PathPoint>10193 && PathPoint<10929){
    //        esrDistance=-1;
    //    }


    if(lidarDistance<0){
        lidarDistance=500;
    }

#ifdef USE_MOBIEYE_OBS
    esrDistance = mobieye_distance;

    if(esrDistance>150){
        esrDistance=500;
    }
#else
    if(esrDistance>30){
        esrDistance=500;
    }
#endif



    if(esrDistance<0){
        esrDistance=500;
    }


    std::cout <<ServiceCarStatus.mRunTime.elapsed()<<"ms:"<< "激光雷达距离:" << lidarDistance << std::endl;


    //        if(esrDistance>30){
    //            esrDistance=-1;
    //        }



    //            if(esrDistance>=15 && esrDistance<=50&& ServiceCarStatus.mLidarS>0&&ServiceCarStatus.mLidarPer>0 ){
    //                if(abs(lidarDistance-esrDistance)>5){

    //                    esrDistance=-1;
    //                }

    //            }



    //            if(esrDistance>=1&& esrDistance<=50&& ServiceCarStatus.mLidarS>0&&ServiceCarStatus.mLidarPer>0
    //                && gpsMapLine[PathPoint]->runMode == 1    ){
    //                if(abs(lidarDistance-esrDistance)>5){

    //                    esrDistance=-1;
    //                }

    //            }



    std::cout <<ServiceCarStatus.mRunTime.elapsed()<<"ms:"<< "毫米波距离:" << esrDistance << std::endl;
    myesrDistance = esrDistance;



    if(lidarDistance==500){
        lidarDistance=-1;
    }
    if(esrDistance==500){
        esrDistance=-1;
    }


    ServiceCarStatus.mRadarObs = esrDistance;
    ServiceCarStatus.mLidarObs = lidarDistance;


    //zhuanwan pingbi haomibo
    if(gpsTraceNow[0].v1==4||gpsTraceNow[0].v1==5){
        esrDistance=-1;
    }

    if (esrDistance>0 && lidarDistance > 0)
    {
        if (lidarDistance >= esrDistance)
        {
#ifdef USE_MOBIEYE_OBS
            obs = esrDistance;
            obsSd = mobieye_speed;
#else
            //	obsDistance = esrDistance;
            obs = esrDistance;
            //	obsSpeed = ServiceCarStatus.obs_radar[esrIndex].speed_y;
            obsSd=ServiceCarStatus.obs_radar[esrIndex].speed_y;
#endif
        }
        else if (!ServiceCarStatus.obs_radar.empty())
        {
            //	obsDistance = lidarDistance;
            obs = lidarDistance;
            //	obsSpeed = iv::decition::Compute00().getObsSpeed(obsPoint, secSpeed);
            obsSd = iv::decition::Compute00().getObsSpeed(obsPoint, secSpeed);
            std::cout <<ServiceCarStatus.mRunTime.elapsed()<<"ms:"<< "计算obsSpeed:" << obsSpeed << std::endl;
        }
        else
        {
            //	obsDistance = lidarDistance;
            obs=lidarDistance;
            //	obsSpeed = 0 - secSpeed;
            obsSd = 0 -secSpeed;
            std::cout <<ServiceCarStatus.mRunTime.elapsed()<<"ms:"<< "毫米波无数据,计算obsSpeed:" << obsSpeed << std::endl;
        }
    }
    else if (esrDistance>0)
    {
        //		obsDistance = esrDistance;
        //		obsSpeed = ServiceCarStatus.obs_radar[esrIndex].speed_y;

#ifdef USE_MOBIEYE_OBS
        obs = esrDistance;
        obsSd = mobieye_speed;
#else
        obs = esrDistance;
        obsSd = ServiceCarStatus.obs_radar[esrIndex].speed_y;
#endif
    }
    else if (lidarDistance > 0)
    {
        //		obsDistance = lidarDistance;
        //		obsSpeed = iv::decition::Compute00().getObsSpeed(obsPoint, secSpeed);
        obs = lidarDistance;
        obsSd = iv::decition::Compute00().getObsSpeed(obsPoint, secSpeed);
        std::cout <<ServiceCarStatus.mRunTime.elapsed()<<"ms:"<< "计算obsSpeed:" << obsSpeed << std::endl;
    }
    else {
        //		obsDistance = esrDistance;
        //		obsSpeed = 0 - secSpeed;
        obs = esrDistance;
        obsSd = 0 - secSpeed;
    }

    if(roadNum==roadNow){
        obsDistance=obs;
        obsSpeed=obsSd;
    }


    //    if (obsDistance <0 && obsLostTime<4)
    //    {
    //        obsDistance = lastDistance;
    //        obsLostTime++;
    //    }
    //    else
    //    {
    //        obsLostTime = 0;
    //        lastDistance = -1;
    //    }


    std::cout <<ServiceCarStatus.mRunTime.elapsed()<<"ms:"<< "最终得出的obsDistance:" << obsDistance << std::endl;

    ServiceCarStatus.mObs = obsDistance;
    if(ServiceCarStatus.mObs>100){
        ServiceCarStatus.mObs =-1;
    }

    if (obsDistance>0)
    {
        lastDistance = obsDistance;
    }

    //lsn
    if(obs<0){
        obsDisVector[roadNum]=500;
    }else{
        obsDisVector[roadNum]=obs;
    }

    givlog->debug("obs_distance","obs: %f, lidar_obs: %f, Radar_obs: %f, lidar_obs_x: %f, lidar_obs_y: %f",
                  ServiceCarStatus.mObs, ServiceCarStatus.mLidarObs,
                  ServiceCarStatus.mRadarObs,obsPoint.x,lidarDistance);

    //   qDebug("time 3 is %d ",xTime.elapsed());

}




//1220
void  ivdecision_brain::computeRearObsOnRoad(iv::LidarGridPtr lidarGridPtr, std::vector<Point2D> gpsTrace, int roadNum,
                                                     const std::vector<GPSData> gpsMapLine) {

    double obs,obsSd;

    if(!ServiceCarStatus.obs_rear_radar.empty()){
        getRearEsrObsDistance(gpsTrace, roadNum);
    }
    if (lidarGridPtr == NULL)
    {
        lidarDistance = lastLidarDis;
        //	lidarDistance = lastlidarDistance;

    }
    else {
        obsPoint = iv::decition::Compute00().getLidarRearObsPoint(gpsTrace, lidarGridPtr);
        float lidarXiuZheng=0;
        if(!ServiceCarStatus.useMobileEye){
            lidarXiuZheng = ServiceCarStatus.msysparam.rearGpsXiuzheng;
        }
        if(abs(obsPoint.y)>lidarXiuZheng)
            lidarDistance = abs(obsPoint.y)-lidarXiuZheng;   //激光距离推到车头 1220

        //    lidarDistance=-1;
        if (lidarDistance<0)
        {
            lidarDistance = -1;
        }
        lastLidarDis = lidarDistance;
    }

    //    if(gpsMapLine[PathPoint]->roadMode==14||gpsMapLine[PathPoint]->roadMode==15){
    //        lidarDistance=-1;
    //    }

    //  getEsrObsDistance(gpsTrace, roadNum);
    esrDistance=-1;


    //    if(PathPoint>2992 && PathPoint<4134){
    //        lidarDistance=-1;
    //    }


    //    if(PathPoint>10193 && PathPoint<10929){
    //        esrDistance=-1;
    //    }


    if(lidarDistance<0){
        lidarDistance=500;
    }
    if(esrDistance<0){
        esrDistance=500;
    }


    std::cout <<ServiceCarStatus.mRunTime.elapsed()<<"ms:"<< "激光雷达距离:" << lidarDistance << std::endl;


    //        if(esrDistance>30){
    //            esrDistance=-1;
    //        }



    //            if(esrDistance>=15 && esrDistance<=50&& ServiceCarStatus.mLidarS>0&&ServiceCarStatus.mLidarPer>0 ){
    //                if(abs(lidarDistance-esrDistance)>5){

    //                    esrDistance=-1;
    //                }

    //            }



    //            if(esrDistance>=1&& esrDistance<=50&& ServiceCarStatus.mLidarS>0&&ServiceCarStatus.mLidarPer>0
    //                && gpsMapLine[PathPoint]->runMode == 1    ){
    //                if(abs(lidarDistance-esrDistance)>5){

    //                    esrDistance=-1;
    //                }

    //            }



    std::cout <<ServiceCarStatus.mRunTime.elapsed()<<"ms:"<< "毫米波距离:" << esrDistance << std::endl;
    myesrDistance = esrDistance;



    if(lidarDistance==500){
        lidarDistance=-1;
    }
    if(esrDistance==500){
        esrDistance=-1;
    }


    ServiceCarStatus.mRadarObs = esrDistance;
    ServiceCarStatus.mLidarObs = lidarDistance;


    //zhuanwan pingbi haomibo
    if(gpsTraceNow[0].v1==4||gpsTraceNow[0].v1==5){
        esrDistance=-1;
    }

    if (esrDistance>0 && lidarDistance > 0)
    {
        if (lidarDistance >= esrDistance)
        {
            //	obsDistance = esrDistance;
            obs = esrDistance;
            //	obsSpeed = ServiceCarStatus.obs_radar[esrIndex].speed_y;
            obsSd=ServiceCarStatus.obs_radar[esrIndex].speed_y;
        }
        else if (!ServiceCarStatus.obs_radar.empty())
        {
            //	obsDistance = lidarDistance;
            obs = lidarDistance;
            //	obsSpeed = iv::decition::Compute00().getObsSpeed(obsPoint, secSpeed);
            obsSd = iv::decition::Compute00().getObsSpeed(obsPoint, secSpeed);
            std::cout <<ServiceCarStatus.mRunTime.elapsed()<<"ms:"<< "计算obsSpeed:" << obsSpeed << std::endl;
        }
        else
        {
            //	obsDistance = lidarDistance;
            obs=lidarDistance;
            //	obsSpeed = 0 - secSpeed;
            obsSd = 0 -secSpeed;
            std::cout <<ServiceCarStatus.mRunTime.elapsed()<<"ms:"<< "毫米波无数据,计算obsSpeed:" << obsSpeed << std::endl;
        }
    }
    else if (esrDistance>0)
    {
        //		obsDistance = esrDistance;
        //		obsSpeed = ServiceCarStatus.obs_radar[esrIndex].speed_y;
        obs = esrDistance;
        obsSd = ServiceCarStatus.obs_radar[esrIndex].speed_y;
    }
    else if (lidarDistance > 0)
    {
        //		obsDistance = lidarDistance;
        //		obsSpeed = iv::decition::Compute00().getObsSpeed(obsPoint, secSpeed);
        obs = lidarDistance;
        obsSd = iv::decition::Compute00().getObsSpeed(obsPoint, secSpeed);
        std::cout <<ServiceCarStatus.mRunTime.elapsed()<<"ms:"<< "计算obsSpeed:" << obsSpeed << std::endl;
    }
    else {
        //		obsDistance = esrDistance;
        //		obsSpeed = 0 - secSpeed;
        obs = esrDistance;
        obsSd = 0 - secSpeed;
    }

    if(roadNum==roadNow){
        obsDistance=obs;
        obsSpeed=obsSd;
    }


    if (obsDistance <0 && obsLostTime<4)
    {
        obsDistance = lastDistance;
        obsLostTime++;
    }
    else
    {
        obsLostTime = 0;
        lastDistance = -1;
    }


    std::cout <<ServiceCarStatus.mRunTime.elapsed()<<"ms:"<< "最终得出的obsDistance:" << obsDistance << std::endl;

    ServiceCarStatus.mObs = obsDistance;
    if(ServiceCarStatus.mObs>100){
        ServiceCarStatus.mObs =-1;
    }

    if (obsDistance>0)
    {
        lastDistance = obsDistance;
    }

    //lsn
    if(obs<0){
        obsDisVector[roadNum]=500;
    }else{
        obsDisVector[roadNum]=obs;
    }

}



void  ivdecision_brain::predictObsOnRoad(std::vector<iv::Perception::PerceptionOutput> lidar_per,std::vector<Point2D> gpsTrace,double realSpeed){
    double preObsDis;

    if(!lidar_per.empty()){
        preObsDis=PredictObsDistance(  realSpeed,  gpsTrace, lidar_per);
        lastPreObsDistance=preObsDis;

    }else{
        preObsDis=lastPreObsDistance;
    }
    if(preObsDis<obsDistance){
        obsDistance=preObsDis;
        lastDistance=obsDistance;
    }
}

int  ivdecision_brain::chooseAvoidRoad(iv::LidarGridPtr lidarGridPtr, GPS_INS now_gps_ins, const std::vector<GPSData> gpsMapLine,std::vector<iv::Perception::PerceptionOutput> lidar_per) {
    roadPre = -1;

    //    if (roadNow<roadOri)
    //    {
    //        for (int i = 0; i < roadNow; i++)
    //        {
    //            gpsTraceAvoid.clear();
    //            //	gpsTraceAvoid = getGpsTrace(now_gps_ins, gmapsR[int(abs(roadWidth * 2)*(roadOri-i))], lastGpsIndex);
    //            avoidX = (roadWidth)*(roadOri - i);
    //            gpsTraceAvoid = getGpsTraceOffset(gpsTraceOri, avoidX);
    //            //	computeObsOnRoad(lidarGridPtr, gpsTraceAvoid, roadNow + i);
    //            computeObsOnRoad(lidarGridPtr, gpsTraceAvoid, i,gpsMapLine,lidar_per);
    //        }


    //        for (int i = roadOri+1; i < roadSum; i++)
    //        {
    //            gpsTraceAvoid.clear();
    //            //	gpsTraceAvoid = getGpsTrace(now_gps_ins, gmapsL[int(abs(roadWidth * 2)*(i - roadOri))], lastGpsIndex);
    //            avoidX = (roadWidth)*(roadOri - i);
    //            gpsTraceAvoid = getGpsTraceOffset(gpsTraceOri, avoidX);
    //            //	bsOnRoad(lidarGridPtr, gpsTraceAvoid, roadNow + i);
    //            computeObsOnRoad(lidarGridPtr, gpsTraceAvoid, i,gpsMapLine,lidar_per);
    //        }
    //    }
    //    else if (roadNow>roadOri)
    //    {
    //        for (int i = 0; i < roadOri; i++)
    //        {
    //            gpsTraceAvoid.clear();
    //            //	gpsTraceAvoid = getGpsTrace(now_gps_ins, gmapsR[int(abs(roadWidth * 2)*(roadOri - i))], lastGpsIndex);
    //            avoidX = (roadWidth)*(roadOri - i);
    //            gpsTraceAvoid = getGpsTraceOffset(gpsTraceOri, avoidX);
    //            //	computeObsOnRoad(lidarGridPtr, gpsTraceAvoid, roadNow + i);
    //           computeObsOnRoad(lidarGridPtr, gpsTraceAvoid, i,gpsMapLine,lidar_per);
    //        }
    //        for (int i = roadNow + 1; i < roadSum; i++)
    //        {
    //            gpsTraceAvoid.clear();
    //            //		gpsTraceAvoid = getGpsTrace(now_gps_ins, gmapsL[int(abs(roadWidth * 2)*(i - roadOri))], lastGpsIndex);
    //            avoidX = (roadWidth)*(roadOri - i);
    //            gpsTraceAvoid = getGpsTraceOffset(gpsTraceOri, avoidX);
    //            //	computeObsOnRoad(lidarGridPtr, gpsTraceAvoid, roadNow + i);
    //           computeObsOnRoad(lidarGridPtr, gpsTraceAvoid, i,gpsMapLine,lidar_per);
    //        }

    //    }

    //    else
    //    {
    //        for (int i = 0; i < roadOri; i++)
    //        {
    //            gpsTraceAvoid.clear();
    //            //	gpsTraceAvoid = getGpsTrace(now_gps_ins, gmapsR[int(abs(roadWidth * 2)*(roadOri - i))], lastGpsIndex);
    //            avoidX = (roadWidth)*(roadOri - i);
    //            gpsTraceAvoid = getGpsTraceOffset(gpsTraceOri, avoidX);
    //            //	computeObsOnRoad(lidarGridPtr, gpsTraceAvoid, roadNow + i);
    //           computeObsOnRoad(lidarGridPtr, gpsTraceNow, roadNow,gpsMapLine,lidar_per);
    //        }
    //        for (int i = roadOri + 1; i < roadSum; i++)
    //        {
    //            gpsTraceAvoid.clear();
    //            //		gpsTraceAvoid = getGpsTrace(now_gps_ins, gmapsL[int(abs(roadWidth * 2)*(i - roadOri))], lastGpsIndex);
    //            avoidX = (roadWidth)*(roadOri - i);
    //            gpsTraceAvoid = getGpsTraceOffset(gpsTraceOri, avoidX);
    //            //	computeObsOnRoad(lidarGridPtr, gpsTraceAvoid, roadNow + i);
    //           computeObsOnRoad(lidarGridPtr, gpsTraceNow, roadNow,gpsMapLine,lidar_per);
    //        }

    //    }

    for (int i =  0; i < roadSum; i++)
    {
        gpsTraceAvoid.clear();
        //		gpsTraceAvoid = getGpsTrace(now_gps_ins, gmapsL[int(abs(roadWidth * 2)*(i - roadOri))], lastGpsIndex);
     //   avoidX = (roadWidth)*(roadOri - i);
         avoidX=computeAvoidX(i,roadOri,gpsMapLine[PathPoint],ServiceCarStatus.msysparam.vehWidth);
        gpsTraceAvoid = getGpsTraceOffset(gpsTraceOri, avoidX);
        //	computeObsOnRoad(lidarGridPtr, gpsTraceAvoid, roadNow + i);
        computeObsOnRoad(lidarGridPtr, gpsTraceAvoid, i,gpsMapLine,lidar_per);
    }


    if (lidarGridPtr!=NULL)
    {
        hasCheckedAvoidLidar = true;
    }

    for(int i=0; i<roadSum;i++){
        std::cout<<"\odsjuli====================:\n"<<i<<"chedaojuli:"<<obsDisVector[i]<<endl;

    }

    checkAvoidObsTimes++;
    if (checkAvoidObsTimes<4 || hasCheckedAvoidLidar==false)
    {
        return - 1;
    }


    for (int i = 1; i < roadSum; i++)
    {
        if (roadNow + i < roadSum) {
        //    avoidX = (roadOri-roadNow-i)*roadWidth;
             avoidX=computeAvoidX(roadNow+i,roadOri,gpsMapLine[PathPoint],ServiceCarStatus.msysparam.vehWidth);
            if (checkAvoidEnable(avoidX, lidarGridPtr, roadNow+i))
            {
                /*if (roadNow==roadOri)
                {
                    avoidRunDistance = obsDisVector[roadNow] + ServiceCarStatus.msysparam.vehLenth;
                    startAvoid_gps_ins = now_gps_ins;
                }	*/
                avoidMinDistanceVector[roadNow]= obsDisVector[roadNow] + ServiceCarStatus.msysparam.vehLenth;
                startAvoidGpsInsVector[roadNow] = now_gps_ins;
                roadPre = roadNow + i;
                return roadPre;
            }
        }

        if (roadNow - i >= 0)
        {
         //   avoidX = (roadOri - roadNow+i)*roadWidth;
             avoidX=computeAvoidX(roadNow-i,roadOri,gpsMapLine[PathPoint],ServiceCarStatus.msysparam.vehWidth);
            if (checkAvoidEnable(avoidX, lidarGridPtr, roadNow - i))
            {
                /*if (roadNow == roadOri)
                {
                    avoidRunDistance = obsDisVector[roadNow] + ServiceCarStatus.msysparam.vehLenth;
                    startAvoid_gps_ins = now_gps_ins;
                }*/
                avoidMinDistanceVector[roadNow] = obsDisVector[roadNow] + ServiceCarStatus.msysparam.vehLenth;
                startAvoidGpsInsVector[roadNow] = now_gps_ins;
                roadPre = roadNow - i;
                return roadPre;
            }
        }

    }
    return roadPre;
}

int  ivdecision_brain::chooseBackRoad(iv::LidarGridPtr lidarGridPtr, GPS_INS now_gps_ins, std::vector<GPSData> gpsMapLine,std::vector<iv::Perception::PerceptionOutput> lidar_per) {
    roadPre = -1;

    //   computeObsOnRoad(lidarGridPtr, gpsTraceNow, roadNow,gpsMapLine,lidar_per);



    //    if (roadNow>=roadOri+1)
    //    {
    //        for (int i = roadOri+1; i < roadNow; i++)
    //        {
    //            gpsTraceBack.clear();
    //            //	gpsTraceBack = getGpsTrace(now_gps_ins, gmapsL[int(abs(roadWidth * 2)*(i-roadOri))], lastGpsIndex);
    //            avoidX = (roadWidth)*(roadOri - i);
    //            gpsTraceBack = getGpsTraceOffset(gpsTraceOri, avoidX);
    //            computeObsOnRoad(lidarGridPtr, gpsTraceNow, roadNow,gpsMapLine,lidar_per);
    //        }
    //    }
    //    else if (roadNow <= roadOri - 1) {

    //        for (int i = roadOri - 1; i > roadNow; i--)
    //        {
    //            gpsTraceBack.clear();
    //            //	gpsTraceBack = getGpsTrace(now_gps_ins, gmapsR[int(abs(roadWidth * 2)*(roadOri-i))], lastGpsIndex);
    //            avoidX = (roadWidth)*(roadOri - i);
    //            gpsTraceBack = getGpsTraceOffset(gpsTraceOri, avoidX);
    //            computeObsOnRoad(lidarGridPtr, gpsTraceNow, roadNow,gpsMapLine,lidar_per);
    //        }

    //    }



    for (int i =  0; i <roadSum; i++)
    {
        gpsTraceBack.clear();
        //	gpsTraceBack = getGpsTrace(now_gps_ins, gmapsR[int(abs(roadWidth * 2)*(roadOri-i))], lastGpsIndex);
     //   avoidX = (roadWidth)*(roadOri - i);
         avoidX=computeAvoidX(i,roadOri,gpsMapLine[PathPoint],ServiceCarStatus.msysparam.vehWidth);
        gpsTraceBack = getGpsTraceOffset(gpsTraceOri, avoidX);
        computeObsOnRoad(lidarGridPtr, gpsTraceBack, i,gpsMapLine,lidar_per);
    }



    if (lidarGridPtr != NULL)
    {
        hasCheckedBackLidar = true;
    }



    checkBackObsTimes++;
    if (checkBackObsTimes<4 || hasCheckedBackLidar == false)
    {
        return -1;
    }







    //if ((GetDistance(now_gps_ins, startAvoid_gps_ins)>avoidRunDistance)&&
    //(checkReturnEnable(avoidX, lidarGridPtr,roadOri)))
    if ((GetDistance(now_gps_ins, startAvoidGpsInsVector[roadOri])>max(avoidMinDistanceVector[roadOri],30.0)) &&
            (checkReturnEnable(avoidX, lidarGridPtr, roadOri)))
    {
        roadPre = roadOri;
        return roadPre;
    }

    if (roadNow-roadOri>1)
    {
        for (int i = roadOri + 1;i < roadNow;i++) {
            if (checkReturnEnable(avoidX, lidarGridPtr, i)&&
                    (GetDistance(now_gps_ins, startAvoidGpsInsVector[i])>  avoidMinDistanceVector[i])&&
                    (GetDistance(now_gps_ins, startAvoidGpsInsVector[i])> 30.0))
            {
                roadPre = i;
                return roadPre;
            }
        }
    }

    else if (roadNow <roadOri-1)
    {
        for (int i = roadOri - 1;i > roadNow;i--) {
            if (checkReturnEnable(avoidX, lidarGridPtr, i)&&
                    (GetDistance(now_gps_ins, startAvoidGpsInsVector[i])>avoidMinDistanceVector[i])&&
                    (GetDistance(now_gps_ins, startAvoidGpsInsVector[i])>  30.0))
            {
                roadPre = i;
                return roadPre;
            }
        }
    }

    return roadPre;
}


double  ivdecision_brain::trumpet() {
    if (trumpetFirstCount)
    {
        trumpetFirstCount = false;
        trumpetLastTime= GetTickCount();
        trumpetTimeSpan = 0.0;
    }
    else
    {
        trumpetStartTime= GetTickCount();
        trumpetTimeSpan += trumpetStartTime - trumpetLastTime;
        trumpetLastTime = trumpetStartTime;
    }

    return trumpetTimeSpan;
}




double  ivdecision_brain::transferP() {
    if (transferFirstCount)
    {
        transferFirstCount = false;
        transferLastTime= GetTickCount();
        transferTimeSpan = 0.0;
    }
    else
    {
        transferStartTime= GetTickCount();
        transferTimeSpan += transferStartTime - transferLastTime;
        transferLastTime = transferStartTime;
    }

    return transferTimeSpan;
}



void   ivdecision_brain::handBrakePark(iv::decition::Decition  decition, long duringTime, GPS_INS now_gps_ins) {

    if (abs(now_gps_ins.speed)>0.1)
    {
        decition->accelerator = 0;
        decition->brake = 20;
        decition->wheel_angle = 0;

    }
    else
    {

        decition->accelerator = 0;
        decition->brake = 20;
        decition->wheel_angle = 0;
        handPark = true;
        handParkTime = duringTime;
    }

}




void  ivdecision_brain::getMapBeside(std::vector<iv::GPSData> navigation_data, iv::GPS_INS now_gps_ins) {
    gmapsL.clear();
    gmapsR.clear();
    for (int i = 0; i < 31; i++)
    {
        std::vector<iv::GPSData> gpsMapLineBeside;
        //	gpsMapLineBeside = iv::decition::ComputeUnit().getBesideGpsMapLine(*ServiceCarStatus.location, navigation_data, -0.5*i);
        gpsMapLineBeside = iv::decition::Compute00().getBesideGpsMapLine(now_gps_ins, navigation_data, -0.5*i);

        gmapsL.push_back(gpsMapLineBeside);
    }


    for (int i = 0; i < 31; i++)
    {
        std::vector<iv::GPSData> gpsMapLineBeside;
        //		gpsMapLineBeside = iv::decition::ComputeUnit().getBesideGpsMapLine(*ServiceCarStatus.location, navigation_data, 0.5*i);
        gpsMapLineBeside = iv::decition::Compute00().getBesideGpsMapLine(now_gps_ins, navigation_data, 0.5*i);

        gmapsR.push_back(gpsMapLineBeside);
    }

}


bool  ivdecision_brain::checkChaoCheBack(iv::LidarGridPtr lidarGridPtr) {

    if (lidarGridPtr == NULL)
    {
        return false;
        //	lidarDistance = lastlidarDistance;

    }
    else {




        obsPoint = iv::decition::Compute00().getLidarObsPoint(gpsTraceOri, lidarGridPtr);
        double lidarDistance = obsPoint.y - 2.5;   //激光距离推到车头
        //     ODS("\n超车雷达距离:%f\n", lidarDistance);
        if (lidarDistance >-20 && lidarDistance<35)
        {
            checkChaoCheBackCounts = 0;
            return false;
        }
        else {
            checkChaoCheBackCounts++;
        }

        if (checkChaoCheBackCounts>2) {
            checkChaoCheBackCounts = 0;
            return true;
        }
    }

    return false;

}

void  ivdecision_brain::updateGroupDate(GPS_INS now_gps_ins,float realspeed,float theta,float s){
    Point2D pt = Coordinate_Transfer( now_gps_ins.gps_x, now_gps_ins.gps_y, group_ori_gps);

    ServiceCarStatus.group_x_local=pt.x;
    //  ServiceCarStatus.group_y_local=pt.y;
    ServiceCarStatus.group_y_local=s;
    if(realspeed<0.36){
        ServiceCarStatus.group_velx_local=0;
        ServiceCarStatus.group_vely_local=0;
    }else{
        ServiceCarStatus.group_velx_local=realspeed*sin(theta)/3.6;
        ServiceCarStatus.group_vely_local=realspeed*cos(theta)/3.6;
    }


    ServiceCarStatus.group_pathpoint=PathPoint;

}



float   ivdecision_brain::ComputeTrafficLightSpeed(int traffic_light_color, int traffic_light_time,  const std::vector<GPSData> gpsMapLine,int traffic_light_pathpoint,
                                                           int pathpoint,float secSpeed,float dSpeed){
    float traffic_speed=200;
    float traffic_dis=0;
    float passTime;
    float passSpeed;
    bool passEnable=false;

    if(abs(secSpeed)<0.1){
        secSpeed=0;
    }



    if(pathpoint <= traffic_light_pathpoint){
        for(int i=pathpoint;i<traffic_light_pathpoint;i++){
            traffic_dis +=GetDistance(*gpsMapLine[i],*gpsMapLine[i+1]);
        }
    }else{
        for(int i=pathpoint;i<gpsMapLine.size()-1;i++){
            traffic_dis +=GetDistance(*gpsMapLine[i],*gpsMapLine[i+1]);
        }
        for(int i=0;i<traffic_light_pathpoint;i++){
            traffic_dis+=GetDistance(*gpsMapLine[i],*gpsMapLine[i+1]);
        }
    }

    //    if(traffic_light_color != 0)
    //    {
    //        int a = 3;
    //    }


    if(traffic_light_color==0 && traffic_dis<10){
        traffic_speed=0;
    }
    //    else   //20200108
    //    {
    //        traffic_speed=10;
    //    }
    return  traffic_speed;

    passSpeed = min((float)(dSpeed/3.6),secSpeed);
    passTime = traffic_dis/(dSpeed/3.6);





    switch(traffic_light_color){
    case 0:
        if(passTime>traffic_light_time+1 && traffic_dis>10){
            passEnable=true;
        }else{
            passEnable=false;
        }
        break;
    case 1:
        if(passTime<traffic_light_time-1 && traffic_dis<10){
            passEnable=true;
        }else{
            passEnable = false;
        }
        break;
    case 2:
        if(passTime<traffic_light_time){
            passEnable= true;
        }else{
            passEnable=false;
        }
        break;


    default:
        break;
    }

    if(!passEnable){
        if(traffic_dis<5){
            traffic_speed=0;
        }else if(traffic_dis<10){
            traffic_speed=5;
        }else if(traffic_dis<20){
            traffic_speed=15;
        }else if(traffic_dis<30){
            traffic_speed=25;
        }else if(traffic_dis<50){
            traffic_speed=30;
        }
    }
    return traffic_speed;

}

void  ivdecision_brain::computeObsOnRoadByFrenet(iv::LidarGridPtr lidarGridPtr, const std::vector<Point2D>& gpsTrace, double & obs, const std::vector<iv::GPSData>& gpsMap,int pathpoint,GPS_INS nowGps)
{
    //    Point2D obsCombinePoint = Point2D(-1,-1);
    iv::decition::FrenetPoint car_now_frenet_point = iv::decition::FrenetPlanner::getFrenetfromXY(0,0,gpsTrace,gpsMap,pathpoint,nowGps);
    double obsSd;
    if (lidarGridPtr == NULL)
    {
        lidarDistance = lastLidarDis;
        //	lidarDistance = lastlidarDistance;
    }
    else {
        obsPoint = iv::decition::Compute00().getLidarObsPoint(gpsTrace, lidarGridPtr);
        //        lidarDistance = obsPoint.y-2.5;   //激光距离推到车头
        iv::decition::FrenetPoint lidarFPointTmp = iv::decition::FrenetPlanner::getFrenetfromXY(this->obsPoint.x,this->obsPoint.y,gpsTrace,gpsMap,pathpoint,nowGps);
        lidarDistance = lidarFPointTmp.s - car_now_frenet_point.s - 2.5;

        //    lidarDistance=-1;
        if (lidarDistance<0)
        {
            lidarDistance = -1;
        }
        lastLidarDis = lidarDistance;
    }

    FrenetPoint esr_obs_frenet_point;
    getEsrObsDistanceByFrenet(gpsTrace, car_now_frenet_point,esr_obs_frenet_point,gpsMap,pathpoint,nowGps);

    if(lidarDistance<0){
        lidarDistance=500;
    }
    if(esrDistance<0){
        esrDistance=500;
    }

    std::cout <<ServiceCarStatus.mRunTime.elapsed()<<"ms:"<< "激光雷达距离:" << lidarDistance << std::endl;

    std::cout <<ServiceCarStatus.mRunTime.elapsed()<<"ms:"<< "毫米波距离:" << esrDistance << std::endl;
    myesrDistance = esrDistance;

    if(lidarDistance==500){
        lidarDistance=-1;
    }
    if(esrDistance==500){
        esrDistance=-1;
    }

    ServiceCarStatus.mRadarObs = esrDistance;
    ServiceCarStatus.mLidarObs = lidarDistance;

    //    //zhuanwan pingbi haomibo
    //    if(gpsTraceNow[0].v1==4||gpsTraceNow[0].v1==5){
    //        esrDistance=-1;
    //    }

    if (esrDistance>0 && lidarDistance > 0)
    {
        if (lidarDistance >= esrDistance)
        {
            obs = esrDistance;
            //            obsSd=ServiceCarStatus.obs_radar[esrIndex].speed_y;
            obsSd = obsSpeed;
            //障碍物信息使用毫米波采集的。其位置坐标加上偏移量,转换成相对于惯导的位置,即转换成车辆坐标系下的位置坐标。
            //            obsCombinePoint = Point2D(ServiceCarStatus.obs_radar[esrIndex].nomal_x+Esr_Offset,ServiceCarStatus.obs_radar[esrIndex].nomal_y+Esr_Y_Offset);
        }
        else if (!ServiceCarStatus.obs_radar.empty())
        {
            obs = lidarDistance;
            //            obsCombinePoint = obsPoint;
            //            obsSd = iv::decition::Compute00().getObsSpeedByFrenet(obsPoint, secSpeed,gpsTrace);
            obsSd = iv::decition::Compute00().getObsSpeedByFrenet(obsPoint, secSpeed,gpsTrace,gpsMap,pathpoint,nowGps);
            std::cout <<ServiceCarStatus.mRunTime.elapsed()<<"ms:"<< "计算obsSpeed:" << obsSpeed << std::endl;
        }
        else
        {
            obs=lidarDistance;
            //            obsCombinePoint = obsPoint;
            obsSd = 0 -secSpeed*cos(car_now_frenet_point.tangent_Ang-M_PI/2);
            std::cout <<ServiceCarStatus.mRunTime.elapsed()<<"ms:"<< "毫米波无数据,计算obsSpeed:" << obsSpeed << std::endl;
        }
    }
    else if (esrDistance>0)
    {
        obs = esrDistance;
        //        obsSd = ServiceCarStatus.obs_radar[esrIndex].speed_y;
        obsSd = obsSpeed;
        //障碍物信息使用毫米波采集的。其位置坐标加上偏移量,转换成相对于惯导的位置,即转换成车辆坐标系下的位置坐标。
        //        obsCombinePoint = Point2D(ServiceCarStatus.obs_radar[esrIndex].nomal_x+Esr_Offset,ServiceCarStatus.obs_radar[esrIndex].nomal_y+Esr_Y_Offset);
    }
    else if (lidarDistance > 0)
    {
        obs = lidarDistance;
        //        obsCombinePoint = obsPoint;
        obsSd = iv::decition::Compute00().getObsSpeedByFrenet(obsPoint, secSpeed,gpsTrace,gpsMap,pathpoint,nowGps);
        std::cout <<ServiceCarStatus.mRunTime.elapsed()<<"ms:"<< "计算obsSpeed:" << obsSpeed << std::endl;
    }
    else {
        obs = esrDistance;
        //        obsCombinePoint = Point2D(ServiceCarStatus.obs_radar[esrIndex].nomal_x+Esr_Offset,ServiceCarStatus.obs_radar[esrIndex].nomal_y+Esr_Y_Offset);
        obsSd = 0 - secSpeed*cos(car_now_frenet_point.tangent_Ang-M_PI/2);
    }

    obsDistance=obs;
    obsSpeed=obsSd;

    std::cout <<ServiceCarStatus.mRunTime.elapsed()<<"ms:"<< "最终得出的obsDistance:" << obsDistance << std::endl;

    ServiceCarStatus.mObs = obsDistance;
    if(ServiceCarStatus.mObs>100){
        ServiceCarStatus.mObs =-1;
    }

    if (obsDistance>0)
    {
        lastDistance = obsDistance;
    }

    if(obs<0){
        obsDistance=500;
    }else{
        obsDistance=obs;
    }
}

void  ivdecision_brain::getRearEsrObsDistance(std::vector<Point2D> gpsTrace, int roadNum) {


    esrIndex = iv::decition::Compute00().getRearEsrIndex(gpsTrace, roadNum,xiuzhengCs);

    if (esrIndex != -1)
    {
        esrDistance = ServiceCarStatus.obs_rear_radar[esrIndex].nomal_y;
        obsSpeed = ServiceCarStatus.obs_rear_radar[esrIndex].speed_y;

    }
    else {
        esrDistance = -1;
    }
}

void  ivdecision_brain::getEsrObsDistanceByFrenet(const std::vector<Point2D>& gpsTrace, const FrenetPoint car_now_frenet_point, FrenetPoint &esrObs_F_Point, const std::vector<iv::GPSData>& gpsMap,int pathpoint,GPS_INS nowGps) {


    esrIndex = iv::decition::Compute00().getEsrIndexByFrenet(gpsTrace,esrObs_F_Point,gpsMap,pathpoint,nowGps,xiuzhengCs);

    if (esrIndex != -1)
    {
        //障碍物的距离,是障碍物和车辆沿道路上的距离,即s。并不直接是它的x坐标或y坐标或两点直线坐标。
        //严格来说应是 esrDistance=障碍物的s - 车辆的s - Esr_Y_Offset,但这是根据车辆位置实时搜索路径,故车辆的s极其小。
        esrDistance = esrObs_F_Point.s - car_now_frenet_point.s - Esr_Y_Offset;  //-Esr_Y_Offset是把距离推到车头,换算frenet坐标时,把它加上了的。故需减去。

        double speedx=ServiceCarStatus.obs_radar[esrIndex].speed_x;  //障碍物相对于车辆x轴的速度
        double speedy=ServiceCarStatus.obs_radar[esrIndex].speed_y;  //障碍物相对于车辆y轴的速度
        double speed_combine = sqrt(speedx*speedx+speedy*speedy);    //将x、y轴两个方向的速度求矢量和
        //障碍物的速度方向与道路方向的夹角。用于将速度分解到s方向和d方向。
        //所谓道路方向是指,道路上离障碍物的最近的点沿道路弧线的切线方向。
        double Etheta = esrObs_F_Point.tangent_Ang - atan2(speedy,speedx);

        obsSpeed = speed_combine*cos(Etheta);  //由speed_combine分解的s轴方向上的速度
    }
    else {
        esrDistance = -1;
    }
}

void  ivdecision_brain::getV2XTrafficPositionVector(const std::vector<GPSData> gpsMapLine){
    v2xTrafficVector.clear();
    for (int var = 0; var < gpsMapLine.size(); var++) {
        if(gpsMapLine[var]->roadMode==6 || gpsMapLine[var]->mode2==1000001){
            v2xTrafficVector.push_back(var);
        }
    }
}

float  ivdecision_brain::ComputeV2XTrafficLightSpeed(iv::TrafficLight trafficLight, const std::vector<GPSData> gpsMapLine,std::vector<int> v2xTrafficVector,
                                                             int pathpoint,float secSpeed,float dSpeed, bool circleMode){
    float trafficSpeed=200;
    int nearTraffixPoint=-1;
    float nearTrafficDis=0;
    int traffic_color=0;
    int traffic_time=0;
    bool passThrough=false;
    float dSecSpeed=dSpeed/3.6;

    if(v2xTrafficVector.empty()){
        return trafficSpeed;
    }
    if(!circleMode){
        if(pathpoint>v2xTrafficVector.back()){
            return trafficSpeed;
        }else {
            for(int i=0; i< v2xTrafficVector.size();i++){
                if (pathpoint<= v2xTrafficVector[i]){
                    nearTraffixPoint=v2xTrafficVector[i];
                    break;
                }
            }
        }
    }else if(circleMode){
        if(pathpoint>v2xTrafficVector.back()){
            nearTraffixPoint=v2xTrafficVector[0];
        }else {
            for(int i=0; i< v2xTrafficVector.size();i++){
                if (pathpoint<= v2xTrafficVector[i]){
                    nearTraffixPoint=v2xTrafficVector[i];
                    break;
                }
            }
        }
    }


    if(nearTraffixPoint!=-1){
        for(int i=pathpoint;i<nearTraffixPoint;i++){
            nearTrafficDis +=GetDistance(*gpsMapLine[i],*gpsMapLine[i+1]);
        }
    }

    if(nearTrafficDis>50){
        return trafficSpeed;
    }


    int roadMode = gpsMapLine[pathpoint]->roadMode;
    if(roadMode==14 || roadMode==16){
        traffic_color=trafficLight.leftColor;
        traffic_time=trafficLight.leftTime;
    }else if(roadMode==15 ||roadMode==17){
        traffic_color=trafficLight.rightColor;
        traffic_time=trafficLight.rightTime;
    }else {
        traffic_color=trafficLight.straightColor;
        traffic_time=trafficLight.straightTime;
    }


    passThrough=computeTrafficPass(nearTrafficDis,traffic_color,traffic_time,secSpeed,dSecSpeed);
    if(passThrough){
        return trafficSpeed;
    }else{
        trafficSpeed=computeTrafficSpeedLimt(nearTrafficDis);
        if(nearTrafficDis<6){
            float decelerate =0-( secSpeed*secSpeed*0.5/nearTrafficDis);
            minDecelerate=min(minDecelerate,decelerate);
        }
        return trafficSpeed;
    }

    return trafficSpeed;
}

bool  ivdecision_brain::computeTrafficPass(float trafficDis,int trafficColor,float trafficTime,float realSecSpeed,float dSecSpeed){
    float passTime=0;
    if (trafficColor==2 || trafficColor==3){
        return false;
    }else if(trafficColor==0){
        return true;
    }else{
        passTime=trafficDis/dSecSpeed;
        if(passTime+1< trafficTime){
            return true;
        }else{
            return false;
        }

    }

}

float  ivdecision_brain::computeTrafficSpeedLimt(float trafficDis){
    float limit=200;
    if(trafficDis<10){
        limit = 0;
    }else if(trafficDis<15){
        limit = 5;
    }else if(trafficDis<20){
        limit=10;
    }else if(trafficDis<30){
        limit=15;
    }
    return limit;
}



bool  ivdecision_brain::adjuseultra(){
    bool front=false,back=false,left=false,right=false;
    for(int i=1;i<=13;i++)
    {
        if((i==2)||(i==3)||(i==4)||(i==5))   //front
        {
            if(ServiceCarStatus.ultraDistance[i]<100)
            {
                front=true;
            }
        }else if((i==1)||(i==12)||(i==6)||(i==7))   //left,right
        {
            if(ServiceCarStatus.ultraDistance[i]<30)
            {
                left=true;
            }
        }else if((i==8)||(i==9)||(i==10)||(i==11))   //back
        {
            if(ServiceCarStatus.ultraDistance[i]<10)
            {
                back=true;
            }
        }
    }

    if(front||left||back)
        return true;
    else
        return false;

}

void  ivdecision_brain::transferGpsMode2( const std::vector<GPSData> gpsMapLine){
    if(  gpsMapLine[PathPoint]->mode2==3000){
        if(obsDistance>5){
            obsDistance=200;
        }
        dSpeed=min(dSpeed,5.0);
    }
}
float  ivdecision_brain::computeAvoidX(int roadAim,int roadOri,GPSData gps,float vehWidth){
    if(roadAim==roadOri){
        return 0;
    }
    float x=0;
    float veh_to_roadSide=(gps->mfRoadWidth- ServiceCarStatus.msysparam.vehWidth)*0.5;
    float roadSide_to_roadSide=ServiceCarStatus.msysparam.vehWidth;
    if(!ServiceCarStatus.inRoadAvoid){
        x= (roadOri-roadAim)*gps->mfRoadWidth;
    }else{
        int num=roadOri-roadAim;
        switch (abs(num%3)) {
        case 0:
            x=(num/3)*gps->mfRoadWidth;
            break;
        case 1:
            if(num>0){
                x=(num/3)*gps->mfRoadWidth +veh_to_roadSide;
            }else{
                x=(num/3)*gps->mfRoadWidth -veh_to_roadSide;
            }
            break;
        case 2:
            if(num>0){
                x=(num/3)*gps->mfRoadWidth +veh_to_roadSide+roadSide_to_roadSide;
            }else{
                x=(num/3)*gps->mfRoadWidth -veh_to_roadSide-roadSide_to_roadSide;
            }

            break;
        default:
            break;
        }
    }

    return x;
}


}