#pragma once #ifndef _IV_DECITION__DECIDE_GPS_00_ #define _IV_DECITION__DECIDE_GPS_00_ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "perception/perceptionoutput.h" #include "ivlog.h" #include namespace iv { namespace decision { //根据传感器传输来的信息作出决策 class DecideGps00 { public: DecideGps00(); ~DecideGps00(); 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; BaseController *pid_Controller; BaseAdapter *ge3_Adapter; BaseAdapter *qingyuan_Adapter; BaseAdapter *vv7_Adapter; BaseAdapter *zhongche_Adapter; BaseAdapter *bus_Adapter; BaseAdapter *hapo_Adapter; 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; FrenetPlanner *frenetPlanner; // 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(); static std::vector getGpsTrace(GPS_INS rp, const std::vector gpsMap, int lastIndex, bool circleMode); static double getAngle(std::vector gpsTrace); double getAngle(std::vector gpsTrace, GPS_INS gpsIns,iv::decision::Decition decision); static double getSpeed(std::vector gpsTrace); static void getEsrObsDistance(std::vector gpsTrace, int roadNum); static void getRearEsrObsDistance(std::vector gpsTrace, int roadNum); static void getEsrObsDistanceAvoid(); void getObsAvoid(iv::LidarGridPtr lidarGridPtr); void phaseSpeedDecition(iv::decision::Decition decision, 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); static void getEsrObsDistanceByFrenet(const std::vector& gpsTrace, iv::decision::FrenetPoint car_now_frenet_point,iv::decision::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::decision::Decition decision, 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: // void changeRoad(int roadNum); }; } } extern bool handPark; extern long handParkTime; extern bool rapidStop; extern int gpsMissCount; extern bool changeRoad; extern double avoidX; extern bool parkBesideRoad; extern double steerSpeed; extern bool transferPieriod; extern bool transferPieriod2; extern double traceDevi; #endif // ! _IV_DECITION__DECIDE_GPS_00_