ivdecision_brain.cpp 116 KB

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