dispatch_process.cpp 370 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958395939603961396239633964396539663967396839693970397139723973397439753976397739783979398039813982398339843985398639873988398939903991399239933994399539963997399839994000400140024003400440054006400740084009401040114012401340144015401640174018401940204021402240234024402540264027402840294030403140324033403440354036403740384039404040414042404340444045404640474048404940504051405240534054405540564057405840594060406140624063406440654066406740684069407040714072407340744075407640774078407940804081408240834084408540864087408840894090409140924093409440954096409740984099410041014102410341044105410641074108410941104111411241134114411541164117411841194120412141224123412441254126412741284129413041314132413341344135413641374138413941404141414241434144414541464147414841494150415141524153415441554156415741584159416041614162416341644165416641674168416941704171417241734174417541764177417841794180418141824183418441854186418741884189419041914192419341944195419641974198419942004201420242034204420542064207420842094210421142124213421442154216421742184219422042214222422342244225422642274228422942304231423242334234423542364237423842394240424142424243424442454246424742484249425042514252425342544255425642574258425942604261426242634264426542664267426842694270427142724273427442754276427742784279428042814282428342844285428642874288428942904291429242934294429542964297429842994300430143024303430443054306430743084309431043114312431343144315431643174318431943204321432243234324432543264327432843294330433143324333433443354336433743384339434043414342434343444345434643474348434943504351435243534354435543564357435843594360436143624363436443654366436743684369437043714372437343744375437643774378437943804381438243834384438543864387438843894390439143924393439443954396439743984399440044014402440344044405440644074408440944104411441244134414441544164417441844194420442144224423442444254426442744284429443044314432443344344435443644374438443944404441444244434444444544464447444844494450445144524453445444554456445744584459446044614462446344644465446644674468446944704471447244734474447544764477447844794480448144824483448444854486448744884489449044914492449344944495449644974498449945004501450245034504450545064507450845094510451145124513451445154516451745184519452045214522452345244525452645274528452945304531453245334534453545364537453845394540454145424543454445454546454745484549455045514552455345544555455645574558455945604561456245634564456545664567456845694570457145724573457445754576457745784579458045814582458345844585458645874588458945904591459245934594459545964597459845994600460146024603460446054606460746084609461046114612461346144615461646174618461946204621462246234624462546264627462846294630463146324633463446354636463746384639464046414642464346444645464646474648464946504651465246534654465546564657465846594660466146624663466446654666466746684669467046714672467346744675467646774678467946804681468246834684468546864687468846894690469146924693469446954696469746984699470047014702470347044705470647074708470947104711471247134714471547164717471847194720472147224723472447254726472747284729473047314732473347344735473647374738473947404741474247434744474547464747474847494750475147524753475447554756475747584759476047614762476347644765476647674768476947704771477247734774477547764777477847794780478147824783478447854786478747884789479047914792479347944795479647974798479948004801480248034804480548064807480848094810481148124813481448154816481748184819482048214822482348244825482648274828482948304831483248334834483548364837483848394840484148424843484448454846484748484849485048514852485348544855485648574858485948604861486248634864486548664867486848694870487148724873487448754876487748784879488048814882488348844885488648874888488948904891489248934894489548964897489848994900490149024903490449054906490749084909491049114912491349144915491649174918491949204921492249234924492549264927492849294930493149324933493449354936493749384939494049414942494349444945494649474948494949504951495249534954495549564957495849594960496149624963496449654966496749684969497049714972497349744975497649774978497949804981498249834984498549864987498849894990499149924993499449954996499749984999500050015002500350045005500650075008500950105011501250135014501550165017501850195020502150225023502450255026502750285029503050315032503350345035503650375038503950405041504250435044504550465047504850495050505150525053505450555056505750585059506050615062506350645065506650675068506950705071507250735074507550765077507850795080508150825083508450855086508750885089509050915092509350945095509650975098509951005101510251035104510551065107510851095110511151125113511451155116511751185119512051215122512351245125512651275128512951305131513251335134513551365137513851395140514151425143514451455146514751485149515051515152515351545155515651575158515951605161516251635164516551665167516851695170517151725173517451755176517751785179518051815182518351845185518651875188518951905191519251935194519551965197519851995200520152025203520452055206520752085209521052115212521352145215521652175218521952205221522252235224522552265227522852295230523152325233523452355236523752385239524052415242524352445245524652475248524952505251525252535254525552565257525852595260526152625263526452655266526752685269527052715272527352745275527652775278527952805281528252835284528552865287528852895290529152925293529452955296529752985299530053015302530353045305530653075308530953105311531253135314531553165317531853195320532153225323532453255326532753285329533053315332533353345335533653375338533953405341534253435344534553465347534853495350535153525353535453555356535753585359536053615362536353645365536653675368536953705371537253735374537553765377537853795380538153825383538453855386538753885389539053915392539353945395539653975398539954005401540254035404540554065407540854095410541154125413541454155416541754185419542054215422542354245425542654275428542954305431543254335434543554365437543854395440544154425443544454455446544754485449545054515452545354545455545654575458545954605461546254635464546554665467546854695470547154725473547454755476547754785479548054815482548354845485548654875488548954905491549254935494549554965497549854995500550155025503550455055506550755085509551055115512551355145515551655175518551955205521552255235524552555265527552855295530553155325533553455355536553755385539554055415542554355445545554655475548554955505551555255535554555555565557555855595560556155625563556455655566556755685569557055715572557355745575557655775578557955805581558255835584558555865587558855895590559155925593559455955596559755985599560056015602560356045605560656075608560956105611561256135614561556165617561856195620562156225623562456255626562756285629563056315632563356345635563656375638563956405641564256435644564556465647564856495650565156525653565456555656565756585659566056615662566356645665566656675668566956705671567256735674567556765677567856795680568156825683568456855686568756885689569056915692569356945695569656975698569957005701570257035704570557065707570857095710571157125713571457155716571757185719572057215722572357245725572657275728572957305731573257335734573557365737573857395740574157425743574457455746574757485749575057515752575357545755575657575758575957605761576257635764576557665767576857695770577157725773577457755776577757785779578057815782578357845785578657875788578957905791579257935794579557965797579857995800580158025803580458055806580758085809581058115812581358145815581658175818581958205821582258235824582558265827582858295830583158325833583458355836583758385839584058415842584358445845584658475848584958505851585258535854585558565857585858595860586158625863586458655866586758685869587058715872587358745875587658775878587958805881588258835884588558865887588858895890589158925893589458955896589758985899590059015902590359045905590659075908590959105911591259135914591559165917591859195920592159225923592459255926592759285929593059315932593359345935593659375938593959405941594259435944594559465947594859495950595159525953595459555956595759585959596059615962596359645965596659675968596959705971597259735974597559765977597859795980598159825983598459855986598759885989599059915992599359945995599659975998599960006001600260036004600560066007600860096010601160126013601460156016601760186019602060216022602360246025602660276028602960306031603260336034603560366037603860396040604160426043604460456046604760486049605060516052605360546055605660576058605960606061606260636064606560666067606860696070607160726073607460756076607760786079608060816082608360846085608660876088608960906091609260936094609560966097609860996100610161026103610461056106610761086109611061116112611361146115611661176118611961206121612261236124612561266127612861296130613161326133613461356136613761386139614061416142614361446145614661476148614961506151615261536154615561566157615861596160616161626163616461656166616761686169617061716172617361746175617661776178617961806181618261836184618561866187618861896190619161926193619461956196619761986199620062016202620362046205620662076208620962106211621262136214621562166217621862196220622162226223622462256226622762286229623062316232623362346235623662376238623962406241624262436244624562466247624862496250625162526253625462556256625762586259626062616262626362646265626662676268626962706271627262736274627562766277627862796280628162826283628462856286628762886289629062916292629362946295629662976298629963006301630263036304630563066307630863096310631163126313631463156316631763186319632063216322632363246325632663276328632963306331633263336334633563366337633863396340634163426343634463456346634763486349635063516352635363546355635663576358635963606361636263636364636563666367636863696370637163726373637463756376637763786379638063816382638363846385638663876388638963906391639263936394639563966397639863996400640164026403640464056406640764086409641064116412641364146415641664176418641964206421642264236424642564266427642864296430643164326433643464356436643764386439644064416442644364446445644664476448644964506451645264536454645564566457645864596460646164626463646464656466646764686469647064716472647364746475647664776478647964806481648264836484648564866487648864896490649164926493649464956496649764986499650065016502650365046505650665076508650965106511651265136514651565166517651865196520652165226523652465256526652765286529653065316532653365346535653665376538653965406541654265436544654565466547654865496550655165526553655465556556655765586559656065616562656365646565656665676568656965706571657265736574657565766577657865796580658165826583658465856586658765886589659065916592659365946595659665976598659966006601660266036604660566066607660866096610661166126613661466156616661766186619662066216622662366246625662666276628662966306631663266336634663566366637663866396640664166426643664466456646664766486649665066516652665366546655665666576658665966606661666266636664666566666667666866696670667166726673667466756676667766786679668066816682668366846685668666876688668966906691669266936694669566966697669866996700670167026703670467056706670767086709671067116712671367146715671667176718671967206721672267236724672567266727672867296730673167326733673467356736673767386739674067416742674367446745674667476748674967506751675267536754675567566757675867596760676167626763676467656766676767686769677067716772677367746775677667776778677967806781678267836784678567866787678867896790679167926793679467956796679767986799680068016802680368046805680668076808680968106811681268136814681568166817681868196820682168226823682468256826682768286829683068316832683368346835683668376838683968406841684268436844684568466847684868496850685168526853685468556856685768586859686068616862686368646865686668676868686968706871687268736874687568766877687868796880688168826883688468856886688768886889689068916892689368946895689668976898689969006901690269036904690569066907690869096910691169126913691469156916691769186919692069216922692369246925692669276928692969306931693269336934693569366937693869396940694169426943694469456946694769486949695069516952695369546955695669576958695969606961696269636964696569666967696869696970697169726973697469756976697769786979698069816982698369846985698669876988698969906991699269936994699569966997699869997000700170027003700470057006700770087009701070117012701370147015701670177018701970207021702270237024702570267027702870297030703170327033703470357036703770387039704070417042704370447045704670477048704970507051705270537054705570567057705870597060706170627063706470657066706770687069707070717072707370747075707670777078707970807081708270837084708570867087708870897090709170927093709470957096709770987099710071017102710371047105710671077108710971107111711271137114711571167117711871197120712171227123712471257126712771287129713071317132713371347135713671377138713971407141714271437144714571467147714871497150715171527153715471557156715771587159716071617162716371647165716671677168716971707171717271737174717571767177717871797180718171827183718471857186718771887189719071917192719371947195719671977198719972007201720272037204720572067207720872097210721172127213721472157216721772187219722072217222722372247225722672277228722972307231723272337234723572367237723872397240724172427243724472457246724772487249725072517252725372547255725672577258725972607261726272637264726572667267726872697270727172727273727472757276727772787279728072817282728372847285728672877288728972907291729272937294729572967297729872997300730173027303730473057306730773087309731073117312731373147315731673177318731973207321732273237324732573267327732873297330733173327333733473357336733773387339734073417342734373447345734673477348734973507351735273537354735573567357735873597360736173627363736473657366736773687369737073717372737373747375737673777378737973807381738273837384738573867387738873897390739173927393739473957396739773987399740074017402740374047405740674077408740974107411741274137414741574167417741874197420742174227423742474257426742774287429743074317432743374347435743674377438743974407441744274437444744574467447744874497450745174527453745474557456745774587459746074617462746374647465746674677468746974707471747274737474747574767477747874797480748174827483748474857486748774887489749074917492749374947495749674977498749975007501750275037504750575067507750875097510751175127513751475157516751775187519752075217522752375247525752675277528752975307531753275337534753575367537753875397540754175427543754475457546754775487549755075517552755375547555755675577558755975607561756275637564756575667567756875697570757175727573757475757576757775787579758075817582758375847585758675877588758975907591759275937594759575967597759875997600760176027603760476057606760776087609761076117612761376147615761676177618761976207621762276237624762576267627762876297630763176327633763476357636763776387639764076417642764376447645764676477648764976507651765276537654765576567657765876597660766176627663766476657666766776687669767076717672767376747675767676777678767976807681768276837684768576867687768876897690769176927693769476957696769776987699770077017702770377047705770677077708770977107711771277137714771577167717771877197720772177227723772477257726772777287729773077317732773377347735773677377738773977407741774277437744774577467747774877497750775177527753775477557756775777587759776077617762776377647765776677677768776977707771777277737774777577767777777877797780778177827783778477857786778777887789779077917792779377947795779677977798779978007801780278037804780578067807780878097810781178127813781478157816781778187819782078217822782378247825782678277828782978307831783278337834783578367837783878397840784178427843784478457846784778487849785078517852785378547855785678577858785978607861
  1. //
  2. // Created by huli on 2021/3/22.
  3. //
  4. #include "dispatch_process.h"
  5. #include "../system/system_communication.h"
  6. #include "../dispatch/dispatch_manager.h"
  7. Dispatch_process::Dispatch_process()
  8. {
  9. m_dispatch_process_status = DISPATCH_PROCESS_STATUS_UNKNOW;
  10. m_dispatch_process_type = Common_data::Dispatch_process_type::DISPATCH_PROCESS_TYPE_UNKNOW;
  11. m_dispatch_source = 0;
  12. m_dispatch_destination = 0;
  13. m_wheel_base = 0;
  14. }
  15. Dispatch_process::~Dispatch_process()
  16. {
  17. Dispatch_process_uninit();
  18. }
  19. //初始化, 就把主控发送的请求传入即可.
  20. Error_manager Dispatch_process::Dispatch_process_init(message::Dispatch_request_msg &dispatch_request_msg)
  21. {
  22. //设定超时时间, 默认比任务指令里面的时间少10秒,
  23. if ( dispatch_request_msg.base_info().has_timeout_ms() )
  24. {
  25. m_timeout_ms = dispatch_request_msg.base_info().timeout_ms() - DISPATCH_PROCESS_ATTENUATION_TIMEOUT_MS;
  26. }
  27. else
  28. {
  29. m_timeout_ms = DISPATCH_PROCESS_TIMEOUT_MS - DISPATCH_PROCESS_ATTENUATION_TIMEOUT_MS;
  30. }
  31. m_command_key = dispatch_request_msg.command_key();
  32. m_start_time = std::chrono::system_clock::now();
  33. //检查调度请求消息
  34. if ( dispatch_request_msg.terminal_id() < Dispatch_coordinates::get_instance_references().m_passageway_terminal_id_min ||
  35. dispatch_request_msg.terminal_id() > Dispatch_coordinates::get_instance_references().m_passageway_terminal_id_max)
  36. {
  37. return Error_manager(Error_code::DISPATCH_PROCESS_INIT_ERROR, Error_level::MINOR_ERROR,
  38. " dispatch_request_msg.terminal_id() is error ");
  39. }
  40. //解析调度请求消息
  41. if ( dispatch_request_msg.dispatch_motion_direction() == message::E_STORE_CAR )
  42. {
  43. //检查调度请求消息
  44. if ( Dispatch_coordinates::get_instance_references().m_passageway_functioning_pattern_map[dispatch_request_msg.terminal_id()] != Dispatch_coordinates::PASSAGEWAY_FUNCTIONING_PATTERN_INLET &&
  45. Dispatch_coordinates::get_instance_references().m_passageway_functioning_pattern_map[dispatch_request_msg.terminal_id()] != Dispatch_coordinates::PASSAGEWAY_FUNCTIONING_PATTERN_BIDIRECTION )
  46. {
  47. return Error_manager(Error_code::DISPATCH_PROCESS_INIT_ERROR, Error_level::MINOR_ERROR,
  48. " m_passageway_functioning_pattern_map[dispatch_request_msg.terminal_id()] is error ");
  49. }
  50. //存车的车位可以是1~3个
  51. if ( dispatch_request_msg.parkspace_info_ex_size() <=0 || dispatch_request_msg.parkspace_info_ex_size() >3 )
  52. {
  53. return Error_manager(Error_code::DISPATCH_PROCESS_INIT_ERROR, Error_level::MINOR_ERROR,
  54. " dispatch_request_msg.parkspace_info_ex_size() is error ");
  55. }
  56. //检查定位信息
  57. if ( dispatch_request_msg.has_locate_information() == false )
  58. {
  59. return Error_manager(Error_code::DISPATCH_PROCESS_INIT_ERROR, Error_level::MINOR_ERROR,
  60. " dispatch_request_msg.has_locate_information() is error ");
  61. }
  62. m_dispatch_process_type = Common_data::Dispatch_process_type::DISPATCH_PROCESS_STORE;
  63. m_dispatch_source = dispatch_request_msg.terminal_id() + PASSAGEWAY_ID_BASE ;
  64. //终点在运动过程中动态分配//存车需要在完全确定车位之后, 才能判断车位类型
  65. // m_dispatch_destination = dispatch_request_msg.parkspace_info().parkingspace_index_id() + PARKSPACE_ID_BASE;
  66. for (int i = 0; i < dispatch_request_msg.parkspace_info_ex_size(); ++i)
  67. {
  68. if(dispatch_request_msg.parkspace_info_ex(i).parkspace_path() == message::Parkspace_path::LEFT_PATH)
  69. {
  70. Common_data::copy_data(m_parkspace_information_left, dispatch_request_msg.parkspace_info_ex(i));
  71. Common_data::scaling(m_parkspace_information_left, 1000);
  72. }
  73. if(dispatch_request_msg.parkspace_info_ex(i).parkspace_path() == message::Parkspace_path::RIGHT_PATH)
  74. {
  75. Common_data::copy_data(m_parkspace_information_right, dispatch_request_msg.parkspace_info_ex(i));
  76. Common_data::scaling(m_parkspace_information_right, 1000);
  77. }
  78. if(dispatch_request_msg.parkspace_info_ex(i).parkspace_path() == message::Parkspace_path::TEMPORARY_CACHE_PATH)
  79. {
  80. Common_data::copy_data(m_parkspace_information_temporary, dispatch_request_msg.parkspace_info_ex(i));
  81. Common_data::scaling(m_parkspace_information_temporary, 1000);
  82. }
  83. }
  84. // Common_data::copy_data(m_parkspace_information, dispatch_request_msg.parkspace_info());
  85. // Common_data::scaling(m_parkspace_information, 1000);
  86. Common_data::copy_data(m_car_measure_information, dispatch_request_msg.locate_information());
  87. Common_data::scaling(m_car_measure_information, 1000);
  88. m_wheel_base = m_car_measure_information.car_wheel_base;
  89. }
  90. else if( dispatch_request_msg.dispatch_motion_direction() == message::E_PICKUP_CAR )
  91. {
  92. //检查调度请求消息
  93. if ( Dispatch_coordinates::get_instance_references().m_passageway_functioning_pattern_map[dispatch_request_msg.terminal_id()] != Dispatch_coordinates::PASSAGEWAY_FUNCTIONING_PATTERN_OUTLET &&
  94. Dispatch_coordinates::get_instance_references().m_passageway_functioning_pattern_map[dispatch_request_msg.terminal_id()] != Dispatch_coordinates::PASSAGEWAY_FUNCTIONING_PATTERN_BIDIRECTION )
  95. {
  96. return Error_manager(Error_code::DISPATCH_PROCESS_INIT_ERROR, Error_level::MINOR_ERROR,
  97. " m_passageway_functioning_pattern_map[dispatch_request_msg.terminal_id()] is error ");
  98. }
  99. //取车的车位必须是1个
  100. if ( dispatch_request_msg.parkspace_info_ex_size() != 1 )
  101. {
  102. return Error_manager(Error_code::DISPATCH_PROCESS_INIT_ERROR, Error_level::MINOR_ERROR,
  103. " dispatch_request_msg.parkspace_info_ex_size() is error ");
  104. }
  105. m_dispatch_process_type = Common_data::Dispatch_process_type::DISPATCH_PROCESS_PICKUP;
  106. m_dispatch_source = dispatch_request_msg.parkspace_info_ex(0).parkingspace_index_id() + PARKSPACE_ID_BASE;
  107. m_parkspace_type = (Common_data::Parkspace_type)( dispatch_request_msg.parkspace_info_ex(0).parkingspace_type() );
  108. //终点在运动过程中动态分配
  109. //目前不控制门, 所以出口有主控决定. 如果后续控制门, 那么出口可以由调度决定.
  110. //目前取车还是固定出口.
  111. m_dispatch_destination = dispatch_request_msg.terminal_id() + PASSAGEWAY_ID_BASE ;
  112. Common_data::copy_data(m_parkspace_information_optimal, dispatch_request_msg.parkspace_info_ex(0));
  113. Common_data::scaling(m_parkspace_information_optimal, 1000);
  114. m_wheel_base = m_parkspace_information_optimal.car_information.car_wheel_base;
  115. }
  116. else
  117. {
  118. m_dispatch_process_type = Common_data::Dispatch_process_type::DISPATCH_PROCESS_TYPE_UNKNOW;
  119. return Error_manager(Error_code::DISPATCH_PROCESS_INIT_ERROR, Error_level::MINOR_ERROR,
  120. " Dispatch_process::Dispatch_process_init ERROR ");
  121. }
  122. //轮距
  123. if ( m_wheel_base < Dispatch_coordinates::get_instance_references().m_car_wheel_base_min ||
  124. m_wheel_base > Dispatch_coordinates::get_instance_references().m_car_wheel_base_max)
  125. {
  126. return Error_manager(Error_code::DISPATCH_PROCESS_INIT_ERROR, Error_level::MINOR_ERROR,
  127. " m_wheel_base < 1000 ERROR ");
  128. }
  129. m_car_type = (Common_data::Car_type)( dispatch_request_msg.car_type() );
  130. m_temporary_cache_flag = false;
  131. m_dispatch_request_msg = dispatch_request_msg;
  132. m_dispatch_process_status = DISPATCH_PROCESS_CREATED;
  133. return Error_code::SUCCESS;
  134. }
  135. //反初始化
  136. Error_manager Dispatch_process::Dispatch_process_uninit()
  137. {
  138. std::unique_lock<std::mutex> t_lock(m_lock);
  139. for (auto iter = m_dispatch_control_node_map.begin(); iter != m_dispatch_control_node_map.end(); ++iter)
  140. {
  141. if ( iter->second.mp_dispatch_task.get() != NULL )
  142. {
  143. iter->second.mp_dispatch_task->set_task_statu(Task_Base::Task_statu::TASK_WITHDRAW);
  144. iter->second.mp_dispatch_task.reset();
  145. iter->second.mp_dispatch_device.reset();
  146. }
  147. }
  148. return Error_code::SUCCESS;
  149. }
  150. //检查流程是否空闲待机
  151. Error_manager Dispatch_process::check_process_ready()
  152. {
  153. return Error_code::SUCCESS;
  154. if ( m_dispatch_process_status == DISPATCH_PROCESS_READY )
  155. {
  156. return Error_code::SUCCESS;
  157. }
  158. else
  159. {
  160. return Error_manager(Error_code::DISPATCH_PROCESS_IS_NOT_READY, Error_level::MINOR_ERROR,
  161. " Dispatch_process::check_process_ready() fun error ");
  162. }
  163. }
  164. //判断是否为待机,
  165. bool Dispatch_process::is_ready()
  166. {
  167. // std::unique_lock<std::mutex> t_lock(m_lock);
  168. if ( m_dispatch_process_status == DISPATCH_PROCESS_READY && m_dispatch_carrier_node.mp_main_carrier.get() == NULL)
  169. {
  170. return true;
  171. }
  172. else
  173. {
  174. return false;
  175. }
  176. }
  177. //能否在左侧路径存车
  178. bool Dispatch_process::is_able_store_left_path()
  179. {
  180. if ( m_parkspace_information_left.parkingspace_index_id !=0 )
  181. {
  182. return true;
  183. }
  184. return false;
  185. }
  186. //能否在右侧路径存车
  187. bool Dispatch_process::is_able_store_right_path()
  188. {
  189. if ( m_parkspace_information_right.parkingspace_index_id !=0 )
  190. {
  191. return true;
  192. }
  193. return false;
  194. }
  195. //能否在3楼路径存车
  196. bool Dispatch_process::is_able_store_temporary_cache_path()
  197. {
  198. if ( m_parkspace_information_temporary.parkingspace_index_id !=0 )
  199. {
  200. return true;
  201. }
  202. return false;
  203. }
  204. //能否在临时缓存位存车
  205. bool Dispatch_process::is_able_store_temporary_cache_path_2nd_floor()
  206. {
  207. if ( m_parkspace_information_temporary.parkingspace_index_id >= 4 && m_parkspace_information_temporary.parkingspace_index_id <= 12 )
  208. {
  209. return true;
  210. }
  211. return false;
  212. }
  213. //能否在临时缓存位存车
  214. bool Dispatch_process::is_able_store_temporary_cache_path_3rd_floor()
  215. {
  216. if ( m_parkspace_information_temporary.parkingspace_index_id >= 19 && m_parkspace_information_temporary.parkingspace_index_id <= 27 )
  217. {
  218. return true;
  219. }
  220. return false;
  221. }
  222. void Dispatch_process::set_main_carrier(std::shared_ptr<Dispatch_device_base> p_carrier)
  223. {
  224. std::unique_lock<std::mutex> t_lock(m_lock);
  225. m_dispatch_carrier_node.mp_main_carrier = p_carrier;
  226. }
  227. std::string Dispatch_process::get_dispatch_control_command_key(Dispatch_catcher_node & dispatch_catcher_node)
  228. {
  229. char t_key[50] = {0};
  230. sprintf(t_key, "%s+%d+%d", m_command_key.c_str(), m_dispatch_process_type, dispatch_catcher_node.m_dispatch_control_status);
  231. std::string t_str = t_key;
  232. return t_str;
  233. }
  234. std::string Dispatch_process::get_dispatch_control_command_key(Dispatch_carrier_node & dispatch_carrier_node)
  235. {
  236. char t_key[50] = {0};
  237. sprintf(t_key, "%s+%d+%d", m_command_key.c_str(), m_dispatch_process_type, dispatch_carrier_node.m_dispatch_control_status);
  238. std::string t_str = t_key;
  239. return t_str;
  240. }
  241. void Dispatch_process::Main()
  242. {
  243. Error_manager t_error;
  244. //主流程, 循环执行
  245. while ( std::chrono::system_clock::now() - m_start_time < std::chrono::milliseconds(m_timeout_ms) )
  246. {
  247. std::this_thread::sleep_for(std::chrono::microseconds(1));
  248. std::this_thread::sleep_for(std::chrono::milliseconds(1));
  249. std::this_thread::sleep_for(std::chrono::milliseconds(100));
  250. #ifdef TIME_TEST
  251. if ( mcarrier == m_dispatch_carrier_node.m_dispatch_control_status && mcatcher == m_dispatch_catcher_node.m_dispatch_control_status )
  252. {
  253. std::this_thread::sleep_for(std::chrono::milliseconds(100));
  254. std::this_thread::sleep_for(std::chrono::seconds(1));
  255. }
  256. else
  257. {
  258. mcarrier = m_dispatch_carrier_node.m_dispatch_control_status;
  259. mcatcher = m_dispatch_catcher_node.m_dispatch_control_status;
  260. }
  261. #endif
  262. std::cout << " huli test ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: " << " m_dispatch_process_status = " << m_dispatch_process_status << " , m_command_key = " << m_command_key << std::endl;
  263. // std::cout << " huli test :::: " << " Dispatch_manager::get_instance_references().m_carrier_map[2]->m_device_one_level_command_key = " << Dispatch_manager::get_instance_references().m_carrier_map[2]->m_device_one_level_command_key << std::endl;
  264. // std::cout << " huli test :::: " << " Dispatch_manager::get_instance_references().m_carrier_map[2]->m_device_two_level_command_key = " << Dispatch_manager::get_instance_references().m_carrier_map[2]->m_device_two_level_command_key << std::endl;
  265. // std::cout << " huli test :::: " << " Dispatch_manager::get_instance_references().m_carrier_map[2]->m_device_three_level_command_key = " << Dispatch_manager::get_instance_references().m_carrier_map[2]->m_device_three_level_command_key << std::endl;
  266. #ifdef TIME_TEST
  267. // Dispatch_coordinates::get_instance_references().cout_space_lock();
  268. #endif
  269. switch ( (Dispatch_process_status)m_dispatch_process_status )
  270. {
  271. case DISPATCH_PROCESS_CREATED://流程创建,
  272. {
  273. //检查调度请求
  274. m_result = check_dispatch_request_msg();
  275. if ( m_result !=Error_code::SUCCESS)
  276. {
  277. m_dispatch_process_status = DISPATCH_PROCESS_FAULT;
  278. break;
  279. }
  280. //发送调度总计划
  281. // m_result = send_dispatch_plan_request_msg();
  282. // if ( m_result !=Error_code::SUCCESS)
  283. // {
  284. // m_dispatch_process_status = DISPATCH_PROCESS_FAULT;
  285. // break;
  286. // }
  287. //流程正常, 就进入等待状态, 等待调度控制发送动作指令
  288. m_dispatch_process_status = DISPATCH_PROCESS_READY;
  289. break;
  290. }
  291. case DISPATCH_PROCESS_READY://流程准备,待机
  292. {
  293. m_result = wait_resource_allocation();
  294. if ( m_result == Error_code::SUCCESS)
  295. {
  296. if ( m_dispatch_process_type == Common_data::Dispatch_process_type::DISPATCH_PROCESS_PICKUP )
  297. {
  298. m_dispatch_catcher_node.m_dispatch_control_status = Dispatch_process::Dispatch_control_status::DISPATCH_CONTROL_READY;
  299. m_dispatch_carrier_node.m_dispatch_control_status = Dispatch_process::Dispatch_control_status::DISPATCH_CONTROL_READY;
  300. m_dispatch_process_status = DISPATCH_PROCESS_WORKING_PICKUP;
  301. }
  302. else if(m_dispatch_process_type == Common_data::Dispatch_process_type::DISPATCH_PROCESS_STORE)
  303. {
  304. m_dispatch_catcher_node.m_dispatch_control_status = Dispatch_process::Dispatch_control_status::DISPATCH_CONTROL_READY;
  305. m_dispatch_carrier_node.m_dispatch_control_status = Dispatch_process::Dispatch_control_status::DISPATCH_CONTROL_READY;
  306. m_dispatch_process_status = DISPATCH_PROCESS_WORKING_STORE;
  307. //根据设备选择, 来设置终点
  308. if ( m_dispatch_carrier_node.mp_main_carrier->get_device_id() == 2 )
  309. {
  310. m_parkspace_information_optimal = m_parkspace_information_temporary;
  311. }
  312. else if ( m_dispatch_carrier_node.mp_main_carrier->get_device_id() == 0 && m_temporary_cache_flag == false )
  313. {
  314. m_parkspace_information_optimal = m_parkspace_information_left;
  315. }
  316. else if ( m_dispatch_carrier_node.mp_main_carrier->get_device_id() == 0 && m_temporary_cache_flag == true)
  317. {
  318. m_parkspace_information_optimal = m_parkspace_information_temporary;
  319. }
  320. else if ( m_dispatch_carrier_node.mp_main_carrier->get_device_id() == 1 && m_temporary_cache_flag == false )
  321. {
  322. m_parkspace_information_optimal = m_parkspace_information_right;
  323. }
  324. else if ( m_dispatch_carrier_node.mp_main_carrier->get_device_id() == 1 && m_temporary_cache_flag == true)
  325. {
  326. m_parkspace_information_optimal = m_parkspace_information_temporary;
  327. }
  328. }
  329. }
  330. //else 一直等待资源分配
  331. break;
  332. //调度控制, 并根据完成情况给答复
  333. // dispatch_control_motion();
  334. //
  335. // //等待调度总计划答复
  336. // m_result = wait_dispatch_plan_response_msg();
  337. // if ( m_result ==Error_code::SUCCESS)
  338. // {
  339. // //流程正常, 就进入完成状态,
  340. // m_dispatch_process_status = DISPATCH_PROCESS_OVER;
  341. // break;
  342. // }
  343. // else if ( m_result !=Error_code::NODATA )
  344. // {
  345. // m_dispatch_process_status = DISPATCH_PROCESS_FAULT;
  346. // break;
  347. // }
  348. //else nodata, 就表示没有新的指令, 那么什么都不做, 原地待命
  349. break;
  350. }
  351. case DISPATCH_PROCESS_WORKING_PICKUP://流程完成
  352. {
  353. //调度控制取车
  354. m_result = dispatch_control_motion_pickup();
  355. if ( m_result ==Error_code::SUCCESS)
  356. {
  357. //流程正常, 就进入完成状态,
  358. m_dispatch_process_status = DISPATCH_PROCESS_OVER;
  359. break;
  360. }
  361. else if ( m_result !=Error_code::NODATA )
  362. {
  363. m_dispatch_process_status = DISPATCH_PROCESS_FAULT;
  364. break;
  365. }
  366. //else nodata, 就表示没有新的指令, 那么什么都不做, 原地待命
  367. break;
  368. }
  369. case DISPATCH_PROCESS_WORKING_STORE://流程完成
  370. {
  371. //调度控制存车
  372. m_result = dispatch_control_motion_store();
  373. if ( m_result ==Error_code::SUCCESS)
  374. {
  375. //流程正常, 就进入完成状态,
  376. m_dispatch_process_status = DISPATCH_PROCESS_OVER;
  377. break;
  378. }
  379. else if ( m_result !=Error_code::NODATA )
  380. {
  381. m_dispatch_process_status = DISPATCH_PROCESS_FAULT;
  382. break;
  383. }
  384. //else nodata, 就表示没有新的指令, 那么什么都不做, 原地待命
  385. break;
  386. }
  387. case DISPATCH_PROCESS_OVER://流程完成
  388. {
  389. //发送调度答复, 发给主控的
  390. m_result = send_dispatch_response_msg();
  391. if ( m_result !=Error_code::SUCCESS)
  392. {
  393. m_dispatch_process_status = DISPATCH_PROCESS_FAULT;
  394. break;
  395. }
  396. //流程正常, 就进入等待状态, 等待调度控制发送动作指令
  397. m_dispatch_process_status = DISPATCH_PROCESS_RELEASE;
  398. break;
  399. }
  400. case DISPATCH_PROCESS_RELEASE://流程释放
  401. {
  402. //通知调度管理, 释放资源,
  403. m_result = release_resource();
  404. if ( m_result !=Error_code::SUCCESS)
  405. {
  406. m_dispatch_process_status = DISPATCH_PROCESS_FAULT;
  407. break;
  408. }
  409. //在这里, 整个流程彻底结束, 之后线程池会自动回收 这个流程对象的资源
  410. return;
  411. break;
  412. }
  413. case DISPATCH_PROCESS_FAULT://故障
  414. {
  415. LOG(INFO) << " m_result = "<< m_result << " " << this;
  416. release_resource();
  417. Exception_handling();
  418. //在这里, 整个流程彻底结束, 之后线程池会自动回收 这个流程对象的资源
  419. return;
  420. break;
  421. }
  422. default:
  423. {
  424. break;
  425. }
  426. }
  427. }
  428. //任务超时
  429. LOG(INFO) << " Dispatch_process::Main() time out "<< this;
  430. return;
  431. }
  432. //检查调度请求
  433. Error_manager Dispatch_process::check_dispatch_request_msg()
  434. {
  435. // std::unique_lock<std::mutex> t_lock(m_lock);
  436. return Error_code::SUCCESS;
  437. }
  438. //等待资源分配
  439. Error_manager Dispatch_process::wait_resource_allocation()
  440. {
  441. //只判断搬运器的指针是否有效.
  442. if ( m_dispatch_carrier_node.mp_main_carrier.get() == NULL )
  443. {
  444. return Error_code::NODATA;
  445. }
  446. else
  447. {
  448. return Error_code::SUCCESS;
  449. }
  450. }
  451. //调度控制取车
  452. Error_manager Dispatch_process::dispatch_control_motion_pickup()
  453. {
  454. std::unique_lock<std::mutex> t_lock(m_lock);
  455. Dispatch_coordinates * tp_dispatch_coordinates = Dispatch_coordinates::get_instance_pointer();
  456. Error_manager t_carrier_error;
  457. Carrier * tp_main_carrier = NULL;
  458. Carrier_task * tp_main_carrier_task = NULL;
  459. if ( m_dispatch_carrier_node.mp_main_carrier.get() != NULL && m_dispatch_carrier_node.mp_main_carrier_task.get() != NULL )
  460. {
  461. tp_main_carrier = (Carrier *)m_dispatch_carrier_node.mp_main_carrier.get();
  462. tp_main_carrier_task = (Carrier_task *)m_dispatch_carrier_node.mp_main_carrier_task.get();
  463. //一级任务被打断后, 重新执行
  464. if ( tp_main_carrier->get_break_flag() )
  465. {
  466. if ( m_dispatch_carrier_node.m_main_carrier_task_level == Dispatch_device_base::Dispatch_task_level::DISPATCH_TASK_ONE_LEVEL )
  467. {
  468. m_dispatch_carrier_node.m_dispatch_control_status = DISPATCH_CARRIER_PICKUP_START;
  469. }
  470. tp_main_carrier->set_break_flag(false);
  471. }
  472. }
  473. Catcher * tp_avoid_catcher = NULL;
  474. Catcher_task * tp_avoid_catcher_task = NULL;
  475. if ( m_dispatch_carrier_node.mp_avoid_catcher.get() != NULL && m_dispatch_carrier_node.mp_avoid_catcher_task.get() != NULL )
  476. {
  477. tp_avoid_catcher = (Catcher *)m_dispatch_carrier_node.mp_avoid_catcher.get();
  478. tp_avoid_catcher_task = (Catcher_task *)m_dispatch_carrier_node.mp_avoid_catcher_task.get();
  479. }
  480. Carrier * tp_avoid_carrier = NULL;
  481. Carrier_task * tp_avoid_carrier_task = NULL;
  482. if ( m_dispatch_carrier_node.mp_avoid_carrier.get() != NULL && m_dispatch_carrier_node.mp_avoid_carrier_task.get() != NULL )
  483. {
  484. tp_avoid_carrier = (Carrier *)m_dispatch_carrier_node.mp_avoid_carrier.get();
  485. tp_avoid_carrier_task = (Carrier_task *)m_dispatch_carrier_node.mp_avoid_carrier_task.get();
  486. }
  487. std::cout << " huli test :::: " << " ===================================================================================================================== = " << "carrier start" << std::endl;
  488. std::cout << " huli test :::: " << " m_dispatch_carrier_node.m_dispatch_control_status = " << m_dispatch_carrier_node.m_dispatch_control_status << std::endl;
  489. if ( m_dispatch_carrier_node.mp_main_carrier.get() != NULL )
  490. {
  491. std::cout << " huli test :::: " << " tp_main_carrier->get_device_id() = " << m_dispatch_carrier_node.mp_main_carrier->get_device_id() <<" + "<< m_dispatch_carrier_node.mp_main_carrier->get_current_command_key() <<" + "<< m_dispatch_carrier_node.mp_main_carrier->get_dispatch_device_status() << std::endl;
  492. }
  493. else
  494. {
  495. std::cout << " huli test :::: " << " tp_main_carrier->get_device_id() = " << -8888 << std::endl;
  496. }
  497. if ( m_dispatch_carrier_node.mp_avoid_catcher.get() != NULL )
  498. {
  499. std::cout << " huli test :::: " << " tp_avoid_catcher->get_device_id() = " << m_dispatch_carrier_node.mp_avoid_catcher->get_device_id() <<" + "<< m_dispatch_carrier_node.mp_avoid_catcher->get_current_command_key() <<" + "<< m_dispatch_carrier_node.mp_avoid_catcher->get_dispatch_device_status() << std::endl;
  500. }
  501. else
  502. {
  503. std::cout << " huli test :::: " << " tp_avoid_catcher->get_device_id() = " << -8888 << std::endl;
  504. }
  505. if ( m_dispatch_carrier_node.mp_avoid_carrier.get() != NULL )
  506. {
  507. std::cout << " huli test :::: " << " tp_avoid_carrier->get_device_id() = " << m_dispatch_carrier_node.mp_avoid_carrier->get_device_id() <<" + "<< m_dispatch_carrier_node.mp_avoid_carrier->get_current_command_key() <<" + "<< m_dispatch_carrier_node.mp_avoid_carrier->get_dispatch_device_status() << std::endl;
  508. }
  509. else
  510. {
  511. std::cout << " huli test :::: " << " tp_avoid_carrier->get_device_id() = " << -8888 << std::endl;
  512. }
  513. //搬运器的控制动作
  514. switch ( m_dispatch_carrier_node.m_dispatch_control_status )
  515. {
  516. case DISPATCH_CONTROL_CREATED:
  517. case DISPATCH_CONTROL_READY://等待调度管理进行资源分配
  518. {
  519. m_dispatch_carrier_node.m_error = check_main_carrier(m_dispatch_carrier_node);
  520. if ( m_dispatch_carrier_node.m_error == Error_code::SUCCESS )
  521. {
  522. if ( m_dispatch_process_type == Common_data::Dispatch_process_type::DISPATCH_PROCESS_PICKUP )
  523. {
  524. m_dispatch_carrier_node.m_dispatch_control_status = Dispatch_process::Dispatch_control_status::DISPATCH_CARRIER_PICKUP_START;
  525. }
  526. else if ( m_dispatch_process_type == Common_data::Dispatch_process_type::DISPATCH_PROCESS_STORE )
  527. {
  528. m_dispatch_carrier_node.m_dispatch_control_status = Dispatch_process::Dispatch_control_status::DISPATCH_CARRIER_STORE_START;
  529. }
  530. }
  531. //else 原地等待
  532. break;
  533. }
  534. case DISPATCH_CARRIER_PICKUP_START://连接搬运器, 创建新的任务单 与设备建立连接
  535. {
  536. //注意了:3楼搬运器必须要和机器人联动, 所以先通知机器人连接
  537. if ( m_dispatch_carrier_node.mp_main_carrier->get_device_id() == 2 )
  538. {
  539. //通知机器人提前开始
  540. m_dispatch_catcher_node.m_dispatch_control_start_flag = true;
  541. m_dispatch_catcher_node.m_following_flag = false;
  542. //等待机器人正常连接之后, 搬运器才正式开始
  543. if ( m_dispatch_catcher_node.m_dispatch_control_status >= DISPATCH_CATCHER_PICKUP_2 )
  544. {
  545. if ( m_dispatch_carrier_node.mp_main_carrier_task.get() == NULL )
  546. {
  547. //连接搬运器, 创建新的任务单 与设备建立连接, 只能成功, 失败就要进入故障处理
  548. m_dispatch_carrier_node.m_error = m_dispatch_carrier_node.mp_main_carrier->check_task_level(Dispatch_device_base::Dispatch_task_level::DISPATCH_TASK_ONE_LEVEL);
  549. if ( m_dispatch_carrier_node.m_error == Error_code::SUCCESS )
  550. {
  551. m_dispatch_carrier_node.m_error = connect_dispatch_carrier(m_dispatch_carrier_node.mp_main_carrier, m_dispatch_carrier_node.mp_main_carrier_task, Dispatch_device_base::Dispatch_task_level::DISPATCH_TASK_ONE_LEVEL);
  552. if ( m_dispatch_carrier_node.m_error == Error_code::SUCCESS )
  553. {
  554. m_dispatch_carrier_node.m_main_carrier_task_level = Dispatch_device_base::Dispatch_task_level::DISPATCH_TASK_ONE_LEVEL;
  555. m_dispatch_carrier_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_carrier_node.m_dispatch_control_status+1);
  556. }
  557. else
  558. {
  559. m_dispatch_carrier_node.m_dispatch_control_status = Dispatch_process::Dispatch_control_status::DISPATCH_CONTROL_FAULT;
  560. }
  561. }
  562. else
  563. {
  564. m_dispatch_carrier_node.m_dispatch_control_status = Dispatch_process::Dispatch_control_status::DISPATCH_CONTROL_FAULT;
  565. }
  566. }
  567. else
  568. {
  569. m_dispatch_carrier_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_carrier_node.m_dispatch_control_status+2);
  570. }
  571. }
  572. //else 无限等待
  573. }
  574. else
  575. {
  576. if ( m_dispatch_carrier_node.mp_main_carrier_task.get() == NULL )
  577. {
  578. //连接搬运器, 创建新的任务单 与设备建立连接, 只能成功, 失败就要进入故障处理
  579. m_dispatch_carrier_node.m_error = m_dispatch_carrier_node.mp_main_carrier->check_task_level(Dispatch_device_base::Dispatch_task_level::DISPATCH_TASK_ONE_LEVEL);
  580. if ( m_dispatch_carrier_node.m_error == Error_code::SUCCESS )
  581. {
  582. m_dispatch_carrier_node.m_error = connect_dispatch_carrier(m_dispatch_carrier_node.mp_main_carrier, m_dispatch_carrier_node.mp_main_carrier_task, Dispatch_device_base::Dispatch_task_level::DISPATCH_TASK_ONE_LEVEL);
  583. if ( m_dispatch_carrier_node.m_error == Error_code::SUCCESS )
  584. {
  585. m_dispatch_carrier_node.m_main_carrier_task_level = Dispatch_device_base::Dispatch_task_level::DISPATCH_TASK_ONE_LEVEL;
  586. m_dispatch_carrier_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_carrier_node.m_dispatch_control_status+1);
  587. }
  588. else
  589. {
  590. m_dispatch_carrier_node.m_dispatch_control_status = Dispatch_process::Dispatch_control_status::DISPATCH_CONTROL_FAULT;
  591. }
  592. }
  593. else
  594. {
  595. m_dispatch_carrier_node.m_dispatch_control_status = Dispatch_process::Dispatch_control_status::DISPATCH_CONTROL_FAULT;
  596. }
  597. }
  598. else
  599. {
  600. m_dispatch_carrier_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_carrier_node.m_dispatch_control_status+2);
  601. }
  602. }
  603. break;
  604. }
  605. case DISPATCH_CARRIER_PICKUP_1:
  606. {
  607. m_dispatch_carrier_node.m_error = check_task_status(m_dispatch_carrier_node.mp_main_carrier_task, m_dispatch_carrier_node.m_dispatch_control_status);
  608. break;
  609. }
  610. case DISPATCH_CARRIER_PICKUP_2://搬运器 准备开始, 需要同步任务单和设备真实数据
  611. {
  612. //注意了:3楼搬运器必须要和机器人联动, 所以必须等机器人连接上之后,搬运器才开始启动
  613. if ( m_dispatch_carrier_node.mp_main_carrier->get_device_id() == 2 )
  614. {
  615. //等待机器人正常连接之后, 搬运器才正式开始
  616. if ( m_dispatch_catcher_node.m_dispatch_control_status >= DISPATCH_CATCHER_PICKUP_2 )
  617. {
  618. //搬运器 准备开始, 需要同步任务单和设备真实数据.//注意了:连接设备只是预约, 设备不一定立刻执行.所以需要在连接成功之后进行数据同步
  619. carrier_ready_to_start(get_dispatch_control_command_key(m_dispatch_carrier_node), tp_main_carrier, tp_main_carrier_task, tp_dispatch_coordinates);
  620. m_dispatch_carrier_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_carrier_node.m_dispatch_control_status+1);
  621. }
  622. //else 无限等待
  623. }
  624. else
  625. {
  626. //搬运器 准备开始, 需要同步任务单和设备真实数据.//注意了:连接设备只是预约, 设备不一定立刻执行.所以需要在连接成功之后进行数据同步
  627. carrier_ready_to_start(get_dispatch_control_command_key(m_dispatch_carrier_node), tp_main_carrier, tp_main_carrier_task, tp_dispatch_coordinates);
  628. m_dispatch_carrier_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_carrier_node.m_dispatch_control_status+1);
  629. }
  630. break;
  631. }
  632. case DISPATCH_CARRIER_PICKUP_3:
  633. {
  634. m_dispatch_carrier_node.m_error = check_task_status(m_dispatch_carrier_node.mp_main_carrier_task, m_dispatch_carrier_node.m_dispatch_control_status);
  635. //注意了:同步失败,需要重新同步.
  636. if ( m_dispatch_carrier_node.m_error != Error_code::SUCCESS )
  637. {
  638. m_dispatch_carrier_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status::DISPATCH_CARRIER_PICKUP_2);
  639. }
  640. break;
  641. }
  642. case DISPATCH_CARRIER_PICKUP_4://搬运器检查姿态 //搬运器调整到 正常待机的姿态(调节夹杆和轴距)
  643. {
  644. if ( tp_main_carrier->m_actual_load_status == Dispatch_device_base::Load_status::NO_CAR )
  645. {
  646. if ( tp_main_carrier_task->m_request_clamp_motion == Carrier_task::Clamp_motion::E_CLAMP_LOOSE &&
  647. Common_data::approximate_difference(m_wheel_base, tp_main_carrier->m_actual_y1-tp_main_carrier->m_actual_y2, DISPATCH_DEFAULT_DIFFERENCE))
  648. {
  649. m_dispatch_carrier_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_carrier_node.m_dispatch_control_status+2);
  650. }
  651. else
  652. {
  653. //搬运器调整到 正常待机的姿态(调节夹杆和轴距)
  654. carrier_adjust_to_ready(get_dispatch_control_command_key(m_dispatch_carrier_node), tp_main_carrier, tp_main_carrier_task, tp_dispatch_coordinates);
  655. m_dispatch_carrier_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_carrier_node.m_dispatch_control_status+1);
  656. }
  657. }
  658. else
  659. {
  660. m_dispatch_carrier_node.m_dispatch_control_status = Dispatch_process::Dispatch_control_status::DISPATCH_CONTROL_FAULT;
  661. m_dispatch_carrier_node.m_error = Error_manager(Error_code::CARRIER_POSE_ERROR, Error_level::MINOR_ERROR,
  662. "DISPATCH_CARRIER_PICKUP_4 tp_carrier->m_actual_load_status != Dispatch_device_base::Load_status::NO_CAR fun error ");
  663. }
  664. break;
  665. }
  666. case DISPATCH_CARRIER_PICKUP_5:
  667. {
  668. m_dispatch_carrier_node.m_error = check_task_status(m_dispatch_carrier_node.mp_main_carrier_task, m_dispatch_carrier_node.m_dispatch_control_status);
  669. break;
  670. }
  671. case DISPATCH_CARRIER_PICKUP_6://让小跑车回到中跑车上, y轴移动
  672. {
  673. if ( Common_data::approximate_difference(tp_main_carrier->m_actual_y, tp_dispatch_coordinates->m_carrier_default_y_back, DISPATCH_DEFAULT_DIFFERENCE) )
  674. {
  675. m_dispatch_carrier_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_carrier_node.m_dispatch_control_status+2);
  676. }
  677. else
  678. {
  679. carrier_move_y(get_dispatch_control_command_key(m_dispatch_carrier_node), tp_main_carrier, tp_main_carrier_task, tp_dispatch_coordinates, tp_dispatch_coordinates->m_carrier_default_y_back);
  680. m_dispatch_carrier_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_carrier_node.m_dispatch_control_status+1);
  681. }
  682. break;
  683. }
  684. case DISPATCH_CARRIER_PICKUP_7:
  685. {
  686. m_dispatch_carrier_node.m_error = check_task_status(m_dispatch_carrier_node.mp_main_carrier_task, m_dispatch_carrier_node.m_dispatch_control_status);
  687. break;
  688. }
  689. case DISPATCH_CARRIER_PICKUP_8://让中跑车回到电梯井, 进行x轴路径检查
  690. {
  691. float t_z = tp_dispatch_coordinates->m_carrier_coordinates_map[m_parkspace_information_optimal.parkingspace_index_id].z;
  692. if ( Common_data::approximate_difference(tp_main_carrier->m_actual_z, t_z, DISPATCH_DEFAULT_DIFFERENCE) )
  693. {
  694. //直接到 20步 , 准备同层移动到车位
  695. m_dispatch_carrier_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status::DISPATCH_CARRIER_PICKUP_20);
  696. if ( tp_main_carrier->get_device_id() == 2 )
  697. {
  698. //3楼的搬运器直接到 22步
  699. m_dispatch_carrier_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status::DISPATCH_CARRIER_PICKUP_22);
  700. }
  701. }
  702. else
  703. {
  704. //如果是3楼, 直接报错, 因为3楼搬运器只能在3楼移动, z轴真实值和目标值 一定是相同的
  705. if ( tp_main_carrier->get_device_id() !=0 && tp_main_carrier->get_device_id() !=1 )
  706. {
  707. m_dispatch_carrier_node.m_dispatch_control_status = Dispatch_process::Dispatch_control_status::DISPATCH_CONTROL_FAULT;
  708. m_dispatch_carrier_node.m_error = Error_manager(Error_code::CARRIER_CONRTOL_PARAMETER_ERROR, Error_level::MINOR_ERROR,
  709. "DISPATCH_CARRIER_PICKUP_8 tp_main_carrier->get_device_id() PARAMRTER ERROR ");
  710. }
  711. else
  712. {
  713. int t_avoid_catcher_id = -1; //需要避让的机器人
  714. //空间锁判断, 是否需要机器人避让
  715. if ( tp_main_carrier->get_device_id() == 0 )
  716. {
  717. m_dispatch_carrier_node.m_error = tp_dispatch_coordinates->carrier_try_space_lock(tp_main_carrier->m_actual_coordinates_rows, 0,
  718. tp_main_carrier->m_actual_coordinates_rows, tp_main_carrier->m_actual_coordinates_columns,
  719. tp_main_carrier->get_device_id(), t_avoid_catcher_id);
  720. }
  721. else if ( tp_main_carrier->get_device_id() == 1 )
  722. {
  723. m_dispatch_carrier_node.m_error = tp_dispatch_coordinates->carrier_try_space_lock(tp_main_carrier->m_actual_coordinates_rows, tp_main_carrier->m_actual_coordinates_columns,
  724. tp_main_carrier->m_actual_coordinates_rows, tp_dispatch_coordinates->m_space_lock_columns-1,
  725. tp_main_carrier->get_device_id(), t_avoid_catcher_id);
  726. }
  727. //判断结果
  728. if ( m_dispatch_carrier_node.m_error == Error_code::SUCCESS )
  729. {
  730. //成功则直接跳转, 不用避让, 直接控制搬运器直到电梯井
  731. m_dispatch_carrier_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status::DISPATCH_CARRIER_PICKUP_14);
  732. }
  733. else if(t_avoid_catcher_id != -1)
  734. {
  735. if ( m_dispatch_carrier_node.mp_avoid_catcher.get() == NULL )
  736. {
  737. m_dispatch_carrier_node.mp_avoid_catcher = Dispatch_manager::get_instance_references().m_catcher_map[t_avoid_catcher_id];
  738. }
  739. if ( m_dispatch_carrier_node.mp_avoid_catcher_task.get() == NULL )
  740. {
  741. //连接避让设备 使得避让机器人进行避让
  742. m_dispatch_carrier_node.m_error = m_dispatch_carrier_node.mp_avoid_catcher->check_task_level(Dispatch_device_base::Dispatch_task_level::DISPATCH_TASK_TWO_LEVEL);
  743. if ( m_dispatch_carrier_node.m_error == Error_code::SUCCESS )
  744. {
  745. m_dispatch_carrier_node.m_error = connect_dispatch_catcher(m_dispatch_carrier_node.mp_avoid_catcher, m_dispatch_carrier_node.mp_avoid_catcher_task, Dispatch_device_base::Dispatch_task_level::DISPATCH_TASK_TWO_LEVEL);
  746. if ( m_dispatch_carrier_node.m_error == Error_code::SUCCESS )
  747. {
  748. m_dispatch_carrier_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_carrier_node.m_dispatch_control_status+1);
  749. }
  750. }
  751. //else 抓取器的资源自由争抢, 如果没有抢到, 那么重复连接
  752. }
  753. else
  754. {
  755. m_dispatch_carrier_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_carrier_node.m_dispatch_control_status+2);
  756. }
  757. }
  758. else
  759. {
  760. m_dispatch_carrier_node.m_dispatch_control_status = Dispatch_process::Dispatch_control_status::DISPATCH_CONTROL_FAULT;
  761. m_dispatch_carrier_node.m_error = Error_manager(Error_code::CARRIER_CONRTOL_PARAMETER_ERROR, Error_level::MINOR_ERROR,
  762. "DISPATCH_CARRIER_PICKUP_8 carrier_try_space_lock fun ERROR ");
  763. }
  764. }
  765. }
  766. break;
  767. }
  768. case DISPATCH_CARRIER_PICKUP_9:
  769. {
  770. m_dispatch_carrier_node.m_error = check_task_status(m_dispatch_carrier_node.mp_avoid_catcher_task, m_dispatch_carrier_node.m_dispatch_control_status);
  771. break;
  772. }
  773. case DISPATCH_CARRIER_PICKUP_10://机器人避让到最高点, 机器人上升不需要判断空间锁
  774. {
  775. catcher_move_z(get_dispatch_control_command_key(m_dispatch_carrier_node), tp_avoid_catcher, tp_avoid_catcher_task, tp_dispatch_coordinates, tp_dispatch_coordinates->m_catcher_4th_floor_z);
  776. m_dispatch_carrier_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_carrier_node.m_dispatch_control_status+1);
  777. break;
  778. }
  779. case DISPATCH_CARRIER_PICKUP_11://机器人释放 空间锁
  780. {
  781. m_dispatch_carrier_node.m_error = check_task_status(m_dispatch_carrier_node.mp_avoid_catcher_task, m_dispatch_carrier_node.m_dispatch_control_status);
  782. if ( m_dispatch_carrier_node.m_error == Error_code::SUCCESS )
  783. {
  784. tp_dispatch_coordinates->catcher_space_unlock(tp_avoid_catcher->m_actual_coordinates_id, tp_avoid_catcher->get_device_id());
  785. }
  786. break;
  787. }
  788. case DISPATCH_CARRIER_PICKUP_12://搬运器空间锁判断, 必须成功
  789. {
  790. int t_avoid_catcher_id = -1; //需要避让的机器人
  791. if ( tp_main_carrier->get_device_id() == 0 )
  792. {
  793. m_dispatch_carrier_node.m_error = tp_dispatch_coordinates->carrier_try_space_lock(tp_main_carrier->m_actual_coordinates_rows, 0,
  794. tp_main_carrier->m_actual_coordinates_rows, tp_main_carrier->m_actual_coordinates_columns,
  795. tp_main_carrier->get_device_id(), t_avoid_catcher_id);
  796. }
  797. else if ( tp_main_carrier->get_device_id() == 1 )
  798. {
  799. m_dispatch_carrier_node.m_error = tp_dispatch_coordinates->carrier_try_space_lock(tp_main_carrier->m_actual_coordinates_rows, tp_main_carrier->m_actual_coordinates_columns,
  800. tp_main_carrier->m_actual_coordinates_rows, tp_dispatch_coordinates->m_space_lock_columns-1,
  801. tp_main_carrier->get_device_id(), t_avoid_catcher_id);
  802. }
  803. //判断结果
  804. if ( m_dispatch_carrier_node.m_error == Error_code::SUCCESS )
  805. {
  806. m_dispatch_carrier_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_carrier_node.m_dispatch_control_status+1);
  807. }
  808. else
  809. {
  810. m_dispatch_carrier_node.m_dispatch_control_status = Dispatch_process::Dispatch_control_status::DISPATCH_CONTROL_FAULT;
  811. }
  812. break;
  813. }
  814. case DISPATCH_CARRIER_PICKUP_13://避让机器人 断连
  815. {
  816. if ( m_dispatch_carrier_node.mp_avoid_catcher.get() != NULL && m_dispatch_carrier_node.mp_avoid_catcher_task.get() != NULL )
  817. {
  818. disconnect_dispatch_device(m_dispatch_carrier_node.mp_avoid_catcher, m_dispatch_carrier_node.mp_avoid_catcher_task);
  819. }
  820. m_dispatch_carrier_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_carrier_node.m_dispatch_control_status+1);
  821. break;
  822. }
  823. case DISPATCH_CARRIER_PICKUP_14://让中跑车回到电梯井, x轴移动
  824. {
  825. if ( tp_main_carrier->get_device_id() == 0 )
  826. {
  827. carrier_move_x(get_dispatch_control_command_key(m_dispatch_carrier_node), tp_main_carrier, tp_main_carrier_task, tp_dispatch_coordinates, tp_dispatch_coordinates->m_carrier_default_x_left);
  828. m_dispatch_carrier_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_carrier_node.m_dispatch_control_status+1);
  829. }
  830. else if ( tp_main_carrier->get_device_id() == 1 )
  831. {
  832. carrier_move_x(get_dispatch_control_command_key(m_dispatch_carrier_node), tp_main_carrier, tp_main_carrier_task, tp_dispatch_coordinates, tp_dispatch_coordinates->m_carrier_default_x_right);
  833. m_dispatch_carrier_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_carrier_node.m_dispatch_control_status+1);
  834. }
  835. else
  836. {
  837. m_dispatch_carrier_node.m_dispatch_control_status = Dispatch_process::Dispatch_control_status::DISPATCH_CONTROL_FAULT;
  838. m_dispatch_carrier_node.m_error = Error_manager(Error_code::CARRIER_CONRTOL_PARAMETER_ERROR, Error_level::MINOR_ERROR,
  839. "DISPATCH_CARRIER_PICKUP_14 tp_main_carrier->get_device_id() PARAMRTER ERROR ");
  840. }
  841. break;
  842. }
  843. case DISPATCH_CARRIER_PICKUP_15://搬运器 释放空间锁
  844. {
  845. m_dispatch_carrier_node.m_error = check_task_status(m_dispatch_carrier_node.mp_main_carrier_task, m_dispatch_carrier_node.m_dispatch_control_status);
  846. if ( m_dispatch_carrier_node.m_error == Error_code::SUCCESS )
  847. {
  848. m_dispatch_carrier_node.m_error = tp_dispatch_coordinates->carrier_space_unlock(tp_main_carrier->get_device_id());
  849. }
  850. break;
  851. }
  852. case DISPATCH_CARRIER_PICKUP_16://中跑车收回对接,之后中跑车固定在电梯上不能X轴移动,电梯可以Z轴移动
  853. {
  854. carrier_joint_x(get_dispatch_control_command_key(m_dispatch_carrier_node), tp_main_carrier, tp_main_carrier_task, tp_dispatch_coordinates, Carrier_task::Joint_motion::E_JOINT_TAKE_BACK);
  855. m_dispatch_carrier_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_carrier_node.m_dispatch_control_status+1);
  856. break;
  857. }
  858. case DISPATCH_CARRIER_PICKUP_17:
  859. {
  860. m_dispatch_carrier_node.m_error = check_task_status(m_dispatch_carrier_node.mp_main_carrier_task, m_dispatch_carrier_node.m_dispatch_control_status);
  861. break;
  862. }
  863. case DISPATCH_CARRIER_PICKUP_18: //电梯移动到对应的楼层, 搬运器在电梯里面z轴移动, 不需要判断空间锁
  864. {
  865. float t_z = tp_dispatch_coordinates->m_carrier_coordinates_map[m_parkspace_information_optimal.parkingspace_index_id].z;
  866. carrier_move_z(get_dispatch_control_command_key(m_dispatch_carrier_node), tp_main_carrier, tp_main_carrier_task, tp_dispatch_coordinates, t_z);
  867. m_dispatch_carrier_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_carrier_node.m_dispatch_control_status+1);
  868. break;
  869. }
  870. case DISPATCH_CARRIER_PICKUP_19:
  871. {
  872. m_dispatch_carrier_node.m_error = check_task_status(m_dispatch_carrier_node.mp_main_carrier_task, m_dispatch_carrier_node.m_dispatch_control_status);
  873. break;
  874. }
  875. case DISPATCH_CARRIER_PICKUP_20://伸出对接,之后中跑车可以x轴移动,电梯不能Z轴移动
  876. {
  877. if ( tp_main_carrier->m_actual_joint_motion_x1 == Dispatch_device_base::Joint_motion::E_JOINT_TAKE_BACK )
  878. {
  879. carrier_joint_x(get_dispatch_control_command_key(m_dispatch_carrier_node), tp_main_carrier, tp_main_carrier_task, tp_dispatch_coordinates, Carrier_task::Joint_motion::E_JOINT_HOLD_OUT);
  880. m_dispatch_carrier_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_carrier_node.m_dispatch_control_status+1);
  881. }
  882. else
  883. {
  884. m_dispatch_carrier_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_carrier_node.m_dispatch_control_status+2);
  885. }
  886. break;
  887. }
  888. case DISPATCH_CARRIER_PICKUP_21:
  889. {
  890. m_dispatch_carrier_node.m_error = check_task_status(m_dispatch_carrier_node.mp_main_carrier_task, m_dispatch_carrier_node.m_dispatch_control_status);
  891. break;
  892. }
  893. case DISPATCH_CARRIER_PICKUP_22://中跑车 x轴移动到车位, 进行x轴路径检查
  894. {
  895. float t_x = tp_dispatch_coordinates->m_carrier_coordinates_map[m_parkspace_information_optimal.parkingspace_index_id].x;
  896. int t_column = (m_parkspace_information_optimal.parkingspace_index_id-1) % tp_dispatch_coordinates->m_space_lock_columns;
  897. if ( Common_data::approximate_difference(tp_main_carrier->m_actual_x, t_x, DISPATCH_DEFAULT_DIFFERENCE) )
  898. {
  899. //搬运器不用x轴运动, 直接到29步, 去车位取车
  900. m_dispatch_carrier_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status::DISPATCH_CARRIER_PICKUP_30);
  901. }
  902. else
  903. {
  904. int t_avoid_catcher_id = -1; //需要避让的机器人
  905. if ( tp_main_carrier->get_device_id() == 0 && t_column <13-1)
  906. {
  907. m_dispatch_carrier_node.m_error = tp_dispatch_coordinates->carrier_try_space_lock(tp_main_carrier->m_actual_coordinates_rows, 0,
  908. tp_main_carrier->m_actual_coordinates_rows, t_column+1,
  909. tp_main_carrier->get_device_id(), t_avoid_catcher_id);
  910. }
  911. else if ( tp_main_carrier->get_device_id() == 1 && t_column >3-1)
  912. {
  913. m_dispatch_carrier_node.m_error = tp_dispatch_coordinates->carrier_try_space_lock(tp_main_carrier->m_actual_coordinates_rows, t_column-1,
  914. tp_main_carrier->m_actual_coordinates_rows, tp_dispatch_coordinates->m_space_lock_columns-1,
  915. tp_main_carrier->get_device_id(), t_avoid_catcher_id);
  916. }
  917. else if ( tp_main_carrier->get_device_id() == 2 )
  918. {
  919. //3楼搬运器不用加锁, 直接x轴移动
  920. m_dispatch_carrier_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status::DISPATCH_CARRIER_PICKUP_28);
  921. break;//切换流程
  922. }
  923. else
  924. {
  925. m_dispatch_carrier_node.m_dispatch_control_status = Dispatch_process::Dispatch_control_status::DISPATCH_CONTROL_FAULT;
  926. m_dispatch_carrier_node.m_error = Error_manager(Error_code::CARRIER_CONRTOL_PARAMETER_ERROR, Error_level::MINOR_ERROR,
  927. "DISPATCH_CARRIER_PICKUP_22 tp_main_carrier->get_device_id() and m_parkspace_information_optimal.parkingspace_index_id PARAMRTER ERROR ");
  928. break;//切换流程
  929. }
  930. //判断结果
  931. if ( m_dispatch_carrier_node.m_error == Error_code::SUCCESS )
  932. {
  933. //左右搬运器加锁成功, 直接x轴移动
  934. m_dispatch_carrier_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status::DISPATCH_CARRIER_PICKUP_28);
  935. }
  936. else if(t_avoid_catcher_id != -1 &&
  937. (tp_main_carrier->m_actual_coordinates_rows == 2 || tp_main_carrier->m_actual_coordinates_rows == 1))//4楼取车, 机器人进行避让
  938. {
  939. if ( m_dispatch_carrier_node.mp_avoid_catcher.get() == NULL )
  940. {
  941. m_dispatch_carrier_node.mp_avoid_catcher = Dispatch_manager::get_instance_references().m_catcher_map[t_avoid_catcher_id];
  942. }
  943. if ( m_dispatch_carrier_node.mp_avoid_carrier.get() == NULL )
  944. {
  945. m_dispatch_carrier_node.mp_avoid_carrier = Dispatch_manager::get_instance_references().m_carrier_map[2];
  946. }
  947. //连接4楼机器人和3楼搬运器
  948. Error_manager t_catcher_error;
  949. Error_manager t_carrier_error;
  950. if ( m_dispatch_carrier_node.mp_avoid_catcher_task.get() == NULL && m_dispatch_carrier_node.mp_avoid_carrier_task.get() == NULL)
  951. {
  952. //连接避让设备 使得避让机器人进行避让
  953. t_catcher_error = m_dispatch_carrier_node.mp_avoid_catcher->check_task_level(Dispatch_device_base::Dispatch_task_level::DISPATCH_TASK_TWO_LEVEL);
  954. t_carrier_error = m_dispatch_carrier_node.mp_avoid_carrier->check_task_level(Dispatch_device_base::Dispatch_task_level::DISPATCH_TASK_TWO_LEVEL);
  955. if ( t_catcher_error == Error_code::SUCCESS && t_carrier_error == Error_code::SUCCESS)
  956. {
  957. t_catcher_error = connect_dispatch_catcher(m_dispatch_carrier_node.mp_avoid_catcher, m_dispatch_carrier_node.mp_avoid_catcher_task, Dispatch_device_base::Dispatch_task_level::DISPATCH_TASK_TWO_LEVEL);
  958. if ( t_catcher_error == Error_code::SUCCESS )
  959. {
  960. t_carrier_error = connect_dispatch_carrier(m_dispatch_carrier_node.mp_avoid_carrier, m_dispatch_carrier_node.mp_avoid_carrier_task, Dispatch_device_base::Dispatch_task_level::DISPATCH_TASK_TWO_LEVEL);
  961. if ( t_carrier_error == Error_code::SUCCESS )
  962. {
  963. m_dispatch_carrier_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_carrier_node.m_dispatch_control_status+1);
  964. }
  965. else
  966. {
  967. m_dispatch_carrier_node.m_dispatch_control_status = Dispatch_process::Dispatch_control_status::DISPATCH_CONTROL_FAULT;
  968. m_dispatch_carrier_node.m_error = Error_manager(Error_code::CARRIER_CONRTOL_PARAMETER_ERROR, Error_level::MINOR_ERROR,
  969. "DISPATCH_CARRIER_PICKUP_22 connect_dispatch_carrier ERROR ");
  970. break;//切换流程
  971. }
  972. }
  973. }
  974. //else 抓取器的资源自由争抢, 如果没有抢到, 那么重复连接
  975. }
  976. else if ( m_dispatch_carrier_node.mp_avoid_catcher_task.get() != NULL && m_dispatch_carrier_node.mp_avoid_carrier_task.get() != NULL )
  977. {
  978. m_dispatch_carrier_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_carrier_node.m_dispatch_control_status+2);
  979. }
  980. else
  981. {
  982. m_dispatch_carrier_node.m_dispatch_control_status = Dispatch_process::Dispatch_control_status::DISPATCH_CONTROL_FAULT;
  983. m_dispatch_carrier_node.m_error = Error_manager(Error_code::CARRIER_CONRTOL_PARAMETER_ERROR, Error_level::MINOR_ERROR,
  984. "DISPATCH_CARRIER_PICKUP_22 m_dispatch_carrier_node.mp_avoid_catcher_task.get() m_dispatch_carrier_node.mp_avoid_carrier_task.get() ERROR ");
  985. break;//切换流程
  986. }
  987. }
  988. //else 无限等待
  989. }
  990. break;
  991. }
  992. case DISPATCH_CARRIER_PICKUP_23:
  993. {
  994. m_dispatch_carrier_node.m_error = check_task_status(m_dispatch_carrier_node.mp_avoid_catcher_task, m_dispatch_carrier_node.m_dispatch_control_status);
  995. break;
  996. }
  997. case DISPATCH_CARRIER_PICKUP_24://让4楼机器人进行避让, 先加锁, 在避让
  998. {
  999. //机器人避让距离, 4楼避让4个车位, 3楼避让2个车位
  1000. int m_avoid_distance = 0;
  1001. int t_row = (m_parkspace_information_optimal.parkingspace_index_id-1) / tp_dispatch_coordinates->m_space_lock_columns;
  1002. if ( t_row == 1 )
  1003. {
  1004. m_avoid_distance = 3;
  1005. }
  1006. else
  1007. {
  1008. m_avoid_distance = 3;
  1009. }
  1010. int t_column = (m_parkspace_information_optimal.parkingspace_index_id-1) % tp_dispatch_coordinates->m_space_lock_columns;
  1011. //4楼搬运器需要避让4个车位
  1012. if ( tp_main_carrier->get_device_id() == 0 && tp_avoid_catcher->m_actual_coordinates_columns < t_column+m_avoid_distance )
  1013. {
  1014. m_dispatch_carrier_node.m_error = tp_dispatch_coordinates->catcher_try_space_lock(1, tp_avoid_catcher->m_actual_coordinates_columns,
  1015. 2, t_column+m_avoid_distance+1,
  1016. tp_avoid_catcher->get_device_id());
  1017. //判断结果
  1018. if ( m_dispatch_carrier_node.m_error == Error_code::SUCCESS )
  1019. {
  1020. //机器人移到42号口
  1021. float t_x = tp_dispatch_coordinates->m_carrier_coordinates_map[m_parkspace_information_optimal.parkingspace_index_id+m_avoid_distance].x;
  1022. catcher_move_x(get_dispatch_control_command_key(m_dispatch_carrier_node), tp_avoid_catcher, tp_avoid_catcher_task, tp_dispatch_coordinates, t_x);
  1023. carrier_move_x(get_dispatch_control_command_key(m_dispatch_carrier_node), tp_avoid_carrier, tp_avoid_carrier_task, tp_dispatch_coordinates, t_x);
  1024. m_dispatch_carrier_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_carrier_node.m_dispatch_control_status+1);
  1025. }
  1026. //else 无限等待
  1027. }
  1028. else if ( tp_main_carrier->get_device_id() == 1 && tp_avoid_catcher->m_actual_coordinates_columns > t_column-m_avoid_distance)
  1029. {
  1030. m_dispatch_carrier_node.m_error = tp_dispatch_coordinates->catcher_try_space_lock(1, t_column-m_avoid_distance-1,
  1031. 2, tp_avoid_catcher->m_actual_coordinates_columns,
  1032. tp_avoid_catcher->get_device_id());
  1033. //判断结果
  1034. if ( m_dispatch_carrier_node.m_error == Error_code::SUCCESS )
  1035. {
  1036. //机器人移到34号口
  1037. float t_x = tp_dispatch_coordinates->m_carrier_coordinates_map[m_parkspace_information_optimal.parkingspace_index_id-m_avoid_distance].x;
  1038. catcher_move_x(get_dispatch_control_command_key(m_dispatch_carrier_node), tp_avoid_catcher, tp_avoid_catcher_task, tp_dispatch_coordinates, t_x);
  1039. carrier_move_x(get_dispatch_control_command_key(m_dispatch_carrier_node), tp_avoid_carrier, tp_avoid_carrier_task, tp_dispatch_coordinates, t_x);
  1040. m_dispatch_carrier_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_carrier_node.m_dispatch_control_status+1);
  1041. }
  1042. //else 无限等待
  1043. }
  1044. else
  1045. {
  1046. m_dispatch_carrier_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_carrier_node.m_dispatch_control_status+1);
  1047. }
  1048. break;
  1049. }
  1050. case DISPATCH_CARRIER_PICKUP_25://机器人释放 空间锁
  1051. {
  1052. m_dispatch_carrier_node.m_error = check_task_status(m_dispatch_carrier_node.mp_avoid_catcher_task);
  1053. m_dispatch_carrier_node.m_error.compare_and_cover_error(check_task_status(m_dispatch_carrier_node.mp_avoid_carrier_task));
  1054. if ( m_dispatch_carrier_node.m_error == Error_code::SUCCESS )
  1055. {
  1056. tp_dispatch_coordinates->catcher_space_unlock(tp_avoid_catcher->m_actual_coordinates_id, tp_avoid_catcher->get_device_id());
  1057. m_dispatch_carrier_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_carrier_node.m_dispatch_control_status+1);
  1058. }
  1059. break;
  1060. }
  1061. case DISPATCH_CARRIER_PICKUP_26://搬运器空间锁判断, 必须成功
  1062. {
  1063. int t_column = (m_parkspace_information_optimal.parkingspace_index_id-1) % tp_dispatch_coordinates->m_space_lock_columns;
  1064. int t_avoid_catcher_id = -1; //需要避让的机器人
  1065. if ( tp_main_carrier->get_device_id() == 0 && t_column <13-1)
  1066. {
  1067. m_dispatch_carrier_node.m_error = tp_dispatch_coordinates->carrier_try_space_lock(tp_main_carrier->m_actual_coordinates_rows, 0,
  1068. tp_main_carrier->m_actual_coordinates_rows, t_column+1,
  1069. tp_main_carrier->get_device_id(), t_avoid_catcher_id);
  1070. }
  1071. else if ( tp_main_carrier->get_device_id() == 1 && t_column >3-1)
  1072. {
  1073. m_dispatch_carrier_node.m_error = tp_dispatch_coordinates->carrier_try_space_lock(tp_main_carrier->m_actual_coordinates_rows, t_column-1,
  1074. tp_main_carrier->m_actual_coordinates_rows, tp_dispatch_coordinates->m_space_lock_columns-1,
  1075. tp_main_carrier->get_device_id(), t_avoid_catcher_id);
  1076. }
  1077. //判断结果
  1078. if ( m_dispatch_carrier_node.m_error == Error_code::SUCCESS )
  1079. {
  1080. m_dispatch_carrier_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_carrier_node.m_dispatch_control_status+1);
  1081. }
  1082. else
  1083. {
  1084. m_dispatch_carrier_node.m_dispatch_control_status = Dispatch_process::Dispatch_control_status::DISPATCH_CONTROL_FAULT;
  1085. }
  1086. break;
  1087. }
  1088. case DISPATCH_CARRIER_PICKUP_27://避让机器人 断连
  1089. {
  1090. if ( m_dispatch_carrier_node.mp_avoid_catcher.get() != NULL && m_dispatch_carrier_node.mp_avoid_catcher_task.get() != NULL )
  1091. {
  1092. //避让机器人 断开连接
  1093. disconnect_dispatch_device(m_dispatch_carrier_node.mp_avoid_catcher, m_dispatch_carrier_node.mp_avoid_catcher_task);
  1094. }
  1095. if ( m_dispatch_carrier_node.mp_avoid_carrier.get() != NULL && m_dispatch_carrier_node.mp_avoid_carrier_task.get() != NULL )
  1096. {
  1097. //避让机器人 断开连接
  1098. disconnect_dispatch_device(m_dispatch_carrier_node.mp_avoid_carrier, m_dispatch_carrier_node.mp_avoid_carrier_task);
  1099. }
  1100. m_dispatch_carrier_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_carrier_node.m_dispatch_control_status+1);
  1101. break;
  1102. }
  1103. case DISPATCH_CARRIER_PICKUP_28://搬运器x轴移动到车位
  1104. {
  1105. //3楼交接时, 机器人和3楼搬运器一起运动
  1106. if ( tp_main_carrier->get_device_id() == 2 )
  1107. {
  1108. if ( m_dispatch_catcher_node.m_dispatch_control_status >= DISPATCH_CATCHER_PICKUP_13 )
  1109. {
  1110. float t_x = tp_dispatch_coordinates->m_carrier_coordinates_map[m_parkspace_information_optimal.parkingspace_index_id].x;
  1111. carrier_move_x(get_dispatch_control_command_key(m_dispatch_carrier_node), tp_main_carrier, tp_main_carrier_task, tp_dispatch_coordinates, t_x);
  1112. m_dispatch_carrier_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_carrier_node.m_dispatch_control_status+1);
  1113. }
  1114. //else 无限等待
  1115. }
  1116. else
  1117. {
  1118. float t_x = tp_dispatch_coordinates->m_carrier_coordinates_map[m_parkspace_information_optimal.parkingspace_index_id].x;
  1119. carrier_move_x(get_dispatch_control_command_key(m_dispatch_carrier_node), tp_main_carrier, tp_main_carrier_task, tp_dispatch_coordinates, t_x);
  1120. m_dispatch_carrier_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_carrier_node.m_dispatch_control_status+1);
  1121. }
  1122. break;
  1123. }
  1124. case DISPATCH_CARRIER_PICKUP_29:
  1125. {
  1126. m_dispatch_carrier_node.m_error = check_task_status(m_dispatch_carrier_node.mp_main_carrier_task, m_dispatch_carrier_node.m_dispatch_control_status);
  1127. break;
  1128. }
  1129. case DISPATCH_CARRIER_PICKUP_30://把任务从一级升到三级, 准备取车
  1130. {
  1131. //3楼交接时, 机器人先升级, 搬运器再升级
  1132. if ( tp_main_carrier->get_device_id() == 2 )
  1133. {
  1134. if ( m_dispatch_catcher_node.m_dispatch_control_status >= DISPATCH_CATCHER_PICKUP_16 )
  1135. {
  1136. m_dispatch_carrier_node.m_error = m_dispatch_carrier_node.mp_main_carrier->change_task_level(Dispatch_device_base::Dispatch_task_level::DISPATCH_TASK_ONE_LEVEL, Dispatch_device_base::Dispatch_task_level::DISPATCH_TASK_THREE_LEVEL);
  1137. if ( m_dispatch_carrier_node.m_error == Error_code::SUCCESS )
  1138. {
  1139. m_dispatch_carrier_node.m_main_carrier_task_level = Dispatch_device_base::Dispatch_task_level::DISPATCH_TASK_THREE_LEVEL;
  1140. m_dispatch_carrier_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_carrier_node.m_dispatch_control_status+1);
  1141. if ( m_dispatch_destination != 1107 && m_dispatch_destination != 1100 )
  1142. {
  1143. //如不是7号出口, 那么开启 抓取机器人
  1144. //注意了, 取车流程只有在这里, 抓取机器人的流程才开始
  1145. m_dispatch_catcher_node.m_dispatch_control_start_flag = true;
  1146. if ( tp_main_carrier->get_device_id() != 2 )
  1147. {
  1148. m_dispatch_catcher_node.m_following_flag = true;
  1149. }
  1150. else
  1151. {
  1152. m_dispatch_catcher_node.m_following_flag = false;
  1153. }
  1154. }
  1155. }
  1156. else
  1157. {
  1158. m_dispatch_carrier_node.m_dispatch_control_status = Dispatch_process::Dispatch_control_status::DISPATCH_CONTROL_FAULT;
  1159. }
  1160. }
  1161. //else 无限等待
  1162. }
  1163. else
  1164. {
  1165. m_dispatch_carrier_node.m_error = m_dispatch_carrier_node.mp_main_carrier->change_task_level(Dispatch_device_base::Dispatch_task_level::DISPATCH_TASK_ONE_LEVEL, Dispatch_device_base::Dispatch_task_level::DISPATCH_TASK_THREE_LEVEL);
  1166. if ( m_dispatch_carrier_node.m_error == Error_code::SUCCESS )
  1167. {
  1168. m_dispatch_carrier_node.m_main_carrier_task_level = Dispatch_device_base::Dispatch_task_level::DISPATCH_TASK_THREE_LEVEL;
  1169. m_dispatch_carrier_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_carrier_node.m_dispatch_control_status+1);
  1170. if ( m_dispatch_destination != 1107 && m_dispatch_destination != 1100 )
  1171. {
  1172. //如不是7号出口, 那么开启 抓取机器人
  1173. //注意了, 取车流程只有在这里, 抓取机器人的流程才开始
  1174. m_dispatch_catcher_node.m_dispatch_control_start_flag = true;
  1175. if ( tp_main_carrier->get_device_id() != 2 )
  1176. {
  1177. m_dispatch_catcher_node.m_following_flag = true;
  1178. }
  1179. else
  1180. {
  1181. m_dispatch_catcher_node.m_following_flag = false;
  1182. }
  1183. }
  1184. }
  1185. else
  1186. {
  1187. m_dispatch_carrier_node.m_dispatch_control_status = Dispatch_process::Dispatch_control_status::DISPATCH_CONTROL_FAULT;
  1188. }
  1189. }
  1190. break;
  1191. }
  1192. case DISPATCH_CARRIER_PICKUP_31://小跑车 进入车位
  1193. {
  1194. carrier_move_y(get_dispatch_control_command_key(m_dispatch_carrier_node), tp_main_carrier, tp_main_carrier_task, tp_dispatch_coordinates, tp_dispatch_coordinates->m_carrier_default_y_leave);
  1195. m_dispatch_carrier_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_carrier_node.m_dispatch_control_status+1);
  1196. break;
  1197. }
  1198. case DISPATCH_CARRIER_PICKUP_32:
  1199. {
  1200. m_dispatch_carrier_node.m_error = check_task_status(m_dispatch_carrier_node.mp_main_carrier_task, m_dispatch_carrier_node.m_dispatch_control_status);
  1201. break;
  1202. }
  1203. case DISPATCH_CARRIER_PICKUP_33://小跑车 夹车
  1204. {
  1205. carrier_move_c(get_dispatch_control_command_key(m_dispatch_carrier_node), tp_main_carrier, tp_main_carrier_task, tp_dispatch_coordinates, Carrier_task::Clamp_motion::E_CLAMP_TIGHT);
  1206. m_dispatch_carrier_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_carrier_node.m_dispatch_control_status+1);
  1207. break;
  1208. }
  1209. case DISPATCH_CARRIER_PICKUP_34:
  1210. {
  1211. m_dispatch_carrier_node.m_error = check_task_status(m_dispatch_carrier_node.mp_main_carrier_task, m_dispatch_carrier_node.m_dispatch_control_status);
  1212. break;
  1213. }
  1214. case DISPATCH_CARRIER_PICKUP_35://小跑车 回到中跑车
  1215. {
  1216. //注意了, 3楼的搬运器取车时, 机器人的位置必须在搬运器的上方.
  1217. if ( tp_main_carrier->get_device_id() == 2 )
  1218. {
  1219. //等待机器人调整到3楼搬运器的上方位置
  1220. if ( m_dispatch_catcher_node.m_dispatch_control_status >= DISPATCH_CATCHER_PICKUP_16 )
  1221. {
  1222. carrier_move_y(get_dispatch_control_command_key(m_dispatch_carrier_node), tp_main_carrier, tp_main_carrier_task, tp_dispatch_coordinates, tp_dispatch_coordinates->m_carrier_default_y_back);
  1223. m_dispatch_carrier_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_carrier_node.m_dispatch_control_status+1);
  1224. }
  1225. //else 无限等待
  1226. }
  1227. else
  1228. {
  1229. carrier_move_y(get_dispatch_control_command_key(m_dispatch_carrier_node), tp_main_carrier, tp_main_carrier_task, tp_dispatch_coordinates, tp_dispatch_coordinates->m_carrier_default_y_back);
  1230. m_dispatch_carrier_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_carrier_node.m_dispatch_control_status+1);
  1231. }
  1232. break;
  1233. }
  1234. case DISPATCH_CARRIER_PICKUP_36:
  1235. {
  1236. m_dispatch_carrier_node.m_error = check_task_status(m_dispatch_carrier_node.mp_main_carrier_task, m_dispatch_carrier_node.m_dispatch_control_status);
  1237. break;
  1238. }
  1239. case DISPATCH_CARRIER_PICKUP_37://让中跑车回到电梯井
  1240. {
  1241. //如果不在2楼, 那么就要退回电梯井
  1242. if ( tp_main_carrier->get_device_id() == 0 && (tp_main_carrier->m_actual_coordinates_rows != 0 || m_dispatch_destination == 1100))
  1243. {
  1244. carrier_move_x(get_dispatch_control_command_key(m_dispatch_carrier_node), tp_main_carrier, tp_main_carrier_task, tp_dispatch_coordinates, tp_dispatch_coordinates->m_carrier_default_x_left);
  1245. m_dispatch_carrier_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_carrier_node.m_dispatch_control_status+1);
  1246. }
  1247. else if ( tp_main_carrier->get_device_id() == 1 && (tp_main_carrier->m_actual_coordinates_rows != 0 || m_dispatch_destination == 1107))
  1248. {
  1249. carrier_move_x(get_dispatch_control_command_key(m_dispatch_carrier_node), tp_main_carrier, tp_main_carrier_task, tp_dispatch_coordinates, tp_dispatch_coordinates->m_carrier_default_x_right);
  1250. m_dispatch_carrier_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_carrier_node.m_dispatch_control_status+1);
  1251. }
  1252. else if ( tp_main_carrier->get_device_id() == 2 )
  1253. {
  1254. //3楼搬运器取车后, 不用x轴移动, 直接准备交接
  1255. m_dispatch_carrier_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status::DISPATCH_CARRIER_PICKUP_51);
  1256. }
  1257. else
  1258. {
  1259. //不用回电梯井, 直接准备x轴移动到出口上方
  1260. m_dispatch_carrier_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status::DISPATCH_CARRIER_PICKUP_43);
  1261. }
  1262. break;
  1263. }
  1264. case DISPATCH_CARRIER_PICKUP_38://搬运器 释放空间锁
  1265. {
  1266. m_dispatch_carrier_node.m_error = check_task_status(m_dispatch_carrier_node.mp_main_carrier_task, m_dispatch_carrier_node.m_dispatch_control_status);
  1267. if ( m_dispatch_carrier_node.m_error == Error_code::SUCCESS )
  1268. {
  1269. m_dispatch_carrier_node.m_error = tp_dispatch_coordinates->carrier_space_unlock(tp_main_carrier->get_device_id());
  1270. }
  1271. break;
  1272. }
  1273. case DISPATCH_CARRIER_PICKUP_39://收回对接,之后中跑车固定在电梯上不能X轴移动,电梯可以Z轴移动
  1274. {
  1275. carrier_joint_x(get_dispatch_control_command_key(m_dispatch_carrier_node), tp_main_carrier, tp_main_carrier_task, tp_dispatch_coordinates, Carrier_task::Joint_motion::E_JOINT_TAKE_BACK);
  1276. m_dispatch_carrier_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_carrier_node.m_dispatch_control_status+1);
  1277. break;
  1278. }
  1279. case DISPATCH_CARRIER_PICKUP_40:
  1280. {
  1281. m_dispatch_carrier_node.m_error = check_task_status(m_dispatch_carrier_node.mp_main_carrier_task, m_dispatch_carrier_node.m_dispatch_control_status);
  1282. break;
  1283. }
  1284. case DISPATCH_CARRIER_PICKUP_41://电梯移动到2楼, (7号出口移动到1楼), 搬运器在电梯里面z轴移动, 不需要判断空间锁
  1285. {
  1286. float t_z =0;
  1287. if ( (m_dispatch_destination == 1107 && tp_main_carrier->get_device_id() == 1) ||
  1288. (m_dispatch_destination == 1100 && tp_main_carrier->get_device_id() == 0) )//1楼出口
  1289. {
  1290. t_z = tp_dispatch_coordinates->m_carrier_1th_floor_z;
  1291. }
  1292. else if ( m_dispatch_destination >1100 && m_dispatch_destination<1107 )
  1293. {
  1294. t_z = tp_dispatch_coordinates->m_carrier_2th_floor_z;
  1295. }
  1296. else
  1297. {
  1298. m_dispatch_carrier_node.m_dispatch_control_status = Dispatch_process::Dispatch_control_status::DISPATCH_CONTROL_FAULT;
  1299. break;//直接跳转到故障
  1300. }
  1301. carrier_move_z(get_dispatch_control_command_key(m_dispatch_carrier_node), tp_main_carrier, tp_main_carrier_task, tp_dispatch_coordinates, t_z);
  1302. m_dispatch_carrier_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_carrier_node.m_dispatch_control_status+1);
  1303. break;
  1304. }
  1305. case DISPATCH_CARRIER_PICKUP_42:
  1306. {
  1307. m_dispatch_carrier_node.m_error = check_task_status(m_dispatch_carrier_node.mp_main_carrier_task, m_dispatch_carrier_node.m_dispatch_control_status);
  1308. break;
  1309. }
  1310. case DISPATCH_CARRIER_PICKUP_43://伸出对接,之后中跑车可以x轴移动,电梯不能Z轴移动
  1311. {
  1312. if ( tp_main_carrier->m_actual_joint_motion_x1 == Dispatch_device_base::Joint_motion::E_JOINT_TAKE_BACK )
  1313. {
  1314. carrier_joint_x(get_dispatch_control_command_key(m_dispatch_carrier_node), tp_main_carrier, tp_main_carrier_task, tp_dispatch_coordinates, Carrier_task::Joint_motion::E_JOINT_HOLD_OUT);
  1315. m_dispatch_carrier_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_carrier_node.m_dispatch_control_status+1);
  1316. }
  1317. else
  1318. {
  1319. m_dispatch_carrier_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_carrier_node.m_dispatch_control_status+2);
  1320. }
  1321. break;
  1322. }
  1323. case DISPATCH_CARRIER_PICKUP_44:
  1324. {
  1325. m_dispatch_carrier_node.m_error = check_task_status(m_dispatch_carrier_node.mp_main_carrier_task, m_dispatch_carrier_node.m_dispatch_control_status);
  1326. break;
  1327. }
  1328. case DISPATCH_CARRIER_PICKUP_45://中跑车 x轴移动, 进行x轴路径检查, 加空间锁失败就进入待机位
  1329. {
  1330. //7号出口, 就不用判断空间锁了, 直接x轴移动
  1331. if ( m_dispatch_destination == 1100 || m_dispatch_destination == 1107 )
  1332. {
  1333. m_dispatch_carrier_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status::DISPATCH_CARRIER_PICKUP_80);
  1334. }
  1335. else
  1336. {
  1337. //等待机器人开始流程任务
  1338. if ( m_dispatch_catcher_node.m_dispatch_control_status >= DISPATCH_CATCHER_PICKUP_2 )
  1339. {
  1340. float t_x = tp_dispatch_coordinates->m_carrier_coordinates_map[m_dispatch_destination].x;
  1341. int t_terminal = m_dispatch_destination - PASSAGEWAY_ID_BASE;
  1342. int t_temp = (t_terminal-1)%2;
  1343. int t_column = 4 + ((t_terminal-1)/2)*3 + t_temp*2 -1;
  1344. if ( Common_data::approximate_difference(tp_main_carrier->m_actual_x, t_x, DISPATCH_DEFAULT_DIFFERENCE) )
  1345. {
  1346. //搬运器不用x轴运动, 直接到50步, 准备交接
  1347. m_dispatch_carrier_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status::DISPATCH_CARRIER_PICKUP_51);
  1348. }
  1349. else
  1350. {
  1351. int t_avoid_catcher_id = -1; //需要避让的机器人
  1352. if ( tp_main_carrier->get_device_id() == 0 && t_column <13-1)
  1353. {
  1354. m_dispatch_carrier_node.m_error = tp_dispatch_coordinates->carrier_try_space_lock(tp_main_carrier->m_actual_coordinates_rows, 0,
  1355. tp_main_carrier->m_actual_coordinates_rows, t_column+1,
  1356. tp_main_carrier->get_device_id(), t_avoid_catcher_id);
  1357. }
  1358. else if ( tp_main_carrier->get_device_id() == 1 && t_column >3-1)
  1359. {
  1360. m_dispatch_carrier_node.m_error = tp_dispatch_coordinates->carrier_try_space_lock(tp_main_carrier->m_actual_coordinates_rows, t_column-1,
  1361. tp_main_carrier->m_actual_coordinates_rows, tp_dispatch_coordinates->m_space_lock_columns-1,
  1362. tp_main_carrier->get_device_id(), t_avoid_catcher_id);
  1363. }
  1364. else if ( tp_main_carrier->get_device_id() == 2 )
  1365. {
  1366. //3楼搬运器不用加锁, 直接交接
  1367. m_dispatch_carrier_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status::DISPATCH_CARRIER_PICKUP_51);
  1368. break;//切换流程
  1369. }
  1370. else
  1371. {
  1372. m_dispatch_carrier_node.m_dispatch_control_status = Dispatch_process::Dispatch_control_status::DISPATCH_CONTROL_FAULT;
  1373. m_dispatch_carrier_node.m_error = Error_manager(Error_code::CARRIER_CONRTOL_PARAMETER_ERROR, Error_level::MINOR_ERROR,
  1374. "DISPATCH_CARRIER_PICKUP_45 tp_main_carrier->get_device_id() and m_parkspace_information_optimal.parkingspace_index_id PARAMRTER ERROR ");
  1375. break;//切换流程
  1376. }
  1377. //判断结果
  1378. if ( m_dispatch_carrier_node.m_error == Error_code::SUCCESS )
  1379. {
  1380. //左右搬运器加锁成功, 直接x轴移动
  1381. m_dispatch_carrier_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status::DISPATCH_CARRIER_PICKUP_49);
  1382. }
  1383. else
  1384. {
  1385. //加锁失败, 就移动到待机位.
  1386. m_dispatch_carrier_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_carrier_node.m_dispatch_control_status+1);
  1387. }
  1388. }
  1389. }
  1390. //没有抢到机器人的资源, 也要进入待机位
  1391. else
  1392. {
  1393. //移动到待机位.
  1394. m_dispatch_carrier_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_carrier_node.m_dispatch_control_status+1);
  1395. }
  1396. }
  1397. break;
  1398. }
  1399. case DISPATCH_CARRIER_PICKUP_46://中跑车 x轴移动, 移动到待机位
  1400. {
  1401. if ( tp_main_carrier->get_device_id() == 0 )
  1402. {
  1403. float t_x = tp_dispatch_coordinates->m_carrier_coordinates_map[2].x;
  1404. carrier_move_x(get_dispatch_control_command_key(m_dispatch_carrier_node), tp_main_carrier, tp_main_carrier_task, tp_dispatch_coordinates, t_x);
  1405. m_dispatch_carrier_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_carrier_node.m_dispatch_control_status+1);
  1406. }
  1407. else if ( tp_main_carrier->get_device_id() == 1 )
  1408. {
  1409. float t_x = tp_dispatch_coordinates->m_carrier_coordinates_map[14].x;
  1410. carrier_move_x(get_dispatch_control_command_key(m_dispatch_carrier_node), tp_main_carrier, tp_main_carrier_task, tp_dispatch_coordinates, t_x);
  1411. m_dispatch_carrier_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_carrier_node.m_dispatch_control_status+1);
  1412. }
  1413. break;
  1414. }
  1415. case DISPATCH_CARRIER_PICKUP_47:
  1416. {
  1417. m_dispatch_carrier_node.m_error = check_task_status(m_dispatch_carrier_node.mp_main_carrier_task, m_dispatch_carrier_node.m_dispatch_control_status);
  1418. break;
  1419. }
  1420. case DISPATCH_CARRIER_PICKUP_48://中跑车 x轴移动, 进行x轴路径检查, 加空间锁失败就 只能无限等待
  1421. {
  1422. //等待机器人开始流程任务
  1423. if ( m_dispatch_catcher_node.m_dispatch_control_status >= DISPATCH_CATCHER_PICKUP_2 )
  1424. {
  1425. float t_x = tp_dispatch_coordinates->m_carrier_coordinates_map[m_dispatch_destination].x;
  1426. int t_terminal = m_dispatch_destination - PASSAGEWAY_ID_BASE;
  1427. int t_temp = (t_terminal - 1) % 2;
  1428. int t_column = 4 + ((t_terminal - 1) / 2) * 3 + t_temp * 2 - 1;
  1429. if (Common_data::approximate_difference(tp_main_carrier->m_actual_x, t_x, DISPATCH_DEFAULT_DIFFERENCE))
  1430. {
  1431. //搬运器不用x轴运动, 准备交接
  1432. m_dispatch_carrier_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status::DISPATCH_CARRIER_PICKUP_51);
  1433. }
  1434. else
  1435. {
  1436. int t_avoid_catcher_id = -1; //需要避让的机器人
  1437. if (tp_main_carrier->get_device_id() == 0 && t_column < 13 - 1)
  1438. {
  1439. m_dispatch_carrier_node.m_error = tp_dispatch_coordinates->carrier_try_space_lock(
  1440. tp_main_carrier->m_actual_coordinates_rows, 0,
  1441. tp_main_carrier->m_actual_coordinates_rows, t_column + 1,
  1442. tp_main_carrier->get_device_id(), t_avoid_catcher_id);
  1443. }
  1444. else if (tp_main_carrier->get_device_id() == 1 && t_column > 3 - 1)
  1445. {
  1446. m_dispatch_carrier_node.m_error = tp_dispatch_coordinates->carrier_try_space_lock(
  1447. tp_main_carrier->m_actual_coordinates_rows, t_column - 1,
  1448. tp_main_carrier->m_actual_coordinates_rows, tp_dispatch_coordinates->m_space_lock_columns - 1,
  1449. tp_main_carrier->get_device_id(), t_avoid_catcher_id);
  1450. }
  1451. else if (tp_main_carrier->get_device_id() == 2)
  1452. {
  1453. //3楼搬运器不用加锁, 直接交接
  1454. m_dispatch_carrier_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status::DISPATCH_CARRIER_PICKUP_51);
  1455. break;//切换流程
  1456. }
  1457. else
  1458. {
  1459. m_dispatch_carrier_node.m_dispatch_control_status = Dispatch_process::Dispatch_control_status::DISPATCH_CONTROL_FAULT;
  1460. m_dispatch_carrier_node.m_error = Error_manager(Error_code::CARRIER_CONRTOL_PARAMETER_ERROR,
  1461. Error_level::MINOR_ERROR,
  1462. "DISPATCH_CARRIER_PICKUP_48 tp_main_carrier->get_device_id() and m_parkspace_information_optimal.parkingspace_index_id PARAMRTER ERROR ");
  1463. break;//切换流程
  1464. }
  1465. //判断结果
  1466. if (m_dispatch_carrier_node.m_error == Error_code::SUCCESS)
  1467. {
  1468. //左右搬运器加锁成功, 直接x轴移动
  1469. m_dispatch_carrier_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status) (
  1470. m_dispatch_carrier_node.m_dispatch_control_status + 1);
  1471. }
  1472. //else 无限等待
  1473. }
  1474. }
  1475. break;
  1476. }
  1477. case DISPATCH_CARRIER_PICKUP_49://中跑车 x轴移动, 移动到取车口的上方2楼处
  1478. {
  1479. float t_x = tp_dispatch_coordinates->m_carrier_coordinates_map[m_dispatch_destination].x;
  1480. carrier_move_x(get_dispatch_control_command_key(m_dispatch_carrier_node), tp_main_carrier, tp_main_carrier_task, tp_dispatch_coordinates, t_x);
  1481. m_dispatch_carrier_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_carrier_node.m_dispatch_control_status+1);
  1482. break;
  1483. }
  1484. case DISPATCH_CARRIER_PICKUP_50:
  1485. {
  1486. m_dispatch_carrier_node.m_error = check_task_status(m_dispatch_carrier_node.mp_main_carrier_task, m_dispatch_carrier_node.m_dispatch_control_status);
  1487. break;
  1488. }
  1489. case DISPATCH_CARRIER_PICKUP_51://小跑车 松开夹杆
  1490. {
  1491. carrier_move_c(get_dispatch_control_command_key(m_dispatch_carrier_node), tp_main_carrier, tp_main_carrier_task, tp_dispatch_coordinates, Carrier_task::Clamp_motion::E_CLAMP_LOOSE);
  1492. m_dispatch_carrier_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_carrier_node.m_dispatch_control_status+1);
  1493. break;
  1494. }
  1495. case DISPATCH_CARRIER_PICKUP_52:
  1496. {
  1497. m_dispatch_carrier_node.m_error = check_task_status(m_dispatch_carrier_node.mp_main_carrier_task, m_dispatch_carrier_node.m_dispatch_control_status);
  1498. break;
  1499. }
  1500. case DISPATCH_CARRIER_PICKUP_53://等待机器人把车从搬运器上面取走
  1501. {
  1502. // 等待机器人把车从搬运器上面取走
  1503. if ( m_dispatch_catcher_node.m_dispatch_control_status >= DISPATCH_CATCHER_PICKUP_25 )
  1504. {
  1505. if ( tp_main_carrier->get_device_id() == 2 )
  1506. {
  1507. //进入3楼搬运器取车的特殊流程, 跟随和避让
  1508. m_dispatch_carrier_node.m_dispatch_control_status = Dispatch_process::Dispatch_control_status::DISPATCH_CARRIER_PICKUP_70;
  1509. }
  1510. else
  1511. {
  1512. m_dispatch_carrier_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_carrier_node.m_dispatch_control_status+1);
  1513. }
  1514. }
  1515. //else 无限等待
  1516. break;
  1517. }
  1518. case DISPATCH_CARRIER_PICKUP_54://搬运器退回电梯井
  1519. {
  1520. if ( tp_main_carrier->get_device_id() == 0 )
  1521. {
  1522. carrier_move_x(get_dispatch_control_command_key(m_dispatch_carrier_node), tp_main_carrier, tp_main_carrier_task, tp_dispatch_coordinates, tp_dispatch_coordinates->m_carrier_default_x_left);
  1523. m_dispatch_carrier_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_carrier_node.m_dispatch_control_status+1);
  1524. }
  1525. else if ( tp_main_carrier->get_device_id() == 1 )
  1526. {
  1527. carrier_move_x(get_dispatch_control_command_key(m_dispatch_carrier_node), tp_main_carrier, tp_main_carrier_task, tp_dispatch_coordinates, tp_dispatch_coordinates->m_carrier_default_x_right);
  1528. m_dispatch_carrier_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_carrier_node.m_dispatch_control_status+1);
  1529. }
  1530. else
  1531. {
  1532. m_dispatch_carrier_node.m_dispatch_control_status = Dispatch_process::Dispatch_control_status::DISPATCH_CONTROL_FAULT;
  1533. m_dispatch_carrier_node.m_error = Error_manager(Error_code::CARRIER_CONRTOL_PARAMETER_ERROR, Error_level::MINOR_ERROR,
  1534. "DISPATCH_CARRIER_PICKUP_54 tp_main_carrier->get_device_id() PARAMRTER ERROR ");
  1535. }
  1536. break;
  1537. }
  1538. case DISPATCH_CARRIER_PICKUP_55://搬运器 释放空间锁
  1539. {
  1540. m_dispatch_carrier_node.m_error = check_task_status(m_dispatch_carrier_node.mp_main_carrier_task, m_dispatch_carrier_node.m_dispatch_control_status);
  1541. if ( m_dispatch_carrier_node.m_error == Error_code::SUCCESS )
  1542. {
  1543. m_dispatch_carrier_node.m_error = tp_dispatch_coordinates->carrier_space_unlock(tp_main_carrier->get_device_id());
  1544. }
  1545. break;
  1546. }
  1547. case DISPATCH_CARRIER_PICKUP_56://收回对接,之后中跑车固定在电梯上不能X轴移动,电梯可以Z轴移动
  1548. {
  1549. //7号出口, 必须收回对接
  1550. if ( m_dispatch_destination == 1100 || m_dispatch_destination == 1107 )
  1551. {
  1552. carrier_joint_x(get_dispatch_control_command_key(m_dispatch_carrier_node), tp_main_carrier, tp_main_carrier_task, tp_dispatch_coordinates, Carrier_task::Joint_motion::E_JOINT_TAKE_BACK);
  1553. m_dispatch_carrier_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_carrier_node.m_dispatch_control_status+1);
  1554. }
  1555. //如果后面有一级存车任务, 那么就跳过
  1556. else if ( tp_main_carrier->is_has_appoint_task(Dispatch_device_base::Dispatch_task_level::DISPATCH_TASK_ONE_LEVEL) ||
  1557. tp_main_carrier->is_has_appoint_task(Dispatch_device_base::Dispatch_task_level::DISPATCH_TASK_TWO_LEVEL))
  1558. {
  1559. m_dispatch_carrier_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_carrier_node.m_dispatch_control_status+2);
  1560. }
  1561. else
  1562. {
  1563. carrier_joint_x(get_dispatch_control_command_key(m_dispatch_carrier_node), tp_main_carrier, tp_main_carrier_task, tp_dispatch_coordinates, Carrier_task::Joint_motion::E_JOINT_TAKE_BACK);
  1564. m_dispatch_carrier_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_carrier_node.m_dispatch_control_status+1);
  1565. }
  1566. break;
  1567. }
  1568. case DISPATCH_CARRIER_PICKUP_57:
  1569. {
  1570. m_dispatch_carrier_node.m_error = check_task_status(m_dispatch_carrier_node.mp_main_carrier_task, m_dispatch_carrier_node.m_dispatch_control_status);
  1571. break;
  1572. }
  1573. case DISPATCH_CARRIER_PICKUP_58://主搬运器 断连
  1574. {
  1575. disconnect_dispatch_device(m_dispatch_carrier_node.mp_main_carrier, m_dispatch_carrier_node.mp_main_carrier_task);
  1576. m_dispatch_carrier_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status::DISPATCH_CARRIER_PICKUP_END);
  1577. break;
  1578. }
  1579. case DISPATCH_CARRIER_PICKUP_70://3楼搬运器跟随, 到机器人旁边一个车位
  1580. {
  1581. // 3楼搬运器 最好和机器人一起移动
  1582. if ( m_dispatch_catcher_node.m_dispatch_control_status >= DISPATCH_CATCHER_PICKUP_26 )
  1583. {
  1584. //3楼搬运器跟随, 到机器人旁边一个车位
  1585. float t_x = tp_dispatch_coordinates->m_carrier_coordinates_map[m_dispatch_destination].x;
  1586. float t_following_x = 0;
  1587. if ( m_dispatch_destination == 1101 )
  1588. {
  1589. t_following_x = tp_dispatch_coordinates->m_carrier_coordinates_map[1102].x;
  1590. }
  1591. else if ( m_dispatch_destination == 1106 )
  1592. {
  1593. t_following_x = tp_dispatch_coordinates->m_carrier_coordinates_map[1105].x;
  1594. }
  1595. else if ( tp_main_carrier->m_actual_x < t_x)
  1596. {
  1597. t_following_x = tp_dispatch_coordinates->m_carrier_coordinates_map[m_dispatch_destination-1].x;
  1598. }
  1599. else
  1600. {
  1601. t_following_x = tp_dispatch_coordinates->m_carrier_coordinates_map[m_dispatch_destination+1].x;
  1602. }
  1603. carrier_move_x(get_dispatch_control_command_key(m_dispatch_carrier_node), tp_main_carrier, tp_main_carrier_task, tp_dispatch_coordinates, t_following_x);
  1604. m_dispatch_carrier_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_carrier_node.m_dispatch_control_status+1);
  1605. }
  1606. break;
  1607. }
  1608. case DISPATCH_CARRIER_PICKUP_71:
  1609. {
  1610. m_dispatch_carrier_node.m_error = check_task_status(m_dispatch_carrier_node.mp_main_carrier_task, m_dispatch_carrier_node.m_dispatch_control_status);
  1611. break;
  1612. }
  1613. case DISPATCH_CARRIER_PICKUP_72://3楼搬运器移到机器人下方
  1614. {
  1615. //如果后面有一级存车任务, 那么就跳过
  1616. //注意了:如果主搬运器是3楼的, 那么也要判断机器人
  1617. if ( tp_main_carrier->is_has_appoint_task(Dispatch_device_base::Dispatch_task_level::DISPATCH_TASK_ONE_LEVEL) ||
  1618. tp_main_carrier->is_has_appoint_task(Dispatch_device_base::Dispatch_task_level::DISPATCH_TASK_TWO_LEVEL) ||
  1619. m_dispatch_catcher_node.mp_main_catcher->is_has_appoint_task(Dispatch_device_base::Dispatch_task_level::DISPATCH_TASK_ONE_LEVEL) ||
  1620. m_dispatch_catcher_node.mp_main_catcher->is_has_appoint_task(Dispatch_device_base::Dispatch_task_level::DISPATCH_TASK_TWO_LEVEL) )
  1621. {
  1622. m_dispatch_carrier_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_carrier_node.m_dispatch_control_status+2);
  1623. }
  1624. else
  1625. {
  1626. if ( m_dispatch_catcher_node.m_dispatch_control_status >= DISPATCH_CATCHER_PICKUP_38 )
  1627. {
  1628. float t_x = tp_dispatch_coordinates->m_carrier_coordinates_map[m_dispatch_destination].x;
  1629. carrier_move_x(get_dispatch_control_command_key(m_dispatch_carrier_node), tp_main_carrier, tp_main_carrier_task, tp_dispatch_coordinates, t_x);
  1630. m_dispatch_carrier_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_carrier_node.m_dispatch_control_status+1);
  1631. }
  1632. //else 无限等待
  1633. }
  1634. break;
  1635. }
  1636. case DISPATCH_CARRIER_PICKUP_73:
  1637. {
  1638. m_dispatch_carrier_node.m_error = check_task_status(m_dispatch_carrier_node.mp_main_carrier_task, m_dispatch_carrier_node.m_dispatch_control_status);
  1639. break;
  1640. }
  1641. case DISPATCH_CARRIER_PICKUP_74://主搬运器 断连
  1642. {
  1643. disconnect_dispatch_device(m_dispatch_carrier_node.mp_main_carrier, m_dispatch_carrier_node.mp_main_carrier_task);
  1644. m_dispatch_carrier_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status::DISPATCH_CARRIER_PICKUP_END);
  1645. break;
  1646. }
  1647. case DISPATCH_CARRIER_PICKUP_80://中跑车 x轴移动, 移动到7号取车口
  1648. {
  1649. float t_x = tp_dispatch_coordinates->m_carrier_coordinates_map[m_dispatch_destination].x;
  1650. carrier_move_x(get_dispatch_control_command_key(m_dispatch_carrier_node), tp_main_carrier, tp_main_carrier_task, tp_dispatch_coordinates, t_x);
  1651. m_dispatch_carrier_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_carrier_node.m_dispatch_control_status+1);
  1652. break;
  1653. }
  1654. case DISPATCH_CARRIER_PICKUP_81:
  1655. {
  1656. m_dispatch_carrier_node.m_error = check_task_status(m_dispatch_carrier_node.mp_main_carrier_task, m_dispatch_carrier_node.m_dispatch_control_status);
  1657. break;
  1658. }
  1659. case DISPATCH_CARRIER_PICKUP_82://小跑车 进入车位
  1660. {
  1661. carrier_move_y(get_dispatch_control_command_key(m_dispatch_carrier_node), tp_main_carrier, tp_main_carrier_task, tp_dispatch_coordinates, tp_dispatch_coordinates->m_carrier_default_y_leave);
  1662. m_dispatch_carrier_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_carrier_node.m_dispatch_control_status+1);
  1663. break;
  1664. }
  1665. case DISPATCH_CARRIER_PICKUP_83:
  1666. {
  1667. m_dispatch_carrier_node.m_error = check_task_status(m_dispatch_carrier_node.mp_main_carrier_task, m_dispatch_carrier_node.m_dispatch_control_status);
  1668. break;
  1669. }
  1670. case DISPATCH_CARRIER_PICKUP_84://小跑车 松开车
  1671. {
  1672. carrier_move_c(get_dispatch_control_command_key(m_dispatch_carrier_node), tp_main_carrier, tp_main_carrier_task, tp_dispatch_coordinates, Carrier_task::Clamp_motion::E_CLAMP_LOOSE);
  1673. m_dispatch_carrier_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_carrier_node.m_dispatch_control_status+1);
  1674. break;
  1675. }
  1676. case DISPATCH_CARRIER_PICKUP_85:
  1677. {
  1678. m_dispatch_carrier_node.m_error = check_task_status(m_dispatch_carrier_node.mp_main_carrier_task, m_dispatch_carrier_node.m_dispatch_control_status);
  1679. break;
  1680. }
  1681. case DISPATCH_CARRIER_PICKUP_86://小跑车 回到中跑车
  1682. {
  1683. carrier_move_y(get_dispatch_control_command_key(m_dispatch_carrier_node), tp_main_carrier, tp_main_carrier_task, tp_dispatch_coordinates, tp_dispatch_coordinates->m_carrier_default_y_back);
  1684. m_dispatch_carrier_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_carrier_node.m_dispatch_control_status+1);
  1685. break;
  1686. }
  1687. case DISPATCH_CARRIER_PICKUP_87:
  1688. {
  1689. m_dispatch_carrier_node.m_error = check_task_status(m_dispatch_carrier_node.mp_main_carrier_task, m_dispatch_carrier_node.m_dispatch_control_status);
  1690. break;
  1691. }
  1692. case DISPATCH_CARRIER_PICKUP_88:
  1693. {
  1694. //回到正常流程
  1695. m_dispatch_carrier_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status::DISPATCH_CARRIER_PICKUP_54);
  1696. break;
  1697. }
  1698. case DISPATCH_CARRIER_PICKUP_END:
  1699. {
  1700. m_dispatch_carrier_node.m_error = Error_code::SUCCESS;
  1701. break;
  1702. }
  1703. default:
  1704. {
  1705. break;
  1706. }
  1707. }
  1708. std::cout << " huli test :::: " << " ======================================================================================== = " << "carrier end" << std::endl;
  1709. std::cout << " huli test :::: " << " m_dispatch_carrier_node.m_dispatch_control_status = " << m_dispatch_carrier_node.m_dispatch_control_status << std::endl;
  1710. if ( m_dispatch_carrier_node.mp_main_carrier.get() != NULL )
  1711. {
  1712. std::cout << " huli test :::: " << " tp_main_carrier->get_device_id() = " << m_dispatch_carrier_node.mp_main_carrier->get_device_id() <<" + "<< m_dispatch_carrier_node.mp_main_carrier->get_current_command_key() <<" + "<< m_dispatch_carrier_node.mp_main_carrier->get_dispatch_device_status() << std::endl;
  1713. }
  1714. else
  1715. {
  1716. std::cout << " huli test :::: " << " tp_main_carrier->get_device_id() = " << -8888 << std::endl;
  1717. }
  1718. if ( m_dispatch_carrier_node.mp_avoid_catcher.get() != NULL )
  1719. {
  1720. std::cout << " huli test :::: " << " tp_avoid_catcher->get_device_id() = " << m_dispatch_carrier_node.mp_avoid_catcher->get_device_id() <<" + "<< m_dispatch_carrier_node.mp_avoid_catcher->get_current_command_key() <<" + "<< m_dispatch_carrier_node.mp_avoid_catcher->get_dispatch_device_status() << std::endl;
  1721. }
  1722. else
  1723. {
  1724. std::cout << " huli test :::: " << " tp_avoid_catcher->get_device_id() = " << -8888 << std::endl;
  1725. }
  1726. if ( m_dispatch_carrier_node.mp_avoid_carrier.get() != NULL )
  1727. {
  1728. std::cout << " huli test :::: " << " tp_avoid_carrier->get_device_id() = " << m_dispatch_carrier_node.mp_avoid_carrier->get_device_id() <<" + "<< m_dispatch_carrier_node.mp_avoid_carrier->get_current_command_key() <<" + "<< m_dispatch_carrier_node.mp_avoid_carrier->get_dispatch_device_status() << std::endl;
  1729. }
  1730. else
  1731. {
  1732. std::cout << " huli test :::: " << " tp_avoid_carrier->get_device_id() = " << -8888 << std::endl;
  1733. }
  1734. #ifdef PROCESS_TEST
  1735. char cr;
  1736. std::cin >> cr ;
  1737. #endif
  1738. std::cout << " huli test :::: " << " ----------------------------------------------------------------------------------------- = " << "catcher start" << std::endl;
  1739. std::cout << " huli test :::: " << " m_dispatch_catcher_node.m_dispatch_control_status = " << m_dispatch_catcher_node.m_dispatch_control_status << std::endl;
  1740. if ( m_dispatch_catcher_node.mp_main_catcher.get() != NULL )
  1741. {
  1742. std::cout << " huli test :::: " << " tp_main_catcher->get_device_id() = " << m_dispatch_catcher_node.mp_main_catcher->get_device_id() <<" + "<< m_dispatch_catcher_node.mp_main_catcher->get_current_command_key() <<" + "<< m_dispatch_catcher_node.mp_main_catcher->get_dispatch_device_status() << std::endl;
  1743. }
  1744. else
  1745. {
  1746. std::cout << " huli test :::: " << " tp_main_catcher->get_device_id() = " << -8888 << std::endl;
  1747. }
  1748. if ( m_dispatch_catcher_node.mp_following_carrier.get() != NULL )
  1749. {
  1750. std::cout << " huli test :::: " << " tp_following_carrier->get_device_id() = " << m_dispatch_catcher_node.mp_following_carrier->get_device_id() <<" + " << m_dispatch_catcher_node.mp_following_carrier->get_current_command_key()<<" + "<< m_dispatch_catcher_node.mp_following_carrier->get_dispatch_device_status() << std::endl;
  1751. }
  1752. else
  1753. {
  1754. std::cout << " huli test :::: " << " tp_following_carrier->get_device_id() = " << -8888 << std::endl;
  1755. }
  1756. Error_manager t_catcher_error;
  1757. Catcher * tp_main_catcher = NULL;
  1758. Catcher_task * tp_main_catcher_task = NULL;
  1759. if ( m_dispatch_catcher_node.mp_main_catcher.get() != NULL && m_dispatch_catcher_node.mp_main_catcher_task.get() != NULL )
  1760. {
  1761. tp_main_catcher = (Catcher *)m_dispatch_catcher_node.mp_main_catcher.get();
  1762. tp_main_catcher_task = (Catcher_task *)m_dispatch_catcher_node.mp_main_catcher_task.get();
  1763. //一级任务被打断后, 重新执行
  1764. if ( tp_main_catcher->get_break_flag() )
  1765. {
  1766. if ( m_dispatch_catcher_node.m_main_catcher_task_level == Dispatch_device_base::Dispatch_task_level::DISPATCH_TASK_ONE_LEVEL )
  1767. {
  1768. m_dispatch_catcher_node.m_dispatch_control_status = DISPATCH_CATCHER_PICKUP_START;
  1769. }
  1770. tp_main_catcher->set_break_flag(false);
  1771. }
  1772. }
  1773. Carrier * tp_following_carrier = NULL;
  1774. Carrier_task * tp_following_carrier_task = NULL;
  1775. if ( m_dispatch_catcher_node.mp_following_carrier.get() != NULL && m_dispatch_catcher_node.mp_following_carrier_task.get() != NULL )
  1776. {
  1777. tp_following_carrier = (Carrier *)m_dispatch_catcher_node.mp_following_carrier.get();
  1778. tp_following_carrier_task = (Carrier_task *)m_dispatch_catcher_node.mp_following_carrier_task.get();
  1779. }
  1780. //抓取器的控制动作
  1781. switch ( m_dispatch_catcher_node.m_dispatch_control_status )
  1782. {
  1783. case DISPATCH_CONTROL_CREATED:
  1784. case DISPATCH_CONTROL_READY:
  1785. {
  1786. m_dispatch_catcher_node.m_error = check_main_catcher(m_dispatch_catcher_node);
  1787. if ( m_dispatch_catcher_node.m_error == Error_code::SUCCESS )
  1788. {
  1789. if ( m_dispatch_process_type == Common_data::Dispatch_process_type::DISPATCH_PROCESS_PICKUP )
  1790. {
  1791. m_dispatch_catcher_node.m_dispatch_control_status = Dispatch_process::Dispatch_control_status::DISPATCH_CATCHER_PICKUP_START;
  1792. }
  1793. else if ( m_dispatch_process_type == Common_data::Dispatch_process_type::DISPATCH_PROCESS_STORE )
  1794. {
  1795. m_dispatch_catcher_node.m_dispatch_control_status = Dispatch_process::Dispatch_control_status::DISPATCH_CATCHER_STORE_START;
  1796. }
  1797. }
  1798. //else 原地等待
  1799. break;
  1800. }
  1801. case DISPATCH_CATCHER_PICKUP_START://连接机器人, 创建新的任务单 与设备建立连接
  1802. {
  1803. if ( m_dispatch_catcher_node.mp_main_catcher.get() == NULL )
  1804. {
  1805. m_dispatch_catcher_node.mp_main_catcher = Dispatch_manager::get_instance_references().m_catcher_map[1];
  1806. }
  1807. if ( m_dispatch_catcher_node.mp_main_catcher_task.get() == NULL )
  1808. {
  1809. m_dispatch_catcher_node.m_error = m_dispatch_catcher_node.mp_main_catcher->check_task_level(Dispatch_device_base::Dispatch_task_level::DISPATCH_TASK_ONE_LEVEL);
  1810. if ( m_dispatch_catcher_node.m_error == Error_code::SUCCESS )
  1811. {
  1812. m_dispatch_catcher_node.m_error = connect_dispatch_catcher(m_dispatch_catcher_node.mp_main_catcher, m_dispatch_catcher_node.mp_main_catcher_task, Dispatch_device_base::Dispatch_task_level::DISPATCH_TASK_ONE_LEVEL);
  1813. if ( m_dispatch_catcher_node.m_error == Error_code::SUCCESS )
  1814. {
  1815. m_dispatch_catcher_node.m_main_catcher_task_level = Dispatch_device_base::Dispatch_task_level::DISPATCH_TASK_ONE_LEVEL;
  1816. m_dispatch_catcher_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_catcher_node.m_dispatch_control_status+1);
  1817. }
  1818. //else 抓取器的资源自由争抢, 如果没有抢到, 那么重复连接
  1819. }
  1820. //else 抓取器的资源自由争抢, 如果没有抢到, 那么重复连接
  1821. }
  1822. else
  1823. {
  1824. m_dispatch_catcher_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_catcher_node.m_dispatch_control_status+2);
  1825. }
  1826. break;
  1827. }
  1828. case DISPATCH_CATCHER_PICKUP_1:
  1829. {
  1830. m_dispatch_catcher_node.m_error = check_task_status(m_dispatch_catcher_node.mp_main_catcher_task, m_dispatch_catcher_node.m_dispatch_control_status);
  1831. break;
  1832. }
  1833. case DISPATCH_CATCHER_PICKUP_2://机器人 准备开始, 需要同步任务单和设备真实数据
  1834. {
  1835. //机器人 准备开始, 需要同步任务单和设备真实数据.//注意了:连接设备只是预约, 设备不一定立刻执行.所以需要在连接成功之后进行数据同步
  1836. catcher_ready_to_start(get_dispatch_control_command_key(m_dispatch_catcher_node), tp_main_catcher, tp_main_catcher_task, tp_dispatch_coordinates);
  1837. m_dispatch_catcher_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_catcher_node.m_dispatch_control_status+1);
  1838. break;
  1839. }
  1840. case DISPATCH_CATCHER_PICKUP_3:
  1841. {
  1842. m_dispatch_catcher_node.m_error = check_task_status(m_dispatch_catcher_node.mp_main_catcher_task, m_dispatch_catcher_node.m_dispatch_control_status);
  1843. //注意了:同步失败,需要重新同步.
  1844. if ( m_dispatch_catcher_node.m_error != Error_code::SUCCESS )
  1845. {
  1846. m_dispatch_catcher_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status::DISPATCH_CATCHER_PICKUP_2);
  1847. }
  1848. break;
  1849. }
  1850. case DISPATCH_CATCHER_PICKUP_4://机器手调整到 正常待机的姿态(调节夹杆和轴距)
  1851. {
  1852. if ( tp_main_catcher->m_actual_load_status == Dispatch_device_base::Load_status::NO_CAR )
  1853. {
  1854. if ( tp_main_catcher->m_actual_clamp_motion1 != Dispatch_device_base::Clamp_motion::E_CLAMP_LOOSE ||
  1855. tp_main_catcher->m_actual_d1 + tp_main_catcher->m_actual_d2 + tp_dispatch_coordinates->m_catcher_d1_d2_distance >
  1856. tp_dispatch_coordinates->m_catcher_wheel_base_limit ||
  1857. tp_main_catcher->m_catcher_direction == Dispatch_device_base::Catcher_direction::CATCHER_DIRECTION_UNKNOW )
  1858. {
  1859. catcher_adjust_to_ready(get_dispatch_control_command_key(m_dispatch_catcher_node), tp_main_catcher, tp_main_catcher_task, tp_dispatch_coordinates);
  1860. m_dispatch_catcher_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_catcher_node.m_dispatch_control_status+1);
  1861. }
  1862. else
  1863. {
  1864. m_dispatch_catcher_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_catcher_node.m_dispatch_control_status+2);
  1865. }
  1866. }
  1867. else
  1868. {
  1869. m_dispatch_catcher_node.m_dispatch_control_status = Dispatch_process::Dispatch_control_status::DISPATCH_CONTROL_FAULT;
  1870. m_dispatch_catcher_node.m_error = Error_manager(Error_code::CATCHER_POSE_ERROR, Error_level::MINOR_ERROR,
  1871. "DISPATCH_CATCHER_PICKUP_4 Dispatch_process::excute_robot_catch_car_from_carrier() fun error ");
  1872. }
  1873. break;
  1874. }
  1875. case DISPATCH_CATCHER_PICKUP_5:
  1876. {
  1877. m_dispatch_catcher_node.m_error = check_task_status(m_dispatch_catcher_node.mp_main_catcher_task, m_dispatch_catcher_node.m_dispatch_control_status);
  1878. break;
  1879. }
  1880. case DISPATCH_CATCHER_PICKUP_6://机器手 调整z轴, (z轴上升到4楼. 不需要判断空间锁)
  1881. {
  1882. if ( tp_main_catcher->m_actual_z*1.02 >= tp_dispatch_coordinates->m_catcher_4th_floor_z )
  1883. {
  1884. //检测正常, 直接跳过即可
  1885. m_dispatch_catcher_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_catcher_node.m_dispatch_control_status+2);
  1886. }
  1887. else
  1888. {
  1889. catcher_move_z(get_dispatch_control_command_key(m_dispatch_catcher_node), tp_main_catcher, tp_main_catcher_task, tp_dispatch_coordinates, tp_dispatch_coordinates->m_catcher_4th_floor_z);
  1890. m_dispatch_catcher_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_catcher_node.m_dispatch_control_status+1);
  1891. }
  1892. break;
  1893. }
  1894. case DISPATCH_CATCHER_PICKUP_7://机器人释放 空间锁
  1895. {
  1896. m_dispatch_catcher_node.m_error = check_task_status(m_dispatch_catcher_node.mp_main_catcher_task, m_dispatch_catcher_node.m_dispatch_control_status);
  1897. if ( m_dispatch_catcher_node.m_error == Error_code::SUCCESS )
  1898. {
  1899. tp_dispatch_coordinates->catcher_space_unlock(tp_main_catcher->m_actual_coordinates_id, tp_main_catcher->get_device_id());
  1900. }
  1901. break;
  1902. }
  1903. case DISPATCH_CATCHER_PICKUP_8://连接3楼的跟随机器人
  1904. {
  1905. if ( m_dispatch_catcher_node.m_following_flag )
  1906. {
  1907. if ( m_dispatch_catcher_node.mp_following_carrier.get() == NULL )
  1908. {
  1909. m_dispatch_catcher_node.mp_following_carrier = Dispatch_manager::get_instance_references().m_carrier_map[2];
  1910. }
  1911. if ( m_dispatch_catcher_node.mp_following_carrier_task.get() == NULL )
  1912. {
  1913. m_dispatch_catcher_node.m_error = m_dispatch_catcher_node.mp_following_carrier->check_task_level(Dispatch_device_base::Dispatch_task_level::DISPATCH_TASK_ONE_LEVEL);
  1914. if ( m_dispatch_catcher_node.m_error == Error_code::SUCCESS )
  1915. {
  1916. m_dispatch_catcher_node.m_error = connect_dispatch_carrier(m_dispatch_catcher_node.mp_following_carrier, m_dispatch_catcher_node.mp_following_carrier_task, Dispatch_device_base::Dispatch_task_level::DISPATCH_TASK_ONE_LEVEL);
  1917. if ( m_dispatch_catcher_node.m_error == Error_code::SUCCESS )
  1918. {
  1919. m_dispatch_catcher_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_catcher_node.m_dispatch_control_status+1);
  1920. }
  1921. //else 抓取器的资源自由争抢, 如果没有抢到, 那么重复连接
  1922. }
  1923. //else 抓取器的资源自由争抢, 如果没有抢到, 那么重复连接
  1924. }
  1925. else
  1926. {
  1927. m_dispatch_catcher_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_catcher_node.m_dispatch_control_status+2);
  1928. }
  1929. }
  1930. else
  1931. {
  1932. m_dispatch_catcher_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_catcher_node.m_dispatch_control_status+2);
  1933. }
  1934. break;
  1935. }
  1936. case DISPATCH_CATCHER_PICKUP_9:
  1937. {
  1938. m_dispatch_catcher_node.m_error = check_task_status(m_dispatch_catcher_node.mp_following_carrier_task, m_dispatch_catcher_node.m_dispatch_control_status);
  1939. break;
  1940. }
  1941. case DISPATCH_CATCHER_PICKUP_10://搬运器 准备开始, 需要同步任务单和设备真实数据
  1942. {
  1943. if ( m_dispatch_catcher_node.m_following_flag )
  1944. {
  1945. //搬运器 准备开始, 需要同步任务单和设备真实数据.//注意了:连接设备只是预约, 设备不一定立刻执行.所以需要在连接成功之后进行数据同步
  1946. carrier_ready_to_start(get_dispatch_control_command_key(m_dispatch_catcher_node), tp_following_carrier, tp_following_carrier_task, tp_dispatch_coordinates);
  1947. m_dispatch_catcher_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_catcher_node.m_dispatch_control_status+1);
  1948. }
  1949. else
  1950. {
  1951. m_dispatch_catcher_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_catcher_node.m_dispatch_control_status+2);
  1952. }
  1953. break;
  1954. }
  1955. case DISPATCH_CATCHER_PICKUP_11:
  1956. {
  1957. m_dispatch_catcher_node.m_error = check_task_status(m_dispatch_catcher_node.mp_following_carrier_task, m_dispatch_catcher_node.m_dispatch_control_status);
  1958. //注意了:同步失败,需要重新同步.
  1959. if ( m_dispatch_catcher_node.m_error != Error_code::SUCCESS )
  1960. {
  1961. m_dispatch_catcher_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status::DISPATCH_CATCHER_PICKUP_10);
  1962. }
  1963. break;
  1964. }
  1965. case DISPATCH_CATCHER_PICKUP_12://机器人 x轴移动之前, 判断空间锁.
  1966. {
  1967. int t_column = 0;
  1968. // 2楼交接, 在出口终点x交接 3楼交接, 在取车车位起点x交接,
  1969. if ( m_dispatch_catcher_node.m_following_flag )
  1970. {
  1971. int t_terminal = m_dispatch_destination - 1100;
  1972. int temp = (t_terminal-1)%2;
  1973. t_column = 4 + ((t_terminal-1)/2)*3 + temp*2 -1;
  1974. }
  1975. else
  1976. {
  1977. t_column = (m_parkspace_information_optimal.parkingspace_index_id -1) % tp_dispatch_coordinates->m_space_lock_columns;
  1978. }
  1979. if ( tp_main_catcher->m_actual_coordinates_columns < t_column )
  1980. {
  1981. m_dispatch_catcher_node.m_error = tp_dispatch_coordinates->catcher_try_space_lock(1, tp_main_catcher->m_actual_coordinates_columns,
  1982. 2, t_column+1,
  1983. tp_main_catcher->get_device_id());
  1984. }
  1985. else
  1986. {
  1987. m_dispatch_catcher_node.m_error = tp_dispatch_coordinates->catcher_try_space_lock(1, t_column-1,
  1988. 2, tp_main_catcher->m_actual_coordinates_columns,
  1989. tp_main_catcher->get_device_id());
  1990. }
  1991. //判断结果
  1992. if ( m_dispatch_catcher_node.m_error == Error_code::SUCCESS )
  1993. {
  1994. m_dispatch_catcher_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_catcher_node.m_dispatch_control_status+1);
  1995. }
  1996. //else 无限等待
  1997. break;
  1998. }
  1999. case DISPATCH_CATCHER_PICKUP_13://机器手调整到 对接搬运器的姿态
  2000. {
  2001. float t_x = 0;
  2002. if ( m_dispatch_catcher_node.m_following_flag )
  2003. {
  2004. // 2楼交接, 在出口终点x交接
  2005. t_x = tp_dispatch_coordinates->m_carrier_coordinates_map[m_dispatch_destination].x;
  2006. float t_y = tp_dispatch_coordinates->m_carrier_default_y1_back - (m_wheel_base /2);
  2007. //机器手调整到 对接搬运器的姿态
  2008. catcher_adjust_from_carrier(get_dispatch_control_command_key(m_dispatch_catcher_node), tp_main_catcher, tp_main_catcher_task, tp_dispatch_coordinates, t_x);
  2009. //3楼搬运器跟随, 到机器人旁边一个车位
  2010. float t_following_x = 0;
  2011. if ( m_dispatch_destination == 1101 )
  2012. {
  2013. t_following_x = tp_dispatch_coordinates->m_carrier_coordinates_map[1102].x;
  2014. }
  2015. else if ( m_dispatch_destination == 1106 )
  2016. {
  2017. t_following_x = tp_dispatch_coordinates->m_carrier_coordinates_map[1105].x;
  2018. }
  2019. else if ( tp_following_carrier->m_actual_x < t_x)
  2020. {
  2021. t_following_x = tp_dispatch_coordinates->m_carrier_coordinates_map[m_dispatch_destination-1].x;
  2022. }
  2023. else
  2024. {
  2025. t_following_x = tp_dispatch_coordinates->m_carrier_coordinates_map[m_dispatch_destination+1].x;
  2026. }
  2027. carrier_move_x(get_dispatch_control_command_key(m_dispatch_catcher_node), tp_following_carrier, tp_following_carrier_task, tp_dispatch_coordinates, t_following_x);
  2028. m_dispatch_catcher_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_catcher_node.m_dispatch_control_status+1);
  2029. }
  2030. else
  2031. {
  2032. if ( m_dispatch_carrier_node.m_dispatch_control_status >= Dispatch_process::Dispatch_control_status::DISPATCH_CARRIER_PICKUP_28 )
  2033. {
  2034. //3楼交接, 在取车车位起点x交接,
  2035. t_x = tp_dispatch_coordinates->m_carrier_coordinates_map[m_parkspace_information_optimal.parkingspace_index_id].x;
  2036. float t_y = tp_dispatch_coordinates->m_carrier_default_y1_back - (m_wheel_base /2);
  2037. //机器手调整到 对接搬运器的姿态
  2038. catcher_adjust_from_carrier(get_dispatch_control_command_key(m_dispatch_catcher_node), tp_main_catcher, tp_main_catcher_task, tp_dispatch_coordinates, t_x);
  2039. m_dispatch_catcher_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_catcher_node.m_dispatch_control_status+1);
  2040. }
  2041. //else 无限等待
  2042. }
  2043. break;
  2044. }
  2045. case DISPATCH_CATCHER_PICKUP_14://机器人释放 空间锁
  2046. {
  2047. m_dispatch_catcher_node.m_error = check_task_status(m_dispatch_catcher_node.mp_main_catcher_task);
  2048. if ( m_dispatch_catcher_node.m_following_flag )
  2049. {
  2050. m_dispatch_catcher_node.m_error.compare_and_cover_error(check_task_status(m_dispatch_catcher_node.mp_following_carrier_task));
  2051. }
  2052. if ( m_dispatch_catcher_node.m_error == Error_code::SUCCESS )
  2053. {
  2054. tp_dispatch_coordinates->catcher_space_unlock(tp_main_catcher->m_actual_coordinates_id, tp_main_catcher->get_device_id());
  2055. m_dispatch_catcher_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_catcher_node.m_dispatch_control_status+1);
  2056. }
  2057. break;
  2058. }
  2059. case DISPATCH_CATCHER_PICKUP_15://机器手 准备下降抓车之前, 等待搬运器就位, 然后把一级任务升到三级
  2060. {
  2061. //2楼交接时, 机器人先等待, 再升级, 3楼交接时, 机器人先升级, 再等待,
  2062. if ( m_dispatch_catcher_node.m_following_flag )
  2063. {
  2064. // 2楼交接, 等待搬运器准备好, 机器人再升级
  2065. //等待搬运器就位, 把一级任务升到三级
  2066. if ( m_dispatch_carrier_node.m_dispatch_control_status >= Dispatch_process::Dispatch_control_status::DISPATCH_CARRIER_PICKUP_51 )
  2067. {
  2068. m_dispatch_catcher_node.m_error = m_dispatch_catcher_node.mp_main_catcher->change_task_level(Dispatch_device_base::Dispatch_task_level::DISPATCH_TASK_ONE_LEVEL, Dispatch_device_base::Dispatch_task_level::DISPATCH_TASK_THREE_LEVEL);
  2069. m_dispatch_catcher_node.m_error.compare_and_cover_error(m_dispatch_catcher_node.mp_following_carrier->change_task_level(Dispatch_device_base::Dispatch_task_level::DISPATCH_TASK_ONE_LEVEL, Dispatch_device_base::Dispatch_task_level::DISPATCH_TASK_THREE_LEVEL));
  2070. if ( m_dispatch_catcher_node.m_error == Error_code::SUCCESS )
  2071. {
  2072. m_dispatch_catcher_node.m_main_catcher_task_level = Dispatch_device_base::Dispatch_task_level::DISPATCH_TASK_THREE_LEVEL;
  2073. m_dispatch_catcher_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_catcher_node.m_dispatch_control_status+1);
  2074. }
  2075. else
  2076. {
  2077. m_dispatch_catcher_node.m_dispatch_control_status = Dispatch_process::Dispatch_control_status::DISPATCH_CONTROL_FAULT;
  2078. }
  2079. }
  2080. //else 无限等待
  2081. }
  2082. else
  2083. {
  2084. //3楼交接, 机器人直接升级, 需要锁定位置, 不能为其他流程避让
  2085. m_dispatch_catcher_node.m_error = m_dispatch_catcher_node.mp_main_catcher->change_task_level(Dispatch_device_base::Dispatch_task_level::DISPATCH_TASK_ONE_LEVEL, Dispatch_device_base::Dispatch_task_level::DISPATCH_TASK_THREE_LEVEL);
  2086. if ( m_dispatch_catcher_node.m_error == Error_code::SUCCESS )
  2087. {
  2088. m_dispatch_catcher_node.m_main_catcher_task_level = Dispatch_device_base::Dispatch_task_level::DISPATCH_TASK_THREE_LEVEL;
  2089. m_dispatch_catcher_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_catcher_node.m_dispatch_control_status+1);
  2090. }
  2091. else
  2092. {
  2093. m_dispatch_catcher_node.m_dispatch_control_status = Dispatch_process::Dispatch_control_status::DISPATCH_CONTROL_FAULT;
  2094. }
  2095. }
  2096. break;
  2097. }
  2098. case DISPATCH_CATCHER_PICKUP_16://机器手 z轴下降, 空间加锁
  2099. {
  2100. //2楼交接时, 机器人先等待, 再升级, 3楼交接时, 机器人先升级, 再等待,
  2101. if ( m_dispatch_catcher_node.m_following_flag )
  2102. {
  2103. //2楼交接的空间已经由搬运器加锁, 机器人下降时就不判断了, 强制加锁即可.
  2104. if ( m_dispatch_catcher_node.m_following_flag )//去3楼取车不用加锁
  2105. {
  2106. int t_terminal = m_dispatch_destination - 1100;
  2107. int temp = (t_terminal-1)%2;
  2108. int t_column = 4 + ((t_terminal-1)/2)*3 + temp*2 -1;
  2109. m_dispatch_catcher_node.m_error = tp_dispatch_coordinates->catcher_force_space_lock(0, t_column-1,
  2110. 2, t_column+1,
  2111. tp_main_catcher->get_device_id());
  2112. }
  2113. m_dispatch_catcher_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_catcher_node.m_dispatch_control_status+1);
  2114. }
  2115. else
  2116. {
  2117. if ( m_dispatch_carrier_node.m_dispatch_control_status >= Dispatch_process::Dispatch_control_status::DISPATCH_CARRIER_PICKUP_51 )
  2118. {
  2119. //2楼交接的空间已经由搬运器加锁, 机器人下降时就不判断了, 强制加锁即可.
  2120. if ( m_dispatch_catcher_node.m_following_flag )//去3楼取车不用加锁
  2121. {
  2122. int t_terminal = m_dispatch_destination - 1100;
  2123. int temp = (t_terminal-1)%2;
  2124. int t_column = 4 + ((t_terminal-1)/2)*3 + temp*2 -1;
  2125. m_dispatch_catcher_node.m_error = tp_dispatch_coordinates->catcher_force_space_lock(0, t_column-1,
  2126. 2, t_column+1,
  2127. tp_main_catcher->get_device_id());
  2128. }
  2129. m_dispatch_catcher_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_catcher_node.m_dispatch_control_status+1);
  2130. }
  2131. //else 无限等待
  2132. }
  2133. break;
  2134. }
  2135. case DISPATCH_CATCHER_PICKUP_17://机器手 z轴下降
  2136. {
  2137. float t_z = 0;
  2138. if ( m_dispatch_catcher_node.m_following_flag )
  2139. {
  2140. //下降到2楼抓车
  2141. t_z = tp_dispatch_coordinates->m_catcher_2th_floor_z;
  2142. }
  2143. else
  2144. {
  2145. //下降到3楼抓车
  2146. t_z = tp_dispatch_coordinates->m_catcher_3th_floor_z;
  2147. }
  2148. catcher_move_z(get_dispatch_control_command_key(m_dispatch_catcher_node), tp_main_catcher, tp_main_catcher_task, tp_dispatch_coordinates, t_z);
  2149. m_dispatch_catcher_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_catcher_node.m_dispatch_control_status+1);
  2150. break;
  2151. }
  2152. case DISPATCH_CATCHER_PICKUP_18:
  2153. {
  2154. m_dispatch_catcher_node.m_error = check_task_status(m_dispatch_catcher_node.mp_main_catcher_task, m_dispatch_catcher_node.m_dispatch_control_status);
  2155. break;
  2156. }
  2157. case DISPATCH_CATCHER_PICKUP_19://交接车辆检查//修正轴距, 如果轴距大于3000mm, 那么就要修正轴距.
  2158. {
  2159. //检查姿态(注注注注注意了, 调试阶段是无车, 真实环境是有车的)
  2160. if ( tp_main_catcher->m_actual_load_status == Dispatch_device_base::Load_status::NO_CAR &&
  2161. tp_main_catcher->m_actual_clamp_motion1 == Dispatch_device_base::Clamp_motion::E_CLAMP_LOOSE)
  2162. {
  2163. float temp_wheel_base = tp_main_catcher->m_actual_d1 + tp_main_catcher->m_actual_d2 + tp_dispatch_coordinates->m_catcher_d1_d2_distance;
  2164. //修正轴距, 如果轴距大于3000mm, 那么就要修正轴距.
  2165. if ( Common_data::approximate_difference(m_wheel_base, temp_wheel_base, DISPATCH_DEFAULT_DIFFERENCE) )
  2166. {
  2167. m_dispatch_catcher_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_catcher_node.m_dispatch_control_status+2);
  2168. }
  2169. else
  2170. {
  2171. catcher_adjust_wheel_base(get_dispatch_control_command_key(m_dispatch_catcher_node), tp_main_catcher, tp_main_catcher_task, tp_dispatch_coordinates);
  2172. m_dispatch_catcher_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_catcher_node.m_dispatch_control_status+1);
  2173. }
  2174. }
  2175. else
  2176. {
  2177. m_dispatch_catcher_node.m_dispatch_control_status = Dispatch_process::Dispatch_control_status::DISPATCH_CONTROL_FAULT;
  2178. m_dispatch_catcher_node.m_error = Error_manager(Error_code::CATCHER_POSE_ERROR, Error_level::MINOR_ERROR,
  2179. "DISPATCH_CATCHER_PICKUP_19 Dispatch_process:: tp_main_catcher->m_actual_load_status error ");
  2180. }
  2181. break;
  2182. }
  2183. case DISPATCH_CATCHER_PICKUP_20:
  2184. {
  2185. m_dispatch_catcher_node.m_error = check_task_status(m_dispatch_catcher_node.mp_main_catcher_task, m_dispatch_catcher_node.m_dispatch_control_status);
  2186. break;
  2187. }
  2188. case DISPATCH_CATCHER_PICKUP_21://机器手 夹车
  2189. {
  2190. //等待小跑车松开夹车杆
  2191. if ( m_dispatch_carrier_node.m_dispatch_control_status >= Dispatch_process::Dispatch_control_status::DISPATCH_CARRIER_PICKUP_53 )
  2192. {
  2193. catcher_move_c(get_dispatch_control_command_key(m_dispatch_catcher_node), tp_main_catcher, tp_main_catcher_task, tp_dispatch_coordinates, Catcher_task::Clamp_motion::E_CLAMP_TIGHT);
  2194. m_dispatch_catcher_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_catcher_node.m_dispatch_control_status+1);
  2195. }
  2196. //else 无限等待
  2197. break;
  2198. }
  2199. case DISPATCH_CATCHER_PICKUP_22:
  2200. {
  2201. m_dispatch_catcher_node.m_error = check_task_status(m_dispatch_catcher_node.mp_main_catcher_task, m_dispatch_catcher_node.m_dispatch_control_status);
  2202. break;
  2203. }
  2204. case DISPATCH_CATCHER_PICKUP_23://机器手 z轴上升, 上升190mm就足以
  2205. {
  2206. // float t_z = 0;
  2207. // if ( m_dispatch_catcher_node.m_following_flag )
  2208. // {
  2209. // t_z = tp_dispatch_coordinates->m_catcher_2th_floor_z + tp_dispatch_coordinates->m_separated_distance_z;
  2210. // }
  2211. // else
  2212. // {
  2213. // t_z = tp_dispatch_coordinates->m_catcher_3th_floor_z + tp_dispatch_coordinates->m_separated_distance_z;
  2214. // }
  2215. //只能在最高处交接
  2216. float t_z = tp_dispatch_coordinates->m_catcher_4th_floor_z;
  2217. catcher_move_z(get_dispatch_control_command_key(m_dispatch_catcher_node), tp_main_catcher, tp_main_catcher_task, tp_dispatch_coordinates, t_z);
  2218. m_dispatch_catcher_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_catcher_node.m_dispatch_control_status+1);
  2219. break;
  2220. }
  2221. case DISPATCH_CATCHER_PICKUP_24:
  2222. {
  2223. m_dispatch_catcher_node.m_error = check_task_status(m_dispatch_catcher_node.mp_main_catcher_task, m_dispatch_catcher_node.m_dispatch_control_status);
  2224. break;
  2225. }
  2226. case DISPATCH_CATCHER_PICKUP_25://3楼机器人移动前加锁
  2227. {
  2228. int t_terminal = m_dispatch_destination - 1100;
  2229. int temp = (t_terminal-1)%2;
  2230. int t_column = 4 + ((t_terminal-1)/2)*3 + temp*2 -1;
  2231. if ( tp_main_catcher->m_actual_coordinates_columns < t_column )
  2232. {
  2233. m_dispatch_catcher_node.m_error = tp_dispatch_coordinates->catcher_try_space_lock(1, tp_main_catcher->m_actual_coordinates_columns,
  2234. 2, t_column+1,
  2235. tp_main_catcher->get_device_id());
  2236. }
  2237. else
  2238. {
  2239. m_dispatch_catcher_node.m_error = tp_dispatch_coordinates->catcher_try_space_lock(1, t_column-1,
  2240. 2, tp_main_catcher->m_actual_coordinates_columns,
  2241. tp_main_catcher->get_device_id());
  2242. }
  2243. //判断结果
  2244. if ( m_dispatch_catcher_node.m_error == Error_code::SUCCESS )
  2245. {
  2246. m_dispatch_catcher_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_catcher_node.m_dispatch_control_status+1);
  2247. }
  2248. //else 无限等待
  2249. break;
  2250. }
  2251. case DISPATCH_CATCHER_PICKUP_26://机器手调整到 准备把车放到地面的姿态
  2252. {
  2253. float t_x = tp_dispatch_coordinates->m_carrier_coordinates_map[m_dispatch_destination].x;
  2254. float t_y = tp_dispatch_coordinates->m_carrier_coordinates_map[m_dispatch_destination].y;
  2255. if ( Common_data::approximate_difference(tp_main_catcher->m_actual_x, t_x, DISPATCH_DEFAULT_DIFFERENCE) &&
  2256. Common_data::approximate_difference(tp_main_catcher->m_actual_y, t_y, DISPATCH_DEFAULT_DIFFERENCE))
  2257. {
  2258. //检测正常, 直接跳过即可
  2259. m_dispatch_catcher_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_catcher_node.m_dispatch_control_status+2);
  2260. }
  2261. else
  2262. {
  2263. catcher_adjust_to_ground(get_dispatch_control_command_key(m_dispatch_catcher_node), tp_main_catcher, tp_main_catcher_task, tp_dispatch_coordinates, t_x, t_y);
  2264. m_dispatch_catcher_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_catcher_node.m_dispatch_control_status+1);
  2265. }
  2266. break;
  2267. }
  2268. case DISPATCH_CATCHER_PICKUP_27://机器人 释放空间锁
  2269. {
  2270. m_dispatch_catcher_node.m_error = check_task_status(m_dispatch_catcher_node.mp_main_catcher_task, m_dispatch_catcher_node.m_dispatch_control_status);
  2271. //注:只有3楼取车, 才会进行x轴移动, 需要解锁. 其他时候机器人在2楼, 不要释放空间锁
  2272. if ( m_dispatch_catcher_node.m_error == Error_code::SUCCESS && m_dispatch_catcher_node.m_following_flag == false)
  2273. {
  2274. tp_dispatch_coordinates->catcher_space_unlock(tp_main_catcher->m_actual_coordinates_id, tp_main_catcher->get_device_id());
  2275. }
  2276. break;
  2277. }
  2278. case DISPATCH_CATCHER_PICKUP_28://等待搬运器离开后, 机器人就可以下降了
  2279. {
  2280. //等待搬运器离开后, 机器人就可以下降了
  2281. if ( (m_dispatch_carrier_node.m_dispatch_control_status >= Dispatch_process::Dispatch_control_status::DISPATCH_CARRIER_PICKUP_56 &&
  2282. m_dispatch_carrier_node.m_dispatch_control_status <= Dispatch_process::Dispatch_control_status::DISPATCH_CARRIER_PICKUP_58)
  2283. || (m_dispatch_carrier_node.m_dispatch_control_status >= Dispatch_process::Dispatch_control_status::DISPATCH_CARRIER_PICKUP_72 &&
  2284. m_dispatch_carrier_node.m_dispatch_control_status <= Dispatch_process::Dispatch_control_status::DISPATCH_CARRIER_PICKUP_74)
  2285. || (m_dispatch_carrier_node.m_dispatch_control_status == Dispatch_process::Dispatch_control_status::DISPATCH_CARRIER_PICKUP_END) )
  2286. {
  2287. m_dispatch_catcher_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_catcher_node.m_dispatch_control_status+1);
  2288. }
  2289. else if(m_dispatch_carrier_node.m_dispatch_control_status == Dispatch_process::Dispatch_control_status::DISPATCH_CARRIER_PICKUP_55 &&
  2290. (Common_data::approximate_difference(tp_main_carrier->m_actual_x, tp_main_catcher->m_actual_x, tp_dispatch_coordinates->m_separated_distance_x) == false) )
  2291. {
  2292. m_dispatch_catcher_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_catcher_node.m_dispatch_control_status+1);
  2293. }
  2294. //else 无限等待
  2295. break;
  2296. }
  2297. case DISPATCH_CATCHER_PICKUP_29://机器人z轴下降, 判断空间锁
  2298. {
  2299. //2楼交接这里就不加锁了, 因为前面已经加了, 但是3楼前面没有提前加锁, 这里就要加锁了
  2300. if ( m_dispatch_catcher_node.m_following_flag )
  2301. {
  2302. m_dispatch_catcher_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_catcher_node.m_dispatch_control_status+1);
  2303. }
  2304. else
  2305. {
  2306. int t_terminal = m_dispatch_destination - 1100;
  2307. int temp = (t_terminal-1)%2;
  2308. int t_column = 4 + ((t_terminal-1)/2)*3 + temp*2 -1;
  2309. m_dispatch_catcher_node.m_error = tp_dispatch_coordinates->catcher_try_space_lock(0, t_column-1,
  2310. 2, t_column+1,
  2311. tp_main_catcher->get_device_id());
  2312. //判断结果
  2313. if ( m_dispatch_catcher_node.m_error == Error_code::SUCCESS )
  2314. {
  2315. m_dispatch_catcher_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_catcher_node.m_dispatch_control_status+1);
  2316. }
  2317. //else 无限等待
  2318. }
  2319. break;
  2320. }
  2321. case DISPATCH_CATCHER_PICKUP_30://机器人下降到地面放车
  2322. {
  2323. catcher_move_z(get_dispatch_control_command_key(m_dispatch_catcher_node), tp_main_catcher, tp_main_catcher_task, tp_dispatch_coordinates, tp_dispatch_coordinates->m_catcher_1th_floor_z);
  2324. m_dispatch_catcher_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_catcher_node.m_dispatch_control_status+1);
  2325. break;
  2326. }
  2327. case DISPATCH_CATCHER_PICKUP_31:
  2328. {
  2329. m_dispatch_catcher_node.m_error = check_task_status(m_dispatch_catcher_node.mp_main_catcher_task, m_dispatch_catcher_node.m_dispatch_control_status);
  2330. break;
  2331. }
  2332. case DISPATCH_CATCHER_PICKUP_32://机器手 松开夹杆
  2333. {
  2334. catcher_move_c(get_dispatch_control_command_key(m_dispatch_catcher_node), tp_main_catcher, tp_main_catcher_task, tp_dispatch_coordinates, Catcher_task::Clamp_motion::E_CLAMP_LOOSE);
  2335. m_dispatch_catcher_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_catcher_node.m_dispatch_control_status+1);
  2336. break;
  2337. }
  2338. case DISPATCH_CATCHER_PICKUP_33:
  2339. {
  2340. m_dispatch_catcher_node.m_error = check_task_status(m_dispatch_catcher_node.mp_main_catcher_task, m_dispatch_catcher_node.m_dispatch_control_status);
  2341. break;
  2342. }
  2343. case DISPATCH_CATCHER_PICKUP_34://机器手调整到 正常待机的姿态(调节夹杆和轴距)
  2344. {
  2345. if ( tp_main_catcher->m_actual_clamp_motion1 != Dispatch_device_base::Clamp_motion::E_CLAMP_LOOSE ||
  2346. tp_main_catcher->m_actual_d1 + tp_main_catcher->m_actual_d2 + tp_dispatch_coordinates->m_catcher_d1_d2_distance >
  2347. tp_dispatch_coordinates->m_catcher_wheel_base_limit ||
  2348. tp_main_catcher->m_catcher_direction == Dispatch_device_base::Catcher_direction::CATCHER_DIRECTION_UNKNOW )
  2349. {
  2350. catcher_adjust_to_ready(get_dispatch_control_command_key(m_dispatch_catcher_node), tp_main_catcher, tp_main_catcher_task, tp_dispatch_coordinates);
  2351. m_dispatch_catcher_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_catcher_node.m_dispatch_control_status+1);
  2352. }
  2353. else
  2354. {
  2355. m_dispatch_catcher_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_catcher_node.m_dispatch_control_status+2);
  2356. }
  2357. break;
  2358. }
  2359. case DISPATCH_CATCHER_PICKUP_35:
  2360. {
  2361. m_dispatch_catcher_node.m_error = check_task_status(m_dispatch_catcher_node.mp_main_catcher_task, m_dispatch_catcher_node.m_dispatch_control_status);
  2362. break;
  2363. }
  2364. case DISPATCH_CATCHER_PICKUP_36://机器手 调整z轴, z轴上升到4楼
  2365. {
  2366. catcher_move_z(get_dispatch_control_command_key(m_dispatch_catcher_node), tp_main_catcher, tp_main_catcher_task, tp_dispatch_coordinates, tp_dispatch_coordinates->m_catcher_4th_floor_z);
  2367. m_dispatch_catcher_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_catcher_node.m_dispatch_control_status+1);
  2368. break;
  2369. }
  2370. case DISPATCH_CATCHER_PICKUP_37://机器人释放 空间锁
  2371. {
  2372. m_dispatch_catcher_node.m_error = check_task_status(m_dispatch_catcher_node.mp_main_catcher_task, m_dispatch_catcher_node.m_dispatch_control_status);
  2373. if ( m_dispatch_catcher_node.m_error == Error_code::SUCCESS )
  2374. {
  2375. tp_dispatch_coordinates->catcher_space_unlock(tp_main_catcher->m_actual_coordinates_id, tp_main_catcher->get_device_id());
  2376. }
  2377. break;
  2378. }
  2379. case DISPATCH_CATCHER_PICKUP_38://3楼的搬运器跟随到机器人下方
  2380. {
  2381. //如果后面有一级存车任务, 那么就跳过
  2382. if ( m_dispatch_catcher_node.m_following_flag &&
  2383. tp_main_catcher->is_has_appoint_task(Dispatch_device_base::Dispatch_task_level::DISPATCH_TASK_ONE_LEVEL) == false &&
  2384. tp_main_catcher->is_has_appoint_task(Dispatch_device_base::Dispatch_task_level::DISPATCH_TASK_TWO_LEVEL) == false)
  2385. {
  2386. float t_following_x = tp_dispatch_coordinates->m_carrier_coordinates_map[m_dispatch_destination].x;
  2387. carrier_move_x(get_dispatch_control_command_key(m_dispatch_catcher_node), tp_following_carrier, tp_following_carrier_task, tp_dispatch_coordinates, t_following_x);
  2388. m_dispatch_catcher_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_catcher_node.m_dispatch_control_status+1);
  2389. }
  2390. else
  2391. {
  2392. m_dispatch_catcher_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_catcher_node.m_dispatch_control_status+2);
  2393. }
  2394. break;
  2395. }
  2396. case DISPATCH_CATCHER_PICKUP_39:
  2397. {
  2398. m_dispatch_catcher_node.m_error = check_task_status(m_dispatch_catcher_node.mp_following_carrier_task, m_dispatch_catcher_node.m_dispatch_control_status);
  2399. break;
  2400. }
  2401. case DISPATCH_CATCHER_PICKUP_40://主机器人 断连
  2402. {
  2403. disconnect_dispatch_device(m_dispatch_catcher_node.mp_main_catcher, m_dispatch_catcher_node.mp_main_catcher_task);
  2404. if ( m_dispatch_catcher_node.m_following_flag )
  2405. {
  2406. disconnect_dispatch_device(m_dispatch_catcher_node.mp_following_carrier, m_dispatch_catcher_node.mp_following_carrier_task);
  2407. }
  2408. m_dispatch_catcher_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status::DISPATCH_CATCHER_PICKUP_END);
  2409. break;
  2410. }
  2411. case DISPATCH_CATCHER_PICKUP_END:
  2412. {
  2413. m_dispatch_catcher_node.m_error = Error_code::SUCCESS;
  2414. break;
  2415. }
  2416. default:
  2417. {
  2418. break;
  2419. }
  2420. }
  2421. std::cout << " huli test :::: " << " ---------------------------------------------------------------------------------------------------------------------------- = " << "catcher end" << std::endl;
  2422. std::cout << " huli test :::: " << " m_dispatch_catcher_node.m_dispatch_control_status = " << m_dispatch_catcher_node.m_dispatch_control_status << std::endl;
  2423. if ( m_dispatch_catcher_node.mp_main_catcher.get() != NULL )
  2424. {
  2425. std::cout << " huli test :::: " << " tp_main_catcher->get_device_id() = " << m_dispatch_catcher_node.mp_main_catcher->get_device_id() <<" + "<< m_dispatch_catcher_node.mp_main_catcher->get_current_command_key() <<" + "<< m_dispatch_catcher_node.mp_main_catcher->get_dispatch_device_status() << std::endl;
  2426. }
  2427. else
  2428. {
  2429. std::cout << " huli test :::: " << " tp_main_catcher->get_device_id() = " << -8888 << std::endl;
  2430. }
  2431. if ( m_dispatch_catcher_node.mp_following_carrier.get() != NULL )
  2432. {
  2433. std::cout << " huli test :::: " << " tp_following_carrier->get_device_id() = " << m_dispatch_catcher_node.mp_following_carrier->get_device_id() <<" + " << m_dispatch_catcher_node.mp_following_carrier->get_current_command_key()<<" + "<< m_dispatch_catcher_node.mp_following_carrier->get_dispatch_device_status() << std::endl;
  2434. }
  2435. else
  2436. {
  2437. std::cout << " huli test :::: " << " tp_following_carrier->get_device_id() = " << -8888 << std::endl;
  2438. }
  2439. std::cout << " huli test :::: " << " +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ = " << 3 << std::endl;
  2440. std::cout << " huli test :::: " << " m_parkspace_information_optimal.parkingspace_index_id = " << m_parkspace_information_optimal.parkingspace_index_id << std::endl;
  2441. std::cout << " huli test :::: " << " m_dispatch_destination = " << m_dispatch_destination << std::endl;
  2442. #ifdef PROCESS_TEST
  2443. char ch;
  2444. std::cin >> ch ;
  2445. #endif
  2446. //结果汇总
  2447. if ( m_dispatch_carrier_node.m_dispatch_control_status == DISPATCH_CARRIER_PICKUP_END &&
  2448. (m_dispatch_catcher_node.m_dispatch_control_status == DISPATCH_CATCHER_PICKUP_END || m_dispatch_catcher_node.m_dispatch_control_status == DISPATCH_CONTROL_READY) )
  2449. {
  2450. return Error_code::SUCCESS;
  2451. }
  2452. else if ( m_dispatch_carrier_node.m_dispatch_control_status == DISPATCH_CONTROL_FAULT )
  2453. {
  2454. return m_dispatch_carrier_node.m_error;
  2455. }
  2456. else if(m_dispatch_catcher_node.m_dispatch_control_status == DISPATCH_CONTROL_FAULT)
  2457. {
  2458. return m_dispatch_catcher_node.m_error;
  2459. }
  2460. else
  2461. {
  2462. return Error_code::NODATA;
  2463. }
  2464. }
  2465. //调度控制存车
  2466. Error_manager Dispatch_process::dispatch_control_motion_store()
  2467. {
  2468. std::unique_lock<std::mutex> t_lock(m_lock);
  2469. Dispatch_coordinates * tp_dispatch_coordinates = Dispatch_coordinates::get_instance_pointer();
  2470. Error_manager t_carrier_error;
  2471. Carrier * tp_main_carrier = NULL;
  2472. Carrier_task * tp_main_carrier_task = NULL;
  2473. if ( m_dispatch_carrier_node.mp_main_carrier.get() != NULL && m_dispatch_carrier_node.mp_main_carrier_task.get() != NULL )
  2474. {
  2475. tp_main_carrier = (Carrier *)m_dispatch_carrier_node.mp_main_carrier.get();
  2476. tp_main_carrier_task = (Carrier_task *)m_dispatch_carrier_node.mp_main_carrier_task.get();
  2477. //一级任务被打断后, 重新执行
  2478. if ( tp_main_carrier->get_break_flag() )
  2479. {
  2480. if ( m_dispatch_carrier_node.m_main_carrier_task_level == Dispatch_device_base::Dispatch_task_level::DISPATCH_TASK_ONE_LEVEL )
  2481. {
  2482. m_dispatch_carrier_node.m_dispatch_control_status = DISPATCH_CARRIER_STORE_START;
  2483. }
  2484. tp_main_carrier->set_break_flag(false);
  2485. }
  2486. }
  2487. Catcher * tp_avoid_catcher = NULL;
  2488. Catcher_task * tp_avoid_catcher_task = NULL;
  2489. if ( m_dispatch_carrier_node.mp_avoid_catcher.get() != NULL && m_dispatch_carrier_node.mp_avoid_catcher_task.get() != NULL )
  2490. {
  2491. tp_avoid_catcher = (Catcher *)m_dispatch_carrier_node.mp_avoid_catcher.get();
  2492. tp_avoid_catcher_task = (Catcher_task *)m_dispatch_carrier_node.mp_avoid_catcher_task.get();
  2493. }
  2494. Carrier * tp_avoid_carrier = NULL;
  2495. Carrier_task * tp_avoid_carrier_task = NULL;
  2496. if ( m_dispatch_carrier_node.mp_avoid_carrier.get() != NULL && m_dispatch_carrier_node.mp_avoid_carrier_task.get() != NULL )
  2497. {
  2498. tp_avoid_carrier = (Carrier *)m_dispatch_carrier_node.mp_avoid_carrier.get();
  2499. tp_avoid_carrier_task = (Carrier_task *)m_dispatch_carrier_node.mp_avoid_carrier_task.get();
  2500. }
  2501. std::cout << " huli test :::: " << " ===================================================================================================================== = " << "carrier start" << std::endl;
  2502. std::cout << " huli test :::: " << " m_dispatch_carrier_node.m_dispatch_control_status = " << m_dispatch_carrier_node.m_dispatch_control_status << std::endl;
  2503. if ( m_dispatch_carrier_node.mp_main_carrier.get() != NULL )
  2504. {
  2505. std::cout << " huli test :::: " << " tp_main_carrier->get_device_id() = " << m_dispatch_carrier_node.mp_main_carrier->get_device_id() <<" + "<< m_dispatch_carrier_node.mp_main_carrier->get_current_command_key() <<" + "<< m_dispatch_carrier_node.mp_main_carrier->get_dispatch_device_status() << std::endl;
  2506. }
  2507. else
  2508. {
  2509. std::cout << " huli test :::: " << " tp_main_carrier->get_device_id() = " << -8888 << std::endl;
  2510. }
  2511. if ( m_dispatch_carrier_node.mp_avoid_catcher.get() != NULL )
  2512. {
  2513. std::cout << " huli test :::: " << " tp_avoid_catcher->get_device_id() = " << m_dispatch_carrier_node.mp_avoid_catcher->get_device_id() <<" + "<< m_dispatch_carrier_node.mp_avoid_catcher->get_current_command_key() <<" + "<< m_dispatch_carrier_node.mp_avoid_catcher->get_dispatch_device_status() << std::endl;
  2514. }
  2515. else
  2516. {
  2517. std::cout << " huli test :::: " << " tp_avoid_catcher->get_device_id() = " << -8888 << std::endl;
  2518. }
  2519. if ( m_dispatch_carrier_node.mp_avoid_carrier.get() != NULL )
  2520. {
  2521. std::cout << " huli test :::: " << " tp_avoid_carrier->get_device_id() = " << m_dispatch_carrier_node.mp_avoid_carrier->get_device_id() <<" + "<< m_dispatch_carrier_node.mp_avoid_carrier->get_current_command_key() <<" + "<< m_dispatch_carrier_node.mp_avoid_carrier->get_dispatch_device_status() << std::endl;
  2522. }
  2523. else
  2524. {
  2525. std::cout << " huli test :::: " << " tp_avoid_carrier->get_device_id() = " << -8888 << std::endl;
  2526. }
  2527. //搬运器的控制动作
  2528. switch ( m_dispatch_carrier_node.m_dispatch_control_status )
  2529. {
  2530. case DISPATCH_CONTROL_CREATED:
  2531. case DISPATCH_CONTROL_READY://等待调度管理进行资源分配
  2532. {
  2533. m_dispatch_carrier_node.m_error = check_main_carrier(m_dispatch_carrier_node);
  2534. if (m_dispatch_carrier_node.m_error == Error_code::SUCCESS)
  2535. {
  2536. if (m_dispatch_process_type == Common_data::Dispatch_process_type::DISPATCH_PROCESS_PICKUP)
  2537. {
  2538. m_dispatch_carrier_node.m_dispatch_control_status = Dispatch_process::Dispatch_control_status::DISPATCH_CARRIER_PICKUP_START;
  2539. }
  2540. else if (m_dispatch_process_type == Common_data::Dispatch_process_type::DISPATCH_PROCESS_STORE)
  2541. {
  2542. m_dispatch_carrier_node.m_dispatch_control_status = Dispatch_process::Dispatch_control_status::DISPATCH_CARRIER_STORE_START;
  2543. }
  2544. }
  2545. //else 原地等待
  2546. break;
  2547. }
  2548. case DISPATCH_CARRIER_STORE_START://连接搬运器, 创建新的任务单 与设备建立连接
  2549. {
  2550. //注意了:3楼的存车流程, 需要机器人提前启动
  2551. if (m_dispatch_carrier_node.mp_main_carrier->get_device_id() == 2)
  2552. {
  2553. //通知机器人提前开始
  2554. m_dispatch_catcher_node.m_dispatch_control_start_flag = true;
  2555. m_dispatch_catcher_node.m_following_flag = false;
  2556. //等待机器人正常连接之后, 搬运器才正式开始
  2557. if (m_dispatch_catcher_node.m_dispatch_control_status >= DISPATCH_CATCHER_STORE_2)
  2558. {
  2559. if ( m_dispatch_carrier_node.mp_main_carrier_task.get() == NULL )
  2560. {
  2561. //连接搬运器, 创建新的任务单 与设备建立连接, 只能成功, 失败就要进入故障处理
  2562. m_dispatch_carrier_node.m_error = m_dispatch_carrier_node.mp_main_carrier->check_task_level(
  2563. Dispatch_device_base::Dispatch_task_level::DISPATCH_TASK_ONE_LEVEL);
  2564. if (m_dispatch_carrier_node.m_error == Error_code::SUCCESS)
  2565. {
  2566. m_dispatch_carrier_node.m_error = connect_dispatch_carrier(m_dispatch_carrier_node.mp_main_carrier,
  2567. m_dispatch_carrier_node.mp_main_carrier_task,
  2568. Dispatch_device_base::Dispatch_task_level::DISPATCH_TASK_ONE_LEVEL);
  2569. if (m_dispatch_carrier_node.m_error == Error_code::SUCCESS)
  2570. {
  2571. m_dispatch_carrier_node.m_main_carrier_task_level = Dispatch_device_base::Dispatch_task_level::DISPATCH_TASK_ONE_LEVEL;
  2572. m_dispatch_carrier_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status) (
  2573. m_dispatch_carrier_node.m_dispatch_control_status + 1);
  2574. }
  2575. else
  2576. {
  2577. m_dispatch_carrier_node.m_dispatch_control_status = Dispatch_process::Dispatch_control_status::DISPATCH_CONTROL_FAULT;
  2578. }
  2579. }
  2580. else
  2581. {
  2582. m_dispatch_carrier_node.m_dispatch_control_status = Dispatch_process::Dispatch_control_status::DISPATCH_CONTROL_FAULT;
  2583. }
  2584. }
  2585. else
  2586. {
  2587. m_dispatch_carrier_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status) (m_dispatch_carrier_node.m_dispatch_control_status + 2);
  2588. }
  2589. }
  2590. //else 无限等待
  2591. }
  2592. else
  2593. {
  2594. if ( m_dispatch_carrier_node.mp_main_carrier_task.get() == NULL )
  2595. {
  2596. //连接搬运器, 创建新的任务单 与设备建立连接, 只能成功, 失败就要进入故障处理
  2597. m_dispatch_carrier_node.m_error = m_dispatch_carrier_node.mp_main_carrier->check_task_level(
  2598. Dispatch_device_base::Dispatch_task_level::DISPATCH_TASK_ONE_LEVEL);
  2599. if (m_dispatch_carrier_node.m_error == Error_code::SUCCESS)
  2600. {
  2601. m_dispatch_carrier_node.m_error = connect_dispatch_carrier(m_dispatch_carrier_node.mp_main_carrier,
  2602. m_dispatch_carrier_node.mp_main_carrier_task,
  2603. Dispatch_device_base::Dispatch_task_level::DISPATCH_TASK_ONE_LEVEL);
  2604. if (m_dispatch_carrier_node.m_error == Error_code::SUCCESS)
  2605. {
  2606. m_dispatch_carrier_node.m_main_carrier_task_level = Dispatch_device_base::Dispatch_task_level::DISPATCH_TASK_ONE_LEVEL;
  2607. m_dispatch_carrier_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status) (
  2608. m_dispatch_carrier_node.m_dispatch_control_status + 1);
  2609. }
  2610. else
  2611. {
  2612. m_dispatch_carrier_node.m_dispatch_control_status = Dispatch_process::Dispatch_control_status::DISPATCH_CONTROL_FAULT;
  2613. }
  2614. }
  2615. else
  2616. {
  2617. m_dispatch_carrier_node.m_dispatch_control_status = Dispatch_process::Dispatch_control_status::DISPATCH_CONTROL_FAULT;
  2618. }
  2619. }
  2620. else
  2621. {
  2622. m_dispatch_carrier_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status) (m_dispatch_carrier_node.m_dispatch_control_status + 2);
  2623. }
  2624. }
  2625. break;
  2626. }
  2627. case DISPATCH_CARRIER_STORE_1:
  2628. {
  2629. m_dispatch_carrier_node.m_error = check_task_status(m_dispatch_carrier_node.mp_main_carrier_task,
  2630. m_dispatch_carrier_node.m_dispatch_control_status);
  2631. break;
  2632. }
  2633. case DISPATCH_CARRIER_STORE_2://搬运器 准备开始, 需要同步任务单和设备真实数据
  2634. {
  2635. //注意了:3楼搬运器必须要和机器人联动, 所以必须等机器人连接上之后,搬运器才开始启动
  2636. if (m_dispatch_carrier_node.mp_main_carrier->get_device_id() == 2)
  2637. {
  2638. //等待机器人正常连接之后, 搬运器才正式开始
  2639. if (m_dispatch_catcher_node.m_dispatch_control_status >= DISPATCH_CATCHER_STORE_2)
  2640. {
  2641. //搬运器 准备开始, 需要同步任务单和设备真实数据.//注意了:连接设备只是预约, 设备不一定立刻执行.所以需要在连接成功之后进行数据同步
  2642. carrier_ready_to_start(get_dispatch_control_command_key(m_dispatch_carrier_node), tp_main_carrier,
  2643. tp_main_carrier_task, tp_dispatch_coordinates);
  2644. m_dispatch_carrier_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status) (m_dispatch_carrier_node.m_dispatch_control_status + 1);
  2645. }
  2646. //else 无限等待
  2647. }
  2648. else
  2649. {
  2650. //通知机器人提前开始
  2651. m_dispatch_catcher_node.m_dispatch_control_start_flag = true;
  2652. m_dispatch_catcher_node.m_following_flag = true;
  2653. //搬运器 准备开始, 需要同步任务单和设备真实数据.//注意了:连接设备只是预约, 设备不一定立刻执行.所以需要在连接成功之后进行数据同步
  2654. carrier_ready_to_start(get_dispatch_control_command_key(m_dispatch_carrier_node), tp_main_carrier,
  2655. tp_main_carrier_task, tp_dispatch_coordinates);
  2656. m_dispatch_carrier_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status) (m_dispatch_carrier_node.m_dispatch_control_status + 1);
  2657. }
  2658. break;
  2659. }
  2660. case DISPATCH_CARRIER_STORE_3:
  2661. {
  2662. m_dispatch_carrier_node.m_error = check_task_status(m_dispatch_carrier_node.mp_main_carrier_task,
  2663. m_dispatch_carrier_node.m_dispatch_control_status);
  2664. //注意了:同步失败,需要重新同步.
  2665. if ( m_dispatch_carrier_node.m_error != Error_code::SUCCESS )
  2666. {
  2667. m_dispatch_carrier_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status::DISPATCH_CARRIER_STORE_2);
  2668. }
  2669. break;
  2670. }
  2671. case DISPATCH_CARRIER_STORE_4://搬运器检查姿态 //搬运器调整到 正常待机的姿态(调节夹杆和轴距)
  2672. {
  2673. if ( tp_main_carrier->m_actual_load_status == Dispatch_device_base::Load_status::NO_CAR )
  2674. {
  2675. if ( tp_main_carrier_task->m_request_clamp_motion == Carrier_task::Clamp_motion::E_CLAMP_LOOSE &&
  2676. Common_data::approximate_difference(m_wheel_base, tp_main_carrier->m_actual_y1-tp_main_carrier->m_actual_y2, DISPATCH_DEFAULT_DIFFERENCE))
  2677. {
  2678. m_dispatch_carrier_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_carrier_node.m_dispatch_control_status+2);
  2679. }
  2680. else
  2681. {
  2682. //搬运器调整到 正常待机的姿态(调节夹杆和轴距)
  2683. carrier_adjust_to_ready(get_dispatch_control_command_key(m_dispatch_carrier_node), tp_main_carrier, tp_main_carrier_task, tp_dispatch_coordinates);
  2684. m_dispatch_carrier_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_carrier_node.m_dispatch_control_status+1);
  2685. }
  2686. }
  2687. else
  2688. {
  2689. m_dispatch_carrier_node.m_dispatch_control_status = Dispatch_process::Dispatch_control_status::DISPATCH_CONTROL_FAULT;
  2690. m_dispatch_carrier_node.m_error = Error_manager(Error_code::CARRIER_POSE_ERROR, Error_level::MINOR_ERROR,
  2691. "DISPATCH_CARRIER_STORE_4 tp_carrier->m_actual_load_status != Dispatch_device_base::Load_status::NO_CAR fun error ");
  2692. }
  2693. break;
  2694. }
  2695. case DISPATCH_CARRIER_STORE_5:
  2696. {
  2697. m_dispatch_carrier_node.m_error = check_task_status(m_dispatch_carrier_node.mp_main_carrier_task, m_dispatch_carrier_node.m_dispatch_control_status);
  2698. break;
  2699. }
  2700. case DISPATCH_CARRIER_STORE_6://让小跑车回到中跑车上, y轴移动
  2701. {
  2702. if ( Common_data::approximate_difference(tp_main_carrier->m_actual_y, tp_dispatch_coordinates->m_carrier_default_y_back, DISPATCH_DEFAULT_DIFFERENCE) )
  2703. {
  2704. m_dispatch_carrier_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_carrier_node.m_dispatch_control_status+2);
  2705. }
  2706. else
  2707. {
  2708. carrier_move_y(get_dispatch_control_command_key(m_dispatch_carrier_node), tp_main_carrier, tp_main_carrier_task, tp_dispatch_coordinates, tp_dispatch_coordinates->m_carrier_default_y_back);
  2709. m_dispatch_carrier_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_carrier_node.m_dispatch_control_status+1);
  2710. }
  2711. break;
  2712. }
  2713. case DISPATCH_CARRIER_STORE_7:
  2714. {
  2715. m_dispatch_carrier_node.m_error = check_task_status(m_dispatch_carrier_node.mp_main_carrier_task, m_dispatch_carrier_node.m_dispatch_control_status);
  2716. break;
  2717. }
  2718. case DISPATCH_CARRIER_STORE_8://让中跑车回到电梯井, 进行x轴路径检查
  2719. {
  2720. if ( tp_main_carrier->get_device_id() == 2 )
  2721. {
  2722. //3楼的搬运器直接到 入口旁边一个车位
  2723. m_dispatch_carrier_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status::DISPATCH_CARRIER_STORE_17);
  2724. }
  2725. else
  2726. {
  2727. //其他搬运器到2楼入口去接车
  2728. float t_z = tp_dispatch_coordinates->m_carrier_2th_floor_z;
  2729. if ( Common_data::approximate_difference(tp_main_carrier->m_actual_z, t_z, DISPATCH_DEFAULT_DIFFERENCE) )
  2730. {
  2731. //就在2楼, 那么准备同层移动到入口接车
  2732. m_dispatch_carrier_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status::DISPATCH_CARRIER_STORE_15);
  2733. }
  2734. else
  2735. {
  2736. //搬运器不在2楼或者3楼, 搬运器在4楼及以上, 那么直接返回电梯井即可.
  2737. m_dispatch_carrier_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_carrier_node.m_dispatch_control_status+1);
  2738. }
  2739. }
  2740. break;
  2741. }
  2742. case DISPATCH_CARRIER_STORE_9://让中跑车回到电梯井, x轴移动
  2743. {
  2744. if ( tp_main_carrier->get_device_id() == 0 )
  2745. {
  2746. carrier_move_x(get_dispatch_control_command_key(m_dispatch_carrier_node), tp_main_carrier, tp_main_carrier_task, tp_dispatch_coordinates, tp_dispatch_coordinates->m_carrier_default_x_left);
  2747. m_dispatch_carrier_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_carrier_node.m_dispatch_control_status+1);
  2748. }
  2749. else if ( tp_main_carrier->get_device_id() == 1 )
  2750. {
  2751. carrier_move_x(get_dispatch_control_command_key(m_dispatch_carrier_node), tp_main_carrier, tp_main_carrier_task, tp_dispatch_coordinates, tp_dispatch_coordinates->m_carrier_default_x_right);
  2752. m_dispatch_carrier_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_carrier_node.m_dispatch_control_status+1);
  2753. }
  2754. else
  2755. {
  2756. m_dispatch_carrier_node.m_dispatch_control_status = Dispatch_process::Dispatch_control_status::DISPATCH_CONTROL_FAULT;
  2757. m_dispatch_carrier_node.m_error = Error_manager(Error_code::CARRIER_CONRTOL_PARAMETER_ERROR, Error_level::MINOR_ERROR,
  2758. "DISPATCH_CARRIER_STORE_9 tp_main_carrier->get_device_id() PARAMRTER ERROR ");
  2759. }
  2760. break;
  2761. }
  2762. case DISPATCH_CARRIER_STORE_10://搬运器 释放空间锁
  2763. {
  2764. m_dispatch_carrier_node.m_error = check_task_status(m_dispatch_carrier_node.mp_main_carrier_task, m_dispatch_carrier_node.m_dispatch_control_status);
  2765. if ( m_dispatch_carrier_node.m_error == Error_code::SUCCESS )
  2766. {
  2767. m_dispatch_carrier_node.m_error = tp_dispatch_coordinates->carrier_space_unlock(tp_main_carrier->get_device_id());
  2768. }
  2769. break;
  2770. }
  2771. case DISPATCH_CARRIER_STORE_11://中跑车收回对接,之后中跑车固定在电梯上不能X轴移动,电梯可以Z轴移动
  2772. {
  2773. carrier_joint_x(get_dispatch_control_command_key(m_dispatch_carrier_node), tp_main_carrier, tp_main_carrier_task, tp_dispatch_coordinates, Carrier_task::Joint_motion::E_JOINT_TAKE_BACK);
  2774. m_dispatch_carrier_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_carrier_node.m_dispatch_control_status+1);
  2775. break;
  2776. }
  2777. case DISPATCH_CARRIER_STORE_12:
  2778. {
  2779. m_dispatch_carrier_node.m_error = check_task_status(m_dispatch_carrier_node.mp_main_carrier_task, m_dispatch_carrier_node.m_dispatch_control_status);
  2780. break;
  2781. }
  2782. case DISPATCH_CARRIER_STORE_13: //电梯移动到对应的楼层, 搬运器在电梯里面z轴移动, 不需要判断空间锁
  2783. {
  2784. //其他搬运器到2楼入口去接车
  2785. float t_z = tp_dispatch_coordinates->m_carrier_2th_floor_z;
  2786. carrier_move_z(get_dispatch_control_command_key(m_dispatch_carrier_node), tp_main_carrier, tp_main_carrier_task, tp_dispatch_coordinates, t_z);
  2787. m_dispatch_carrier_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_carrier_node.m_dispatch_control_status+1);
  2788. break;
  2789. }
  2790. case DISPATCH_CARRIER_STORE_14:
  2791. {
  2792. m_dispatch_carrier_node.m_error = check_task_status(m_dispatch_carrier_node.mp_main_carrier_task, m_dispatch_carrier_node.m_dispatch_control_status);
  2793. break;
  2794. }
  2795. case DISPATCH_CARRIER_STORE_15://伸出对接,之后中跑车可以x轴移动,电梯不能Z轴移动
  2796. {
  2797. if ( tp_main_carrier->m_actual_joint_motion_x1 == Dispatch_device_base::Joint_motion::E_JOINT_TAKE_BACK )
  2798. {
  2799. carrier_joint_x(get_dispatch_control_command_key(m_dispatch_carrier_node), tp_main_carrier, tp_main_carrier_task, tp_dispatch_coordinates, Carrier_task::Joint_motion::E_JOINT_HOLD_OUT);
  2800. m_dispatch_carrier_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_carrier_node.m_dispatch_control_status+1);
  2801. }
  2802. else
  2803. {
  2804. m_dispatch_carrier_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_carrier_node.m_dispatch_control_status+2);
  2805. }
  2806. break;
  2807. }
  2808. case DISPATCH_CARRIER_STORE_16:
  2809. {
  2810. m_dispatch_carrier_node.m_error = check_task_status(m_dispatch_carrier_node.mp_main_carrier_task, m_dispatch_carrier_node.m_dispatch_control_status);
  2811. break;
  2812. }
  2813. case DISPATCH_CARRIER_STORE_17://中跑车 x轴移动到入口, 进行x轴路径检查
  2814. {
  2815. //如果机器人已经把车抓起来了, 那么搬运器直接去入口接车即可
  2816. if ( m_dispatch_catcher_node.m_dispatch_control_status >= Dispatch_process::Dispatch_control_status::DISPATCH_CATCHER_STORE_25 )
  2817. {
  2818. // 搬运器直接去入口接车即可
  2819. m_dispatch_carrier_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status::DISPATCH_CARRIER_STORE_20);
  2820. }
  2821. if ( tp_main_carrier->get_device_id() == 2 )
  2822. {
  2823. if ( m_dispatch_catcher_node.m_dispatch_control_status >= Dispatch_process::Dispatch_control_status::DISPATCH_CATCHER_STORE_8 )
  2824. {
  2825. //3楼搬运器不用加锁, 直接去待机位即可
  2826. m_dispatch_carrier_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_carrier_node.m_dispatch_control_status+1);
  2827. break;//切换流程
  2828. }
  2829. //else 无限等待
  2830. }
  2831. else
  2832. {
  2833. //等待机器人升到三级任务, 搬运器移到待机位, (机器人到一楼抓车还需要一段时间.)
  2834. if ( m_dispatch_catcher_node.m_dispatch_control_status >= Dispatch_process::Dispatch_control_status::DISPATCH_CATCHER_STORE_16 )
  2835. {
  2836. float t_x = tp_dispatch_coordinates->m_carrier_coordinates_map[m_dispatch_source].x;
  2837. int t_terminal = m_dispatch_source - PASSAGEWAY_ID_BASE;
  2838. int t_temp = (t_terminal-1)%2;
  2839. int t_column = 4 + ((t_terminal-1)/2)*3 + t_temp*2 -1;
  2840. //注意了:待机点在入口旁边一个大车位, 空间锁判断时, 距离2个小车位即可.
  2841. int t_avoid_catcher_id = -1; //需要避让的机器人
  2842. if ( tp_main_carrier->get_device_id() == 0 )
  2843. {
  2844. m_dispatch_carrier_node.m_error = tp_dispatch_coordinates->carrier_try_space_lock(tp_main_carrier->m_actual_coordinates_rows, 0,
  2845. tp_main_carrier->m_actual_coordinates_rows, t_column-2,
  2846. tp_main_carrier->get_device_id(), t_avoid_catcher_id);
  2847. }
  2848. else if ( tp_main_carrier->get_device_id() == 1 )
  2849. {
  2850. m_dispatch_carrier_node.m_error = tp_dispatch_coordinates->carrier_try_space_lock(tp_main_carrier->m_actual_coordinates_rows, t_column+2,
  2851. tp_main_carrier->m_actual_coordinates_rows, tp_dispatch_coordinates->m_space_lock_columns-1,
  2852. tp_main_carrier->get_device_id(), t_avoid_catcher_id);
  2853. }
  2854. else if ( tp_main_carrier->get_device_id() == 2 )
  2855. {
  2856. //3楼搬运器不用加锁, 直接去待机位即可
  2857. m_dispatch_carrier_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_carrier_node.m_dispatch_control_status+1);
  2858. break;//切换流程
  2859. }
  2860. else
  2861. {
  2862. m_dispatch_carrier_node.m_dispatch_control_status = Dispatch_process::Dispatch_control_status::DISPATCH_CONTROL_FAULT;
  2863. m_dispatch_carrier_node.m_error = Error_manager(Error_code::CARRIER_CONRTOL_PARAMETER_ERROR, Error_level::MINOR_ERROR,
  2864. "DISPATCH_CARRIER_STORE_17 tp_main_carrier->get_device_id() and m_parkspace_information_optimal.parkingspace_index_id PARAMRTER ERROR ");
  2865. break;//切换流程
  2866. }
  2867. //判断结果
  2868. if ( m_dispatch_carrier_node.m_error == Error_code::SUCCESS )
  2869. {
  2870. //左右搬运器加锁成功, 直接x轴移动到待机位
  2871. m_dispatch_carrier_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_carrier_node.m_dispatch_control_status+1);
  2872. }
  2873. //else 在电梯井 无限等待
  2874. }
  2875. //else 在电梯井 无限等待
  2876. }
  2877. break;
  2878. }
  2879. case DISPATCH_CARRIER_STORE_18://中跑车 x轴移动, 移动到待机位, (待机点在入口旁边一个大车位)
  2880. {
  2881. //3楼搬运器跟随, 到机器人旁边一个车位
  2882. float t_x = tp_dispatch_coordinates->m_carrier_coordinates_map[m_dispatch_source].x;
  2883. float t_following_x = 0;
  2884. //3楼搬运器特殊处理,
  2885. // 注意了: 机器人必须等待3楼搬运器执行完这一步后, 才能到一楼抓车
  2886. if ( tp_main_carrier->get_device_id() == 2 )
  2887. {
  2888. if ( m_dispatch_catcher_node.m_dispatch_control_status >= Dispatch_process::Dispatch_control_status::DISPATCH_CATCHER_STORE_13 )
  2889. {
  2890. if ( m_dispatch_source == 1101 )
  2891. {
  2892. t_following_x = tp_dispatch_coordinates->m_carrier_coordinates_map[1102].x;
  2893. }
  2894. else if ( m_dispatch_source == 1106 )
  2895. {
  2896. t_following_x = tp_dispatch_coordinates->m_carrier_coordinates_map[1105].x;
  2897. }
  2898. else if ( tp_main_carrier->m_actual_x < t_x)
  2899. {
  2900. t_following_x = tp_dispatch_coordinates->m_carrier_coordinates_map[m_dispatch_source-1].x;
  2901. }
  2902. else
  2903. {
  2904. t_following_x = tp_dispatch_coordinates->m_carrier_coordinates_map[m_dispatch_source+1].x;
  2905. }
  2906. }
  2907. else //无限等待
  2908. {
  2909. break;
  2910. }
  2911. }
  2912. else if ( tp_main_carrier->get_device_id() == 0 )
  2913. {
  2914. t_following_x = tp_dispatch_coordinates->m_carrier_coordinates_map[m_dispatch_source].x - tp_dispatch_coordinates->m_separated_distance_x;
  2915. }
  2916. else if ( tp_main_carrier->get_device_id() == 1 )
  2917. {
  2918. t_following_x = tp_dispatch_coordinates->m_carrier_coordinates_map[m_dispatch_source].x + tp_dispatch_coordinates->m_separated_distance_x;
  2919. }
  2920. else
  2921. {
  2922. m_dispatch_carrier_node.m_dispatch_control_status = Dispatch_process::Dispatch_control_status::DISPATCH_CONTROL_FAULT;
  2923. m_dispatch_carrier_node.m_error = Error_manager(Error_code::CARRIER_CONRTOL_PARAMETER_ERROR, Error_level::MINOR_ERROR,
  2924. "DISPATCH_CARRIER_STORE_18 tp_main_carrier->get_device_id() and m_parkspace_information_optimal.parkingspace_index_id PARAMRTER ERROR ");
  2925. break;//切换流程
  2926. }
  2927. carrier_move_x(get_dispatch_control_command_key(m_dispatch_carrier_node), tp_main_carrier, tp_main_carrier_task, tp_dispatch_coordinates, t_following_x);
  2928. m_dispatch_carrier_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_carrier_node.m_dispatch_control_status+1);
  2929. break;
  2930. }
  2931. case DISPATCH_CARRIER_STORE_19:
  2932. {
  2933. m_dispatch_carrier_node.m_error = check_task_status(m_dispatch_carrier_node.mp_main_carrier_task, m_dispatch_carrier_node.m_dispatch_control_status);
  2934. break;
  2935. }
  2936. case DISPATCH_CARRIER_STORE_20://搬运器 准备接车之前, 等待机器人就位, 然后把一级任务升到三级
  2937. {
  2938. //等待机器人把车抓起来, 如果机器人已经把车抓起来了, 那么搬运器把一级任务升到三级
  2939. if ( m_dispatch_catcher_node.m_dispatch_control_status >= Dispatch_process::Dispatch_control_status::DISPATCH_CATCHER_STORE_25 )
  2940. {
  2941. m_dispatch_carrier_node.m_error = m_dispatch_carrier_node.mp_main_carrier->change_task_level(Dispatch_device_base::Dispatch_task_level::DISPATCH_TASK_ONE_LEVEL, Dispatch_device_base::Dispatch_task_level::DISPATCH_TASK_THREE_LEVEL);
  2942. if ( m_dispatch_carrier_node.m_error == Error_code::SUCCESS )
  2943. {
  2944. m_dispatch_carrier_node.m_main_carrier_task_level = Dispatch_device_base::Dispatch_task_level::DISPATCH_TASK_THREE_LEVEL;
  2945. m_dispatch_carrier_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_carrier_node.m_dispatch_control_status+1);
  2946. }
  2947. else
  2948. {
  2949. m_dispatch_carrier_node.m_dispatch_control_status = Dispatch_process::Dispatch_control_status::DISPATCH_CONTROL_FAULT;
  2950. }
  2951. }
  2952. //else 无限等待
  2953. break;
  2954. }
  2955. case DISPATCH_CARRIER_STORE_21://搬运器移到入口接车, 对路径强制加锁, (机器人已经加空间锁了)
  2956. {
  2957. //2楼交接的空间已经由机器人加锁, 搬运器移到入口接车就不判断了, 强制加锁即可.
  2958. if ( tp_main_carrier->get_device_id() == 0 )
  2959. {
  2960. int t_terminal = m_dispatch_source - 1100;
  2961. int temp = (t_terminal-1)%2;
  2962. int t_column = 4 + ((t_terminal-1)/2)*3 + temp*2 -1;
  2963. m_dispatch_carrier_node.m_error = tp_dispatch_coordinates->carrier_force_space_lock(0, 0,
  2964. 0, t_column+1,
  2965. tp_main_carrier->get_device_id());
  2966. }
  2967. else if ( tp_main_carrier->get_device_id() == 1 )
  2968. {
  2969. int t_terminal = m_dispatch_source - 1100;
  2970. int temp = (t_terminal-1)%2;
  2971. int t_column = 4 + ((t_terminal-1)/2)*3 + temp*2 -1;
  2972. m_dispatch_carrier_node.m_error = tp_dispatch_coordinates->carrier_force_space_lock(0, t_column-1,
  2973. 0, tp_dispatch_coordinates->m_space_lock_columns-1,
  2974. tp_main_carrier->get_device_id());
  2975. }
  2976. //去3楼取车不用加锁
  2977. m_dispatch_carrier_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_carrier_node.m_dispatch_control_status+1);
  2978. break;
  2979. }
  2980. case DISPATCH_CARRIER_STORE_22://中跑车 x轴移动, 移动到存车入口上方准备接车
  2981. {
  2982. //注意了: 3楼搬运器在停车位交接, 2楼搬运器在入口上方交接
  2983. float t_x = 0;
  2984. if ( tp_main_carrier->get_device_id() == 2 )
  2985. {
  2986. //3楼搬运器 最好和机器人一起运动
  2987. if ( m_dispatch_catcher_node.m_dispatch_control_status >= Dispatch_process::Dispatch_control_status::DISPATCH_CATCHER_STORE_26 )
  2988. {
  2989. //need program , 这里设计到机器人和3楼搬运器的同步问题, 以后在写
  2990. t_x = tp_dispatch_coordinates->m_carrier_coordinates_map[m_parkspace_information_optimal.parkingspace_index_id].x;
  2991. carrier_move_x(get_dispatch_control_command_key(m_dispatch_carrier_node), tp_main_carrier, tp_main_carrier_task, tp_dispatch_coordinates, t_x);
  2992. m_dispatch_carrier_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_carrier_node.m_dispatch_control_status+1);
  2993. }
  2994. //else 无限等待
  2995. }
  2996. else
  2997. {
  2998. t_x = tp_dispatch_coordinates->m_carrier_coordinates_map[m_dispatch_source].x;
  2999. carrier_move_x(get_dispatch_control_command_key(m_dispatch_carrier_node), tp_main_carrier, tp_main_carrier_task, tp_dispatch_coordinates, t_x);
  3000. m_dispatch_carrier_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_carrier_node.m_dispatch_control_status+1);
  3001. }
  3002. break;
  3003. }
  3004. case DISPATCH_CARRIER_STORE_23:
  3005. {
  3006. m_dispatch_carrier_node.m_error = check_task_status(m_dispatch_carrier_node.mp_main_carrier_task, m_dispatch_carrier_node.m_dispatch_control_status);
  3007. break;
  3008. }
  3009. case DISPATCH_CARRIER_STORE_24://检查汽车交接//修正轴距
  3010. {
  3011. //检查姿态(注注注注注意了, 调试阶段是无车, 真实环境是有车的)
  3012. if ( tp_main_carrier->m_actual_load_status == Dispatch_device_base::Load_status::NO_CAR &&
  3013. tp_main_carrier->m_actual_clamp_motion1 == Dispatch_device_base::Clamp_motion::E_CLAMP_LOOSE)
  3014. {
  3015. float temp_wheel_base = tp_main_carrier->m_actual_y1 - tp_main_carrier->m_actual_y2;
  3016. if ( Common_data::approximate_difference(m_wheel_base, temp_wheel_base, DISPATCH_DEFAULT_DIFFERENCE) )
  3017. {
  3018. m_dispatch_carrier_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_carrier_node.m_dispatch_control_status+2);
  3019. }
  3020. else
  3021. {
  3022. carrier_adjust_wheel_base(get_dispatch_control_command_key(m_dispatch_carrier_node), tp_main_carrier, tp_main_carrier_task, tp_dispatch_coordinates);
  3023. m_dispatch_carrier_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_carrier_node.m_dispatch_control_status+1);
  3024. }
  3025. }
  3026. else
  3027. {
  3028. return Error_manager(Error_code::CARRIER_POSE_ERROR, Error_level::MINOR_ERROR,
  3029. "DISPATCH_CARRIER_STORE_24 Dispatch_process:: tp_main_carrier->m_actual_load_status() fun error ");
  3030. }
  3031. break;
  3032. }
  3033. case DISPATCH_CARRIER_STORE_25:
  3034. {
  3035. m_dispatch_carrier_node.m_error = check_task_status(m_dispatch_carrier_node.mp_main_carrier_task, m_dispatch_carrier_node.m_dispatch_control_status);
  3036. break;
  3037. }
  3038. case DISPATCH_CARRIER_STORE_26://让小跑车 夹车
  3039. {
  3040. //等待机器人把车放到搬运器上面
  3041. if (m_dispatch_catcher_node.m_dispatch_control_status >= DISPATCH_CATCHER_STORE_34)
  3042. {
  3043. carrier_move_c(get_dispatch_control_command_key(m_dispatch_carrier_node), tp_main_carrier, tp_main_carrier_task, tp_dispatch_coordinates, Carrier_task::Clamp_motion::E_CLAMP_TIGHT);
  3044. m_dispatch_carrier_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_carrier_node.m_dispatch_control_status+1);
  3045. }
  3046. //else 无限等待
  3047. break;
  3048. }
  3049. case DISPATCH_CARRIER_STORE_27:
  3050. {
  3051. m_dispatch_carrier_node.m_error = check_task_status(m_dispatch_carrier_node.mp_main_carrier_task, m_dispatch_carrier_node.m_dispatch_control_status);
  3052. break;
  3053. }
  3054. case DISPATCH_CARRIER_STORE_28://让中跑车回到电梯井
  3055. {
  3056. //等待机器人离开
  3057. if (m_dispatch_catcher_node.m_dispatch_control_status >= DISPATCH_CATCHER_STORE_38)
  3058. {
  3059. //判断z轴 是否同层
  3060. float t_z = tp_dispatch_coordinates->m_carrier_coordinates_map[m_parkspace_information_optimal.parkingspace_index_id].z;
  3061. if ( Common_data::approximate_difference(tp_main_carrier->m_actual_z, t_z, DISPATCH_DEFAULT_DIFFERENCE) )
  3062. {
  3063. //存车到2楼或3楼, 那么直接去停车位
  3064. m_dispatch_carrier_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status::DISPATCH_CARRIER_STORE_36);
  3065. }
  3066. else
  3067. {
  3068. if ( tp_main_carrier->get_device_id() == 0 )
  3069. {
  3070. carrier_move_x(get_dispatch_control_command_key(m_dispatch_carrier_node), tp_main_carrier, tp_main_carrier_task, tp_dispatch_coordinates, tp_dispatch_coordinates->m_carrier_default_x_left);
  3071. m_dispatch_carrier_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_carrier_node.m_dispatch_control_status+1);
  3072. }
  3073. else if ( tp_main_carrier->get_device_id() == 1 )
  3074. {
  3075. carrier_move_x(get_dispatch_control_command_key(m_dispatch_carrier_node), tp_main_carrier, tp_main_carrier_task, tp_dispatch_coordinates, tp_dispatch_coordinates->m_carrier_default_x_right);
  3076. m_dispatch_carrier_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_carrier_node.m_dispatch_control_status+1);
  3077. }
  3078. else
  3079. {
  3080. m_dispatch_carrier_node.m_dispatch_control_status = Dispatch_process::Dispatch_control_status::DISPATCH_CONTROL_FAULT;
  3081. m_dispatch_carrier_node.m_error = Error_manager(Error_code::CARRIER_CONRTOL_PARAMETER_ERROR, Error_level::MINOR_ERROR,
  3082. "DISPATCH_CARRIER_STORE_28 tp_main_carrier->get_device_id() PARAMRTER ERROR ");
  3083. }
  3084. }
  3085. }
  3086. //else 无限等待
  3087. break;
  3088. }
  3089. case DISPATCH_CARRIER_STORE_29://搬运器 释放空间锁
  3090. {
  3091. m_dispatch_carrier_node.m_error = check_task_status(m_dispatch_carrier_node.mp_main_carrier_task, m_dispatch_carrier_node.m_dispatch_control_status);
  3092. if ( m_dispatch_carrier_node.m_error == Error_code::SUCCESS )
  3093. {
  3094. m_dispatch_carrier_node.m_error = tp_dispatch_coordinates->carrier_space_unlock(tp_main_carrier->get_device_id());
  3095. }
  3096. break;
  3097. }
  3098. case DISPATCH_CARRIER_STORE_30://中跑车收回对接,之后中跑车固定在电梯上不能X轴移动,电梯可以Z轴移动
  3099. {
  3100. carrier_joint_x(get_dispatch_control_command_key(m_dispatch_carrier_node), tp_main_carrier, tp_main_carrier_task, tp_dispatch_coordinates, Carrier_task::Joint_motion::E_JOINT_TAKE_BACK);
  3101. m_dispatch_carrier_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_carrier_node.m_dispatch_control_status+1);
  3102. break;
  3103. }
  3104. case DISPATCH_CARRIER_STORE_31:
  3105. {
  3106. m_dispatch_carrier_node.m_error = check_task_status(m_dispatch_carrier_node.mp_main_carrier_task, m_dispatch_carrier_node.m_dispatch_control_status);
  3107. break;
  3108. }
  3109. case DISPATCH_CARRIER_STORE_32: //电梯移动到对应的楼层, 搬运器在电梯里面z轴移动, 不需要判断空间锁
  3110. {
  3111. float t_z = tp_dispatch_coordinates->m_carrier_coordinates_map[m_parkspace_information_optimal.parkingspace_index_id].z;
  3112. carrier_move_z(get_dispatch_control_command_key(m_dispatch_carrier_node), tp_main_carrier, tp_main_carrier_task, tp_dispatch_coordinates, t_z);
  3113. m_dispatch_carrier_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_carrier_node.m_dispatch_control_status+1);
  3114. break;
  3115. }
  3116. case DISPATCH_CARRIER_STORE_33:
  3117. {
  3118. m_dispatch_carrier_node.m_error = check_task_status(m_dispatch_carrier_node.mp_main_carrier_task, m_dispatch_carrier_node.m_dispatch_control_status);
  3119. break;
  3120. }
  3121. case DISPATCH_CARRIER_STORE_34://伸出对接,之后中跑车可以x轴移动,电梯不能Z轴移动
  3122. {
  3123. if ( tp_main_carrier->m_actual_joint_motion_x1 == Dispatch_device_base::Joint_motion::E_JOINT_TAKE_BACK )
  3124. {
  3125. carrier_joint_x(get_dispatch_control_command_key(m_dispatch_carrier_node), tp_main_carrier, tp_main_carrier_task, tp_dispatch_coordinates, Carrier_task::Joint_motion::E_JOINT_HOLD_OUT);
  3126. m_dispatch_carrier_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_carrier_node.m_dispatch_control_status+1);
  3127. }
  3128. else
  3129. {
  3130. m_dispatch_carrier_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_carrier_node.m_dispatch_control_status+2);
  3131. }
  3132. break;
  3133. }
  3134. case DISPATCH_CARRIER_STORE_35:
  3135. {
  3136. m_dispatch_carrier_node.m_error = check_task_status(m_dispatch_carrier_node.mp_main_carrier_task, m_dispatch_carrier_node.m_dispatch_control_status);
  3137. break;
  3138. }
  3139. case DISPATCH_CARRIER_STORE_36://中跑车 x轴移动到车位, 进行x轴路径检查
  3140. {
  3141. float t_x = tp_dispatch_coordinates->m_carrier_coordinates_map[m_parkspace_information_optimal.parkingspace_index_id].x;
  3142. int t_column = (m_parkspace_information_optimal.parkingspace_index_id-1) % tp_dispatch_coordinates->m_space_lock_columns;
  3143. if ( Common_data::approximate_difference(tp_main_carrier->m_actual_x, t_x, DISPATCH_DEFAULT_DIFFERENCE) )
  3144. {
  3145. //搬运器不用x轴运动, 直接去车位存车, (注:3楼的搬运器已经提前去停车位了, x值一定相同)
  3146. m_dispatch_carrier_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status::DISPATCH_CARRIER_STORE_44);
  3147. }
  3148. else
  3149. {
  3150. int t_avoid_catcher_id = -1; //需要避让的机器人
  3151. if ( tp_main_carrier->get_device_id() == 0 && t_column <13-1)
  3152. {
  3153. m_dispatch_carrier_node.m_error = tp_dispatch_coordinates->carrier_try_space_lock(tp_main_carrier->m_actual_coordinates_rows, 0,
  3154. tp_main_carrier->m_actual_coordinates_rows, t_column+1,
  3155. tp_main_carrier->get_device_id(), t_avoid_catcher_id);
  3156. }
  3157. else if ( tp_main_carrier->get_device_id() == 1 && t_column >3-1)
  3158. {
  3159. m_dispatch_carrier_node.m_error = tp_dispatch_coordinates->carrier_try_space_lock(tp_main_carrier->m_actual_coordinates_rows, t_column-1,
  3160. tp_main_carrier->m_actual_coordinates_rows, tp_dispatch_coordinates->m_space_lock_columns-1,
  3161. tp_main_carrier->get_device_id(), t_avoid_catcher_id);
  3162. }
  3163. else
  3164. {
  3165. m_dispatch_carrier_node.m_dispatch_control_status = Dispatch_process::Dispatch_control_status::DISPATCH_CONTROL_FAULT;
  3166. m_dispatch_carrier_node.m_error = Error_manager(Error_code::CARRIER_CONRTOL_PARAMETER_ERROR, Error_level::MINOR_ERROR,
  3167. "DISPATCH_CARRIER_STORE_36 tp_main_carrier->get_device_id() and m_parkspace_information_optimal.parkingspace_index_id PARAMRTER ERROR ");
  3168. break;//切换流程
  3169. }
  3170. //判断结果
  3171. if ( m_dispatch_carrier_node.m_error == Error_code::SUCCESS )
  3172. {
  3173. //左右搬运器加锁成功, 直接x轴移动
  3174. m_dispatch_carrier_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status::DISPATCH_CARRIER_STORE_42);
  3175. }
  3176. else if(t_avoid_catcher_id != -1 &&
  3177. (tp_main_carrier->m_actual_coordinates_rows == 2 || tp_main_carrier->m_actual_coordinates_rows == 1))//4楼取车, 机器人进行避让
  3178. {
  3179. if ( m_dispatch_carrier_node.mp_avoid_catcher.get() == NULL )
  3180. {
  3181. m_dispatch_carrier_node.mp_avoid_catcher = Dispatch_manager::get_instance_references().m_catcher_map[t_avoid_catcher_id];
  3182. }
  3183. if ( m_dispatch_carrier_node.mp_avoid_carrier.get() == NULL )
  3184. {
  3185. m_dispatch_carrier_node.mp_avoid_carrier = Dispatch_manager::get_instance_references().m_carrier_map[2];
  3186. }
  3187. //连接4楼机器人和3楼搬运器
  3188. Error_manager t_catcher_error;
  3189. Error_manager t_carrier_error;
  3190. if ( m_dispatch_carrier_node.mp_avoid_catcher_task.get() == NULL && m_dispatch_carrier_node.mp_avoid_carrier_task.get() == NULL)
  3191. {
  3192. //连接避让设备 使得避让机器人进行避让
  3193. t_catcher_error = m_dispatch_carrier_node.mp_avoid_catcher->check_task_level(Dispatch_device_base::Dispatch_task_level::DISPATCH_TASK_TWO_LEVEL);
  3194. t_carrier_error = m_dispatch_carrier_node.mp_avoid_carrier->check_task_level(Dispatch_device_base::Dispatch_task_level::DISPATCH_TASK_TWO_LEVEL);
  3195. if ( t_catcher_error == Error_code::SUCCESS && t_carrier_error == Error_code::SUCCESS)
  3196. {
  3197. t_catcher_error = connect_dispatch_catcher(m_dispatch_carrier_node.mp_avoid_catcher, m_dispatch_carrier_node.mp_avoid_catcher_task, Dispatch_device_base::Dispatch_task_level::DISPATCH_TASK_TWO_LEVEL);
  3198. if ( t_catcher_error == Error_code::SUCCESS )
  3199. {
  3200. t_carrier_error = connect_dispatch_carrier(m_dispatch_carrier_node.mp_avoid_carrier, m_dispatch_carrier_node.mp_avoid_carrier_task, Dispatch_device_base::Dispatch_task_level::DISPATCH_TASK_TWO_LEVEL);
  3201. if ( t_carrier_error == Error_code::SUCCESS )
  3202. {
  3203. m_dispatch_carrier_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_carrier_node.m_dispatch_control_status+1);
  3204. }
  3205. else
  3206. {
  3207. m_dispatch_carrier_node.m_dispatch_control_status = Dispatch_process::Dispatch_control_status::DISPATCH_CONTROL_FAULT;
  3208. m_dispatch_carrier_node.m_error = Error_manager(Error_code::CARRIER_CONRTOL_PARAMETER_ERROR, Error_level::MINOR_ERROR,
  3209. "DISPATCH_CARRIER_STORE_36 connect_dispatch_carrier ERROR ");
  3210. break;//切换流程
  3211. }
  3212. }
  3213. }
  3214. //else 抓取器的资源自由争抢, 如果没有抢到, 那么重复连接
  3215. }
  3216. else if ( m_dispatch_carrier_node.mp_avoid_catcher_task.get() != NULL && m_dispatch_carrier_node.mp_avoid_carrier_task.get() != NULL )
  3217. {
  3218. m_dispatch_carrier_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_carrier_node.m_dispatch_control_status+2);
  3219. }
  3220. else
  3221. {
  3222. m_dispatch_carrier_node.m_dispatch_control_status = Dispatch_process::Dispatch_control_status::DISPATCH_CONTROL_FAULT;
  3223. m_dispatch_carrier_node.m_error = Error_manager(Error_code::CARRIER_CONRTOL_PARAMETER_ERROR, Error_level::MINOR_ERROR,
  3224. "DISPATCH_CARRIER_STORE_36 m_dispatch_carrier_node.mp_avoid_catcher_task.get() m_dispatch_carrier_node.mp_avoid_carrier_task.get() ERROR ");
  3225. break;//切换流程
  3226. }
  3227. }
  3228. //else 无限等待
  3229. }
  3230. break;
  3231. }
  3232. case DISPATCH_CARRIER_STORE_37:
  3233. {
  3234. m_dispatch_carrier_node.m_error = check_task_status(m_dispatch_carrier_node.mp_avoid_catcher_task, m_dispatch_carrier_node.m_dispatch_control_status);
  3235. break;
  3236. }
  3237. case DISPATCH_CARRIER_STORE_38://让4楼机器人进行避让, 先加锁, 在避让
  3238. {
  3239. //机器人避让距离, 4楼避让4个车位, 3楼避让2个车位
  3240. int m_avoid_distance = 0;
  3241. int t_row = (m_parkspace_information_optimal.parkingspace_index_id-1) / tp_dispatch_coordinates->m_space_lock_columns;
  3242. if ( t_row == 1 )
  3243. {
  3244. m_avoid_distance = 3;
  3245. }
  3246. else
  3247. {
  3248. m_avoid_distance = 3;
  3249. }
  3250. int t_column = (m_parkspace_information_optimal.parkingspace_index_id-1) % tp_dispatch_coordinates->m_space_lock_columns;
  3251. //4楼搬运器需要避让4个车位
  3252. if ( tp_main_carrier->get_device_id() == 0 && tp_avoid_catcher->m_actual_coordinates_columns < t_column+m_avoid_distance )
  3253. {
  3254. m_dispatch_carrier_node.m_error = tp_dispatch_coordinates->catcher_try_space_lock(1, tp_avoid_catcher->m_actual_coordinates_columns,
  3255. 2, t_column+m_avoid_distance+1,
  3256. tp_avoid_catcher->get_device_id());
  3257. //判断结果
  3258. if ( m_dispatch_carrier_node.m_error == Error_code::SUCCESS )
  3259. {
  3260. //机器人移到42号口
  3261. float t_x = tp_dispatch_coordinates->m_carrier_coordinates_map[m_parkspace_information_optimal.parkingspace_index_id+m_avoid_distance].x;
  3262. catcher_move_x(get_dispatch_control_command_key(m_dispatch_carrier_node), tp_avoid_catcher, tp_avoid_catcher_task, tp_dispatch_coordinates, t_x);
  3263. carrier_move_x(get_dispatch_control_command_key(m_dispatch_carrier_node), tp_avoid_carrier, tp_avoid_carrier_task, tp_dispatch_coordinates, t_x);
  3264. m_dispatch_carrier_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_carrier_node.m_dispatch_control_status+1);
  3265. }
  3266. //else 无限等待
  3267. }
  3268. else if ( tp_main_carrier->get_device_id() == 1 && tp_avoid_catcher->m_actual_coordinates_columns > t_column-m_avoid_distance)
  3269. {
  3270. m_dispatch_carrier_node.m_error = tp_dispatch_coordinates->catcher_try_space_lock(1, t_column-m_avoid_distance-1,
  3271. 2, tp_avoid_catcher->m_actual_coordinates_columns,
  3272. tp_avoid_catcher->get_device_id());
  3273. //判断结果
  3274. if ( m_dispatch_carrier_node.m_error == Error_code::SUCCESS )
  3275. {
  3276. //机器人移到34号口
  3277. float t_x = tp_dispatch_coordinates->m_carrier_coordinates_map[m_parkspace_information_optimal.parkingspace_index_id-m_avoid_distance].x;
  3278. catcher_move_x(get_dispatch_control_command_key(m_dispatch_carrier_node), tp_avoid_catcher, tp_avoid_catcher_task, tp_dispatch_coordinates, t_x);
  3279. carrier_move_x(get_dispatch_control_command_key(m_dispatch_carrier_node), tp_avoid_carrier, tp_avoid_carrier_task, tp_dispatch_coordinates, t_x);
  3280. m_dispatch_carrier_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_carrier_node.m_dispatch_control_status+1);
  3281. }
  3282. //else 无限等待
  3283. }
  3284. else
  3285. {
  3286. m_dispatch_carrier_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_carrier_node.m_dispatch_control_status+1);
  3287. }
  3288. break;
  3289. }
  3290. case DISPATCH_CARRIER_STORE_39://机器人释放 空间锁
  3291. {
  3292. m_dispatch_carrier_node.m_error = check_task_status(m_dispatch_carrier_node.mp_avoid_catcher_task);
  3293. m_dispatch_carrier_node.m_error.compare_and_cover_error(check_task_status(m_dispatch_carrier_node.mp_avoid_carrier_task));
  3294. if ( m_dispatch_carrier_node.m_error == Error_code::SUCCESS )
  3295. {
  3296. tp_dispatch_coordinates->catcher_space_unlock(tp_avoid_catcher->m_actual_coordinates_id, tp_avoid_catcher->get_device_id());
  3297. m_dispatch_carrier_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_carrier_node.m_dispatch_control_status+1);
  3298. }
  3299. break;
  3300. }
  3301. case DISPATCH_CARRIER_STORE_40://搬运器空间锁判断, 必须成功
  3302. {
  3303. int t_column = (m_parkspace_information_optimal.parkingspace_index_id-1) % tp_dispatch_coordinates->m_space_lock_columns;
  3304. int t_avoid_catcher_id = -1; //需要避让的机器人
  3305. if ( tp_main_carrier->get_device_id() == 0 && t_column <13-1)
  3306. {
  3307. m_dispatch_carrier_node.m_error = tp_dispatch_coordinates->carrier_try_space_lock(tp_main_carrier->m_actual_coordinates_rows, 0,
  3308. tp_main_carrier->m_actual_coordinates_rows, t_column+1,
  3309. tp_main_carrier->get_device_id(), t_avoid_catcher_id);
  3310. }
  3311. else if ( tp_main_carrier->get_device_id() == 1 && t_column >3-1)
  3312. {
  3313. m_dispatch_carrier_node.m_error = tp_dispatch_coordinates->carrier_try_space_lock(tp_main_carrier->m_actual_coordinates_rows, t_column-1,
  3314. tp_main_carrier->m_actual_coordinates_rows, tp_dispatch_coordinates->m_space_lock_columns-1,
  3315. tp_main_carrier->get_device_id(), t_avoid_catcher_id);
  3316. }
  3317. //判断结果
  3318. if ( m_dispatch_carrier_node.m_error == Error_code::SUCCESS )
  3319. {
  3320. m_dispatch_carrier_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_carrier_node.m_dispatch_control_status+1);
  3321. }
  3322. else
  3323. {
  3324. m_dispatch_carrier_node.m_dispatch_control_status = Dispatch_process::Dispatch_control_status::DISPATCH_CONTROL_FAULT;
  3325. }
  3326. break;
  3327. }
  3328. case DISPATCH_CARRIER_STORE_41://避让机器人 断连
  3329. {
  3330. if ( m_dispatch_carrier_node.mp_avoid_catcher.get() != NULL && m_dispatch_carrier_node.mp_avoid_catcher_task.get() != NULL )
  3331. {
  3332. //避让机器人 断开连接
  3333. disconnect_dispatch_device(m_dispatch_carrier_node.mp_avoid_catcher, m_dispatch_carrier_node.mp_avoid_catcher_task);
  3334. }
  3335. if ( m_dispatch_carrier_node.mp_avoid_carrier.get() != NULL && m_dispatch_carrier_node.mp_avoid_carrier_task.get() != NULL )
  3336. {
  3337. //避让机器人 断开连接
  3338. disconnect_dispatch_device(m_dispatch_carrier_node.mp_avoid_carrier, m_dispatch_carrier_node.mp_avoid_carrier_task);
  3339. }
  3340. m_dispatch_carrier_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_carrier_node.m_dispatch_control_status+1);
  3341. break;
  3342. }
  3343. case DISPATCH_CARRIER_STORE_42://搬运器x轴移动到车位
  3344. {
  3345. float t_x = tp_dispatch_coordinates->m_carrier_coordinates_map[m_parkspace_information_optimal.parkingspace_index_id].x;
  3346. carrier_move_x(get_dispatch_control_command_key(m_dispatch_carrier_node), tp_main_carrier, tp_main_carrier_task, tp_dispatch_coordinates, t_x);
  3347. m_dispatch_carrier_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_carrier_node.m_dispatch_control_status+1);
  3348. break;
  3349. }
  3350. case DISPATCH_CARRIER_STORE_43:
  3351. {
  3352. m_dispatch_carrier_node.m_error = check_task_status(m_dispatch_carrier_node.mp_main_carrier_task, m_dispatch_carrier_node.m_dispatch_control_status);
  3353. break;
  3354. }
  3355. case DISPATCH_CARRIER_STORE_44://小跑车 进入车位
  3356. {
  3357. carrier_move_y(get_dispatch_control_command_key(m_dispatch_carrier_node), tp_main_carrier, tp_main_carrier_task, tp_dispatch_coordinates, tp_dispatch_coordinates->m_carrier_default_y_leave);
  3358. m_dispatch_carrier_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_carrier_node.m_dispatch_control_status+1);
  3359. break;
  3360. }
  3361. case DISPATCH_CARRIER_STORE_45:
  3362. {
  3363. m_dispatch_carrier_node.m_error = check_task_status(m_dispatch_carrier_node.mp_main_carrier_task, m_dispatch_carrier_node.m_dispatch_control_status);
  3364. break;
  3365. }
  3366. case DISPATCH_CARRIER_STORE_46://小跑车 松开
  3367. {
  3368. carrier_move_c(get_dispatch_control_command_key(m_dispatch_carrier_node), tp_main_carrier, tp_main_carrier_task, tp_dispatch_coordinates, Carrier_task::Clamp_motion::E_CLAMP_LOOSE);
  3369. m_dispatch_carrier_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_carrier_node.m_dispatch_control_status+1);
  3370. break;
  3371. }
  3372. case DISPATCH_CARRIER_STORE_47:
  3373. {
  3374. m_dispatch_carrier_node.m_error = check_task_status(m_dispatch_carrier_node.mp_main_carrier_task, m_dispatch_carrier_node.m_dispatch_control_status);
  3375. break;
  3376. }
  3377. case DISPATCH_CARRIER_STORE_48://小跑车 回到中跑车
  3378. {
  3379. carrier_move_y(get_dispatch_control_command_key(m_dispatch_carrier_node), tp_main_carrier, tp_main_carrier_task, tp_dispatch_coordinates, tp_dispatch_coordinates->m_carrier_default_y_back);
  3380. m_dispatch_carrier_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_carrier_node.m_dispatch_control_status+1);
  3381. break;
  3382. }
  3383. case DISPATCH_CARRIER_STORE_49:
  3384. {
  3385. m_dispatch_carrier_node.m_error = check_task_status(m_dispatch_carrier_node.mp_main_carrier_task, m_dispatch_carrier_node.m_dispatch_control_status);
  3386. break;
  3387. }
  3388. case DISPATCH_CARRIER_STORE_50://让中跑车回到电梯井
  3389. {
  3390. if ( tp_main_carrier->get_device_id() == 2 )
  3391. {
  3392. //3楼的流程 到此结束了
  3393. m_dispatch_carrier_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status::DISPATCH_CARRIER_STORE_54);
  3394. }
  3395. //如果后面有一级存车任务, 那么就跳过, 否则让中跑车回到电梯井
  3396. else if ( tp_main_carrier->is_has_appoint_task(Dispatch_device_base::Dispatch_task_level::DISPATCH_TASK_ONE_LEVEL) ||
  3397. tp_main_carrier->is_has_appoint_task(Dispatch_device_base::Dispatch_task_level::DISPATCH_TASK_TWO_LEVEL))
  3398. {
  3399. m_dispatch_carrier_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status::DISPATCH_CARRIER_STORE_54);
  3400. }
  3401. else
  3402. {
  3403. if ( tp_main_carrier->get_device_id() == 0 )
  3404. {
  3405. carrier_move_x(get_dispatch_control_command_key(m_dispatch_carrier_node), tp_main_carrier, tp_main_carrier_task, tp_dispatch_coordinates, tp_dispatch_coordinates->m_carrier_default_x_left);
  3406. m_dispatch_carrier_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_carrier_node.m_dispatch_control_status+1);
  3407. }
  3408. else if ( tp_main_carrier->get_device_id() == 1 )
  3409. {
  3410. carrier_move_x(get_dispatch_control_command_key(m_dispatch_carrier_node), tp_main_carrier, tp_main_carrier_task, tp_dispatch_coordinates, tp_dispatch_coordinates->m_carrier_default_x_right);
  3411. m_dispatch_carrier_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_carrier_node.m_dispatch_control_status+1);
  3412. }
  3413. else
  3414. {
  3415. m_dispatch_carrier_node.m_dispatch_control_status = Dispatch_process::Dispatch_control_status::DISPATCH_CONTROL_FAULT;
  3416. m_dispatch_carrier_node.m_error = Error_manager(Error_code::CARRIER_CONRTOL_PARAMETER_ERROR, Error_level::MINOR_ERROR,
  3417. "DISPATCH_CARRIER_STORE_50 tp_main_carrier->get_device_id() PARAMRTER ERROR ");
  3418. }
  3419. }
  3420. break;
  3421. }
  3422. case DISPATCH_CARRIER_STORE_51://搬运器 释放空间锁
  3423. {
  3424. m_dispatch_carrier_node.m_error = check_task_status(m_dispatch_carrier_node.mp_main_carrier_task, m_dispatch_carrier_node.m_dispatch_control_status);
  3425. if ( m_dispatch_carrier_node.m_error == Error_code::SUCCESS )
  3426. {
  3427. m_dispatch_carrier_node.m_error = tp_dispatch_coordinates->carrier_space_unlock(tp_main_carrier->get_device_id());
  3428. }
  3429. break;
  3430. }
  3431. case DISPATCH_CARRIER_STORE_52://收回对接,之后中跑车固定在电梯上不能X轴移动,电梯可以Z轴移动
  3432. {
  3433. carrier_joint_x(get_dispatch_control_command_key(m_dispatch_carrier_node), tp_main_carrier, tp_main_carrier_task, tp_dispatch_coordinates, Carrier_task::Joint_motion::E_JOINT_TAKE_BACK);
  3434. m_dispatch_carrier_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_carrier_node.m_dispatch_control_status+1);
  3435. break;
  3436. }
  3437. case DISPATCH_CARRIER_STORE_53:
  3438. {
  3439. m_dispatch_carrier_node.m_error = check_task_status(m_dispatch_carrier_node.mp_main_carrier_task, m_dispatch_carrier_node.m_dispatch_control_status);
  3440. break;
  3441. }
  3442. case DISPATCH_CARRIER_STORE_54://主搬运器 断连
  3443. {
  3444. disconnect_dispatch_device(m_dispatch_carrier_node.mp_main_carrier, m_dispatch_carrier_node.mp_main_carrier_task);
  3445. m_dispatch_carrier_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status::DISPATCH_CARRIER_STORE_END);
  3446. break;
  3447. }
  3448. }
  3449. std::cout << " huli test :::: " << " ======================================================================================== = " << "carrier end" << std::endl;
  3450. std::cout << " huli test :::: " << " m_dispatch_carrier_node.m_dispatch_control_status = " << m_dispatch_carrier_node.m_dispatch_control_status << std::endl;
  3451. if ( m_dispatch_carrier_node.mp_main_carrier.get() != NULL )
  3452. {
  3453. std::cout << " huli test :::: " << " tp_main_carrier->get_device_id() = " << m_dispatch_carrier_node.mp_main_carrier->get_device_id() <<" + "<< m_dispatch_carrier_node.mp_main_carrier->get_current_command_key() <<" + "<< m_dispatch_carrier_node.mp_main_carrier->get_dispatch_device_status() << std::endl;
  3454. }
  3455. else
  3456. {
  3457. std::cout << " huli test :::: " << " tp_main_carrier->get_device_id() = " << -8888 << std::endl;
  3458. }
  3459. if ( m_dispatch_carrier_node.mp_avoid_catcher.get() != NULL )
  3460. {
  3461. std::cout << " huli test :::: " << " tp_avoid_catcher->get_device_id() = " << m_dispatch_carrier_node.mp_avoid_catcher->get_device_id() <<" + "<< m_dispatch_carrier_node.mp_avoid_catcher->get_current_command_key() <<" + "<< m_dispatch_carrier_node.mp_avoid_catcher->get_dispatch_device_status() << std::endl;
  3462. }
  3463. else
  3464. {
  3465. std::cout << " huli test :::: " << " tp_avoid_catcher->get_device_id() = " << -8888 << std::endl;
  3466. }
  3467. if ( m_dispatch_carrier_node.mp_avoid_carrier.get() != NULL )
  3468. {
  3469. std::cout << " huli test :::: " << " tp_avoid_carrier->get_device_id() = " << m_dispatch_carrier_node.mp_avoid_carrier->get_device_id() <<" + "<< m_dispatch_carrier_node.mp_avoid_carrier->get_current_command_key() <<" + "<< m_dispatch_carrier_node.mp_avoid_carrier->get_dispatch_device_status() << std::endl;
  3470. }
  3471. else
  3472. {
  3473. std::cout << " huli test :::: " << " tp_avoid_carrier->get_device_id() = " << -8888 << std::endl;
  3474. }
  3475. #ifdef PROCESS_TEST
  3476. char cr;
  3477. std::cin >> cr ;
  3478. #endif
  3479. std::cout << " huli test :::: " << " ----------------------------------------------------------------------------------------- = " << "catcher start" << std::endl;
  3480. std::cout << " huli test :::: " << " m_dispatch_catcher_node.m_dispatch_control_status = " << m_dispatch_catcher_node.m_dispatch_control_status << std::endl;
  3481. if ( m_dispatch_catcher_node.mp_main_catcher.get() != NULL )
  3482. {
  3483. std::cout << " huli test :::: " << " tp_main_catcher->get_device_id() = " << m_dispatch_catcher_node.mp_main_catcher->get_device_id() <<" + "<< m_dispatch_catcher_node.mp_main_catcher->get_current_command_key() <<" + "<< m_dispatch_catcher_node.mp_main_catcher->get_dispatch_device_status() << std::endl;
  3484. }
  3485. else
  3486. {
  3487. std::cout << " huli test :::: " << " tp_main_catcher->get_device_id() = " << -8888 << std::endl;
  3488. }
  3489. if ( m_dispatch_catcher_node.mp_following_carrier.get() != NULL )
  3490. {
  3491. std::cout << " huli test :::: " << " tp_following_carrier->get_device_id() = " << m_dispatch_catcher_node.mp_following_carrier->get_device_id() <<" + " << m_dispatch_catcher_node.mp_following_carrier->get_current_command_key()<<" + "<< m_dispatch_catcher_node.mp_following_carrier->get_dispatch_device_status() << std::endl;
  3492. }
  3493. else
  3494. {
  3495. std::cout << " huli test :::: " << " tp_following_carrier->get_device_id() = " << -8888 << std::endl;
  3496. }
  3497. Error_manager t_catcher_error;
  3498. Catcher * tp_main_catcher = NULL;
  3499. Catcher_task * tp_main_catcher_task = NULL;
  3500. if ( m_dispatch_catcher_node.mp_main_catcher.get() != NULL && m_dispatch_catcher_node.mp_main_catcher_task.get() != NULL )
  3501. {
  3502. tp_main_catcher = (Catcher *)m_dispatch_catcher_node.mp_main_catcher.get();
  3503. tp_main_catcher_task = (Catcher_task *)m_dispatch_catcher_node.mp_main_catcher_task.get();
  3504. //一级任务被打断后, 重新执行
  3505. if ( tp_main_catcher->get_break_flag() )
  3506. {
  3507. if ( m_dispatch_catcher_node.m_main_catcher_task_level == Dispatch_device_base::Dispatch_task_level::DISPATCH_TASK_ONE_LEVEL )
  3508. {
  3509. m_dispatch_catcher_node.m_dispatch_control_status = DISPATCH_CATCHER_STORE_START;
  3510. }
  3511. tp_main_catcher->set_break_flag(false);
  3512. }
  3513. }
  3514. Carrier * tp_following_carrier = NULL;
  3515. Carrier_task * tp_following_carrier_task = NULL;
  3516. if ( m_dispatch_catcher_node.mp_following_carrier.get() != NULL && m_dispatch_catcher_node.mp_following_carrier_task.get() != NULL )
  3517. {
  3518. tp_following_carrier = (Carrier *)m_dispatch_catcher_node.mp_following_carrier.get();
  3519. tp_following_carrier_task = (Carrier_task *)m_dispatch_catcher_node.mp_following_carrier_task.get();
  3520. }
  3521. //抓取器的控制动作
  3522. switch ( m_dispatch_catcher_node.m_dispatch_control_status )
  3523. {
  3524. case DISPATCH_CONTROL_CREATED:
  3525. case DISPATCH_CONTROL_READY:
  3526. {
  3527. m_dispatch_catcher_node.m_error = check_main_catcher(m_dispatch_catcher_node);
  3528. if (m_dispatch_catcher_node.m_error == Error_code::SUCCESS)
  3529. {
  3530. if (m_dispatch_process_type == Common_data::Dispatch_process_type::DISPATCH_PROCESS_PICKUP)
  3531. {
  3532. m_dispatch_catcher_node.m_dispatch_control_status = Dispatch_process::Dispatch_control_status::DISPATCH_CATCHER_PICKUP_START;
  3533. }
  3534. else if (m_dispatch_process_type == Common_data::Dispatch_process_type::DISPATCH_PROCESS_STORE)
  3535. {
  3536. m_dispatch_catcher_node.m_dispatch_control_status = Dispatch_process::Dispatch_control_status::DISPATCH_CATCHER_STORE_START;
  3537. }
  3538. }
  3539. //else 原地等待
  3540. break;
  3541. }
  3542. case DISPATCH_CATCHER_STORE_START://连接机器人, 创建新的任务单 与设备建立连接
  3543. {
  3544. if (m_dispatch_catcher_node.mp_main_catcher.get() == NULL)
  3545. {
  3546. m_dispatch_catcher_node.mp_main_catcher = Dispatch_manager::get_instance_references().m_catcher_map[1];
  3547. }
  3548. if ( m_dispatch_catcher_node.mp_main_catcher_task.get() == NULL )
  3549. {
  3550. m_dispatch_catcher_node.m_error = m_dispatch_catcher_node.mp_main_catcher->check_task_level(
  3551. Dispatch_device_base::Dispatch_task_level::DISPATCH_TASK_ONE_LEVEL);
  3552. if (m_dispatch_catcher_node.m_error == Error_code::SUCCESS)
  3553. {
  3554. m_dispatch_catcher_node.m_error = connect_dispatch_catcher(m_dispatch_catcher_node.mp_main_catcher,
  3555. m_dispatch_catcher_node.mp_main_catcher_task,
  3556. Dispatch_device_base::Dispatch_task_level::DISPATCH_TASK_ONE_LEVEL);
  3557. if (m_dispatch_catcher_node.m_error == Error_code::SUCCESS)
  3558. {
  3559. m_dispatch_catcher_node.m_main_catcher_task_level = Dispatch_device_base::Dispatch_task_level::DISPATCH_TASK_ONE_LEVEL;
  3560. m_dispatch_catcher_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status) (m_dispatch_catcher_node.m_dispatch_control_status + 1);
  3561. }
  3562. //else 抓取器的资源自由争抢, 如果没有抢到, 那么重复连接
  3563. }
  3564. //else 抓取器的资源自由争抢, 如果没有抢到, 那么重复连接
  3565. }
  3566. else
  3567. {
  3568. m_dispatch_catcher_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status) (m_dispatch_catcher_node.m_dispatch_control_status + 2);
  3569. }
  3570. break;
  3571. }
  3572. case DISPATCH_CATCHER_STORE_1:
  3573. {
  3574. m_dispatch_catcher_node.m_error = check_task_status(m_dispatch_catcher_node.mp_main_catcher_task,
  3575. m_dispatch_catcher_node.m_dispatch_control_status);
  3576. break;
  3577. }
  3578. case DISPATCH_CATCHER_STORE_2://机器人 准备开始, 需要同步任务单和设备真实数据
  3579. {
  3580. //机器人 准备开始, 需要同步任务单和设备真实数据.//注意了:连接设备只是预约, 设备不一定立刻执行.所以需要在连接成功之后进行数据同步
  3581. catcher_ready_to_start(get_dispatch_control_command_key(m_dispatch_catcher_node), tp_main_catcher,
  3582. tp_main_catcher_task, tp_dispatch_coordinates);
  3583. m_dispatch_catcher_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status) (m_dispatch_catcher_node.m_dispatch_control_status + 1);
  3584. break;
  3585. }
  3586. case DISPATCH_CATCHER_STORE_3:
  3587. {
  3588. m_dispatch_catcher_node.m_error = check_task_status(m_dispatch_catcher_node.mp_main_catcher_task,
  3589. m_dispatch_catcher_node.m_dispatch_control_status);
  3590. //注意了:同步失败,需要重新同步.
  3591. if ( m_dispatch_catcher_node.m_error != Error_code::SUCCESS )
  3592. {
  3593. m_dispatch_catcher_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status::DISPATCH_CATCHER_STORE_2);
  3594. }
  3595. break;
  3596. }
  3597. case DISPATCH_CATCHER_STORE_4://机器手调整到 正常待机的姿态(调节夹杆和轴距)
  3598. {
  3599. if ( tp_main_catcher->m_actual_load_status == Dispatch_device_base::Load_status::NO_CAR )
  3600. {
  3601. if ( tp_main_catcher->m_actual_clamp_motion1 != Dispatch_device_base::Clamp_motion::E_CLAMP_LOOSE ||
  3602. tp_main_catcher->m_actual_d1 + tp_main_catcher->m_actual_d2 + tp_dispatch_coordinates->m_catcher_d1_d2_distance >
  3603. tp_dispatch_coordinates->m_catcher_wheel_base_limit ||
  3604. tp_main_catcher->m_catcher_direction == Dispatch_device_base::Catcher_direction::CATCHER_DIRECTION_UNKNOW )
  3605. {
  3606. catcher_adjust_to_ready(get_dispatch_control_command_key(m_dispatch_catcher_node), tp_main_catcher, tp_main_catcher_task, tp_dispatch_coordinates);
  3607. m_dispatch_catcher_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_catcher_node.m_dispatch_control_status+1);
  3608. }
  3609. else
  3610. {
  3611. m_dispatch_catcher_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_catcher_node.m_dispatch_control_status+2);
  3612. }
  3613. }
  3614. else
  3615. {
  3616. m_dispatch_catcher_node.m_dispatch_control_status = Dispatch_process::Dispatch_control_status::DISPATCH_CONTROL_FAULT;
  3617. m_dispatch_catcher_node.m_error = Error_manager(Error_code::CATCHER_POSE_ERROR, Error_level::MINOR_ERROR,
  3618. "DISPATCH_CATCHER_STORE_4 Dispatch_process::excute_robot_catch_car_from_carrier() fun error ");
  3619. }
  3620. break;
  3621. }
  3622. case DISPATCH_CATCHER_STORE_5:
  3623. {
  3624. m_dispatch_catcher_node.m_error = check_task_status(m_dispatch_catcher_node.mp_main_catcher_task, m_dispatch_catcher_node.m_dispatch_control_status);
  3625. break;
  3626. }
  3627. case DISPATCH_CATCHER_STORE_6://机器手 调整z轴, (z轴上升到4楼. 不需要判断空间锁)
  3628. {
  3629. if ( tp_main_catcher->m_actual_z*1.02 >= tp_dispatch_coordinates->m_catcher_4th_floor_z )
  3630. {
  3631. //检测正常, 直接跳过即可
  3632. m_dispatch_catcher_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_catcher_node.m_dispatch_control_status+2);
  3633. }
  3634. else
  3635. {
  3636. catcher_move_z(get_dispatch_control_command_key(m_dispatch_catcher_node), tp_main_catcher, tp_main_catcher_task, tp_dispatch_coordinates, tp_dispatch_coordinates->m_catcher_4th_floor_z);
  3637. m_dispatch_catcher_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_catcher_node.m_dispatch_control_status+1);
  3638. }
  3639. break;
  3640. }
  3641. case DISPATCH_CATCHER_STORE_7://机器人释放 空间锁
  3642. {
  3643. m_dispatch_catcher_node.m_error = check_task_status(m_dispatch_catcher_node.mp_main_catcher_task, m_dispatch_catcher_node.m_dispatch_control_status);
  3644. if ( m_dispatch_catcher_node.m_error == Error_code::SUCCESS )
  3645. {
  3646. tp_dispatch_coordinates->catcher_space_unlock(tp_main_catcher->m_actual_coordinates_id, tp_main_catcher->get_device_id());
  3647. }
  3648. break;
  3649. }
  3650. case DISPATCH_CATCHER_STORE_8://连接3楼的跟随机器人
  3651. {
  3652. if ( m_dispatch_catcher_node.m_following_flag )
  3653. {
  3654. if ( m_dispatch_catcher_node.mp_following_carrier.get() == NULL )
  3655. {
  3656. m_dispatch_catcher_node.mp_following_carrier = Dispatch_manager::get_instance_references().m_carrier_map[2];
  3657. }
  3658. if ( m_dispatch_catcher_node.mp_following_carrier_task.get() == NULL )
  3659. {
  3660. m_dispatch_catcher_node.m_error = m_dispatch_catcher_node.mp_following_carrier->check_task_level(Dispatch_device_base::Dispatch_task_level::DISPATCH_TASK_ONE_LEVEL);
  3661. if ( m_dispatch_catcher_node.m_error == Error_code::SUCCESS )
  3662. {
  3663. m_dispatch_catcher_node.m_error = connect_dispatch_carrier(m_dispatch_catcher_node.mp_following_carrier, m_dispatch_catcher_node.mp_following_carrier_task, Dispatch_device_base::Dispatch_task_level::DISPATCH_TASK_ONE_LEVEL);
  3664. if ( m_dispatch_catcher_node.m_error == Error_code::SUCCESS )
  3665. {
  3666. m_dispatch_catcher_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_catcher_node.m_dispatch_control_status+1);
  3667. }
  3668. //else 抓取器的资源自由争抢, 如果没有抢到, 那么重复连接
  3669. }
  3670. //else 抓取器的资源自由争抢, 如果没有抢到, 那么重复连接
  3671. }
  3672. else
  3673. {
  3674. m_dispatch_catcher_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_catcher_node.m_dispatch_control_status+2);
  3675. }
  3676. }
  3677. else
  3678. {
  3679. m_dispatch_catcher_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_catcher_node.m_dispatch_control_status+2);
  3680. }
  3681. break;
  3682. }
  3683. case DISPATCH_CATCHER_STORE_9:
  3684. {
  3685. m_dispatch_catcher_node.m_error = check_task_status(m_dispatch_catcher_node.mp_following_carrier_task, m_dispatch_catcher_node.m_dispatch_control_status);
  3686. break;
  3687. }
  3688. case DISPATCH_CATCHER_STORE_10://搬运器 准备开始, 需要同步任务单和设备真实数据
  3689. {
  3690. if ( m_dispatch_catcher_node.m_following_flag )
  3691. {
  3692. //搬运器 准备开始, 需要同步任务单和设备真实数据.//注意了:连接设备只是预约, 设备不一定立刻执行.所以需要在连接成功之后进行数据同步
  3693. carrier_ready_to_start(get_dispatch_control_command_key(m_dispatch_catcher_node), tp_following_carrier, tp_following_carrier_task, tp_dispatch_coordinates);
  3694. m_dispatch_catcher_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_catcher_node.m_dispatch_control_status+1);
  3695. }
  3696. else
  3697. {
  3698. m_dispatch_catcher_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_catcher_node.m_dispatch_control_status+2);
  3699. }
  3700. break;
  3701. }
  3702. case DISPATCH_CATCHER_STORE_11:
  3703. {
  3704. m_dispatch_catcher_node.m_error = check_task_status(m_dispatch_catcher_node.mp_following_carrier_task, m_dispatch_catcher_node.m_dispatch_control_status);
  3705. //注意了:同步失败,需要重新同步.
  3706. if ( m_dispatch_catcher_node.m_error != Error_code::SUCCESS )
  3707. {
  3708. m_dispatch_catcher_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status::DISPATCH_CATCHER_STORE_10);
  3709. }
  3710. break;
  3711. }
  3712. case DISPATCH_CATCHER_STORE_12://机器人 x轴移动之前, 判断空间锁.
  3713. {
  3714. int t_terminal = m_dispatch_source - 1100;
  3715. int temp = (t_terminal-1)%2;
  3716. int t_column = 4 + ((t_terminal-1)/2)*3 + temp*2 -1;
  3717. if ( tp_main_catcher->m_actual_coordinates_columns < t_column )
  3718. {
  3719. m_dispatch_catcher_node.m_error = tp_dispatch_coordinates->catcher_try_space_lock(1, tp_main_catcher->m_actual_coordinates_columns,
  3720. 2, t_column+1,
  3721. tp_main_catcher->get_device_id());
  3722. }
  3723. else
  3724. {
  3725. m_dispatch_catcher_node.m_error = tp_dispatch_coordinates->catcher_try_space_lock(1, t_column-1,
  3726. 2, tp_main_catcher->m_actual_coordinates_columns,
  3727. tp_main_catcher->get_device_id());
  3728. }
  3729. //判断结果
  3730. if ( m_dispatch_catcher_node.m_error == Error_code::SUCCESS )
  3731. {
  3732. m_dispatch_catcher_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_catcher_node.m_dispatch_control_status+1);
  3733. }
  3734. //else 无限等待
  3735. break;
  3736. }
  3737. case DISPATCH_CATCHER_STORE_13://机器手调整到 对接地面的姿态
  3738. {
  3739. if ( m_dispatch_catcher_node.m_following_flag )
  3740. {
  3741. float t_x = tp_dispatch_coordinates->m_carrier_coordinates_map[m_dispatch_source].x;
  3742. float t_y = tp_dispatch_coordinates->m_carrier_coordinates_map[m_dispatch_source].y;
  3743. //机器手调整到 对接地面的姿态
  3744. catcher_adjust_from_ground(get_dispatch_control_command_key(m_dispatch_catcher_node), tp_main_catcher, tp_main_catcher_task, tp_dispatch_coordinates);
  3745. //3楼搬运器跟随, 到机器人旁边一个车位
  3746. float t_following_x = 0;
  3747. if ( m_dispatch_source == 1101 )
  3748. {
  3749. t_following_x = tp_dispatch_coordinates->m_carrier_coordinates_map[1102].x;
  3750. }
  3751. else if ( m_dispatch_source == 1106 )
  3752. {
  3753. t_following_x = tp_dispatch_coordinates->m_carrier_coordinates_map[1105].x;
  3754. }
  3755. else if ( tp_following_carrier->m_actual_x < t_x)
  3756. {
  3757. t_following_x = tp_dispatch_coordinates->m_carrier_coordinates_map[m_dispatch_source-1].x;
  3758. }
  3759. else
  3760. {
  3761. t_following_x = tp_dispatch_coordinates->m_carrier_coordinates_map[m_dispatch_source+1].x;
  3762. }
  3763. carrier_move_x(get_dispatch_control_command_key(m_dispatch_catcher_node), tp_following_carrier, tp_following_carrier_task, tp_dispatch_coordinates, t_following_x);
  3764. m_dispatch_catcher_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_catcher_node.m_dispatch_control_status+1);
  3765. }
  3766. else
  3767. {
  3768. if ( m_dispatch_carrier_node.m_dispatch_control_status >= Dispatch_process::Dispatch_control_status::DISPATCH_CARRIER_STORE_18 )
  3769. {
  3770. float t_x = tp_dispatch_coordinates->m_carrier_coordinates_map[m_dispatch_source].x;
  3771. float t_y = tp_dispatch_coordinates->m_carrier_coordinates_map[m_dispatch_source].y;
  3772. //机器手调整到 对接地面的姿态
  3773. catcher_adjust_from_ground(get_dispatch_control_command_key(m_dispatch_catcher_node), tp_main_catcher, tp_main_catcher_task, tp_dispatch_coordinates);
  3774. m_dispatch_catcher_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_catcher_node.m_dispatch_control_status+1);
  3775. }
  3776. //else 无限等待
  3777. }
  3778. break;
  3779. }
  3780. case DISPATCH_CATCHER_STORE_14://机器人释放 空间锁
  3781. {
  3782. m_dispatch_catcher_node.m_error = check_task_status(m_dispatch_catcher_node.mp_main_catcher_task);
  3783. if ( m_dispatch_catcher_node.m_following_flag )
  3784. {
  3785. m_dispatch_catcher_node.m_error.compare_and_cover_error(check_task_status(m_dispatch_catcher_node.mp_following_carrier_task));
  3786. }
  3787. if ( m_dispatch_catcher_node.m_error == Error_code::SUCCESS )
  3788. {
  3789. tp_dispatch_coordinates->catcher_space_unlock(tp_main_catcher->m_actual_coordinates_id, tp_main_catcher->get_device_id());
  3790. m_dispatch_catcher_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_catcher_node.m_dispatch_control_status+1);
  3791. }
  3792. break;
  3793. }
  3794. case DISPATCH_CATCHER_STORE_15://机器手 准备下降抓车之前, 把一级任务升到三级
  3795. {
  3796. //2楼交接则直接下降抓车, 3楼交接,就需要等待3楼搬运器进入待机位,
  3797. if ( m_dispatch_catcher_node.m_following_flag )
  3798. {
  3799. m_dispatch_catcher_node.m_error = m_dispatch_catcher_node.mp_main_catcher->change_task_level(
  3800. Dispatch_device_base::Dispatch_task_level::DISPATCH_TASK_ONE_LEVEL,
  3801. Dispatch_device_base::Dispatch_task_level::DISPATCH_TASK_THREE_LEVEL);
  3802. m_dispatch_catcher_node.m_error.compare_and_cover_error(m_dispatch_catcher_node.mp_following_carrier->change_task_level(
  3803. Dispatch_device_base::Dispatch_task_level::DISPATCH_TASK_ONE_LEVEL,
  3804. Dispatch_device_base::Dispatch_task_level::DISPATCH_TASK_THREE_LEVEL));
  3805. if (m_dispatch_catcher_node.m_error == Error_code::SUCCESS)
  3806. {
  3807. m_dispatch_catcher_node.m_main_catcher_task_level = Dispatch_device_base::Dispatch_task_level::DISPATCH_TASK_THREE_LEVEL;
  3808. m_dispatch_catcher_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status) (
  3809. m_dispatch_catcher_node.m_dispatch_control_status + 1);
  3810. }
  3811. else if(m_dispatch_catcher_node.m_error == Error_code::NODATA)
  3812. {
  3813. //无限等待
  3814. }
  3815. else
  3816. {
  3817. m_dispatch_catcher_node.m_dispatch_control_status = Dispatch_process::Dispatch_control_status::DISPATCH_CONTROL_FAULT;
  3818. }
  3819. }
  3820. //等待搬运器就位, 把一级任务升到三级
  3821. else if ( m_dispatch_carrier_node.m_dispatch_control_status >= Dispatch_process::Dispatch_control_status::DISPATCH_CARRIER_STORE_20 )
  3822. {
  3823. m_dispatch_catcher_node.m_error = m_dispatch_catcher_node.mp_main_catcher->change_task_level(
  3824. Dispatch_device_base::Dispatch_task_level::DISPATCH_TASK_ONE_LEVEL,
  3825. Dispatch_device_base::Dispatch_task_level::DISPATCH_TASK_THREE_LEVEL);
  3826. if (m_dispatch_catcher_node.m_error == Error_code::SUCCESS)
  3827. {
  3828. m_dispatch_catcher_node.m_main_catcher_task_level = Dispatch_device_base::Dispatch_task_level::DISPATCH_TASK_THREE_LEVEL;
  3829. m_dispatch_catcher_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status) (
  3830. m_dispatch_catcher_node.m_dispatch_control_status + 1);
  3831. }
  3832. else if(m_dispatch_catcher_node.m_error == Error_code::NODATA)
  3833. {
  3834. //无限等待
  3835. }
  3836. else
  3837. {
  3838. m_dispatch_catcher_node.m_dispatch_control_status = Dispatch_process::Dispatch_control_status::DISPATCH_CONTROL_FAULT;
  3839. }
  3840. }
  3841. break;
  3842. }
  3843. case DISPATCH_CATCHER_STORE_16://机器手 z轴下降, 空间加锁
  3844. {
  3845. int t_terminal = m_dispatch_source - 1100;
  3846. int temp = (t_terminal-1)%2;
  3847. int t_column = 4 + ((t_terminal-1)/2)*3 + temp*2 -1;
  3848. m_dispatch_catcher_node.m_error = tp_dispatch_coordinates->catcher_try_space_lock(0, t_column-1,
  3849. 2, t_column+1,
  3850. tp_main_catcher->get_device_id());
  3851. //判断结果
  3852. if ( m_dispatch_catcher_node.m_error == Error_code::SUCCESS )
  3853. {
  3854. //左右搬运器加锁成功, 直接x轴移动
  3855. m_dispatch_catcher_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_catcher_node.m_dispatch_control_status+1);
  3856. }
  3857. //else 无限等待
  3858. break;
  3859. }
  3860. case DISPATCH_CATCHER_STORE_17://机器手 z轴下降
  3861. {
  3862. float t_z = tp_dispatch_coordinates->m_catcher_1th_floor_z;
  3863. catcher_move_z(get_dispatch_control_command_key(m_dispatch_catcher_node), tp_main_catcher, tp_main_catcher_task, tp_dispatch_coordinates, t_z);
  3864. m_dispatch_catcher_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_catcher_node.m_dispatch_control_status+1);
  3865. break;
  3866. }
  3867. case DISPATCH_CATCHER_STORE_18:
  3868. {
  3869. m_dispatch_catcher_node.m_error = check_task_status(m_dispatch_catcher_node.mp_main_catcher_task, m_dispatch_catcher_node.m_dispatch_control_status);
  3870. break;
  3871. }
  3872. case DISPATCH_CATCHER_STORE_19://修正轴距, 如果轴距大于3000mm, 那么就要修正轴距.
  3873. {
  3874. float temp_wheel_base = tp_main_catcher->m_actual_d1 + tp_main_catcher->m_actual_d2 + tp_dispatch_coordinates->m_catcher_d1_d2_distance;
  3875. //修正轴距, 如果轴距大于3000mm, 那么就要修正轴距.
  3876. if ( Common_data::approximate_difference(m_wheel_base, temp_wheel_base, DISPATCH_DEFAULT_DIFFERENCE) )
  3877. {
  3878. m_dispatch_catcher_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_catcher_node.m_dispatch_control_status+2);
  3879. }
  3880. else
  3881. {
  3882. catcher_adjust_wheel_base(get_dispatch_control_command_key(m_dispatch_catcher_node), tp_main_catcher, tp_main_catcher_task, tp_dispatch_coordinates);
  3883. m_dispatch_catcher_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_catcher_node.m_dispatch_control_status+1);
  3884. }
  3885. break;
  3886. }
  3887. case DISPATCH_CATCHER_STORE_20:
  3888. {
  3889. m_dispatch_catcher_node.m_error = check_task_status(m_dispatch_catcher_node.mp_main_catcher_task, m_dispatch_catcher_node.m_dispatch_control_status);
  3890. break;
  3891. }
  3892. case DISPATCH_CATCHER_STORE_21://机器手 夹车
  3893. {
  3894. catcher_move_c(get_dispatch_control_command_key(m_dispatch_catcher_node), tp_main_catcher, tp_main_catcher_task, tp_dispatch_coordinates, Catcher_task::Clamp_motion::E_CLAMP_TIGHT);
  3895. m_dispatch_catcher_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_catcher_node.m_dispatch_control_status+1);
  3896. break;
  3897. }
  3898. case DISPATCH_CATCHER_STORE_22:
  3899. {
  3900. m_dispatch_catcher_node.m_error = check_task_status(m_dispatch_catcher_node.mp_main_catcher_task, m_dispatch_catcher_node.m_dispatch_control_status);
  3901. break;
  3902. }
  3903. case DISPATCH_CATCHER_STORE_23://机器手 z轴上升, 上升到交接为上方190mm就足以
  3904. {
  3905. // float t_z = 0;
  3906. // if ( m_dispatch_catcher_node.m_following_flag )
  3907. // {
  3908. // t_z = tp_dispatch_coordinates->m_catcher_2th_floor_z + tp_dispatch_coordinates->m_separated_distance_z;
  3909. // }
  3910. // else
  3911. // {
  3912. // t_z = tp_dispatch_coordinates->m_catcher_3th_floor_z + tp_dispatch_coordinates->m_separated_distance_z;
  3913. // }
  3914. //只能在最高处交接
  3915. float t_z = tp_dispatch_coordinates->m_catcher_4th_floor_z;
  3916. catcher_move_z(get_dispatch_control_command_key(m_dispatch_catcher_node), tp_main_catcher, tp_main_catcher_task, tp_dispatch_coordinates, t_z);
  3917. m_dispatch_catcher_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_catcher_node.m_dispatch_control_status+1);
  3918. break;
  3919. }
  3920. case DISPATCH_CATCHER_STORE_24:
  3921. {
  3922. m_dispatch_catcher_node.m_error = check_task_status(m_dispatch_catcher_node.mp_main_catcher_task, m_dispatch_catcher_node.m_dispatch_control_status);
  3923. break;
  3924. }
  3925. case DISPATCH_CATCHER_STORE_25://机器人 x轴移动之前, 判断空间锁.
  3926. {
  3927. int t_column = 0;
  3928. // 2楼交接, 在出口终点x交接 3楼交接, 在取车车位起点x交接,
  3929. if ( m_dispatch_catcher_node.m_following_flag )
  3930. {
  3931. int t_terminal = m_dispatch_source - 1100;
  3932. int temp = (t_terminal-1)%2;
  3933. t_column = 4 + ((t_terminal-1)/2)*3 + temp*2 -1;
  3934. }
  3935. else
  3936. {
  3937. t_column = (m_parkspace_information_optimal.parkingspace_index_id -1) % tp_dispatch_coordinates->m_space_lock_columns;
  3938. }
  3939. if ( tp_main_catcher->m_actual_coordinates_columns < t_column )
  3940. {
  3941. m_dispatch_catcher_node.m_error = tp_dispatch_coordinates->catcher_try_space_lock(1, tp_main_catcher->m_actual_coordinates_columns,
  3942. 2, t_column+1,
  3943. tp_main_catcher->get_device_id());
  3944. }
  3945. else
  3946. {
  3947. m_dispatch_catcher_node.m_error = tp_dispatch_coordinates->catcher_try_space_lock(1, t_column-1,
  3948. 2, tp_main_catcher->m_actual_coordinates_columns,
  3949. tp_main_catcher->get_device_id());
  3950. }
  3951. //判断结果
  3952. if ( m_dispatch_catcher_node.m_error == Error_code::SUCCESS )
  3953. {
  3954. m_dispatch_catcher_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_catcher_node.m_dispatch_control_status+1);
  3955. }
  3956. //else 无限等待
  3957. break;
  3958. }
  3959. case DISPATCH_CATCHER_STORE_26://机器手调整到 准备把车放到搬运器的姿态
  3960. {
  3961. float t_x = 0;
  3962. // 2楼交接, 在入口起点x交接 3楼交接, 在车位x交接,
  3963. if ( m_dispatch_catcher_node.m_following_flag )
  3964. {
  3965. t_x = tp_dispatch_coordinates->m_carrier_coordinates_map[m_dispatch_source].x;
  3966. }
  3967. else
  3968. {
  3969. t_x = tp_dispatch_coordinates->m_carrier_coordinates_map[m_parkspace_information_optimal.parkingspace_index_id].x;
  3970. }
  3971. float t_y = tp_dispatch_coordinates->m_carrier_default_y1_back - (m_wheel_base /2);
  3972. //注:3楼流程 可能会出现x平移的同时 进行旋转掉头
  3973. catcher_adjust_to_carrier(get_dispatch_control_command_key(m_dispatch_catcher_node), tp_main_catcher, tp_main_catcher_task, tp_dispatch_coordinates, t_x, true);
  3974. m_dispatch_catcher_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_catcher_node.m_dispatch_control_status+1);
  3975. break;
  3976. }
  3977. case DISPATCH_CATCHER_STORE_27://机器人 释放空间锁
  3978. {
  3979. m_dispatch_catcher_node.m_error = check_task_status(m_dispatch_catcher_node.mp_main_catcher_task, m_dispatch_catcher_node.m_dispatch_control_status);
  3980. if ( m_dispatch_catcher_node.m_error == Error_code::SUCCESS )
  3981. {
  3982. tp_dispatch_coordinates->catcher_space_unlock(tp_main_catcher->m_actual_coordinates_id, tp_main_catcher->get_device_id());
  3983. }
  3984. break;
  3985. }
  3986. case DISPATCH_CATCHER_STORE_28://等待搬运器过来接车后, 机器人就可以下降了
  3987. {
  3988. //等待搬运器过来接车后, 机器人就可以下降了
  3989. if ( m_dispatch_carrier_node.m_dispatch_control_status >= Dispatch_process::Dispatch_control_status::DISPATCH_CARRIER_STORE_24 )
  3990. {
  3991. m_dispatch_catcher_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_catcher_node.m_dispatch_control_status+1);
  3992. }
  3993. //else 无限等待
  3994. break;
  3995. }
  3996. case DISPATCH_CATCHER_STORE_29://机器人z轴下降, 判断空间锁
  3997. {
  3998. m_dispatch_catcher_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_catcher_node.m_dispatch_control_status+1);
  3999. break;
  4000. }
  4001. case DISPATCH_CATCHER_STORE_30://机器手 z轴下降 到搬运器放车
  4002. {
  4003. float t_z = 0;
  4004. if ( m_dispatch_catcher_node.m_following_flag )
  4005. {
  4006. //下降到2楼
  4007. t_z = tp_dispatch_coordinates->m_catcher_2th_floor_z;
  4008. }
  4009. else
  4010. {
  4011. //下降到3楼
  4012. t_z = tp_dispatch_coordinates->m_catcher_3th_floor_z;
  4013. }
  4014. catcher_move_z(get_dispatch_control_command_key(m_dispatch_catcher_node), tp_main_catcher, tp_main_catcher_task, tp_dispatch_coordinates, t_z);
  4015. m_dispatch_catcher_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_catcher_node.m_dispatch_control_status+1);
  4016. break;
  4017. }
  4018. case DISPATCH_CATCHER_STORE_31:
  4019. {
  4020. m_dispatch_catcher_node.m_error = check_task_status(m_dispatch_catcher_node.mp_main_catcher_task, m_dispatch_catcher_node.m_dispatch_control_status);
  4021. break;
  4022. }
  4023. case DISPATCH_CATCHER_STORE_32://机器手 松开夹杆
  4024. {
  4025. catcher_move_c(get_dispatch_control_command_key(m_dispatch_catcher_node), tp_main_catcher, tp_main_catcher_task, tp_dispatch_coordinates, Catcher_task::Clamp_motion::E_CLAMP_LOOSE);
  4026. m_dispatch_catcher_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_catcher_node.m_dispatch_control_status+1);
  4027. break;
  4028. }
  4029. case DISPATCH_CATCHER_STORE_33:
  4030. {
  4031. m_dispatch_catcher_node.m_error = check_task_status(m_dispatch_catcher_node.mp_main_catcher_task, m_dispatch_catcher_node.m_dispatch_control_status);
  4032. break;
  4033. }
  4034. case DISPATCH_CATCHER_STORE_34://机器手调整到 正常待机的姿态(调节夹杆和轴距)
  4035. {
  4036. if ( tp_main_catcher->m_actual_clamp_motion1 != Dispatch_device_base::Clamp_motion::E_CLAMP_LOOSE ||
  4037. tp_main_catcher->m_actual_d1 + tp_main_catcher->m_actual_d2 + tp_dispatch_coordinates->m_catcher_d1_d2_distance >
  4038. tp_dispatch_coordinates->m_catcher_wheel_base_limit ||
  4039. tp_main_catcher->m_catcher_direction == Dispatch_device_base::Catcher_direction::CATCHER_DIRECTION_UNKNOW )
  4040. {
  4041. catcher_adjust_to_ready(get_dispatch_control_command_key(m_dispatch_catcher_node), tp_main_catcher, tp_main_catcher_task, tp_dispatch_coordinates);
  4042. m_dispatch_catcher_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_catcher_node.m_dispatch_control_status+1);
  4043. }
  4044. else
  4045. {
  4046. m_dispatch_catcher_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_catcher_node.m_dispatch_control_status+2);
  4047. }
  4048. break;
  4049. }
  4050. case DISPATCH_CATCHER_STORE_35:
  4051. {
  4052. m_dispatch_catcher_node.m_error = check_task_status(m_dispatch_catcher_node.mp_main_catcher_task, m_dispatch_catcher_node.m_dispatch_control_status);
  4053. break;
  4054. }
  4055. case DISPATCH_CATCHER_STORE_36://机器手 调整z轴, z轴上升到4楼
  4056. {
  4057. catcher_move_z(get_dispatch_control_command_key(m_dispatch_catcher_node), tp_main_catcher, tp_main_catcher_task, tp_dispatch_coordinates, tp_dispatch_coordinates->m_catcher_4th_floor_z);
  4058. m_dispatch_catcher_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_catcher_node.m_dispatch_control_status+1);
  4059. break;
  4060. }
  4061. case DISPATCH_CATCHER_STORE_37://机器人释放 空间锁
  4062. {
  4063. m_dispatch_catcher_node.m_error = check_task_status(m_dispatch_catcher_node.mp_main_catcher_task, m_dispatch_catcher_node.m_dispatch_control_status);
  4064. if ( m_dispatch_catcher_node.m_error == Error_code::SUCCESS )
  4065. {
  4066. tp_dispatch_coordinates->catcher_space_unlock(tp_main_catcher->m_actual_coordinates_id, tp_main_catcher->get_device_id());
  4067. }
  4068. break;
  4069. }
  4070. case DISPATCH_CATCHER_STORE_38://3楼的搬运器跟随到机器人下方
  4071. {
  4072. //如果后面有一级存车任务, 那么就跳过
  4073. if ( m_dispatch_catcher_node.m_following_flag &&
  4074. tp_main_catcher->is_has_appoint_task(Dispatch_device_base::Dispatch_task_level::DISPATCH_TASK_ONE_LEVEL) == false &&
  4075. tp_main_catcher->is_has_appoint_task(Dispatch_device_base::Dispatch_task_level::DISPATCH_TASK_TWO_LEVEL) == false)
  4076. {
  4077. float t_following_x = tp_dispatch_coordinates->m_carrier_coordinates_map[m_dispatch_source].x;
  4078. carrier_move_x(get_dispatch_control_command_key(m_dispatch_catcher_node), tp_following_carrier, tp_following_carrier_task, tp_dispatch_coordinates, t_following_x);
  4079. m_dispatch_catcher_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_catcher_node.m_dispatch_control_status+1);
  4080. }
  4081. else
  4082. {
  4083. m_dispatch_catcher_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status)(m_dispatch_catcher_node.m_dispatch_control_status+2);
  4084. }
  4085. break;
  4086. }
  4087. case DISPATCH_CATCHER_STORE_39:
  4088. {
  4089. m_dispatch_catcher_node.m_error = check_task_status(m_dispatch_catcher_node.mp_following_carrier_task, m_dispatch_catcher_node.m_dispatch_control_status);
  4090. break;
  4091. }
  4092. case DISPATCH_CATCHER_STORE_40://主机器人 断连
  4093. {
  4094. disconnect_dispatch_device(m_dispatch_catcher_node.mp_main_catcher, m_dispatch_catcher_node.mp_main_catcher_task);
  4095. if ( m_dispatch_catcher_node.m_following_flag )
  4096. {
  4097. disconnect_dispatch_device(m_dispatch_catcher_node.mp_following_carrier, m_dispatch_catcher_node.mp_following_carrier_task);
  4098. }
  4099. m_dispatch_catcher_node.m_dispatch_control_status = (Dispatch_process::Dispatch_control_status::DISPATCH_CATCHER_STORE_END);
  4100. break;
  4101. }
  4102. case DISPATCH_CATCHER_STORE_END:
  4103. {
  4104. m_dispatch_catcher_node.m_error = Error_code::SUCCESS;
  4105. break;
  4106. }
  4107. default:
  4108. {
  4109. break;
  4110. }
  4111. }
  4112. std::cout << " huli test :::: " << " ---------------------------------------------------------------------------------------------------------------------------- = " << "catcher end" << std::endl;
  4113. std::cout << " huli test :::: " << " m_dispatch_catcher_node.m_dispatch_control_status = " << m_dispatch_catcher_node.m_dispatch_control_status << std::endl;
  4114. if ( m_dispatch_catcher_node.mp_main_catcher.get() != NULL )
  4115. {
  4116. std::cout << " huli test :::: " << " tp_main_catcher->get_device_id() = " << m_dispatch_catcher_node.mp_main_catcher->get_device_id() <<" + "<< m_dispatch_catcher_node.mp_main_catcher->get_current_command_key() <<" + "<< m_dispatch_catcher_node.mp_main_catcher->get_dispatch_device_status() << std::endl;
  4117. }
  4118. else
  4119. {
  4120. std::cout << " huli test :::: " << " tp_main_catcher->get_device_id() = " << -8888 << std::endl;
  4121. }
  4122. if ( m_dispatch_catcher_node.mp_following_carrier.get() != NULL )
  4123. {
  4124. std::cout << " huli test :::: " << " tp_following_carrier->get_device_id() = " << m_dispatch_catcher_node.mp_following_carrier->get_device_id() <<" + " << m_dispatch_catcher_node.mp_following_carrier->get_current_command_key()<<" + "<< m_dispatch_catcher_node.mp_following_carrier->get_dispatch_device_status() << std::endl;
  4125. }
  4126. else
  4127. {
  4128. std::cout << " huli test :::: " << " tp_following_carrier->get_device_id() = " << -8888 << std::endl;
  4129. }
  4130. std::cout << " huli test :::: " << " +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ = " << 3 << std::endl;
  4131. std::cout << " huli test :::: " << " m_dispatch_source = " << m_dispatch_source << std::endl;
  4132. std::cout << " huli test :::: " << " m_parkspace_information_optimal.parkingspace_index_id = " << m_parkspace_information_optimal.parkingspace_index_id << std::endl;
  4133. #ifdef PROCESS_TEST
  4134. char ch;
  4135. std::cin >> ch ;
  4136. #endif
  4137. //结果汇总
  4138. if ( m_dispatch_carrier_node.m_dispatch_control_status == DISPATCH_CARRIER_STORE_END &&
  4139. m_dispatch_catcher_node.m_dispatch_control_status == DISPATCH_CATCHER_STORE_END )
  4140. {
  4141. return Error_code::SUCCESS;
  4142. }
  4143. else if ( m_dispatch_carrier_node.m_dispatch_control_status == DISPATCH_CONTROL_FAULT )
  4144. {
  4145. return m_dispatch_carrier_node.m_error;
  4146. }
  4147. else if(m_dispatch_catcher_node.m_dispatch_control_status == DISPATCH_CONTROL_FAULT)
  4148. {
  4149. return m_dispatch_catcher_node.m_error;
  4150. }
  4151. else
  4152. {
  4153. return Error_code::NODATA;
  4154. }
  4155. }
  4156. //检查核心搬运器
  4157. Error_manager Dispatch_process::check_main_carrier(Dispatch_carrier_node & dispatch_carrier_node)
  4158. {
  4159. //只判断搬运器的指针是否有效.
  4160. if ( dispatch_carrier_node.mp_main_carrier.get() != NULL )
  4161. {
  4162. // if ( m_dispatch_process_type == Common_data::Dispatch_process_type::DISPATCH_PROCESS_PICKUP )
  4163. // {
  4164. // m_dispatch_carrier_node.m_dispatch_control_status = Dispatch_process::Dispatch_control_status::DISPATCH_CARRIER_PICKUP_START;
  4165. // }
  4166. // else if ( m_dispatch_process_type == Common_data::Dispatch_process_type::DISPATCH_PROCESS_STORE )
  4167. // {
  4168. // m_dispatch_carrier_node.m_dispatch_control_status = Dispatch_process::Dispatch_control_status::DISPATCH_CARRIER_STORE_START;
  4169. // }
  4170. return Error_code::SUCCESS;
  4171. }
  4172. else
  4173. {
  4174. return Error_code::NODATA;
  4175. }
  4176. }
  4177. //检查核心抓取器
  4178. Error_manager Dispatch_process::check_main_catcher(Dispatch_catcher_node & dispatch_catcher_node)
  4179. {
  4180. //只判断搬 调度设备机器人启动标志位
  4181. if ( dispatch_catcher_node.m_dispatch_control_start_flag )
  4182. {
  4183. //为抓取器分配对应的设备, 目前只有2号机器人
  4184. // if ( dispatch_catcher_node.mp_main_catcher.get() ==NULL )
  4185. // {
  4186. // dispatch_catcher_node.mp_main_catcher = Dispatch_manager::get_instance_references().m_catcher_map[1];
  4187. // }
  4188. //
  4189. // if ( m_dispatch_process_type == Common_data::Dispatch_process_type::DISPATCH_PROCESS_PICKUP )
  4190. // {
  4191. // dispatch_catcher_node.m_dispatch_control_status = Dispatch_process::Dispatch_control_status::DISPATCH_CATCHER_PICKUP_START;
  4192. // }
  4193. // else if ( m_dispatch_process_type == Common_data::Dispatch_process_type::DISPATCH_PROCESS_STORE )
  4194. // {
  4195. // dispatch_catcher_node.m_dispatch_control_status = Dispatch_process::Dispatch_control_status::DISPATCH_CATCHER_STORE_START;
  4196. // }
  4197. return Error_code::SUCCESS;
  4198. }
  4199. else
  4200. {
  4201. return Error_code::NODATA;
  4202. }
  4203. }
  4204. //连接搬运器, 创建新的任务单 与设备建立连接, 只能成功, 失败就要进入故障处理
  4205. Error_manager Dispatch_process::connect_dispatch_carrier(std::shared_ptr<Dispatch_device_base> & p_carrier, std::shared_ptr<Task_Base> & p_carrier_task, Dispatch_device_base::Dispatch_task_level dispatch_task_level)
  4206. {
  4207. Error_manager t_error;
  4208. if ( p_carrier.get() != NULL )
  4209. {
  4210. Carrier* tp_carrier = (Carrier*)p_carrier.get();
  4211. //检查设备能否执行任务, 主搬运器是管理层分配好的, 一般是可以直接连接.
  4212. t_error = tp_carrier->check_task_level(dispatch_task_level);
  4213. if ( t_error == Error_code::SUCCESS )
  4214. {
  4215. //创建任务单
  4216. p_carrier_task = std::shared_ptr<Task_Base>(new Carrier_task);
  4217. p_carrier_task->task_init(NULL,std::chrono::milliseconds(15000));
  4218. Carrier_task * tp_carrier_task = (Carrier_task *)p_carrier_task.get();
  4219. //第一次发送 空的唯一码, 可以和设备建立联系
  4220. tp_carrier_task->m_request_key = "";
  4221. tp_carrier_task->m_request_x = tp_carrier->m_actual_x;
  4222. tp_carrier_task->m_request_y = tp_carrier->m_actual_y;
  4223. tp_carrier_task->m_request_z = tp_carrier->m_actual_z;
  4224. tp_carrier_task->m_request_y1 = tp_carrier->m_actual_y1;
  4225. tp_carrier_task->m_request_y2 = tp_carrier->m_actual_y2;
  4226. tp_carrier_task->m_request_clamp_motion = (Carrier_task::Clamp_motion)tp_carrier->m_actual_clamp_motion1;
  4227. tp_carrier_task->m_request_joint_motion_x = (Carrier_task::Joint_motion)tp_carrier->m_actual_joint_motion_x1;
  4228. tp_carrier_task->m_request_joint_motion_y = Carrier_task::Joint_motion::E_JOINT_NO_ACTION;
  4229. tp_carrier_task->m_request_space_id = 0;
  4230. tp_carrier_task->m_request_floor_id = 0;
  4231. tp_carrier_task->m_request_wheelbase = Dispatch_coordinates::get_instance_references().m_default_wheelbase;
  4232. t_error = tp_carrier->execute_task(p_carrier_task, dispatch_task_level, m_command_key, m_dispatch_process_type);
  4233. }
  4234. }
  4235. else
  4236. {
  4237. t_error.error_manager_reset(Error_code::POINTER_IS_NULL, Error_level::MINOR_ERROR,
  4238. " Dispatch_process::connect_dispatch_carrier() POINTER IS NULL ");
  4239. }
  4240. return t_error;
  4241. }
  4242. //连接抓取器, 创建新的任务单 与设备建立连接, 可以失败, 失败就重新执行
  4243. Error_manager Dispatch_process::connect_dispatch_catcher(std::shared_ptr<Dispatch_device_base> & p_catcher, std::shared_ptr<Task_Base> & p_catcher_task, Dispatch_device_base::Dispatch_task_level dispatch_task_level)
  4244. {
  4245. Error_manager t_error;
  4246. if ( p_catcher.get() != NULL )
  4247. {
  4248. Catcher* tp_catcher = (Catcher*)p_catcher.get();
  4249. //检查设备能否执行任务, 主抓取器是需要调度流程去争抢的.
  4250. t_error = tp_catcher->check_task_level(dispatch_task_level);
  4251. if ( t_error == Error_code::SUCCESS )
  4252. {
  4253. //创建任务单
  4254. p_catcher_task = std::shared_ptr<Task_Base>(new Catcher_task);
  4255. p_catcher_task->task_init(NULL,std::chrono::milliseconds(15000));
  4256. Catcher_task * tp_catcher_task = (Catcher_task *)p_catcher_task.get();
  4257. //第一次发送 空的唯一码, 可以和设备建立联系
  4258. tp_catcher_task->m_request_key = "";
  4259. tp_catcher_task->m_request_x = tp_catcher->m_actual_x;
  4260. tp_catcher_task->m_request_y = tp_catcher->m_actual_y;
  4261. tp_catcher_task->m_request_b = tp_catcher->m_actual_b;
  4262. tp_catcher_task->m_request_z = tp_catcher->m_actual_z;
  4263. tp_catcher_task->m_request_d1 = tp_catcher->m_actual_d1;
  4264. tp_catcher_task->m_request_d2 = tp_catcher->m_actual_d2;
  4265. tp_catcher_task->m_request_wheelbase = Dispatch_coordinates::get_instance_references().m_default_wheelbase;
  4266. tp_catcher_task->m_request_clamp_motion = (Catcher_task::Clamp_motion)tp_catcher->m_actual_clamp_motion1;
  4267. t_error = tp_catcher->execute_task(p_catcher_task, dispatch_task_level, m_command_key, m_dispatch_process_type);
  4268. }
  4269. }
  4270. else
  4271. {
  4272. t_error.error_manager_reset(Error_code::POINTER_IS_NULL, Error_level::MINOR_ERROR,
  4273. " Dispatch_process::connect_dispatch_catcher() POINTER IS NULL ");
  4274. }
  4275. return t_error;
  4276. }
  4277. //断开调度设备, 收回任务单, 释放任务单 与设备解除连接
  4278. Error_manager Dispatch_process::disconnect_dispatch_device(std::shared_ptr<Dispatch_device_base> & p_device, std::shared_ptr<Task_Base> & p_device_task)
  4279. {
  4280. if ( p_device.get() != NULL && p_device_task.get() != NULL )
  4281. {
  4282. p_device_task->set_task_statu(Task_Base::Task_statu::TASK_WITHDRAW);
  4283. p_device.reset();
  4284. p_device_task.reset();
  4285. return Error_code::SUCCESS;
  4286. }
  4287. else
  4288. {
  4289. return Error_manager(Error_code::POINTER_IS_NULL, Error_level::MINOR_ERROR,
  4290. " POINTER IS NULL ");
  4291. }
  4292. }
  4293. //发送调度总计划
  4294. Error_manager Dispatch_process::send_dispatch_plan_request_msg()
  4295. {
  4296. std::unique_lock<std::mutex> t_lock(m_lock);
  4297. m_dispatch_plan_request_msg.mutable_base_info()->set_msg_type(message::Message_type::eDispatch_plan_request_msg);
  4298. m_dispatch_plan_request_msg.mutable_base_info()->set_timeout_ms(m_timeout_ms);
  4299. m_dispatch_plan_request_msg.mutable_base_info()->set_sender(message::Communicator::eDispatch_manager);
  4300. m_dispatch_plan_request_msg.mutable_base_info()->set_receiver(message::Communicator::eDispatch_control);
  4301. m_dispatch_plan_request_msg.set_command_key(m_dispatch_request_msg.command_key());
  4302. m_dispatch_plan_request_msg.set_dispatch_task_type((message::Dispatch_task_type)m_dispatch_process_type);
  4303. m_dispatch_plan_request_msg.set_dispatch_source(m_dispatch_source);
  4304. m_dispatch_plan_request_msg.set_dispatch_destination(m_dispatch_destination);
  4305. //这里不写错误码
  4306. std::string t_msg = m_dispatch_plan_request_msg.SerializeAsString();
  4307. System_communication::get_instance_references().encapsulate_msg(t_msg);
  4308. return Error_code::SUCCESS;
  4309. }
  4310. //执行调度控制指令, 并根据完成情况给答复
  4311. Error_manager Dispatch_process::dispatch_control_motion()
  4312. {
  4313. Error_manager t_error;
  4314. std::unique_lock<std::mutex> t_lock(m_lock);
  4315. // m_result.error_manager_clear_all();
  4316. for (auto iter = m_dispatch_control_node_map.begin(); iter != m_dispatch_control_node_map.end(); ++iter)
  4317. {
  4318. switch ( iter->second.m_dispatch_control_status )
  4319. {
  4320. case DISPATCH_CONTROL_STATUS_UNKNOW:
  4321. case DISPATCH_CONTROL_CREATED:
  4322. case DISPATCH_CONTROL_READY:
  4323. {
  4324. t_error = wait_dispatch_control_request_msg(iter->first, iter->second);
  4325. if ( t_error == Error_code::SUCCESS)
  4326. {
  4327. //流程正常, 就进入完成状态,
  4328. iter->second.m_dispatch_control_status = DISPATCH_CONTROL_CONNECT_DEVICE;
  4329. }
  4330. //else 原地待命
  4331. break;
  4332. }
  4333. case DISPATCH_CONTROL_CONNECT_DEVICE:
  4334. {
  4335. //连接调度设备
  4336. t_error = connect_dispatch_device(iter->first, iter->second);
  4337. if ( t_error !=Error_code::SUCCESS)
  4338. {
  4339. iter->second.m_error = t_error;
  4340. iter->second.m_dispatch_control_status = DISPATCH_CONTROL_RESPONSE;
  4341. }
  4342. else
  4343. {
  4344. //流程正常, 就进入工作状态,
  4345. iter->second.m_dispatch_control_status = DISPATCH_CONTROL_WORKING;
  4346. iter->second.m_time_to_send_control_response = std::chrono::system_clock::now();
  4347. }
  4348. break;
  4349. }
  4350. case DISPATCH_CONTROL_WORKING:
  4351. {
  4352. //执行调度控制指令, 并根据完成情况给答复
  4353. t_error = excute_dispatch_control(iter->first, iter->second);
  4354. if ( t_error == Error_code::NODATA )
  4355. {
  4356. //继续 长流程, 什么也不做
  4357. if ( std::chrono::system_clock::now() - iter->second.m_time_to_send_control_response >= std::chrono::seconds(1) )
  4358. {
  4359. //发送调度控制答复, 发给调度控制的
  4360. t_error = send_dispatch_control_response_msg(iter->first, iter->second, message::E_TASK_WORKING);
  4361. iter->second.m_time_to_send_control_response = std::chrono::system_clock::now();
  4362. }
  4363. }
  4364. else
  4365. {
  4366. //长流程结束, 就答复 control_response_msg
  4367. // 注:这里执行调度控制, 即使报错了 也要答复给调度控制, 交给调度控制来进行决策.
  4368. iter->second.m_error = t_error;
  4369. iter->second.m_dispatch_control_status = DISPATCH_CONTROL_TASK_WITHDRAW;
  4370. }
  4371. break;
  4372. }
  4373. case DISPATCH_CONTROL_TASK_WITHDRAW://流程 收回任务单
  4374. {
  4375. //发送调度控制答复, 发给调度控制的
  4376. t_error = dispatch_control_withdraw_task(iter->first, iter->second);
  4377. //流程正常, 就进入等待状态, 等待调度控制发送动作指令
  4378. iter->second.m_dispatch_control_status = DISPATCH_CONTROL_RESPONSE;
  4379. break;
  4380. }
  4381. case DISPATCH_CONTROL_RESPONSE://流程 给调度控制答复
  4382. {
  4383. //发送调度控制答复, 发给调度控制的
  4384. t_error = send_dispatch_control_response_msg(iter->first, iter->second, message::E_TASK_OVER);
  4385. //流程正常, 就进入等待状态, 等待调度控制发送动作指令
  4386. iter->second.m_dispatch_control_status = DISPATCH_CONTROL_DISCONNECT_DEVICE;
  4387. break;
  4388. }
  4389. case DISPATCH_CONTROL_DISCONNECT_DEVICE://流程 解除设备
  4390. {
  4391. //断开调度设备, 释放任务单 与设备解除连接
  4392. t_error = disconnect_dispatch_device(iter->first, iter->second);
  4393. if ( t_error == Error_code::SUCCESS )
  4394. {
  4395. //流程正常, 就回到 等待状态, 等待调度控制发送动作指令
  4396. iter->second.m_error.error_manager_clear_all();
  4397. iter->second.m_dispatch_control_status = DISPATCH_CONTROL_READY;
  4398. }
  4399. //else 保持不变继续等待
  4400. break;
  4401. }
  4402. default:
  4403. {
  4404. break;
  4405. }
  4406. }
  4407. }
  4408. return Error_code::SUCCESS;
  4409. }
  4410. //等待控制指令
  4411. Error_manager Dispatch_process::wait_dispatch_control_request_msg(int dispatch_device_type, Dispatch_control_node & dispatch_control_node)
  4412. {
  4413. //key不相等 就表示 收到了新的控制指令
  4414. if ( dispatch_control_node.m_dispatch_control_request_msg.command_key() != dispatch_control_node.m_dispatch_control_response_msg.command_key() )
  4415. {
  4416. return Error_code::SUCCESS;
  4417. }
  4418. else
  4419. {
  4420. return Error_code::NODATA;
  4421. }
  4422. return Error_code::SUCCESS;
  4423. }
  4424. //连接调度设备, 创建新的任务单 与设备建立连接
  4425. Error_manager Dispatch_process::connect_dispatch_device(int dispatch_device_type, Dispatch_control_node & dispatch_control_node)
  4426. {
  4427. Error_manager t_error;
  4428. if ( dispatch_device_type == message::Dispatch_device_type::ROBOT_1 ||
  4429. dispatch_device_type == message::Dispatch_device_type::ROBOT_2 )
  4430. {
  4431. //找到对应的设备
  4432. if ( dispatch_device_type == message::Dispatch_device_type::ROBOT_1 )
  4433. {
  4434. dispatch_control_node.mp_dispatch_device = Dispatch_manager::get_instance_references().m_catcher_map[0];
  4435. }
  4436. if ( dispatch_device_type == message::Dispatch_device_type::ROBOT_2 )
  4437. {
  4438. dispatch_control_node.mp_dispatch_device = Dispatch_manager::get_instance_references().m_catcher_map[1];
  4439. }
  4440. Catcher* tp_catcher = (Catcher*)dispatch_control_node.mp_dispatch_device.get();
  4441. //检查设备状态
  4442. if ( tp_catcher->check_status() == Error_code::SUCCESS &&
  4443. tp_catcher->m_actual_device_status == Dispatch_device_base::HARDWARE_DEVICE_READY )
  4444. {
  4445. //创建任务单
  4446. dispatch_control_node.mp_dispatch_task = std::shared_ptr<Task_Base>(new Catcher_task);
  4447. dispatch_control_node.mp_dispatch_task->task_init(NULL,std::chrono::milliseconds(15000));
  4448. Catcher_task * tp_catcher_task = (Catcher_task *)dispatch_control_node.mp_dispatch_task.get();
  4449. //第一次发送 空的唯一码, 可以和设备建立联系
  4450. tp_catcher_task->m_request_key = "";
  4451. tp_catcher_task->m_request_x = tp_catcher->m_actual_x;
  4452. tp_catcher_task->m_request_y = tp_catcher->m_actual_y;
  4453. tp_catcher_task->m_request_b = tp_catcher->m_actual_b;
  4454. tp_catcher_task->m_request_z = tp_catcher->m_actual_z;
  4455. tp_catcher_task->m_request_d1 = tp_catcher->m_actual_d1;
  4456. tp_catcher_task->m_request_d2 = tp_catcher->m_actual_d2;
  4457. tp_catcher_task->m_request_wheelbase = Dispatch_coordinates::get_instance_references().m_default_wheelbase;
  4458. tp_catcher_task->m_request_clamp_motion = (Catcher_task::Clamp_motion)tp_catcher->m_actual_clamp_motion1;
  4459. t_error = tp_catcher->execute_task(dispatch_control_node.mp_dispatch_task, Dispatch_device_base::DISPATCH_TASK_ONE_LEVEL);
  4460. if ( t_error != Error_code::SUCCESS )
  4461. {
  4462. dispatch_control_node.m_error = t_error;
  4463. return t_error;
  4464. }
  4465. }
  4466. else
  4467. {
  4468. std::cout << " huli test :::: " << " 123123123123123123123 = " << 1233 << std::endl;
  4469. std::cout << " huli test :::: " << " tp_catcher->check_status() = " << tp_catcher->check_status().to_string() << std::endl;
  4470. std::cout << " huli test :::: " << " tp_catcher->m_actual_device_status = " << tp_catcher->m_actual_device_status << std::endl;
  4471. t_error = Error_manager(Error_code::DISPATCH_PROCESS_DEVICE_STATUS_ERROR, Error_level::MINOR_ERROR,
  4472. " tp_catcher->m_actual_device_status device_status error ");
  4473. dispatch_control_node.m_error = t_error;
  4474. return t_error;
  4475. }
  4476. //设置起点
  4477. dispatch_control_node.m_source_coordinates = Dispatch_coordinates::get_instance_references().m_catcher_coordinates_map[dispatch_control_node.m_dispatch_control_request_msg.dispatch_source()];
  4478. //设置终点
  4479. dispatch_control_node.m_destination_coordinates = Dispatch_coordinates::get_instance_references().m_catcher_coordinates_map[dispatch_control_node.m_dispatch_control_request_msg.dispatch_destination()];
  4480. std::cout << " huli test :::: " << " ---------------------------------------- = " << 123 << std::endl;
  4481. std::cout << " huli test :::: " << " dispatch_control_node.m_dispatch_control_request_msg.dispatch_destination() = " << dispatch_control_node.m_dispatch_control_request_msg.dispatch_destination() << std::endl;
  4482. std::cout << " huli test :::: " << " dispatch_control_node.m_destination_coordinates.x = " << dispatch_control_node.m_destination_coordinates.x << std::endl;
  4483. std::cout << " huli test :::: " << " dispatch_control_node.m_destination_coordinates.y = " << dispatch_control_node.m_destination_coordinates.y << std::endl;
  4484. std::cout << " huli test :::: " << " dispatch_control_node.m_destination_coordinates.z = " << dispatch_control_node.m_destination_coordinates.z << std::endl;
  4485. std::cout << " huli test :::: " << "*******************************************" << 123 << std::endl;
  4486. }
  4487. //搬运器的配置 准备工作
  4488. else if ( dispatch_device_type == message::Dispatch_device_type::CARRIER_1 ||
  4489. dispatch_device_type == message::Dispatch_device_type::CARRIER_2 ||
  4490. dispatch_device_type == message::Dispatch_device_type::CARRIER_3 )
  4491. {
  4492. //找到对应的设备
  4493. if ( dispatch_device_type == message::Dispatch_device_type::CARRIER_1 )
  4494. {
  4495. dispatch_control_node.mp_dispatch_device = Dispatch_manager::get_instance_references().m_carrier_map[0];
  4496. }
  4497. if ( dispatch_device_type == message::Dispatch_device_type::CARRIER_2 )
  4498. {
  4499. dispatch_control_node.mp_dispatch_device = Dispatch_manager::get_instance_references().m_carrier_map[1];
  4500. }
  4501. if ( dispatch_device_type == message::Dispatch_device_type::CARRIER_3 )
  4502. {
  4503. dispatch_control_node.mp_dispatch_device = Dispatch_manager::get_instance_references().m_carrier_map[2];
  4504. }
  4505. Carrier* tp_carrier = (Carrier*)dispatch_control_node.mp_dispatch_device.get();
  4506. //检查设备状态
  4507. if ( tp_carrier->check_status() == Error_code::SUCCESS &&
  4508. tp_carrier->m_actual_device_status == Dispatch_device_base::HARDWARE_DEVICE_READY )
  4509. {
  4510. //创建任务单
  4511. dispatch_control_node.mp_dispatch_task = std::shared_ptr<Task_Base>(new Carrier_task);
  4512. dispatch_control_node.mp_dispatch_task->task_init(NULL,std::chrono::milliseconds(15000));
  4513. Carrier_task * tp_carrier_task = (Carrier_task *)dispatch_control_node.mp_dispatch_task.get();
  4514. //第一次发送 空的唯一码, 可以和设备建立联系
  4515. tp_carrier_task->m_request_key = "";
  4516. tp_carrier_task->m_request_x = tp_carrier->m_actual_x;
  4517. tp_carrier_task->m_request_y = tp_carrier->m_actual_y;
  4518. tp_carrier_task->m_request_z = tp_carrier->m_actual_z;
  4519. tp_carrier_task->m_request_y1 = tp_carrier->m_actual_y1;
  4520. tp_carrier_task->m_request_y2 = tp_carrier->m_actual_y2;
  4521. tp_carrier_task->m_request_clamp_motion = (Carrier_task::Clamp_motion)tp_carrier->m_actual_clamp_motion1;
  4522. tp_carrier_task->m_request_joint_motion_x = (Carrier_task::Joint_motion)tp_carrier->m_actual_joint_motion_x1;
  4523. tp_carrier_task->m_request_joint_motion_y = Carrier_task::Joint_motion::E_JOINT_NO_ACTION;
  4524. tp_carrier_task->m_request_space_id = 0;
  4525. tp_carrier_task->m_request_floor_id = 0;
  4526. tp_carrier_task->m_request_wheelbase = Dispatch_coordinates::get_instance_references().m_default_wheelbase;
  4527. t_error = tp_carrier->execute_task(dispatch_control_node.mp_dispatch_task, Dispatch_device_base::DISPATCH_TASK_ONE_LEVEL);
  4528. if ( t_error != Error_code::SUCCESS )
  4529. {
  4530. dispatch_control_node.m_error = t_error;
  4531. return t_error;
  4532. }
  4533. }
  4534. else
  4535. {
  4536. std::cout << " huli test :::: " << " 123123123123123123123 = " << 4566 << std::endl;
  4537. std::cout << " huli test :::: " << " tp_carrier->check_status() = " << tp_carrier->check_status().to_string() << std::endl;
  4538. std::cout << " huli test :::: " << " tp_carrier->m_actual_device_status = " << tp_carrier->m_actual_device_status << std::endl;
  4539. t_error = Error_manager(Error_code::DISPATCH_PROCESS_DEVICE_STATUS_ERROR, Error_level::MINOR_ERROR,
  4540. " tp_carrier->m_actual_device_status device_status error ");
  4541. dispatch_control_node.m_error = t_error;
  4542. return t_error;
  4543. }
  4544. //设置起点
  4545. dispatch_control_node.m_source_coordinates = Dispatch_coordinates::get_instance_references().m_carrier_coordinates_map[dispatch_control_node.m_dispatch_control_request_msg.dispatch_source()];
  4546. //设置终点
  4547. dispatch_control_node.m_destination_coordinates = Dispatch_coordinates::get_instance_references().m_carrier_coordinates_map[dispatch_control_node.m_dispatch_control_request_msg.dispatch_destination()];
  4548. std::cout << " huli test :::: " << " ---------------------------------------- = " << 123 << std::endl;
  4549. std::cout << " huli test :::: " << " dispatch_control_node.m_dispatch_control_request_msg.dispatch_destination() = " << dispatch_control_node.m_dispatch_control_request_msg.dispatch_destination() << std::endl;
  4550. std::cout << " huli test :::: " << " dispatch_control_node.m_destination_coordinates.x = " << dispatch_control_node.m_destination_coordinates.x << std::endl;
  4551. std::cout << " huli test :::: " << " dispatch_control_node.m_destination_coordinates.y = " << dispatch_control_node.m_destination_coordinates.y << std::endl;
  4552. std::cout << " huli test :::: " << " dispatch_control_node.m_destination_coordinates.z = " << dispatch_control_node.m_destination_coordinates.z << std::endl;
  4553. std::cout << " huli test :::: " << "*******************************************" << 123 << std::endl;
  4554. }
  4555. else
  4556. {
  4557. t_error = Error_manager(Error_code::DISPATCH_PROCESS_DEVICE_TYPE_ERROR, Error_level::MINOR_ERROR,
  4558. " DISPATCH_PROCESS_DEVICE_TYPE_ERROR fun error ");
  4559. dispatch_control_node.m_error = t_error;
  4560. return t_error;
  4561. }
  4562. return Error_code::SUCCESS;
  4563. }
  4564. //执行调度控制指令, 并根据完成情况给答复
  4565. Error_manager Dispatch_process::excute_dispatch_control(int dispatch_device_type, Dispatch_control_node & dispatch_control_node)
  4566. {
  4567. Error_manager t_error;
  4568. if ( dispatch_device_type == message::Dispatch_device_type::ROBOT_1 ||
  4569. dispatch_device_type == message::Dispatch_device_type::ROBOT_2 )
  4570. {
  4571. Catcher_task * tp_catcher_task = (Catcher_task *)dispatch_control_node.mp_dispatch_task.get();
  4572. // while (1)
  4573. // {
  4574. // char in;
  4575. // std::cin >> in ;
  4576. // if ( in == 'p' )
  4577. // {
  4578. // break;
  4579. // }
  4580. // }
  4581. // std::cout << " huli test :::: " << "ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppp = " << tp_catcher_task->m_step << std::endl;
  4582. // std::cout << " huli test :::: " << "1111111 tp_catcher_task->m_step = " << tp_catcher_task->m_step << std::endl;
  4583. //设备的动作也使用外部的Main()的线程来循环
  4584. switch ( dispatch_control_node.m_dispatch_control_request_msg.dispatch_task_type() )
  4585. {
  4586. case message::Dispatch_task_type::ROBOT_CATCH_CAR_FROM_INLET:
  4587. {
  4588. t_error = excute_robot_catch_car_from_inlet(dispatch_control_node);
  4589. break;
  4590. }
  4591. case message::Dispatch_task_type::ROBOT_PUT_CAR_TO_CARRIER:
  4592. {
  4593. t_error = excute_robot_put_car_to_carrier(dispatch_control_node);
  4594. break;
  4595. }
  4596. case message::Dispatch_task_type::ROBOT_CATCH_CAR_FROM_CARRIER:
  4597. {
  4598. t_error = excute_robot_catch_car_from_carrier(dispatch_control_node);
  4599. break;
  4600. }
  4601. case message::Dispatch_task_type::ROBOT_PUT_CAR_TO_OUTLET:
  4602. {
  4603. t_error = excute_robot_put_car_to_outlet(dispatch_control_node);
  4604. break;
  4605. }
  4606. case message::Dispatch_task_type::ROBOT_MOVE:
  4607. {
  4608. t_error = excute_robot_move(dispatch_control_node);
  4609. break;
  4610. }
  4611. default:
  4612. {
  4613. return Error_manager(Error_code::DISPATCH_PROCESS_TASK_STATUS_ERROR, Error_level::MINOR_ERROR,
  4614. "Dispatch_process::excute_dispatch_control() fun error ");
  4615. break;
  4616. }
  4617. }
  4618. // std::cout << " huli test :::: " << "222222 tp_catcher_task->m_step = " << tp_catcher_task->m_step << std::endl;
  4619. // std::cout << " huli test :::: " << " t_error_catcher = " << t_error.to_string() << std::endl;
  4620. }
  4621. else if ( dispatch_device_type == message::Dispatch_device_type::CARRIER_1 ||
  4622. dispatch_device_type == message::Dispatch_device_type::CARRIER_2 ||
  4623. dispatch_device_type == message::Dispatch_device_type::CARRIER_3 )
  4624. {
  4625. Catcher_task *tp_carrier_task = (Catcher_task *) dispatch_control_node.mp_dispatch_task.get();
  4626. // while (1)
  4627. // {
  4628. // char in;
  4629. // std::cin >> in;
  4630. // if (in == 'l')
  4631. // {
  4632. // break;
  4633. // }
  4634. // }
  4635. // std::cout << " huli test :::: "
  4636. // << "lllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll = "
  4637. // << tp_carrier_task->m_step << std::endl;
  4638. // std::cout << " huli test :::: " << "3333333 tp_carrier_task->m_step = " << tp_carrier_task->m_step
  4639. // << std::endl;
  4640. //设备的动作也使用外部的Main()的线程来循环
  4641. switch (dispatch_control_node.m_dispatch_control_request_msg.dispatch_task_type())
  4642. {
  4643. case message::Dispatch_task_type::CARRIER_RECEIVE_CAR_FROM_ROBOT:
  4644. {
  4645. t_error = excute_carrier_receive_car_from_robot(dispatch_control_node);
  4646. break;
  4647. }
  4648. case message::Dispatch_task_type::CARRIER_STORE_CAR_TO_PARKINGSPACE:
  4649. {
  4650. t_error = excute_carrier_store_car_to_parkingspace(dispatch_control_node);
  4651. break;
  4652. }
  4653. case message::Dispatch_task_type::CARRIER_STORE_CAR_TO_PARKINGSPACE_EX:
  4654. {
  4655. t_error = excute_carrier_store_car_to_parkingspace_ex(dispatch_control_node);
  4656. break;
  4657. }
  4658. case message::Dispatch_task_type::CARRIER_PICKUP_CAR_FROM_PARKINGSPACE:
  4659. {
  4660. t_error = excute_carrier_pickup_car_from_parkingspace(dispatch_control_node);
  4661. break;
  4662. }
  4663. case message::Dispatch_task_type::CARRIER_PICKUP_CAR_FROM_PARKINGSPACE_EX:
  4664. {
  4665. t_error = excute_carrier_pickup_car_from_parkingspace_ex(dispatch_control_node);
  4666. break;
  4667. }
  4668. case message::Dispatch_task_type::CARRIER_DELIVER_CAR_TO_ROBOT:
  4669. {
  4670. t_error = excute_carrier_deliver_car_to_robot(dispatch_control_node);
  4671. break;
  4672. }
  4673. case message::Dispatch_task_type::CARRIER_MOVE:
  4674. {
  4675. t_error = excute_carrier_move(dispatch_control_node);
  4676. break;
  4677. }
  4678. default:
  4679. {
  4680. return Error_manager(Error_code::DISPATCH_PROCESS_TASK_STATUS_ERROR, Error_level::MINOR_ERROR,
  4681. "Dispatch_process::excute_dispatch_control() fun error ");
  4682. break;
  4683. }
  4684. }
  4685. // std::cout << " huli test :::: " << "44444444 tp_carrier_task->m_step = " << tp_carrier_task->m_step << std::endl;
  4686. // std::cout << " huli test :::: " << " t_error_carrier = " << t_error.to_string() << std::endl;
  4687. }
  4688. dispatch_control_node.m_error = t_error;
  4689. return t_error;
  4690. }
  4691. //流程通知设备 收回任务单
  4692. Error_manager Dispatch_process::dispatch_control_withdraw_task(int dispatch_device_type, Dispatch_control_node & dispatch_control_node)
  4693. {
  4694. if ( dispatch_control_node.mp_dispatch_device.get() != NULL && dispatch_control_node.mp_dispatch_task.get() != NULL )
  4695. {
  4696. dispatch_control_node.mp_dispatch_task->set_task_statu(Task_Base::Task_statu::TASK_WITHDRAW);
  4697. }
  4698. return Error_code::SUCCESS;
  4699. }
  4700. //发送调度控制答复, 发给调度控制的
  4701. Error_manager Dispatch_process::send_dispatch_control_response_msg(int dispatch_device_type, Dispatch_control_node & dispatch_control_node, message::Dispatch_device_task_status dispatch_device_task_status)
  4702. {
  4703. dispatch_control_node.m_dispatch_control_response_msg.mutable_base_info()->set_msg_type(message::Message_type::eDispatch_control_response_msg);
  4704. dispatch_control_node.m_dispatch_control_response_msg.mutable_base_info()->set_timeout_ms(dispatch_control_node.m_dispatch_control_request_msg.base_info().timeout_ms());
  4705. dispatch_control_node.m_dispatch_control_response_msg.mutable_base_info()->set_sender(message::Communicator::eDispatch_manager);
  4706. dispatch_control_node.m_dispatch_control_response_msg.mutable_base_info()->set_receiver(message::Communicator::eDispatch_control);
  4707. dispatch_control_node.m_dispatch_control_response_msg.set_command_key(dispatch_control_node.m_dispatch_control_request_msg.command_key());
  4708. dispatch_control_node.m_dispatch_control_response_msg.set_dispatch_task_type(dispatch_control_node.m_dispatch_control_request_msg.dispatch_task_type());
  4709. dispatch_control_node.m_dispatch_control_response_msg.set_dispatch_device_type(dispatch_control_node.m_dispatch_control_request_msg.dispatch_device_type());
  4710. dispatch_control_node.m_dispatch_control_response_msg.set_dispatch_source(dispatch_control_node.m_dispatch_control_request_msg.dispatch_source());
  4711. dispatch_control_node.m_dispatch_control_response_msg.set_dispatch_destination(dispatch_control_node.m_dispatch_control_request_msg.dispatch_destination());
  4712. dispatch_control_node.m_dispatch_control_response_msg.mutable_error_manager()->set_error_code(dispatch_control_node.m_error.get_error_code());
  4713. dispatch_control_node.m_dispatch_control_response_msg.mutable_error_manager()->set_error_level((message::Error_level)dispatch_control_node.m_error.get_error_level());
  4714. dispatch_control_node.m_dispatch_control_response_msg.mutable_error_manager()->set_error_description(dispatch_control_node.m_error.get_error_description());
  4715. dispatch_control_node.m_dispatch_control_response_msg.set_dispatch_device_target_status(dispatch_control_node.m_dispatch_control_request_msg.dispatch_device_target_status());
  4716. dispatch_control_node.m_dispatch_control_response_msg.set_dispatch_device_task_status(dispatch_device_task_status);
  4717. std::string t_msg = dispatch_control_node.m_dispatch_control_response_msg.SerializeAsString();
  4718. System_communication::get_instance_references().encapsulate_msg(t_msg);
  4719. if ( dispatch_device_task_status == message::Dispatch_device_task_status::E_TASK_OVER )
  4720. {
  4721. LOG(INFO) << " dispatch_control_node.m_dispatch_control_response_msg = "<< dispatch_control_node.m_dispatch_control_response_msg.DebugString() << " " << this;
  4722. }
  4723. return Error_code::SUCCESS;
  4724. }
  4725. //断开调度设备, 释放任务单 与设备解除连接
  4726. Error_manager Dispatch_process::disconnect_dispatch_device(int dispatch_device_type, Dispatch_control_node & dispatch_control_node)
  4727. {
  4728. if ( dispatch_control_node.mp_dispatch_device.get() != NULL && dispatch_control_node.mp_dispatch_task.get() != NULL )
  4729. {
  4730. if ( dispatch_control_node.mp_dispatch_task->get_task_statu() == Task_Base::Task_statu::TASK_FREE )
  4731. {
  4732. dispatch_control_node.mp_dispatch_task.reset();
  4733. dispatch_control_node.mp_dispatch_device.reset();
  4734. return Error_code::SUCCESS;
  4735. }
  4736. else
  4737. {
  4738. return Error_code::NODATA;
  4739. }
  4740. }
  4741. return Error_code::SUCCESS;
  4742. }
  4743. //等待调度总计划答复
  4744. Error_manager Dispatch_process::wait_dispatch_plan_response_msg()
  4745. {
  4746. std::unique_lock<std::mutex> t_lock(m_lock);
  4747. //key 相等 就表示 收到了总计划答复
  4748. if ( m_dispatch_plan_request_msg.command_key() == m_dispatch_plan_response_msg.command_key() )
  4749. {
  4750. return Error_code::SUCCESS;
  4751. }
  4752. else
  4753. {
  4754. return Error_code::NODATA;
  4755. }
  4756. }
  4757. //发送调度答复, 发给主控的
  4758. Error_manager Dispatch_process::send_dispatch_response_msg()
  4759. {
  4760. std::unique_lock<std::mutex> t_lock(m_lock);
  4761. m_dispatch_response_msg.mutable_base_info()->set_msg_type(message::Message_type::eDispatch_response_msg);
  4762. m_dispatch_response_msg.mutable_base_info()->set_timeout_ms(m_dispatch_request_msg.base_info().timeout_ms());
  4763. m_dispatch_response_msg.mutable_base_info()->set_sender(message::Communicator::eDispatch_manager);
  4764. m_dispatch_response_msg.mutable_base_info()->set_receiver(message::Communicator::eMain);
  4765. m_dispatch_response_msg.set_command_key(m_dispatch_request_msg.command_key());
  4766. m_dispatch_response_msg.mutable_error_manager()->CopyFrom(m_dispatch_plan_response_msg.error_manager());
  4767. std::string t_msg = m_dispatch_response_msg.SerializeAsString();
  4768. System_communication::get_instance_references().encapsulate_msg(t_msg);
  4769. return Error_code::SUCCESS;
  4770. }
  4771. //通知调度管理, 释放资源,
  4772. Error_manager Dispatch_process::release_resource()
  4773. {
  4774. return Dispatch_manager::get_instance_references().release_dispatch_process(m_command_key);
  4775. }
  4776. //异常处理
  4777. Error_manager Dispatch_process::Exception_handling()
  4778. {
  4779. LOG(INFO) << " -------------Dispatch_process::Exception_handling------------------- "<< this;
  4780. LOG(INFO) << " m_result = "<< m_result.to_string() << " " << this;
  4781. return Error_code::SUCCESS;
  4782. }
  4783. //机器手去入口抓车(例如:机器手移动到2号入口上方,然后下降到一楼抓车,最后上升到最上方)
  4784. Error_manager Dispatch_process::excute_robot_catch_car_from_inlet(Dispatch_control_node & dispatch_control_node)
  4785. {
  4786. Error_manager t_error;
  4787. Catcher * tp_catcher = NULL;
  4788. Catcher_task * tp_catcher_task = NULL;
  4789. Dispatch_coordinates * tp_dispatch_coordinates = Dispatch_coordinates::get_instance_pointer();
  4790. if ( dispatch_control_node.mp_dispatch_device.get() == NULL || dispatch_control_node.mp_dispatch_task.get() == NULL )
  4791. {
  4792. return Error_manager(Error_code::POINTER_IS_NULL, Error_level::MINOR_ERROR,
  4793. "Dispatch_process::excute_robot_catch_car_from_inlet() POINTER IS NULL ");
  4794. }
  4795. else
  4796. {
  4797. tp_catcher = (Catcher *)dispatch_control_node.mp_dispatch_device.get();
  4798. tp_catcher_task = (Catcher_task *)dispatch_control_node.mp_dispatch_task.get();
  4799. }
  4800. // std::cout << " huli test :::: " << " tp_catcher_task->m_step = " << tp_catcher_task->m_step << std::endl;
  4801. // getchar();
  4802. if ( tp_catcher_task->m_step == 0 )
  4803. {
  4804. return check_task_ex(dispatch_control_node.mp_dispatch_task, tp_catcher_task->m_step);
  4805. }
  4806. if ( tp_catcher_task->m_step == 1 )//检查姿态
  4807. {
  4808. if ( tp_catcher->m_actual_load_status == Dispatch_device_base::Load_status::NO_CAR )
  4809. {
  4810. if ( tp_catcher->m_actual_clamp_motion1 != Dispatch_device_base::Clamp_motion::E_CLAMP_LOOSE ||
  4811. tp_catcher->m_actual_d1 + tp_catcher->m_actual_d2 + tp_dispatch_coordinates->m_catcher_d1_d2_distance >
  4812. tp_dispatch_coordinates->m_catcher_wheel_base_limit ||
  4813. tp_catcher->m_catcher_direction == Dispatch_device_base::Catcher_direction::CATCHER_DIRECTION_UNKNOW )
  4814. {
  4815. catcher_adjust_to_ready(dispatch_control_node, tp_catcher, tp_catcher_task, tp_dispatch_coordinates);
  4816. tp_catcher_task->m_step++;
  4817. }
  4818. else
  4819. {
  4820. tp_catcher_task->m_step +=2;
  4821. }
  4822. }
  4823. else
  4824. {
  4825. return Error_manager(Error_code::CATCHER_POSE_ERROR, Error_level::MINOR_ERROR,
  4826. "Dispatch_process::excute_robot_catch_car_from_inlet() fun error ");
  4827. }
  4828. }
  4829. if ( tp_catcher_task->m_step == 2 )
  4830. {
  4831. return check_task_ex(dispatch_control_node.mp_dispatch_task, tp_catcher_task->m_step);
  4832. }
  4833. if ( tp_catcher_task->m_step == 3 )//机器手z轴移到最高点.
  4834. {
  4835. catcher_move_z(dispatch_control_node, tp_catcher, tp_catcher_task, tp_dispatch_coordinates, tp_dispatch_coordinates->m_catcher_4th_floor_z);
  4836. tp_catcher_task->m_step++;
  4837. }
  4838. if ( tp_catcher_task->m_step == 4 )
  4839. {
  4840. return check_task_ex(dispatch_control_node.mp_dispatch_task, tp_catcher_task->m_step);
  4841. }
  4842. if ( tp_catcher_task->m_step == 5 )//机器手 调整x y b d1 d2, 根据感测模块的定位信息, 调整机器手的姿态, 准备抓车.
  4843. {
  4844. catcher_adjust_from_ground(dispatch_control_node, tp_catcher, tp_catcher_task, tp_dispatch_coordinates);
  4845. tp_catcher_task->m_step++;
  4846. }
  4847. if ( tp_catcher_task->m_step == 6 )
  4848. {
  4849. return check_task_ex(dispatch_control_node.mp_dispatch_task, tp_catcher_task->m_step);
  4850. }
  4851. if ( tp_catcher_task->m_step == 7 )//机器手z轴移到最低点.
  4852. {
  4853. catcher_move_z(dispatch_control_node, tp_catcher, tp_catcher_task, tp_dispatch_coordinates, tp_dispatch_coordinates->m_catcher_1th_floor_z);
  4854. tp_catcher_task->m_step++;
  4855. }
  4856. if ( tp_catcher_task->m_step == 8 )
  4857. {
  4858. return check_task_ex(dispatch_control_node.mp_dispatch_task, tp_catcher_task->m_step);
  4859. }
  4860. if ( tp_catcher_task->m_step == 9 )//修正轴距, 如果轴距大于3000mm, 那么就要修正轴距.
  4861. {
  4862. float temp_wheel_base = tp_catcher->m_actual_d1 + tp_catcher->m_actual_d2 + tp_dispatch_coordinates->m_catcher_d1_d2_distance;
  4863. //修正轴距, 如果轴距大于3000mm, 那么就要修正轴距.
  4864. if ( Common_data::approximate_difference(m_wheel_base, temp_wheel_base, DISPATCH_DEFAULT_DIFFERENCE) )
  4865. {
  4866. tp_catcher_task->m_step +=2;
  4867. }
  4868. else
  4869. {
  4870. catcher_adjust_wheel_base(dispatch_control_node, tp_catcher, tp_catcher_task, tp_dispatch_coordinates);
  4871. tp_catcher_task->m_step++;
  4872. }
  4873. }
  4874. if ( tp_catcher_task->m_step == 10 )
  4875. {
  4876. return check_task_ex(dispatch_control_node.mp_dispatch_task, tp_catcher_task->m_step);
  4877. }
  4878. if ( tp_catcher_task->m_step == 11 )//机器手 夹车
  4879. {
  4880. catcher_move_c(dispatch_control_node, tp_catcher, tp_catcher_task, tp_dispatch_coordinates, Catcher_task::Clamp_motion::E_CLAMP_TIGHT);
  4881. tp_catcher_task->m_step++;
  4882. }
  4883. if ( tp_catcher_task->m_step == 12 )
  4884. {
  4885. return check_task_ex(dispatch_control_node.mp_dispatch_task, tp_catcher_task->m_step);
  4886. }
  4887. if ( tp_catcher_task->m_step == 13 )//机器手 z轴上升到最高处
  4888. {
  4889. catcher_move_z(dispatch_control_node, tp_catcher, tp_catcher_task, tp_dispatch_coordinates, tp_dispatch_coordinates->m_catcher_4th_floor_z);
  4890. tp_catcher_task->m_step++;
  4891. }
  4892. if ( tp_catcher_task->m_step == 14 )
  4893. {
  4894. return check_task_ex(dispatch_control_node.mp_dispatch_task, tp_catcher_task->m_step);
  4895. }
  4896. if ( tp_catcher_task->m_step == 15 )//机器手调整到 准备把车放到搬运器的姿态
  4897. {
  4898. //这里机器手要反向,
  4899. catcher_adjust_to_carrier(dispatch_control_node, tp_catcher, tp_catcher_task, tp_dispatch_coordinates, true);
  4900. tp_catcher_task->m_step++;
  4901. }
  4902. if ( tp_catcher_task->m_step == 16 )
  4903. {
  4904. return check_task_ex(dispatch_control_node.mp_dispatch_task, tp_catcher_task->m_step);
  4905. }
  4906. if ( tp_catcher_task->m_step == 17 )
  4907. {
  4908. return Error_code::SUCCESS;
  4909. }
  4910. return Error_code::SUCCESS;
  4911. }
  4912. //机器手把车放到中跑车上面(例如:机器手下降到中跑车上放车,最后上升到最上方)(通过目标点 指定放到哪一个中跑车上)
  4913. Error_manager Dispatch_process::excute_robot_put_car_to_carrier(Dispatch_control_node & dispatch_control_node)
  4914. {
  4915. Error_manager t_error;
  4916. Catcher * tp_catcher = NULL;
  4917. Catcher_task * tp_catcher_task = NULL;
  4918. Dispatch_coordinates * tp_dispatch_coordinates = Dispatch_coordinates::get_instance_pointer();
  4919. if ( dispatch_control_node.mp_dispatch_device.get() == NULL || dispatch_control_node.mp_dispatch_task.get() == NULL )
  4920. {
  4921. return Error_manager(Error_code::POINTER_IS_NULL, Error_level::MINOR_ERROR,
  4922. "Dispatch_process::excute_robot_catch_car_from_inlet() POINTER IS NULL ");
  4923. }
  4924. else
  4925. {
  4926. tp_catcher = (Catcher *)dispatch_control_node.mp_dispatch_device.get();
  4927. tp_catcher_task = (Catcher_task *)dispatch_control_node.mp_dispatch_task.get();
  4928. }
  4929. // std::cout << " huli test :::: " << " tp_catcher_task->m_step = " << tp_catcher_task->m_step << std::endl;
  4930. // getchar();
  4931. if ( tp_catcher_task->m_step == 0 )
  4932. {
  4933. return check_task_ex(dispatch_control_node.mp_dispatch_task, tp_catcher_task->m_step);
  4934. }
  4935. if ( tp_catcher_task->m_step == 1 )//检查姿态
  4936. {
  4937. if ( tp_catcher->m_actual_load_status == Dispatch_device_base::Load_status::HAVE_CAR &&
  4938. tp_catcher->m_actual_clamp_motion1 == Dispatch_device_base::Clamp_motion::E_CLAMP_TIGHT &&
  4939. (Common_data::approximate_difference(tp_catcher->m_actual_b, 90, DISPATCH_DEFAULT_DIFFERENCE) || Common_data::approximate_difference(tp_catcher->m_actual_b, 270, DISPATCH_DEFAULT_DIFFERENCE) ) )
  4940. {
  4941. //检测正常, 直接跳过即可
  4942. tp_catcher_task->m_step +=2;
  4943. }
  4944. else
  4945. {
  4946. return Error_manager(Error_code::CATCHER_POSE_ERROR, Error_level::MINOR_ERROR,
  4947. "Dispatch_process::excute_robot_put_car_to_carrier() fun error ");
  4948. }
  4949. }
  4950. if ( tp_catcher_task->m_step == 2 )
  4951. {
  4952. return check_task_ex(dispatch_control_node.mp_dispatch_task, tp_catcher_task->m_step);
  4953. }
  4954. if ( tp_catcher_task->m_step == 3 )//机器手 调整z轴
  4955. {
  4956. if ( tp_catcher->m_actual_z*1.02 >= tp_dispatch_coordinates->m_catcher_4th_floor_z )
  4957. {
  4958. //检测正常, 直接跳过即可
  4959. tp_catcher_task->m_step +=2;
  4960. }
  4961. else
  4962. {
  4963. catcher_move_z(dispatch_control_node, tp_catcher, tp_catcher_task, tp_dispatch_coordinates, tp_dispatch_coordinates->m_catcher_4th_floor_z);
  4964. tp_catcher_task->m_step++;
  4965. }
  4966. }
  4967. if ( tp_catcher_task->m_step == 4 )
  4968. {
  4969. return check_task_ex(dispatch_control_node.mp_dispatch_task, tp_catcher_task->m_step);
  4970. }
  4971. if ( tp_catcher_task->m_step == 5 )//机器手调整到 准备把车放到搬运器的姿态
  4972. {
  4973. float temp_y = tp_dispatch_coordinates->m_carrier_default_y1_back - (m_wheel_base /2);
  4974. if ( Common_data::approximate_difference(tp_catcher->m_actual_x, dispatch_control_node.m_destination_coordinates.x, DISPATCH_DEFAULT_DIFFERENCE) &&
  4975. Common_data::approximate_difference(tp_catcher->m_actual_y, temp_y, DISPATCH_DEFAULT_DIFFERENCE))
  4976. {
  4977. //检测正常, 直接跳过即可
  4978. tp_catcher_task->m_step +=2;
  4979. }
  4980. else
  4981. {
  4982. catcher_adjust_to_carrier(dispatch_control_node, tp_catcher, tp_catcher_task, tp_dispatch_coordinates, false);
  4983. tp_catcher_task->m_step++;
  4984. }
  4985. }
  4986. if ( tp_catcher_task->m_step == 6 )
  4987. {
  4988. return check_task_ex(dispatch_control_node.mp_dispatch_task, tp_catcher_task->m_step);
  4989. }
  4990. if ( tp_catcher_task->m_step == 7 )//机器手 z轴下降
  4991. {
  4992. catcher_move_z(dispatch_control_node, tp_catcher, tp_catcher_task, tp_dispatch_coordinates, dispatch_control_node.m_destination_coordinates.z);
  4993. tp_catcher_task->m_step++;
  4994. }
  4995. if ( tp_catcher_task->m_step == 8 )
  4996. {
  4997. return check_task_ex(dispatch_control_node.mp_dispatch_task, tp_catcher_task->m_step);
  4998. }
  4999. if ( tp_catcher_task->m_step == 9 )//机器手 松开夹杆
  5000. {
  5001. catcher_move_c(dispatch_control_node, tp_catcher, tp_catcher_task, tp_dispatch_coordinates, Catcher_task::Clamp_motion::E_CLAMP_LOOSE);
  5002. tp_catcher_task->m_step++;
  5003. }
  5004. if ( tp_catcher_task->m_step == 10 )
  5005. {
  5006. return check_task_ex(dispatch_control_node.mp_dispatch_task, tp_catcher_task->m_step);
  5007. }
  5008. if ( tp_catcher_task->m_step == 11 )//机器手 z轴上升
  5009. {
  5010. catcher_move_z(dispatch_control_node, tp_catcher, tp_catcher_task, tp_dispatch_coordinates, tp_dispatch_coordinates->m_catcher_4th_floor_z);
  5011. tp_catcher_task->m_step++;
  5012. }
  5013. if ( tp_catcher_task->m_step == 12 )
  5014. {
  5015. return check_task_ex(dispatch_control_node.mp_dispatch_task, tp_catcher_task->m_step);
  5016. }
  5017. if ( tp_catcher_task->m_step == 13 )
  5018. {
  5019. return Error_code::SUCCESS;
  5020. }
  5021. return Error_code::SUCCESS;
  5022. }
  5023. //机器手去中跑车上抓车(例如:机器手移动到1号中跑车上方,然后下降到中跑车抓车,最后上升到最上方)
  5024. Error_manager Dispatch_process::excute_robot_catch_car_from_carrier(Dispatch_control_node & dispatch_control_node)
  5025. {
  5026. Error_manager t_error;
  5027. Catcher * tp_catcher = NULL;
  5028. Catcher_task * tp_catcher_task = NULL;
  5029. Dispatch_coordinates * tp_dispatch_coordinates = Dispatch_coordinates::get_instance_pointer();
  5030. if ( dispatch_control_node.mp_dispatch_device.get() == NULL || dispatch_control_node.mp_dispatch_task.get() == NULL )
  5031. {
  5032. return Error_manager(Error_code::POINTER_IS_NULL, Error_level::MINOR_ERROR,
  5033. "Dispatch_process::excute_robot_catch_car_from_inlet() POINTER IS NULL ");
  5034. }
  5035. else
  5036. {
  5037. tp_catcher = (Catcher *)dispatch_control_node.mp_dispatch_device.get();
  5038. tp_catcher_task = (Catcher_task *)dispatch_control_node.mp_dispatch_task.get();
  5039. }
  5040. // std::cout << " huli test :::: " << " tp_catcher_task->m_step = " << tp_catcher_task->m_step << std::endl;
  5041. // getchar();
  5042. if ( tp_catcher_task->m_step == 0 )
  5043. {
  5044. return check_task_ex(dispatch_control_node.mp_dispatch_task, tp_catcher_task->m_step);
  5045. }
  5046. if ( tp_catcher_task->m_step == 1 )
  5047. {
  5048. if ( tp_catcher->m_actual_load_status == Dispatch_device_base::Load_status::NO_CAR )
  5049. {
  5050. if ( tp_catcher->m_actual_clamp_motion1 != Dispatch_device_base::Clamp_motion::E_CLAMP_LOOSE ||
  5051. tp_catcher->m_actual_d1 + tp_catcher->m_actual_d2 + tp_dispatch_coordinates->m_catcher_d1_d2_distance >
  5052. tp_dispatch_coordinates->m_catcher_wheel_base_limit ||
  5053. tp_catcher->m_catcher_direction == Dispatch_device_base::Catcher_direction::CATCHER_DIRECTION_UNKNOW )
  5054. {
  5055. catcher_adjust_to_ready(dispatch_control_node, tp_catcher, tp_catcher_task, tp_dispatch_coordinates);
  5056. tp_catcher_task->m_step++;
  5057. }
  5058. else
  5059. {
  5060. tp_catcher_task->m_step +=2;
  5061. }
  5062. }
  5063. else
  5064. {
  5065. return Error_manager(Error_code::CATCHER_POSE_ERROR, Error_level::MINOR_ERROR,
  5066. "Dispatch_process::excute_robot_catch_car_from_carrier() fun error ");
  5067. }
  5068. }
  5069. if ( tp_catcher_task->m_step == 2 )
  5070. {
  5071. return check_task_ex(dispatch_control_node.mp_dispatch_task, tp_catcher_task->m_step);
  5072. }
  5073. if ( tp_catcher_task->m_step == 3 )//机器手 调整z轴
  5074. {
  5075. if ( tp_catcher->m_actual_z*1.02 >= tp_dispatch_coordinates->m_catcher_4th_floor_z )
  5076. {
  5077. //检测正常, 直接跳过即可
  5078. tp_catcher_task->m_step +=2;
  5079. }
  5080. else
  5081. {
  5082. catcher_move_z(dispatch_control_node, tp_catcher, tp_catcher_task, tp_dispatch_coordinates, tp_dispatch_coordinates->m_catcher_4th_floor_z);
  5083. tp_catcher_task->m_step++;
  5084. }
  5085. }
  5086. if ( tp_catcher_task->m_step == 4 )
  5087. {
  5088. return check_task_ex(dispatch_control_node.mp_dispatch_task, tp_catcher_task->m_step);
  5089. }
  5090. if ( tp_catcher_task->m_step == 5 )//机器手调整到 准备把车放到搬运器的姿态
  5091. {
  5092. float temp_y = tp_dispatch_coordinates->m_carrier_default_y1_back - (m_wheel_base /2);
  5093. if ( Common_data::approximate_difference(tp_catcher->m_actual_x, dispatch_control_node.m_destination_coordinates.x, DISPATCH_DEFAULT_DIFFERENCE) &&
  5094. Common_data::approximate_difference(tp_catcher->m_actual_y, temp_y, DISPATCH_DEFAULT_DIFFERENCE))
  5095. {
  5096. //检测正常, 直接跳过即可
  5097. tp_catcher_task->m_step +=2;
  5098. }
  5099. else
  5100. {
  5101. catcher_adjust_from_carrier(dispatch_control_node, tp_catcher, tp_catcher_task, tp_dispatch_coordinates);
  5102. tp_catcher_task->m_step++;
  5103. }
  5104. }
  5105. if ( tp_catcher_task->m_step == 6 )
  5106. {
  5107. return check_task_ex(dispatch_control_node.mp_dispatch_task, tp_catcher_task->m_step);
  5108. }
  5109. if ( tp_catcher_task->m_step == 7 )//机器手 z轴下降
  5110. {
  5111. catcher_move_z(dispatch_control_node, tp_catcher, tp_catcher_task, tp_dispatch_coordinates, dispatch_control_node.m_destination_coordinates.z);
  5112. tp_catcher_task->m_step++;
  5113. }
  5114. if ( tp_catcher_task->m_step == 8 )
  5115. {
  5116. return check_task_ex(dispatch_control_node.mp_dispatch_task, tp_catcher_task->m_step);
  5117. }
  5118. if ( tp_catcher_task->m_step == 9 )//修正轴距, 如果轴距大于3000mm, 那么就要修正轴距.
  5119. {
  5120. float temp_wheel_base = tp_catcher->m_actual_d1 + tp_catcher->m_actual_d2 + tp_dispatch_coordinates->m_catcher_d1_d2_distance;
  5121. //修正轴距, 如果轴距大于3000mm, 那么就要修正轴距.
  5122. if ( Common_data::approximate_difference(m_wheel_base, temp_wheel_base, DISPATCH_DEFAULT_DIFFERENCE) )
  5123. {
  5124. tp_catcher_task->m_step +=2;
  5125. }
  5126. else
  5127. {
  5128. catcher_adjust_wheel_base(dispatch_control_node, tp_catcher, tp_catcher_task, tp_dispatch_coordinates);
  5129. tp_catcher_task->m_step++;
  5130. }
  5131. }
  5132. if ( tp_catcher_task->m_step == 10 )
  5133. {
  5134. return check_task_ex(dispatch_control_node.mp_dispatch_task, tp_catcher_task->m_step);
  5135. }
  5136. if ( tp_catcher_task->m_step == 11 )//机器手 夹车
  5137. {
  5138. catcher_move_c(dispatch_control_node, tp_catcher, tp_catcher_task, tp_dispatch_coordinates, Catcher_task::Clamp_motion::E_CLAMP_TIGHT);
  5139. tp_catcher_task->m_step++;
  5140. }
  5141. if ( tp_catcher_task->m_step == 12 )
  5142. {
  5143. return check_task_ex(dispatch_control_node.mp_dispatch_task, tp_catcher_task->m_step);
  5144. }
  5145. if ( tp_catcher_task->m_step == 13 )//机器手 z轴上升
  5146. {
  5147. catcher_move_z(dispatch_control_node, tp_catcher, tp_catcher_task, tp_dispatch_coordinates, tp_dispatch_coordinates->m_catcher_4th_floor_z);
  5148. tp_catcher_task->m_step++;
  5149. }
  5150. if ( tp_catcher_task->m_step == 14 )
  5151. {
  5152. return check_task_ex(dispatch_control_node.mp_dispatch_task, tp_catcher_task->m_step);
  5153. }
  5154. if ( tp_catcher_task->m_step == 15 )
  5155. {
  5156. return Error_code::SUCCESS;
  5157. }
  5158. return Error_code::SUCCESS;
  5159. }
  5160. //机器手去出口放车(例如:机器手移动到3号出口上方,然后下降到一楼放车,最后上升到最上方)
  5161. Error_manager Dispatch_process::excute_robot_put_car_to_outlet(Dispatch_control_node & dispatch_control_node)
  5162. {
  5163. Error_manager t_error;
  5164. Catcher * tp_catcher = NULL;
  5165. Catcher_task * tp_catcher_task = NULL;
  5166. Dispatch_coordinates * tp_dispatch_coordinates = Dispatch_coordinates::get_instance_pointer();
  5167. if ( dispatch_control_node.mp_dispatch_device.get() == NULL || dispatch_control_node.mp_dispatch_task.get() == NULL )
  5168. {
  5169. return Error_manager(Error_code::POINTER_IS_NULL, Error_level::MINOR_ERROR,
  5170. "Dispatch_process::excute_robot_catch_car_from_inlet() POINTER IS NULL ");
  5171. }
  5172. else
  5173. {
  5174. tp_catcher = (Catcher *)dispatch_control_node.mp_dispatch_device.get();
  5175. tp_catcher_task = (Catcher_task *)dispatch_control_node.mp_dispatch_task.get();
  5176. }
  5177. // std::cout << " huli test :::: " << " tp_catcher_task->m_step = " << tp_catcher_task->m_step << std::endl;
  5178. // getchar();
  5179. if ( tp_catcher_task->m_step == 0 )
  5180. {
  5181. return check_task_ex(dispatch_control_node.mp_dispatch_task, tp_catcher_task->m_step);
  5182. }
  5183. if ( tp_catcher_task->m_step == 1 )//检查姿态
  5184. {
  5185. if ( tp_catcher->m_actual_load_status == Dispatch_device_base::Load_status::HAVE_CAR &&
  5186. tp_catcher->m_actual_clamp_motion1 == Dispatch_device_base::Clamp_motion::E_CLAMP_TIGHT &&
  5187. (Common_data::approximate_difference(tp_catcher->m_actual_b, 90, DISPATCH_DEFAULT_DIFFERENCE) || Common_data::approximate_difference(tp_catcher->m_actual_b, 270, DISPATCH_DEFAULT_DIFFERENCE) ) )
  5188. {
  5189. //检测正常, 直接跳过即可
  5190. tp_catcher_task->m_step +=2;
  5191. }
  5192. else
  5193. {
  5194. return Error_manager(Error_code::CATCHER_POSE_ERROR, Error_level::MINOR_ERROR,
  5195. "Dispatch_process::excute_robot_put_car_to_carrier() fun error ");
  5196. }
  5197. }
  5198. if ( tp_catcher_task->m_step == 2 )
  5199. {
  5200. return check_task_ex(dispatch_control_node.mp_dispatch_task, tp_catcher_task->m_step);
  5201. }
  5202. if ( tp_catcher_task->m_step == 3 )//机器手 调整z轴
  5203. {
  5204. if ( tp_catcher->m_actual_z*1.02 >= tp_dispatch_coordinates->m_catcher_4th_floor_z )
  5205. {
  5206. //检测正常, 直接跳过即可
  5207. tp_catcher_task->m_step +=2;
  5208. }
  5209. else
  5210. {
  5211. catcher_move_z(dispatch_control_node, tp_catcher, tp_catcher_task, tp_dispatch_coordinates, tp_dispatch_coordinates->m_catcher_4th_floor_z);
  5212. tp_catcher_task->m_step++;
  5213. }
  5214. }
  5215. if ( tp_catcher_task->m_step == 4 )
  5216. {
  5217. return check_task_ex(dispatch_control_node.mp_dispatch_task, tp_catcher_task->m_step);
  5218. }
  5219. if ( tp_catcher_task->m_step == 5 )//机器手调整到 准备把车放到地面的姿态
  5220. {
  5221. if ( Common_data::approximate_difference(tp_catcher->m_actual_x, dispatch_control_node.m_destination_coordinates.x, DISPATCH_DEFAULT_DIFFERENCE) &&
  5222. Common_data::approximate_difference(tp_catcher->m_actual_y, dispatch_control_node.m_destination_coordinates.y, DISPATCH_DEFAULT_DIFFERENCE))
  5223. {
  5224. //检测正常, 直接跳过即可
  5225. tp_catcher_task->m_step +=2;
  5226. }
  5227. else
  5228. {
  5229. catcher_adjust_to_ground(dispatch_control_node, tp_catcher, tp_catcher_task, tp_dispatch_coordinates);
  5230. tp_catcher_task->m_step++;
  5231. }
  5232. }
  5233. if ( tp_catcher_task->m_step == 6 )
  5234. {
  5235. return check_task_ex(dispatch_control_node.mp_dispatch_task, tp_catcher_task->m_step);
  5236. }
  5237. if ( tp_catcher_task->m_step == 7 )//机器手 z轴下降
  5238. {
  5239. catcher_move_z(dispatch_control_node, tp_catcher, tp_catcher_task, tp_dispatch_coordinates, dispatch_control_node.m_destination_coordinates.z);
  5240. tp_catcher_task->m_step++;
  5241. }
  5242. if ( tp_catcher_task->m_step == 8 )
  5243. {
  5244. return check_task_ex(dispatch_control_node.mp_dispatch_task, tp_catcher_task->m_step);
  5245. }
  5246. if ( tp_catcher_task->m_step == 9 )//机器手 松开夹杆
  5247. {
  5248. catcher_move_c(dispatch_control_node, tp_catcher, tp_catcher_task, tp_dispatch_coordinates, Catcher_task::Clamp_motion::E_CLAMP_LOOSE);
  5249. tp_catcher_task->m_step++;
  5250. }
  5251. if ( tp_catcher_task->m_step == 10 )
  5252. {
  5253. return check_task_ex(dispatch_control_node.mp_dispatch_task, tp_catcher_task->m_step);
  5254. }
  5255. if ( tp_catcher_task->m_step == 11 )//机器手 z轴上升
  5256. {
  5257. catcher_move_z(dispatch_control_node, tp_catcher, tp_catcher_task, tp_dispatch_coordinates, tp_dispatch_coordinates->m_catcher_4th_floor_z);
  5258. tp_catcher_task->m_step++;
  5259. }
  5260. if ( tp_catcher_task->m_step == 12 )
  5261. {
  5262. return check_task_ex(dispatch_control_node.mp_dispatch_task, tp_catcher_task->m_step);
  5263. }
  5264. if ( tp_catcher_task->m_step == 13 )
  5265. {
  5266. return Error_code::SUCCESS;
  5267. }
  5268. return Error_code::SUCCESS;
  5269. }
  5270. //机器手的自由移动(例如:机器手移动到6号出入口的上方4楼处,给其他设备避让)(不进行抓车和放车的操作)
  5271. Error_manager Dispatch_process::excute_robot_move(Dispatch_control_node & dispatch_control_node)
  5272. {
  5273. Error_manager t_error;
  5274. Catcher * tp_catcher = NULL;
  5275. Catcher_task * tp_catcher_task = NULL;
  5276. Dispatch_coordinates * tp_dispatch_coordinates = Dispatch_coordinates::get_instance_pointer();
  5277. if ( dispatch_control_node.mp_dispatch_device.get() == NULL || dispatch_control_node.mp_dispatch_task.get() == NULL )
  5278. {
  5279. return Error_manager(Error_code::POINTER_IS_NULL, Error_level::MINOR_ERROR,
  5280. "Dispatch_process::excute_robot_catch_car_from_inlet() POINTER IS NULL ");
  5281. }
  5282. else
  5283. {
  5284. tp_catcher = (Catcher *)dispatch_control_node.mp_dispatch_device.get();
  5285. tp_catcher_task = (Catcher_task *)dispatch_control_node.mp_dispatch_task.get();
  5286. }
  5287. if ( tp_catcher_task->m_step == 0 )
  5288. {
  5289. return check_task_ex(dispatch_control_node.mp_dispatch_task, tp_catcher_task->m_step);
  5290. }
  5291. if ( tp_catcher_task->m_step == 1 )//检查姿态
  5292. {
  5293. if ( tp_catcher->m_actual_d1 + tp_catcher->m_actual_d2 + tp_dispatch_coordinates->m_catcher_d1_d2_distance >
  5294. tp_dispatch_coordinates->m_catcher_wheel_base_limit ||
  5295. tp_catcher->m_catcher_direction == Dispatch_device_base::Catcher_direction::CATCHER_DIRECTION_UNKNOW )
  5296. {
  5297. catcher_adjust_to_ready(dispatch_control_node, tp_catcher, tp_catcher_task, tp_dispatch_coordinates);
  5298. tp_catcher_task->m_step++;
  5299. }
  5300. else
  5301. {
  5302. tp_catcher_task->m_step +=2;
  5303. }
  5304. }
  5305. if ( tp_catcher_task->m_step == 2 )
  5306. {
  5307. return check_task_ex(dispatch_control_node.mp_dispatch_task, tp_catcher_task->m_step);
  5308. }
  5309. if ( tp_catcher_task->m_step == 3 )//机器手 调整z轴
  5310. {
  5311. catcher_move_z(dispatch_control_node, tp_catcher, tp_catcher_task, tp_dispatch_coordinates, dispatch_control_node.m_destination_coordinates.z);
  5312. tp_catcher_task->m_step++;
  5313. }
  5314. if ( tp_catcher_task->m_step == 4 )
  5315. {
  5316. return check_task_ex(dispatch_control_node.mp_dispatch_task, tp_catcher_task->m_step);
  5317. }
  5318. if ( tp_catcher_task->m_step == 5 )//机器手调整到 准备把车放到地面的姿态
  5319. {
  5320. catcher_adjust_to_ground(dispatch_control_node, tp_catcher, tp_catcher_task, tp_dispatch_coordinates);
  5321. tp_catcher_task->m_step++;
  5322. }
  5323. if ( tp_catcher_task->m_step == 6 )
  5324. {
  5325. return check_task_ex(dispatch_control_node.mp_dispatch_task, tp_catcher_task->m_step);
  5326. }
  5327. if ( tp_catcher_task->m_step == 7 )
  5328. {
  5329. return Error_code::SUCCESS;
  5330. }
  5331. return Error_code::SUCCESS;
  5332. }
  5333. //搬运器从机器手上接车(例如:搬运器移动到2号入口的上方,然后等待机器手把车放到中跑车上,小跑车保持松夹杆状态)
  5334. Error_manager Dispatch_process::excute_carrier_receive_car_from_robot(Dispatch_control_node & dispatch_control_node)
  5335. {
  5336. Error_manager t_error;
  5337. Carrier * tp_carrier = NULL;
  5338. Carrier_task * tp_carrier_task = NULL;
  5339. Dispatch_coordinates * tp_dispatch_coordinates = Dispatch_coordinates::get_instance_pointer();
  5340. if ( dispatch_control_node.mp_dispatch_device.get() == NULL || dispatch_control_node.mp_dispatch_task.get() == NULL )
  5341. {
  5342. return Error_manager(Error_code::POINTER_IS_NULL, Error_level::MINOR_ERROR,
  5343. "Dispatch_process::excute_robot_catch_car_from_inlet() POINTER IS NULL ");
  5344. }
  5345. else
  5346. {
  5347. tp_carrier = (Carrier *)dispatch_control_node.mp_dispatch_device.get();
  5348. tp_carrier_task = (Carrier_task *)dispatch_control_node.mp_dispatch_task.get();
  5349. }
  5350. // std::cout << " huli test :::: " << " tp_catcher_task->m_step = " << tp_carrier_task->m_step << std::endl;
  5351. // getchar();
  5352. if ( tp_carrier_task->m_step == 0 )
  5353. {
  5354. return check_task_ex(dispatch_control_node.mp_dispatch_task, tp_carrier_task->m_step);
  5355. }
  5356. if ( tp_carrier_task->m_step == 1 )//检查姿态
  5357. {
  5358. //检查姿态
  5359. if ( tp_carrier->m_actual_load_status == Dispatch_device_base::Load_status::NO_CAR )
  5360. {
  5361. if ( tp_carrier_task->m_request_clamp_motion == Carrier_task::Clamp_motion::E_CLAMP_LOOSE &&
  5362. Common_data::approximate_difference(m_wheel_base, tp_carrier->m_actual_y1-tp_carrier->m_actual_y2, DISPATCH_DEFAULT_DIFFERENCE))
  5363. {
  5364. tp_carrier_task->m_step +=2;
  5365. }
  5366. else
  5367. {
  5368. carrier_adjust_to_ready(dispatch_control_node, tp_carrier, tp_carrier_task, tp_dispatch_coordinates);
  5369. tp_carrier_task->m_step++;
  5370. }
  5371. }
  5372. else
  5373. {
  5374. return Error_manager(Error_code::CARRIER_POSE_ERROR, Error_level::MINOR_ERROR,
  5375. "tp_carrier->m_actual_load_status != Dispatch_device_base::Load_status::NO_CAR fun error ");
  5376. }
  5377. }
  5378. if ( tp_carrier_task->m_step == 2 )
  5379. {
  5380. return check_task_ex(dispatch_control_node.mp_dispatch_task, tp_carrier_task->m_step);
  5381. }
  5382. if ( tp_carrier_task->m_step == 3 )//让小跑车回到中跑车上
  5383. {
  5384. if ( Common_data::approximate_difference(tp_carrier->m_actual_y, tp_dispatch_coordinates->m_carrier_default_y_back, DISPATCH_DEFAULT_DIFFERENCE) )
  5385. {
  5386. tp_carrier_task->m_step +=2;
  5387. }
  5388. else
  5389. {
  5390. carrier_move_y(dispatch_control_node, tp_carrier, tp_carrier_task, tp_dispatch_coordinates, tp_dispatch_coordinates->m_carrier_default_y_back);
  5391. tp_carrier_task->m_step++;
  5392. }
  5393. }
  5394. if ( tp_carrier_task->m_step == 4 )
  5395. {
  5396. return check_task_ex(dispatch_control_node.mp_dispatch_task, tp_carrier_task->m_step);
  5397. }
  5398. if ( tp_carrier_task->m_step == 5 )//让中跑车回到电梯井
  5399. {
  5400. if ( Common_data::approximate_difference(tp_carrier->m_actual_z, dispatch_control_node.m_destination_coordinates.z, DISPATCH_DEFAULT_DIFFERENCE) )
  5401. {
  5402. tp_carrier_task->m_step +=2;
  5403. }
  5404. else
  5405. {
  5406. if ( dispatch_control_node.mp_dispatch_device->get_device_id() == 0 )
  5407. {
  5408. carrier_move_x(dispatch_control_node, tp_carrier, tp_carrier_task, tp_dispatch_coordinates, tp_dispatch_coordinates->m_carrier_default_x_left);
  5409. tp_carrier_task->m_step++;
  5410. }
  5411. else if ( dispatch_control_node.mp_dispatch_device->get_device_id() == 1 )
  5412. {
  5413. carrier_move_x(dispatch_control_node, tp_carrier, tp_carrier_task, tp_dispatch_coordinates, tp_dispatch_coordinates->m_carrier_default_x_right);
  5414. tp_carrier_task->m_step++;
  5415. }
  5416. else
  5417. {
  5418. return Error_manager(Error_code::CARRIER_CONRTOL_PARAMETER_ERROR, Error_level::MINOR_ERROR,
  5419. " m_destination_coordinates.z PARAMRTER ERROR ");
  5420. }
  5421. }
  5422. }
  5423. if ( tp_carrier_task->m_step == 6 )
  5424. {
  5425. return check_task_ex(dispatch_control_node.mp_dispatch_task, tp_carrier_task->m_step);
  5426. }
  5427. if ( tp_carrier_task->m_step == 7 )//收回对接,之后中跑车固定在电梯上不能X轴移动,电梯可以Z轴移动
  5428. {
  5429. if ( Common_data::approximate_difference(tp_carrier->m_actual_z, dispatch_control_node.m_destination_coordinates.z, DISPATCH_DEFAULT_DIFFERENCE) )
  5430. {
  5431. tp_carrier_task->m_step +=2;
  5432. }
  5433. else
  5434. {
  5435. carrier_joint_x(dispatch_control_node, tp_carrier, tp_carrier_task, tp_dispatch_coordinates, Carrier_task::Joint_motion::E_JOINT_TAKE_BACK);
  5436. tp_carrier_task->m_step++;
  5437. }
  5438. }
  5439. if ( tp_carrier_task->m_step == 8 )
  5440. {
  5441. return check_task_ex(dispatch_control_node.mp_dispatch_task, tp_carrier_task->m_step);
  5442. }
  5443. if ( tp_carrier_task->m_step == 9 )//电梯移动到对应的楼层
  5444. {
  5445. if ( Common_data::approximate_difference(tp_carrier->m_actual_z, dispatch_control_node.m_destination_coordinates.z, DISPATCH_DEFAULT_DIFFERENCE) )
  5446. {
  5447. tp_carrier_task->m_step +=2;
  5448. }
  5449. else
  5450. {
  5451. carrier_move_z(dispatch_control_node, tp_carrier, tp_carrier_task, tp_dispatch_coordinates, dispatch_control_node.m_destination_coordinates.z);
  5452. tp_carrier_task->m_step++;
  5453. }
  5454. }
  5455. if ( tp_carrier_task->m_step == 10 )
  5456. {
  5457. return check_task_ex(dispatch_control_node.mp_dispatch_task, tp_carrier_task->m_step);
  5458. }
  5459. if ( tp_carrier_task->m_step == 11 )//伸出对接,之后中跑车可以x轴移动,电梯不能Z轴移动
  5460. {
  5461. if ( tp_carrier->m_actual_joint_motion_x1 == Dispatch_device_base::Joint_motion::E_JOINT_TAKE_BACK && tp_carrier->get_device_id() !=2)
  5462. {
  5463. carrier_joint_x(dispatch_control_node, tp_carrier, tp_carrier_task, tp_dispatch_coordinates, Carrier_task::Joint_motion::E_JOINT_HOLD_OUT);
  5464. tp_carrier_task->m_step++;
  5465. }
  5466. else
  5467. {
  5468. tp_carrier_task->m_step +=2;
  5469. }
  5470. }
  5471. if ( tp_carrier_task->m_step == 12 )
  5472. {
  5473. return check_task_ex(dispatch_control_node.mp_dispatch_task, tp_carrier_task->m_step);
  5474. }
  5475. if ( tp_carrier_task->m_step == 13 )//中跑车 x轴移动
  5476. {
  5477. if ( Common_data::approximate_difference(tp_carrier->m_actual_x, dispatch_control_node.m_destination_coordinates.x, DISPATCH_DEFAULT_DIFFERENCE) )
  5478. {
  5479. tp_carrier_task->m_step +=2;
  5480. }
  5481. else
  5482. {
  5483. carrier_move_x(dispatch_control_node, tp_carrier, tp_carrier_task, tp_dispatch_coordinates, dispatch_control_node.m_destination_coordinates.x);
  5484. tp_carrier_task->m_step++;
  5485. }
  5486. }
  5487. if ( tp_carrier_task->m_step == 14 )
  5488. {
  5489. return check_task_ex(dispatch_control_node.mp_dispatch_task, tp_carrier_task->m_step);
  5490. }
  5491. if ( tp_carrier_task->m_step == 15 )
  5492. {
  5493. return Error_code::SUCCESS;
  5494. }
  5495. return Error_code::SUCCESS;
  5496. }
  5497. //搬运器把车存到停车位上(例如:小跑车夹车后,搬运器移动到56号停车位,然后小跑车将车存入车位,之后搬运器退回至电梯井)
  5498. Error_manager Dispatch_process::excute_carrier_store_car_to_parkingspace(Dispatch_control_node & dispatch_control_node)
  5499. {
  5500. Error_manager t_error;
  5501. Carrier * tp_carrier = NULL;
  5502. Carrier_task * tp_carrier_task = NULL;
  5503. Dispatch_coordinates * tp_dispatch_coordinates = Dispatch_coordinates::get_instance_pointer();
  5504. if ( dispatch_control_node.mp_dispatch_device.get() == NULL || dispatch_control_node.mp_dispatch_task.get() == NULL )
  5505. {
  5506. return Error_manager(Error_code::POINTER_IS_NULL, Error_level::MINOR_ERROR,
  5507. "Dispatch_process::excute_robot_catch_car_from_inlet() POINTER IS NULL ");
  5508. }
  5509. else
  5510. {
  5511. tp_carrier = (Carrier *)dispatch_control_node.mp_dispatch_device.get();
  5512. tp_carrier_task = (Carrier_task *)dispatch_control_node.mp_dispatch_task.get();
  5513. }
  5514. // std::cout << " huli test :::: " << " tp_catcher_task->m_step = " << tp_carrier_task->m_step << std::endl;
  5515. // getchar();
  5516. if ( tp_carrier_task->m_step == 0 )
  5517. {
  5518. return check_task_ex(dispatch_control_node.mp_dispatch_task, tp_carrier_task->m_step);
  5519. }
  5520. if ( tp_carrier_task->m_step == 1 )//检查姿态
  5521. {
  5522. //检查姿态(注注注注注意了, 调试阶段是无车, 真实环境是有车的)
  5523. if ( tp_carrier->m_actual_load_status == Dispatch_device_base::Load_status::NO_CAR &&
  5524. tp_carrier->m_actual_clamp_motion1 == Dispatch_device_base::Clamp_motion::E_CLAMP_LOOSE)
  5525. {
  5526. //检测正常, 直接跳过即可
  5527. tp_carrier_task->m_step +=2;
  5528. }
  5529. //注意了, 如果是去7号出口, 那么就直接跳过轮距修正和夹车.
  5530. else if(dispatch_control_node.m_dispatch_control_request_msg.dispatch_destination() == 1107)
  5531. {
  5532. tp_carrier_task->m_step = 7;
  5533. }
  5534. else
  5535. {
  5536. return Error_manager(Error_code::CARRIER_POSE_ERROR, Error_level::MINOR_ERROR,
  5537. "Dispatch_process::excute_carrier_store_car_to_parkingspace() fun error ");
  5538. }
  5539. }
  5540. if ( tp_carrier_task->m_step == 2 )
  5541. {
  5542. return check_task_ex(dispatch_control_node.mp_dispatch_task, tp_carrier_task->m_step);
  5543. }
  5544. if ( tp_carrier_task->m_step == 3 )//修正轴距
  5545. {
  5546. float temp_wheel_base = tp_carrier->m_actual_y1 - tp_carrier->m_actual_y2;
  5547. if ( Common_data::approximate_difference(m_wheel_base, temp_wheel_base, DISPATCH_DEFAULT_DIFFERENCE) )
  5548. {
  5549. tp_carrier_task->m_step +=2;
  5550. }
  5551. else
  5552. {
  5553. carrier_adjust_wheel_base(dispatch_control_node, tp_carrier, tp_carrier_task, tp_dispatch_coordinates);
  5554. tp_carrier_task->m_step++;
  5555. }
  5556. }
  5557. if ( tp_carrier_task->m_step == 4 )
  5558. {
  5559. return check_task_ex(dispatch_control_node.mp_dispatch_task, tp_carrier_task->m_step);
  5560. }
  5561. if ( tp_carrier_task->m_step == 5 )//让小跑车 夹车
  5562. {
  5563. carrier_move_c(dispatch_control_node, tp_carrier, tp_carrier_task, tp_dispatch_coordinates, Carrier_task::Clamp_motion::E_CLAMP_TIGHT);
  5564. tp_carrier_task->m_step++;
  5565. }
  5566. if ( tp_carrier_task->m_step == 6 )
  5567. {
  5568. return check_task_ex(dispatch_control_node.mp_dispatch_task, tp_carrier_task->m_step);
  5569. }
  5570. if ( tp_carrier_task->m_step == 7 )//让中跑车回到电梯井
  5571. {
  5572. if ( Common_data::approximate_difference(tp_carrier->m_actual_z, dispatch_control_node.m_destination_coordinates.z, DISPATCH_DEFAULT_DIFFERENCE) )
  5573. {
  5574. tp_carrier_task->m_step +=2;
  5575. }
  5576. else
  5577. {
  5578. if ( dispatch_control_node.mp_dispatch_device->get_device_id() == 0 )
  5579. {
  5580. carrier_move_x(dispatch_control_node, tp_carrier, tp_carrier_task, tp_dispatch_coordinates, tp_dispatch_coordinates->m_carrier_default_x_left);
  5581. tp_carrier_task->m_step++;
  5582. }
  5583. else if ( dispatch_control_node.mp_dispatch_device->get_device_id() == 1 )
  5584. {
  5585. carrier_move_x(dispatch_control_node, tp_carrier, tp_carrier_task, tp_dispatch_coordinates, tp_dispatch_coordinates->m_carrier_default_x_right);
  5586. tp_carrier_task->m_step++;
  5587. }
  5588. else
  5589. {
  5590. return Error_manager(Error_code::CARRIER_CONRTOL_PARAMETER_ERROR, Error_level::MINOR_ERROR,
  5591. " m_destination_coordinates.z PARAMRTER ERROR ");
  5592. }
  5593. }
  5594. }
  5595. if ( tp_carrier_task->m_step == 8 )
  5596. {
  5597. return check_task_ex(dispatch_control_node.mp_dispatch_task, tp_carrier_task->m_step);
  5598. }
  5599. if ( tp_carrier_task->m_step == 9 )//收回对接,之后中跑车固定在电梯上不能X轴移动,电梯可以Z轴移动
  5600. {
  5601. if ( Common_data::approximate_difference(tp_carrier->m_actual_z, dispatch_control_node.m_destination_coordinates.z, DISPATCH_DEFAULT_DIFFERENCE) )
  5602. {
  5603. tp_carrier_task->m_step +=2;
  5604. }
  5605. else
  5606. {
  5607. carrier_joint_x(dispatch_control_node, tp_carrier, tp_carrier_task, tp_dispatch_coordinates, Carrier_task::Joint_motion::E_JOINT_TAKE_BACK);
  5608. tp_carrier_task->m_step++;
  5609. }
  5610. }
  5611. if ( tp_carrier_task->m_step == 10 )
  5612. {
  5613. return check_task_ex(dispatch_control_node.mp_dispatch_task, tp_carrier_task->m_step);
  5614. }
  5615. if ( tp_carrier_task->m_step == 11 )//电梯移动到对应的楼层
  5616. {
  5617. if ( Common_data::approximate_difference(tp_carrier->m_actual_z, dispatch_control_node.m_destination_coordinates.z, DISPATCH_DEFAULT_DIFFERENCE) )
  5618. {
  5619. tp_carrier_task->m_step +=2;
  5620. }
  5621. else
  5622. {
  5623. carrier_move_z(dispatch_control_node, tp_carrier, tp_carrier_task, tp_dispatch_coordinates, dispatch_control_node.m_destination_coordinates.z);
  5624. tp_carrier_task->m_step++;
  5625. }
  5626. }
  5627. if ( tp_carrier_task->m_step == 12 )
  5628. {
  5629. return check_task_ex(dispatch_control_node.mp_dispatch_task, tp_carrier_task->m_step);
  5630. }
  5631. if ( tp_carrier_task->m_step == 13 )//伸出对接,之后中跑车可以x轴移动,电梯不能Z轴移动
  5632. {
  5633. if ( tp_carrier->m_actual_joint_motion_x1 == Dispatch_device_base::Joint_motion::E_JOINT_TAKE_BACK && tp_carrier->get_device_id() !=2)
  5634. {
  5635. carrier_joint_x(dispatch_control_node, tp_carrier, tp_carrier_task, tp_dispatch_coordinates, Carrier_task::Joint_motion::E_JOINT_HOLD_OUT);
  5636. tp_carrier_task->m_step++;
  5637. }
  5638. else
  5639. {
  5640. tp_carrier_task->m_step +=2;
  5641. }
  5642. }
  5643. if ( tp_carrier_task->m_step == 14 )
  5644. {
  5645. return check_task_ex(dispatch_control_node.mp_dispatch_task, tp_carrier_task->m_step);
  5646. }
  5647. if ( tp_carrier_task->m_step == 15 )//中跑车 x轴移动
  5648. {
  5649. if ( Common_data::approximate_difference(tp_carrier->m_actual_x, dispatch_control_node.m_destination_coordinates.x, DISPATCH_DEFAULT_DIFFERENCE) )
  5650. {
  5651. tp_carrier_task->m_step +=2;
  5652. }
  5653. else
  5654. {
  5655. carrier_move_x(dispatch_control_node, tp_carrier, tp_carrier_task, tp_dispatch_coordinates, dispatch_control_node.m_destination_coordinates.x);
  5656. tp_carrier_task->m_step++;
  5657. }
  5658. }
  5659. if ( tp_carrier_task->m_step == 16 )
  5660. {
  5661. return check_task_ex(dispatch_control_node.mp_dispatch_task, tp_carrier_task->m_step);
  5662. }
  5663. if ( tp_carrier_task->m_step == 17 )//小跑车 进入车位
  5664. {
  5665. carrier_move_y(dispatch_control_node, tp_carrier, tp_carrier_task, tp_dispatch_coordinates, tp_dispatch_coordinates->m_carrier_default_y_leave);
  5666. tp_carrier_task->m_step++;
  5667. }
  5668. if ( tp_carrier_task->m_step == 18 )
  5669. {
  5670. return check_task_ex(dispatch_control_node.mp_dispatch_task, tp_carrier_task->m_step);
  5671. }
  5672. if ( tp_carrier_task->m_step == 19 )//小跑车 松开夹杆
  5673. {
  5674. carrier_move_c(dispatch_control_node, tp_carrier, tp_carrier_task, tp_dispatch_coordinates, Carrier_task::Clamp_motion::E_CLAMP_LOOSE);
  5675. tp_carrier_task->m_step++;
  5676. }
  5677. if ( tp_carrier_task->m_step == 20 )
  5678. {
  5679. return check_task_ex(dispatch_control_node.mp_dispatch_task, tp_carrier_task->m_step);
  5680. }
  5681. if ( tp_carrier_task->m_step == 21 )//小跑车 回到中跑车
  5682. {
  5683. carrier_move_y(dispatch_control_node, tp_carrier, tp_carrier_task, tp_dispatch_coordinates, tp_dispatch_coordinates->m_carrier_default_y_back);
  5684. tp_carrier_task->m_step++;
  5685. }
  5686. if ( tp_carrier_task->m_step == 22 )
  5687. {
  5688. return check_task_ex(dispatch_control_node.mp_dispatch_task, tp_carrier_task->m_step);
  5689. }
  5690. if ( tp_carrier_task->m_step == 23 )//让中跑车回到电梯井
  5691. {
  5692. if ( dispatch_control_node.mp_dispatch_device->get_device_id() == 0 )
  5693. {
  5694. carrier_move_x(dispatch_control_node, tp_carrier, tp_carrier_task, tp_dispatch_coordinates, tp_dispatch_coordinates->m_carrier_default_x_left);
  5695. tp_carrier_task->m_step++;
  5696. }
  5697. else if ( dispatch_control_node.mp_dispatch_device->get_device_id() == 1 )
  5698. {
  5699. carrier_move_x(dispatch_control_node, tp_carrier, tp_carrier_task, tp_dispatch_coordinates, tp_dispatch_coordinates->m_carrier_default_x_right);
  5700. tp_carrier_task->m_step++;
  5701. }
  5702. else
  5703. {
  5704. return Error_manager(Error_code::CARRIER_CONRTOL_PARAMETER_ERROR, Error_level::MINOR_ERROR,
  5705. " m_destination_coordinates.z PARAMRTER ERROR ");
  5706. }
  5707. }
  5708. if ( tp_carrier_task->m_step == 24 )
  5709. {
  5710. return check_task_ex(dispatch_control_node.mp_dispatch_task, tp_carrier_task->m_step);
  5711. }
  5712. if ( tp_carrier_task->m_step == 25 )//收回对接,之后中跑车固定在电梯上不能X轴移动,电梯可以Z轴移动
  5713. {
  5714. carrier_joint_x(dispatch_control_node, tp_carrier, tp_carrier_task, tp_dispatch_coordinates, Carrier_task::Joint_motion::E_JOINT_TAKE_BACK);
  5715. tp_carrier_task->m_step++;
  5716. }
  5717. if ( tp_carrier_task->m_step == 26 )
  5718. {
  5719. return check_task_ex(dispatch_control_node.mp_dispatch_task, tp_carrier_task->m_step);
  5720. }
  5721. if ( tp_carrier_task->m_step == 27 )
  5722. {
  5723. return Error_code::SUCCESS;
  5724. }
  5725. return Error_code::SUCCESS;
  5726. }
  5727. //搬运器把车存到停车位上(例如:小跑车夹车后,搬运器移动到56号停车位,然后小跑车将车存入车位,之后搬运器退回至56车位外面即可)
  5728. Error_manager Dispatch_process::excute_carrier_store_car_to_parkingspace_ex(Dispatch_control_node & dispatch_control_node)
  5729. {
  5730. Error_manager t_error;
  5731. Carrier * tp_carrier = NULL;
  5732. Carrier_task * tp_carrier_task = NULL;
  5733. Dispatch_coordinates * tp_dispatch_coordinates = Dispatch_coordinates::get_instance_pointer();
  5734. if ( dispatch_control_node.mp_dispatch_device.get() == NULL || dispatch_control_node.mp_dispatch_task.get() == NULL )
  5735. {
  5736. return Error_manager(Error_code::POINTER_IS_NULL, Error_level::MINOR_ERROR,
  5737. "Dispatch_process::excute_robot_catch_car_from_inlet() POINTER IS NULL ");
  5738. }
  5739. else
  5740. {
  5741. tp_carrier = (Carrier *)dispatch_control_node.mp_dispatch_device.get();
  5742. tp_carrier_task = (Carrier_task *)dispatch_control_node.mp_dispatch_task.get();
  5743. }
  5744. // std::cout << " huli test :::: " << " tp_carrier_task->m_step = " << tp_carrier_task->m_step << std::endl;
  5745. // getchar();
  5746. if ( tp_carrier_task->m_step == 0 )
  5747. {
  5748. return check_task_ex(dispatch_control_node.mp_dispatch_task, tp_carrier_task->m_step);
  5749. }
  5750. if ( tp_carrier_task->m_step == 1 )//检查姿态
  5751. {
  5752. //检查姿态(注注注注注意了, 调试阶段是无车, 真实环境是有车的)
  5753. if ( tp_carrier->m_actual_load_status == Dispatch_device_base::Load_status::NO_CAR &&
  5754. tp_carrier->m_actual_clamp_motion1 == Dispatch_device_base::Clamp_motion::E_CLAMP_LOOSE)
  5755. {
  5756. //检测正常, 直接跳过即可
  5757. tp_carrier_task->m_step +=2;
  5758. }
  5759. //注意了, 如果是去7号出口, 那么就直接跳过轮距修正和夹车.
  5760. else if(dispatch_control_node.m_dispatch_control_request_msg.dispatch_destination() == 1107)
  5761. {
  5762. tp_carrier_task->m_step = 7;
  5763. }
  5764. else
  5765. {
  5766. return Error_manager(Error_code::CARRIER_POSE_ERROR, Error_level::MINOR_ERROR,
  5767. "Dispatch_process::excute_carrier_store_car_to_parkingspace() fun error ");
  5768. }
  5769. }
  5770. if ( tp_carrier_task->m_step == 2 )
  5771. {
  5772. return check_task_ex(dispatch_control_node.mp_dispatch_task, tp_carrier_task->m_step);
  5773. }
  5774. if ( tp_carrier_task->m_step == 3 )//修正轴距
  5775. {
  5776. float temp_wheel_base = tp_carrier->m_actual_y1 - tp_carrier->m_actual_y2;
  5777. if ( Common_data::approximate_difference(m_wheel_base, temp_wheel_base, DISPATCH_DEFAULT_DIFFERENCE) )
  5778. {
  5779. tp_carrier_task->m_step +=2;
  5780. }
  5781. else
  5782. {
  5783. carrier_adjust_wheel_base(dispatch_control_node, tp_carrier, tp_carrier_task, tp_dispatch_coordinates);
  5784. tp_carrier_task->m_step++;
  5785. }
  5786. }
  5787. if ( tp_carrier_task->m_step == 4 )
  5788. {
  5789. return check_task_ex(dispatch_control_node.mp_dispatch_task, tp_carrier_task->m_step);
  5790. }
  5791. if ( tp_carrier_task->m_step == 5 )//让小跑车 夹车
  5792. {
  5793. carrier_move_c(dispatch_control_node, tp_carrier, tp_carrier_task, tp_dispatch_coordinates, Carrier_task::Clamp_motion::E_CLAMP_TIGHT);
  5794. tp_carrier_task->m_step++;
  5795. }
  5796. if ( tp_carrier_task->m_step == 6 )
  5797. {
  5798. return check_task_ex(dispatch_control_node.mp_dispatch_task, tp_carrier_task->m_step);
  5799. }
  5800. if ( tp_carrier_task->m_step == 7 )//让中跑车回到电梯井
  5801. {
  5802. if ( Common_data::approximate_difference(tp_carrier->m_actual_z, dispatch_control_node.m_destination_coordinates.z, DISPATCH_DEFAULT_DIFFERENCE) )
  5803. {
  5804. tp_carrier_task->m_step +=2;
  5805. }
  5806. else
  5807. {
  5808. if ( dispatch_control_node.mp_dispatch_device->get_device_id() == 0 )
  5809. {
  5810. carrier_move_x(dispatch_control_node, tp_carrier, tp_carrier_task, tp_dispatch_coordinates, tp_dispatch_coordinates->m_carrier_default_x_left);
  5811. tp_carrier_task->m_step++;
  5812. }
  5813. else if ( dispatch_control_node.mp_dispatch_device->get_device_id() == 1 )
  5814. {
  5815. carrier_move_x(dispatch_control_node, tp_carrier, tp_carrier_task, tp_dispatch_coordinates, tp_dispatch_coordinates->m_carrier_default_x_right);
  5816. tp_carrier_task->m_step++;
  5817. }
  5818. else
  5819. {
  5820. return Error_manager(Error_code::CARRIER_CONRTOL_PARAMETER_ERROR, Error_level::MINOR_ERROR,
  5821. " dispatch_control_node.m_destination_coordinates.z PARAMRTER ERROR ");
  5822. }
  5823. }
  5824. }
  5825. if ( tp_carrier_task->m_step == 8 )
  5826. {
  5827. return check_task_ex(dispatch_control_node.mp_dispatch_task, tp_carrier_task->m_step);
  5828. }
  5829. if ( tp_carrier_task->m_step == 9 )//收回对接,之后中跑车固定在电梯上不能X轴移动,电梯可以Z轴移动
  5830. {
  5831. if ( Common_data::approximate_difference(tp_carrier->m_actual_z, dispatch_control_node.m_destination_coordinates.z, DISPATCH_DEFAULT_DIFFERENCE) )
  5832. {
  5833. tp_carrier_task->m_step +=2;
  5834. }
  5835. else
  5836. {
  5837. carrier_joint_x(dispatch_control_node, tp_carrier, tp_carrier_task, tp_dispatch_coordinates, Carrier_task::Joint_motion::E_JOINT_TAKE_BACK);
  5838. tp_carrier_task->m_step++;
  5839. }
  5840. }
  5841. if ( tp_carrier_task->m_step == 10 )
  5842. {
  5843. return check_task_ex(dispatch_control_node.mp_dispatch_task, tp_carrier_task->m_step);
  5844. }
  5845. if ( tp_carrier_task->m_step == 11 )//电梯移动到对应的楼层
  5846. {
  5847. if ( Common_data::approximate_difference(tp_carrier->m_actual_z, dispatch_control_node.m_destination_coordinates.z, DISPATCH_DEFAULT_DIFFERENCE) )
  5848. {
  5849. tp_carrier_task->m_step +=2;
  5850. }
  5851. else
  5852. {
  5853. carrier_move_z(dispatch_control_node, tp_carrier, tp_carrier_task, tp_dispatch_coordinates, dispatch_control_node.m_destination_coordinates.z);
  5854. tp_carrier_task->m_step++;
  5855. }
  5856. }
  5857. if ( tp_carrier_task->m_step == 12 )
  5858. {
  5859. return check_task_ex(dispatch_control_node.mp_dispatch_task, tp_carrier_task->m_step);
  5860. }
  5861. if ( tp_carrier_task->m_step == 13 )//伸出对接,之后中跑车可以x轴移动,电梯不能Z轴移动
  5862. {
  5863. if ( tp_carrier->m_actual_joint_motion_x1 == Dispatch_device_base::Joint_motion::E_JOINT_TAKE_BACK && tp_carrier->get_device_id() !=2)
  5864. {
  5865. carrier_joint_x(dispatch_control_node, tp_carrier, tp_carrier_task, tp_dispatch_coordinates, Carrier_task::Joint_motion::E_JOINT_HOLD_OUT);
  5866. tp_carrier_task->m_step++;
  5867. }
  5868. else
  5869. {
  5870. tp_carrier_task->m_step +=2;
  5871. }
  5872. }
  5873. if ( tp_carrier_task->m_step == 14 )
  5874. {
  5875. return check_task_ex(dispatch_control_node.mp_dispatch_task, tp_carrier_task->m_step);
  5876. }
  5877. if ( tp_carrier_task->m_step == 15 )//中跑车 x轴移动
  5878. {
  5879. if ( Common_data::approximate_difference(tp_carrier->m_actual_x, dispatch_control_node.m_destination_coordinates.x, DISPATCH_DEFAULT_DIFFERENCE) )
  5880. {
  5881. tp_carrier_task->m_step +=2;
  5882. }
  5883. else
  5884. {
  5885. carrier_move_x(dispatch_control_node, tp_carrier, tp_carrier_task, tp_dispatch_coordinates, dispatch_control_node.m_destination_coordinates.x);
  5886. tp_carrier_task->m_step++;
  5887. }
  5888. }
  5889. if ( tp_carrier_task->m_step == 16 )
  5890. {
  5891. return check_task_ex(dispatch_control_node.mp_dispatch_task, tp_carrier_task->m_step);
  5892. }
  5893. if ( tp_carrier_task->m_step == 17 )//小跑车 进入车位
  5894. {
  5895. carrier_move_y(dispatch_control_node, tp_carrier, tp_carrier_task, tp_dispatch_coordinates, tp_dispatch_coordinates->m_carrier_default_y_leave);
  5896. tp_carrier_task->m_step++;
  5897. }
  5898. if ( tp_carrier_task->m_step == 18 )
  5899. {
  5900. return check_task_ex(dispatch_control_node.mp_dispatch_task, tp_carrier_task->m_step);
  5901. }
  5902. if ( tp_carrier_task->m_step == 19 )//小跑车 松开夹杆
  5903. {
  5904. carrier_move_c(dispatch_control_node, tp_carrier, tp_carrier_task, tp_dispatch_coordinates, Carrier_task::Clamp_motion::E_CLAMP_LOOSE);
  5905. tp_carrier_task->m_step++;
  5906. }
  5907. if ( tp_carrier_task->m_step == 20 )
  5908. {
  5909. return check_task_ex(dispatch_control_node.mp_dispatch_task, tp_carrier_task->m_step);
  5910. }
  5911. if ( tp_carrier_task->m_step == 21 )//小跑车 回到中跑车
  5912. {
  5913. carrier_move_y(dispatch_control_node, tp_carrier, tp_carrier_task, tp_dispatch_coordinates, tp_dispatch_coordinates->m_carrier_default_y_back);
  5914. tp_carrier_task->m_step++;
  5915. }
  5916. if ( tp_carrier_task->m_step == 22 )
  5917. {
  5918. return check_task_ex(dispatch_control_node.mp_dispatch_task, tp_carrier_task->m_step);
  5919. }
  5920. if ( tp_carrier_task->m_step == 23 )
  5921. {
  5922. return Error_code::SUCCESS;
  5923. }
  5924. return Error_code::SUCCESS;
  5925. }
  5926. //搬运器从停车位上取车(例如:搬运器移动到56号停车位,然后小跑车将车从车位取出,之后搬运器退回至电梯井)
  5927. Error_manager Dispatch_process::excute_carrier_pickup_car_from_parkingspace(Dispatch_control_node & dispatch_control_node)
  5928. {
  5929. Error_manager t_error;
  5930. Carrier * tp_carrier = NULL;
  5931. Carrier_task * tp_carrier_task = NULL;
  5932. Dispatch_coordinates * tp_dispatch_coordinates = Dispatch_coordinates::get_instance_pointer();
  5933. if ( dispatch_control_node.mp_dispatch_device.get() == NULL || dispatch_control_node.mp_dispatch_task.get() == NULL )
  5934. {
  5935. return Error_manager(Error_code::POINTER_IS_NULL, Error_level::MINOR_ERROR,
  5936. "Dispatch_process::excute_robot_catch_car_from_inlet() POINTER IS NULL ");
  5937. }
  5938. else
  5939. {
  5940. tp_carrier = (Carrier *)dispatch_control_node.mp_dispatch_device.get();
  5941. tp_carrier_task = (Carrier_task *)dispatch_control_node.mp_dispatch_task.get();
  5942. }
  5943. // std::cout << " huli test :::: " << " tp_carrier_task->m_step = " << tp_carrier_task->m_step << std::endl;
  5944. // getchar();
  5945. if ( tp_carrier_task->m_step == 0 )
  5946. {
  5947. return check_task_ex(dispatch_control_node.mp_dispatch_task, tp_carrier_task->m_step);
  5948. }
  5949. if ( tp_carrier_task->m_step == 1 )//检查姿态
  5950. {
  5951. //检查姿态
  5952. if ( tp_carrier->m_actual_load_status == Dispatch_device_base::Load_status::NO_CAR )
  5953. {
  5954. if ( tp_carrier_task->m_request_clamp_motion == Carrier_task::Clamp_motion::E_CLAMP_LOOSE &&
  5955. Common_data::approximate_difference(m_wheel_base, tp_carrier->m_actual_y1-tp_carrier->m_actual_y2, DISPATCH_DEFAULT_DIFFERENCE))
  5956. {
  5957. tp_carrier_task->m_step +=2;
  5958. }
  5959. else
  5960. {
  5961. carrier_adjust_to_ready(dispatch_control_node, tp_carrier, tp_carrier_task, tp_dispatch_coordinates);
  5962. tp_carrier_task->m_step++;
  5963. }
  5964. }
  5965. else
  5966. {
  5967. return Error_manager(Error_code::CARRIER_POSE_ERROR, Error_level::MINOR_ERROR,
  5968. "tp_carrier->m_actual_load_status != Dispatch_device_base::Load_status::NO_CAR fun error ");
  5969. }
  5970. }
  5971. if ( tp_carrier_task->m_step == 2 )
  5972. {
  5973. return check_task_ex(dispatch_control_node.mp_dispatch_task, tp_carrier_task->m_step);
  5974. }
  5975. if ( tp_carrier_task->m_step == 3 )//让小跑车回到中跑车上
  5976. {
  5977. if ( Common_data::approximate_difference(tp_carrier->m_actual_y, tp_dispatch_coordinates->m_carrier_default_y_back, DISPATCH_DEFAULT_DIFFERENCE) )
  5978. {
  5979. tp_carrier_task->m_step +=2;
  5980. }
  5981. else
  5982. {
  5983. carrier_move_y(dispatch_control_node, tp_carrier, tp_carrier_task, tp_dispatch_coordinates, tp_dispatch_coordinates->m_carrier_default_y_back);
  5984. tp_carrier_task->m_step++;
  5985. }
  5986. }
  5987. if ( tp_carrier_task->m_step == 4 )
  5988. {
  5989. return check_task_ex(dispatch_control_node.mp_dispatch_task, tp_carrier_task->m_step);
  5990. }
  5991. if ( tp_carrier_task->m_step == 5 )//让中跑车回到电梯井
  5992. {
  5993. if ( Common_data::approximate_difference(tp_carrier->m_actual_z, dispatch_control_node.m_destination_coordinates.z, DISPATCH_DEFAULT_DIFFERENCE) )
  5994. {
  5995. tp_carrier_task->m_step +=2;
  5996. }
  5997. else
  5998. {
  5999. if ( dispatch_control_node.mp_dispatch_device->get_device_id() == 0 )
  6000. {
  6001. carrier_move_x(dispatch_control_node, tp_carrier, tp_carrier_task, tp_dispatch_coordinates, tp_dispatch_coordinates->m_carrier_default_x_left);
  6002. tp_carrier_task->m_step++;
  6003. }
  6004. else if ( dispatch_control_node.mp_dispatch_device->get_device_id() == 1 )
  6005. {
  6006. carrier_move_x(dispatch_control_node, tp_carrier, tp_carrier_task, tp_dispatch_coordinates, tp_dispatch_coordinates->m_carrier_default_x_right);
  6007. tp_carrier_task->m_step++;
  6008. }
  6009. else
  6010. {
  6011. return Error_manager(Error_code::CARRIER_CONRTOL_PARAMETER_ERROR, Error_level::MINOR_ERROR,
  6012. " dispatch_control_node.m_destination_coordinates.z PARAMRTER ERROR ");
  6013. }
  6014. }
  6015. }
  6016. if ( tp_carrier_task->m_step == 6 )
  6017. {
  6018. return check_task_ex(dispatch_control_node.mp_dispatch_task, tp_carrier_task->m_step);
  6019. }
  6020. if ( tp_carrier_task->m_step == 7 )//收回对接,之后中跑车固定在电梯上不能X轴移动,电梯可以Z轴移动
  6021. {
  6022. if ( Common_data::approximate_difference(tp_carrier->m_actual_z, dispatch_control_node.m_destination_coordinates.z, DISPATCH_DEFAULT_DIFFERENCE) )
  6023. {
  6024. tp_carrier_task->m_step +=2;
  6025. }
  6026. else
  6027. {
  6028. carrier_joint_x(dispatch_control_node, tp_carrier, tp_carrier_task, tp_dispatch_coordinates, Carrier_task::Joint_motion::E_JOINT_TAKE_BACK);
  6029. tp_carrier_task->m_step++;
  6030. }
  6031. }
  6032. if ( tp_carrier_task->m_step == 8 )
  6033. {
  6034. return check_task_ex(dispatch_control_node.mp_dispatch_task, tp_carrier_task->m_step);
  6035. }
  6036. if ( tp_carrier_task->m_step == 9 )//电梯移动到对应的楼层
  6037. {
  6038. if ( Common_data::approximate_difference(tp_carrier->m_actual_z, dispatch_control_node.m_destination_coordinates.z, DISPATCH_DEFAULT_DIFFERENCE) )
  6039. {
  6040. tp_carrier_task->m_step +=2;
  6041. }
  6042. else
  6043. {
  6044. carrier_move_z(dispatch_control_node, tp_carrier, tp_carrier_task, tp_dispatch_coordinates, dispatch_control_node.m_destination_coordinates.z);
  6045. tp_carrier_task->m_step++;
  6046. }
  6047. }
  6048. if ( tp_carrier_task->m_step == 10 )
  6049. {
  6050. return check_task_ex(dispatch_control_node.mp_dispatch_task, tp_carrier_task->m_step);
  6051. }
  6052. if ( tp_carrier_task->m_step == 11 )//伸出对接,之后中跑车可以x轴移动,电梯不能Z轴移动
  6053. {
  6054. if ( tp_carrier->m_actual_joint_motion_x1 == Dispatch_device_base::Joint_motion::E_JOINT_TAKE_BACK && tp_carrier->get_device_id() != 2)
  6055. {
  6056. carrier_joint_x(dispatch_control_node, tp_carrier, tp_carrier_task, tp_dispatch_coordinates, Carrier_task::Joint_motion::E_JOINT_HOLD_OUT);
  6057. tp_carrier_task->m_step++;
  6058. }
  6059. else
  6060. {
  6061. tp_carrier_task->m_step +=2;
  6062. }
  6063. }
  6064. if ( tp_carrier_task->m_step == 12 )
  6065. {
  6066. return check_task_ex(dispatch_control_node.mp_dispatch_task, tp_carrier_task->m_step);
  6067. }
  6068. if ( tp_carrier_task->m_step == 13 )//中跑车 x轴移动
  6069. {
  6070. if ( Common_data::approximate_difference(tp_carrier->m_actual_x, dispatch_control_node.m_destination_coordinates.x, DISPATCH_DEFAULT_DIFFERENCE) )
  6071. {
  6072. tp_carrier_task->m_step +=2;
  6073. }
  6074. else
  6075. {
  6076. carrier_move_x(dispatch_control_node, tp_carrier, tp_carrier_task, tp_dispatch_coordinates, dispatch_control_node.m_destination_coordinates.x);
  6077. tp_carrier_task->m_step++;
  6078. }
  6079. }
  6080. if ( tp_carrier_task->m_step == 14 )
  6081. {
  6082. return check_task_ex(dispatch_control_node.mp_dispatch_task, tp_carrier_task->m_step);
  6083. }
  6084. if ( tp_carrier_task->m_step == 15 )//小跑车 进入车位
  6085. {
  6086. carrier_move_y(dispatch_control_node, tp_carrier, tp_carrier_task, tp_dispatch_coordinates, tp_dispatch_coordinates->m_carrier_default_y_leave);
  6087. tp_carrier_task->m_step++;
  6088. }
  6089. if ( tp_carrier_task->m_step == 16 )
  6090. {
  6091. return check_task_ex(dispatch_control_node.mp_dispatch_task, tp_carrier_task->m_step);
  6092. }
  6093. if ( tp_carrier_task->m_step == 17 )//小跑车 夹车
  6094. {
  6095. carrier_move_c(dispatch_control_node, tp_carrier, tp_carrier_task, tp_dispatch_coordinates, Carrier_task::Clamp_motion::E_CLAMP_TIGHT);
  6096. tp_carrier_task->m_step++;
  6097. }
  6098. if ( tp_carrier_task->m_step == 18 )
  6099. {
  6100. return check_task_ex(dispatch_control_node.mp_dispatch_task, tp_carrier_task->m_step);
  6101. }
  6102. if ( tp_carrier_task->m_step == 19 )//小跑车 回到中跑车
  6103. {
  6104. carrier_move_y(dispatch_control_node, tp_carrier, tp_carrier_task, tp_dispatch_coordinates, tp_dispatch_coordinates->m_carrier_default_y_back);
  6105. tp_carrier_task->m_step++;
  6106. }
  6107. if ( tp_carrier_task->m_step == 20 )
  6108. {
  6109. return check_task_ex(dispatch_control_node.mp_dispatch_task, tp_carrier_task->m_step);
  6110. }
  6111. if ( tp_carrier_task->m_step == 21 )//让中跑车回到电梯井
  6112. {
  6113. if ( dispatch_control_node.mp_dispatch_device->get_device_id() == 0 )
  6114. {
  6115. carrier_move_x(dispatch_control_node, tp_carrier, tp_carrier_task, tp_dispatch_coordinates, tp_dispatch_coordinates->m_carrier_default_x_left);
  6116. tp_carrier_task->m_step++;
  6117. }
  6118. else if ( dispatch_control_node.mp_dispatch_device->get_device_id() == 1 )
  6119. {
  6120. carrier_move_x(dispatch_control_node, tp_carrier, tp_carrier_task, tp_dispatch_coordinates, tp_dispatch_coordinates->m_carrier_default_x_right);
  6121. tp_carrier_task->m_step++;
  6122. }
  6123. else
  6124. {
  6125. return Error_manager(Error_code::CARRIER_CONRTOL_PARAMETER_ERROR, Error_level::MINOR_ERROR,
  6126. " dispatch_control_node.m_destination_coordinates.z PARAMRTER ERROR ");
  6127. }
  6128. }
  6129. if ( tp_carrier_task->m_step == 22 )
  6130. {
  6131. return check_task_ex(dispatch_control_node.mp_dispatch_task, tp_carrier_task->m_step);
  6132. }
  6133. if ( tp_carrier_task->m_step == 23 )//收回对接,之后中跑车固定在电梯上不能X轴移动,电梯可以Z轴移动
  6134. {
  6135. if ( tp_carrier->get_device_id() != 2 )
  6136. {
  6137. carrier_joint_x(dispatch_control_node, tp_carrier, tp_carrier_task, tp_dispatch_coordinates, Carrier_task::Joint_motion::E_JOINT_TAKE_BACK);
  6138. tp_carrier_task->m_step++;
  6139. }
  6140. else
  6141. {
  6142. tp_carrier_task->m_step +=2;
  6143. }
  6144. }
  6145. if ( tp_carrier_task->m_step == 24 )
  6146. {
  6147. return check_task_ex(dispatch_control_node.mp_dispatch_task, tp_carrier_task->m_step);
  6148. }
  6149. if ( tp_carrier_task->m_step == 25 )
  6150. {
  6151. return Error_code::SUCCESS;
  6152. }
  6153. return Error_code::SUCCESS;
  6154. }
  6155. //搬运器从停车位上取车(例如:搬运器移动到56号停车位,然后小跑车将车从车位取出,之后搬运器退回至56车位外面即可)
  6156. Error_manager Dispatch_process::excute_carrier_pickup_car_from_parkingspace_ex(Dispatch_control_node & dispatch_control_node)
  6157. {
  6158. Error_manager t_error;
  6159. Carrier * tp_carrier = NULL;
  6160. Carrier_task * tp_carrier_task = NULL;
  6161. Dispatch_coordinates * tp_dispatch_coordinates = Dispatch_coordinates::get_instance_pointer();
  6162. if ( dispatch_control_node.mp_dispatch_device.get() == NULL || dispatch_control_node.mp_dispatch_task.get() == NULL )
  6163. {
  6164. return Error_manager(Error_code::POINTER_IS_NULL, Error_level::MINOR_ERROR,
  6165. "Dispatch_process::excute_robot_catch_car_from_inlet() POINTER IS NULL ");
  6166. }
  6167. else
  6168. {
  6169. tp_carrier = (Carrier *)dispatch_control_node.mp_dispatch_device.get();
  6170. tp_carrier_task = (Carrier_task *)dispatch_control_node.mp_dispatch_task.get();
  6171. }
  6172. // std::cout << " huli test :::: " << " tp_carrier_task->m_step = " << tp_carrier_task->m_step << std::endl;
  6173. // getchar();
  6174. if ( tp_carrier_task->m_step == 0 )
  6175. {
  6176. return check_task_ex(dispatch_control_node.mp_dispatch_task, tp_carrier_task->m_step);
  6177. }
  6178. if ( tp_carrier_task->m_step == 1 )//检查姿态
  6179. {
  6180. //检查姿态
  6181. if ( tp_carrier->m_actual_load_status == Dispatch_device_base::Load_status::NO_CAR )
  6182. {
  6183. if ( tp_carrier_task->m_request_clamp_motion == Carrier_task::Clamp_motion::E_CLAMP_LOOSE &&
  6184. Common_data::approximate_difference(m_wheel_base, tp_carrier->m_actual_y1-tp_carrier->m_actual_y2, DISPATCH_DEFAULT_DIFFERENCE))
  6185. {
  6186. tp_carrier_task->m_step +=2;
  6187. }
  6188. else
  6189. {
  6190. carrier_adjust_to_ready(dispatch_control_node, tp_carrier, tp_carrier_task, tp_dispatch_coordinates);
  6191. tp_carrier_task->m_step++;
  6192. }
  6193. }
  6194. else
  6195. {
  6196. return Error_manager(Error_code::CARRIER_POSE_ERROR, Error_level::MINOR_ERROR,
  6197. "tp_carrier->m_actual_load_status != Dispatch_device_base::Load_status::NO_CAR fun error ");
  6198. }
  6199. }
  6200. if ( tp_carrier_task->m_step == 2 )
  6201. {
  6202. return check_task_ex(dispatch_control_node.mp_dispatch_task, tp_carrier_task->m_step);
  6203. }
  6204. if ( tp_carrier_task->m_step == 3 )//让小跑车回到中跑车上
  6205. {
  6206. if ( Common_data::approximate_difference(tp_carrier->m_actual_y, tp_dispatch_coordinates->m_carrier_default_y_back, DISPATCH_DEFAULT_DIFFERENCE) )
  6207. {
  6208. tp_carrier_task->m_step +=2;
  6209. }
  6210. else
  6211. {
  6212. carrier_move_y(dispatch_control_node, tp_carrier, tp_carrier_task, tp_dispatch_coordinates, tp_dispatch_coordinates->m_carrier_default_y_back);
  6213. tp_carrier_task->m_step++;
  6214. }
  6215. }
  6216. if ( tp_carrier_task->m_step == 4 )
  6217. {
  6218. return check_task_ex(dispatch_control_node.mp_dispatch_task, tp_carrier_task->m_step);
  6219. }
  6220. if ( tp_carrier_task->m_step == 5 )//让中跑车回到电梯井
  6221. {
  6222. if ( Common_data::approximate_difference(tp_carrier->m_actual_z, dispatch_control_node.m_destination_coordinates.z, DISPATCH_DEFAULT_DIFFERENCE) )
  6223. {
  6224. tp_carrier_task->m_step +=2;
  6225. }
  6226. else
  6227. {
  6228. if ( dispatch_control_node.mp_dispatch_device->get_device_id() == 0 )
  6229. {
  6230. carrier_move_x(dispatch_control_node, tp_carrier, tp_carrier_task, tp_dispatch_coordinates, tp_dispatch_coordinates->m_carrier_default_x_left);
  6231. tp_carrier_task->m_step++;
  6232. }
  6233. else if ( dispatch_control_node.mp_dispatch_device->get_device_id() == 1 )
  6234. {
  6235. carrier_move_x(dispatch_control_node, tp_carrier, tp_carrier_task, tp_dispatch_coordinates, tp_dispatch_coordinates->m_carrier_default_x_right);
  6236. tp_carrier_task->m_step++;
  6237. }
  6238. else
  6239. {
  6240. return Error_manager(Error_code::CARRIER_CONRTOL_PARAMETER_ERROR, Error_level::MINOR_ERROR,
  6241. " dispatch_control_node.m_destination_coordinates.z PARAMRTER ERROR ");
  6242. }
  6243. }
  6244. }
  6245. if ( tp_carrier_task->m_step == 6 )
  6246. {
  6247. return check_task_ex(dispatch_control_node.mp_dispatch_task, tp_carrier_task->m_step);
  6248. }
  6249. if ( tp_carrier_task->m_step == 7 )//收回对接,之后中跑车固定在电梯上不能X轴移动,电梯可以Z轴移动
  6250. {
  6251. if ( Common_data::approximate_difference(tp_carrier->m_actual_z, dispatch_control_node.m_destination_coordinates.z, DISPATCH_DEFAULT_DIFFERENCE) )
  6252. {
  6253. tp_carrier_task->m_step +=2;
  6254. }
  6255. else
  6256. {
  6257. carrier_joint_x(dispatch_control_node, tp_carrier, tp_carrier_task, tp_dispatch_coordinates, Carrier_task::Joint_motion::E_JOINT_TAKE_BACK);
  6258. tp_carrier_task->m_step++;
  6259. }
  6260. }
  6261. if ( tp_carrier_task->m_step == 8 )
  6262. {
  6263. return check_task_ex(dispatch_control_node.mp_dispatch_task, tp_carrier_task->m_step);
  6264. }
  6265. if ( tp_carrier_task->m_step == 9 )//电梯移动到对应的楼层
  6266. {
  6267. if ( Common_data::approximate_difference(tp_carrier->m_actual_z, dispatch_control_node.m_destination_coordinates.z, DISPATCH_DEFAULT_DIFFERENCE) )
  6268. {
  6269. tp_carrier_task->m_step +=2;
  6270. }
  6271. else
  6272. {
  6273. carrier_move_z(dispatch_control_node, tp_carrier, tp_carrier_task, tp_dispatch_coordinates, dispatch_control_node.m_destination_coordinates.z);
  6274. tp_carrier_task->m_step++;
  6275. }
  6276. }
  6277. if ( tp_carrier_task->m_step == 10 )
  6278. {
  6279. return check_task_ex(dispatch_control_node.mp_dispatch_task, tp_carrier_task->m_step);
  6280. }
  6281. if ( tp_carrier_task->m_step == 11 )//伸出对接,之后中跑车可以x轴移动,电梯不能Z轴移动
  6282. {
  6283. if ( tp_carrier->m_actual_joint_motion_x1 == Dispatch_device_base::Joint_motion::E_JOINT_TAKE_BACK && tp_carrier->get_device_id() != 2)
  6284. {
  6285. carrier_joint_x(dispatch_control_node, tp_carrier, tp_carrier_task, tp_dispatch_coordinates, Carrier_task::Joint_motion::E_JOINT_HOLD_OUT);
  6286. tp_carrier_task->m_step++;
  6287. }
  6288. else
  6289. {
  6290. tp_carrier_task->m_step +=2;
  6291. }
  6292. }
  6293. if ( tp_carrier_task->m_step == 12 )
  6294. {
  6295. return check_task_ex(dispatch_control_node.mp_dispatch_task, tp_carrier_task->m_step);
  6296. }
  6297. if ( tp_carrier_task->m_step == 13 )//中跑车 x轴移动
  6298. {
  6299. if ( Common_data::approximate_difference(tp_carrier->m_actual_x, dispatch_control_node.m_destination_coordinates.x, DISPATCH_DEFAULT_DIFFERENCE) )
  6300. {
  6301. tp_carrier_task->m_step +=2;
  6302. }
  6303. else
  6304. {
  6305. carrier_move_x(dispatch_control_node, tp_carrier, tp_carrier_task, tp_dispatch_coordinates, dispatch_control_node.m_destination_coordinates.x);
  6306. tp_carrier_task->m_step++;
  6307. }
  6308. }
  6309. if ( tp_carrier_task->m_step == 14 )
  6310. {
  6311. return check_task_ex(dispatch_control_node.mp_dispatch_task, tp_carrier_task->m_step);
  6312. }
  6313. if ( tp_carrier_task->m_step == 15 )//小跑车 进入车位
  6314. {
  6315. carrier_move_y(dispatch_control_node, tp_carrier, tp_carrier_task, tp_dispatch_coordinates, tp_dispatch_coordinates->m_carrier_default_y_leave);
  6316. tp_carrier_task->m_step++;
  6317. }
  6318. if ( tp_carrier_task->m_step == 16 )
  6319. {
  6320. return check_task_ex(dispatch_control_node.mp_dispatch_task, tp_carrier_task->m_step);
  6321. }
  6322. if ( tp_carrier_task->m_step == 17 )//小跑车 夹车
  6323. {
  6324. carrier_move_c(dispatch_control_node, tp_carrier, tp_carrier_task, tp_dispatch_coordinates, Carrier_task::Clamp_motion::E_CLAMP_TIGHT);
  6325. tp_carrier_task->m_step++;
  6326. }
  6327. if ( tp_carrier_task->m_step == 18 )
  6328. {
  6329. return check_task_ex(dispatch_control_node.mp_dispatch_task, tp_carrier_task->m_step);
  6330. }
  6331. if ( tp_carrier_task->m_step == 19 )//小跑车 回到中跑车
  6332. {
  6333. carrier_move_y(dispatch_control_node, tp_carrier, tp_carrier_task, tp_dispatch_coordinates, tp_dispatch_coordinates->m_carrier_default_y_back);
  6334. tp_carrier_task->m_step++;
  6335. }
  6336. if ( tp_carrier_task->m_step == 20 )
  6337. {
  6338. return check_task_ex(dispatch_control_node.mp_dispatch_task, tp_carrier_task->m_step);
  6339. }
  6340. if ( tp_carrier_task->m_step == 21 )
  6341. {
  6342. return Error_code::SUCCESS;
  6343. }
  6344. return Error_code::SUCCESS;
  6345. }
  6346. //搬运器把车交付给机器手(例如:搬运器移动到3号入口的上方,小跑车松夹杆,然后等待机器手把车从中跑车上取走)
  6347. Error_manager Dispatch_process::excute_carrier_deliver_car_to_robot(Dispatch_control_node & dispatch_control_node)
  6348. {
  6349. Error_manager t_error;
  6350. Carrier * tp_carrier = NULL;
  6351. Carrier_task * tp_carrier_task = NULL;
  6352. Dispatch_coordinates * tp_dispatch_coordinates = Dispatch_coordinates::get_instance_pointer();
  6353. if ( dispatch_control_node.mp_dispatch_device.get() == NULL || dispatch_control_node.mp_dispatch_task.get() == NULL )
  6354. {
  6355. return Error_manager(Error_code::POINTER_IS_NULL, Error_level::MINOR_ERROR,
  6356. "Dispatch_process::excute_robot_catch_car_from_inlet() POINTER IS NULL ");
  6357. }
  6358. else
  6359. {
  6360. tp_carrier = (Carrier *)dispatch_control_node.mp_dispatch_device.get();
  6361. tp_carrier_task = (Carrier_task *)dispatch_control_node.mp_dispatch_task.get();
  6362. }
  6363. // std::cout << " huli test :::: " << " tp_carrier_task->m_step = " << tp_carrier_task->m_step << std::endl;
  6364. // getchar();
  6365. if ( tp_carrier_task->m_step == 0 )
  6366. {
  6367. return check_task_ex(dispatch_control_node.mp_dispatch_task, tp_carrier_task->m_step);
  6368. }
  6369. if ( tp_carrier_task->m_step == 1 )//检查姿态
  6370. {
  6371. //检查姿态
  6372. if ( tp_carrier->m_actual_load_status == Dispatch_device_base::Load_status::HAVE_CAR &&
  6373. tp_carrier->m_actual_clamp_motion1 == Dispatch_device_base::Clamp_motion::E_CLAMP_TIGHT)
  6374. {
  6375. //检测正常, 直接跳过
  6376. tp_carrier_task->m_step +=2;
  6377. }
  6378. else
  6379. {
  6380. return Error_manager(Error_code::CARRIER_POSE_ERROR, Error_level::MINOR_ERROR,
  6381. "tp_carrier->m_actual_load_status != Dispatch_device_base::Load_status::NO_CAR fun error ");
  6382. }
  6383. }
  6384. if ( tp_carrier_task->m_step == 2 )
  6385. {
  6386. return check_task_ex(dispatch_control_node.mp_dispatch_task, tp_carrier_task->m_step);
  6387. }
  6388. if ( tp_carrier_task->m_step == 3 )//让小跑车回到中跑车上
  6389. {
  6390. if ( Common_data::approximate_difference(tp_carrier->m_actual_y, tp_dispatch_coordinates->m_carrier_default_y_back, DISPATCH_DEFAULT_DIFFERENCE) )
  6391. {
  6392. tp_carrier_task->m_step +=2;
  6393. }
  6394. else
  6395. {
  6396. carrier_move_y(dispatch_control_node, tp_carrier, tp_carrier_task, tp_dispatch_coordinates, tp_dispatch_coordinates->m_carrier_default_y_back);
  6397. tp_carrier_task->m_step++;
  6398. }
  6399. }
  6400. if ( tp_carrier_task->m_step == 4 )
  6401. {
  6402. return check_task_ex(dispatch_control_node.mp_dispatch_task, tp_carrier_task->m_step);
  6403. }
  6404. if ( tp_carrier_task->m_step == 5 )//让中跑车回到电梯井
  6405. {
  6406. if ( Common_data::approximate_difference(tp_carrier->m_actual_z, dispatch_control_node.m_destination_coordinates.z, DISPATCH_DEFAULT_DIFFERENCE) )
  6407. {
  6408. tp_carrier_task->m_step +=2;
  6409. }
  6410. else
  6411. {
  6412. if ( dispatch_control_node.mp_dispatch_device->get_device_id() == 0 )
  6413. {
  6414. carrier_move_x(dispatch_control_node, tp_carrier, tp_carrier_task, tp_dispatch_coordinates, tp_dispatch_coordinates->m_carrier_default_x_left);
  6415. tp_carrier_task->m_step++;
  6416. }
  6417. else if ( dispatch_control_node.mp_dispatch_device->get_device_id() == 1 )
  6418. {
  6419. carrier_move_x(dispatch_control_node, tp_carrier, tp_carrier_task, tp_dispatch_coordinates, tp_dispatch_coordinates->m_carrier_default_x_right);
  6420. tp_carrier_task->m_step++;
  6421. }
  6422. else
  6423. {
  6424. return Error_manager(Error_code::CARRIER_CONRTOL_PARAMETER_ERROR, Error_level::MINOR_ERROR,
  6425. " dispatch_control_node.m_destination_coordinates.z PARAMRTER ERROR ");
  6426. }
  6427. }
  6428. }
  6429. if ( tp_carrier_task->m_step == 6 )
  6430. {
  6431. return check_task_ex(dispatch_control_node.mp_dispatch_task, tp_carrier_task->m_step);
  6432. }
  6433. if ( tp_carrier_task->m_step == 7 )//收回对接,之后中跑车固定在电梯上不能X轴移动,电梯可以Z轴移动
  6434. {
  6435. if ( Common_data::approximate_difference(tp_carrier->m_actual_z, dispatch_control_node.m_destination_coordinates.z, DISPATCH_DEFAULT_DIFFERENCE) )
  6436. {
  6437. tp_carrier_task->m_step +=2;
  6438. }
  6439. else
  6440. {
  6441. carrier_joint_x(dispatch_control_node, tp_carrier, tp_carrier_task, tp_dispatch_coordinates, Carrier_task::Joint_motion::E_JOINT_TAKE_BACK);
  6442. tp_carrier_task->m_step++;
  6443. }
  6444. }
  6445. if ( tp_carrier_task->m_step == 8 )
  6446. {
  6447. return check_task_ex(dispatch_control_node.mp_dispatch_task, tp_carrier_task->m_step);
  6448. }
  6449. if ( tp_carrier_task->m_step == 9 )//电梯移动到对应的楼层
  6450. {
  6451. if ( Common_data::approximate_difference(tp_carrier->m_actual_z, dispatch_control_node.m_destination_coordinates.z, DISPATCH_DEFAULT_DIFFERENCE) )
  6452. {
  6453. tp_carrier_task->m_step +=2;
  6454. }
  6455. else
  6456. {
  6457. carrier_move_z(dispatch_control_node, tp_carrier, tp_carrier_task, tp_dispatch_coordinates, dispatch_control_node.m_destination_coordinates.z);
  6458. tp_carrier_task->m_step++;
  6459. }
  6460. }
  6461. if ( tp_carrier_task->m_step == 10 )
  6462. {
  6463. return check_task_ex(dispatch_control_node.mp_dispatch_task, tp_carrier_task->m_step);
  6464. }
  6465. if ( tp_carrier_task->m_step == 11 )//伸出对接,之后中跑车可以x轴移动,电梯不能Z轴移动
  6466. {
  6467. if ( tp_carrier->m_actual_joint_motion_x1 == Dispatch_device_base::Joint_motion::E_JOINT_TAKE_BACK && tp_carrier->get_device_id() !=2)
  6468. {
  6469. carrier_joint_x(dispatch_control_node, tp_carrier, tp_carrier_task, tp_dispatch_coordinates, Carrier_task::Joint_motion::E_JOINT_HOLD_OUT);
  6470. tp_carrier_task->m_step++;
  6471. }
  6472. else
  6473. {
  6474. tp_carrier_task->m_step +=2;
  6475. }
  6476. }
  6477. if ( tp_carrier_task->m_step == 12 )
  6478. {
  6479. return check_task_ex(dispatch_control_node.mp_dispatch_task, tp_carrier_task->m_step);
  6480. }
  6481. if ( tp_carrier_task->m_step == 13 )//中跑车 x轴移动
  6482. {
  6483. if ( Common_data::approximate_difference(tp_carrier->m_actual_x, dispatch_control_node.m_destination_coordinates.x, DISPATCH_DEFAULT_DIFFERENCE) )
  6484. {
  6485. tp_carrier_task->m_step +=2;
  6486. }
  6487. else
  6488. {
  6489. carrier_move_x(dispatch_control_node, tp_carrier, tp_carrier_task, tp_dispatch_coordinates, dispatch_control_node.m_destination_coordinates.x);
  6490. tp_carrier_task->m_step++;
  6491. }
  6492. }
  6493. if ( tp_carrier_task->m_step == 14 )
  6494. {
  6495. return check_task_ex(dispatch_control_node.mp_dispatch_task, tp_carrier_task->m_step);
  6496. }
  6497. if ( tp_carrier_task->m_step == 15 )//小跑车 松开夹杆
  6498. {
  6499. carrier_move_c(dispatch_control_node, tp_carrier, tp_carrier_task, tp_dispatch_coordinates, Carrier_task::Clamp_motion::E_CLAMP_LOOSE);
  6500. tp_carrier_task->m_step++;
  6501. }
  6502. if ( tp_carrier_task->m_step == 16 )
  6503. {
  6504. return check_task_ex(dispatch_control_node.mp_dispatch_task, tp_carrier_task->m_step);
  6505. }
  6506. if ( tp_carrier_task->m_step == 17 )
  6507. {
  6508. return Error_code::SUCCESS;
  6509. }
  6510. return Error_code::SUCCESS;
  6511. }
  6512. //搬运器的自由移动(可以提前到2楼来准备接车,或者为了避让就退回至电梯井)(小跑车不进行取车和存车)
  6513. Error_manager Dispatch_process::excute_carrier_move(Dispatch_control_node & dispatch_control_node)
  6514. {
  6515. Error_manager t_error;
  6516. Carrier * tp_carrier = NULL;
  6517. Carrier_task * tp_carrier_task = NULL;
  6518. Dispatch_coordinates * tp_dispatch_coordinates = Dispatch_coordinates::get_instance_pointer();
  6519. if ( dispatch_control_node.mp_dispatch_device.get() == NULL || dispatch_control_node.mp_dispatch_task.get() == NULL )
  6520. {
  6521. return Error_manager(Error_code::POINTER_IS_NULL, Error_level::MINOR_ERROR,
  6522. "Dispatch_process::excute_robot_catch_car_from_inlet() POINTER IS NULL ");
  6523. }
  6524. else
  6525. {
  6526. tp_carrier = (Carrier *)dispatch_control_node.mp_dispatch_device.get();
  6527. tp_carrier_task = (Carrier_task *)dispatch_control_node.mp_dispatch_task.get();
  6528. }
  6529. // std::cout << " huli test :::: " << " tp_carrier_task->m_step = " << tp_carrier_task->m_step << std::endl;
  6530. // getchar();
  6531. if ( tp_carrier_task->m_step == 0 )
  6532. {
  6533. return check_task_ex(dispatch_control_node.mp_dispatch_task, tp_carrier_task->m_step);
  6534. }
  6535. if ( tp_carrier_task->m_step == 1 )//让小跑车回到中跑车上
  6536. {
  6537. if ( Common_data::approximate_difference(tp_carrier->m_actual_y, tp_dispatch_coordinates->m_carrier_default_y_back, DISPATCH_DEFAULT_DIFFERENCE) )
  6538. {
  6539. tp_carrier_task->m_step +=2;
  6540. }
  6541. else
  6542. {
  6543. carrier_move_y(dispatch_control_node, tp_carrier, tp_carrier_task, tp_dispatch_coordinates, tp_dispatch_coordinates->m_carrier_default_y_back);
  6544. tp_carrier_task->m_step++;
  6545. }
  6546. }
  6547. if ( tp_carrier_task->m_step == 2 )
  6548. {
  6549. return check_task_ex(dispatch_control_node.mp_dispatch_task, tp_carrier_task->m_step);
  6550. }
  6551. if ( tp_carrier_task->m_step == 3 )//让中跑车回到电梯井
  6552. {
  6553. if ( Common_data::approximate_difference(tp_carrier->m_actual_z, dispatch_control_node.m_destination_coordinates.z, DISPATCH_DEFAULT_DIFFERENCE) )
  6554. {
  6555. tp_carrier_task->m_step +=2;
  6556. }
  6557. else
  6558. {
  6559. if ( dispatch_control_node.mp_dispatch_device->get_device_id() == 0 )
  6560. {
  6561. carrier_move_x(dispatch_control_node, tp_carrier, tp_carrier_task, tp_dispatch_coordinates, tp_dispatch_coordinates->m_carrier_default_x_left);
  6562. tp_carrier_task->m_step++;
  6563. }
  6564. else if ( dispatch_control_node.mp_dispatch_device->get_device_id() == 1 )
  6565. {
  6566. carrier_move_x(dispatch_control_node, tp_carrier, tp_carrier_task, tp_dispatch_coordinates, tp_dispatch_coordinates->m_carrier_default_x_right);
  6567. tp_carrier_task->m_step++;
  6568. }
  6569. else
  6570. {
  6571. return Error_manager(Error_code::CARRIER_CONRTOL_PARAMETER_ERROR, Error_level::MINOR_ERROR,
  6572. " dispatch_control_node.m_destination_coordinates.z PARAMRTER ERROR ");
  6573. }
  6574. }
  6575. }
  6576. if ( tp_carrier_task->m_step == 4 )
  6577. {
  6578. return check_task_ex(dispatch_control_node.mp_dispatch_task, tp_carrier_task->m_step);
  6579. }
  6580. if ( tp_carrier_task->m_step == 5 )//收回对接,之后中跑车固定在电梯上不能X轴移动,电梯可以Z轴移动
  6581. {
  6582. if ( Common_data::approximate_difference(tp_carrier->m_actual_z, dispatch_control_node.m_destination_coordinates.z, DISPATCH_DEFAULT_DIFFERENCE) )
  6583. {
  6584. tp_carrier_task->m_step +=2;
  6585. }
  6586. else
  6587. {
  6588. carrier_joint_x(dispatch_control_node, tp_carrier, tp_carrier_task, tp_dispatch_coordinates, Carrier_task::Joint_motion::E_JOINT_TAKE_BACK);
  6589. tp_carrier_task->m_step++;
  6590. }
  6591. }
  6592. if ( tp_carrier_task->m_step == 6 )
  6593. {
  6594. return check_task_ex(dispatch_control_node.mp_dispatch_task, tp_carrier_task->m_step);
  6595. }
  6596. if ( tp_carrier_task->m_step == 7 )//电梯移动到对应的楼层
  6597. {
  6598. if ( Common_data::approximate_difference(tp_carrier->m_actual_z, dispatch_control_node.m_destination_coordinates.z, DISPATCH_DEFAULT_DIFFERENCE) )
  6599. {
  6600. tp_carrier_task->m_step +=2;
  6601. }
  6602. else
  6603. {
  6604. carrier_move_z(dispatch_control_node, tp_carrier, tp_carrier_task, tp_dispatch_coordinates, dispatch_control_node.m_destination_coordinates.z);
  6605. tp_carrier_task->m_step++;
  6606. }
  6607. }
  6608. if ( tp_carrier_task->m_step == 8 )
  6609. {
  6610. return check_task_ex(dispatch_control_node.mp_dispatch_task, tp_carrier_task->m_step);
  6611. }
  6612. if ( tp_carrier_task->m_step == 9 )//伸出对接,之后中跑车可以x轴移动,电梯不能Z轴移动
  6613. {
  6614. if ( tp_carrier->m_actual_joint_motion_x1 == Dispatch_device_base::Joint_motion::E_JOINT_TAKE_BACK && tp_carrier->get_device_id() !=2)
  6615. {
  6616. carrier_joint_x(dispatch_control_node, tp_carrier, tp_carrier_task, tp_dispatch_coordinates, Carrier_task::Joint_motion::E_JOINT_HOLD_OUT);
  6617. tp_carrier_task->m_step++;
  6618. }
  6619. else
  6620. {
  6621. tp_carrier_task->m_step +=2;
  6622. }
  6623. }
  6624. if ( tp_carrier_task->m_step == 10 )
  6625. {
  6626. return check_task_ex(dispatch_control_node.mp_dispatch_task, tp_carrier_task->m_step);
  6627. }
  6628. if ( tp_carrier_task->m_step == 11 )//中跑车 x轴移动
  6629. {
  6630. if ( Common_data::approximate_difference(tp_carrier->m_actual_x, dispatch_control_node.m_destination_coordinates.x, DISPATCH_DEFAULT_DIFFERENCE) )
  6631. {
  6632. tp_carrier_task->m_step +=2;
  6633. }
  6634. else
  6635. {
  6636. carrier_move_x(dispatch_control_node, tp_carrier, tp_carrier_task, tp_dispatch_coordinates, dispatch_control_node.m_destination_coordinates.x);
  6637. tp_carrier_task->m_step++;
  6638. }
  6639. }
  6640. if ( tp_carrier_task->m_step == 12 )
  6641. {
  6642. return check_task_ex(dispatch_control_node.mp_dispatch_task, tp_carrier_task->m_step);
  6643. }
  6644. if ( tp_carrier_task->m_step == 13 )
  6645. {
  6646. return Error_code::SUCCESS;
  6647. }
  6648. return Error_code::SUCCESS;
  6649. }
  6650. //执行通道口动作
  6651. Error_manager Dispatch_process::excute_passageway_motion(Dispatch_control_node & dispatch_control_node)
  6652. {
  6653. return Error_code::SUCCESS;
  6654. }
  6655. //检查 任务单 是否完成任务, 里面不会调整短步骤
  6656. Error_manager Dispatch_process::check_task_status(std::shared_ptr<Task_Base> p_task)
  6657. {
  6658. if ( p_task.get() == NULL )
  6659. {
  6660. return Error_manager(Error_code::POINTER_IS_NULL, Error_level::MINOR_ERROR,
  6661. "Dispatch_process::check_passageway_task POINTER IS NULL ");
  6662. }
  6663. else
  6664. {
  6665. if ( p_task->get_task_statu() == Task_Base::Task_statu::TASK_OVER )
  6666. {
  6667. // dispatch_control_status = (Dispatch_control_status)(dispatch_control_status+1);
  6668. // return Error_code::NODATA; //这里返回nodata 表示任务继续下一步
  6669. //注意了, 这里返回成功, 用作动作完成判断
  6670. return Error_code::SUCCESS;
  6671. }
  6672. else if ( p_task->get_task_statu() == Task_Base::Task_statu::TASK_ERROR )
  6673. {
  6674. // dispatch_control_status = DISPATCH_CONTROL_FAULT;
  6675. return p_task->get_task_error_manager();
  6676. }
  6677. else if ( p_task->get_task_statu() == Task_Base::Task_statu::TASK_WORKING ||
  6678. p_task->get_task_statu() == Task_Base::Task_statu::TASK_SIGNED ||
  6679. p_task->get_task_statu() == Task_Base::Task_statu::TASK_CREATED ||
  6680. p_task->get_task_statu() == Task_Base::Task_statu::TASK_STOP)
  6681. {
  6682. //继续等待任务, 直到状态改变
  6683. return Error_code::NODATA;
  6684. }
  6685. else
  6686. {
  6687. LOG(INFO) << "Dispatch_process::check_task_ex failed p_catcher_task->get_task_statu() = "<< p_task->get_task_statu() << " " << this;
  6688. return Error_code::NODATA;
  6689. }
  6690. }
  6691. return Error_code::SUCCESS;
  6692. }//检查 任务单 是否完成任务, 里面会调整短步骤
  6693. Error_manager Dispatch_process::check_task_status(std::shared_ptr<Task_Base> p_task, Dispatch_control_status & dispatch_control_status)
  6694. {
  6695. if ( p_task.get() == NULL )
  6696. {
  6697. return Error_manager(Error_code::POINTER_IS_NULL, Error_level::MINOR_ERROR,
  6698. "Dispatch_process::check_passageway_task POINTER IS NULL ");
  6699. }
  6700. else
  6701. {
  6702. if ( p_task->get_task_statu() == Task_Base::Task_statu::TASK_OVER )
  6703. {
  6704. dispatch_control_status = (Dispatch_control_status)(dispatch_control_status+1);
  6705. // return Error_code::NODATA; //这里返回nodata 表示任务继续下一步
  6706. //注意了, 这里返回成功, 用作动作完成判断
  6707. return Error_code::SUCCESS;
  6708. }
  6709. else if ( p_task->get_task_statu() == Task_Base::Task_statu::TASK_ERROR )
  6710. {
  6711. dispatch_control_status = DISPATCH_CONTROL_FAULT;
  6712. return p_task->get_task_error_manager();
  6713. }
  6714. else if ( p_task->get_task_statu() == Task_Base::Task_statu::TASK_WORKING ||
  6715. p_task->get_task_statu() == Task_Base::Task_statu::TASK_SIGNED ||
  6716. p_task->get_task_statu() == Task_Base::Task_statu::TASK_CREATED ||
  6717. p_task->get_task_statu() == Task_Base::Task_statu::TASK_STOP)
  6718. {
  6719. //继续等待任务, 直到状态改变
  6720. return Error_code::NODATA;
  6721. }
  6722. else
  6723. {
  6724. LOG(INFO) << "Dispatch_process::check_task_ex failed p_catcher_task->get_task_statu() = "<< p_task->get_task_statu() << " " << this;
  6725. return Error_code::NODATA;
  6726. }
  6727. }
  6728. return Error_code::SUCCESS;
  6729. }
  6730. //检查 任务单 是否完成任务, 里面会调整短步骤
  6731. Error_manager Dispatch_process::check_task_ex(std::shared_ptr<Task_Base> p_task, int& step)
  6732. {
  6733. if ( p_task.get() == NULL )
  6734. {
  6735. return Error_manager(Error_code::POINTER_IS_NULL, Error_level::MINOR_ERROR,
  6736. "Dispatch_process::check_passageway_task POINTER IS NULL ");
  6737. }
  6738. else
  6739. {
  6740. if ( p_task->get_task_statu() == Task_Base::Task_statu::TASK_OVER )
  6741. {
  6742. step++;
  6743. return Error_code::NODATA; //这里返回nodata 表示任务继续下一步
  6744. }
  6745. else if ( p_task->get_task_statu() == Task_Base::Task_statu::TASK_ERROR )
  6746. {
  6747. step = 0;
  6748. return p_task->get_task_error_manager();
  6749. }
  6750. else if ( p_task->get_task_statu() == Task_Base::Task_statu::TASK_WORKING ||
  6751. p_task->get_task_statu() == Task_Base::Task_statu::TASK_SIGNED ||
  6752. p_task->get_task_statu() == Task_Base::Task_statu::TASK_CREATED ||
  6753. p_task->get_task_statu() == Task_Base::Task_statu::TASK_STOP)
  6754. {
  6755. //继续等待任务, 直到状态改变
  6756. return Error_code::NODATA;
  6757. }
  6758. else
  6759. {
  6760. LOG(INFO) << "Dispatch_process::check_task_ex failed p_catcher_task->get_task_statu() = "<< p_task->get_task_statu() << " " << this;
  6761. return Error_code::NODATA;
  6762. }
  6763. }
  6764. return Error_code::SUCCESS;
  6765. }
  6766. //机器手调整到正常待机的姿态(调节夹杆和轴距)
  6767. Error_manager Dispatch_process::catcher_adjust_to_ready(Dispatch_control_node & dispatch_control_node, Catcher * tp_catcher, Catcher_task * tp_catcher_task, Dispatch_coordinates * tp_dispatch_coordinates)
  6768. {
  6769. std::unique_lock<std::mutex> t_lock2(tp_catcher_task->m_lock);
  6770. char t_key[50] = {0};
  6771. sprintf(t_key, "%s+%d+%d", dispatch_control_node.m_dispatch_control_request_msg.command_key().c_str(), dispatch_control_node.m_dispatch_control_request_msg.dispatch_task_type(), tp_catcher_task->m_step);
  6772. tp_catcher_task->m_request_key = t_key;
  6773. tp_catcher_task->set_task_statu(Task_Base::TASK_CREATED);
  6774. //调整姿态
  6775. tp_catcher_task->m_request_clamp_motion = Catcher_task::Clamp_motion::E_CLAMP_LOOSE;
  6776. tp_catcher_task->m_request_d1 = tp_dispatch_coordinates->m_catcher_d1_min;
  6777. tp_catcher_task->m_request_d2 = tp_dispatch_coordinates->m_catcher_d2_min;
  6778. if ( tp_catcher->m_catcher_direction == Dispatch_device_base::Catcher_direction::CATCHER_DIRECTION_NEGATIVE )
  6779. {
  6780. tp_catcher_task->m_request_b = 270;
  6781. }
  6782. else
  6783. {
  6784. tp_catcher_task->m_request_b = 90;
  6785. }
  6786. std::cout << " huli test :::: " << " catcher_adjust_to_ready = " << tp_catcher_task->m_request_key << std::endl;
  6787. std::cout << " huli test :::: " << " catcher_adjust_to_ready = " << tp_catcher_task->m_respons_key << std::endl;
  6788. std::cout << " huli test :::: " << " tp_catcher_task->m_request_clamp_motion = " << tp_catcher_task->m_request_clamp_motion << std::endl;
  6789. std::cout << " huli test :::: " << " tp_catcher_task->m_request_d1 = " << tp_catcher_task->m_request_d1 << std::endl;
  6790. std::cout << " huli test :::: " << " tp_catcher_task->m_request_d2 = " << tp_catcher_task->m_request_d2 << std::endl;
  6791. std::cout << " huli test :::: " << " tp_catcher->m_catcher_direction = " << tp_catcher->m_catcher_direction << std::endl;
  6792. std::cout << " huli test :::: " << " tp_catcher_task->m_request_b = " << tp_catcher_task->m_request_b << std::endl;
  6793. return Error_code::SUCCESS;
  6794. }
  6795. //机器手 移动z
  6796. Error_manager Dispatch_process::catcher_move_z(Dispatch_control_node & dispatch_control_node, Catcher * tp_catcher, Catcher_task * tp_catcher_task, Dispatch_coordinates * tp_dispatch_coordinates, float target)
  6797. {
  6798. std::unique_lock<std::mutex> t_lock2(tp_catcher_task->m_lock);
  6799. char t_key[50] = {0};
  6800. sprintf(t_key, "%s+%d+%d", dispatch_control_node.m_dispatch_control_request_msg.command_key().c_str(), dispatch_control_node.m_dispatch_control_request_msg.dispatch_task_type(), tp_catcher_task->m_step);
  6801. tp_catcher_task->m_request_key = t_key;
  6802. tp_catcher_task->set_task_statu(Task_Base::TASK_CREATED);
  6803. //机器手 移动z
  6804. tp_catcher_task->m_request_z = target;
  6805. std::cout << " huli test :::: " << " catcher_move_z = " << tp_catcher_task->m_request_key << std::endl;
  6806. std::cout << " huli test :::: " << " catcher_move_z = " << tp_catcher_task->m_respons_key << std::endl;
  6807. std::cout << " huli test :::: " << " tp_catcher_task->m_request_z = " << tp_catcher_task->m_request_z << std::endl;
  6808. return Error_code::SUCCESS;
  6809. }
  6810. //机器手调整到 准备从地面抓车前的姿态
  6811. Error_manager Dispatch_process::catcher_adjust_from_ground(Dispatch_control_node & dispatch_control_node, Catcher * tp_catcher, Catcher_task * tp_catcher_task, Dispatch_coordinates * tp_dispatch_coordinates)
  6812. {
  6813. std::unique_lock<std::mutex> t_lock2(tp_catcher_task->m_lock);
  6814. char t_key[50] = {0};
  6815. sprintf(t_key, "%s+%d+%d", dispatch_control_node.m_dispatch_control_request_msg.command_key().c_str(), dispatch_control_node.m_dispatch_control_request_msg.dispatch_task_type(), tp_catcher_task->m_step);
  6816. tp_catcher_task->m_request_key = t_key;
  6817. tp_catcher_task->set_task_statu(Task_Base::TASK_CREATED);
  6818. //机器手 调整x y b d1 d2, 根据感测模块的定位信息, 调整机器手的姿态, 准备抓车.
  6819. tp_catcher_task->m_request_x = m_car_measure_information.center_x;
  6820. tp_catcher_task->m_request_y = m_car_measure_information.center_y;
  6821. if ( tp_catcher->m_catcher_direction == Dispatch_device_base::Catcher_direction::CATCHER_DIRECTION_NEGATIVE )
  6822. {
  6823. //机器手如果旋转反向, 那就+180即可, 没有必要旋转归位.
  6824. tp_catcher_task->m_request_b = 180 + m_car_measure_information.car_angle;
  6825. }
  6826. else
  6827. {
  6828. tp_catcher_task->m_request_b = m_car_measure_information.car_angle;
  6829. }
  6830. //限制轮距, 在夹车杆松开时, 机器人下降时, 轴距不能超过3000mm, 必须下降到最下面才能调整轴距, 夹车后可以上升.
  6831. if ( m_wheel_base > tp_dispatch_coordinates->m_catcher_wheel_base_limit )
  6832. {
  6833. tp_catcher_task->m_request_d1 = (tp_dispatch_coordinates->m_catcher_wheel_base_limit - tp_dispatch_coordinates->m_catcher_d1_d2_distance)/2;
  6834. tp_catcher_task->m_request_d2 = (tp_dispatch_coordinates->m_catcher_wheel_base_limit - tp_dispatch_coordinates->m_catcher_d1_d2_distance)/2;
  6835. tp_catcher_task->m_request_wheelbase = tp_dispatch_coordinates->m_catcher_wheel_base_limit;
  6836. }
  6837. else
  6838. {
  6839. tp_catcher_task->m_request_d1 = (m_wheel_base - tp_dispatch_coordinates->m_catcher_d1_d2_distance)/2;
  6840. tp_catcher_task->m_request_d2 = (m_wheel_base - tp_dispatch_coordinates->m_catcher_d1_d2_distance)/2;
  6841. tp_catcher_task->m_request_wheelbase = m_wheel_base;
  6842. }
  6843. tp_catcher_task->m_request_clamp_motion = Catcher_task::Clamp_motion::E_CLAMP_LOOSE;
  6844. std::cout << " huli test :::: " << " catcher_adjust_from_ground = " << tp_catcher_task->m_request_key << std::endl;
  6845. std::cout << " huli test :::: " << " catcher_adjust_from_ground = " << tp_catcher_task->m_respons_key << std::endl;
  6846. std::cout << " huli test :::: " << " tp_catcher_task->m_request_x = " << tp_catcher_task->m_request_x << std::endl;
  6847. std::cout << " huli test :::: " << " tp_catcher_task->m_request_y = " << tp_catcher_task->m_request_y << std::endl;
  6848. std::cout << " huli test :::: " << " tp_catcher->m_catcher_direction = " << tp_catcher->m_catcher_direction << std::endl;
  6849. std::cout << " huli test :::: " << " tp_catcher_task->m_request_b = " << tp_catcher_task->m_request_b << std::endl;
  6850. std::cout << " huli test :::: " << " m_wheel_base = " << m_wheel_base << std::endl;
  6851. std::cout << " huli test :::: " << " tp_catcher_task->m_request_d1 = " << tp_catcher_task->m_request_d1 << std::endl;
  6852. std::cout << " huli test :::: " << " tp_catcher_task->m_request_d2 = " << tp_catcher_task->m_request_d2 << std::endl;
  6853. std::cout << " huli test :::: " << " tp_catcher_task->m_request_wheelbase = " << tp_catcher_task->m_request_wheelbase << std::endl;
  6854. std::cout << " huli test :::: " << " tp_catcher_task->m_request_clamp_motion = " << tp_catcher_task->m_request_clamp_motion << std::endl;
  6855. return Error_code::SUCCESS;
  6856. }
  6857. //机器手 修正轴距, 如果轴距大于3000mm, 那么就要修正轴距.
  6858. Error_manager Dispatch_process::catcher_adjust_wheel_base(Dispatch_control_node & dispatch_control_node, Catcher * tp_catcher, Catcher_task * tp_catcher_task, Dispatch_coordinates * tp_dispatch_coordinates)
  6859. {
  6860. std::unique_lock<std::mutex> t_lock2(tp_catcher_task->m_lock);
  6861. char t_key[50] = {0};
  6862. sprintf(t_key, "%s+%d+%d", dispatch_control_node.m_dispatch_control_request_msg.command_key().c_str(), dispatch_control_node.m_dispatch_control_request_msg.dispatch_task_type(), tp_catcher_task->m_step);
  6863. tp_catcher_task->m_request_key = t_key;
  6864. tp_catcher_task->set_task_statu(Task_Base::TASK_CREATED);
  6865. //修正轴距
  6866. tp_catcher_task->m_request_d1 = (m_wheel_base - tp_dispatch_coordinates->m_catcher_d1_d2_distance)/2;
  6867. tp_catcher_task->m_request_d2 = (m_wheel_base - tp_dispatch_coordinates->m_catcher_d1_d2_distance)/2;
  6868. tp_catcher_task->m_request_wheelbase = m_wheel_base;
  6869. std::cout << " huli test :::: " << " catcher_adjust_wheel_base = " << tp_catcher_task->m_request_key << std::endl;
  6870. std::cout << " huli test :::: " << " catcher_adjust_wheel_base = " << tp_catcher_task->m_respons_key << std::endl;
  6871. std::cout << " huli test :::: " << " tp_catcher_task->m_request_d1 = " << tp_catcher_task->m_request_d1 << std::endl;
  6872. std::cout << " huli test :::: " << " tp_catcher_task->m_request_d2 = " << tp_catcher_task->m_request_d2 << std::endl;
  6873. std::cout << " huli test :::: " << " tp_catcher_task->m_request_wheelbase = " << tp_catcher_task->m_request_wheelbase << std::endl;
  6874. return Error_code::SUCCESS;
  6875. }
  6876. //机器手 移动c轴 夹杆
  6877. Error_manager Dispatch_process::catcher_move_c(Dispatch_control_node & dispatch_control_node, Catcher * tp_catcher, Catcher_task * tp_catcher_task, Dispatch_coordinates * tp_dispatch_coordinates, Catcher_task::Clamp_motion target)
  6878. {
  6879. std::unique_lock<std::mutex> t_lock2(tp_catcher_task->m_lock);
  6880. char t_key[50] = {0};
  6881. sprintf(t_key, "%s+%d+%d", dispatch_control_node.m_dispatch_control_request_msg.command_key().c_str(), dispatch_control_node.m_dispatch_control_request_msg.dispatch_task_type(), tp_catcher_task->m_step);
  6882. tp_catcher_task->m_request_key = t_key;
  6883. tp_catcher_task->set_task_statu(Task_Base::TASK_CREATED);
  6884. tp_catcher_task->m_request_clamp_motion = target;
  6885. std::cout << " huli test :::: " << " catcher_move_c = " << tp_catcher_task->m_request_key << std::endl;
  6886. std::cout << " huli test :::: " << " catcher_move_c = " << tp_catcher_task->m_respons_key << std::endl;
  6887. std::cout << " huli test :::: " << " tp_catcher_task->m_request_clamp_motion = " << tp_catcher_task->m_request_clamp_motion << std::endl;
  6888. return Error_code::SUCCESS;
  6889. }
  6890. //机器手调整到 准备把车放到搬运器的姿态
  6891. Error_manager Dispatch_process::catcher_adjust_to_carrier(Dispatch_control_node & dispatch_control_node, Catcher * tp_catcher, Catcher_task * tp_catcher_task, Dispatch_coordinates * tp_dispatch_coordinates, bool reverse_flag)
  6892. {
  6893. std::unique_lock<std::mutex> t_lock2(tp_catcher_task->m_lock);
  6894. char t_key[50] = {0};
  6895. sprintf(t_key, "%s+%d+%d", dispatch_control_node.m_dispatch_control_request_msg.command_key().c_str(), dispatch_control_node.m_dispatch_control_request_msg.dispatch_task_type(), tp_catcher_task->m_step);
  6896. tp_catcher_task->m_request_key = t_key;
  6897. tp_catcher_task->set_task_statu(Task_Base::TASK_CREATED);
  6898. //机器手 调整x y b d1 d2, 调整机器手的姿态, 准备把车放置到中跑车上.
  6899. tp_catcher_task->m_request_x = dispatch_control_node.m_destination_coordinates.x;
  6900. tp_catcher_task->m_request_y = tp_dispatch_coordinates->m_carrier_default_y1_back - (m_wheel_base /2);
  6901. //存车需要反向, 取车不需要
  6902. if ( reverse_flag )
  6903. {
  6904. if ( tp_catcher->m_catcher_direction == Dispatch_device_base::Catcher_direction::CATCHER_DIRECTION_NEGATIVE )
  6905. {
  6906. tp_catcher_task->m_request_b = 90;
  6907. }
  6908. else
  6909. {
  6910. tp_catcher_task->m_request_b = 270;
  6911. }
  6912. }
  6913. else
  6914. {
  6915. if ( tp_catcher->m_catcher_direction == Dispatch_device_base::Catcher_direction::CATCHER_DIRECTION_NEGATIVE )
  6916. {
  6917. tp_catcher_task->m_request_b = 270;
  6918. }
  6919. else
  6920. {
  6921. tp_catcher_task->m_request_b = 90;
  6922. }
  6923. }
  6924. std::cout << " huli test :::: " << " catcher_adjust_to_carrier = " << tp_catcher_task->m_request_key << std::endl;
  6925. std::cout << " huli test :::: " << " catcher_adjust_to_carrier = " << tp_catcher_task->m_respons_key << std::endl;
  6926. std::cout << " huli test :::: " << " tp_catcher_task->m_request_x = " << tp_catcher_task->m_request_x << std::endl;
  6927. std::cout << " huli test :::: " << " tp_catcher_task->m_request_y = " << tp_catcher_task->m_request_y << std::endl;
  6928. std::cout << " huli test :::: " << " tp_catcher->m_catcher_direction = " << tp_catcher->m_catcher_direction << std::endl;
  6929. std::cout << " huli test :::: " << " tp_catcher->m_request_b = " << tp_catcher->m_request_b << std::endl;
  6930. return Error_code::SUCCESS;
  6931. }
  6932. //机器手调整到 准备把车放到地面的姿态
  6933. Error_manager Dispatch_process::catcher_adjust_to_ground(Dispatch_control_node & dispatch_control_node, Catcher * tp_catcher, Catcher_task * tp_catcher_task, Dispatch_coordinates * tp_dispatch_coordinates)
  6934. {
  6935. std::unique_lock<std::mutex> t_lock2(tp_catcher_task->m_lock);
  6936. char t_key[50] = {0};
  6937. sprintf(t_key, "%s+%d+%d", dispatch_control_node.m_dispatch_control_request_msg.command_key().c_str(), dispatch_control_node.m_dispatch_control_request_msg.dispatch_task_type(), tp_catcher_task->m_step);
  6938. tp_catcher_task->m_request_key = t_key;
  6939. tp_catcher_task->set_task_statu(Task_Base::TASK_CREATED);
  6940. //机器手 调整x y b d1 d2, 调整机器手的姿态, 准备把车放置到中跑车上.
  6941. tp_catcher_task->m_request_x = dispatch_control_node.m_destination_coordinates.x;
  6942. tp_catcher_task->m_request_y = dispatch_control_node.m_destination_coordinates.y;
  6943. if ( tp_catcher->m_catcher_direction == Dispatch_device_base::Catcher_direction::CATCHER_DIRECTION_NEGATIVE )
  6944. {
  6945. tp_catcher_task->m_request_b = 270;
  6946. }
  6947. else
  6948. {
  6949. tp_catcher_task->m_request_b = 90;
  6950. }
  6951. std::cout << " huli test :::: " << " catcher_adjust_to_ground = " << tp_catcher_task->m_request_key << std::endl;
  6952. std::cout << " huli test :::: " << " catcher_adjust_to_ground = " << tp_catcher_task->m_respons_key << std::endl;
  6953. std::cout << " huli test :::: " << " tp_catcher_task->m_request_x = " << tp_catcher_task->m_request_x << std::endl;
  6954. std::cout << " huli test :::: " << " tp_catcher_task->m_request_y = " << tp_catcher_task->m_request_y << std::endl;
  6955. std::cout << " huli test :::: " << " tp_catcher->m_catcher_direction = " << tp_catcher->m_catcher_direction << std::endl;
  6956. std::cout << " huli test :::: " << " tp_catcher->m_request_b = " << tp_catcher->m_request_b << std::endl;
  6957. return Error_code::SUCCESS;
  6958. }
  6959. //机器手调整到 对接搬运器的姿态
  6960. Error_manager Dispatch_process::catcher_adjust_from_carrier(Dispatch_control_node & dispatch_control_node, Catcher * tp_catcher, Catcher_task * tp_catcher_task, Dispatch_coordinates * tp_dispatch_coordinates)
  6961. {
  6962. std::unique_lock<std::mutex> t_lock2(tp_catcher_task->m_lock);
  6963. char t_key[50] = {0};
  6964. sprintf(t_key, "%s+%d+%d", dispatch_control_node.m_dispatch_control_request_msg.command_key().c_str(), dispatch_control_node.m_dispatch_control_request_msg.dispatch_task_type(), tp_catcher_task->m_step);
  6965. tp_catcher_task->m_request_key = t_key;
  6966. tp_catcher_task->set_task_statu(Task_Base::TASK_CREATED);
  6967. //机器手 调整x y b d1 d2, 调整机器手的姿态, 准备把车放置到中跑车上.
  6968. tp_catcher_task->m_request_x = dispatch_control_node.m_destination_coordinates.x;
  6969. tp_catcher_task->m_request_y = tp_dispatch_coordinates->m_carrier_default_y1_back - (m_wheel_base /2);
  6970. if ( tp_catcher->m_catcher_direction == Dispatch_device_base::Catcher_direction::CATCHER_DIRECTION_NEGATIVE )
  6971. {
  6972. tp_catcher_task->m_request_b = 270;
  6973. }
  6974. else
  6975. {
  6976. tp_catcher_task->m_request_b = 90;
  6977. }
  6978. //限制轮距, 在夹车杆松开时, 机器人下降时, 轴距不能超过3000mm, 必须下降到最下面才能调整轴距, 夹车后可以上升.
  6979. if ( m_wheel_base > tp_dispatch_coordinates->m_catcher_wheel_base_limit )
  6980. {
  6981. tp_catcher_task->m_request_d1 = (tp_dispatch_coordinates->m_catcher_wheel_base_limit - tp_dispatch_coordinates->m_catcher_d1_d2_distance)/2;
  6982. tp_catcher_task->m_request_d2 = (tp_dispatch_coordinates->m_catcher_wheel_base_limit - tp_dispatch_coordinates->m_catcher_d1_d2_distance)/2;
  6983. tp_catcher_task->m_request_wheelbase = tp_dispatch_coordinates->m_catcher_wheel_base_limit;
  6984. }
  6985. else
  6986. {
  6987. tp_catcher_task->m_request_d1 = (m_wheel_base - tp_dispatch_coordinates->m_catcher_d1_d2_distance)/2;
  6988. tp_catcher_task->m_request_d2 = (m_wheel_base - tp_dispatch_coordinates->m_catcher_d1_d2_distance)/2;
  6989. tp_catcher_task->m_request_wheelbase = m_wheel_base;
  6990. }
  6991. tp_catcher_task->m_request_clamp_motion = Catcher_task::Clamp_motion::E_CLAMP_LOOSE;
  6992. std::cout << " huli test :::: " << " catcher_adjust_from_carrier = " << tp_catcher_task->m_request_key << std::endl;
  6993. std::cout << " huli test :::: " << " catcher_adjust_from_carrier = " << tp_catcher_task->m_respons_key << std::endl;
  6994. std::cout << " huli test :::: " << " tp_catcher_task->m_request_x = " << tp_catcher_task->m_request_x << std::endl;
  6995. std::cout << " huli test :::: " << " tp_catcher_task->m_request_y = " << tp_catcher_task->m_request_y << std::endl;
  6996. std::cout << " huli test :::: " << " tp_catcher->m_catcher_direction = " << tp_catcher->m_catcher_direction << std::endl;
  6997. std::cout << " huli test :::: " << " tp_catcher_task->m_request_b = " << tp_catcher_task->m_request_b << std::endl;
  6998. std::cout << " huli test :::: " << " m_wheel_base = " << m_wheel_base << std::endl;
  6999. std::cout << " huli test :::: " << " tp_catcher_task->m_request_d1 = " << tp_catcher_task->m_request_d1 << std::endl;
  7000. std::cout << " huli test :::: " << " tp_catcher_task->m_request_d2 = " << tp_catcher_task->m_request_d2 << std::endl;
  7001. std::cout << " huli test :::: " << " tp_catcher_task->m_request_wheelbase = " << tp_catcher_task->m_request_wheelbase << std::endl;
  7002. std::cout << " huli test :::: " << " tp_catcher_task->m_request_clamp_motion = " << tp_catcher_task->m_request_clamp_motion << std::endl;
  7003. return Error_code::SUCCESS;
  7004. }
  7005. //搬运器调整到 正常待机的姿态(调节夹杆和轴距)
  7006. Error_manager Dispatch_process::carrier_adjust_to_ready(Dispatch_control_node & dispatch_control_node, Carrier * tp_carrier, Carrier_task * tp_carrier_task, Dispatch_coordinates * tp_dispatch_coordinates)
  7007. {
  7008. std::unique_lock<std::mutex> t_lock2(tp_carrier_task->m_lock);
  7009. char t_key[50] = {0};
  7010. sprintf(t_key, "%s+%d+%d", dispatch_control_node.m_dispatch_control_request_msg.command_key().c_str(), dispatch_control_node.m_dispatch_control_request_msg.dispatch_task_type(), tp_carrier_task->m_step);
  7011. tp_carrier_task->m_request_key = t_key;
  7012. tp_carrier_task->set_task_statu(Task_Base::TASK_CREATED);
  7013. tp_carrier_task->m_request_clamp_motion = Carrier_task::Clamp_motion::E_CLAMP_LOOSE;
  7014. tp_carrier_task->m_request_wheelbase = m_wheel_base;
  7015. tp_carrier_task->m_request_y1 = tp_carrier->m_actual_y + tp_dispatch_coordinates->m_carrier_y_y1_distance;
  7016. tp_carrier_task->m_request_y2 = tp_carrier_task->m_request_y1 - tp_carrier_task->m_request_wheelbase;
  7017. std::cout << " huli test :::: " << " carrier_adjust_to_ready = " << tp_carrier_task->m_request_key << std::endl;
  7018. std::cout << " huli test :::: " << " carrier_adjust_to_ready = " << tp_carrier_task->m_respons_key << std::endl;
  7019. std::cout << " huli test :::: " << " tp_carrier_task->m_request_wheelbase = " << tp_carrier_task->m_request_wheelbase << std::endl;
  7020. std::cout << " huli test :::: " << " tp_carrier_task->m_request_y1 = " << tp_carrier_task->m_request_y1 << std::endl;
  7021. std::cout << " huli test :::: " << " tp_carrier_task->m_request_y2 = " << tp_carrier_task->m_request_y2 << std::endl;
  7022. std::cout << " huli test :::: " << " tp_carrier_task->m_request_clamp_motion = " << tp_carrier_task->m_request_clamp_motion << std::endl;
  7023. return Error_code::SUCCESS;
  7024. }
  7025. //搬运器 移动x
  7026. Error_manager Dispatch_process::carrier_move_x(Dispatch_control_node & dispatch_control_node, Carrier * tp_carrier, Carrier_task * tp_carrier_task, Dispatch_coordinates * tp_dispatch_coordinates, float target)
  7027. {
  7028. std::unique_lock<std::mutex> t_lock2(tp_carrier_task->m_lock);
  7029. char t_key[50] = {0};
  7030. sprintf(t_key, "%s+%d+%d", dispatch_control_node.m_dispatch_control_request_msg.command_key().c_str(), dispatch_control_node.m_dispatch_control_request_msg.dispatch_task_type(), tp_carrier_task->m_step);
  7031. tp_carrier_task->m_request_key = t_key;
  7032. tp_carrier_task->set_task_statu(Task_Base::TASK_CREATED);
  7033. tp_carrier_task->m_request_x = target;
  7034. std::cout << " huli test :::: " << " carrier_move_x = " << tp_carrier_task->m_request_key << std::endl;
  7035. std::cout << " huli test :::: " << " carrier_move_x = " << tp_carrier_task->m_respons_key << std::endl;
  7036. std::cout << " huli test :::: " << " tp_carrier_task->m_request_x = " << tp_carrier_task->m_request_x << std::endl;
  7037. return Error_code::SUCCESS;
  7038. }
  7039. //搬运器 移动y
  7040. Error_manager Dispatch_process::carrier_move_y(Dispatch_control_node & dispatch_control_node, Carrier * tp_carrier, Carrier_task * tp_carrier_task, Dispatch_coordinates * tp_dispatch_coordinates, float target)
  7041. {
  7042. std::unique_lock<std::mutex> t_lock2(tp_carrier_task->m_lock);
  7043. char t_key[50] = {0};
  7044. sprintf(t_key, "%s+%d+%d", dispatch_control_node.m_dispatch_control_request_msg.command_key().c_str(), dispatch_control_node.m_dispatch_control_request_msg.dispatch_task_type(), tp_carrier_task->m_step);
  7045. tp_carrier_task->m_request_key = t_key;
  7046. tp_carrier_task->set_task_statu(Task_Base::TASK_CREATED);
  7047. tp_carrier_task->m_request_y = target;
  7048. tp_carrier_task->m_request_wheelbase = m_wheel_base;
  7049. tp_carrier_task->m_request_y1 = tp_carrier_task->m_request_y + tp_dispatch_coordinates->m_carrier_y_y1_distance;
  7050. tp_carrier_task->m_request_y2 = tp_carrier_task->m_request_y1 - tp_carrier_task->m_request_wheelbase;
  7051. std::cout << " huli test :::: " << " carrier_move_y = " << tp_carrier_task->m_request_key << std::endl;
  7052. std::cout << " huli test :::: " << " carrier_move_y = " << tp_carrier_task->m_respons_key << std::endl;
  7053. std::cout << " huli test :::: " << " tp_carrier_task->m_request_y = " << tp_carrier_task->m_request_y << std::endl;
  7054. std::cout << " huli test :::: " << " tp_carrier_task->m_request_wheelbase = " << tp_carrier_task->m_request_wheelbase << std::endl;
  7055. std::cout << " huli test :::: " << " tp_carrier_task->m_request_y1 = " << tp_carrier_task->m_request_y1 << std::endl;
  7056. std::cout << " huli test :::: " << " tp_carrier_task->m_request_y2 = " << tp_carrier_task->m_request_y2 << std::endl;
  7057. return Error_code::SUCCESS;
  7058. }
  7059. //搬运器 移动z
  7060. Error_manager Dispatch_process::carrier_move_z(Dispatch_control_node & dispatch_control_node, Carrier * tp_carrier, Carrier_task * tp_carrier_task, Dispatch_coordinates * tp_dispatch_coordinates, float target)
  7061. {
  7062. std::unique_lock<std::mutex> t_lock2(tp_carrier_task->m_lock);
  7063. char t_key[50] = {0};
  7064. sprintf(t_key, "%s+%d+%d", dispatch_control_node.m_dispatch_control_request_msg.command_key().c_str(), dispatch_control_node.m_dispatch_control_request_msg.dispatch_task_type(), tp_carrier_task->m_step);
  7065. tp_carrier_task->m_request_key = t_key;
  7066. tp_carrier_task->set_task_statu(Task_Base::TASK_CREATED);
  7067. tp_carrier_task->m_request_z = target;
  7068. std::cout << " huli test :::: " << " carrier_move_z = " << tp_carrier_task->m_request_key << std::endl;
  7069. std::cout << " huli test :::: " << " carrier_move_z = " << tp_carrier_task->m_respons_key << std::endl;
  7070. std::cout << " huli test :::: " << " tp_carrier_task->m_request_z = " << tp_carrier_task->m_request_z << std::endl;
  7071. return Error_code::SUCCESS;
  7072. }
  7073. //搬运器 移动c轴 夹车杆
  7074. Error_manager Dispatch_process::carrier_move_c(Dispatch_control_node & dispatch_control_node, Carrier * tp_carrier, Carrier_task * tp_carrier_task, Dispatch_coordinates * tp_dispatch_coordinates, Carrier_task::Clamp_motion target)
  7075. {
  7076. std::unique_lock<std::mutex> t_lock2(tp_carrier_task->m_lock);
  7077. char t_key[50] = {0};
  7078. sprintf(t_key, "%s+%d+%d", dispatch_control_node.m_dispatch_control_request_msg.command_key().c_str(), dispatch_control_node.m_dispatch_control_request_msg.dispatch_task_type(), tp_carrier_task->m_step);
  7079. tp_carrier_task->m_request_key = t_key;
  7080. tp_carrier_task->set_task_statu(Task_Base::TASK_CREATED);
  7081. tp_carrier_task->m_request_clamp_motion = target;
  7082. std::cout << " huli test :::: " << " carrier_move_c = " << tp_carrier_task->m_request_key << std::endl;
  7083. std::cout << " huli test :::: " << " carrier_move_c = " << tp_carrier_task->m_respons_key << std::endl;
  7084. std::cout << " huli test :::: " << " tp_carrier_task->m_request_clamp_motion = " << tp_carrier_task->m_request_clamp_motion << std::endl;
  7085. return Error_code::SUCCESS;
  7086. }
  7087. //搬运器调整 水平的交接
  7088. Error_manager Dispatch_process::carrier_joint_x(Dispatch_control_node & dispatch_control_node, Carrier * tp_carrier, Carrier_task * tp_carrier_task, Dispatch_coordinates * tp_dispatch_coordinates, Carrier_task::Joint_motion target)
  7089. {
  7090. std::unique_lock<std::mutex> t_lock2(tp_carrier_task->m_lock);
  7091. char t_key[50] = {0};
  7092. sprintf(t_key, "%s+%d+%d", dispatch_control_node.m_dispatch_control_request_msg.command_key().c_str(), dispatch_control_node.m_dispatch_control_request_msg.dispatch_task_type(), tp_carrier_task->m_step);
  7093. tp_carrier_task->m_request_key = t_key;
  7094. tp_carrier_task->set_task_statu(Task_Base::TASK_CREATED);
  7095. tp_carrier_task->m_request_joint_motion_x = target;
  7096. std::cout << " huli test :::: " << " carrier_joint_x = " << tp_carrier_task->m_request_key << std::endl;
  7097. std::cout << " huli test :::: " << " carrier_joint_x = " << tp_carrier_task->m_respons_key << std::endl;
  7098. std::cout << " huli test :::: " << " tp_carrier_task->m_request_joint_motion_x = " << tp_carrier_task->m_request_joint_motion_x << std::endl;
  7099. return Error_code::SUCCESS;
  7100. }
  7101. //搬运器 修正轴距
  7102. Error_manager Dispatch_process::carrier_adjust_wheel_base(Dispatch_control_node & dispatch_control_node, Carrier * tp_carrier, Carrier_task * tp_carrier_task, Dispatch_coordinates * tp_dispatch_coordinates)
  7103. {
  7104. std::unique_lock<std::mutex> t_lock2(tp_carrier_task->m_lock);
  7105. char t_key[50] = {0};
  7106. sprintf(t_key, "%s+%d+%d", dispatch_control_node.m_dispatch_control_request_msg.command_key().c_str(), dispatch_control_node.m_dispatch_control_request_msg.dispatch_task_type(), tp_carrier_task->m_step);
  7107. tp_carrier_task->m_request_key = t_key;
  7108. tp_carrier_task->set_task_statu(Task_Base::TASK_CREATED);
  7109. tp_carrier_task->m_request_wheelbase = m_wheel_base;
  7110. tp_carrier_task->m_request_y1 = tp_carrier->m_actual_y + tp_dispatch_coordinates->m_carrier_y_y1_distance;
  7111. tp_carrier_task->m_request_y2 = tp_carrier_task->m_request_y1 - tp_carrier_task->m_request_wheelbase;
  7112. std::cout << " huli test :::: " << " carrier_adjust_wheel_base = " << tp_carrier_task->m_request_key << std::endl;
  7113. std::cout << " huli test :::: " << " carrier_adjust_wheel_base = " << tp_carrier_task->m_respons_key << std::endl;
  7114. std::cout << " huli test :::: " << " tp_carrier_task->m_request_wheelbase = " << tp_carrier_task->m_request_wheelbase << std::endl;
  7115. std::cout << " huli test :::: " << " tp_carrier_task->m_request_y1 = " << tp_carrier_task->m_request_y1 << std::endl;
  7116. std::cout << " huli test :::: " << " tp_carrier_task->m_request_y2 = " << tp_carrier_task->m_request_y2 << std::endl;
  7117. return Error_code::SUCCESS;
  7118. }
  7119. //机器手 准备开始, 需要同步任务单和设备真实数据.
  7120. Error_manager Dispatch_process::catcher_ready_to_start(std::string dispatch_control_command_key, Catcher * tp_catcher, Catcher_task * tp_catcher_task, Dispatch_coordinates * tp_dispatch_coordinates)
  7121. {
  7122. std::unique_lock<std::mutex> t_lock2(tp_catcher_task->m_lock);
  7123. tp_catcher_task->m_request_key = dispatch_control_command_key;
  7124. tp_catcher_task->set_task_statu(Task_Base::TASK_CREATED);
  7125. tp_catcher_task->m_request_x = tp_catcher->m_actual_x;
  7126. tp_catcher_task->m_request_y = tp_catcher->m_actual_y;
  7127. tp_catcher_task->m_request_b = tp_catcher->m_actual_b;
  7128. tp_catcher_task->m_request_z = tp_catcher->m_actual_z;
  7129. tp_catcher_task->m_request_d1 = tp_catcher->m_actual_d1;
  7130. tp_catcher_task->m_request_d2 = tp_catcher->m_actual_d2;
  7131. tp_catcher_task->m_request_wheelbase = Dispatch_coordinates::get_instance_references().m_default_wheelbase;
  7132. tp_catcher_task->m_request_clamp_motion = (Catcher_task::Clamp_motion)tp_catcher->m_actual_clamp_motion1;
  7133. return Error_code::SUCCESS;
  7134. }
  7135. //机器手调整到正常待机的姿态(调节夹杆和轴距)
  7136. Error_manager Dispatch_process::catcher_adjust_to_ready(std::string dispatch_control_command_key, Catcher * tp_catcher, Catcher_task * tp_catcher_task, Dispatch_coordinates * tp_dispatch_coordinates)
  7137. {
  7138. std::unique_lock<std::mutex> t_lock2(tp_catcher_task->m_lock);
  7139. tp_catcher_task->m_request_key = dispatch_control_command_key;
  7140. tp_catcher_task->set_task_statu(Task_Base::TASK_CREATED);
  7141. //调整姿态
  7142. tp_catcher_task->m_request_clamp_motion = Catcher_task::Clamp_motion::E_CLAMP_LOOSE;
  7143. tp_catcher_task->m_request_d1 = tp_dispatch_coordinates->m_catcher_d1_min;
  7144. tp_catcher_task->m_request_d2 = tp_dispatch_coordinates->m_catcher_d2_min;
  7145. if ( tp_catcher->m_catcher_direction == Dispatch_device_base::Catcher_direction::CATCHER_DIRECTION_NEGATIVE )
  7146. {
  7147. tp_catcher_task->m_request_b = 270;
  7148. }
  7149. else
  7150. {
  7151. tp_catcher_task->m_request_b = 90;
  7152. }
  7153. std::cout << " huli test :::: " << " catcher_adjust_to_ready = " << tp_catcher_task->m_request_key << std::endl;
  7154. std::cout << " huli test :::: " << " catcher_adjust_to_ready = " << tp_catcher_task->m_respons_key << std::endl;
  7155. std::cout << " huli test :::: " << " tp_catcher_task->m_request_clamp_motion = " << tp_catcher_task->m_request_clamp_motion << std::endl;
  7156. std::cout << " huli test :::: " << " tp_catcher_task->m_request_d1 = " << tp_catcher_task->m_request_d1 << std::endl;
  7157. std::cout << " huli test :::: " << " tp_catcher_task->m_request_d2 = " << tp_catcher_task->m_request_d2 << std::endl;
  7158. std::cout << " huli test :::: " << " tp_catcher->m_catcher_direction = " << tp_catcher->m_catcher_direction << std::endl;
  7159. std::cout << " huli test :::: " << " tp_catcher_task->m_request_b = " << tp_catcher_task->m_request_b << std::endl;
  7160. return Error_code::SUCCESS;
  7161. }
  7162. //机器手 移动x
  7163. Error_manager Dispatch_process::catcher_move_x(std::string dispatch_control_command_key, Catcher * tp_catcher, Catcher_task * tp_catcher_task, Dispatch_coordinates * tp_dispatch_coordinates, float target_x)
  7164. {
  7165. std::unique_lock<std::mutex> t_lock2(tp_catcher_task->m_lock);
  7166. tp_catcher_task->m_request_key = dispatch_control_command_key;
  7167. tp_catcher_task->set_task_statu(Task_Base::TASK_CREATED);
  7168. //机器手 移动x
  7169. tp_catcher_task->m_request_x = target_x;
  7170. std::cout << " huli test :::: " << " catcher_move_x = " << tp_catcher_task->m_request_key << std::endl;
  7171. std::cout << " huli test :::: " << " catcher_move_x = " << tp_catcher_task->m_respons_key << std::endl;
  7172. std::cout << " huli test :::: " << " tp_catcher_task->m_request_x = " << tp_catcher_task->m_request_x << std::endl;
  7173. return Error_code::SUCCESS;
  7174. }
  7175. //机器手 移动y
  7176. Error_manager Dispatch_process::catcher_move_y(std::string dispatch_control_command_key, Catcher * tp_catcher, Catcher_task * tp_catcher_task, Dispatch_coordinates * tp_dispatch_coordinates, float target_y)
  7177. {
  7178. std::unique_lock<std::mutex> t_lock2(tp_catcher_task->m_lock);
  7179. tp_catcher_task->m_request_key = dispatch_control_command_key;
  7180. tp_catcher_task->set_task_statu(Task_Base::TASK_CREATED);
  7181. //机器手 移动y
  7182. tp_catcher_task->m_request_y = target_y;
  7183. std::cout << " huli test :::: " << " catcher_move_y = " << tp_catcher_task->m_request_key << std::endl;
  7184. std::cout << " huli test :::: " << " catcher_move_y = " << tp_catcher_task->m_respons_key << std::endl;
  7185. std::cout << " huli test :::: " << " tp_catcher_task->m_request_y = " << tp_catcher_task->m_request_y << std::endl;
  7186. return Error_code::SUCCESS;
  7187. }
  7188. //机器手 移动z
  7189. Error_manager Dispatch_process::catcher_move_z(std::string dispatch_control_command_key, Catcher * tp_catcher, Catcher_task * tp_catcher_task, Dispatch_coordinates * tp_dispatch_coordinates, float target_z)
  7190. {
  7191. std::unique_lock<std::mutex> t_lock2(tp_catcher_task->m_lock);
  7192. tp_catcher_task->m_request_key = dispatch_control_command_key;
  7193. tp_catcher_task->set_task_statu(Task_Base::TASK_CREATED);
  7194. //机器手 移动z
  7195. tp_catcher_task->m_request_z = target_z;
  7196. std::cout << " huli test :::: " << " catcher_move_z = " << tp_catcher_task->m_request_key << std::endl;
  7197. std::cout << " huli test :::: " << " catcher_move_z = " << tp_catcher_task->m_respons_key << std::endl;
  7198. std::cout << " huli test :::: " << " tp_catcher_task->m_request_z = " << tp_catcher_task->m_request_z << std::endl;
  7199. return Error_code::SUCCESS;
  7200. }
  7201. //机器手调整到 准备从地面抓车前的姿态
  7202. Error_manager Dispatch_process::catcher_adjust_from_ground(std::string dispatch_control_command_key, Catcher * tp_catcher, Catcher_task * tp_catcher_task, Dispatch_coordinates * tp_dispatch_coordinates)
  7203. {
  7204. std::unique_lock<std::mutex> t_lock2(tp_catcher_task->m_lock);
  7205. tp_catcher_task->m_request_key = dispatch_control_command_key;
  7206. tp_catcher_task->set_task_statu(Task_Base::TASK_CREATED);
  7207. //机器手 调整x y b d1 d2, 根据感测模块的定位信息, 调整机器手的姿态, 准备抓车.
  7208. tp_catcher_task->m_request_x = m_car_measure_information.center_x;
  7209. tp_catcher_task->m_request_y = m_car_measure_information.center_y;
  7210. if ( tp_catcher->m_catcher_direction == Dispatch_device_base::Catcher_direction::CATCHER_DIRECTION_NEGATIVE )
  7211. {
  7212. //机器手如果旋转反向, 那就+180即可, 没有必要旋转归位.
  7213. tp_catcher_task->m_request_b = 180 + m_car_measure_information.car_angle;
  7214. }
  7215. else
  7216. {
  7217. tp_catcher_task->m_request_b = m_car_measure_information.car_angle;
  7218. }
  7219. //限制轮距, 在夹车杆松开时, 机器人下降时, 轴距不能超过3000mm, 必须下降到最下面才能调整轴距, 夹车后可以上升.
  7220. if ( m_wheel_base > tp_dispatch_coordinates->m_catcher_wheel_base_limit )
  7221. {
  7222. tp_catcher_task->m_request_d1 = (tp_dispatch_coordinates->m_catcher_wheel_base_limit - tp_dispatch_coordinates->m_catcher_d1_d2_distance)/2;
  7223. tp_catcher_task->m_request_d2 = (tp_dispatch_coordinates->m_catcher_wheel_base_limit - tp_dispatch_coordinates->m_catcher_d1_d2_distance)/2;
  7224. tp_catcher_task->m_request_wheelbase = tp_dispatch_coordinates->m_catcher_wheel_base_limit;
  7225. }
  7226. else
  7227. {
  7228. tp_catcher_task->m_request_d1 = (m_wheel_base - tp_dispatch_coordinates->m_catcher_d1_d2_distance)/2;
  7229. tp_catcher_task->m_request_d2 = (m_wheel_base - tp_dispatch_coordinates->m_catcher_d1_d2_distance)/2;
  7230. tp_catcher_task->m_request_wheelbase = m_wheel_base;
  7231. }
  7232. tp_catcher_task->m_request_clamp_motion = Catcher_task::Clamp_motion::E_CLAMP_LOOSE;
  7233. std::cout << " huli test :::: " << " catcher_adjust_from_ground = " << tp_catcher_task->m_request_key << std::endl;
  7234. std::cout << " huli test :::: " << " catcher_adjust_from_ground = " << tp_catcher_task->m_respons_key << std::endl;
  7235. std::cout << " huli test :::: " << " tp_catcher_task->m_request_x = " << tp_catcher_task->m_request_x << std::endl;
  7236. std::cout << " huli test :::: " << " tp_catcher_task->m_request_y = " << tp_catcher_task->m_request_y << std::endl;
  7237. std::cout << " huli test :::: " << " tp_catcher->m_catcher_direction = " << tp_catcher->m_catcher_direction << std::endl;
  7238. std::cout << " huli test :::: " << " tp_catcher_task->m_request_b = " << tp_catcher_task->m_request_b << std::endl;
  7239. std::cout << " huli test :::: " << " m_wheel_base = " << m_wheel_base << std::endl;
  7240. std::cout << " huli test :::: " << " tp_catcher_task->m_request_d1 = " << tp_catcher_task->m_request_d1 << std::endl;
  7241. std::cout << " huli test :::: " << " tp_catcher_task->m_request_d2 = " << tp_catcher_task->m_request_d2 << std::endl;
  7242. std::cout << " huli test :::: " << " tp_catcher_task->m_request_wheelbase = " << tp_catcher_task->m_request_wheelbase << std::endl;
  7243. std::cout << " huli test :::: " << " tp_catcher_task->m_request_clamp_motion = " << tp_catcher_task->m_request_clamp_motion << std::endl;
  7244. return Error_code::SUCCESS;
  7245. }
  7246. //机器手 修正轴距, 如果轴距大于3000mm, 那么就要修正轴距.
  7247. Error_manager Dispatch_process::catcher_adjust_wheel_base(std::string dispatch_control_command_key, Catcher * tp_catcher, Catcher_task * tp_catcher_task, Dispatch_coordinates * tp_dispatch_coordinates)
  7248. {
  7249. std::unique_lock<std::mutex> t_lock2(tp_catcher_task->m_lock);
  7250. tp_catcher_task->m_request_key = dispatch_control_command_key;
  7251. tp_catcher_task->set_task_statu(Task_Base::TASK_CREATED);
  7252. //修正轴距
  7253. tp_catcher_task->m_request_d1 = (m_wheel_base - tp_dispatch_coordinates->m_catcher_d1_d2_distance)/2;
  7254. tp_catcher_task->m_request_d2 = (m_wheel_base - tp_dispatch_coordinates->m_catcher_d1_d2_distance)/2;
  7255. tp_catcher_task->m_request_wheelbase = m_wheel_base;
  7256. std::cout << " huli test :::: " << " catcher_adjust_wheel_base = " << tp_catcher_task->m_request_key << std::endl;
  7257. std::cout << " huli test :::: " << " catcher_adjust_wheel_base = " << tp_catcher_task->m_respons_key << std::endl;
  7258. std::cout << " huli test :::: " << " tp_catcher_task->m_request_d1 = " << tp_catcher_task->m_request_d1 << std::endl;
  7259. std::cout << " huli test :::: " << " tp_catcher_task->m_request_d2 = " << tp_catcher_task->m_request_d2 << std::endl;
  7260. std::cout << " huli test :::: " << " tp_catcher_task->m_request_wheelbase = " << tp_catcher_task->m_request_wheelbase << std::endl;
  7261. return Error_code::SUCCESS;
  7262. }
  7263. //机器手 移动c轴 夹杆
  7264. Error_manager Dispatch_process::catcher_move_c(std::string dispatch_control_command_key, Catcher * tp_catcher, Catcher_task * tp_catcher_task, Dispatch_coordinates * tp_dispatch_coordinates, Catcher_task::Clamp_motion target)
  7265. {
  7266. std::unique_lock<std::mutex> t_lock2(tp_catcher_task->m_lock);
  7267. tp_catcher_task->m_request_key = dispatch_control_command_key;
  7268. tp_catcher_task->set_task_statu(Task_Base::TASK_CREATED);
  7269. tp_catcher_task->m_request_clamp_motion = target;
  7270. std::cout << " huli test :::: " << " catcher_move_c = " << tp_catcher_task->m_request_key << std::endl;
  7271. std::cout << " huli test :::: " << " catcher_move_c = " << tp_catcher_task->m_respons_key << std::endl;
  7272. std::cout << " huli test :::: " << " tp_catcher_task->m_request_clamp_motion = " << tp_catcher_task->m_request_clamp_motion << std::endl;
  7273. return Error_code::SUCCESS;
  7274. }
  7275. //机器手调整到 准备把车放到搬运器的姿态
  7276. Error_manager Dispatch_process::catcher_adjust_to_carrier(std::string dispatch_control_command_key, Catcher * tp_catcher, Catcher_task * tp_catcher_task, Dispatch_coordinates * tp_dispatch_coordinates, float target_x, bool reverse_flag)
  7277. {
  7278. std::unique_lock<std::mutex> t_lock2(tp_catcher_task->m_lock);
  7279. tp_catcher_task->m_request_key = dispatch_control_command_key;
  7280. tp_catcher_task->set_task_statu(Task_Base::TASK_CREATED);
  7281. //机器手 调整x y b d1 d2, 调整机器手的姿态, 准备把车放置到中跑车上.
  7282. tp_catcher_task->m_request_x = target_x;
  7283. tp_catcher_task->m_request_y = tp_dispatch_coordinates->m_carrier_default_y1_back - (m_wheel_base /2);
  7284. //存车需要反向, 取车不需要
  7285. if ( reverse_flag )
  7286. {
  7287. if ( tp_catcher->m_catcher_direction == Dispatch_device_base::Catcher_direction::CATCHER_DIRECTION_NEGATIVE )
  7288. {
  7289. tp_catcher_task->m_request_b = 90;
  7290. }
  7291. else
  7292. {
  7293. tp_catcher_task->m_request_b = 270;
  7294. }
  7295. }
  7296. else
  7297. {
  7298. if ( tp_catcher->m_catcher_direction == Dispatch_device_base::Catcher_direction::CATCHER_DIRECTION_NEGATIVE )
  7299. {
  7300. tp_catcher_task->m_request_b = 270;
  7301. }
  7302. else
  7303. {
  7304. tp_catcher_task->m_request_b = 90;
  7305. }
  7306. }
  7307. std::cout << " huli test :::: " << " catcher_adjust_to_carrier = " << tp_catcher_task->m_request_key << std::endl;
  7308. std::cout << " huli test :::: " << " catcher_adjust_to_carrier = " << tp_catcher_task->m_respons_key << std::endl;
  7309. std::cout << " huli test :::: " << " tp_catcher_task->m_request_x = " << tp_catcher_task->m_request_x << std::endl;
  7310. std::cout << " huli test :::: " << " tp_catcher_task->m_request_y = " << tp_catcher_task->m_request_y << std::endl;
  7311. std::cout << " huli test :::: " << " tp_catcher->m_catcher_direction = " << tp_catcher->m_catcher_direction << std::endl;
  7312. std::cout << " huli test :::: " << " tp_catcher->m_request_b = " << tp_catcher->m_request_b << std::endl;
  7313. return Error_code::SUCCESS;
  7314. }
  7315. //机器手调整到 准备把车放到地面的姿态
  7316. Error_manager Dispatch_process::catcher_adjust_to_ground(std::string dispatch_control_command_key, Catcher * tp_catcher, Catcher_task * tp_catcher_task, Dispatch_coordinates * tp_dispatch_coordinates, float target_x, float target_y)
  7317. {
  7318. std::unique_lock<std::mutex> t_lock2(tp_catcher_task->m_lock);
  7319. tp_catcher_task->m_request_key = dispatch_control_command_key;
  7320. tp_catcher_task->set_task_statu(Task_Base::TASK_CREATED);
  7321. //机器手 调整x y b d1 d2, 调整机器手的姿态, 准备把车放置到中跑车上.
  7322. tp_catcher_task->m_request_x = target_x;
  7323. tp_catcher_task->m_request_y = target_y;
  7324. if ( tp_catcher->m_catcher_direction == Dispatch_device_base::Catcher_direction::CATCHER_DIRECTION_NEGATIVE )
  7325. {
  7326. tp_catcher_task->m_request_b = 270;
  7327. }
  7328. else
  7329. {
  7330. tp_catcher_task->m_request_b = 90;
  7331. }
  7332. std::cout << " huli test :::: " << " catcher_adjust_to_ground = " << tp_catcher_task->m_request_key << std::endl;
  7333. std::cout << " huli test :::: " << " catcher_adjust_to_ground = " << tp_catcher_task->m_respons_key << std::endl;
  7334. std::cout << " huli test :::: " << " tp_catcher_task->m_request_x = " << tp_catcher_task->m_request_x << std::endl;
  7335. std::cout << " huli test :::: " << " tp_catcher_task->m_request_y = " << tp_catcher_task->m_request_y << std::endl;
  7336. std::cout << " huli test :::: " << " tp_catcher->m_catcher_direction = " << tp_catcher->m_catcher_direction << std::endl;
  7337. std::cout << " huli test :::: " << " tp_catcher->m_request_b = " << tp_catcher->m_request_b << std::endl;
  7338. return Error_code::SUCCESS;
  7339. }
  7340. //机器手调整到 对接搬运器的姿态
  7341. Error_manager Dispatch_process::catcher_adjust_from_carrier(std::string dispatch_control_command_key, Catcher * tp_catcher, Catcher_task * tp_catcher_task, Dispatch_coordinates * tp_dispatch_coordinates, float target_x)
  7342. {
  7343. std::unique_lock<std::mutex> t_lock2(tp_catcher_task->m_lock);
  7344. tp_catcher_task->m_request_key = dispatch_control_command_key;
  7345. tp_catcher_task->set_task_statu(Task_Base::TASK_CREATED);
  7346. //机器手 调整x y b d1 d2, 调整机器手的姿态, 准备把车放置到中跑车上.
  7347. tp_catcher_task->m_request_x = target_x;
  7348. tp_catcher_task->m_request_y = tp_dispatch_coordinates->m_carrier_default_y1_back - (m_wheel_base /2);
  7349. if ( tp_catcher->m_catcher_direction == Dispatch_device_base::Catcher_direction::CATCHER_DIRECTION_NEGATIVE )
  7350. {
  7351. tp_catcher_task->m_request_b = 270;
  7352. }
  7353. else
  7354. {
  7355. tp_catcher_task->m_request_b = 90;
  7356. }
  7357. //限制轮距, 在夹车杆松开时, 机器人下降时, 轴距不能超过3000mm, 必须下降到最下面才能调整轴距, 夹车后可以上升.
  7358. if ( m_wheel_base > tp_dispatch_coordinates->m_catcher_wheel_base_limit )
  7359. {
  7360. tp_catcher_task->m_request_d1 = (tp_dispatch_coordinates->m_catcher_wheel_base_limit - tp_dispatch_coordinates->m_catcher_d1_d2_distance)/2;
  7361. tp_catcher_task->m_request_d2 = (tp_dispatch_coordinates->m_catcher_wheel_base_limit - tp_dispatch_coordinates->m_catcher_d1_d2_distance)/2;
  7362. tp_catcher_task->m_request_wheelbase = tp_dispatch_coordinates->m_catcher_wheel_base_limit;
  7363. }
  7364. else
  7365. {
  7366. tp_catcher_task->m_request_d1 = (m_wheel_base - tp_dispatch_coordinates->m_catcher_d1_d2_distance)/2;
  7367. tp_catcher_task->m_request_d2 = (m_wheel_base - tp_dispatch_coordinates->m_catcher_d1_d2_distance)/2;
  7368. tp_catcher_task->m_request_wheelbase = m_wheel_base;
  7369. }
  7370. tp_catcher_task->m_request_clamp_motion = Catcher_task::Clamp_motion::E_CLAMP_LOOSE;
  7371. std::cout << " huli test :::: " << " catcher_adjust_from_carrier = " << tp_catcher_task->m_request_key << std::endl;
  7372. std::cout << " huli test :::: " << " catcher_adjust_from_carrier = " << tp_catcher_task->m_respons_key << std::endl;
  7373. std::cout << " huli test :::: " << " tp_catcher_task->m_request_x = " << tp_catcher_task->m_request_x << std::endl;
  7374. std::cout << " huli test :::: " << " tp_catcher_task->m_request_y = " << tp_catcher_task->m_request_y << std::endl;
  7375. std::cout << " huli test :::: " << " tp_catcher->m_catcher_direction = " << tp_catcher->m_catcher_direction << std::endl;
  7376. std::cout << " huli test :::: " << " tp_catcher_task->m_request_b = " << tp_catcher_task->m_request_b << std::endl;
  7377. std::cout << " huli test :::: " << " m_wheel_base = " << m_wheel_base << std::endl;
  7378. std::cout << " huli test :::: " << " tp_catcher_task->m_request_d1 = " << tp_catcher_task->m_request_d1 << std::endl;
  7379. std::cout << " huli test :::: " << " tp_catcher_task->m_request_d2 = " << tp_catcher_task->m_request_d2 << std::endl;
  7380. std::cout << " huli test :::: " << " tp_catcher_task->m_request_wheelbase = " << tp_catcher_task->m_request_wheelbase << std::endl;
  7381. std::cout << " huli test :::: " << " tp_catcher_task->m_request_clamp_motion = " << tp_catcher_task->m_request_clamp_motion << std::endl;
  7382. return Error_code::SUCCESS;
  7383. }
  7384. //搬运器 准备开始, 需要同步任务单和设备真实数据.
  7385. Error_manager Dispatch_process::carrier_ready_to_start(std::string dispatch_control_command_key, Carrier * tp_carrier, Carrier_task * tp_carrier_task, Dispatch_coordinates * tp_dispatch_coordinates)
  7386. {
  7387. std::unique_lock<std::mutex> t_lock2(tp_carrier_task->m_lock);
  7388. tp_carrier_task->m_request_key = dispatch_control_command_key;
  7389. tp_carrier_task->set_task_statu(Task_Base::TASK_CREATED);
  7390. tp_carrier_task->m_request_x = tp_carrier->m_actual_x;
  7391. tp_carrier_task->m_request_y = tp_carrier->m_actual_y;
  7392. tp_carrier_task->m_request_z = tp_carrier->m_actual_z;
  7393. tp_carrier_task->m_request_y1 = tp_carrier->m_actual_y1;
  7394. tp_carrier_task->m_request_y2 = tp_carrier->m_actual_y2;
  7395. tp_carrier_task->m_request_clamp_motion = (Carrier_task::Clamp_motion)tp_carrier->m_actual_clamp_motion1;
  7396. tp_carrier_task->m_request_joint_motion_x = (Carrier_task::Joint_motion)tp_carrier->m_actual_joint_motion_x1;
  7397. tp_carrier_task->m_request_joint_motion_y = Carrier_task::Joint_motion::E_JOINT_NO_ACTION;
  7398. tp_carrier_task->m_request_space_id = 0;
  7399. tp_carrier_task->m_request_floor_id = 0;
  7400. tp_carrier_task->m_request_wheelbase = Dispatch_coordinates::get_instance_references().m_default_wheelbase;
  7401. return Error_code::SUCCESS;
  7402. }
  7403. //搬运器调整到 正常待机的姿态(调节夹杆和轴距)
  7404. Error_manager Dispatch_process::carrier_adjust_to_ready(std::string dispatch_control_command_key, Carrier * tp_carrier, Carrier_task * tp_carrier_task, Dispatch_coordinates * tp_dispatch_coordinates)
  7405. {
  7406. std::unique_lock<std::mutex> t_lock2(tp_carrier_task->m_lock);
  7407. tp_carrier_task->m_request_key = dispatch_control_command_key;
  7408. tp_carrier_task->set_task_statu(Task_Base::TASK_CREATED);
  7409. tp_carrier_task->m_request_clamp_motion = Carrier_task::Clamp_motion::E_CLAMP_LOOSE;
  7410. tp_carrier_task->m_request_wheelbase = m_wheel_base;
  7411. tp_carrier_task->m_request_y1 = tp_carrier->m_actual_y + tp_dispatch_coordinates->m_carrier_y_y1_distance;
  7412. tp_carrier_task->m_request_y2 = tp_carrier_task->m_request_y1 - tp_carrier_task->m_request_wheelbase;
  7413. std::cout << " huli test :::: " << " carrier_adjust_to_ready = " << tp_carrier_task->m_request_key << std::endl;
  7414. std::cout << " huli test :::: " << " carrier_adjust_to_ready = " << tp_carrier_task->m_respons_key << std::endl;
  7415. std::cout << " huli test :::: " << " tp_carrier_task->m_request_wheelbase = " << tp_carrier_task->m_request_wheelbase << std::endl;
  7416. std::cout << " huli test :::: " << " tp_carrier_task->m_request_y1 = " << tp_carrier_task->m_request_y1 << std::endl;
  7417. std::cout << " huli test :::: " << " tp_carrier_task->m_request_y2 = " << tp_carrier_task->m_request_y2 << std::endl;
  7418. std::cout << " huli test :::: " << " tp_carrier_task->m_request_clamp_motion = " << tp_carrier_task->m_request_clamp_motion << std::endl;
  7419. return Error_code::SUCCESS;
  7420. }
  7421. //搬运器 移动x
  7422. Error_manager Dispatch_process::carrier_move_x(std::string dispatch_control_command_key, Carrier * tp_carrier, Carrier_task * tp_carrier_task, Dispatch_coordinates * tp_dispatch_coordinates, float target_x)
  7423. {
  7424. std::unique_lock<std::mutex> t_lock2(tp_carrier_task->m_lock);
  7425. tp_carrier_task->m_request_key = dispatch_control_command_key;
  7426. tp_carrier_task->set_task_statu(Task_Base::TASK_CREATED);
  7427. tp_carrier_task->m_request_x = target_x;
  7428. std::cout << " huli test :::: " << " carrier_move_x = " << tp_carrier_task->m_request_key << std::endl;
  7429. std::cout << " huli test :::: " << " carrier_move_x = " << tp_carrier_task->m_respons_key << std::endl;
  7430. std::cout << " huli test :::: " << " tp_carrier_task->m_request_x = " << tp_carrier_task->m_request_x << std::endl;
  7431. return Error_code::SUCCESS;
  7432. }
  7433. //搬运器 移动y
  7434. Error_manager Dispatch_process::carrier_move_y(std::string dispatch_control_command_key, Carrier * tp_carrier, Carrier_task * tp_carrier_task, Dispatch_coordinates * tp_dispatch_coordinates, float target_y)
  7435. {
  7436. std::unique_lock<std::mutex> t_lock2(tp_carrier_task->m_lock);
  7437. tp_carrier_task->m_request_key = dispatch_control_command_key;
  7438. tp_carrier_task->set_task_statu(Task_Base::TASK_CREATED);
  7439. tp_carrier_task->m_request_y = target_y;
  7440. tp_carrier_task->m_request_wheelbase = m_wheel_base;
  7441. tp_carrier_task->m_request_y1 = tp_carrier_task->m_request_y + tp_dispatch_coordinates->m_carrier_y_y1_distance;
  7442. tp_carrier_task->m_request_y2 = tp_carrier_task->m_request_y1 - tp_carrier_task->m_request_wheelbase;
  7443. std::cout << " huli test :::: " << " carrier_move_y = " << tp_carrier_task->m_request_key << std::endl;
  7444. std::cout << " huli test :::: " << " carrier_move_y = " << tp_carrier_task->m_respons_key << std::endl;
  7445. std::cout << " huli test :::: " << " tp_carrier_task->m_request_y = " << tp_carrier_task->m_request_y << std::endl;
  7446. std::cout << " huli test :::: " << " tp_carrier_task->m_request_wheelbase = " << tp_carrier_task->m_request_wheelbase << std::endl;
  7447. std::cout << " huli test :::: " << " tp_carrier_task->m_request_y1 = " << tp_carrier_task->m_request_y1 << std::endl;
  7448. std::cout << " huli test :::: " << " tp_carrier_task->m_request_y2 = " << tp_carrier_task->m_request_y2 << std::endl;
  7449. return Error_code::SUCCESS;
  7450. }
  7451. //搬运器 移动z
  7452. Error_manager Dispatch_process::carrier_move_z(std::string dispatch_control_command_key, Carrier * tp_carrier, Carrier_task * tp_carrier_task, Dispatch_coordinates * tp_dispatch_coordinates, float target_z)
  7453. {
  7454. std::unique_lock<std::mutex> t_lock2(tp_carrier_task->m_lock);
  7455. tp_carrier_task->m_request_key = dispatch_control_command_key;
  7456. tp_carrier_task->set_task_statu(Task_Base::TASK_CREATED);
  7457. tp_carrier_task->m_request_z = target_z;
  7458. std::cout << " huli test :::: " << " carrier_move_z = " << tp_carrier_task->m_request_key << std::endl;
  7459. std::cout << " huli test :::: " << " carrier_move_z = " << tp_carrier_task->m_respons_key << std::endl;
  7460. std::cout << " huli test :::: " << " tp_carrier_task->m_request_z = " << tp_carrier_task->m_request_z << std::endl;
  7461. return Error_code::SUCCESS;
  7462. }
  7463. //搬运器 移动c轴 夹车杆
  7464. Error_manager Dispatch_process::carrier_move_c(std::string dispatch_control_command_key, Carrier * tp_carrier, Carrier_task * tp_carrier_task, Dispatch_coordinates * tp_dispatch_coordinates, Carrier_task::Clamp_motion target)
  7465. {
  7466. std::unique_lock<std::mutex> t_lock2(tp_carrier_task->m_lock);
  7467. tp_carrier_task->m_request_key = dispatch_control_command_key;
  7468. tp_carrier_task->set_task_statu(Task_Base::TASK_CREATED);
  7469. tp_carrier_task->m_request_clamp_motion = target;
  7470. std::cout << " huli test :::: " << " carrier_move_c = " << tp_carrier_task->m_request_key << std::endl;
  7471. std::cout << " huli test :::: " << " carrier_move_c = " << tp_carrier_task->m_respons_key << std::endl;
  7472. std::cout << " huli test :::: " << " tp_carrier_task->m_request_clamp_motion = " << tp_carrier_task->m_request_clamp_motion << std::endl;
  7473. return Error_code::SUCCESS;
  7474. }
  7475. //搬运器调整 水平的交接
  7476. Error_manager Dispatch_process::carrier_joint_x(std::string dispatch_control_command_key, Carrier * tp_carrier, Carrier_task * tp_carrier_task, Dispatch_coordinates * tp_dispatch_coordinates, Carrier_task::Joint_motion target)
  7477. {
  7478. std::unique_lock<std::mutex> t_lock2(tp_carrier_task->m_lock);
  7479. tp_carrier_task->m_request_key = dispatch_control_command_key;
  7480. tp_carrier_task->set_task_statu(Task_Base::TASK_CREATED);
  7481. tp_carrier_task->m_request_joint_motion_x = target;
  7482. std::cout << " huli test :::: " << " carrier_joint_x = " << tp_carrier_task->m_request_key << std::endl;
  7483. std::cout << " huli test :::: " << " carrier_joint_x = " << tp_carrier_task->m_respons_key << std::endl;
  7484. std::cout << " huli test :::: " << " tp_carrier_task->m_request_joint_motion_x = " << tp_carrier_task->m_request_joint_motion_x << std::endl;
  7485. return Error_code::SUCCESS;
  7486. }
  7487. //搬运器 修正轴距
  7488. Error_manager Dispatch_process::carrier_adjust_wheel_base(std::string dispatch_control_command_key, Carrier * tp_carrier, Carrier_task * tp_carrier_task, Dispatch_coordinates * tp_dispatch_coordinates)
  7489. {
  7490. std::unique_lock<std::mutex> t_lock2(tp_carrier_task->m_lock);
  7491. tp_carrier_task->m_request_key = dispatch_control_command_key;
  7492. tp_carrier_task->set_task_statu(Task_Base::TASK_CREATED);
  7493. tp_carrier_task->m_request_wheelbase = m_wheel_base;
  7494. tp_carrier_task->m_request_y1 = tp_carrier->m_actual_y + tp_dispatch_coordinates->m_carrier_y_y1_distance;
  7495. tp_carrier_task->m_request_y2 = tp_carrier_task->m_request_y1 - tp_carrier_task->m_request_wheelbase;
  7496. std::cout << " huli test :::: " << " carrier_adjust_wheel_base = " << tp_carrier_task->m_request_key << std::endl;
  7497. std::cout << " huli test :::: " << " carrier_adjust_wheel_base = " << tp_carrier_task->m_respons_key << std::endl;
  7498. std::cout << " huli test :::: " << " tp_carrier_task->m_request_wheelbase = " << tp_carrier_task->m_request_wheelbase << std::endl;
  7499. std::cout << " huli test :::: " << " tp_carrier_task->m_request_y1 = " << tp_carrier_task->m_request_y1 << std::endl;
  7500. std::cout << " huli test :::: " << " tp_carrier_task->m_request_y2 = " << tp_carrier_task->m_request_y2 << std::endl;
  7501. return Error_code::SUCCESS;
  7502. }