decide_gps_00.cpp 134 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143
  1. #include <decition/decide_gps_00.h>
  2. #include <decition/adc_tools/compute_00.h>
  3. #include <decition/adc_tools/gps_distance.h>
  4. #include <decition/decition_type.h>
  5. #include <decition/adc_tools/transfer.h>
  6. #include <decition/obs_predict.h>
  7. #include <common/constants.h>
  8. #include <common/car_status.h>
  9. #include <math.h>
  10. #include <iostream>
  11. #include <fstream>
  12. #include <control/can.h>
  13. #include <time.h>
  14. #include <decition/adc_controller/base_controller.h>
  15. #include <decition/adc_controller/pid_controller.h>
  16. #include <decition/adc_planner/lane_change_planner.h>
  17. #include <decition/adc_planner/frenet_planner.h>
  18. #include <QTime>
  19. #include <iomanip>
  20. using namespace std;
  21. #include "ivlog.h"
  22. extern iv::Ivlog * givlog;
  23. #define PI (3.1415926535897932384626433832795)
  24. iv::decition::DecideGps00::DecideGps00() {
  25. }
  26. iv::decition::DecideGps00::~DecideGps00() {
  27. }
  28. float iv::decition::DecideGps00::xiuzhengCs=0;
  29. int iv::decition::DecideGps00::PathPoint = -1;
  30. double iv::decition::DecideGps00::minDis = iv::MaxValue;
  31. double iv::decition::DecideGps00::maxAngle = iv::MinValue;
  32. //int iv::decition::DecideGps00::lastGpsIndex = iv::MaxValue;
  33. int iv::decition::DecideGps00::lastGpsIndex = 0;
  34. double iv::decition::DecideGps00::controlSpeed = 0;
  35. double iv::decition::DecideGps00::controlBrake = 0;
  36. double iv::decition::DecideGps00::controlAng = 0;
  37. double iv::decition::DecideGps00::Iv = 0;
  38. double iv::decition::DecideGps00::lastU = 0;
  39. double iv::decition::DecideGps00::lastVt = 0;
  40. double iv::decition::DecideGps00::lastEv = 0;
  41. int iv::decition::DecideGps00::gpsLineParkIndex = 0;
  42. int iv::decition::DecideGps00::gpsMapParkIndex = 0;
  43. double iv::decition::DecideGps00::lastDistance = MaxValue;
  44. double iv::decition::DecideGps00::lastPreObsDistance = MaxValue;
  45. double iv::decition::DecideGps00::obsDistance = -1;
  46. double iv::decition::DecideGps00::obsSpeed=0;
  47. double iv::decition::DecideGps00::obsDistanceAvoid = -1;
  48. double iv::decition::DecideGps00::lastDistanceAvoid = -1;
  49. double iv::decition::DecideGps00::lidarDistance = -1;
  50. double iv::decition::DecideGps00::myesrDistance = -1;
  51. double iv::decition::DecideGps00::lastLidarDis = -1;
  52. bool iv::decition::DecideGps00::parkMode = false;
  53. bool iv::decition::DecideGps00::readyParkMode = false;
  54. bool iv::decition::DecideGps00::zhucheMode = false;
  55. bool iv::decition::DecideGps00::readyZhucheMode = false;
  56. bool iv::decition::DecideGps00::hasZhuched = false;
  57. double iv::decition::DecideGps00::lastLidarDisAvoid = -1;
  58. double iv::decition::DecideGps00::lidarDistanceAvoid = -1;
  59. int iv::decition::DecideGps00::finishPointNum = -1;
  60. int iv::decition::DecideGps00::zhuchePointNum = 0;
  61. ///kkcai, 2020-01-03
  62. bool iv::decition::DecideGps00::isFirstRun = true;
  63. //////////////////////////////////////////////
  64. float iv::decition::DecideGps00::minDecelerate=0;
  65. //bool iv::decition::DecideGps00::startingFlag = true;//起步标志,在起步时需要进行frenet规划。
  66. double offset_real = 0;
  67. double realspeed;
  68. double dSpeed;
  69. double dSecSpeed;
  70. double secSpeed;
  71. double ac;
  72. iv::Point2D obsPoint(-1, -1);
  73. iv::Point2D obsPointAvoid(-1, -1);
  74. int esrIndex = -1;
  75. int esrIndexAvoid = -1;
  76. double obsSpeedAvoid = 0;
  77. double esrDistance = -1;
  78. double esrDistanceAvoid = -1;
  79. int obsLostTime = 0;
  80. int obsLostTimeAvoid = 0;
  81. // double avoidTime = 0;
  82. double avoidX =0;
  83. int turnLampFlag=0; // if <0:left , if >0:right
  84. float roadWidth = 3.5;
  85. int roadSum =10;
  86. int roadNow = 0;
  87. int roadOri =0;
  88. int roadPre = -1;
  89. int lastRoadOri = 0;
  90. int lightTimes = 0;
  91. int lastRoadNum=1;
  92. int stopCount = 0;
  93. int gpsMissCount = 0;
  94. bool rapidStop = false;
  95. bool hasTrumpeted = false;
  96. bool changeRoad=false;
  97. //实验手刹
  98. bool handFirst = true;
  99. double handTimeSpan = 0;
  100. double handStartTime = 0;
  101. double handLastTime = 0;
  102. bool handPark = false;
  103. long handParkTime=10000;
  104. //喇叭
  105. bool trumpetFirstCount=true;
  106. double trumpetTimeSpan = 0;
  107. double trumpetStartTime = 0;
  108. double trumpetLastTime = 0;
  109. //过渡
  110. bool transferFirstCount=true;
  111. double transferTimeSpan = 0;
  112. double transferStartTime = 0;
  113. double transferLastTime = 0;
  114. bool busMode = false;
  115. bool parkBesideRoad=false;
  116. bool chaocheMode = false;
  117. bool specialSignle = false;
  118. double offsetX = 0;
  119. double steerSpeed=9000;
  120. bool transferPieriod;
  121. bool transferPieriod2;
  122. double traceDevi;
  123. bool startingFlag = true; //起步标志,在起步时需要进行frenet规划。
  124. bool useFrenet = false; //标志是否启用frenet算法避障
  125. bool useOldAvoid = true; //标志是否用老方法避障
  126. //数据存储功能 ,20210903,cxw
  127. bool file_cnt_add_en =false; //用于提示是否需要将文件计数值增加
  128. bool file_cnt_add=false;
  129. bool map_start_point = true;
  130. bool first_start_en=true; //自主巡迹数据存储用
  131. int start_tracepoint;
  132. int end_tracepoint;
  133. //
  134. std::vector<std::vector<double>> doubledata;//大地坐标系下x,y,phi,delta,速度规划用变量
  135. enum VehState { normalRun, park, readyPark, stopObs, avoidObs, preAvoid, avoiding, backOri,preBack,
  136. waitAvoid ,shoushaTest,justRun, changingRoad, chaoche, chaocheBack, reverseCar,reversing, reverseCircle, reverseDirect,reverseArr,
  137. dRever,dRever0,dRever1,dRever2,dRever3,dRever4} vehState;
  138. std::vector<iv::Point2D> gpsTraceAim; //记录变道后的目标路径,若车辆经frenet规划行驶至该路径上后,就关闭frenet规划
  139. std::vector<iv::Point2D> gpsTraceAvoid,gpsTraceNow,gpsTraceBack,gpsTracePre,gpsTraceOri,gpsTraceRear,gpsTraceNowLeft,gpsTraceNowRight,gpsTraceAvoidXY;
  140. std::vector<double> esrDisVector(roadSum, -1);
  141. std::vector<double> lidarDisVector(roadSum, -1);
  142. std::vector<double> obsDisVector(roadSum,-1);
  143. std::vector<double> obsSpeedVector(roadSum, 0);
  144. std::vector<int> obsLostTimeVector(roadSum, 0);
  145. std::vector<double> lastLidarDisVector(roadSum, -1);
  146. std::vector<double> lastDistanceVector(roadSum, -1);
  147. std::vector<iv::Point2D> traceOriLeft,traceOriRight;
  148. bool qiedianCount = false;
  149. static int obstacle_avoid_flag=0;
  150. //日常展示
  151. iv::decition::Decition iv::decition::DecideGps00::getDecideFromGPS(GPS_INS now_gps_ins,
  152. const std::vector<GPSData> gpsMapLine,
  153. iv::LidarGridPtr lidarGridPtr,
  154. std::vector<iv::Perception::PerceptionOutput> lidar_per,
  155. iv::TrafficLight trafficLight)
  156. {
  157. // QTime xTime;
  158. // xTime.start();
  159. //39.14034649083606 117.0863975920476 20507469.630314853 4334165.046101382 353
  160. Decition gps_decition(new DecitionBasic);
  161. // vector<iv::Point2D> fpTraceTmp;
  162. //如果useFrenet、useOldAvoid两者不互为相异,则采用原来的方法。“^”为异或运算符。
  163. if(!(useFrenet^useOldAvoid)){
  164. useFrenet = false;
  165. useOldAvoid = true;
  166. }
  167. // //如果useFrenet、useOldAvoid两者均为真或均为假,则采用原来的方法
  168. // if(useFrenet&&useOldAvoid || !useFrenet&&!useOldAvoid){
  169. // useFrenet = false;
  170. // useOldAvoid = true;
  171. // }
  172. // ServiceCarStatus.group_control=false;
  173. // GPS_INS gps= Coordinate_UnTransfer(0,1.5,now_gps_ins);
  174. // now_gps_ins.gps_x=gps.gps_x;
  175. // now_gps_ins.gps_y=gps.gps_y;
  176. // GaussProjInvCal(now_gps_ins.gps_x, now_gps_ins.gps_y,&now_gps_ins.gps_lng, &now_gps_ins.gps_lat);
  177. static int file_num; //数据存储,20210903,cxw
  178. if (isFirstRun)
  179. {
  180. file_num=0;
  181. initMethods();
  182. vehState = normalRun;
  183. startAvoid_gps_ins = now_gps_ins;
  184. init();
  185. PathPoint = Compute00().getFirstNearestPointIndex(now_gps_ins, gpsMapLine,
  186. DecideGps00::lastGpsIndex,
  187. DecideGps00::minDis,
  188. DecideGps00::maxAngle);
  189. DecideGps00::lastGpsIndex = PathPoint;
  190. if(ServiceCarStatus.
  191. speed_control==true){
  192. //Compute00().getDesiredSpeed(gpsMapLine); //add by zj
  193. Compute00().getPlanSpeed(gpsMapLine);
  194. }
  195. // ServiceCarStatus.carState = 1;
  196. // roadOri = gpsMapLine[PathPoint]->roadOri;
  197. // roadNow = roadOri;
  198. // roadSum = gpsMapLine[PathPoint]->roadSum;
  199. // busMode = false;
  200. // vehState = dRever;
  201. double dis = GetDistance(*gpsMapLine[0], *gpsMapLine[gpsMapLine.size()-1]);
  202. if(dis<15){
  203. circleMode=true; //201200102
  204. }else{
  205. circleMode=false;
  206. }
  207. // circleMode = true;
  208. getV2XTrafficPositionVector(gpsMapLine);
  209. // group_ori_gps=*gpsMapLine[0];
  210. ServiceCarStatus.bocheMode=false;
  211. ServiceCarStatus.daocheMode=false;
  212. parkMode=false;
  213. readyParkMode=false;
  214. finishPointNum=-1;
  215. roadNowStart=true;
  216. isFirstRun = false;
  217. obstacle_avoid_flag=0;
  218. givlog->debug("decition_brain_bool","DoorTimeStart: %d,current: %d",
  219. 0,0);
  220. }
  221. if(ServiceCarStatus.msysparam.gpsOffset_y!=0 || ServiceCarStatus.msysparam.gpsOffset_x!=0){
  222. GPS_INS gpsOffset = Coordinate_UnTransfer(ServiceCarStatus.msysparam.gpsOffset_x, ServiceCarStatus.msysparam.gpsOffset_y, now_gps_ins);
  223. now_gps_ins.gps_x=gpsOffset.gps_x;
  224. now_gps_ins.gps_y=gpsOffset.gps_y;
  225. GaussProjInvCal(now_gps_ins.gps_x, now_gps_ins.gps_y, &now_gps_ins.gps_lng, &now_gps_ins.gps_lat);
  226. }
  227. //1227
  228. // ServiceCarStatus.daocheMode=true;
  229. //1220
  230. changingDangWei=false;
  231. minDecelerate=0;
  232. if(now_gps_ins.gps_lat<0||now_gps_ins.gps_lat>90){
  233. // int a=0;
  234. gps_decition->wheel_angle = 0;
  235. gps_decition->speed = dSpeed;
  236. gps_decition->torque =0; //20210906,cxw
  237. gps_decition->accelerator = -0.5;
  238. gps_decition->brake=10;
  239. return gps_decition;
  240. }
  241. //1220
  242. if(ServiceCarStatus.daocheMode){
  243. now_gps_ins.ins_heading_angle=now_gps_ins.ins_heading_angle+180;
  244. if( now_gps_ins.ins_heading_angle>=360)
  245. now_gps_ins.ins_heading_angle= now_gps_ins.ins_heading_angle-360;
  246. }
  247. //1220 end
  248. //1125 traficc
  249. traffic_light_gps.gps_lat=ServiceCarStatus.iTrafficeLightLat;
  250. traffic_light_gps.gps_lng=ServiceCarStatus.iTrafficeLightLon;
  251. GaussProjCal(traffic_light_gps.gps_lng,traffic_light_gps.gps_lat, &traffic_light_gps.gps_x, &traffic_light_gps.gps_y);
  252. //xiesi
  253. ///kkcai, 2020-01-03
  254. //ServiceCarStatus.busmode=true;
  255. //ServiceCarStatus.busmode=false;//20200102
  256. ///////////////////////////////////////////////////
  257. busMode = ServiceCarStatus.busmode;
  258. nearStation=false;
  259. gps_decition->leftlamp = false;
  260. gps_decition->rightlamp = false;
  261. // qDebug("heading is %g",now_gps_ins.ins_heading_angle);
  262. aim_gps_ins.gps_lat= ServiceCarStatus.mfParkLat;
  263. aim_gps_ins.gps_lng= ServiceCarStatus.mfParkLng;
  264. aim_gps_ins.ins_heading_angle= ServiceCarStatus.mfParkHeading;
  265. GaussProjCal(aim_gps_ins.gps_lng,aim_gps_ins.gps_lat, &aim_gps_ins.gps_x, &aim_gps_ins.gps_y);
  266. is_arrivaled = false;
  267. // xiuzhengCs=-0.8; //1026
  268. xiuzhengCs=0;
  269. // if (parkMode)
  270. // {
  271. // handBrakePark(gps_decition,10000,now_gps_ins);
  272. // return gps_decition;
  273. // }
  274. realspeed = now_gps_ins.speed;
  275. secSpeed = realspeed / 3.6;
  276. //sidePark
  277. if(ServiceCarStatus.mnParkType==1){
  278. if( vehState!=dRever && vehState!=dRever0 && vehState!=dRever1 && vehState!=dRever2 && vehState!=dRever3 && vehState!=dRever4 && vehState!=reverseArr ){
  279. int bocheEN=Compute00().bocheDirectCompute(now_gps_ins, aim_gps_ins);
  280. if(bocheEN==1){
  281. ServiceCarStatus.bocheEnable=1;
  282. }else if(bocheEN==0){
  283. ServiceCarStatus.bocheEnable=0;
  284. }
  285. }else{
  286. ServiceCarStatus.bocheEnable=2;
  287. }
  288. if(ServiceCarStatus.bocheMode && vehState!=dRever && vehState!=dRever0 && vehState!=dRever1 &&
  289. vehState!=dRever2 && vehState!=dRever3 && vehState!=dRever4&& vehState!=reverseArr ){
  290. if(abs(realspeed)>0.1){
  291. dSpeed=0;
  292. minDecelerate=min(minDecelerate,-0.5f);
  293. phaseSpeedDecition(gps_decition, secSpeed, -1, 0, now_gps_ins);
  294. gps_decition->wheel_angle=0;
  295. return gps_decition;
  296. }else{
  297. if(trumpet()>3000){
  298. trumpetFirstCount=true;
  299. vehState=dRever;
  300. }
  301. }
  302. // ServiceCarStatus.bocheMode=false;
  303. }
  304. }
  305. //chuizhiPark
  306. if(ServiceCarStatus.mnParkType==0){
  307. if( vehState!=reverseCar && vehState!=reversing && vehState!=reverseCircle && vehState!=reverseDirect && vehState!=reverseArr ){
  308. int bocheEN=Compute00().bocheCompute(now_gps_ins, aim_gps_ins);
  309. if(bocheEN==1){
  310. ServiceCarStatus.bocheEnable=1;
  311. }else if(bocheEN==0){
  312. ServiceCarStatus.bocheEnable=0;
  313. }
  314. }else{
  315. ServiceCarStatus.bocheEnable=2;
  316. }
  317. if(ServiceCarStatus.bocheMode && vehState!=reverseCar && vehState!=reversing && vehState!=reverseCircle && vehState!=reverseDirect&& vehState!=reverseArr ){
  318. if(abs(realspeed)>0.1){
  319. dSpeed=0;
  320. minDecelerate=min(minDecelerate,-0.5f);
  321. phaseSpeedDecition(gps_decition, secSpeed, -1, 0, now_gps_ins);
  322. gps_decition->wheel_angle=0;
  323. return gps_decition;
  324. }else{
  325. if(trumpet()>3000){
  326. trumpetFirstCount=true;
  327. vehState=reverseCar;
  328. }
  329. }
  330. // ServiceCarStatus.bocheMode=false;
  331. }
  332. }
  333. // ChuiZhiTingChe
  334. if (vehState == reverseCar)
  335. {
  336. Compute00().bocheCompute(now_gps_ins, aim_gps_ins);
  337. vehState = reversing;
  338. qiedianCount=true;
  339. }
  340. if (vehState == reversing)
  341. {
  342. double dis = GetDistance(now_gps_ins, Compute00().nearTpoint);
  343. if (dis<2.0)//0.5
  344. {
  345. vehState = reverseCircle;
  346. qiedianCount = true;
  347. cout<<"到达近切点+++++++++++++++++++++++++++++++++"<<endl;
  348. }
  349. else {
  350. controlAng = 0;
  351. dSpeed = 2;
  352. dSecSpeed = dSpeed / 3.6;
  353. gps_decition->wheel_angle = 0;
  354. gps_decition->speed = dSpeed;
  355. obsDistance=-1;
  356. phaseSpeedDecition(gps_decition, secSpeed, -1, 0, now_gps_ins);
  357. // gps_decition->accelerator = 0;
  358. return gps_decition;
  359. }
  360. }
  361. if (vehState == reverseCircle)
  362. {
  363. double dis = GetDistance(now_gps_ins, Compute00().farTpoint);
  364. double angdis =abs(now_gps_ins.ins_heading_angle - aim_gps_ins.ins_heading_angle);
  365. if((((angdis<5)||(angdis>355)))&&(dis<3.0))
  366. // if((((angdis<4)||(angdis>356)))&&(dis<2.0))
  367. {
  368. vehState = reverseDirect;
  369. qiedianCount = true;
  370. cout<<"到达远切点+++++++++++++++++++++++++++++++++"<<endl;
  371. }
  372. else {
  373. if (qiedianCount && trumpet()<0)
  374. // if (qiedianCount && trumpet()<1500)
  375. {
  376. // gps_decition->brake = 10;
  377. // gps_decition->torque = 0;
  378. dSpeed=0;
  379. minDecelerate=min(minDecelerate,-0.5f);
  380. phaseSpeedDecition(gps_decition, secSpeed, -1, 0, now_gps_ins);
  381. }
  382. else
  383. {
  384. qiedianCount = false;
  385. trumpetFirstCount = true;
  386. dSpeed = 2;
  387. dSecSpeed = dSpeed / 3.6;
  388. gps_decition->speed = dSpeed;
  389. obsDistance=-1;
  390. phaseSpeedDecition(gps_decition, secSpeed, -1, 0, now_gps_ins);
  391. }
  392. controlAng = Compute00().bocheAngle*16.5;
  393. gps_decition->wheel_angle = 0 - controlAng*1.05;
  394. cout<<"farTpointDistance================"<<dis<<endl;
  395. return gps_decition;
  396. }
  397. }
  398. if (vehState == reverseDirect)
  399. {
  400. // double dis = GetDistance(now_gps_ins, aim_gps_ins);
  401. Point2D pt = Coordinate_Transfer(now_gps_ins.gps_x,now_gps_ins.gps_y, aim_gps_ins);
  402. if ((pt.y)<0.5)
  403. {
  404. qiedianCount=true;
  405. vehState=reverseArr;
  406. cout<<"到达泊车点+++++++++++++++++++++++++++++++++"<<endl;
  407. // gps_decition->accelerator = -3;
  408. // gps_decition->brake = 10;
  409. // gps_decition->torque = 0;
  410. gps_decition->wheel_angle=0;
  411. dSpeed=0;
  412. minDecelerate=min(minDecelerate,-0.5f);
  413. phaseSpeedDecition(gps_decition, secSpeed, -1, 0, now_gps_ins);
  414. return gps_decition;
  415. }
  416. else {
  417. //if (qiedianCount && trumpet()<0)
  418. if (qiedianCount && trumpet()<1000)
  419. {
  420. // gps_decition->brake = 10;
  421. // gps_decition->torque = 0;
  422. dSpeed=0;
  423. minDecelerate=min(minDecelerate,-0.5f);
  424. phaseSpeedDecition(gps_decition, secSpeed, -1, 0, now_gps_ins);
  425. }
  426. else
  427. {
  428. qiedianCount = false;
  429. trumpetFirstCount = true;
  430. dSpeed = 1;
  431. dSecSpeed = dSpeed / 3.6;
  432. gps_decition->speed = dSpeed;
  433. obsDistance=-1;
  434. phaseSpeedDecition(gps_decition, secSpeed, -1, 0, now_gps_ins);
  435. }
  436. controlAng = 0;
  437. gps_decition->wheel_angle = 0;
  438. return gps_decition;
  439. }
  440. }
  441. if (vehState == reverseArr)
  442. {
  443. //
  444. ServiceCarStatus.bocheMode=false;
  445. if (qiedianCount && trumpet()<1500)
  446. {
  447. // gps_decition->brake = 10;
  448. // gps_decition->torque = 0;
  449. dSpeed=0;
  450. minDecelerate=min(minDecelerate,-0.5f);
  451. phaseSpeedDecition(gps_decition, secSpeed, -1, 0, now_gps_ins);
  452. ServiceCarStatus.bocheMode=false;
  453. }
  454. else
  455. {
  456. qiedianCount = false;
  457. trumpetFirstCount = true;
  458. ServiceCarStatus.bocheEnable=0;
  459. vehState=normalRun;
  460. ServiceCarStatus.mbRunPause=true;
  461. ServiceCarStatus.mnBocheComplete=100;
  462. cout<<"泊车daowei mbRunPause+++++++++++++++++++++++++++++++++"<<endl;
  463. }
  464. gps_decition->wheel_angle = 0 ;
  465. return gps_decition;
  466. }
  467. //ceFangWeiBoChe
  468. if (vehState == dRever)
  469. {
  470. GaussProjCal(aim_gps_ins.gps_lng, aim_gps_ins.gps_lat, &aim_gps_ins.gps_x, &aim_gps_ins.gps_y);
  471. Compute00().bocheDirectCompute(now_gps_ins, aim_gps_ins);
  472. vehState = dRever0;
  473. qiedianCount=true;
  474. std::cout<<"enter side boche mode"<<std::endl;
  475. }
  476. if (vehState == dRever0)
  477. {
  478. double dis = GetDistance(now_gps_ins, Compute00().dTpoint0);
  479. if (dis<2.0)
  480. {
  481. vehState = dRever1;
  482. qiedianCount = true;
  483. cout<<"到达近切点+++++++++++++++++++++++++++++++++"<<endl;
  484. }
  485. else {
  486. controlAng = 0;
  487. dSpeed = 2;
  488. dSecSpeed = dSpeed / 3.6;
  489. gps_decition->wheel_angle = 0;
  490. gps_decition->speed = dSpeed;
  491. obsDistance=-1;
  492. phaseSpeedDecition(gps_decition, secSpeed, -1, 0, now_gps_ins);
  493. // gps_decition->accelerator = 0;
  494. return gps_decition;
  495. }
  496. }
  497. if (vehState == dRever1)
  498. {
  499. double dis = GetDistance(now_gps_ins, Compute00().dTpoint1);
  500. if(dis<2.0)
  501. {
  502. vehState = dRever2;
  503. qiedianCount = true;
  504. cout<<"到达远切点+++++++++++++++++++++++++++++++++"<<endl;
  505. }
  506. else {
  507. if (qiedianCount && trumpet()<1000)
  508. {
  509. // gps_decition->brake = 10;
  510. // gps_decition->torque = 0;
  511. dSpeed=0;
  512. minDecelerate=min(minDecelerate,-0.5f);
  513. phaseSpeedDecition(gps_decition, secSpeed, -1, 0, now_gps_ins);
  514. }
  515. else
  516. {
  517. qiedianCount = false;
  518. trumpetFirstCount = true;
  519. dSpeed = 2;
  520. dSecSpeed = dSpeed / 3.6;
  521. gps_decition->speed = dSpeed;
  522. obsDistance=-1;
  523. phaseSpeedDecition(gps_decition, secSpeed, -1, 0, now_gps_ins);
  524. }
  525. controlAng = Compute00().dBocheAngle*16.5;
  526. gps_decition->wheel_angle = 0 - controlAng;
  527. cout<<"farTpointDistance================"<<dis<<endl;
  528. return gps_decition;
  529. }
  530. }
  531. if (vehState == dRever2)
  532. {
  533. double dis = GetDistance(now_gps_ins, Compute00().dTpoint2);
  534. Point2D pt1 = Coordinate_Transfer(now_gps_ins.gps_x,now_gps_ins.gps_y, aim_gps_ins);
  535. Point2D pt2 = Coordinate_Transfer(Compute00().dTpoint2.gps_x,Compute00().dTpoint2.gps_y, aim_gps_ins);
  536. double xx= (pt1.x-pt2.x);
  537. // if(xx>0)
  538. if(xx>-0.5)
  539. {
  540. GaussProjCal(aim_gps_ins.gps_lng, aim_gps_ins.gps_lat, &aim_gps_ins.gps_x, &aim_gps_ins.gps_y);
  541. Point2D ptt = Coordinate_Transfer(now_gps_ins.gps_x,now_gps_ins.gps_y, aim_gps_ins);
  542. double xxx=ptt.x;
  543. double yyy =ptt.y;
  544. // if(xxx<-1.5||xx>1){
  545. // int a=0;
  546. // }
  547. vehState = dRever3;
  548. qiedianCount = true;
  549. cout<<"到达远切点+++++++++++++++++++++++++++++++++"<<endl;
  550. cout<<"xxx+++++++++++++++++++++++++++++++++"<<xxx<<endl;
  551. cout<<"yyy+++++++++++++++++++++++++++++++++"<<yyy<<endl;
  552. }
  553. else {
  554. if (qiedianCount && trumpet()<1000)
  555. {
  556. /* gps_decition->brake = 10;
  557. gps_decition->torque = 0; */
  558. dSpeed=0;
  559. minDecelerate=min(minDecelerate,-0.5f);
  560. phaseSpeedDecition(gps_decition, secSpeed, -1, 0, now_gps_ins);
  561. }
  562. else
  563. {
  564. qiedianCount = false;
  565. trumpetFirstCount = true;
  566. dSpeed = 2;
  567. dSecSpeed = dSpeed / 3.6;
  568. gps_decition->speed = dSpeed;
  569. obsDistance=-1;
  570. phaseSpeedDecition(gps_decition, secSpeed, -1, 0, now_gps_ins);
  571. }
  572. gps_decition->wheel_angle = 0 ;
  573. cout<<"farTpointDistance================"<<dis<<endl;
  574. return gps_decition;
  575. }
  576. }
  577. if (vehState == dRever3)
  578. {
  579. double dis = GetDistance(now_gps_ins, Compute00().dTpoint3);
  580. double angdis =abs(now_gps_ins.ins_heading_angle - aim_gps_ins.ins_heading_angle);
  581. if((((angdis<5)||(angdis>355)))&&(dis<10.0))
  582. {
  583. vehState = dRever4;
  584. qiedianCount = true;
  585. cout<<"到达远切点+++++++++++++++++++++++++++++++++"<<endl;
  586. }
  587. else {
  588. if (qiedianCount && trumpet()<1000)
  589. {
  590. // gps_decition->brake = 10;
  591. // gps_decition->torque = 0;
  592. dSpeed=0;
  593. minDecelerate=min(minDecelerate,-0.5f);
  594. phaseSpeedDecition(gps_decition, secSpeed, -1, 0, now_gps_ins);
  595. }
  596. else
  597. {
  598. qiedianCount = false;
  599. trumpetFirstCount = true;
  600. dSpeed = 2;
  601. dSecSpeed = dSpeed / 3.6;
  602. gps_decition->speed = dSpeed;
  603. obsDistance=-1;
  604. phaseSpeedDecition(gps_decition, secSpeed, -1, 0, now_gps_ins);
  605. }
  606. controlAng = 0-Compute00().dBocheAngle*16.5;
  607. gps_decition->wheel_angle = 0 - controlAng*0.95;
  608. cout<<"farTpointDistance================"<<dis<<endl;
  609. return gps_decition;
  610. }
  611. }
  612. if (vehState == dRever4)
  613. {
  614. // double dis = GetDistance(now_gps_ins, aim_gps_ins);
  615. Point2D pt = Coordinate_Transfer(now_gps_ins.gps_x,now_gps_ins.gps_y, aim_gps_ins);
  616. if ((pt.y)<0.5)
  617. {
  618. qiedianCount=true;
  619. vehState=reverseArr;
  620. cout<<"到达泊车点+++++++++++++++++++++++++++++++++"<<endl;
  621. // gps_decition->accelerator = -3;
  622. // gps_decition->brake =10 ;
  623. dSpeed=0;
  624. minDecelerate=min(minDecelerate,-0.5f);
  625. phaseSpeedDecition(gps_decition, secSpeed, -1, 0, now_gps_ins);
  626. gps_decition->wheel_angle=0;
  627. return gps_decition;
  628. }
  629. else {
  630. //if (qiedianCount && trumpet()<0)
  631. if (qiedianCount && trumpet()<1000)
  632. {
  633. // gps_decition->brake = 10;
  634. // gps_decition->torque = 0;
  635. dSpeed=0;
  636. minDecelerate=min(minDecelerate,-0.5f);
  637. phaseSpeedDecition(gps_decition, secSpeed, -1, 0, now_gps_ins);
  638. }
  639. else
  640. {
  641. qiedianCount = false;
  642. trumpetFirstCount = true;
  643. dSpeed = 2;
  644. dSecSpeed = dSpeed / 3.6;
  645. gps_decition->speed = dSpeed;
  646. obsDistance=-1;
  647. phaseSpeedDecition(gps_decition, secSpeed, -1, 0, now_gps_ins);
  648. }
  649. controlAng = 0;
  650. gps_decition->wheel_angle = 0;
  651. return gps_decition;
  652. }
  653. }
  654. if (vehState == reverseArr)
  655. {
  656. //
  657. ServiceCarStatus.bocheMode=false;
  658. if (qiedianCount && trumpet()<1500)
  659. {
  660. // gps_decition->brake = 10;
  661. // gps_decition->torque = 0;
  662. dSpeed=0;
  663. minDecelerate=min(minDecelerate,-0.5f);
  664. phaseSpeedDecition(gps_decition, secSpeed, -1, 0, now_gps_ins);
  665. }
  666. else
  667. {
  668. qiedianCount = false;
  669. trumpetFirstCount = true;
  670. ServiceCarStatus.bocheEnable=0;
  671. vehState=normalRun;
  672. ServiceCarStatus.mbRunPause=true;
  673. ServiceCarStatus.mnBocheComplete=100;
  674. cout<<"泊车daowei mbRunPause+++++++++++++++++++++++++++++++++"<<endl;
  675. }
  676. gps_decition->wheel_angle = 0 ;
  677. return gps_decition;
  678. }
  679. obsDistance = -1;
  680. esrIndex = -1;
  681. lidarDistance = -1;
  682. obsDistanceAvoid = -1;
  683. esrIndexAvoid = -1;
  684. roadPre = -1;
  685. //dSpeed = ServiceCarStatus.mroadmode_vel.mfmode0;
  686. gpsTraceOri.clear();
  687. gpsTraceNow.clear();
  688. gpsTraceAim.clear();
  689. gpsTraceAvoid.clear();
  690. gpsTraceBack.clear();
  691. gpsTraceNowLeft.clear();
  692. gpsTraceNowRight.clear();
  693. if (!isFirstRun)
  694. {
  695. PathPoint = Compute00().getNearestPointIndex(now_gps_ins, gpsMapLine, DecideGps00::lastGpsIndex, DecideGps00::minDis, DecideGps00::maxAngle);
  696. if(PathPoint<0){
  697. PathPoint = Compute00().getFirstNearestPointIndex(now_gps_ins, gpsMapLine, DecideGps00::lastGpsIndex, DecideGps00::minDis, DecideGps00::maxAngle);
  698. }
  699. }
  700. if (PathPoint<0)
  701. {
  702. minDecelerate=-1.0;
  703. // if((ServiceCarStatus.msysparam.mvehtype=="pixloop")||(ServiceCarStatus.msysparam.mvehtype=="yika")
  704. // || (ServiceCarStatus.msysparam.mvehtype=="hunter"))
  705. // {
  706. // dSpeed=0.0; //20210903,cxw,这三种车型都是用决策速度控制的
  707. // }
  708. phaseSpeedDecition(gps_decition, secSpeed, -1, 0,now_gps_ins);
  709. return gps_decition;
  710. }
  711. DecideGps00::lastGpsIndex = PathPoint;
  712. double brake_distance=200;
  713. brake_distance=max(250,(int)(dSpeed*dSpeed+150));
  714. if(!circleMode && PathPoint>gpsMapLine.size()-brake_distance){
  715. minDecelerate=-0.5;
  716. // if((ServiceCarStatus.msysparam.mvehtype=="pixloop")||(ServiceCarStatus.msysparam.mvehtype=="yika")
  717. // || (ServiceCarStatus.msysparam.mvehtype=="hunter"))
  718. // {
  719. // dSpeed=0.0; //20210622,cxw,地图到达终点决策速度设置为0,防止车子乱动
  720. // }
  721. std::cout<<"map finish brake"<<std::endl;
  722. }
  723. if(!circleMode){
  724. double forecast_final=secSpeed*secSpeed+5;
  725. int forecast_final_point=((int)forecast_final)*10;
  726. static int BrakePoint=-1;
  727. static bool final_brake=false,final_brake_lock=false;
  728. if(PathPoint+forecast_final_point<gpsMapLine.size())
  729. {
  730. if(gpsMapLine[PathPoint+forecast_final_point]->mode2==23 && realspeed>3){
  731. final_brake=true;
  732. if(BrakePoint==-1)
  733. BrakePoint=PathPoint-10;
  734. }
  735. }
  736. if(PathPoint<BrakePoint)
  737. {
  738. final_brake=false;
  739. final_brake_lock=false;
  740. BrakePoint=-1;
  741. }
  742. if(final_brake==true){
  743. if((realspeed>3)&&(final_brake_lock==false)){
  744. minDecelerate=-0.5;
  745. }else{
  746. dSpeed=min(dSpeed, 3.0);
  747. final_brake_lock=true;
  748. if(PathPoint+50<gpsMapLine.size()){
  749. if(gpsMapLine[PathPoint+50]->mode2==23){
  750. minDecelerate=-0.5; //主master核对,check =-0.5;
  751. }
  752. }
  753. }
  754. }
  755. // if(PathPoint+500<gpsMapLine.size())
  756. // {
  757. // if(gpsMapLine[PathPoint+500]->mode2==23 && realspeed>20)
  758. // minDecelerate=-0.5;
  759. // else if(gpsMapLine[PathPoint+300]->mode2==23 && realspeed>15)
  760. // minDecelerate=-0.5;
  761. // else if(gpsMapLine[PathPoint+100]->mode2==23)
  762. // minDecelerate=-0.6;
  763. // }
  764. // else if(PathPoint+300<gpsMapLine.size()){
  765. // if(gpsMapLine[PathPoint+300]->mode2==23 && realspeed>15)
  766. // minDecelerate=-0.5;
  767. // else if(gpsMapLine[PathPoint+100]->mode2==23)
  768. // minDecelerate=-0.6;
  769. // }
  770. // else if(PathPoint+150<gpsMapLine.size()){
  771. // if(gpsMapLine[PathPoint+150]->mode2==23 && realspeed>10)
  772. // minDecelerate=-0.5;
  773. // else if(gpsMapLine[PathPoint+100]->mode2==23)
  774. // minDecelerate=-0.6;
  775. // }
  776. // else if(PathPoint+100<gpsMapLine.size()){
  777. // if(gpsMapLine[PathPoint+100]->mode2==23)
  778. // minDecelerate=-0.6;
  779. // }
  780. }
  781. if(!ServiceCarStatus.inRoadAvoid){
  782. roadOri = gpsMapLine[PathPoint]->roadOri;
  783. roadSum = gpsMapLine[PathPoint]->roadSum;
  784. givlog->debug("decition_brain","roadOri: %d",
  785. roadOri);
  786. }else{
  787. roadOri=gpsMapLine[PathPoint]->roadOri*3+1;
  788. roadSum = gpsMapLine[PathPoint]->roadSum*3;
  789. }
  790. // roadOri =0;
  791. // roadSum =2;
  792. if(roadNowStart){
  793. roadNow=roadOri;
  794. roadNowStart=false;
  795. }
  796. if(ServiceCarStatus.avoidObs){
  797. gpsMapLine[PathPoint]->runMode=1;
  798. }else{
  799. gpsMapLine[PathPoint]->runMode=0;
  800. }
  801. if(obstacle_avoid_flag==1){
  802. avoidX=computeAvoidX(roadNow,roadOri,gpsMapLine[PathPoint],ServiceCarStatus.msysparam.vehWidth);
  803. }else{
  804. avoidX=0;
  805. roadNow = roadOri;
  806. if(vehState==backOri){
  807. vehState=normalRun;
  808. }
  809. }
  810. if ( gpsMapLine[PathPoint]->runMode == 0 &&(vehState == avoidObs||vehState ==stopObs||vehState == preAvoid
  811. ||vehState == avoiding||vehState == backOri||vehState ==preBack||vehState ==waitAvoid ) )
  812. {
  813. vehState = normalRun;
  814. roadNow = roadOri;
  815. }
  816. gpsTraceOri= getGpsTrace(now_gps_ins, gpsMapLine, lastGpsIndex,circleMode);
  817. if((vehState == avoiding || vehState == backOri)&&(gpsTraceAvoidXY.size()>0)&&(obstacle_avoid_flag==1))
  818. {
  819. gpsTraceOri=getGpsTraceAvoid(now_gps_ins, gpsTraceAvoidXY, lastGpsIndex,circleMode);
  820. }
  821. if(gpsTraceOri.empty()){
  822. gps_decition->wheel_angle = 0;
  823. gps_decition->speed = dSpeed;
  824. gps_decition->torque=0;//20210906,cxw
  825. gps_decition->accelerator = -0.5;
  826. gps_decition->brake=10;
  827. return gps_decition;
  828. }
  829. traceDevi=gpsTraceOri[0].x;
  830. //起步进行frenet规划后,车辆行驶至地图路线上,起步操作完毕。
  831. //如果车辆本身启动位置在地图路线上,可不用进行frenet规划。
  832. // if(GetDistance(now_gps_ins,*gpsMapLine[PathPoint]) < 1){
  833. // startingFlag = false;
  834. // }
  835. startingFlag = false;
  836. if(startingFlag){
  837. // gpsTraceAim = gpsTraceOri;
  838. if(abs(gpsTraceOri[0].x)>1){
  839. cout<<"frenetPlanner->getPath:pre"<<endl;
  840. gpsTraceNow = frenetPlanner->getPath(now_gps_ins,gpsMapLine,PathPoint,0,lidarGridPtr);
  841. cout<<"frenetPlanner->getPath,gpsTraceNow.size: "<<gpsTraceNow.size()<<endl;
  842. if(gpsTraceNow.size()==0){
  843. gps_decition->accelerator = 0;
  844. gps_decition->brake=10;
  845. gps_decition->wheel_angle = lastAngle;
  846. gps_decition->speed = 0;
  847. return gps_decition;
  848. }
  849. }else{
  850. startingFlag = false;
  851. }
  852. }
  853. if(useFrenet){
  854. //如果车辆在变道中,启用frenet规划局部路径
  855. if(vehState == avoiding || vehState == backOri){
  856. // avoidX = (roadOri - roadNow)*roadWidth;
  857. avoidX=computeAvoidX(roadNow,roadOri,gpsMapLine[PathPoint],ServiceCarStatus.msysparam.vehWidth);
  858. gpsTraceNow = frenetPlanner->getPath(now_gps_ins,gpsMapLine,PathPoint,avoidX,lidarGridPtr);
  859. //gpsTraceAim = laneChangePlanner->getPath(now_gps_ins,gpsMapLine,PathPoint,avoidX,lidarGridPtr);
  860. gpsTraceAim = getGpsTraceOffset(gpsTraceOri, avoidX);
  861. if(gpsTraceNow.size()==0){
  862. gps_decition->accelerator = 0;
  863. gps_decition->brake=10;
  864. gps_decition->wheel_angle = lastAngle;
  865. gps_decition->speed = 0;
  866. return gps_decition;
  867. }
  868. }
  869. }
  870. if(gpsTraceNow.size()==0){
  871. if (roadNow==roadOri)
  872. {
  873. if(vehState == backOri)
  874. {
  875. gpsTraceNow.assign(gpsTraceOri.begin(), gpsTraceOri.end());
  876. getGpsTraceNowLeftRight(gpsTraceNow);
  877. }
  878. else{
  879. gpsTraceNow.assign(gpsTraceOri.begin(), gpsTraceOri.end());
  880. gpsTraceNowLeft.assign(traceOriLeft.begin(),traceOriLeft.end());
  881. gpsTraceNowRight.assign(traceOriRight.begin(),traceOriRight.end());
  882. }
  883. }else
  884. {
  885. if((vehState == avoiding)||(vehState == backOri))
  886. {
  887. gpsTraceNow.assign(gpsTraceOri.begin(), gpsTraceOri.end());
  888. // gpsTraceNowLeft=getGpsTraceOffset(traceOriLeft, avoidX);
  889. // gpsTraceNowRight=getGpsTraceOffset(traceOriRight, avoidX);
  890. getGpsTraceNowLeftRight(gpsTraceNow);
  891. }else{
  892. gpsTraceNow = getGpsTraceOffset(gpsTraceOri, avoidX);
  893. // gpsTraceNowLeft=getGpsTraceOffset(traceOriLeft, avoidX);
  894. // gpsTraceNowRight=getGpsTraceOffset(traceOriRight, avoidX);
  895. getGpsTraceNowLeftRight(gpsTraceNow);
  896. }
  897. }
  898. }
  899. if(vehState==normalRun)
  900. {
  901. if(gpsTraceNow.size()>200){
  902. if(gpsTraceNow[200].x<-3){
  903. gps_decition->leftlamp = true;
  904. gps_decition->rightlamp = false;
  905. }else if(gpsTraceNow[200].x>3){
  906. gps_decition->leftlamp = false;
  907. gps_decition->rightlamp = true;
  908. }else{
  909. gps_decition->leftlamp = false;
  910. gps_decition->rightlamp = false;
  911. }
  912. }
  913. }
  914. // dSpeed = getSpeed(gpsTraceNow);
  915. dSpeed =80;
  916. planTrace.clear();//Add By YuChuli, 2020.11.26
  917. for(int i=0;i<gpsTraceNow.size();i++){
  918. TracePoint pt(gpsTraceNow[i].x,gpsTraceNow[i].y);
  919. planTrace.push_back(pt);
  920. }
  921. controlAng= getAngle(gpsTraceNow,now_gps_ins,gps_decition);
  922. if(!circleMode && PathPoint>(gpsMapLine.size()-250)){
  923. if(realspeed<0.5)
  924. controlAng=0;
  925. }
  926. //1220
  927. if(ServiceCarStatus.daocheMode){
  928. controlAng=0-controlAng;
  929. }
  930. //2020-0106
  931. if(ServiceCarStatus.msysparam.mvehtype !="zhongche"){
  932. if(vehState==avoiding){
  933. ServiceCarStatus.msysparam.vehWidth=2.4;
  934. controlAng=max(-150.0,controlAng);//35 zj-150
  935. controlAng=min(150.0,controlAng);//35 zj-150
  936. }
  937. if(vehState==backOri){
  938. controlAng=max(-150.0,controlAng);//35 zj-150
  939. controlAng=min(150.0,controlAng);//35 zj-150
  940. }
  941. }
  942. // givlog->debug("brain_decition","vehState: %d,controlAng: %f",
  943. // vehState,controlAng);
  944. //准备驻车
  945. if (readyZhucheMode)
  946. {
  947. cout<<"ready ZHECHE STATE+++++++++++++++++++++++++++++++++"<<endl;
  948. cout<<"zhuche point : "<<zhuchePointNum<<endl;
  949. double dis = GetDistance(*gpsMapLine[zhuchePointNum], now_gps_ins);
  950. if (dis<35)
  951. {
  952. Point2D pt = Coordinate_Transfer((*gpsMapLine[zhuchePointNum]).gps_x, (*gpsMapLine[zhuchePointNum]).gps_y, now_gps_ins);
  953. double zhucheDistance = pt.y;
  954. #if 0
  955. if (dSpeed > 15)
  956. {
  957. dSpeed = 15;
  958. }
  959. if (zhucheDistance < 20 && dis < 25)
  960. {
  961. dSpeed = min(dSpeed, 5.0);
  962. }
  963. #else
  964. if (dSpeed > 12)
  965. {
  966. dSpeed = 12;
  967. }
  968. if (zhucheDistance < 9 && dis < 9)
  969. {
  970. dSpeed = min(dSpeed, 5.0);
  971. }
  972. #endif
  973. if (zhucheDistance < 3.0 && dis < 3.5)
  974. {
  975. dSpeed = min(dSpeed, 5.0);
  976. zhucheMode = true;
  977. readyZhucheMode = false;
  978. cout<<"jinru ZHECHE STATE+++++++++++++++++++++++++++++++++"<<endl;
  979. }
  980. }
  981. }
  982. if (readyParkMode)
  983. {
  984. double parkDis = GetDistance(now_gps_ins, *gpsMapLine[finishPointNum]);
  985. hasZhuched = true;
  986. if (parkDis < 25)
  987. {
  988. Point2D pt = Coordinate_Transfer((*gpsMapLine[finishPointNum]).gps_x, (*gpsMapLine[finishPointNum]).gps_y, now_gps_ins);
  989. double parkDistance = pt.y;
  990. if (dSpeed > 15)
  991. {
  992. dSpeed = 15;
  993. }
  994. //dSpeed = 15;//////////////////////////////
  995. if (parkDistance < 15 && parkDistance >= 4.5 && parkDis<20)
  996. {
  997. dSpeed = min(dSpeed, 8.0);
  998. }else if (parkDistance < 4.5 && parkDistance >= 3.5 && parkDis<5.0){
  999. dSpeed = min(dSpeed, 5.0);
  1000. }else if(parkDistance < 3.5 && parkDis<4.0){
  1001. dSpeed = min(dSpeed, 3.0);
  1002. }
  1003. // float stopDis=2;
  1004. // if(ServiceCarStatus.msysparam.mvehtype=="ge3"){
  1005. // stopDis=1.6;
  1006. // } else if(ServiceCarStatus.msysparam.mvehtype=="vv7"){
  1007. // stopDis=1.8;
  1008. // }
  1009. if (parkDistance < 1.6 && parkDis<2.0)
  1010. {
  1011. // dSpeed = 0;
  1012. parkMode = true;
  1013. readyParkMode = false;
  1014. }
  1015. }
  1016. }
  1017. if(ServiceCarStatus.speed_control==true){
  1018. dSpeed = min(doubledata[PathPoint][4],dSpeed);
  1019. }
  1020. else
  1021. {
  1022. if (gpsMapLine[PathPoint]->roadMode ==0)
  1023. {
  1024. dSpeed = min(ServiceCarStatus.mroadmode_vel.mfmode0,dSpeed);
  1025. gps_decition->leftlamp = false;
  1026. gps_decition->rightlamp = false;
  1027. }else if (gpsMapLine[PathPoint]->roadMode == 5)
  1028. {
  1029. dSpeed = min(ServiceCarStatus.mroadmode_vel.mfmode5,dSpeed);
  1030. gps_decition->leftlamp = false;
  1031. gps_decition->rightlamp = false;
  1032. }else if (gpsMapLine[PathPoint]->roadMode == 11)
  1033. {
  1034. dSpeed = min(ServiceCarStatus.mroadmode_vel.mfmode11,dSpeed);
  1035. }else if (gpsMapLine[PathPoint]->roadMode == 14)
  1036. {
  1037. dSpeed = min(ServiceCarStatus.mroadmode_vel.mfmode14,dSpeed);
  1038. gps_decition->leftlamp = true;
  1039. gps_decition->rightlamp = false;
  1040. }else if (gpsMapLine[PathPoint]->roadMode == 15)
  1041. {
  1042. dSpeed = min(ServiceCarStatus.mroadmode_vel.mfmode15,dSpeed);
  1043. gps_decition->leftlamp = false;
  1044. gps_decition->rightlamp = true;
  1045. }else if (gpsMapLine[PathPoint]->roadMode == 16)
  1046. {
  1047. dSpeed = min(ServiceCarStatus.mroadmode_vel.mfmode16,dSpeed);
  1048. gps_decition->leftlamp = true;
  1049. gps_decition->rightlamp = false;
  1050. }else if (gpsMapLine[PathPoint]->roadMode == 17)
  1051. {
  1052. dSpeed = min(ServiceCarStatus.mroadmode_vel.mfmode17,dSpeed);
  1053. gps_decition->leftlamp = false;
  1054. gps_decition->rightlamp = true;
  1055. }else if (gpsMapLine[PathPoint]->roadMode == 18)
  1056. {
  1057. dSpeed = min(ServiceCarStatus.mroadmode_vel.mfmode18,dSpeed);
  1058. }else if (gpsMapLine[PathPoint]->roadMode == 1)
  1059. {
  1060. dSpeed = min(ServiceCarStatus.mroadmode_vel.mfmode1,dSpeed);
  1061. }else if (gpsMapLine[PathPoint]->roadMode == 2)
  1062. {
  1063. dSpeed = min(15.0,dSpeed);
  1064. }
  1065. else if (gpsMapLine[PathPoint]->roadMode == 7)
  1066. {
  1067. dSpeed = min(15.0,dSpeed);
  1068. xiuzhengCs=1.5;
  1069. }else if (gpsMapLine[PathPoint]->roadMode == 4) //1220
  1070. {
  1071. dSpeed = min(4.0,dSpeed);
  1072. }else{
  1073. dSpeed = min(ServiceCarStatus.mroadmode_vel.mfmode0,dSpeed);
  1074. gps_decition->leftlamp = false;
  1075. gps_decition->rightlamp = false;
  1076. }
  1077. }
  1078. if (gpsMapLine[PathPoint]->speed_mode == 2)
  1079. {
  1080. dSpeed = min(25.0,dSpeed);
  1081. }
  1082. if((vehState==avoiding)||(vehState==backOri)||(roadNow != roadOri)||(vehState==preAvoid))
  1083. {
  1084. dSpeed = min(8.0,dSpeed);
  1085. }
  1086. if((gpsMapLine[PathPoint]->speed)>0.001)
  1087. {
  1088. dSpeed = min((gpsMapLine[PathPoint]->speed*3.6),dSpeed);
  1089. // if((gpsMapLine[PathPoint]->speed)>4.5)
  1090. // {
  1091. // dSpeed =gpsMapLine[PathPoint]->speed*3.6;
  1092. // }
  1093. }
  1094. dSpeed = limitSpeed(controlAng, dSpeed);
  1095. dSecSpeed = dSpeed / 3.6;
  1096. // givlog->debug("brain_decition_speed","dspeed: %f",
  1097. // dSpeed);
  1098. if(vehState==changingRoad){
  1099. if(gpsTraceNow[0].x>1.0){
  1100. gps_decition->leftlamp = false;
  1101. gps_decition->rightlamp = true;
  1102. }else if(gpsTraceNow[0].x<-1.0){
  1103. gps_decition->leftlamp = true;
  1104. gps_decition->rightlamp = false;
  1105. }else{
  1106. vehState==normalRun;
  1107. }
  1108. }
  1109. static int obs_filter=0,obs_filter_flag=0,obs_filter_dis_memory=0;
  1110. static double obs_speed_for_avoid=-1,obs_filter_speed_memory=0; //obs_speed_for_avoid: obstacle actual speed in km/h
  1111. if(!ServiceCarStatus.daocheMode){
  1112. //computeObsOnRoad(lidarGridPtr, gpsTraceNow, roadNow,gpsMapLine,lidar_per);
  1113. computeObsOnRoadXY(lidarGridPtr, gpsTraceNow,gpsTraceNowLeft,gpsTraceNowRight,roadNow,gpsMapLine,lidar_per);
  1114. if(obs_filter_flag==0)
  1115. {
  1116. if(obsDistance>0&&obsDistance<60)
  1117. {
  1118. obs_filter++;
  1119. if(obs_filter<20) //80
  1120. {
  1121. obsDistance=-1;
  1122. obsSpeed=0;
  1123. }
  1124. else
  1125. {
  1126. obs_filter_flag=1;
  1127. obs_filter_dis_memory=obsDistance;
  1128. obs_filter_speed_memory=obsSpeed;
  1129. obs_filter=0;
  1130. }
  1131. }else{
  1132. obs_filter=0;
  1133. }
  1134. }else
  1135. {
  1136. if(obsDistance<0||obsDistance>60)
  1137. {
  1138. obs_filter++;
  1139. if(obs_filter<20) //80
  1140. {
  1141. obsDistance=obs_filter_dis_memory;
  1142. obsSpeed=obs_filter_speed_memory;
  1143. }
  1144. else
  1145. {
  1146. obs_filter_flag=0;
  1147. obs_filter=0;
  1148. }
  1149. }else
  1150. {
  1151. obs_filter=0;
  1152. obs_filter_dis_memory=obsDistance;
  1153. obs_filter_speed_memory=obsSpeed;
  1154. }
  1155. }
  1156. obs_speed_for_avoid=(secSpeed+obsSpeed)*3.6;
  1157. }else{
  1158. gpsTraceRear.clear();
  1159. for(int i=0;i<gpsTraceNow.size();i++){
  1160. Point2D pt;
  1161. pt.x=0-gpsTraceNow[i].x;
  1162. pt.y=0-gpsTraceNow[i].y;
  1163. gpsTraceRear.push_back(pt);
  1164. }
  1165. computeObsOnRoad(lidarGridPtr, gpsTraceNow, roadNow,gpsMapLine,lidar_per);
  1166. // obsDistance=-1; //1227
  1167. }
  1168. //old_bz--------------------------------------------------------------------------------------------------
  1169. if (vehState == avoiding)
  1170. {
  1171. double avoidDistance=GetDistance(startAvoidGpsIns,now_gps_ins);
  1172. //若车辆到达变道后的路径,改变车辆状态,关闭frenet规划
  1173. if (useFrenet && abs(gpsTraceAim[0].x)<1.0) {
  1174. vehState = normalRun;
  1175. // useFrenet = false;
  1176. // useOldAvoid = true;
  1177. }
  1178. else if (useOldAvoid && avoidDistance>35) { //zj 2021.06.21 gpsTraceNow[60].x)<0.02
  1179. // vehState = avoidObs; 0929
  1180. vehState = normalRun;
  1181. turnLampFlag=0;
  1182. }
  1183. else if (turnLampFlag>0)
  1184. {
  1185. gps_decition->leftlamp = false;
  1186. gps_decition->rightlamp = true;
  1187. }
  1188. else if(turnLampFlag<0)
  1189. {
  1190. gps_decition->leftlamp = true;
  1191. gps_decition->rightlamp = false;
  1192. }
  1193. }
  1194. if (vehState==preBack)
  1195. {
  1196. vehState = backOri;
  1197. }
  1198. if (vehState==backOri)
  1199. {
  1200. double backDistance=GetDistance(startBackGpsIns,now_gps_ins);
  1201. //若车辆到达变道后的路径,改变车辆状态,关闭frenet规划
  1202. if (useFrenet && abs(gpsTraceAim[0].x)<1.0) {
  1203. vehState = normalRun;
  1204. turnLampFlag=0;
  1205. // useFrenet = false;
  1206. // useOldAvoid = true;
  1207. }
  1208. else if (useOldAvoid && backDistance>35 ) {//abs(gpsTraceNow[60].x)<0.05
  1209. // vehState = avoidObs; 0929
  1210. vehState = normalRun;
  1211. obstacle_avoid_flag=0;
  1212. }
  1213. else if (turnLampFlag>0)
  1214. {
  1215. gps_decition->leftlamp = false;
  1216. gps_decition->rightlamp = true;
  1217. }
  1218. else if (turnLampFlag<0)
  1219. {
  1220. gps_decition->leftlamp = true;
  1221. gps_decition->rightlamp = false;
  1222. }
  1223. }
  1224. std::cout<<"\n原始RoadOri:%d\n"<<roadOri<<endl;
  1225. // 计算回归原始路线
  1226. if ((roadNow!=roadOri))
  1227. {
  1228. if(useFrenet){
  1229. if ((GetDistance(now_gps_ins, startAvoidGpsInsVector[roadOri])>max(avoidMinDistanceVector[roadOri],30.0)))
  1230. {
  1231. double offsetL = -(roadSum - 1)*roadWidth;
  1232. double offsetR = (roadOri - 0)*roadWidth;
  1233. roadPre = frenetPlanner->chooseRoadByFrenet(now_gps_ins,gpsMapLine,PathPoint,offsetL,offsetR,lidarGridPtr,roadNow);
  1234. }
  1235. }
  1236. else if(useOldAvoid){
  1237. roadPre = chooseBackRoad(lidarGridPtr, now_gps_ins, gpsMapLine,lidar_per);
  1238. // avoidX = (roadOri - roadNow)*roadWidth; //1012
  1239. avoidX=computeAvoidX(roadNow,roadOri,gpsMapLine[PathPoint],ServiceCarStatus.msysparam.vehWidth);
  1240. }
  1241. }
  1242. if ((roadNow != roadOri && roadPre!=-1))
  1243. {
  1244. roadNow = roadPre;
  1245. // avoidX = (roadOri - roadNow)*roadWidth;
  1246. avoidX=computeAvoidX(roadNow,roadOri,gpsMapLine[PathPoint],ServiceCarStatus.msysparam.vehWidth);
  1247. if(avoidX<0)
  1248. turnLampFlag<0;
  1249. else if(avoidX>0)
  1250. turnLampFlag>0;
  1251. else
  1252. turnLampFlag=0;
  1253. if(useOldAvoid){
  1254. //gpsTraceNow = getGpsTraceOffset(gpsTraceOri, avoidX);
  1255. gpsTraceAvoidXY.clear();
  1256. gpsTraceAvoidXY = getGpsTraceOffsetBackOri(gpsTraceOri, avoidX,now_gps_ins,gpsTraceNow);
  1257. startBackGpsIns = now_gps_ins;
  1258. }
  1259. else if(useFrenet){
  1260. gpsTraceNow = frenetPlanner->getPath(now_gps_ins,gpsMapLine,PathPoint,avoidX,lidarGridPtr);
  1261. }
  1262. vehState = backOri;
  1263. hasCheckedBackLidar = false;
  1264. // checkBackObsTimes = 0;
  1265. cout<<"\n回归RoadNum:%d\n"<< roadNow<<endl;
  1266. }
  1267. static bool avoid_speed_flag=false;
  1268. /*if(obsDistance>0&& (obsDistance<ServiceCarStatus.aocfDis+10)&&(abs(realspeed)>0.5)&&
  1269. (vehState==normalRun) &&(ObsTimeStart==-1)//&&(obs_speed_for_avoid<0.6)
  1270. && (gpsMapLine[PathPoint]->runMode==1)&&(gpsMapLine[PathPoint]->mode2!=3000))
  1271. {
  1272. minDecelerate=-0.4;
  1273. avoid_speed_flag=true;
  1274. }*/
  1275. //shiyanbizhang 0929
  1276. if(obsDistance>0&& (obsDistance<ServiceCarStatus.aocfDis)&&(obs_speed_for_avoid>-8.0)&&(obs_speed_for_avoid<3.0)&&(realspeed>1)//&& (avoid_speed_flag==true) //
  1277. &&(vehState==normalRun||vehState==backOri || vehState==avoiding) //&&(ObsTimeStart==-1)
  1278. && (gpsMapLine[PathPoint]->runMode==1)&&(gpsMapLine[PathPoint]->mode2!=3000)&&(gpsMapLine[PathPoint+300]->mode2!=3000)&&(gpsMapLine[PathPoint+100]->mode2!=3000)&&(gpsMapLine[PathPoint+300]->mode2!=23)){
  1279. // ObsTimeStart=GetTickCount();
  1280. ObsTimeEnd+=1.0;
  1281. //dSpeed = min(6.0,dSpeed);
  1282. cout<<"\n====================preAvoid time count start==================\n"<<endl;
  1283. }
  1284. // if(ObsTimeStart!=-1){
  1285. // ObsTimeEnd=GetTickCount();
  1286. // }
  1287. // if(ObsTimeEnd!=-1){
  1288. // ObsTimeSpan=ObsTimeEnd-ObsTimeStart;
  1289. // }
  1290. // if(ObsTimeSpan>ObsTimeWidth &&(obsDistance>1.5||obsDistance<0) && (gpsMapLine[PathPoint]->runMode==1)){ //1026
  1291. // vehState=avoidObs;
  1292. // ObsTimeStart=-1;
  1293. // ObsTimeEnd=-1;
  1294. // ObsTimeSpan=-1;
  1295. // avoid_speed_flag=false;
  1296. // cout<<"\n====================preAvoid time count finish==================\n"<<endl;
  1297. // }
  1298. // if((ObsTimeStart!=-1)&&(obs_speed_for_avoid>-8.0)&&(obs_speed_for_avoid<3.0)){
  1299. // ObsTimeEnd+=1.0;
  1300. // }
  1301. if(ObsTimeEnd>ObsTimeWidth &&(obsDistance>1.5||obsDistance<0) && (gpsMapLine[PathPoint]->runMode==1)){ //1026
  1302. vehState=avoidObs;
  1303. ObsTimeStart=-1;
  1304. ObsTimeEnd=-1;
  1305. ObsTimeSpan=-1;
  1306. avoid_speed_flag=false;
  1307. cout<<"\n====================preAvoid time count finish==================\n"<<endl;
  1308. }
  1309. if(obsDistance<0 ||obsDistance>ServiceCarStatus.aocfDis){
  1310. ObsTimeStart=-1;
  1311. ObsTimeEnd=-1;
  1312. ObsTimeSpan=-1;
  1313. avoid_speed_flag=false;
  1314. }
  1315. //避障模式
  1316. if (vehState == avoidObs || vehState==waitAvoid ) {
  1317. // if (obsDistance <20 && obsDistance >0)
  1318. if (obsDistance <ServiceCarStatus.aocfDis && obsDistance >0)
  1319. {
  1320. dSpeed = min(6.0,dSpeed);
  1321. avoidTimes++;
  1322. // if (avoidTimes>=6)
  1323. if (avoidTimes>=ServiceCarStatus.aocfTimes)
  1324. {
  1325. vehState = preAvoid;
  1326. avoidTimes = 0;
  1327. }
  1328. }
  1329. // else if (obsDistance < 35 && obsDistance >0 && dSpeed>10)
  1330. // {
  1331. // dSpeed = 10;
  1332. // avoidTimes = 0;
  1333. // }
  1334. else if (obsDistance < 40 && obsDistance >0 && dSpeed>15)
  1335. {
  1336. dSpeed = min(15.0,dSpeed);
  1337. avoidTimes = 0;
  1338. }
  1339. else
  1340. {
  1341. avoidTimes = 0;
  1342. }
  1343. }
  1344. //givlog->debug("brain_decition","mfRoadwidth: %f",
  1345. //gpsMapLine[PathPoint]->mfLaneWidth );
  1346. if (vehState == preAvoid)
  1347. {
  1348. cout<<"\n====================preAvoid==================\n"<<endl;
  1349. /* if (obsDisVector[roadNow]>30)*/ //if (obsDisVector[roadNow]>30||obsDisVector[roadNow]<0)
  1350. if (obsDisVector[roadNow]>ServiceCarStatus.aocfDis)
  1351. {
  1352. // vehState = avoidObs; 0929
  1353. vehState=normalRun;
  1354. }
  1355. else
  1356. {
  1357. //roadPre = chooseAvoidRoad(lidarGridPtr, now_gps_ins,gpsMapLine);
  1358. if(useOldAvoid){
  1359. roadPre = chooseAvoidRoad(lidarGridPtr, now_gps_ins,gpsMapLine,lidar_per);
  1360. // avoidX = (roadOri - roadNow)*roadWidth; //1012
  1361. avoidX=computeAvoidX(roadNow,roadOri,gpsMapLine[PathPoint],ServiceCarStatus.msysparam.vehWidth);
  1362. }
  1363. else if(useFrenet){
  1364. double offsetL = -(roadSum - 1)*roadWidth;
  1365. double offsetR = (roadOri - 0)*roadWidth;
  1366. roadPre = frenetPlanner->chooseRoadByFrenet(now_gps_ins,gpsMapLine,PathPoint,offsetL,offsetR,lidarGridPtr,roadNow);
  1367. }
  1368. if (roadPre == -1 && obsDisVector[roadNow]<1.5 && obsDisVector[roadNow]>0)
  1369. {
  1370. // vehState = waitAvoid; 0929
  1371. vehState = avoidObs;
  1372. }
  1373. else if (roadPre != -1)
  1374. {
  1375. if(useOldAvoid){
  1376. roadNow = roadPre;
  1377. // avoidX = (roadOri - roadNow)*roadWidth;
  1378. avoidX=computeAvoidX(roadNow,roadOri,gpsMapLine[PathPoint],ServiceCarStatus.msysparam.vehWidth);
  1379. if(avoidX<0)
  1380. turnLampFlag<0;
  1381. else if(avoidX>0)
  1382. turnLampFlag>0;
  1383. else
  1384. turnLampFlag=0;
  1385. gpsTraceNow.clear();
  1386. //gpsTraceNow = getGpsTraceOffset(gpsTraceOri, avoidX);
  1387. gpsTraceAvoidXY.clear();
  1388. gpsTraceAvoidXY = getGpsTraceOffsetAvoid(gpsTraceOri, avoidX,now_gps_ins);
  1389. startAvoidGpsIns = now_gps_ins;
  1390. }
  1391. else if(useFrenet){
  1392. if(roadPre != roadNow){
  1393. avoidMinDistanceVector[roadNow] = obsDisVector[roadNow] + ServiceCarStatus.msysparam.vehLenth;
  1394. startAvoidGpsInsVector[roadNow] = now_gps_ins;
  1395. }
  1396. roadNow = roadPre;
  1397. // avoidX = (roadOri - roadNow)*roadWidth;
  1398. avoidX=computeAvoidX(roadNow,roadOri,gpsMapLine[PathPoint],ServiceCarStatus.msysparam.vehWidth);
  1399. gpsTraceNow = frenetPlanner->getPath(now_gps_ins,gpsMapLine,PathPoint,avoidX,lidarGridPtr);
  1400. }
  1401. vehState = avoiding;
  1402. obstacle_avoid_flag=1;
  1403. hasCheckedAvoidLidar = false;
  1404. cout<<"\n避障到RoadNum:%d\n"<<roadNow<<endl;
  1405. }
  1406. }
  1407. }
  1408. //--------------------------------------------------------------------------------old_bz_end
  1409. if (parkMode)
  1410. {
  1411. minDecelerate=-1.0;
  1412. if(finishPointNum<0||finishPointNum>=gpsMapLine.size()){
  1413. parkMode=false;
  1414. }else if(GetDistance(now_gps_ins, *gpsMapLine[finishPointNum])>20){
  1415. parkMode=false;
  1416. }
  1417. }
  1418. //驻车
  1419. if (zhucheMode)
  1420. {
  1421. int mzcTime = ServiceCarStatus.msysparam.mzhuchetime * 1000;
  1422. // if(trumpet()<16000)
  1423. if (trumpet()<mzcTime)
  1424. {
  1425. // if (trumpet()<12000){
  1426. cout<<"ZHECHE ING STATE+++++++++++++++++++++++++++++++++"<<endl;
  1427. minDecelerate=-1.0;
  1428. if(abs(realspeed)<0.2){
  1429. controlAng=0; //tju
  1430. }
  1431. }
  1432. else
  1433. {
  1434. hasZhuched = true; //1125
  1435. zhucheMode = false;
  1436. trumpetFirstCount = true;
  1437. cout<<"ZHECHE STATE JIESHU +++++++++++++++++++++++++++++++++"<<endl;
  1438. }
  1439. }
  1440. //判断驻车标志位
  1441. if (hasZhuched && GetDistance(now_gps_ins,*gpsMapLine[zhuchePointNum])>20)
  1442. {
  1443. hasZhuched = false;
  1444. }
  1445. if ( vehState==changingRoad || vehState==chaocheBack)
  1446. {
  1447. double lastAng = 0.0 - lastAngle;
  1448. if(ServiceCarStatus.msysparam.mvehtype !="zhongche"){
  1449. if (controlAng>40)
  1450. {
  1451. controlAng =40;
  1452. }
  1453. else if (controlAng<-40)
  1454. {
  1455. controlAng = - 40;
  1456. }
  1457. }
  1458. }
  1459. //速度结合角度的限制
  1460. controlAng = limitAngle(realspeed, controlAng);
  1461. std::cout << "\n呼车指令状态:%d\n" << ServiceCarStatus.carState << std::endl;
  1462. //1220
  1463. if(PathPoint+80<gpsMapLine.size()-1){
  1464. if(gpsMapLine[PathPoint+80]->roadMode==4 && !ServiceCarStatus.daocheMode){
  1465. changingDangWei=true;
  1466. }
  1467. }
  1468. if(changingDangWei){
  1469. if(abs(realspeed)>0.1){
  1470. dSpeed=0;
  1471. }else{
  1472. dSpeed=0;
  1473. gps_decition->dangWei=2;
  1474. ServiceCarStatus.daocheMode=true;
  1475. }
  1476. }
  1477. //1220 end
  1478. for(int i = 0;i<ServiceCarStatus.car_stations.size();i++)
  1479. {
  1480. GPS_INS gpsIns;
  1481. GaussProjCal(ServiceCarStatus.car_stations[i].longtitude, ServiceCarStatus.car_stations[i].latitude, &gpsIns.gps_x, &gpsIns.gps_y);
  1482. double dis = GetDistance(gpsIns, now_gps_ins);
  1483. if(dis<20)
  1484. ServiceCarStatus.currentstation = ServiceCarStatus.car_stations[i].ID;
  1485. }
  1486. if (ServiceCarStatus.carState == 0 && busMode)
  1487. {
  1488. minDecelerate=-1.0;
  1489. }
  1490. if (ServiceCarStatus.carState == 3 && busMode)
  1491. {
  1492. if(realspeed<0.1){
  1493. ServiceCarStatus.carState=0;
  1494. minDecelerate=-1.0;
  1495. }else{
  1496. nearStation=true;
  1497. dSpeed=0;
  1498. }
  1499. }
  1500. ///kkcai, 2020-01-03
  1501. //if (ServiceCarStatus.carState == 2 && busMode)
  1502. if (ServiceCarStatus.carState == 2)
  1503. {
  1504. aim_gps_ins.gps_lat=ServiceCarStatus.amilat;
  1505. aim_gps_ins.gps_lng=ServiceCarStatus.amilng;
  1506. // gps2xy(ServiceCarStatus.amilat, ServiceCarStatus.amilng, &aim_gps_ins.gps_x, &aim_gps_ins.gps_y);
  1507. GaussProjCal( aim_gps_ins.gps_lng, aim_gps_ins.gps_lat, &aim_gps_ins.gps_x, &aim_gps_ins.gps_y);
  1508. std::cout<<"lng"<<ServiceCarStatus.amilng<<std::endl;
  1509. qDebug("lat:%f", aim_gps_ins.gps_lat);
  1510. qDebug("lon:%f", aim_gps_ins.gps_lng);
  1511. std::cout<<"lat"<<ServiceCarStatus.amilat<<std::endl;
  1512. double dis = GetDistance(aim_gps_ins, now_gps_ins);
  1513. Point2D pt = Coordinate_Transfer((aim_gps_ins).gps_x, (aim_gps_ins).gps_y, now_gps_ins);
  1514. std::cout << "\n呼车dis距离:%f\n" << dis << std::endl;
  1515. std::cout << "\n呼车Y距离:%f\n" << pt.y << std::endl;
  1516. // if (dis<20 && pt.y<8&& realspeed<0.1)
  1517. if (dis<20 && pt.y<5 && abs(pt.x)<3)
  1518. {
  1519. dSpeed = 0;
  1520. nearStation=true;
  1521. //is_arrivaled = true;
  1522. //ServiceCarStatus.status[0] = true;
  1523. ServiceCarStatus.istostation=1;
  1524. minDecelerate=-1.0;
  1525. }
  1526. else if (dis<20 && pt.y<15 && abs(pt.x)<3)
  1527. {
  1528. nearStation=true;
  1529. dSpeed = min(8.0, dSpeed);
  1530. }
  1531. else if (dis<30 && pt.y<20 && abs(pt.x)<3)
  1532. {
  1533. dSpeed = min(15.0, dSpeed);
  1534. }
  1535. else if (dis<50 && abs(pt.x)<3)
  1536. {
  1537. dSpeed = min(20.0, dSpeed);
  1538. }
  1539. }
  1540. dSecSpeed = dSpeed / 3.6;
  1541. gps_decition->speed = dSpeed;
  1542. if (gpsMapLine[PathPoint]->runMode == 2)
  1543. {
  1544. obsDistance = -1;
  1545. }
  1546. std::cout<<"juecesudu0="<<dSpeed<<std::endl;
  1547. //-----------------------------------------1+X采集车车路协同,add---------------------------------------------
  1548. unsigned char traffic_type=0;//路况信息
  1549. unsigned char warning_type=0;//预警信息,RSU获得
  1550. float distance_to_center=0;
  1551. float radiation_distance=0;//事件辐射范围,从RSU获得
  1552. float limit_spd=0; //从RSU获得的限速值
  1553. //以上变量信息都需要存储到log文件中
  1554. // distance_to_center=GetDistance(now_gps_ins,gps_center);//因为是长直道路所以直接计算事件中心点和当前位置的距离即可
  1555. if((traffic_type==0x01)||(traffic_type==0x02)||(traffic_type==0x03))//塌方,施工,道路结冰,事件范围外10米缓慢减速,事件范围内停车
  1556. {
  1557. if((distance_to_center>=radiation_distance)&&(distance_to_center<=radiation_distance+10))
  1558. {
  1559. dSpeed = min(1.0,realspeed-0.5);
  1560. }
  1561. else if(distance_to_center<radiation_distance)
  1562. {
  1563. dSpeed=0.0;
  1564. minDecelerate=-2.0;
  1565. }
  1566. else
  1567. {}
  1568. }
  1569. else if(traffic_type==0x04)//如果事件类型是限速,则在辐射范围内限速,辐射范围外正常行驶
  1570. {
  1571. if(distance_to_center<radiation_distance)
  1572. {
  1573. dSpeed=min((double)limit_spd,realspeed-0.5);
  1574. }
  1575. }
  1576. //碰撞预警,1减速,2 停车
  1577. if(warning_type==0x01)
  1578. {
  1579. dSpeed=limit_spd;//此处要判断限速值是不是在有效值范围以内
  1580. }
  1581. else if(warning_type==0x01)
  1582. {
  1583. dSpeed=0.0;
  1584. }
  1585. //-----------------------------------------1+X采集车车路协同,end---------------------------------------------
  1586. //-------------------------------traffic light----------------------------------------------------------------------------------------
  1587. if(traffic_light_gps.gps_lat!=0 && traffic_light_gps.gps_lng!=0){
  1588. traffic_light_pathpoint = Compute00().getNoAngleNearestPointIndex(traffic_light_gps, gpsMapLine);
  1589. // traffic_light_pathpoint=130;
  1590. float traffic_speed=ComputeTrafficLightSpeed(ServiceCarStatus.iTrafficeLightColor,ServiceCarStatus.iTrafficeLightTime,gpsMapLine,
  1591. traffic_light_pathpoint ,PathPoint,secSpeed,dSpeed);
  1592. dSpeed = min((double)traffic_speed,dSpeed);
  1593. if(traffic_speed==0){
  1594. minDecelerate=-2.0;
  1595. }
  1596. }
  1597. //-------------------------------traffic light end-----------------------------------------------------------------------------------------------
  1598. //-------------------------------v2x traffic light-----------------------------------------------------------------------------------------
  1599. //vbox传递的红绿灯信息中,1是绿灯,2是红灯,3是黄灯
  1600. double v2xTrafficSpeed= ComputeV2XTrafficLightSpeed( trafficLight, gpsMapLine, v2xTrafficVector,
  1601. PathPoint, secSpeed, dSpeed, circleMode);
  1602. dSpeed = min(v2xTrafficSpeed,dSpeed);//???这里是不是应该是max,因为V2Xspeed应该是穿过红绿灯的最低速度吧?速度还不能超过当前的限速,如果V2Xspeed超过限速,需要判断车辆是否要
  1603. //停车?
  1604. //------------------------------v2x traffic light end--------------------------------------------------------------------------------------
  1605. transferGpsMode2(gpsMapLine);
  1606. // if(ServiceCarStatus.msysparam.mvehtype=="hapo"){
  1607. // if(obsDistance>0 && obsDistance<8){
  1608. // dSpeed=0;
  1609. // }
  1610. // }else if(obsDistance>0 && obsDistance<15){
  1611. // dSpeed=0;
  1612. // }
  1613. // if(ServiceCarStatus.group_control){
  1614. // dSpeed = ServiceCarStatus.group_comm_speed;
  1615. // }
  1616. // if(dSpeed==0){
  1617. // if(realspeed<6)
  1618. // minDecelerate=min(-0.5f,minDecelerate);
  1619. // else
  1620. // minDecelerate=min(-0.6f,minDecelerate); //1.0f zj-0.6
  1621. // }
  1622. gps_decition->wheel_angle = 0.0 - controlAng;
  1623. //需要增加接收到路册单元限速或停车的命令后对dspeed或这minDecelerate做进一步限制,仅限于hunter车辆
  1624. //当收到停车命令后,直接给出最小减速度
  1625. //收到减速命令后,直接将目标速度给成限速值
  1626. phaseSpeedDecition(gps_decition, secSpeed, obsDistance, obsSpeed,now_gps_ins);
  1627. givlog->debug("decition_brain","vehState: %d,PathPoint: %d,dSpeed: %f,obsDistance: %f,obsSpeed: %f,realspeed: %f,minDecelerate: %f,torque: %f,brake: %f,wheel_angle: %f,obs_speed_for_avoid: %f,mode2: %d",
  1628. vehState,PathPoint,dSpeed,obsDistance,obsSpeed,realspeed,minDecelerate,gps_decition->torque,gps_decition->brake,gps_decition->wheel_angle,obs_speed_for_avoid,gpsMapLine[PathPoint]->mode2);
  1629. //shuju cunchu gognnenng add,20210624,cxw
  1630. if(ServiceCarStatus.txt_log_on==true)
  1631. {
  1632. // static int file_num=0;
  1633. // double dis1 = GetDistance(now_gps_ins, *gpsMapLine[0]);
  1634. // double dis2 = GetDistance(now_gps_ins, *gpsMapLine[gpsMapLine.size()-1]);
  1635. if(first_start_en)
  1636. {
  1637. first_start_en=false;
  1638. start_tracepoint = PathPoint;
  1639. if(start_tracepoint==0)
  1640. {
  1641. end_tracepoint =gpsMapLine.size()-1;
  1642. }
  1643. else
  1644. {
  1645. end_tracepoint=start_tracepoint-1;
  1646. }
  1647. }
  1648. double dis1 = GetDistance(now_gps_ins, *gpsMapLine[start_tracepoint]);
  1649. double dis2 = GetDistance(now_gps_ins, *gpsMapLine[end_tracepoint]);
  1650. if(circleMode)//闭环地图
  1651. {
  1652. if(dis1<3&&dis2<3&&circleMode) //距离不能太小,太小了可能会错过,所以适当将距离增大一些
  1653. // if(dis1<1&&dis2<1&&circleMode)
  1654. {
  1655. file_cnt_add_en=true; //201200102
  1656. }
  1657. else
  1658. {
  1659. file_cnt_add_en=false;
  1660. }
  1661. if(dis1>10)
  1662. {
  1663. file_cnt_add=true;
  1664. }
  1665. if(file_cnt_add_en&&file_num<256&&file_cnt_add)
  1666. {
  1667. file_num++;
  1668. file_cnt_add=false;
  1669. map_start_point=true;
  1670. }
  1671. if(file_num==256)
  1672. {
  1673. file_num=1;
  1674. }
  1675. else
  1676. {
  1677. }
  1678. QDateTime dt=QDateTime::currentDateTime();
  1679. QString date =dt.toString("yyyy_MM_dd_hhmm");
  1680. QString strsen = "datalog_";
  1681. date.append(strsen);
  1682. QString s = QString::number(file_num);
  1683. date.append(s);
  1684. date.append(".txt");
  1685. string filename;
  1686. filename=date.toStdString();
  1687. ofstream outfile;
  1688. outfile.open(filename, ostream::app);
  1689. if((file_cnt_add==false)&&(map_start_point==true))
  1690. {
  1691. QDateTime dt=QDateTime::currentDateTime();
  1692. outfile<<dt.date().year()<<"-"<<dt.date().month()<<"-"<<dt.date().day()<<" "<<dt.time().hour()<<":"
  1693. <<dt.time().minute()<<":"<<dt.time().second()<<"-"<<dt.time().msec()
  1694. <<endl;
  1695. outfile<<"***********************the vehicle at map start point!*************************"<<endl;
  1696. outfile<<"the number of lap is "<<": "<<file_num<<""<<endl;
  1697. map_start_point=false;
  1698. }
  1699. QDateTime dt2=QDateTime::currentDateTime();
  1700. outfile <<dt2.time().hour()<<":"<<dt2.time().minute()<<":"<<dt2.time().second()<<":"<<dt2.time().msec()<<","
  1701. <<"Decide_Dspeed" << "," <<setprecision(2)<<dSpeed<< ","
  1702. <<"Decide_ACC" << "," <<setprecision(2)<<gps_decition->torque<< ","
  1703. <<"Decide_Brake"<< "," <<gps_decition->brake<< ","
  1704. <<"Vehicle_RealSpd"<< "," <<setprecision(2)<<now_gps_ins.speed<< ","
  1705. <<"Decide_Angle"<< "," << setprecision(2)<<gps_decition->wheel_angle<< ","
  1706. <<"Vehicle_GPS_heading"<< ","<< setprecision(10)<<now_gps_ins.ins_heading_angle<< ","
  1707. <<"Vehicle_GPS_X"<< ","<< setprecision(10)<<now_gps_ins.gps_lat<< ","
  1708. <<"Vehicle_GPS_Y"<< ","<< setprecision(10)<<now_gps_ins.gps_lng<< ","
  1709. <<"Trace_Point"<< ","<<PathPoint<< ","
  1710. <<"OBS_Distance"<< ","<<obsDistance<< ","
  1711. <<"OBS_Speed"<< ","<<obsSpeed<< ","
  1712. <<endl;
  1713. outfile.close();
  1714. }
  1715. else //fei yuanxing luxian
  1716. {
  1717. if(dis1<3)
  1718. {
  1719. file_cnt_add_en=true; //201200102
  1720. }
  1721. else
  1722. {
  1723. file_cnt_add_en=false;
  1724. }
  1725. if(dis1>3)
  1726. {
  1727. file_cnt_add=true;
  1728. }
  1729. if(file_cnt_add_en&&file_num<256&&file_cnt_add)
  1730. {
  1731. file_num++;
  1732. file_cnt_add=false;
  1733. map_start_point=true;
  1734. }
  1735. if(file_num==256)//20210712
  1736. {
  1737. file_num=1;
  1738. }
  1739. else
  1740. {
  1741. }
  1742. QDateTime dt=QDateTime::currentDateTime();
  1743. QString date =dt.toString("yyyy_MM_dd_hhmm");
  1744. QString strsen = "datalog_";
  1745. date.append(strsen);
  1746. QString s = QString::number(file_num);
  1747. date.append(s);
  1748. date.append(".txt");
  1749. string filename;
  1750. filename=date.toStdString();
  1751. ofstream outfile;
  1752. outfile.open(filename, ostream::app);
  1753. if((file_cnt_add==false)&&(map_start_point==true))
  1754. {
  1755. QDateTime dt=QDateTime::currentDateTime();
  1756. outfile<<dt.date().year()<<"-"<<dt.date().month()<<"-"<<dt.date().day()<<" "<<dt.time().hour()<<":"<<dt.time().minute()<<":"<<dt.time().second()<<"-"<<dt.time().msec()
  1757. <<endl;
  1758. outfile<<"********the vehicle near map start point!********"<<endl;
  1759. outfile<<"the number of lap is "<<":" <<file_num<<""<<endl;
  1760. map_start_point=false;
  1761. }
  1762. if(dis2<3)
  1763. {
  1764. outfile<<"********the vehicle near map end point!********" <<endl;
  1765. QDateTime dt=QDateTime::currentDateTime();
  1766. outfile<<dt.date().year()<<"-"<<dt.date().month()<<"-"<<dt.date().day()<<" "<<dt.time().hour()<<":"<<dt.time().minute()<<":"<<dt.time().second()<<"-"<<dt.time().msec()
  1767. <<endl;
  1768. }
  1769. else
  1770. {
  1771. float ttc = 0-(obsDistance/obsSpeed);
  1772. QDateTime dt2=QDateTime::currentDateTime();
  1773. outfile <<dt2.time().hour()<<":"<<dt2.time().minute()<<":"<<dt2.time().second()<<":"<<dt2.time().msec()<<","
  1774. <<"Decide_Dspeed" << "," <<setprecision(2)<<dSpeed<< ","
  1775. <<"Decide_ACC" << "," <<setprecision(2)<<gps_decition->torque<< ","
  1776. <<"Decide_Brake"<< "," <<gps_decition->brake<< ","
  1777. <<"Vehicle_RealSpd"<< "," <<setprecision(2)<<now_gps_ins.speed<< ","
  1778. <<"OBS_Distance"<< ","<<obsDistance<< ","
  1779. <<"Min_Decelation"","<<minDecelerate<< ","
  1780. <<"Decide_Angle"<< "," << setprecision(2)<<gps_decition->wheel_angle<< ","
  1781. <<"Vehicle_GPS_heading"<< ","<< setprecision(10)<<now_gps_ins.ins_heading_angle<< ","
  1782. <<"Vehicle_GPS_X"<< ","<< setprecision(10)<<now_gps_ins.gps_lat<< ","
  1783. <<"Vehicle_GPS_Y"<< ","<< setprecision(10)<<now_gps_ins.gps_lng<< ","
  1784. <<"Trace_Point"<< ","<<PathPoint<< ","
  1785. <<"OBS_Speed"<< ","<<obsSpeed<< ","
  1786. <<"TTC"<< ","<<ttc<< ","
  1787. <<endl;
  1788. outfile.close();
  1789. }
  1790. }
  1791. givlog->debug("decition_brain","vehState: %d,PathPoint: %d,dSpeed: %f,obsDistance: %f,obsSpeed: %f,realspeed: %f,minDecelerate: %f,torque: %f,brake: %f,wheel_angle: %f",
  1792. vehState,PathPoint,dSpeed,obsDistance,obsSpeed,realspeed,minDecelerate,gps_decition->torque,gps_decition->brake,gps_decition->wheel_angle);
  1793. }
  1794. lastAngle=gps_decition->wheel_angle;
  1795. // qDebug("decide1 time is %d",xTime.elapsed());
  1796. return gps_decition;
  1797. }
  1798. void iv::decition::DecideGps00::initMethods(){
  1799. pid_Controller= new PIDController();
  1800. ge3_Adapter = new Ge3Adapter();
  1801. qingyuan_Adapter = new QingYuanAdapter();
  1802. vv7_Adapter = new VV7Adapter();
  1803. zhongche_Adapter = new ZhongcheAdapter();
  1804. bus_Adapter = new BusAdapter();
  1805. hapo_Adapter = new HapoAdapter();
  1806. hunter_Adapter = new HunterAdapter(); //20210903,cxw
  1807. mpid_Controller.reset(pid_Controller);
  1808. mge3_Adapter.reset(ge3_Adapter);
  1809. mqingyuan_Adapter.reset(qingyuan_Adapter);
  1810. mvv7_Adapter.reset(vv7_Adapter);
  1811. mzhongche_Adapter.reset(zhongche_Adapter);
  1812. mbus_Adapter.reset(bus_Adapter);
  1813. mhapo_Adapter.reset(hapo_Adapter);
  1814. mhunter_Adapter.reset(hunter_Adapter); //20210903,cxw
  1815. frenetPlanner = new FrenetPlanner();
  1816. // laneChangePlanner = new LaneChangePlanner();
  1817. mfrenetPlanner.reset(frenetPlanner);
  1818. // mlaneChangePlanner.reset(laneChangePlanner);
  1819. }
  1820. void iv::decition::DecideGps00::phaseSpeedDecition(iv::decition::Decition decition, double secSpeed, double obsDis, double obsSpeed, GPS_INS gpsIns ) {
  1821. pid_Controller->getControlDecition( gpsIns, gpsTraceNow, dSpeed, obsDis, obsSpeed, false, true, &decition);
  1822. if(ServiceCarStatus.msysparam.mvehtype=="ge3"){
  1823. ge3_Adapter->getAdapterDeciton(gpsIns, gpsTraceNow, dSpeed, obsDis,obsSpeed, decition->accelerator,ServiceCarStatus.mfCalAcc ,changingDangWei, &decition);
  1824. }else if( ServiceCarStatus.msysparam.mvehtype=="qingyuan"){
  1825. qingyuan_Adapter->getAdapterDeciton(gpsIns, gpsTraceNow, dSpeed, obsDis,obsSpeed, decition->accelerator,ServiceCarStatus.mfCalAcc ,changingDangWei, &decition);
  1826. }else if( ServiceCarStatus.msysparam.mvehtype=="vv7"){
  1827. vv7_Adapter->getAdapterDeciton(gpsIns, gpsTraceNow, dSpeed, obsDis,obsSpeed, decition->accelerator,ServiceCarStatus.mfCalAcc ,changingDangWei, &decition);
  1828. }else if( ServiceCarStatus.msysparam.mvehtype=="zhongche"){
  1829. zhongche_Adapter->getAdapterDeciton(gpsIns, gpsTraceNow, dSpeed, obsDis,obsSpeed, decition->accelerator,ServiceCarStatus.mfCalAcc ,changingDangWei, &decition);
  1830. }else if(ServiceCarStatus.msysparam.mvehtype=="bus"){
  1831. bus_Adapter->getAdapterDeciton(gpsIns, gpsTraceNow, dSpeed, obsDis,obsSpeed, decition->accelerator,ServiceCarStatus.mfCalAcc ,changingDangWei, &decition);
  1832. }else if(ServiceCarStatus.msysparam.mvehtype=="hapo"){
  1833. hapo_Adapter->getAdapterDeciton(gpsIns, gpsTraceNow, dSpeed, obsDis,obsSpeed, decition->accelerator,ServiceCarStatus.mfCalAcc ,changingDangWei, &decition);
  1834. }else if(ServiceCarStatus.msysparam.mvehtype=="hunter"){
  1835. hunter_Adapter->getAdapterDeciton(gpsIns, gpsTraceNow, dSpeed, obsDis,obsSpeed, decition->accelerator,ServiceCarStatus.mfCalAcc ,changingDangWei, &decition);
  1836. }
  1837. }
  1838. std::vector<iv::Point2D> iv::decition::DecideGps00::getGpsTrace(iv::GPS_INS now_gps_ins, const std::vector<GPSData> gpsMapLine, int lastIndex, bool circleMode) {
  1839. vector<iv::Point2D> trace;
  1840. traceOriLeft.clear();
  1841. traceOriRight.clear();
  1842. if (gpsMapLine.size() > 800 && PathPoint >= 0) {
  1843. int aimIndex;
  1844. if(circleMode){
  1845. aimIndex=PathPoint+800;
  1846. }else{
  1847. aimIndex=min((PathPoint+800),(int)gpsMapLine.size());
  1848. }
  1849. for (int i = PathPoint; i < aimIndex; i++)
  1850. {
  1851. int index = i % gpsMapLine.size();
  1852. Point2D pt = Coordinate_Transfer((*gpsMapLine[index]).gps_x, (*gpsMapLine[index]).gps_y, now_gps_ins);
  1853. pt.x += offset_real * 0.032;
  1854. pt.v1 = (*gpsMapLine[index]).speed_mode;
  1855. pt.v2 = (*gpsMapLine[index]).mode2;
  1856. pt.roadMode=(*gpsMapLine[index]).roadMode;
  1857. if (gpsMapLine[index]->roadMode==3 && !hasZhuched)
  1858. {
  1859. readyZhucheMode = true;
  1860. DecideGps00::zhuchePointNum = index;
  1861. }
  1862. if (gpsMapLine[index]->roadMode==3 && !hasZhuched)
  1863. {
  1864. readyZhucheMode = true;
  1865. DecideGps00::zhuchePointNum = index;
  1866. }
  1867. //csvv7
  1868. if (gpsMapLine[index]->speed_mode==22 || gpsMapLine[index]->speed_mode==23)
  1869. {
  1870. readyParkMode = true;
  1871. DecideGps00::finishPointNum = index;
  1872. }
  1873. switch (pt.v1)
  1874. {
  1875. case 0:
  1876. pt.speed = 80;
  1877. break;
  1878. case 1:
  1879. pt.speed = 25;
  1880. break;
  1881. case 2:
  1882. pt.speed =25;
  1883. break;
  1884. case 3:
  1885. pt.speed = 20;
  1886. break;
  1887. case 4:
  1888. pt.speed =18;
  1889. break;
  1890. case 5:
  1891. pt.speed = 18;
  1892. break;
  1893. case 7:
  1894. pt.speed = 10;
  1895. break;
  1896. case 22:
  1897. pt.speed = 5;
  1898. break;
  1899. case 23:
  1900. pt.speed = 5;
  1901. break;
  1902. default:
  1903. break;
  1904. }
  1905. trace.push_back(pt);
  1906. double hdg=90 - (*gpsMapLine[index]).ins_heading_angle;
  1907. if(hdg < 0) hdg = hdg + 360;
  1908. if(hdg >= 360) hdg = hdg - 360;
  1909. double xyhdg = hdg/180.0*PI;
  1910. double ptLeft_x=(*gpsMapLine[index]).gps_x + ServiceCarStatus.msysparam.vehWidth / 2 * cos(xyhdg + PI / 2);
  1911. double ptLeft_y=(*gpsMapLine[index]).gps_y + ServiceCarStatus.msysparam.vehWidth / 2 * sin(xyhdg + PI / 2);
  1912. Point2D ptLeft = Coordinate_Transfer(ptLeft_x, ptLeft_y, now_gps_ins);
  1913. double ptRight_x=(*gpsMapLine[index]).gps_x + ServiceCarStatus.msysparam.vehWidth / 2 * cos(xyhdg - PI / 2);
  1914. double ptRight_y=(*gpsMapLine[index]).gps_y + ServiceCarStatus.msysparam.vehWidth / 2 * sin(xyhdg - PI / 2);
  1915. Point2D ptRight = Coordinate_Transfer(ptRight_x, ptRight_y, now_gps_ins);
  1916. traceOriLeft.push_back(ptLeft);
  1917. traceOriRight.push_back(ptRight);
  1918. }
  1919. }
  1920. return trace;
  1921. }
  1922. std::vector<iv::Point2D> iv::decition::DecideGps00::getGpsTraceAvoid(iv::GPS_INS now_gps_ins, const std::vector<Point2D> gpsTrace, int lastIndex, bool circleMode) {
  1923. vector<iv::Point2D> trace;
  1924. int index = -1;
  1925. float minDis = 10;
  1926. for (unsigned int i = 0; i < gpsTrace.size(); i++)
  1927. {
  1928. double tmpdis = sqrt((now_gps_ins.gps_x - gpsTrace[i].x) * (now_gps_ins.gps_x - gpsTrace[i].x) + (now_gps_ins.gps_y - gpsTrace[i].y) * (now_gps_ins.gps_y - gpsTrace[i].y));
  1929. if (tmpdis < minDis)
  1930. {
  1931. index = i;
  1932. minDis = tmpdis;
  1933. }
  1934. }
  1935. trace.clear();
  1936. if (index >= 0) {
  1937. for (unsigned int i = index; i < gpsTrace.size(); i++)
  1938. {
  1939. Point2D pt = Coordinate_Transfer(gpsTrace[i].x, gpsTrace[i].y, now_gps_ins);
  1940. trace.push_back(pt);
  1941. }
  1942. }
  1943. return trace;
  1944. }
  1945. std::vector<iv::Point2D> iv::decition::DecideGps00::getGpsTraceOffset(std::vector<Point2D> gpsTrace, double offset) {
  1946. if (offset==0)
  1947. {
  1948. return gpsTrace;
  1949. }
  1950. std::vector<iv::Point2D> trace;
  1951. for (int j = 0; j < gpsTrace.size(); j++)
  1952. {
  1953. double sumx1 = 0, sumy1 = 0, count1 = 0;
  1954. double sumx2 = 0, sumy2 = 0, count2 = 0;
  1955. for (int k = max(0, j - 4); k <= j; k++)
  1956. {
  1957. count1 = count1 + 1;
  1958. sumx1 += gpsTrace[k].x;
  1959. sumy1 += gpsTrace[k].y;
  1960. }
  1961. for (int k = j; k <= min(gpsTrace.size() - 1, (size_t)(j + 4)); k++)
  1962. {
  1963. count2 = count2 + 1;
  1964. sumx2 += gpsTrace[k].x;
  1965. sumy2 += gpsTrace[k].y;
  1966. }
  1967. sumx1 /= count1; sumy1 /= count1;
  1968. sumx2 /= count2; sumy2 /= count2;
  1969. double anglevalue = atan2(sumy2 - sumy1, sumx2 - sumx1);
  1970. double carFrontx = gpsTrace[j].x;// -Form1.CarRear * Math.Cos(anglevalue);
  1971. double carFronty = gpsTrace[j].y;// -Form1.CarRear * Math.Sin(anglevalue);
  1972. double avoidLenth = abs(offset);
  1973. if (offset<0)
  1974. {
  1975. Point2D ptLeft(carFrontx + avoidLenth * cos(anglevalue + PI / 2),
  1976. carFronty + avoidLenth * sin(anglevalue + PI / 2));
  1977. ptLeft.speed = gpsTrace[j].speed;
  1978. ptLeft.v1 = gpsTrace[j].v1;
  1979. ptLeft.v2 = gpsTrace[j].v2;
  1980. trace.push_back(ptLeft);
  1981. }
  1982. else
  1983. {
  1984. Point2D ptRight(carFrontx + avoidLenth * cos(anglevalue - PI / 2),
  1985. carFronty + avoidLenth * sin(anglevalue - PI / 2));
  1986. ptRight.speed = gpsTrace[j].speed;
  1987. ptRight.v1 = gpsTrace[j].v1;
  1988. ptRight.v2 = gpsTrace[j].v2;
  1989. trace.push_back(ptRight);
  1990. }
  1991. }
  1992. return trace;
  1993. }
  1994. void iv::decition::DecideGps00::getGpsTraceNowLeftRight(std::vector<Point2D> gpsTrace) {
  1995. for (int j = 0; j < gpsTrace.size(); j++)
  1996. {
  1997. double sumx1 = 0, sumy1 = 0, count1 = 0;
  1998. double sumx2 = 0, sumy2 = 0, count2 = 0;
  1999. for (int k = max(0, j - 4); k <= j; k++)
  2000. {
  2001. count1 = count1 + 1;
  2002. sumx1 += gpsTrace[k].x;
  2003. sumy1 += gpsTrace[k].y;
  2004. }
  2005. for (unsigned int k = j; k <= min(gpsTrace.size() - 1, (size_t)(j + 4)); k++)
  2006. {
  2007. count2 = count2 + 1;
  2008. sumx2 += gpsTrace[k].x;
  2009. sumy2 += gpsTrace[k].y;
  2010. }
  2011. sumx1 /= count1; sumy1 /= count1;
  2012. sumx2 /= count2; sumy2 /= count2;
  2013. double anglevalue = atan2(sumy2 - sumy1, sumx2 - sumx1);
  2014. double carFrontx = gpsTrace[j].x;// -Form1.CarRear * Math.Cos(anglevalue);
  2015. double carFronty = gpsTrace[j].y;// -Form1.CarRear * Math.Sin(anglevalue);
  2016. Point2D ptLeft(carFrontx + ServiceCarStatus.msysparam.vehWidth / 2 * cos(anglevalue + PI / 2),
  2017. carFronty + ServiceCarStatus.msysparam.vehWidth / 2 * sin(anglevalue + PI / 2));
  2018. Point2D ptRight(carFrontx + ServiceCarStatus.msysparam.vehWidth / 2 * cos(anglevalue - PI / 2),
  2019. carFronty + ServiceCarStatus.msysparam.vehWidth / 2 * sin(anglevalue - PI / 2));
  2020. gpsTraceNowLeft.push_back(ptLeft);
  2021. gpsTraceNowRight.push_back(ptRight);
  2022. }
  2023. }
  2024. std::vector<iv::Point2D> iv::decition::DecideGps00::getGpsTraceOffsetAvoid(std::vector<Point2D> gpsTrace, double offset,GPS_INS nowgps) {
  2025. if (offset==0)
  2026. {
  2027. return gpsTrace;
  2028. }
  2029. std::vector<iv::Point2D> trace;
  2030. std::vector<iv::Point2D> traceXY;
  2031. for (int j = 0; j < gpsTrace.size(); j++)
  2032. {
  2033. double sumx1 = 0, sumy1 = 0, count1 = 0;
  2034. double sumx2 = 0, sumy2 = 0, count2 = 0;
  2035. for (int k = max(0, j - 4); k <= j; k++)
  2036. {
  2037. count1 = count1 + 1;
  2038. sumx1 += gpsTrace[k].x;
  2039. sumy1 += gpsTrace[k].y;
  2040. }
  2041. for (int k = j; k <= min(gpsTrace.size() - 1, (size_t)(j + 4)); k++)
  2042. {
  2043. count2 = count2 + 1;
  2044. sumx2 += gpsTrace[k].x;
  2045. sumy2 += gpsTrace[k].y;
  2046. }
  2047. sumx1 /= count1; sumy1 /= count1;
  2048. sumx2 /= count2; sumy2 /= count2;
  2049. double anglevalue = atan2(sumy2 - sumy1, sumx2 - sumx1);
  2050. double carFrontx = gpsTrace[j].x;// -Form1.CarRear * Math.Cos(anglevalue);
  2051. double carFronty = gpsTrace[j].y;// -Form1.CarRear * Math.Sin(anglevalue);
  2052. double avoidLenth = abs(offset);
  2053. if (offset<0)
  2054. {
  2055. Point2D ptLeft(carFrontx + avoidLenth * cos(anglevalue + PI / 2),
  2056. carFronty + avoidLenth * sin(anglevalue + PI / 2));
  2057. ptLeft.speed = gpsTrace[j].speed;
  2058. ptLeft.v1 = gpsTrace[j].v1;
  2059. ptLeft.v2 = gpsTrace[j].v2;
  2060. trace.push_back(ptLeft);
  2061. }
  2062. else
  2063. {
  2064. Point2D ptRight(carFrontx + avoidLenth * cos(anglevalue - PI / 2),
  2065. carFronty + avoidLenth * sin(anglevalue - PI / 2));
  2066. ptRight.speed = gpsTrace[j].speed;
  2067. ptRight.v1 = gpsTrace[j].v1;
  2068. ptRight.v2 = gpsTrace[j].v2;
  2069. trace.push_back(ptRight);
  2070. }
  2071. }
  2072. bool use_new_method = true;
  2073. if (use_new_method)
  2074. {
  2075. const int val = 300;
  2076. if(trace.size()>val)
  2077. {
  2078. double V = trace[300].y;
  2079. for (int j = 0; j < val; j++)
  2080. {
  2081. double t = (double)j / val;
  2082. double s = t*t*(3.-2.*t);
  2083. double ox = s;
  2084. double oy = t *( V-3.0)+3.0;
  2085. trace[j].x=ox*trace[j].x;
  2086. trace[j].y=oy;
  2087. }
  2088. }
  2089. }
  2090. traceXY.clear();
  2091. for(int j=0;j<30;j++)
  2092. {
  2093. GPS_INS gpsxy = Coordinate_UnTransfer(gpsTrace[j].x,gpsTrace[j].y,nowgps);
  2094. Point2D gpsinxy(gpsxy.gps_x,gpsxy.gps_y);
  2095. traceXY.push_back(gpsinxy);
  2096. }
  2097. for(int j=0;j<trace.size();j++)
  2098. {
  2099. GPS_INS gpsxy = Coordinate_UnTransfer(trace[j].x,trace[j].y,nowgps);
  2100. Point2D gpsinxy(gpsxy.gps_x,gpsxy.gps_y);
  2101. traceXY.push_back(gpsinxy);
  2102. }
  2103. return traceXY;
  2104. }
  2105. std::vector<iv::Point2D> iv::decition::DecideGps00::getGpsTraceOffsetBackOri(std::vector<Point2D> gpsTrace, double offset,GPS_INS nowgps,std::vector<Point2D> gpsTraceNowNow) {
  2106. std::vector<iv::Point2D> trace;
  2107. std::vector<iv::Point2D> traceXY;
  2108. if (offset==0)
  2109. {
  2110. trace.assign(gpsTrace.begin(), gpsTrace.end());
  2111. }
  2112. else
  2113. {
  2114. for (int j = 0; j < gpsTrace.size(); j++)
  2115. {
  2116. double sumx1 = 0, sumy1 = 0, count1 = 0;
  2117. double sumx2 = 0, sumy2 = 0, count2 = 0;
  2118. for (int k = max(0, j - 4); k <= j; k++)
  2119. {
  2120. count1 = count1 + 1;
  2121. sumx1 += gpsTrace[k].x;
  2122. sumy1 += gpsTrace[k].y;
  2123. }
  2124. for (int k = j; k <= min(gpsTrace.size() - 1, (size_t)(j + 4)); k++)
  2125. {
  2126. count2 = count2 + 1;
  2127. sumx2 += gpsTrace[k].x;
  2128. sumy2 += gpsTrace[k].y;
  2129. }
  2130. sumx1 /= count1; sumy1 /= count1;
  2131. sumx2 /= count2; sumy2 /= count2;
  2132. double anglevalue = atan2(sumy2 - sumy1, sumx2 - sumx1);
  2133. double carFrontx = gpsTrace[j].x;// -Form1.CarRear * Math.Cos(anglevalue);
  2134. double carFronty = gpsTrace[j].y;// -Form1.CarRear * Math.Sin(anglevalue);
  2135. double avoidLenth = abs(offset);
  2136. if (offset<0)
  2137. {
  2138. Point2D ptLeft(carFrontx + avoidLenth * cos(anglevalue + PI / 2),
  2139. carFronty + avoidLenth * sin(anglevalue + PI / 2));
  2140. ptLeft.speed = gpsTrace[j].speed;
  2141. ptLeft.v1 = gpsTrace[j].v1;
  2142. ptLeft.v2 = gpsTrace[j].v2;
  2143. trace.push_back(ptLeft);
  2144. }
  2145. else
  2146. {
  2147. Point2D ptRight(carFrontx + avoidLenth * cos(anglevalue - PI / 2),
  2148. carFronty + avoidLenth * sin(anglevalue - PI / 2));
  2149. ptRight.speed = gpsTrace[j].speed;
  2150. ptRight.v1 = gpsTrace[j].v1;
  2151. ptRight.v2 = gpsTrace[j].v2;
  2152. trace.push_back(ptRight);
  2153. }
  2154. }
  2155. }
  2156. bool use_new_method = true;
  2157. if (use_new_method)
  2158. {
  2159. const int val = 300;
  2160. if(trace.size()>val)
  2161. {
  2162. double V = trace[300].y;
  2163. for (int j = 0; j < val; j++)
  2164. {
  2165. double t = (double)j / val;
  2166. double s = t*t*(3.-2.*t);
  2167. double ox = s;
  2168. double oy = t *( V-3.0)+3.0;
  2169. trace[j].x=ox*trace[j].x;
  2170. trace[j].y=oy;
  2171. }
  2172. }
  2173. }
  2174. traceXY.clear();
  2175. for(int j=0;j<30;j++)
  2176. {
  2177. GPS_INS gpsxy = Coordinate_UnTransfer(gpsTraceNowNow[j].x,gpsTraceNowNow[j].y,nowgps);
  2178. Point2D gpsinxy(gpsxy.gps_x,gpsxy.gps_y);
  2179. traceXY.push_back(gpsinxy);
  2180. }
  2181. for(int j=0;j<trace.size();j++)
  2182. {
  2183. GPS_INS gpsxy = Coordinate_UnTransfer(trace[j].x,trace[j].y,nowgps);
  2184. Point2D gpsinxy(gpsxy.gps_x,gpsxy.gps_y);
  2185. traceXY.push_back(gpsinxy);
  2186. }
  2187. return traceXY;
  2188. }
  2189. double iv::decition::DecideGps00::getAngle(std::vector<Point2D> gpsTrace,GPS_INS gpsIns,iv::decition::Decition decition) {
  2190. double angle=0;
  2191. if ( abs(iv::decition::DecideGps00().minDis) < 20 && abs(iv::decition::DecideGps00().maxAngle) < 100)
  2192. {
  2193. // angle = iv::decition::Compute00().getDecideAngle(gpsTrace, realspeed);
  2194. pid_Controller->getControlDecition(gpsIns, gpsTrace, -1, -1, -1, true, false, &decition);
  2195. angle= decition->wheel_angle;
  2196. }
  2197. return angle;
  2198. }
  2199. double iv::decition::DecideGps00::getSpeed(std::vector<Point2D> gpsTrace) {
  2200. double speed=0;
  2201. int speedPoint = iv::decition::Compute00().getSpeedPointIndex(gpsTrace, max(10.0, realspeed));
  2202. speed = gpsTrace[speedPoint].speed;
  2203. for (int i = 0; i < speedPoint; i++) {
  2204. speed = min(speed, gpsTrace[i].speed);
  2205. }
  2206. return speed;
  2207. }
  2208. //void iv::decition::DecideGps00::getEsrObs(std::vector<iv::ObstacleBasic> obsRadars) {
  2209. //
  2210. // if (!obsRadars.empty())
  2211. // {
  2212. // esrIndex = iv::decition::Compute00().getEsrIndex(gpsTrace, obsRadars);
  2213. //
  2214. // if (esrIndex != -1)
  2215. // {
  2216. // esrDistance = obsRadars[esrIndex].nomal_y;
  2217. //
  2218. //
  2219. //
  2220. // obsSpeed = obsRadars[esrIndex].speed_y;
  2221. //
  2222. // }
  2223. // else {
  2224. // esrDistance = -1;
  2225. // }
  2226. //
  2227. // }
  2228. // else
  2229. // {
  2230. // esrIndex = -1;
  2231. // esrDistance = -1;
  2232. // }
  2233. // if (esrDistance < 0) {
  2234. // ODS("\n------------------>ESR障碍物距离:%f\n", esrDistance);
  2235. // }
  2236. // else {
  2237. // ODS("\n------------------>ESR障碍物距离:%f ( %.05f , %.05f )\n", esrDistance, obsRadars[esrIndex].nomal_x, obsRadars[esrIndex].nomal_y);
  2238. // }
  2239. //
  2240. // ODS("\n------------------>ESR障碍物速度:%f\n", obsSpeed);
  2241. //}
  2242. void iv::decition::DecideGps00::getEsrObsDistance(std::vector<Point2D> gpsTrace, int roadNum) {
  2243. int esrPathpoint;
  2244. esrIndex = iv::decition::Compute00().getEsrIndex(gpsTrace, roadNum, &esrPathpoint);
  2245. if (esrIndex != -1)
  2246. {
  2247. //优化
  2248. // double distance = 0.0;
  2249. // for(int i=0; i<esrPathpoint; ++i){
  2250. // distance+=DirectDistance(gpsTrace[i].x,gpsTrace[i].y,gpsTrace[i+1].x,gpsTrace[i+1].y);
  2251. // }
  2252. // esrDistance = distance - Esr_Y_Offset;
  2253. // if(esrDistance<=0){
  2254. // esrDistance=1;
  2255. // }
  2256. esrDistance = ServiceCarStatus.obs_radar[esrIndex].nomal_y;
  2257. obsSpeed = ServiceCarStatus.obs_radar[esrIndex].speed_y;
  2258. }
  2259. else {
  2260. esrDistance = -1;
  2261. }
  2262. }
  2263. void iv::decition::DecideGps00::getEsrObsDistanceAvoid() {
  2264. esrIndexAvoid = iv::decition::Compute00().getEsrIndexAvoid(gpsTraceAvoid);
  2265. if (esrIndexAvoid != -1)
  2266. {
  2267. esrDistanceAvoid = ServiceCarStatus.obs_radar[esrIndexAvoid].nomal_y;
  2268. obsSpeedAvoid = ServiceCarStatus.obs_radar[esrIndexAvoid].speed_y;
  2269. }
  2270. else {
  2271. esrDistanceAvoid = -1;
  2272. }
  2273. if (esrDistanceAvoid < 0) {
  2274. std::cout << "\nESR障碍物距离Avoid:%f\n" << esrDistanceAvoid << std::endl;
  2275. }
  2276. else {
  2277. 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;
  2278. }
  2279. std::cout << "\nESR障碍物速度Avoid:%f\n" << obsSpeedAvoid <<std::endl;
  2280. }
  2281. double iv::decition::DecideGps00::limitAngle(double speed, double angle) {
  2282. double preAngle = angle;
  2283. if (speed > 15)
  2284. {
  2285. if (preAngle > 350)
  2286. {
  2287. preAngle = 350;
  2288. }
  2289. if (preAngle < -350)
  2290. {
  2291. preAngle = -350;
  2292. }
  2293. }
  2294. if (speed > 22)
  2295. {
  2296. if (preAngle > 200)
  2297. {
  2298. preAngle = 200;
  2299. }
  2300. if (preAngle < -200)
  2301. {
  2302. preAngle = -200;
  2303. }
  2304. }
  2305. if (speed > 25)
  2306. {
  2307. if (preAngle > 150)
  2308. {
  2309. preAngle = 150;
  2310. }
  2311. if (preAngle < -150)
  2312. {
  2313. preAngle = -150;
  2314. }
  2315. }
  2316. if (speed > 30)
  2317. {
  2318. if (preAngle > 70)
  2319. {
  2320. preAngle = 70;
  2321. }
  2322. if (preAngle < -70)
  2323. {
  2324. preAngle = -70;
  2325. }
  2326. }
  2327. if (speed > 45) //20
  2328. {
  2329. if (preAngle > 15)
  2330. {
  2331. preAngle = 15;
  2332. }
  2333. if (preAngle < -15)
  2334. {
  2335. preAngle = -15;
  2336. }
  2337. }
  2338. return preAngle;
  2339. }
  2340. double iv::decition::DecideGps00::limitSpeed(double angle, double speed) {
  2341. if (abs(angle) > 500 && speed > 8) speed = 8;
  2342. else if (abs(angle) > 350 && speed > 14) speed = 14;
  2343. else if (abs(angle) > 200 && speed > 21) speed = 21;
  2344. else if (abs(angle) > 150 && speed > 24) speed = 24;
  2345. else if (abs(angle) > 60 && speed > 29) speed = 29;
  2346. else if (abs(angle) > 20 && speed > 34) speed = 34;
  2347. return max(0.0, speed);
  2348. }
  2349. bool iv::decition::DecideGps00::checkAvoidEnable(double avoidX, iv::LidarGridPtr lidarGridPtr,int roadNum) {
  2350. if ((obsDisVector[roadNum]>0 && obsDisVector[roadNum]<obsDisVector[roadNow]+ServiceCarStatus.msysparam.vehLenth)||
  2351. (obsDisVector[roadNum]>0 && obsDisVector[roadNum]<15))
  2352. {
  2353. return false;
  2354. }
  2355. if (roadNum-roadNow>1)
  2356. {
  2357. for (int i = roadNow+1; i < roadNum; i++)
  2358. {
  2359. if (obsDisVector[i] < 8 + (i-roadNow) * 2 && obsDisVector[i]>0) {
  2360. return false;
  2361. }
  2362. }
  2363. }
  2364. else if (roadNow-roadNum>1)
  2365. {
  2366. for (int i = roadNow-1; i >roadNum; i--)
  2367. {
  2368. if (obsDisVector[i] < 8 + (roadNow-i) * 2 && obsDisVector[i]>0) {
  2369. return false;
  2370. }
  2371. }
  2372. }
  2373. return true;
  2374. }
  2375. bool iv::decition::DecideGps00::checkReturnEnable(double avoidX, iv::LidarGridPtr lidarGridPtr, int roadNum) {
  2376. //lsn
  2377. if (obsDisVector[roadNum]>0 && obsDisVector[roadNum]<20)
  2378. {
  2379. return false;
  2380. }
  2381. if ((obsDisVector[roadNum]>0 && obsDisVector[roadNum]<50 && obsDisVector[roadNum]< obsDisVector[roadNow]) ||
  2382. (obsDisVector[roadNum]>0 && obsDisVector[roadNum]<50 && obsDisVector[roadNow]<0))
  2383. {
  2384. return false;
  2385. }
  2386. if (roadNum - roadNow>1)
  2387. {
  2388. for (int i = roadNow + 1; i < roadNum; i++)
  2389. {
  2390. if (obsDisVector[i] < 8 + (i-roadNow) * 2 && obsDisVector[i]>0) {
  2391. return false;
  2392. }
  2393. }
  2394. }
  2395. else if (roadNow - roadNum>1)
  2396. {
  2397. for (int i = roadNow - 1; i >roadNum; i--)
  2398. {
  2399. if (obsDisVector[i] < 8 + (roadNow-i) * 2 && obsDisVector[i]>0) {
  2400. return false;
  2401. }
  2402. }
  2403. }
  2404. return true;
  2405. }
  2406. void iv::decition::DecideGps00::getObsAvoid(iv::LidarGridPtr lidarGridPtr) {
  2407. if (lidarGridPtr == NULL)
  2408. {
  2409. iv::decition::DecideGps00::lidarDistanceAvoid = iv::decition::DecideGps00::lastLidarDisAvoid;
  2410. }
  2411. else {
  2412. obsPointAvoid = Compute00().getLidarObsPointAvoid(gpsTraceAvoid, lidarGridPtr);
  2413. iv::decition::DecideGps00::lastLidarDisAvoid = iv::decition::DecideGps00::lidarDistanceAvoid;
  2414. }
  2415. std::cout << "\nLidarAvoid距离:%f\n" << iv::decition::DecideGps00::lidarDistanceAvoid << std::endl;
  2416. getEsrObsDistanceAvoid();
  2417. //lidarDistanceAvoid = -1; //20200103 apollo_fu
  2418. if (esrDistanceAvoid>0 && iv::decition::DecideGps00::lidarDistanceAvoid > 0)
  2419. {
  2420. if (iv::decition::DecideGps00::lidarDistanceAvoid >= esrDistanceAvoid)
  2421. {
  2422. obsDistanceAvoid = esrDistanceAvoid;
  2423. obsSpeedAvoid = ServiceCarStatus.obs_radar[esrIndexAvoid].speed_y;
  2424. }
  2425. else if (!ServiceCarStatus.obs_radar.empty())
  2426. {
  2427. obsDistanceAvoid = iv::decition::DecideGps00::lidarDistanceAvoid;
  2428. obsSpeedAvoid = Compute00().getObsSpeed(obsPointAvoid, secSpeed);
  2429. std::cout << "\n计算obsSpeed:%f\n" << obsSpeedAvoid << std::endl;
  2430. }
  2431. else
  2432. {
  2433. obsDistanceAvoid = iv::decition::DecideGps00::lidarDistanceAvoid;
  2434. obsSpeedAvoid = obsSpeedAvoid = 0 - secSpeed;;
  2435. std::cout << "\n毫米波无数据,计算obsSpeed:%f\n" << obsSpeedAvoid << std::endl;
  2436. }
  2437. }
  2438. else if (esrDistanceAvoid>0)
  2439. {
  2440. obsDistanceAvoid = esrDistanceAvoid;
  2441. obsSpeedAvoid = ServiceCarStatus.obs_radar[esrIndexAvoid].speed_y;
  2442. }
  2443. else if (iv::decition::DecideGps00::lidarDistanceAvoid > 0)
  2444. {
  2445. obsDistanceAvoid = iv::decition::DecideGps00::lidarDistanceAvoid;
  2446. obsSpeedAvoid = Compute00().getObsSpeed(obsPointAvoid, secSpeed);
  2447. std::cout << "\n计算obsSpeed:%f\n" << obsSpeedAvoid << std::endl;
  2448. }
  2449. else {
  2450. obsDistanceAvoid = esrDistanceAvoid;
  2451. obsSpeedAvoid = 0 - secSpeed;
  2452. }
  2453. std::cout << "\n最终得出的obsDistanceAvoid:%f\n" << obsDistanceAvoid << std::endl;
  2454. if (iv::decition::DecideGps00::obsDistanceAvoid <0 && obsLostTimeAvoid<4)
  2455. {
  2456. iv::decition::DecideGps00::obsDistanceAvoid = iv::decition::DecideGps00::lastDistanceAvoid;
  2457. obsLostTimeAvoid++;
  2458. }
  2459. else
  2460. {
  2461. obsLostTimeAvoid = 0;
  2462. iv::decition::DecideGps00::lastDistanceAvoid = -1;
  2463. }
  2464. if (obsDistanceAvoid>0)
  2465. {
  2466. iv::decition::DecideGps00::lastDistanceAvoid = obsDistanceAvoid;
  2467. }
  2468. std::cout << "\nODSAvoid距离:%f\n" << iv::decition::DecideGps00::obsDistanceAvoid << std::endl;
  2469. }
  2470. void iv::decition::DecideGps00::init() {
  2471. for (int i = 0; i < roadSum; i++)
  2472. {
  2473. lastEsrIdVector.push_back(-1);
  2474. lastEsrCountVector.push_back(0);
  2475. GPS_INS gps_ins;
  2476. gps_ins.gps_x = 0;
  2477. gps_ins.gps_y = 0;
  2478. startAvoidGpsInsVector.push_back(gps_ins);
  2479. avoidMinDistanceVector.push_back(0);
  2480. }
  2481. }
  2482. #include <QTime>
  2483. void iv::decition::DecideGps00::computeObsOnRoad(iv::LidarGridPtr lidarGridPtr, std::vector<Point2D> gpsTrace, int roadNum,
  2484. const std::vector<GPSData> gpsMapLine, std::vector<iv::Perception::PerceptionOutput> lidar_per) {
  2485. // QTime xTime;
  2486. // xTime.start();
  2487. // qDebug("time 0 is %d ",xTime.elapsed());
  2488. double obs,obsSd;
  2489. if (lidarGridPtr == NULL)
  2490. {
  2491. lidarDistance = lastLidarDis;
  2492. // lidarDistance = lastlidarDistance;
  2493. }
  2494. else {
  2495. obsPoint = Compute00().getLidarObsPoint(gpsTrace, lidarGridPtr);
  2496. float lidarXiuZheng=0;
  2497. if(!ServiceCarStatus.useMobileEye){
  2498. lidarXiuZheng=0-ServiceCarStatus.msysparam.frontGpsXiuzheng;
  2499. }
  2500. lidarDistance = obsPoint.y + lidarXiuZheng; //激光距离推到车头 gjw20191110 lidar
  2501. // lidarDistance=-1;
  2502. if (lidarDistance<0)
  2503. {
  2504. lidarDistance = -1;
  2505. }
  2506. lastLidarDis = lidarDistance;
  2507. }
  2508. if(lidarDistance<0){
  2509. lidarDistance=500;
  2510. }
  2511. std::cout <<ServiceCarStatus.mRunTime.elapsed()<<"ms:"<< "激光雷达距离:" << lidarDistance << std::endl;
  2512. ServiceCarStatus.mLidarObs = lidarDistance;
  2513. obs = lidarDistance;
  2514. obsSd= obsPoint.obs_speed_y;
  2515. if(ServiceCarStatus.useLidarPerPredict){
  2516. double preDis= predictObsOnRoad(lidar_per, gpsTrace, 1.0);
  2517. if (preDis<obs){
  2518. obs = preDis;
  2519. if(abs(obs-preDis>0.5)){
  2520. obsSd = 0-realspeed;
  2521. }
  2522. }
  2523. }
  2524. if(roadNum==roadNow){
  2525. obsDistance=obs;
  2526. obsSpeed=obsSd;
  2527. }
  2528. if(obsDistance<500&&obsDistance>0){
  2529. std::cout <<ServiceCarStatus.mRunTime.elapsed()<<"ms:"<< "obsDistance<500:" << obsDistance << std::endl;
  2530. }
  2531. std::cout <<ServiceCarStatus.mRunTime.elapsed()<<"ms:"<< "最终得出的obsDistance:" << obsDistance << std::endl;
  2532. ServiceCarStatus.mObs = obsDistance;
  2533. if(ServiceCarStatus.mObs>100){
  2534. ServiceCarStatus.mObs =-1;
  2535. }
  2536. if (obsDistance>0)
  2537. {
  2538. lastDistance = obsDistance;
  2539. }
  2540. //lsn
  2541. if(obs<0){
  2542. obsDisVector[roadNum]=500;
  2543. }else{
  2544. obsDisVector[roadNum]=obs;
  2545. }
  2546. // qDebug("time 3 is %d ",xTime.elapsed());
  2547. }
  2548. void iv::decition::DecideGps00::computeObsOnRoadXY(iv::LidarGridPtr lidarGridPtr, std::vector<Point2D> gpsTrace,std::vector<Point2D> gpsTraceLeft,std::vector<Point2D> gpsTraceRight,int roadNum,
  2549. const std::vector<GPSData> gpsMapLine, std::vector<iv::Perception::PerceptionOutput> lidar_per) {
  2550. // QTime xTime;
  2551. // xTime.start();
  2552. // qDebug("time 0 is %d ",xTime.elapsed());
  2553. double obs,obsSd;
  2554. if (lidarGridPtr == NULL)
  2555. {
  2556. lidarDistance = lastLidarDis;
  2557. // lidarDistance = lastlidarDistance;
  2558. }
  2559. else {
  2560. //obsPoint = Compute00().getLidarObsPoint(gpsTrace, lidarGridPtr);
  2561. obsPoint = Compute00().getLidarObsPointXY(gpsTrace,gpsTraceLeft,gpsTraceRight,lidarGridPtr);
  2562. float lidarXiuZheng=0;
  2563. if(!ServiceCarStatus.useMobileEye){
  2564. lidarXiuZheng=0-ServiceCarStatus.msysparam.frontGpsXiuzheng;
  2565. }
  2566. lidarDistance = obsPoint.y + lidarXiuZheng; //激光距离推到车头 gjw20191110 lidar
  2567. // lidarDistance=-1;
  2568. if (lidarDistance<0)
  2569. {
  2570. lidarDistance = -1;
  2571. }
  2572. lastLidarDis = lidarDistance;
  2573. }
  2574. if(lidarDistance<0){
  2575. lidarDistance=500;
  2576. }
  2577. std::cout <<ServiceCarStatus.mRunTime.elapsed()<<"ms:"<< "激光雷达距离:" << lidarDistance << std::endl;
  2578. ServiceCarStatus.mLidarObs = lidarDistance;
  2579. obs = lidarDistance;
  2580. obsSd= obsPoint.obs_speed_y;
  2581. if(ServiceCarStatus.useLidarPerPredict){
  2582. double preDis= predictObsOnRoad(lidar_per, gpsTrace, 1.0);
  2583. if (preDis<obs){
  2584. obs = preDis;
  2585. if(abs(obs-preDis>0.5)){
  2586. obsSd = 0-realspeed;
  2587. }
  2588. }
  2589. }
  2590. if(roadNum==roadNow){
  2591. obsDistance=obs;
  2592. obsSpeed=obsSd;
  2593. }
  2594. if(obsDistance<500&&obsDistance>0){
  2595. std::cout <<ServiceCarStatus.mRunTime.elapsed()<<"ms:"<< "obsDistance<500:" << obsDistance << std::endl;
  2596. }
  2597. std::cout <<ServiceCarStatus.mRunTime.elapsed()<<"ms:"<< "最终得出的obsDistance:" << obsDistance << std::endl;
  2598. ServiceCarStatus.mObs = obsDistance;
  2599. if(ServiceCarStatus.mObs>100){
  2600. ServiceCarStatus.mObs =-1;
  2601. }
  2602. if (obsDistance>0)
  2603. {
  2604. lastDistance = obsDistance;
  2605. }
  2606. //lsn
  2607. if(obs<0){
  2608. obsDisVector[roadNum]=500;
  2609. }else{
  2610. obsDisVector[roadNum]=obs;
  2611. }
  2612. // qDebug("time 3 is %d ",xTime.elapsed());
  2613. }
  2614. //1220
  2615. void iv::decition::DecideGps00::computeRearObsOnRoad(iv::LidarGridPtr lidarGridPtr, std::vector<Point2D> gpsTrace, int roadNum,
  2616. const std::vector<GPSData> gpsMapLine) {
  2617. double obs,obsSd;
  2618. if (lidarGridPtr == NULL)
  2619. {
  2620. lidarDistance = lastLidarDis;
  2621. // lidarDistance = lastlidarDistance;
  2622. }
  2623. else {
  2624. obsPoint = Compute00().getLidarRearObsPoint(gpsTrace, lidarGridPtr);
  2625. float lidarXiuZheng=0;
  2626. if(!ServiceCarStatus.useMobileEye){
  2627. lidarXiuZheng = ServiceCarStatus.msysparam.rearGpsXiuzheng;
  2628. }
  2629. if(abs(obsPoint.y)>lidarXiuZheng)
  2630. lidarDistance = abs(obsPoint.y)-lidarXiuZheng; //激光距离推到车头 1220
  2631. // lidarDistance=-1;
  2632. if (lidarDistance<0)
  2633. {
  2634. lidarDistance = -1;
  2635. }
  2636. lastLidarDis = lidarDistance;
  2637. }
  2638. if(lidarDistance<0){
  2639. lidarDistance=500;
  2640. }
  2641. std::cout <<ServiceCarStatus.mRunTime.elapsed()<<"ms:"<< "激光雷达距离:" << lidarDistance << std::endl;
  2642. if(lidarDistance==500){
  2643. lidarDistance=-1;
  2644. }
  2645. ServiceCarStatus.mLidarObs = lidarDistance;
  2646. obs=lidarDistance;
  2647. // obsSpeed = 0 - secSpeed;
  2648. obsSd = 0 -secSpeed;
  2649. if(roadNum==roadNow){
  2650. obsDistance=obs;
  2651. obsSpeed=obsSd;
  2652. }
  2653. if (obsDistance <0 && obsLostTime<4)
  2654. {
  2655. obsDistance = lastDistance;
  2656. obsLostTime++;
  2657. }
  2658. else
  2659. {
  2660. obsLostTime = 0;
  2661. lastDistance = -1;
  2662. }
  2663. std::cout <<ServiceCarStatus.mRunTime.elapsed()<<"ms:"<< "最终得出的obsDistance:" << obsDistance << std::endl;
  2664. ServiceCarStatus.mObs = obsDistance;
  2665. if(ServiceCarStatus.mObs>100){
  2666. ServiceCarStatus.mObs =-1;
  2667. }
  2668. if (obsDistance>0)
  2669. {
  2670. lastDistance = obsDistance;
  2671. }
  2672. //lsn
  2673. if(obs<0){
  2674. obsDisVector[roadNum]=500;
  2675. }else{
  2676. obsDisVector[roadNum]=obs;
  2677. }
  2678. }
  2679. double iv::decition::DecideGps00::predictObsOnRoad(std::vector<iv::Perception::PerceptionOutput> lidar_per,std::vector<Point2D> gpsTrace,double realSpeed){
  2680. double preObsDis=500;
  2681. if(!lidar_per.empty()){
  2682. preObsDis=PredictObsDistance( realSpeed, gpsTrace, lidar_per);
  2683. lastPreObsDistance=preObsDis;
  2684. }else{
  2685. preObsDis=lastPreObsDistance;
  2686. }
  2687. ServiceCarStatus.mfttc = preObsDis;
  2688. return preObsDis;
  2689. // if(preObsDis<obsDistance){
  2690. // obsDistance=preObsDis;
  2691. // lastDistance=obsDistance;
  2692. // }
  2693. }
  2694. int iv::decition::DecideGps00::chooseAvoidRoad(iv::LidarGridPtr lidarGridPtr, GPS_INS now_gps_ins, const std::vector<GPSData> gpsMapLine,std::vector<iv::Perception::PerceptionOutput> lidar_per) {
  2695. roadPre = -1;
  2696. for (int i = 0; i < roadSum; i++)
  2697. {
  2698. gpsTraceAvoid.clear();
  2699. avoidX=computeAvoidX(i,roadOri,gpsMapLine[PathPoint],ServiceCarStatus.msysparam.vehWidth);
  2700. gpsTraceAvoid = getGpsTraceOffset(gpsTraceOri, avoidX);
  2701. computeObsOnRoad(lidarGridPtr, gpsTraceAvoid, i,gpsMapLine,lidar_per);
  2702. }
  2703. if (lidarGridPtr!=NULL)
  2704. {
  2705. hasCheckedAvoidLidar = true;
  2706. }
  2707. for(int i=0; i<roadSum;i++){
  2708. std::cout<<"\odsjuli====================:\n"<<i<<"chedaojuli:"<<obsDisVector[i]<<endl;
  2709. }
  2710. checkAvoidObsTimes++;
  2711. if (checkAvoidObsTimes<4 || hasCheckedAvoidLidar==false)
  2712. {
  2713. return - 1;
  2714. }
  2715. for (int i = 1; i < roadSum; i++)
  2716. {
  2717. if (roadNow + i < roadSum) {
  2718. // avoidX = (roadOri-roadNow-i)*roadWidth;
  2719. avoidX=computeAvoidX(roadNow+i,roadOri,gpsMapLine[PathPoint],ServiceCarStatus.msysparam.vehWidth);
  2720. if (checkAvoidEnable(avoidX, lidarGridPtr, roadNow+i))
  2721. {
  2722. /*if (roadNow==roadOri)
  2723. {
  2724. avoidRunDistance = obsDisVector[roadNow] + ServiceCarStatus.msysparam.vehLenth;
  2725. startAvoid_gps_ins = now_gps_ins;
  2726. } */
  2727. avoidMinDistanceVector[roadNow]= obsDisVector[roadNow] + 2*ServiceCarStatus.msysparam.vehLenth;
  2728. startAvoidGpsInsVector[roadNow] = now_gps_ins;
  2729. roadPre = roadNow + i;
  2730. return roadPre;
  2731. }
  2732. }
  2733. if (roadNow - i >= 0)
  2734. {
  2735. // avoidX = (roadOri - roadNow+i)*roadWidth;
  2736. avoidX=computeAvoidX(roadNow-i,roadOri,gpsMapLine[PathPoint],ServiceCarStatus.msysparam.vehWidth);
  2737. if (checkAvoidEnable(avoidX, lidarGridPtr, roadNow - i))
  2738. {
  2739. /*if (roadNow == roadOri)
  2740. {
  2741. avoidRunDistance = obsDisVector[roadNow] + ServiceCarStatus.msysparam.vehLenth;
  2742. startAvoid_gps_ins = now_gps_ins;
  2743. }*/
  2744. avoidMinDistanceVector[roadNow] = obsDisVector[roadNow] + 2*ServiceCarStatus.msysparam.vehLenth;
  2745. startAvoidGpsInsVector[roadNow] = now_gps_ins;
  2746. roadPre = roadNow - i;
  2747. return roadPre;
  2748. }
  2749. }
  2750. }
  2751. return roadPre;
  2752. }
  2753. int iv::decition::DecideGps00::chooseBackRoad(iv::LidarGridPtr lidarGridPtr, GPS_INS now_gps_ins, std::vector<GPSData> gpsMapLine,std::vector<iv::Perception::PerceptionOutput> lidar_per) {
  2754. roadPre = -1;
  2755. for (int i = 0; i <roadSum; i++)
  2756. {
  2757. gpsTraceBack.clear();
  2758. avoidX=computeAvoidX(i,roadOri,gpsMapLine[PathPoint],ServiceCarStatus.msysparam.vehWidth);
  2759. gpsTraceBack = getGpsTraceOffset(gpsTraceOri, avoidX);
  2760. computeObsOnRoad(lidarGridPtr, gpsTraceBack, i,gpsMapLine,lidar_per);
  2761. }
  2762. if (lidarGridPtr != NULL)
  2763. {
  2764. hasCheckedBackLidar = true;
  2765. }
  2766. checkBackObsTimes++;
  2767. if (checkBackObsTimes<4 || hasCheckedBackLidar == false)
  2768. {
  2769. return -1;
  2770. }
  2771. if ((GetDistance(now_gps_ins, startAvoidGpsInsVector[roadOri])>max(avoidMinDistanceVector[roadOri],40.0)) &&
  2772. (checkReturnEnable(avoidX, lidarGridPtr, roadOri)))
  2773. {
  2774. roadPre = roadOri;
  2775. return roadPre;
  2776. }
  2777. if (roadNow-roadOri>1)
  2778. {
  2779. for (int i = roadOri + 1;i < roadNow;i++) {
  2780. if (checkReturnEnable(avoidX, lidarGridPtr, i)&&
  2781. (GetDistance(now_gps_ins, startAvoidGpsInsVector[i])> avoidMinDistanceVector[i])&&
  2782. (GetDistance(now_gps_ins, startAvoidGpsInsVector[i])> 30.0))
  2783. {
  2784. roadPre = i;
  2785. return roadPre;
  2786. }
  2787. }
  2788. }
  2789. else if (roadNow <roadOri-1)
  2790. {
  2791. for (int i = roadOri - 1;i > roadNow;i--) {
  2792. if (checkReturnEnable(avoidX, lidarGridPtr, i)&&
  2793. (GetDistance(now_gps_ins, startAvoidGpsInsVector[i])>avoidMinDistanceVector[i])&&
  2794. (GetDistance(now_gps_ins, startAvoidGpsInsVector[i])> 30.0))
  2795. {
  2796. roadPre = i;
  2797. return roadPre;
  2798. }
  2799. }
  2800. }
  2801. return roadPre;
  2802. }
  2803. double iv::decition::DecideGps00::trumpet() {
  2804. if (trumpetFirstCount)
  2805. {
  2806. trumpetFirstCount = false;
  2807. trumpetLastTime= GetTickCount();
  2808. trumpetTimeSpan = 0.0;
  2809. }
  2810. else
  2811. {
  2812. trumpetStartTime= GetTickCount();
  2813. trumpetTimeSpan += trumpetStartTime - trumpetLastTime;
  2814. trumpetLastTime = trumpetStartTime;
  2815. }
  2816. return trumpetTimeSpan;
  2817. }
  2818. double iv::decition::DecideGps00::transferP() {
  2819. if (transferFirstCount)
  2820. {
  2821. transferFirstCount = false;
  2822. transferLastTime= GetTickCount();
  2823. transferTimeSpan = 0.0;
  2824. }
  2825. else
  2826. {
  2827. transferStartTime= GetTickCount();
  2828. transferTimeSpan += transferStartTime - transferLastTime;
  2829. transferLastTime = transferStartTime;
  2830. }
  2831. return transferTimeSpan;
  2832. }
  2833. void iv::decition::DecideGps00::handBrakePark(iv::decition::Decition decition, long duringTime, GPS_INS now_gps_ins) {
  2834. if (abs(now_gps_ins.speed)>0.1)
  2835. {
  2836. decition->accelerator = 0;
  2837. decition->brake = 20;
  2838. decition->wheel_angle = 0;
  2839. }
  2840. else
  2841. {
  2842. decition->accelerator = 0;
  2843. decition->brake = 20;
  2844. decition->wheel_angle = 0;
  2845. handPark = true;
  2846. handParkTime = duringTime;
  2847. }
  2848. }
  2849. void iv::decition::DecideGps00::getMapBeside(std::vector<iv::GPSData> navigation_data, iv::GPS_INS now_gps_ins) {
  2850. gmapsL.clear();
  2851. gmapsR.clear();
  2852. for (int i = 0; i < 31; i++)
  2853. {
  2854. std::vector<iv::GPSData> gpsMapLineBeside;
  2855. // gpsMapLineBeside = iv::decition::ComputeUnit().getBesideGpsMapLine(*ServiceCarStatus.location, navigation_data, -0.5*i);
  2856. gpsMapLineBeside = iv::decition::Compute00().getBesideGpsMapLine(now_gps_ins, navigation_data, -0.5*i);
  2857. gmapsL.push_back(gpsMapLineBeside);
  2858. }
  2859. for (int i = 0; i < 31; i++)
  2860. {
  2861. std::vector<iv::GPSData> gpsMapLineBeside;
  2862. // gpsMapLineBeside = iv::decition::ComputeUnit().getBesideGpsMapLine(*ServiceCarStatus.location, navigation_data, 0.5*i);
  2863. gpsMapLineBeside = iv::decition::Compute00().getBesideGpsMapLine(now_gps_ins, navigation_data, 0.5*i);
  2864. gmapsR.push_back(gpsMapLineBeside);
  2865. }
  2866. }
  2867. bool iv::decition::DecideGps00::checkChaoCheBack(iv::LidarGridPtr lidarGridPtr) {
  2868. if (lidarGridPtr == NULL)
  2869. {
  2870. return false;
  2871. // lidarDistance = lastlidarDistance;
  2872. }
  2873. else {
  2874. obsPoint = Compute00().getLidarObsPoint(gpsTraceOri, lidarGridPtr);
  2875. double lidarDistance = obsPoint.y - 2.5; //激光距离推到车头
  2876. // ODS("\n超车雷达距离:%f\n", lidarDistance);
  2877. if (lidarDistance >-20 && lidarDistance<35)
  2878. {
  2879. checkChaoCheBackCounts = 0;
  2880. return false;
  2881. }
  2882. else {
  2883. checkChaoCheBackCounts++;
  2884. }
  2885. if (checkChaoCheBackCounts>2) {
  2886. checkChaoCheBackCounts = 0;
  2887. return true;
  2888. }
  2889. }
  2890. return false;
  2891. }
  2892. void iv::decition::DecideGps00::updateGroupDate(GPS_INS now_gps_ins,float realspeed,float theta,float s){
  2893. Point2D pt = Coordinate_Transfer( now_gps_ins.gps_x, now_gps_ins.gps_y, group_ori_gps);
  2894. ServiceCarStatus.group_x_local=pt.x;
  2895. // ServiceCarStatus.group_y_local=pt.y;
  2896. ServiceCarStatus.group_y_local=s;
  2897. if(realspeed<0.36){
  2898. ServiceCarStatus.group_velx_local=0;
  2899. ServiceCarStatus.group_vely_local=0;
  2900. }else{
  2901. ServiceCarStatus.group_velx_local=realspeed*sin(theta)/3.6;
  2902. ServiceCarStatus.group_vely_local=realspeed*cos(theta)/3.6;
  2903. }
  2904. ServiceCarStatus.group_pathpoint=PathPoint;
  2905. }
  2906. float iv::decition::DecideGps00::ComputeTrafficLightSpeed(int traffic_light_color, int traffic_light_time, const std::vector<GPSData> gpsMapLine,int traffic_light_pathpoint,
  2907. int pathpoint,float secSpeed,float dSpeed){
  2908. float traffic_speed=200;
  2909. float traffic_dis=0;
  2910. float passTime;
  2911. float passSpeed;
  2912. bool passEnable=false;
  2913. if(abs(secSpeed)<0.1){
  2914. secSpeed=0;
  2915. }
  2916. if(pathpoint <= traffic_light_pathpoint){
  2917. for(int i=pathpoint;i<traffic_light_pathpoint;i++){
  2918. traffic_dis +=GetDistance(*gpsMapLine[i],*gpsMapLine[i+1]);
  2919. }
  2920. }else{
  2921. for(int i=pathpoint;i<gpsMapLine.size()-1;i++){
  2922. traffic_dis +=GetDistance(*gpsMapLine[i],*gpsMapLine[i+1]);
  2923. }
  2924. for(int i=0;i<traffic_light_pathpoint;i++){
  2925. traffic_dis+=GetDistance(*gpsMapLine[i],*gpsMapLine[i+1]);
  2926. }
  2927. }
  2928. // if(traffic_light_color != 0)
  2929. // {
  2930. // int a = 3;
  2931. // }
  2932. if(traffic_light_color==0 && traffic_dis<10){
  2933. traffic_speed=0;
  2934. }
  2935. // else //20200108
  2936. // {
  2937. // traffic_speed=10;
  2938. // }
  2939. return traffic_speed;
  2940. passSpeed = min((float)(dSpeed/3.6),secSpeed);
  2941. passTime = traffic_dis/(dSpeed/3.6);
  2942. switch(traffic_light_color){
  2943. case 0:
  2944. if(passTime>traffic_light_time+1 && traffic_dis>10){
  2945. passEnable=true;
  2946. }else{
  2947. passEnable=false;
  2948. }
  2949. break;
  2950. case 1:
  2951. if(passTime<traffic_light_time-1 && traffic_dis<10){
  2952. passEnable=true;
  2953. }else{
  2954. passEnable = false;
  2955. }
  2956. break;
  2957. case 2:
  2958. if(passTime<traffic_light_time){
  2959. passEnable= true;
  2960. }else{
  2961. passEnable=false;
  2962. }
  2963. break;
  2964. default:
  2965. break;
  2966. }
  2967. if(!passEnable){
  2968. if(traffic_dis<5){
  2969. traffic_speed=0;
  2970. }else if(traffic_dis<10){
  2971. traffic_speed=5;
  2972. }else if(traffic_dis<20){
  2973. traffic_speed=15;
  2974. }else if(traffic_dis<30){
  2975. traffic_speed=25;
  2976. }else if(traffic_dis<50){
  2977. traffic_speed=30;
  2978. }
  2979. }
  2980. return traffic_speed;
  2981. }
  2982. void iv::decition::DecideGps00::computeObsOnRoadByFrenet(iv::LidarGridPtr lidarGridPtr, const std::vector<Point2D>& gpsTrace, double & obs, const std::vector<iv::GPSData>& gpsMap,int pathpoint,GPS_INS nowGps)
  2983. {
  2984. // Point2D obsCombinePoint = Point2D(-1,-1);
  2985. iv::decition::FrenetPoint car_now_frenet_point = iv::decition::FrenetPlanner::getFrenetfromXY(0,0,gpsTrace,gpsMap,pathpoint,nowGps);
  2986. double obsSd;
  2987. if (lidarGridPtr == NULL)
  2988. {
  2989. lidarDistance = lastLidarDis;
  2990. // lidarDistance = lastlidarDistance;
  2991. }
  2992. else {
  2993. obsPoint = Compute00().getLidarObsPoint(gpsTrace, lidarGridPtr);
  2994. // lidarDistance = obsPoint.y-2.5; //激光距离推到车头
  2995. iv::decition::FrenetPoint lidarFPointTmp = iv::decition::FrenetPlanner::getFrenetfromXY(this->obsPoint.x,this->obsPoint.y,gpsTrace,gpsMap,pathpoint,nowGps);
  2996. lidarDistance = lidarFPointTmp.s - car_now_frenet_point.s - 2.5;
  2997. // lidarDistance=-1;
  2998. if (lidarDistance<0)
  2999. {
  3000. lidarDistance = -1;
  3001. }
  3002. lastLidarDis = lidarDistance;
  3003. }
  3004. FrenetPoint esr_obs_frenet_point;
  3005. getEsrObsDistanceByFrenet(gpsTrace, car_now_frenet_point,esr_obs_frenet_point,gpsMap,pathpoint,nowGps);
  3006. if(lidarDistance<0){
  3007. lidarDistance=500;
  3008. }
  3009. if(esrDistance<0){
  3010. esrDistance=500;
  3011. }
  3012. std::cout <<ServiceCarStatus.mRunTime.elapsed()<<"ms:"<< "激光雷达距离:" << lidarDistance << std::endl;
  3013. std::cout <<ServiceCarStatus.mRunTime.elapsed()<<"ms:"<< "毫米波距离:" << esrDistance << std::endl;
  3014. myesrDistance = esrDistance;
  3015. if(lidarDistance==500){
  3016. lidarDistance=-1;
  3017. }
  3018. if(esrDistance==500){
  3019. esrDistance=-1;
  3020. }
  3021. ServiceCarStatus.mRadarObs = esrDistance;
  3022. ServiceCarStatus.mLidarObs = lidarDistance;
  3023. // //zhuanwan pingbi haomibo
  3024. // if(gpsTraceNow[0].v1==4||gpsTraceNow[0].v1==5){
  3025. // esrDistance=-1;
  3026. // }
  3027. if (esrDistance>0 && lidarDistance > 0)
  3028. {
  3029. if (lidarDistance >= esrDistance)
  3030. {
  3031. obs = esrDistance;
  3032. // obsSd=ServiceCarStatus.obs_radar[esrIndex].speed_y;
  3033. obsSd = obsSpeed;
  3034. //障碍物信息使用毫米波采集的。其位置坐标加上偏移量,转换成相对于惯导的位置,即转换成车辆坐标系下的位置坐标。
  3035. // obsCombinePoint = Point2D(ServiceCarStatus.obs_radar[esrIndex].nomal_x+Esr_Offset,ServiceCarStatus.obs_radar[esrIndex].nomal_y+Esr_Y_Offset);
  3036. }
  3037. else if (!ServiceCarStatus.obs_radar.empty())
  3038. {
  3039. obs = lidarDistance;
  3040. // obsCombinePoint = obsPoint;
  3041. // obsSd = Compute00().getObsSpeedByFrenet(obsPoint, secSpeed,gpsTrace);
  3042. obsSd = Compute00().getObsSpeedByFrenet(obsPoint, secSpeed,gpsTrace,gpsMap,pathpoint,nowGps);
  3043. std::cout <<ServiceCarStatus.mRunTime.elapsed()<<"ms:"<< "计算obsSpeed:" << obsSpeed << std::endl;
  3044. }
  3045. else
  3046. {
  3047. obs=lidarDistance;
  3048. // obsCombinePoint = obsPoint;
  3049. obsSd = 0 -secSpeed*cos(car_now_frenet_point.tangent_Ang-PI/2);
  3050. std::cout <<ServiceCarStatus.mRunTime.elapsed()<<"ms:"<< "毫米波无数据,计算obsSpeed:" << obsSpeed << std::endl;
  3051. }
  3052. }
  3053. else if (esrDistance>0)
  3054. {
  3055. obs = esrDistance;
  3056. // obsSd = ServiceCarStatus.obs_radar[esrIndex].speed_y;
  3057. obsSd = obsSpeed;
  3058. //障碍物信息使用毫米波采集的。其位置坐标加上偏移量,转换成相对于惯导的位置,即转换成车辆坐标系下的位置坐标。
  3059. // obsCombinePoint = Point2D(ServiceCarStatus.obs_radar[esrIndex].nomal_x+Esr_Offset,ServiceCarStatus.obs_radar[esrIndex].nomal_y+Esr_Y_Offset);
  3060. }
  3061. else if (lidarDistance > 0)
  3062. {
  3063. obs = lidarDistance;
  3064. // obsCombinePoint = obsPoint;
  3065. obsSd = Compute00().getObsSpeedByFrenet(obsPoint, secSpeed,gpsTrace,gpsMap,pathpoint,nowGps);
  3066. std::cout <<ServiceCarStatus.mRunTime.elapsed()<<"ms:"<< "计算obsSpeed:" << obsSpeed << std::endl;
  3067. }
  3068. else {
  3069. obs = esrDistance;
  3070. // obsCombinePoint = Point2D(ServiceCarStatus.obs_radar[esrIndex].nomal_x+Esr_Offset,ServiceCarStatus.obs_radar[esrIndex].nomal_y+Esr_Y_Offset);
  3071. obsSd = 0 - secSpeed*cos(car_now_frenet_point.tangent_Ang-PI/2);
  3072. }
  3073. obsDistance=obs;
  3074. obsSpeed=obsSd;
  3075. std::cout <<ServiceCarStatus.mRunTime.elapsed()<<"ms:"<< "最终得出的obsDistance:" << obsDistance << std::endl;
  3076. ServiceCarStatus.mObs = obsDistance;
  3077. if(ServiceCarStatus.mObs>100){
  3078. ServiceCarStatus.mObs =-1;
  3079. }
  3080. if (obsDistance>0)
  3081. {
  3082. lastDistance = obsDistance;
  3083. }
  3084. if(obs<0){
  3085. obsDistance=500;
  3086. }else{
  3087. obsDistance=obs;
  3088. }
  3089. }
  3090. void iv::decition::DecideGps00::getRearEsrObsDistance(std::vector<Point2D> gpsTrace, int roadNum) {
  3091. esrIndex = iv::decition::Compute00().getRearEsrIndex(gpsTrace, roadNum);
  3092. if (esrIndex != -1)
  3093. {
  3094. esrDistance = ServiceCarStatus.obs_rear_radar[esrIndex].nomal_y;
  3095. obsSpeed = ServiceCarStatus.obs_rear_radar[esrIndex].speed_y;
  3096. }
  3097. else {
  3098. esrDistance = -1;
  3099. }
  3100. }
  3101. void iv::decition::DecideGps00::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) {
  3102. esrIndex = iv::decition::Compute00().getEsrIndexByFrenet(gpsTrace,esrObs_F_Point,gpsMap,pathpoint,nowGps);
  3103. if (esrIndex != -1)
  3104. {
  3105. //障碍物的距离,是障碍物和车辆沿道路上的距离,即s。并不直接是它的x坐标或y坐标或两点直线坐标。
  3106. //严格来说应是 esrDistance=障碍物的s - 车辆的s - Esr_Y_Offset,但这是根据车辆位置实时搜索路径,故车辆的s极其小。
  3107. esrDistance = esrObs_F_Point.s - car_now_frenet_point.s - Esr_Y_Offset; //-Esr_Y_Offset是把距离推到车头,换算frenet坐标时,把它加上了的。故需减去。
  3108. double speedx=ServiceCarStatus.obs_radar[esrIndex].speed_x; //障碍物相对于车辆x轴的速度
  3109. double speedy=ServiceCarStatus.obs_radar[esrIndex].speed_y; //障碍物相对于车辆y轴的速度
  3110. double speed_combine = sqrt(speedx*speedx+speedy*speedy); //将x、y轴两个方向的速度求矢量和
  3111. //障碍物的速度方向与道路方向的夹角。用于将速度分解到s方向和d方向。
  3112. //所谓道路方向是指,道路上离障碍物的最近的点沿道路弧线的切线方向。
  3113. double Etheta = esrObs_F_Point.tangent_Ang - atan2(speedy,speedx);
  3114. obsSpeed = speed_combine*cos(Etheta); //由speed_combine分解的s轴方向上的速度
  3115. }
  3116. else {
  3117. esrDistance = -1;
  3118. }
  3119. }
  3120. void iv::decition::DecideGps00::getV2XTrafficPositionVector(const std::vector<GPSData> gpsMapLine){
  3121. v2xTrafficVector.clear();
  3122. for (int var = 0; var < gpsMapLine.size(); var++) {
  3123. if(gpsMapLine[var]->roadMode==6|| gpsMapLine[var]->mode2==1000001){
  3124. v2xTrafficVector.push_back(var);
  3125. }
  3126. }
  3127. }
  3128. float iv::decition::DecideGps00::ComputeV2XTrafficLightSpeed(iv::TrafficLight trafficLight, const std::vector<GPSData> gpsMapLine,std::vector<int> v2xTrafficVector,
  3129. int pathpoint,float secSpeed,float dSpeed, bool circleMode){
  3130. float trafficSpeed=200;
  3131. int nearTraffixPoint=-1;
  3132. float nearTrafficDis=0;
  3133. int traffic_color=0;
  3134. int traffic_time=0;
  3135. bool passThrough=false;
  3136. float dSecSpeed=dSpeed/3.6;
  3137. if(v2xTrafficVector.empty()){
  3138. return trafficSpeed;
  3139. }
  3140. if(!circleMode){
  3141. if(pathpoint>v2xTrafficVector.back()){
  3142. return trafficSpeed;
  3143. }else {
  3144. for(int i=0; i< v2xTrafficVector.size();i++){
  3145. if (pathpoint<= v2xTrafficVector[i]){
  3146. nearTraffixPoint=v2xTrafficVector[i];
  3147. break;
  3148. }
  3149. }
  3150. }
  3151. }else if(circleMode){
  3152. if(pathpoint>v2xTrafficVector.back()){
  3153. nearTraffixPoint=v2xTrafficVector[0];
  3154. }else {
  3155. for(int i=0; i< v2xTrafficVector.size();i++){
  3156. if (pathpoint<= v2xTrafficVector[i]){
  3157. nearTraffixPoint=v2xTrafficVector[i];
  3158. break;
  3159. }
  3160. }
  3161. }
  3162. }
  3163. if(nearTraffixPoint!=-1){
  3164. for(int i=pathpoint;i<nearTraffixPoint;i++){
  3165. nearTrafficDis +=GetDistance(*gpsMapLine[i],*gpsMapLine[i+1]);
  3166. }
  3167. }
  3168. if(nearTrafficDis>50){
  3169. return trafficSpeed;
  3170. }
  3171. int roadMode = gpsMapLine[pathpoint]->roadMode;
  3172. if(roadMode==14 || roadMode==16){
  3173. traffic_color=trafficLight.leftColor;
  3174. traffic_time=trafficLight.leftTime;
  3175. }else if(roadMode==15 ||roadMode==17){
  3176. traffic_color=trafficLight.rightColor;
  3177. traffic_time=trafficLight.rightTime;
  3178. }else {
  3179. traffic_color=trafficLight.straightColor;
  3180. traffic_time=trafficLight.straightTime;
  3181. }
  3182. passThrough=computeTrafficPass(nearTrafficDis,traffic_color,traffic_time,secSpeed,dSecSpeed);
  3183. if(passThrough){
  3184. return trafficSpeed;
  3185. }else{
  3186. trafficSpeed=computeTrafficSpeedLimt(nearTrafficDis);
  3187. if(nearTrafficDis<6){
  3188. float decelerate =0-( secSpeed*secSpeed*0.5/nearTrafficDis);
  3189. minDecelerate=min(minDecelerate,decelerate);
  3190. }
  3191. return trafficSpeed;
  3192. }
  3193. return trafficSpeed;
  3194. }
  3195. bool iv::decition::DecideGps00::computeTrafficPass(float trafficDis,int trafficColor,float trafficTime,float realSecSpeed,float dSecSpeed){
  3196. float passTime=0;
  3197. if (trafficColor==2 || trafficColor==3){
  3198. return false;
  3199. }else if(trafficColor==0){
  3200. return true;
  3201. }else{
  3202. passTime=trafficDis/dSecSpeed;
  3203. if(passTime+1< trafficTime){
  3204. return true;
  3205. }else{
  3206. return false;
  3207. }
  3208. }
  3209. }
  3210. float iv::decition::DecideGps00::computeTrafficSpeedLimt(float trafficDis){
  3211. float limit=200;
  3212. if(trafficDis<10){
  3213. limit = 0;
  3214. }else if(trafficDis<15){
  3215. limit = 5;
  3216. }else if(trafficDis<20){
  3217. limit=10;
  3218. }else if(trafficDis<30){
  3219. limit=15;
  3220. }
  3221. return limit;
  3222. }
  3223. void iv::decition::DecideGps00::transferGpsMode2( const std::vector<GPSData> gpsMapLine){
  3224. static int obstacle_disable=0;
  3225. static int speed_slowdown_flag=0;
  3226. static bool lock_flag=false;
  3227. double forecast_distance=0;
  3228. int forecast_point_num=0;
  3229. bool cross=false;
  3230. double secLowSpeed=ServiceCarStatus.mroadmode_vel.mfmode18/3.6; //m/s
  3231. if(secSpeed>secLowSpeed)
  3232. {
  3233. forecast_distance=secSpeed*secSpeed-secLowSpeed*secLowSpeed+5;
  3234. forecast_point_num=((int)forecast_distance)*10;
  3235. if((PathPoint+forecast_point_num+2)>gpsMapLine.size())
  3236. forecast_point_num=0;
  3237. }
  3238. if((PathPoint+forecast_point_num-8>0)&&(PathPoint+forecast_point_num+8<gpsMapLine.size()))
  3239. {
  3240. for(int i=PathPoint+forecast_point_num-8;i<PathPoint+forecast_point_num+8;i++)
  3241. {
  3242. if(gpsMapLine[i]->mode2==5000)
  3243. cross=true;
  3244. }
  3245. }
  3246. //givlog->debug("decition_brain","PATHFORE: %d,Forecast: %d,cross: %d",
  3247. //PathPoint+forecast_point_num,forecast_point_num,cross);
  3248. if( gpsMapLine[PathPoint]->mode2==3000){
  3249. if(obsDistance>4){ //7 zj-5
  3250. obsDistance=200;
  3251. }else{
  3252. lock_flag=false;
  3253. obsSpeed=-realspeed/3.6;
  3254. }
  3255. if((realspeed>3)&&(lock_flag==false)){
  3256. minDecelerate=-0.5;
  3257. }else{
  3258. dSpeed=min(dSpeed,3.0);
  3259. lock_flag=true;
  3260. }
  3261. }
  3262. else if(gpsMapLine[PathPoint]->mode2==3001){
  3263. obstacle_disable=1;
  3264. }else if(gpsMapLine[PathPoint]->mode2==3002){
  3265. obstacle_disable=0;
  3266. }else if(gpsMapLine[PathPoint]->mode2==4000){
  3267. //ServiceCarStatus.msysparam.vehWidth=5.6;
  3268. }else if(cross==true){
  3269. speed_slowdown_flag=1;
  3270. lock_flag=false;
  3271. }else if(gpsMapLine[PathPoint]->mode2==5001){
  3272. speed_slowdown_flag=0;
  3273. }
  3274. if(obstacle_disable==1){
  3275. obsDistance=200;
  3276. }
  3277. if(speed_slowdown_flag==1)
  3278. {
  3279. if((realspeed>ServiceCarStatus.mroadmode_vel.mfmode18)&&(lock_flag==false)){
  3280. minDecelerate=-0.5;
  3281. }else{
  3282. dSpeed=min(dSpeed,ServiceCarStatus.mroadmode_vel.mfmode18);
  3283. lock_flag=true;
  3284. }
  3285. }
  3286. }
  3287. float iv::decition::DecideGps00::computeAvoidX(int roadAim,int roadOri,GPSData gps,float vehWidth){
  3288. if(roadAim==roadOri){
  3289. return 0;
  3290. }
  3291. float x=0;
  3292. float veh_to_roadSide=(gps->mfLaneWidth- ServiceCarStatus.msysparam.vehWidth)*0.5;
  3293. float roadSide_to_roadSide=ServiceCarStatus.msysparam.vehWidth;
  3294. if(!ServiceCarStatus.inRoadAvoid){
  3295. x= (roadOri-roadAim)*gps->mfLaneWidth;
  3296. }else{
  3297. int num=roadOri-roadAim;
  3298. switch (abs(num)%3) {
  3299. case 0:
  3300. x=(num/3)*gps->mfLaneWidth;
  3301. break;
  3302. case 1:
  3303. if(num>0){
  3304. x=(num/3)*gps->mfLaneWidth +veh_to_roadSide;
  3305. }else{
  3306. x=(num/3)*gps->mfLaneWidth -veh_to_roadSide;
  3307. }
  3308. break;
  3309. case 2:
  3310. if(num>0){
  3311. x=(num/3)*gps->mfLaneWidth +veh_to_roadSide+roadSide_to_roadSide;
  3312. }else{
  3313. x=(num/3)*gps->mfLaneWidth -veh_to_roadSide-roadSide_to_roadSide;
  3314. }
  3315. break;
  3316. default:
  3317. break;
  3318. }
  3319. }
  3320. return x;
  3321. }