#ifndef IVDECISION_BRAIN_H #define IVDECISION_BRAIN_H #include "ivdecision.h" #include "decition_type.h" #include "gps_type.h" #include "constants.h" #include #include #include #include #include #include #include #include #include #include #include #include #include "common/perceptionoutput.h" #include "adc_tools/compute_00.h" #include "common/car_status.h" #include "adc_tools/gps_distance.h" #include "adc_tools/transfer.h" namespace iv { class ivdecision_brain : public ivdecision { public: enum VehState { normalRun, park, readyPark, stopObs, avoidObs, preAvoid, avoiding, backOri,preBack, waitAvoid ,shoushaTest,justRun, changingRoad, chaoche, chaocheBack, reverseCar,reversing, reverseCircle, reverseDirect,reverseArr, dRever,dRever0,dRever1,dRever2,dRever3,dRever4} mvehState; public: ivdecision_brain(); public: virtual int getdecision(iv::brain::decition & xdecition,iv::brain::brainstate & xbs); private: // int getdecision_normal(iv::decition::Decition &xdecition,GPS_INS now_gps_ins, // const std::vector gpsMapLine, // iv::LidarGridPtr lidarGridPtr, // std::vector lidar_per, // iv::TrafficLight trafficLight); private: std::vector mgpsMapLine; private: iv::decition::Decition getDecideFromGPS(GPS_INS now_gps_ins,const std::vector gpsMapLine, iv::LidarGridPtr lidarGridPtr, std::vector lidar_per, iv::TrafficLight trafficLight); private: void updatev2x(); void updateultra(); void updateradar(); void updategroupinfo(); void updatechassistocarstatus(); void loadxml(); void adjuseGpsLidarPosition(); private: int mnRunMode = 0; bool mbisFirstRun = true; int mnPathPoint; private: float xiuzhengCs=0; int PathPoint = -1; double minDis = iv::MaxValue; double maxAngle = iv::MinValue; //int lastGpsIndex = iv::MaxValue; int lastGpsIndex = 0; double controlSpeed = 0; double controlBrake = 0; double controlAng = 0; double Iv = 0; double lastU = 0; double lastVt = 0; double lastEv = 0; int gpsLineParkIndex = 0; int gpsMapParkIndex = 0; double lastDistance = MaxValue; double lastPreObsDistance = MaxValue; double obsDistance = -1; double obsSpeed=0; double obsDistanceAvoid = -1; double lastDistanceAvoid = -1; double lidarDistance = -1; double myesrDistance = -1; double lastLidarDis = -1; bool parkMode = false; bool readyParkMode = false; bool zhucheMode = false; bool readyZhucheMode = false; bool hasZhuched = false; double lastLidarDisAvoid = -1; double lidarDistanceAvoid = -1; int finishPointNum = -1; int zhuchePointNum = 0; ///kkcai, 2020-01-03 bool isFirstRun = true; ////////////////////////////////////////////// float minDecelerate=0; //bool startingFlag = true;//起步标志,在起步时需要进行frenet规划。 double offset_real = 0; double realspeed; double dSpeed; double dSecSpeed; double secSpeed; double ac; iv::Point2D obsPoint; iv::Point2D obsPointAvoid; // iv::Point2D obsPoint(-1.0, -1.0); // iv::Point2D obsPointAvoid(-1, -1); int esrIndex = -1; int esrIndexAvoid = -1; double obsSpeedAvoid = 0; double esrDistance = -1; double esrDistanceAvoid = -1; int obsLostTime = 0; int obsLostTimeAvoid = 0; // double avoidTime = 0; double avoidX =0; float roadWidth = 3.5; int roadSum =10; int roadNow = 0; int roadOri =0; int roadPre = -1; int lastRoadOri = 0; int lightTimes = 0; int lastRoadNum=1; int stopCount = 0; int gpsMissCount = 0; bool rapidStop = false; bool hasTrumpeted = false; bool changeRoad=false; //实验手刹 bool handFirst = true; double handTimeSpan = 0; double handStartTime = 0; double handLastTime = 0; bool handPark = false; long handParkTime=10000; //喇叭 bool trumpetFirstCount=true; double trumpetTimeSpan = 0; double trumpetStartTime = 0; double trumpetLastTime = 0; //过渡 bool transferFirstCount=true; double transferTimeSpan = 0; double transferStartTime = 0; double transferLastTime = 0; bool busMode = false; bool parkBesideRoad=false; bool chaocheMode = false; bool specialSignle = false; double offsetX = 0; double steerSpeed=9000; bool transferPieriod; bool transferPieriod2; double traceDevi; bool startingFlag = true; //起步标志,在起步时需要进行frenet规划。 bool useFrenet = false; //标志是否启用frenet算法避障 bool useOldAvoid = true; //标志是否用老方法避障 // enum VehState { normalRun, park, readyPark, stopObs, avoidObs, preAvoid, avoiding, backOri,preBack, // waitAvoid ,shoushaTest,justRun, changingRoad, chaoche, chaocheBack, reverseCar,reversing, reverseCircle, reverseDirect,reverseArr, // dRever,dRever0,dRever1,dRever2,dRever3,dRever4} vehState; std::vector gpsTraceAim; //记录变道后的目标路径,若车辆经frenet规划行驶至该路径上后,就关闭frenet规划 std::vector gpsTraceAvoid,gpsTraceNow,gpsTraceBack,gpsTracePre,gpsTraceOri,gpsTraceRear; std::vector esrDisVector; std::vector lidarDisVector; std::vector obsDisVector; std::vector obsSpeedVector; std::vector obsLostTimeVector; std::vector lastLidarDisVector; std::vector lastDistanceVector; // std::vector esrDisVector(roadSum, -1); // std::vector lidarDisVector(roadSum, -1); // std::vector obsDisVector(roadSum,-1); // std::vector obsSpeedVector(roadSum, 0); // std::vector obsLostTimeVector(roadSum, 0); // std::vector lastLidarDisVector(roadSum, -1); // std::vector lastDistanceVector(roadSum, -1); bool qiedianCount = false; private: // static double minDis; // static double maxAngle; // static int lastGpsIndex; // static double lidarDistance; // static double myesrDistance; // static double lastLidarDis; // static double lastLidarDisAvoid; // static double lastPreObsDistance; // static int gpsLineParkIndex; // static int gpsMapParkIndex; // static double lastDistance; // static float xiuzhengCs; // static double controlAng; // double laneAng; // static double controlSpeed; // static double controlBrake; // static bool parkMode; // static bool readyParkMode; // static bool zhucheMode; // static bool readyZhucheMode; // static bool hasZhuched; // static double Iv; // static double lastEv; // static double lastVt; // static double lastU; // static double obsDistance; // static double obsSpeed; // static double lidarDistanceAvoid; // static double obsDistanceAvoid; // static double lastDistanceAvoid; GPS_INS group_ori_gps; GPS_INS startAvoid_gps_ins; // static int finishPointNum; // static int zhuchePointNum; double avoidRunDistance=0; std::vector startAvoidGpsInsVector; std::vector avoidMinDistanceVector; std::vector v2xTrafficVector; ///kkcai, 2020-01-03 //bool isFirstRun = true; // static bool isFirstRun; ///////////////////////////////////// // static bool startingFlag;//起步标志,在起步时需要进行frenet规划。 // static float minDecelerate; double startTime = 0; double firstTime = 0; bool circleMode=false; int avoidTimes = 0; int backTimes = 0; int checkAvoidObsTimes = 0; int checkBackObsTimes = 0; bool hasCheckedAvoidLidar=false; bool hasCheckedBackLidar=false; bool personWaited = false; bool roadLightWaited = false; double decision_Angle = 0; double lastAngle=0; // iv::Point2D obsPoint; int checkAvoidTimes=0; int checkBackTimes=0; int chaocheCounts=0; // static int PathPoint; float lastGroupOffsetX=0.0; GPS_INS traffic_light_gps; int traffic_light_pathpoint; bool changingDangWei=false; iv::decition::BaseController *pid_Controller; iv::decition::BaseAdapter *ge3_Adapter; iv::decition::BaseAdapter *qingyuan_Adapter; iv::decition::BaseAdapter *vv7_Adapter; iv::decition::BaseAdapter *zhongche_Adapter; iv::decition::BaseAdapter *bus_Adapter; iv::decition::BaseAdapter *hapo_Adapter; iv::decition::BaseAdapter *yuhesen_Adapter; std::shared_ptr mpid_Controller; std::shared_ptr mge3_Adapter; std::shared_ptr mqingyuan_Adapter; std::shared_ptr mvv7_Adapter; std::shared_ptr mzhongche_Adapter; std::shared_ptr mbus_Adapter; std::shared_ptr mhapo_Adapter; std::shared_ptr myuhesen_Adapter; iv::decition::FrenetPlanner *frenetPlanner; VehState vehState; // BasePlanner *laneChangePlanner; std::shared_ptr mfrenetPlanner; // std::shared_ptr mlaneChangePlanner; // Decition getDecideFromGPS(GPS_INS gpsIns, const std::vector navigation_data, iv::LidarGridPtr lidarGridPtr, // std::vector lidar_per,iv::TrafficLight trafficLight); void initMethods(); std::vector getGpsTrace(GPS_INS rp, const std::vector gpsMap, int lastIndex, bool circleMode); double getAngle(std::vector gpsTrace); double getAngle(std::vector gpsTrace, GPS_INS gpsIns,iv::decition::Decition decition); double getSpeed(std::vector gpsTrace); void getEsrObsDistance(std::vector gpsTrace, int roadNum); void getRearEsrObsDistance(std::vector gpsTrace, int roadNum); void getEsrObsDistanceAvoid(); void getObsAvoid(iv::LidarGridPtr lidarGridPtr); void phaseSpeedDecition(iv::decition::Decition decition, double secSpeed, double obsDis, double obsSpeed, GPS_INS gpsIns ); double limitAngle(double speed, double angle); double limitSpeed(double angle, double speed); bool checkAvoidEnable(double avoidX, iv::LidarGridPtr lidarGridPtr, int roadNum); bool checkReturnEnable(double avoidX, iv::LidarGridPtr lidarGridPtr, int roadNum); void computeObsOnRoad(iv::LidarGridPtr lidarGridPtr, std::vector gpsTrace, int roadNum,const std::vector gpsMapLine, std::vector lidar_per); void getEsrObsDistanceByFrenet(const std::vector& gpsTrace, iv::decition::FrenetPoint car_now_frenet_point,iv::decition::FrenetPoint &esrObs_F_Point, const std::vector& gpsMap,int pathpoint,GPS_INS nowGps); void computeRearObsOnRoad(iv::LidarGridPtr lidarGridPtr, std::vector gpsTrace, int roadNum,const std::vector gpsMapLine); void computeObsOnRoadByFrenet(iv::LidarGridPtr lidarGridPtr,const std::vector& gpsTrace, double & obs, const std::vector& gpsMap,int pathpoint,GPS_INS nowGps); void predictObsOnRoad(std::vector lidar_per,std::vector gpsTrace,double realSpeed); int chooseAvoidRoad(iv::LidarGridPtr lidarGridPtr, GPS_INS now_gps_ins,std::vector gpsMapLine,std::vector lidar_per); int chooseBackRoad(iv::LidarGridPtr lidarGridPtr, GPS_INS now_gps_ins, std::vector gpsMapLine,std::vector lidar_per); void getMapBeside(std::vector navigation_data, iv::GPS_INS now_gps_ins); void handBrakePark(iv::decition::Decition decition, long duringTime, GPS_INS now_gps_ins); bool checkChaoCheBack(iv::LidarGridPtr); double trumpet(); double transferP(); bool nearStation; void updateGroupDate(GPS_INS now_gps_ins,float realspeed,float theta,float s); void init(); std::vector getGpsTraceOffset(std::vector gpsTrace, double offset); std::vector getGpsTraceBackExa(iv::GPS_INS now_gps_ins, const std::vector gpsMapLine, int pathpo); float ComputeTrafficLightSpeed(int traffic_light_color, int traffic_light_time, const std::vector gpsMapLine,int traffic_light_pathpoint, int pathpoint,float secSpeed,float dSpeed); void getV2XTrafficPositionVector( const std::vector gpsMapLine); float ComputeV2XTrafficLightSpeed(iv::TrafficLight TrafficLight, const std::vector gpsMapLine,std::vector v2xTrafficVector, int pathpoint,float secSpeed,float dSpeed,bool circleMode); float getTrafficLightSpeed(int traffic_light_color, int traffic_light_time, float dis); bool computeTrafficPass(float trafficDis,int trafficColor,float trafficTime,float realSecSpeed,float dSecSpeed); float computeTrafficSpeedLimt(float trafficDis); float computeAvoidX(int roadAim,int roadOri,GPSData gps,float vehWidth); bool adjuseultra(); iv::Station getNearestStation(iv::GPS_INS now_gps_ins,std::vector station_n,std::vector gpsMap); void transferGpsMode2( const std::vector gpsMapLine); GPS_INS aim_gps_ins; GPS_INS chaoche_start_gps; bool is_arrivaled=false; double chaocheObsDis = 0; double preChaocheDis = 0; double aimObsSpeed = 0; double followSpeed = 30; double chaocheSpeed = 50; int checkChaoCheBackCounts = 0; float lastTorque=0; float splimit=-1; float ObsTimeSpan=-1; double ObsTimeStart=-1; double ObsTimeEnd=-1; float ObsTimeWidth=1500; std::vector planTrace; bool roadNowStart=true; private: iv::decition::Decition decision_reverseCar(iv::GPS_INS now_gps_ins); iv::decition::Decition decision_reversing(iv::GPS_INS now_gps_ins); iv::decition::Decition decision_reverseCircle(iv::GPS_INS now_gps_ins); iv::decition::Decition decision_reverseDirect(iv::GPS_INS now_gps_ins); iv::decition::Decition decision_reverseArr(iv::GPS_INS now_gps_ins); iv::decition::Decition decision_dRever(iv::GPS_INS now_gps_ins); iv::decition::Decition decision_dRever0(iv::GPS_INS now_gps_ins); iv::decition::Decition decision_dRever1(iv::GPS_INS now_gps_ins); iv::decition::Decition decision_dRever2(iv::GPS_INS now_gps_ins); iv::decition::Decition decision_dRever3(iv::GPS_INS now_gps_ins); iv::decition::Decition decision_dRever4(iv::GPS_INS now_gps_ins); void decision_firstRun(GPS_INS now_gps_ins, const std::vector & gpsMapLine); int decision_ParkCalc(GPS_INS now_gps_ins,iv::decition::Decition & gps_decition); void decision_readyZhucheMode(GPS_INS now_gps_ins,const std::vector & gpsMapLine); void decision_readyParkMode(GPS_INS now_gps_ins,const std::vector & gpsMapLine); void decision_speedctrl(iv::decition::Decition & gps_decition,const std::vector & gpsMapLine); }; } #endif // IVDECISION_BRAIN_H