Kompiuterinių žaidimų personažų judėjimo modeliavimas. Informatikos pamoka "judesio modeliavimas" Verlet integravimo metodas

Šioje pamokoje yra 3D scena.

Trumpas pristatymas

Tiesą sakant, ankstesnėse pamokose jau buvo paminėti tam tikri Cinema 4D fizikos aspektai: pavyzdžiui, pačioje pirmoje pamokoje šioje svetainėje mes numetėme kamuolį ant lygaus paviršiaus, vėliau fizinis Cinema 4D modelis buvo laikomas kaip. vienas iš begalinio judesio generatoriaus modeliavimo būdų . Tačiau iki šiol tai buvo tik daliniai, itin paviršutiniški ir primityviausi fizikos aspektai.

Šioje pamokoje pereisime prie įdomiausio dalyko: nuodugnios fizikos studijos Cinema 4D pagal konkretų pavyzdį – pabandysime sukurti ir sukonfigūruoti (bent jau primityviausioje versijoje) pilnai funkcionalų. fizinis automobilio judėjimo modelis nelygiu reljefu, bendrais bruožais imituojant tuos pačius principus, kuriais remdamasis automobilis juda realiame pasaulyje.

Poreikis naudoti fizinį transporto priemonės judėjimo modelį slypi žodžiais „nelygiame reljefe“. Daugeliu atvejų modeliuojant automobilių eismą nereikia naudoti fizinio modelio: automobiliai tolygiai juda trajektorija (būtent tokį eismo srautą išmokome sukurti iš vieno automobilio modelio, pamenate?), vizualiai sąveikaujant praktiškai. jokiu būdu nesusiję su aplinka, o tai lengva ir paprasta pavaizduoti naudojant paprastas priemones, nesiimant fizikos. Tačiau kai tik kalbame apie sudėtingą reljefą, kuria važiuoja automobilis, arba apie nepaprastą paties automobilio elgesį (driftą, slydimą ar susidūrimus) – štai čia ateina fizikos eilė, nebent jūs ir aš norime rankiniu būdu įdėkite daugybę klavišų ir redaguokite trimačio modelio elgsenos kreives kiekvienai pastarojo elgesio sekundei (ir tai negarantuojant galutinio atvaizdavimo vizualaus patikimumo).

Tikslai ir siekiai

Pirma, apibrėžkime savo tikslus ir uždavinius. Šioje pamokoje mūsų tikslas yra pavaizduoti daugiau ar mažiau tikėtiną automobilio elgesį važiuojant nelygiu paviršiumi. Tiksliau: automobilis turi atšokti ir riedėti atsitrenkęs į nelygumus, taip pat pakabinti ratus virš duobių. Ir, žinoma, jis turėtų sulėtinti greitį įveikdamas nervingumą ir pagreitinti lygiose vietose.

Jei ne automobilio pagreitis ir lėtėjimas priklausomai nuo reljefo, galbūt supaprastintume savo užduotį „pakabindami“ automobilį nematomam „lyderiui“, judančiam tam tikra trajektorija - tokiu atveju automobilis būtų kaip vaikiškos rogutės, kurių greitis nepriklauso nuo sniego pusnių aukščio po bėgikais ir nuo tėvo žingsnio greičio, tempiančio sūnų rogutėmis. Mūsų atveju šis problemos sprendimas netinka jums ir man, tai yra, mes turėsime aprūpinti automobilio modelį labiausiai veikiančiu varikliu. Siekdami maksimalaus efekto savo automobilį paversime galiniais ratais varomą visureigį.

Pradėkime?

Pradėkime nuo automobilio išvaizdos modeliavimo (būtent išvaizdos, o ne fizinio modelio – tai ne tas pats!). Mūsų automobilį sudarys tik penki trimačiai elementai: kėbulas ir keturi ratai. Tikiuosi, suprantate, kad kiekvienas ratas turi būti atskiras modelio elementas. Be to, patartina kiekvieną ratą padaryti tvirtą (monolitinį), tai yra, sudarytą iš vieno elemento, o ne iš elementų rinkinio, kitaip vėliau susidursite su daugybe sunkumų - turėsite tvirtinti visus kartu. kiekvieno rato elementai naudojant fizinius modifikatorius, o tai, mano nuomone, būtų visiškai bereikalingas laiko švaistymas. Pagrindinis principas, kuriuo remiantis suskirstėme modelio elementus, yra galimybė vėliau vizualiai perkelti elementus vienas kito atžvilgiu visureigiui judant.

Atkreipkite dėmesį, kad visureigio kėbulo apačioje yra išpjovos ratams – iš karto rezervuosiu, kad jų nebuvimas netrukdytų mūsų būsimo fizinio modelio darbui (vėliau pamatysite patys), bet žiūrint animacija, kurią galėtumėte pamatyti tiesiai per dugną, o tai, žinoma, būtų grubi vizualinė klaida.

Dabar pereikime prie svarbiausio dalyko: tikrojo fizinio visureigio modelio sukūrimo. Iš karto galite manyti, kad laikas pritvirtinti ratus prie kūno. Jokiu būdu! Ne dabar, ne vėliau. Ir todėl. Faktas yra tas, kad jei ratus pritvirtintumėte tiesiai prie korpuso, vėl kiltų daug sunkumų: fizinis Cinema 4D modelis ratus suvoktų kaip kūno viduje(t. y. tarsi įstrigę jo viduje) ir bet kokia kaina bandytų juos išlaisvinti, ko pasekoje vietoje daugiau ar mažiau tikėtino ratų elgesio pamatytumėte daugiausia jų mažą, nenutrūkstamą vibraciją ir minimali reakcija į fizinę sąveiką su kitais visureigį supančiais objektais. Žinoma, šią problemą galima visiškai išspręsti tiksliai sureguliavus ir daug laiko reikalaujant scenos ir modelių dinamikos reikšmių, tokių kaip intervalai, kuriuos pasiekus prasideda trimačių elementų sąveika, reguliavimas, tačiau mes eis paprastesniu keliu.

Eisime paprastesniu maršrutu – ir šį kartą kursime ne vizualinį, o fizinį automobilio kėbulo modelį. Kaip sukūrė autorius, tai yra įprasčiausias daugiakampis kubas. Pas jus tai galėtų būti bet koks kitas daugiakampis objektas – svarbiausia, kad po visureigio kėbulu jo nesimatytų, o tai būtų daugiakampis modelis, kurio kraštai pakankamai nutolę nuo ratų. Šį elementą sutartinai vadinsime svorio centru.

Kodėl taip yra, klausiate? Kodėl tai negali būti NULL objektas arba splainas?

Nes mūsų sukurtas svorio centras pagal apibrėžimą ir savo pavadinimą yra skirtas aktyviai dalyvauti fiziniame visureigio modelyje. Nei splainai, nei NULL objektai, turintys fizines savybes, pastarųjų nenaudoja, nes neturi fizinio paviršiaus.

Taigi, buvo sukurtas visureigio svorio centras. Pereikime prie ratų tvirtinimo. Jei nebūtų fizinio modelio, objektų tvarkyklėje juos tiesiog pajungtume kubui (ar net kūnui), ir to visiškai pakaktų. Mūsų atveju ratai turėtų būti pritvirtinti ne standžiai, o atsižvelgiant į tam tikrą fizinę laisvę, tai yra galimybę šiek tiek pasislinkti svorio centro atžvilgiu, kai vyksta fizinė sąveika su kitais scenos objektais (pavyzdžiui, su nelygiu kelio dangos).

Būtent tokio tipo tvirtinimui „Cinema 4D“ pateikia „Connector“ tipo objektus (iš anglų kalbos „connect“ - „to connect“). Eikite į viršutinį meniu, suraskite elementą „Simuliacija“, išskleidžiamajame meniu pasirinkite „Dinamika“ ir išskleidžiamajame submeniu spustelėkite „Connector“.

Matome, kad darbo lange atsirado naujas objektas, o jo pavadinimas atsirado objektų tvarkyklėje. Pradėkime nuo dešiniojo priekinio rato. Mes dedame jungtį toje vietoje, kur yra rato geometrinis centras, kuris bus pritvirtintas prie korpuso naudojant jungtį - o paties rato geometrinis centras turėtų būti toje vietoje, kur yra rato stebulės centras. esantis prie vairo.

Dabar reikia sukonfigūruoti jungtį. Objektų tvarkyklėje pasirinkite jo pavadinimą ir pamatysite žemiau atsidariusį ypatybių langą.

Pirmasis parametras, kurio reikšmę turėtume pakeisti, yra jungties tipas (parametras „Tipas“), jis nustato, kaip ratas judės kėbulo atžvilgiu. Akivaizdu, kad tinkamiausias jungties tipas mūsų atveju bus „Ratų pakaba“. Lauke, esančiame priešais žodžius „Objektas A“, vilkite svorio centro pavadinimą iš objektų tvarkyklės; žemiau esančiame paveikslėlyje jis pažymėtas kaip „Pagrindas“ - tai yra objektas, kuriam Tvirtiname ratą. Lauke, esančiame priešais žodžius „Object B“, vilkite rato pavadinimą (paveikslėlyje, nurodytame „Wheel_FR“, iš santrumpos „Rato priekinė dešinė“) - tai yra prieštarauti tai pridedame prie jūsų. Mes neliesime parametrų „Priedas A“ ir „Priedas B“ - jie nurodo, kur yra objektų masės centrai, o numatytosios reikšmės šiuo atveju mums tinka.

Pereikime prie tikslaus jungties derinimo.

Nustatymas „Ignoruoti susidūrimus“ skirtas, kai norite išvengti fizinės sąveikos tarp rato ir svorio centro – pavyzdžiui, jei jungties nustatymai leidžia ratui nukrypti iki 45 laipsnių, bet ratas vis tiek remiasi į objektą. liečiant. pritvirtintas ir negali nukrypti iki didžiausio leistino kampo, tada šis nustatymas gali padėti. Parametras „Vairavimo kampas“ yra didžiausias leistinas rato nuokrypio nuo pradinės padėties kampas. Parametras „Suspension Rest Position“ nustato vertikalų rato poslinkį ramybės būsenoje (tai yra tais momentais, kai ratas su niekuo nesąveikauja). Mūsų atveju reikšmė yra -15 cm. - jei pakeisite į -25, visureigio kėbulas ratų atžvilgiu bus pakeltas dar aukščiau nei šiuo metu, o prošvaisa padidės, tačiau tuo pačiu sumažės visureigio stabilumas, nes svorio centras bus aukščiau - ar ne, tai jau primena automobilių stabilumo balansą realiame pasaulyje? Pakabos minkštumas priklauso nuo parametro „Pakabos standumas“ reikšmės. Kuo mažesnė vertė, tuo minkštesnė pakaba. Parametras „Pakabos išmetimas“ nustato pakabos „atšokimą“. Ir galiausiai, jei norite, galite aktyvuoti parametrus „Apatinė riba Y“ ir „Viršutinė riba Y“ ir nurodyti jiems atstumo reikšmes, už kurių ratas negali nukrypti.

Baigę nustatyti jungtį, tą pačią operaciją - pradedant nuo naujos jungties sukūrimo - kartojame antrajam priekiniam ratui, šį kartą kairiajam. Užuot važinėję viršutiniame meniu, kaip tikriausiai jau supratote, galite tiesiog rasti dešiniojo priekinio rato jungtį, kurią sukūrėme anksčiau, ir iš visų jėgų paspaudę ir laikydami klaviatūros klavišą „Ctrl“, vilkite jungties pavadinimą į tuščią vietą objektų tvarkyklėje – atlikę šią operaciją, mes ir jūs gausime naują jungties kopiją, kuri taip pat paveldės visus nustatymus iš originalo. Svarbiausia yra nepamiršti naujos jungties savybių lauke „Objektas B“ pakeisti dešiniojo rato pavadinimą į kairiojo.

Priekiniai ratai baigti. Pereikime prie galo.

Ir iš karto susiduriame su iš pirmo žvilgsnio kiek neakivaizdžiu klausimu: kiek variklių turėtų turėti mūsų visureigis? Koks keistas klausimas, sakysite – vienas, žinoma.

Leiskite paaiškinti, su kuo susijęs šis klausimas. Tikrame automobilio mechanizme sukimo momentas abiem varomiesiems ratams perduodamas vienu metu per gana sudėtingą mechaninių pavarų sistemą. Jums ir man nėra prasmės modeliuoti šią pavaros sistemą, nes mes neturime užduoties vizualizuoti visureigio vidinės struktūros, o tai reiškia, kad vietoj visiško variklio veikimo galime sau leisti bet kokią supaprastintą fizinę automobilio imitaciją. tai tol, kol varomieji ratai sukasi ir stumia automobilį į priekį.

Taigi jūs ir aš turime du alternatyvius sprendimus: jei mums labai reikia pavaizduoti atskira dviejų varomųjų ratų trauka, prie virtualaus dizaino galime pridėti du atskirus variklius, kurių kiekvienas suks savo ratą. Jei nereikia modeliuoti atskiros traukos, efektyviausias ir paprasčiausias būdas paleisti automobilį yra sukurti vadinamąją „ratų porą“ – du tvirtai sucementuotus ratus, kuriuos varo vienas variklis.

Šioje pamokoje pasirinksime antrą, paprastesnį būdą – aširačio sukūrimą ir jo sukimąsi vienu varikliu. Su įspėjimu, kad iš principo, jei norite, galite apsunkinti šį metodą - pavyzdžiui, sukite ne aširatį, o ašį su prie jo pritvirtintais varančiaisiais ratais, naudojant jungtis, kad pastarieji laisvai siūbuotų pirmyn ir atgal, kaip mes jau sukonfigūravome priekinių ratų ratus Tačiau šioje pamokoje be reikalo neapsunkinsime savo užduoties, jei turite noro, eksperimentuokite patys pagal prie šios pamokos pridėtą sceną, nuorodą į ją rasite pamokos pradžioje.

Taigi, nuspręsta - sukuriame aširatį: pasirenkame du galinius ratus - galite darbiniame lange, galite eiti į objektų tvarkyklę, kur jums patogiau - tada objektų tvarkyklėje dešiniuoju pelės mygtuku spustelėkite bet kurį iš jų ir išskleidžiamajame kontekstiniame meniu ieškome elemento „Prisijungti“ +Ištrinti“ („Prisijungti ir ištrinti“). Viršuje tame pačiame kontekstiniame meniu yra elementas „Connect“ – jungiant elementus sukuriamas naujas objektas, nepaliesti sujungtų modelių originalai; mums nereikės atskirų galinių ratų originalų.

Matome, kad visureigio galiniai ratai tapo vienu trimačiu elementu – to mums ir reikėjo.

Sukuriame kitą jungtį - šį kartą galiniam aširačiui, o atsižvelgiant į jo monolitiškumą, yra tik viena, tada ją sukonfigūruojame. Natūralu, kad jį dedame aširačio centre.

Dabar sukurkime variklį: viršutinis meniu, vėl elementas „Simuliacija“, išskleidžiamasis meniu, poelementas „Dinamika“, išskleidžiamajame meniu – „Variklis“.

Sukurtą variklį dedame ten pat, kur ir aširačio jungtis - viduryje tarp galinių ratų (arba, moksliškai kalbant, galinio aširačio geometriniame centre), tada objektų tvarkyklėje pasirenkame jo pavadinimą, sklandžiai judame. mūsų žvilgsnis į variklio savybių langą, kuris atsidaro apačioje, ir einame į statybvietę.

Laukelyje šalia žodžių „Objektas A“ vilkite galinio aširačio pavadinimą iš objektų tvarkyklės (paveiksle jis nurodytas kaip „Galiniai ratai“). Nieko nevelkame į lauką šalia žodžių „Objektas B“. Parametrui „Tipas“ pasirinkite reikšmę „Kampinis“ - viskas teisinga, nes norint, kad visureigis judėtų, mūsų sukurtas variklis turi nuolat sukti varantįjį aširatį tam tikru kampu. Nustatykite parametrą „Režimas“ į „Reguliuoti greitį“. Galiausiai nurodome skaitines parametrų „Kampinis tikslinis greitis“ ir „Sukimo momentas“ reikšmes.

Tikriausiai esate pasiruošę paleisti animaciją ir patikrinti rezultatus. Jei taip, tai dar anksti: juk atlikome tik vieną darbo dalį - nustatėme fizinį poveikį objektams, o pačių fizinių objektų dar neturime. O ratai, sakysite, ir kėbulas, ir svorio kubas? Tiesa, sukurti daugiakampiai modeliai, tačiau fiziškai įtakos jėgoms dar nėra nei ratų, nei kėbulo, nei svorio kubo – kol ratams, kėbului ir svorio kubui nepriskiriama dinamikos žyma. Nes būtent dinamikos žyma, priskirta daugiakampiui trimatės scenos elementui, rodo, kad šis elementas dalyvauja sąveikoje su kitais elementais, turinčiais dinamines charakteristikas.

Pradėkime nustatyti visureigio fizines charakteristikas. Ir tuo pačiu mes sukuriame hierarchinę elementų, iš kurių ji susideda, struktūrą. Pirmiausia sukuriame grupę, kurioje bus renkami visi automobilio elementai (jei tai dar nebuvo padaryta) - tai galima padaryti sujungus kelis pirmuosius po ranka pasitaikiusius elementus, naudojant klavišų kombinaciją Alt + G (Primenu, kad skirtingai nuo visuotinai priimto Cinema 4D nuoseklaus atskirų klavišų paspaudimų metodo, ši kombinacija spaudžiama vienu metu!), arba sukuriant NULL objektą.

Toliau sukurtą grupę vadiname kokiu nors unikaliu, nepakartojamu ir nepamirštamu žodžiu (pavyzdžiui, autorius pavadino „CAR“) ir į jį sukramsname visus su visureigiu susijusius elementus: kėbulą, ratus, jungtis, svorio kubą ir variklį.

Dabar grupės elementus skiriame kaip fizinės sąveikos su aplinkiniu fiziniu modeliu dalyvius: pasirinkite grupės pavadinimą, dešiniuoju pelės mygtuku spustelėkite jį, išskleidžiamajame meniu perkelkite pelės žymeklį ant elemento „Dinamikos žymos“. ir paskutinio submeniu išskleidžiamajame meniu pasirinkite vienintelį elementą - „Dynamics Body“.

Jei iki šiol atidžiai skaitėte šią pamoką, galite paklausti: kaip „CAR“ grupė, būdama NULL objektas, gali fiziškai sąveikauti fiziniame modelyje? Tiesa, pats objektas NULL neveikia. Bet dinamikos savybes iš jos gali paveldėti visi jai pavaldūs elementai ir nereikia kiekvienam elementui atskirai priskirti dinamikos žymos. Svarbiausia yra teisingai nustatyti grupės dinamikos žymą. Konfigūruoti: pasirinkite žymą ir žemiau atsidariusiame ypatybių lange pasirinkite skirtuką „Dinamika“, kuriame suaktyviname parametrą „Įjungta“ (taip įtraukiame sąveikos fiziką) ir parametro „Dynamic“ reikšmę pasirinkite „On“ ( taip nurodant grupės dalyvavimą visose įprastose fizinių taisyklių scenoje, tokiose kaip gravitacija ir pan.)...

Tada eikite į skirtuką „Susidurimas“ tame pačiame ypatybių lange ir nurodykite reikšmes, kurios verčia grupės elementus paveldėti dinamikos taisykles: „Taikyti žymą vaikams“ parametrui „Paveldėti žymą“ ("Paveldėjimas"), „Visi“ – „Individualūs elementai“, varnelė – „Savęs susidūrimai“ ir „Automatinis (MoDynamics)“ – „Forma“ („Grandinė“). Likusius parametrus sukonfigūruojame pagal jūsų skonį.

Čia derėtų pagaliau prisiminti visureigio kėbulą. Pagal mūsų idėją, ji taip pat turėtų sąveikauti su supančiu fiziniu trimatės scenos modeliu – pavyzdžiui, mesti nosimi kartoninių dėžių sienelę – tačiau tuo pat metu neturėtų sąveikauti su kitais savo grupės elementais. - su svorio kubu ir ratukais. Norėdami pasiekti šį rezultatą, pajungsime jį svorio kubui ir kėbului priskirsime individualią dinamikos žymą – kaip ir automobilio elementų grupę, tačiau kėbulo dinamikos žymoje išjungsime parametrą „Dynamic“ (nustatykite reikšmę „Išjungta“) skirtuke „Dinamika“ (atkreipkite dėmesį, kad parametras „Įjungta“ lieka aktyvuotas, kitaip kūnas visiškai nustos dalyvauti fiziniame scenos modelyje, o bet kokia kliūtis, kuri kliudys visureigiui laisvai pereiti per kūną!). Korpusui priskirtos dinamikos žymos skirtuke „Susidurimas“ galite nurodyti „Nėra“ ir „Išjungta“ atitinkamai parametrams „Paveldėti žymą“ ir „Individualūs elementai“ - kūnas neturi pavaldžių elementų, kuriems turi būti perduotos dinaminės kūno savybės.

Belieka prie trimatės scenos pridėti ne kartą ne kartą minėtą aplinkinį fizinį modelį – kažkokį nelygų reljefą, kuris paskutinėje animacijoje atskleistų fiziškai tikėtiną automobilio reakciją į sąveiką su duobėmis. Prie pamokos pridėtoje scenoje tai grubus kažkokios arenos, kurios branduolys išmargintas piliakalniais, panašumas.

Pagaliau

Šioje pamokoje mokėmės sukurti paprasčiausią fizinį automobilio judėjimo modelį – be jokių papildomų įskiepių ir modulių, naudojant standartinius Cinema 4D įrankius. Pamokoje, kaip pastebėjote, posūkių modeliavimas nekalbamas, mūsų sukurtas modelis gali judėti tik tiesia linija – žinoma, nebent nelygus reljefas po ratais pakeis judėjimo trajektoriją (taip ir nutinka žemiau esančiame vaizdo įraše). Beje, autorius sąmoningai pakoregavo trimatės scenos fizinio modelio parametrus taip, kad visureigio judėjimas būtų tarsi perdėtas, kad būtų aiškiai parodyta ratų ir automobilio kėbulo sąveika su nelygumai. Be to, prie pamokos pridėtoje scenoje yra ir kitų pamokoje nepaminėtų elementų, skirtų fotografavimui ir apšvietimui. Vėliau, galbūt, svetainėje bus svarstomi sudėtingesni fiziniai modeliai.

Galutinis rezultatas yra animacijos forma.


Sutrumpintas straipsnio vertimas-perpasakojimas: .

Įvadas

Straipsnyje aprašomi objektų judėjimo modeliavimo požiūrio pagrindai, kuriuos patogu naudoti kompiuteriniuose žaidimuose. Šis metodas yra paprastas, jį įgyvendinančios programos veikia greitai ir yra gana stabilios. Be to, norint suprasti jo pagrindus, nereikia specialių matematinių žinių (nors pats požiūris turi tvirtus matematinius pagrindus). Su jo pagalba galite imituoti audinių, minkštųjų ir kietųjų kūnų judėjimą, taip pat kūnus atsižvelgiant į ryšius.

Fizinis modeliavimas, tai yra simbolių judėjimo modeliavimas remiantis fizikos (tiksliau, mechanikos) dėsniais, buvo tiriamas gana ilgą laiką. Literatūroje siūlomi įvairūs metodai (žr. kt.), daug pastangų įdėta kuriant tikslius ir patikimus algoritmus. Tikslūs judesio modeliavimo metodai fizikoje žinomi jau seniai. Tačiau žaidimams ir virtualios realybės sistemoms tikslumas nėra svarbiausias privalumas (nors ir gerai, kai yra). Daug svarbiau yra patikimumas (programuotojas gali kiek nori iškraipyti tikrovės modelį, jei tik sugeba sužavėti žaidėją) ir vykdymo greitis (atlikti skiriama tik dalis laiko, kurio trunka animacijos kadras. judėjimo modeliavimo skaičiavimai). Fizinio modeliavimo atveju terminas „tikėtinumas“ taip pat reiškia stabilumą: modeliavimo metodas, kai kūnai prasiskverbia į kliūtis arba atsimuša, kai turėtų gulėti ramiai, negali būti laikomas sėkmingu. Šiame darbe aprašyti metodai buvo sukurti visų pirma siekiant užtikrinti skaičiavimo patikimumą ir greitį. Jie pasižymi dideliu našumu ir yra gana paprasta įdiegti (bent jau lyginant su kitais metodais, kurie išsprendžia tas pačias problemas).

Nagrinėjamas metodas yra kartotinis, todėl, pradedant nuo tam tikro žingsnio, jį galima bet kada sustabdyti. Tai leidžia kompromisą tarp skaičiavimo tikslumo ir sugaišto laiko: jei tam tikra paklaida laikoma priimtina, kodui galima leisti veikti greičiau; Be to, klaidos dydį galima pasirinkti adaptyviai vykdymo metu. Šis metodas taip pat tvarko susidūrimus ir ramybės kontaktus bei susidoroja su kūnų, sukrautų vienas ant kito, krūvos modeliavimu, o tai yra daugelio fizinių variklių problema.

Metodo sėkmė priklauso nuo teisingo kelių metodų derinio ir privalumų panaudojimo:

  • Verlet skaitmeninio integravimo metodas;
  • susidūrimų ir kūno įsiskverbimo valdymas naudojant projekciją;
  • paprastas apribojimų sprendėjas, naudojant relaksaciją;
  • kvadratinės šaknies aproksimacija, kuri padidina skaičiavimų greitį;
  • modeliuojant kietąsias medžiagas kaip ryšiais sujungtas daleles.

Trumpai paaiškinsime kiekvieną iš šių metodų. Rašydamas šį dokumentą, autorius stengėsi, kad jis būtų prieinamas kuo platesnei auditorijai, neprarandant esminės įgyvendinimui būtinos informacijos. Tai reiškia, kad matematinių paaiškinimų ir pagrindimų yra iki minimumo, nebent jie yra labai svarbūs dalyko supratimui. Darbo tikslas – pademonstruoti galimybę įgyvendinti gana pažangų ir tvirtą fizinio modeliavimo metodą, neįklimpstant į matematines subtilybes.

Turinys išdėstytas taip. 2 skyriuje aprašomas dalelių sistemos vaizdavimas nenaudojant greičio. Šis vaizdavimas turi nemažai privalumų, iš kurių reikšmingiausi yra jungčių stabilumas ir lengvumas bei kiti apribojimai. 3 skyriuje aprašoma, kaip vyksta susidūrimo valdymas. Tada 4 skyriuje dalelių sistema papildyta jungtimis, kurios leidžia imituoti audinio judėjimą. 5 skyriuje paaiškinama, kaip sukurti tarpusavyje susijusių dalelių sistemą, kad būtų galima modeliuoti standųjį kūną. Toliau, 6 skyriuje, parodysime, kaip įdiegti jungtis tarp korpusų (ypač vyrių). 7 skyriuje pateikiamos įvairios trumpos pastabos ir tam tikra trinties įgyvendinimo patirtis.

Toliau vektoriai žymimi raidėmis su rodyklėmis, o jų komponentai – apatiniais indeksais: \(\vec(x)=(x_1,x_2,x_3)\) .

Verlet integravimo metodas

Modeliavimo (t. y. fizinio proceso imitavimo naudojant kompiuterinę sistemą) esmė yra dalelių sistema. Paprastai, įgyvendinant tokią sistemą, daroma prielaida, kad kiekviena dalelė turi dvi pagrindines charakteristikas: koordinatę (poziciją) \(\vec(x)\) ir greitį \(\vec(v)\) . Tada naujos koordinačių \(\vec(x)^\prime\) ir greičio \(\vec(v)^\prime\) reikšmės apskaičiuojamos naudojant formules

$$ \begin(lygiuotas) \vec(x)^\prime &= \vec(x) + \vec(v) \Delta t, \\ \vec(v)^\prime &= \vec(v) + \vec(a) \Delta t, \end(sulygiuotas) $$

kur \(\Delta t\) yra laiko žingsnis, \(\vec(a)\) yra pagreitis, apskaičiuotas pagal 2-ąjį Niutono dėsnį \(\vec(f)=m \vec(a)\) (kur \(\vec(f)\) – bendra jėga, veikianti dalelę). Pateiktose formulėse realizuojamas paprasčiausias skaitmeninės integracijos būdas – Eilerio metodas.

Apsvarstysime kitą dalelės, kurioje greitis nenaudojamas, aprašymą: užuot saugoję kiekvienos dalelės padėtį ir greitį, išsaugosime esamą dalelės padėtį \(\vec(x)\) ir jos padėtį ankstesnėje integravimo žingsnis \(\vec(x)^ (*)\) . Darant prielaidą, kad integravimo žingsnis yra pastovus, gauname šias formules naujoms reikšmėms apskaičiuoti:

$$ \begin(lygiuotas) \vec(x)^\prime &= 2\vec(x) - \vec(x)^(*) + \vec(a) \Delta t^2, \\ \vec( x)^(*) &= \vec(x). \end(sulygiuotas) $$

Šis skaitmeninės integracijos metodas vadinamas Verleto metodu (žr.) ir aktyviai naudojamas molekulinėje dinamikoje.

Verleto metodas pagrįstas apytiksle antrosios išvestinės apskaičiavimo formule

$$ \frac(\Delta^2 \vec(x))(\Delta t^2) = \frac(\frac(\vec(x)^\prime - \vec(x))(\Delta t) - \frac(\vec(x) - \vec(x)^(*))(\Delta t) )(\Delta t) = \frac(\vec(x)^\prime - 2\vec(x) + \vec(x)^(*))(\Delta t^2) = \vec(a) $$

Šis aproksimavimas nėra pats tiksliausias (yra pažangesnių skaitmeninio integravimo metodų), tačiau jis yra stabilus ir veikia greitai. Sumažindami koeficientą 2 iki, tarkime, 1,99, taip įvedame pasipriešinimo jėgą, kuri išsklaido sistemos energiją. Taip pat atkreipkite dėmesį, kad \(\vec(x)-\vec(x)^(*)\) yra atstumas, nuvažiuotas per paskutinį integravimo veiksmą (\(\vec(v)\Delta t\) ).

Integravimo veiksmo pabaigoje kiekvienos dalelės \(\vec(x)\) dabartinė padėtis išsaugoma atitinkamame kintamajame \(\vec(x)^(*)\), kad būtų galima naudoti kitame žingsnyje. Jei sistemoje yra daug dalelių, tai vietoj jų koordinačių kopijavimo patogu naudoti rodyklės nukreipimą.

Kodas, įgyvendinantis aukščiau aprašytas idėjas, gali atrodyti taip (Vector3 klasėje yra visos reikalingos operacijos su vektoriais)

klasės dalelių sistema ( Vector3 m_x [ NUM_DALELĖS ]; // Dabartinė padėtis Vector3 m_oldx [ NUM_PARTICLES ]; // Ankstesnės pareigos Vector3 m_a [ NUM_PARTICLES ]; // Bendra jėga (pagreitis) Vector3 m_vGravitacija ; // Gravitacijos plūdė m_fTimeStep ; viešas: void TimeStep(); privatus : void Verlet(); void SatisfyConstraints(); void AccumulateForces(); // (praleisime konstruktorius, lauko inicijavimą ir kt.) }; // integravimo žingsnis Verlet metodu void ParticleSystem::Verlet() ( for (int i = 0 ; i< NUM_PARTICLES ; i ++ ) { Vector3 & x = m_x [ i ]; Vector3 temp = x ; Vector3 & oldx = m_oldx [ i ]; Vector3 & a = m_a [ i ]; x += x - oldx + a * fTimeStep * fTimeStep ; oldx = temp ; } } // kiekvieną dalelę veikiančių jėgų sumavimas void ParticleSystem::AccumulateForces() ( // Visos dalelės yra gravitacijos įtakoje už (int i = 0 ; i< NUM_PARTICLES ; i ++ ) m_a [ i ] = m_vGravity ; } // tikrinama, ar laikomasi uždėtų ryšių void ParticleSystem::SatisfyConstraints() ( // Dabar mums nesvarbu, kaip tai įgyvendinama.) // skaičiavimo žingsnis void ParticleSystem :: TimeStep () ( AccumulateForces (); Verlet (); SatisfyConstraints (); )

Kol kas viskas, kas aprašyta aukščiau, neatrodo labai įspūdingai. Šio metodo pranašumai paaiškės, kai pereisime prie suvaržymų naudojimo ir standžių kūnų aprašymo.

Pabandykite nustatyti \(\vec(a)=(0,0,1)\) ir pradines sąlygas \(\vec(x)=(1,0,0)\) , \(\vec(x)^*= (0,0,0)\) . Ranka apskaičiuokite kelis žingsnius ir pažiūrėkite, kas atsitiks.

Susidūrimai ir kontaktų valdymas naudojant projekciją

Kūnų kontaktų apdorojimo metodai, pagrįsti baudos funkcijų naudojimu (bausme pagrįstos schemos), leidžia manyti, kad sąlyčio taške, kur galimas kūnų įsiskverbimas vienas į kitą, reikia įkišti spyruoklę šiam kontaktui imituoti. Šį metodą lengva įgyvendinti, tačiau tai sukelia nemažai rimtų problemų. Visų pirma labai sunku pasirinkti spyruoklės standumą, kad, viena vertus, objektai neįsiskverbtų vienas į kitą per giliai, kita vertus, kad sistema neprarastų stabilumo dėl spyruoklės standumo. būdamas per aukštas. Kitas susidūrimo apdorojimo metodas yra tas, kad aptikus susidūrimą laikas „atsukamas“ atgal iki tikslaus kūnų kontakto momento (pavyzdžiui, naudojant dvejetainę paiešką), tada koreguojamos kūnų padėties ir greičiai. (naudojant susidūrimų formules, žinomas iš fizikos kurso ), po to skaičiavimas pradedamas iš naujo nuo šio momento. Ir taip – ​​už kiekvieną susidūrimą. Nelabai ekonomiškas būdas, jei planuojate imituoti daugelio kūnų judėjimą realiu laiku.

Čia pažvelgsime į kitokį požiūrį. Į kliūtį prasiskverbusias daleles projektuosime už kliūties ribų. Projekcija reiškia dalelės judėjimą, pakankamai mažą, kad ją tiesiog pašalintų nuo kliūties. Paprastai tai apima dalelės judėjimą kontaktinio paviršiaus (kliūties) kryptimi, todėl terminas „projekcija“ yra kilęs.

Apsvarstykite toliau pateiktą pavyzdį. Tegul mūsų „pasaulis“ yra (0,0,0)–-(1000,1000,1000) dydžio kubo vidus, be to, dalelių atkūrimo koeficientas yra lygus nuliui (t. y. dalelių susidūrimas su paviršiumi kubas nuo jo neatsispindi). Norėdami užtikrinti, kad dalelių koordinatės liktų kubo viduje, parašome šį kodą, kuris įgyvendina projekciją:

// Priverčia daleles likti kubo viduje void ParticleSystem :: SatisfyConstraints () ( for (int i = 0 ; i< NUM_PARTICLES ; i ++ ) { // Visoms dalelėms Vector3 & x = m_x [i]; x = vmin(vmax(x, Vector3(0, 0, 0)), Vector3(1000, 1000, 1000)); ) )

(vmax yra komponentinė maksimumo apskaičiavimo operacija, o vmin yra lygiavertis minimumo apskaičiavimas). Šis kodas tvarko ir susidūrimus, ir ramybės kontaktus (ty atvejus, kai taškas yra ramybės būsenoje kubo paviršiuje) ir išsaugo visų kubo viduje esančių dalelių padėtį. Verlet metodo grožis yra tas, kad atitinkami greičio verčių pakeitimai atliekami automatiškai. Vėlesniuose TimeStep() iškvietimuose greitis bus sureguliuotas taip, kad jame nebūtų statmeno kubo paviršiui komponento (kuris atitinka nulinį atkūrimo koeficientą). Žr. 1 pav.

Pabandykite atlikti šiuos skaičiavimus patys - ir pamatysite, kad nereikia nulinti greičio statmena kubo sienelei kryptimi - tai atsitinka „savaime“. Tai gali atrodyti nereikšminga, jei apsiribosime dalelių modeliavimu, tačiau pagrindiniai Verlet metodo pranašumai išryškės, kai tik pradėsime nagrinėti ryšius ir sujungtus standžius kūnus. Tai yra, dabar.

Kelių vienu metu įvestų jungčių apdorojimas relaksacijos metodu

Audinio modelis dažniausiai yra spyruoklėmis sujungtų dalelių sistema. Tokios sistemos diferencialines lygtis nėra sunku. Tačiau viena yra statyti, o visai kas kita – išspręsti. Tuo pačiu metu iškyla visos problemos, su kuriomis susidūrėme naudojant baudos funkcijas: per kietos spyruoklės lemia, kad pati lygčių sistema tampa „standžia sistema“, o tai sukelia nestabilumą, jei naudojami paprasčiausi skaitmeninio integravimo metodai arba lėtas darbas, jei naudojami pažangesni metodai, abiem atvejais galvos skausmas garantuotas. Ir atvirkščiai, dėl per minkštų spyruoklių audinys atrodys nerealiai elastingas.

Tačiau įdomiausia būna, jei spyruoklės standumas nukreipiamas į begalybę: sistema staiga tampa išsprendžiama net ir labai paprastu (ir greitu) integravimo būdu, išlikdama stabili. Tačiau prieš toliau kalbėdami apie audinį, grįžkime prie ankstesnio pavyzdžio. Kubas, su kuriuo susidūrėme, gali būti laikomas vienašalių apribojimų rinkiniu (ty apribojimų, užrašytų nelygybių pavidalu) – po vieną kiekvienai kubo pusei – kurie turi būti vykdomi viso modeliavimo metu.

\begin (lygtis) x_i \geq 0 \ \text(and)\ x_i \leq 1000 \quad (i=1,2,3). \label(eq:C1) \end(lygtis)

Nagrinėjamame pavyzdyje, norint laikytis ryšių keliamų apribojimų (kad dalelės liktų kubo viduje), pakanka tiesiog suprojektuoti „išlipusių“ dalelių koordinates ant kubo paviršiaus. Ši idėja aprašyta šiame pseudokode:

// Pseudokodas, skirtas suvaržymams vykdyti (1) jei i = 1, 2, 3, rinkinys xi = min (maks. (xi, 0), 1000)

Tai galima įsivaizduoti taip, tarsi dalelę ir kliūties paviršių jungtų be galo standi spyruoklė, kuri, pailgėjusi, akimirksniu grįžta į įprastą nulį.

Išplėskime modelį pridėdami prie jo 100 ilgio strypą. Norėdami tai padaryti, turime apibrėžti dvi daleles (\(\vec(x)_1\) ir \(\vec(x)_2\) ) ir reikalauti, kad atstumas tarp jų visada yra lygus 100. Šio dvišalio ryšio matematinė žyma yra tokia:

\begin(lygtis) |\vec(x)_2-\vec(x)_1| = 100. \label(eq:C2) \end(lygtis)

Net jei pradiniu laiko momentu dalelių padėtis tenkina sąlygas \eqref(eq:C2), tai kitą akimirką šios sąlygos greičiausiai nebus įvykdytos. Norėdami gauti teisingą atstumo reikšmę, daleles perkeliame, projektuodami jas į sprendinių aibę, aprašytą \eqref(eq:C2). Tam dalelės arba nutolsta viena nuo kitos, arba pritraukiamos arčiau, priklausomai nuo to, ar skaitmeninės integracijos būdu gautas atstumas yra mažas ar didelis. Žr. 2 pav.

Dalelių perkėlimas siekiant pataisyti atstumą, kuris neatitinka apribojimo \eqref(eq:C2)

Pseudokodas, įgyvendinantis sąlygas \eqref(eq:C2):

Delta = x2 - x1 ; deltalength = sqrt(delta * delta); diff = (deltalength - restlength ) / deltalength ; x1 -= delta * 0,5 * skirtumas; x2 += delta * 0,5 * skirtumas ;

Atkreipkite dėmesį, kad delta yra vektorius, o delta * delta yra skaliarinė sandauga. Šis pseudokodas išjudins daleles arba perkels jas, kad būtų pasiektas reikiamas atstumas tarp jų. Vėlgi, galime galvoti apie tai kaip apie be galo standžią spyruoklę, kuri akimirksniu grįžta į įprastą 100 ilgį.

Dabar tarkime, kad be sąlygos \eqref(eq:C2), turi būti įvykdyta ir sąlyga \eqref(eq:C1) (dalelės turi būti kubo viduje). Gali pasirodyti, kad bandant įvykdyti sąlygą \eqref(eq:C2), kai kurios strypo dalelės pažeis \eqref(eq:C1) reikalavimus (stypas išlįs iš kubo). Žinoma, galite dar kartą projektuoti pažeidžiančią dalelę ant kubo paviršiaus, vykdydami \eqref(eq:C1), bet tada \eqref(eq:C2) bus pažeista.

Norėdami vienu metu patenkinti \eqref(eq:C1) ir \eqref(eq:C2) reikalavimus, turime išspręsti lygčių sistemą. Mes tai padarysime, bet ne tiesiogiai: tiesiog pakartosime du pseudokodo fragmentus vieną po kito tam tikrą skaičių kartų, tikėdamiesi, kad rezultatas bus naudingas. Šis metodas įgyvendinamas šiame kode:

//metro modeliavimo kubo viduje įgyvendinimas void ParticleSystem :: SatisfyConstraints () ( for (int j = 0 ; j< NUM_ITERATIONS ; j ++ ) { // Pirmiausia įvykdome sąlygas (1) už (int i = 0 ; i< NUM_PARTICLES ; i ++ ) { // Visoms dalelėms Vector3 & x = m_x [i]; x = vmin(vmax(x, Vector3(0, 0, 0)), Vector3(1000, 1000, 1000)); ) // Dabar patenkinkime (2) Vector3 & x1 = m_x [0]; Vector3 & x2 = m_x [1]; Vector3 delta = x2 - x1 ; float deltalength = sqrt(delta * delta); float diff = (deltalength - restlength ) / deltalength ; x1 -= delta * 0,5 * skirtumas; x2 += delta * 0,5 * skirtumas ; ) )

(dalelių inicijavimas čia praleistas). Nors šis „kvailio“ kartojimo metodas gali atrodyti kiek naivus, jis vis dėlto sutampa su mūsų ieškomu sprendimu! Matematikoje tai vadinama atsipalaidavimo metodas(arba Jacobi, arba Gauss-Seidel - priklausomai nuo to, kaip tiksliai tai darote, žr.). Jis veikia nuosekliai tenkindamas individualius apribojimus ir susilieja su visuotine konfigūracija, kuri vienu metu tenkina visus apribojimus. Šis metodas yra labai naudingas tais atvejais, kai vienu metu turi būti tenkinami keli nepriklausomi apribojimai.

Reikalingas pakartojimų skaičius priklauso nuo modeliuojamos sistemos ir judesio pobūdžio. Galite pritaikyti šį skaičių, įvertindami pokytį, įvykusį, palyginti su ankstesne iteracija. Jei per anksti nutrauksime iteracijas, rezultatas nebus pakankamai tikslus, tačiau Verlet metodo dėka jis tikriausiai bus šiek tiek geresnis kitame kadre, o dar geresnis kitame kadre ir pan. Tai reiškia, kad atsipalaidavimas irgi bus sustabdytas. anksti nesunaikins animacijos visiškai, bet padarys vaizdą trūkčiojantį.

Audinių modeliavimas

Tai, kad strypo tipo suvaržymas gali būti laikomas labai kieta spyruokle, leidžia tokio tipo suvaržymą naudoti audinių modeliavimui. Tarkime, kad audinys pavaizduotas šešiakampiu tinkleliu, susidedančiu iš trikampių. Kiekvienas tinklelio mazgas žymi dalelę, o kiekvienas paviršius yra strypo tipo jungtis, jungianti daleles (įprastas strypo ilgis lygus atstumui tarp mazgų, kuriuos jis jungia).

Funkcija HandleConstraints(), kuri yra atsakinga už apribojimų apdorojimą, visų apribojimų atžvilgiu naudoja atsipalaidavimą. Atsipalaidavimo ciklas gali būti kartojamas kelis kartus. Tačiau daugeliu atvejų pakanka tik vienos iteracijos, kad būtų sukurta graži animacija. Tai reiškia, kad audinio modeliavimo laiko sąnaudos daugiausia priklauso nuo to, kiek laiko reikia atlikti \(N\) kvadratinės šaknies ir \(N\) padalijimo operacijas (kur \(N\) yra tinklelio modeliavimo briaunų skaičius audinys). Žemiau parodysime triuką, kaip atsikratyti kvadratinės šaknies skaičiavimo. Tačiau pirmiausia pažiūrėkime, kaip atrodo apribojimų apdorojimas.

// Audinių modeliavimo įgyvendinimas struct Constraint ( int particleA , particleB ; float restlength ; ); // Tarkime, kad m_constraints masyvas jau egzistuoja void ParticleSystem :: SatisfyConstraints () ( for (int j = 0 ; j< NUM_ITERATIONS ; j ++ ) { for (int i = 0 ; i < NUM_CONSTRAINTS ; i ++ ) { Constraint & c = m_constraints [ i ]; Vector3 & x1 = m_x [ c . particleA ]; Vector3 & x2 = m_x [ c . particleB ]; Vector3 delta = x2 - x1 ; float deltalength = sqrt (delta * delta ); float diff = (deltalength - c . restlength ) / deltalength ; x1 -= delta * 0.5 * diff ; x2 += delta * 0.5 * diff ; } // Pritvirtinkite vieną iš dalelių, sudarančių audinį, prie pradinės vietos m_x [0] = Vector3 (0, 0, 0); ) )

Dabar aptarkime, kaip atsikratyti kvadratinės šaknies skaičiavimo. Jei visi apribojimai yra įvykdyti (gerai arba beveik įvykdyti), tada, kaip jau žinome, kvadratinės šaknies apskaičiavimo rezultatas yra \(r\) - normalus jungties (strypo) ilgis. Mes naudojame šį faktą norėdami gauti apytikslę kvadratinės šaknies funkcijos išraišką. Pakeiskime funkciją \(\sqrt(x)\) pirmosios eilės terminu iš jos Taylor serijos išplėtimo ilgio \(r\) kaimynystėje (tai atitinka vieną Niutono-Rafsono metodo iteraciją su pradinė aproksimacija \(r\)). Po kai kurių transformacijų gauname tokį pseudokodą:

// Pseudo kodas, skirtas vykdyti apribojimus (2), naudojant sqrt aproksimaciją delta = x2 - x1 ; delta *= ramybės ilgis * ramybės ilgis / (delta * delta + poilsio ilgis * ramybės ilgis ) - 0,5 ; x1 -= delta ; x2 += delta ;

Atkreipkite dėmesį, kad jei atstumas jau tenkina apribojimus (ty jei |delta|=restlentgth), tada delta bus lygi (0,0,0) ir pokyčių nebus.

Dabar apdorodami kiekvieną ryšį nebenaudojame kvadratinių šaknų. Be to, ramybės * ramybės ilgio kvadratą galima apskaičiuoti iš anksto. Daug laiko reikalaujančios operacijos sumažinamos iki \(N\) padalijimo viename kadre (ir atitinkamos atminties prieigos) – sunku sugalvoti ką nors, kas veiktų žymiai greičiau.

Apribojimai nebūtinai bus įvykdyti per vieną iteraciją, tačiau Verlet metodo dėka sistema greitai susijungia į teisingą būseną (kai tenkinami visi apribojimai) – tiesiog per kelis kadrus. Tiesą sakant, naudojant tik vieną iteraciją ir kvadratinės šaknies aproksimaciją, pašalinama lygčių sistemos standumo problema, kuri būtinai atsirastų sistemoje su absoliučiai standžiais strypais.

Tarp gretimų viršūnių porų įdėjus kaiščius, audinių modeliavimo algoritmas gali būti išplėstas iki augalų modeliavimo.

Šiame skyriuje aptariamas kodas ir lygtys daro prielaidą, kad visų dalelių masė yra vienoda. Skirtingos masės dalelės gali būti modeliuojamos taip pat, tačiau gautos lygtys bus šiek tiek sudėtingesnės.

Taigi, skirtingų masių dalelių apribojimo \eqref(eq:C2) laikymasis įgyvendinamas tokiu pseudokodu:

// Pseudo kodas, skirtas suvaržymams vykdyti (2) delta = x2 - x1 ; deltalength = sqrt(delta * delta); diff = (deltalength - restlength ) / (deltalength * (invmass1 + invmass2 )); x1 -= invmass1 * delta * skirtumas ; x2 += invmass2 * delta * skirtumas ;

Čia invmass1 ir invmass2 saugo atvirkštines dalelių mases \(\vec(x)_1\) ir \(\vec(x)_2\) . Jei norime, kad dalelė liktų stacionari, turime ją nustatyti į invmass = 0, o tai atitinka begalinę masę. Kaip aprašyta aukščiau, norint paspartinti skaičiavimus, galima naudoti apytikslius kvadratinės šaknies skaičiavimus.

Kietosios medžiagos

Standžiųjų kūnų judėjimo lygtys buvo pasiūlytos dar gerokai prieš šiuolaikinių kompiuterių išradimą. Tam, kad tais laikais gautų kokių nors naudingų rezultatų, matematikai turėjo atlikti formulių transformacijas. Tai paskatino tokių naudingų sąvokų ir įrankių atsiradimą kaip inercijos tenzorius, kampinis momentas, jėgos momentas, ketvirčiai orientacijai pavaizduoti ir kt. Tuo tarpu galimybė apdoroti didžiulius duomenų kiekius skaitmenine forma leidžia atlikti skaičiavimus. paprastesniems elementams, o kai kuriais atvejais netgi tokius skaičiavimus padaryti pelningesnius. Trimačių kietųjų kūnų atveju tai reiškia, kad gali būti patogu modeliuoti kietąją medžiagą su keturiomis dalelėmis ir šešiais ryšiais (suteikiamas teisingas laisvės laipsnių skaičius: \(4\cdot 3 - 6 = 6\)). Tai supaprastina daugybę dalykų, ir mes tai darysime toliau.

Apsvarstykite tetraedrą, kurio kiekvienoje iš keturių viršūnių yra dalelė. Be to, kiekviena iš šešių tetraedro kraštų reiškia juostos tipo apribojimą, aptartą ankstesniame skyriuje. To visiškai pakanka, kad būtų galima imituoti tvirtą kūną. Tetraedrą galima įdėti į aukščiau aptartą kubą, o Verlet integratorius užtikrins teisingą jo judėjimą. Funkcija SatisfyConstraints() turi pasirūpinti dviem dalykais: 1) kad dalelės liktų kubo viduje, ir 2) kad būtų laikomasi šešių kamieno apribojimų. Tai galima padaryti, kaip ir anksčiau, naudojant atsipalaidavimą: paprastai pakanka 3–4 pakartojimų. Nepamirškite ir efektyvių kvadratinės šaknies skaičiavimų.

Tačiau akivaizdu, kad susidūrimų metu kietieji kūnai elgsis kitaip nei „skeleto“ tetraedrai. Yra ir kita problema: iki šiol susidūrimo tarp standaus kūno ir jį supančio „pasaulio“ faktą aptikdavome tik pagal informaciją apie viršūnes: jei viršūnė buvo kubo išorėje, ji vėl buvo projektuojama viduje. Tai puikiai veikia tol, kol „pasaulio“ vidus yra išgaubtas. Jei taip nėra, tetraedras galės prasiskverbti per „pasaulio“ ribą net tada, kai nė viena jo viršūnė neperžengs šios ribos (žr. 3 pav., kur trikampis yra plokščias tetraedro analogas). Pažiūrėkime, kaip ši problema išspręsta.

Pirmiausia pažvelkime į paprastesnę problemos versiją. Paimkime strypą, pastatykime jį į kubinį „pasaulį“ ir manykime, kad kubas turi mažą išsikišimą, nukreiptą į vidų. Dabar strypas gali kirsti „pasaulio“ ribas, nors abi jo galuose esančios dalelės lieka kubo viduje (4 pav.). Mes nesigilinsime į susidūrimo aptikimo mechanizmo kūrimo subtilybes, nes tai yra visiškai atskiras mokslas. Tarkime, kad susidūrimo aptikimo posistemis jau egzistuoja ir atlieka savo darbą: nustato kiekvieno iš dviejų susidūrusių objektų įsiskverbimo gylį ir įsiskverbimo taškų koordinates. Vienas įsiskverbimo taškų ir įsiskverbimo gylio apibrėžimų yra toks: įsiskverbimo gylis \(d_p\) yra trumpiausias atstumas, per kurį du objektai turi būti atskirti tinkama kryptimi, kad jie nesusidurtų. Įsiskverbimo taškai yra kiekvieno objekto taškai, kuriuose objektai liečiasi vienas su kitu po to, kai įvyksta aukščiau minėtas perkėlimas.

Dar kartą pažvelkite į 4 paveikslą. Čia po skaitmeninio integravimo žingsnio strypas prasiskverbė per ribą. Susidūrimo detektorius nustatė du įsiskverbimo taškus: \(\vec(p)\) ir \(\vec(q)\) . 4a pav. taškas \(\vec(p)\) iš tikrųjų sutampa su viena iš galinių dalelių: \(\vec(p)=\vec(x)_1\) . 4b pav. \(\vec(p)\) yra tarp \(\vec(x)_1\) ir \(\vec(x)_2\) 1/4 strypo ilgio atstumu nuo \ (\vec( x)_1\) . Abiem atvejais taškas \(\vec(p)\) yra ant strypo, todėl jo koordinatės gali būti išreikštos kaip linijinis taškų \(\vec(x)_1\) ir \ koordinačių derinys. (\vec(x) _2\) : \(\vec(p) = c_1\vec(x)_1 + c_2\vec(x)_2\) taip, kad \(c_1 + c_2 = 1\) . Pirmuoju atveju \(c_1 = 1\) , \(c_2 = 0\) , o antruoju - \(c_1 = 0,75\) ir \(c_2 = 0,25\) . Šios vertės parodo, kiek toli reikia perkelti atitinkamas daleles.

Norėdami pataisyti strypo padėtį, perkelkite jį taip, kad taškas \(\vec(p)\) sutaptų su \(\vec(q)\) . Norėdami tai padaryti, daleles \(\vec(x)_1\) ir \(\vec(x)_2\) perkeliame kryptimi, kurią nurodo vektorius, jungiantis \(\vec(p)\) ir \(\ vec(q)\ ): .

Pirmuoju atveju (4a pav.) tiesiog projektuojame \(\vec(x)_1\) už regiono, kuriame jam „draudžiama“ būti, kaip ir anksčiau (kryptimi \(\vec(q) )\) ). To pakaks, o koordinačių \(\vec(x)_2\) keisti visai nereikia. Antruoju atveju (4b pav.) tašką \(\vec(x)_1\) taip pat reikia perkelti į didesnį atstumą nei \(\vec(x)_2\) , nes taškas \(\vec (p)\) yra arčiau \(\vec(x)_1\) (iš tiesų, nes \(\vec(p) = 0,75\vec(x)_1 + 0,25\vec(x)_2\), tada kiekvieną kartą, kai perkeliame \(\vec(x)_1\) 0,75, \(\vec(x)_2\) perkeliame tik 0,25). Kitaip tariant, naujas dalelių \(\vec(x)_1^\prime\) ir \(\vec(x)_2^\prime\) pozicijas pateikia santykiai

\begin (lygtis) \begin (lygiuotas) \vec(x)_1^\prime &= \vec(x)_1 + 0,75\lambda\cdot\vec(\Delta), \\ \vec(x)_2^\ pirminis &= \vec(x)_2 + 0,25\lambda\cdot\vec(\Delta), \end (sulygiuotas) \label(eq:x_new) \end(lygtis)

kur \(\lambda\) yra nežinomas dydis. Nauja dalelės \(\vec(p)\) padėtis - \(\vec(p)^\prime\) - apskaičiuojama pagal formulę

$$ \vec(p)^\prime = c_1\vec(x)_1^\prime + c_2\vec(x)_2^\prime . $$

Prisiminkime, kad norime pasiekti \(\vec(p)^\prime = \vec(q)\) , tai yra, turime pasirinkti \(\lambda\) tiksliai taip, kad \(\vec(p ) ^\prime\) kaip rezultatas sutapo su \(\vec(q)\) . Kadangi daleles judame tik kryptimi \(\vec(\Delta)\) , tada \(\vec(p)\) taip pat juda kryptimi \(\vec(\Delta)\), taigi ir sprendimas lygtį \ (\vec(p)^\prime = \vec(q)\) galima rasti išreiškiant \(\lambda\) iš

\begin(lygtis) \vec(p)^\prime\cdot\vec(\Delta) = \vec(q)\cdot\vec(\Delta) . \label(eq:pq) \end(lygtis)

Užrašę išraišką kairėje lygybės pusėje, gauname

$$ \begin(lygiuotas) \vec(p)^\prime\cdot\vec(\Delta) &= (0,75\vec(x)_1^\prime + 0,25\vec(x)_2^\prime) \cdot \vec(\Delta) \\ &= (0,75 (\vec(x)_1 + 0,75\lambda\cdot\vec(\Delta)) + 0,25 (\vec(x)_2 + 0,25\lambda\cdot\vec( \Delta))) \cdot\vec(\Delta) \\ &= ((0,75\vec(x)_1 + 0,25\vec(x)_2)\cdot\vec(\Delta) + \lambda(0,75^2 + 0,25^2)\cdot\Delta^2 \\ &= \vec(p) \cdot\vec(\Delta) + \lambda(0,75^2 + 0,25^2)\cdot\Delta^2 , \end( sulygiuotas)$$

kuri, atsižvelgiant į dešinę pusę \eqref(eq:pq), suteikia

$$ \lambda = \frac((\vec(p)-\vec(q)) \cdot\vec(\Delta))((0,75^2 + 0,25^2)\cdot\Delta^2) . $$

Pakeitę rastą \(\lambda\) į \eqref(eq:x_new), gauname pataisytas dalelių \(\vec(x)_1\) ir \(\vec(x)_2\) vietas, kuriose \( \vec( p)^\prime\) atitiks \(\vec(q)\) .

5 paveiksle parodyta padėtis, kuri atsiranda dalelėms pajudėjus. Abipusio objektų prasiskverbimo nebėra, tačiau buvo pažeistas reikalavimas, kad strypo ilgis išliktų pastovus. Norėdami tai ištaisyti, atlikime dar vieną atsipalaidavimo ciklo iteraciją (ar net kelias), po kurios užbaigiame dalelių padėties taisymo ciklą.

Tetraedro atveju aukščiau aprašyta strategija veiks panašiai. Pirma, randami įsiskverbimo taškai \(\vec(p)\) ir \(\vec(q)\) (jie taip pat gali būti trikampio viduje) ir \(\vec(p)\) pavaizduoti kaip linijinis keturių dalelių derinys \(\vec(p)=c_1\vec(x)_1+c_2\vec(x)_2+c_3\vec(x)_3+c_4\vec(x)_4\) taip, kad \(c_1+c_2+c_3+c_4=1\) (tam reikės išspręsti nedidelę tiesinių lygčių sistemą). Kartą rastas \(\vec(\Delta) = \vec(q)-\vec(p)\), reikšmę \(\lambda\) bus galima rasti naudojant formulę

$$ \lambda = \frac((\vec(p)-\vec(q)) \cdot\vec(\Delta))((c_1^2 + c_2^2 + c_3^2 + c_4^2)\cdot \Delta^2) , $$

o pataisytos dalelių padėtys apibrėžiamos kaip

$$ \begin(align*) \vec(x)_1^\prime &= \vec(x)_1 + c_1\lambda\cdot\vec(\Delta), \\ \vec(x)_2^\prime & = \vec(x)_2 + c_2\lambda\cdot\vec(\Delta), \\ \vec(x)_3^\prime &= \vec(x)_3 + c_3\lambda\cdot\vec(\Delta ), \\ \vec(x)_4^\prime &= \vec(x)_4 + c_4\lambda\cdot\vec(\Delta). \end(lygiuoti*) $$

Taigi, mes svarstėme vieno standaus kūno susidūrimą su nejudančiu „pasauliu“. Aukščiau aprašytą metodą galima lengvai apibendrinti, kad būtų galima valdyti kelių standžių kūnų susidūrimus. Šiuo atveju susidūrimai apdorojami vienai kūnų porai vienu metu ir, užuot judę tik \(\vec(p)\) , turėsite perkelti \(\vec(p)\) ir \(\vec (q)\ ) vienas kito atžvilgiu.

Ir vėlgi, pakoregavus dalelių padėtis, kad būtų išvengta abipusio kūnų prasiskverbimo, reikia pasirūpinti dar šešių apribojimų vykdymu – atstumų tarp dalelių, sudarančių kietą kūną, nekintamumu. Taikant šį metodą, tetraedras netgi gali būti įdėtas į kitą objektą, kurį patogiau naudoti vietoj paties tetraedro susidūrimo atveju. 6 paveiksle pavaizduotas tetraedras, įdėtas į kubą.

Pirma, kubas turi būti tam tikru būdu pritvirtintas prie tetraedro. Vienas iš būdų yra pasirinkti tetraedro masės centrą kaip kubo centrą \(0,25\cdot (\vec(x)_1 + \vec(x)_2 + \vec(x)_3 + \vec(x)_4)\), o tada, naudodami dabartines tetraedro koordinates, apskaičiuokite kubo viršūnių koordinates. Kai aptinkamas susidūrimas, kontaktinis taškas \(\vec(p)\) (kuris dabar yra ant kubo) apdorojamas taip pat, kaip aprašyta aukščiau. Atnaujintos dalelių koordinatės apskaičiuojamos taip pat. Norėdami pagreitinti skaičiavimus, galite iš anksto apskaičiuoti visų kubo viršūnių koeficientus \(c_1\) -\(c_4\). Jei \(\vec(p)\) yra viršūnė, reikšmes \(c_1\) -\(c_4\) galima rasti ir naudoti tiesiogiai. Kitu atveju \(\vec(p)\) yra trikampio viduje arba vienoje iš jo kraštinių, o \(c_1\)-\(c_4\) reikšmes galima gauti iš iš anksto apskaičiuotų trikampio reikšmių. trikampio viršūnės naudojant interpoliaciją.

Paprastai susidūrimams įveikti pakanka 3–4 iteracijų. Jei atsipalaidavimas bus nutrauktas per anksti, kūnai nesielgs kaip visiškai kieti. Bet tai netgi gerai, nes absoliučiai kietų kūnų gamtoje nėra. Be to, tai daro sistemą stabilesnę.

Pertvarkant dalelių, sudarančių tetraedrą, padėtis, atitinkamai turi būti pakeistos kūno fizinės savybės (matematiškai tai reiškia, kad kūno inercijos tenzorius kinta, priklausomai nuo dalelių padėties ir masių).

Naudodami tą patį principą kaip ir tetraedras, galite nustatyti kitą panašią dalelių ir ryšių konfigūraciją, padėdami daleles taškuose, kurių koordinatės \((0,0,0)\), \((1,0,0)\), \((0,1,0)\) ir \((0,0,1)\) . Tegul \(\vec(a)\) , \(\vec(b)\) ir \(\vec(c)\) yra vektoriai, nukreipti atitinkamai iš 1 dalelės į 2, 3 ir 4 daleles. Dalelių padėtis apribojame reikalavimu, kad vektoriai \(\vec(a)\) , \(\vec(b)\) ir \(\vec(c)\) turėtų vienetinį ilgį ir kampą tarp kiekvienos iš trijų vektorių porų buvo lygus \(90^\circ\) (atitinkami skaliariniai sandaugai turi būti lygūs nuliui). Atkreipkite dėmesį, kad tai vėlgi, kaip ir tetraedras, duos 4 daleles ir 6 ryšius.

Šarnyriniai kūnai

Dabar galime sujungti kelis standžius korpusus naudodami vyrius (cilindrinius, sferinius ir kt.). Darant prielaidą, kad du kūnai turi vieną bendrą dalelę, gauname sferinį šarnyrą (smeigtuką), o jei dvi dalelės yra bendros, tai cilindrinį šarnyrą (vyrį) (7 pav.). Lygiai taip pat galite sujungti du korpusus naudodami strypą ar bet kokio kito tipo jungtį – tereikia nepamiršti pridėti kodo, kad galėtumėte valdyti naujo tipo ryšį atsipalaidavimo kilpoje.

Šis metodas leidžia mums sukurti pilną artikuliuoto žmogaus kūno modelį. Realizmas padidės, jei papildomai įgyvendinsite kampinių judesių apribojimus vyriuose. Yra keletas būdų, kaip įgyvendinti tokius apribojimus. Paprasčiausias metodas apima strypo tipo apribojimą, kuris suveikia tik tada, kai atstumas tarp dviejų dalelių nukrenta žemiau tam tikros slenkstinės vertės (šiuo atveju kalbame apie vienpusį formos sujungimą \(|\vec(x)_2 - \vec(x)_1| > 100\)). Dėl to abi dalelės niekada negali priartėti per arti viena kitos (8 pav.).

Kitas kampinių judesių apribojimų nustatymo metodas reikalauja, kad būtų įvykdyta taškinio produkto sąlyga:

$$ (\vec(x)_2 - \vec(x)_0)\cdot (\vec(x)_1 - \vec(x)_0)< \alpha . $$

Taip pat galite apriboti dalelių judėjimą tam tikroje plokštumoje. Vėlgi, dalelių pozicijos, kurios neatitinka nurodytų apribojimų, turi būti pataisytos. Tai daroma panašiai kaip ir strypo atveju, nors atitinkamos formulės bus šiek tiek sudėtingesnės.

| Modeliavimas skaičiuoklėse

17-18 pamokos
Modeliavimas skaičiuoklėse

Kūno judėjimo, veikiant gravitacijai, modeliavimas

Judėjimo veikiant gravitacijai pavyzdžiai yra gerai žinomi. Tai kūno kritimas iš tam tikro aukščio ir kūno, mesto aukštyn tam tikru greičiu, judėjimas ir kampu į horizontą išmesto kūno judėjimas. Jei tokiose problemose neatsižvelgiama į oro pasipriešinimo jėgą, tada visi išvardyti judėjimo tipai apibūdinami gerai žinomomis formulėmis. Tačiau problemos, kuriose atsižvelgiama į oro pasipriešinimą, yra ne mažiau įdomios.

PROBLEMA 3.24. Pataikyti į taikinį

I etapas. Problemos formulavimas

UŽDUOTIES APRAŠYMAS

Berniukai žaidžia badmintoną. Vėjo gūsis pakėlė vėžliuką ir nunešė ant medžio šakų. Sunki užduotis yra gauti šaudyklą. Problemą galima išspręsti keliais būdais. Kiekvienas metodas turi savo privalumų ir trūkumų.

Pavyzdžiui, galite lipti į medį. Bet tai labai pavojinga veikla: kuo aukštesnės medžių šakos, tuo jos plonesnės. Didelė tikimybė nukristi. Galite nukirsti medį. Bet, matyt, tokio problemos sprendimo būdo dar niekas nebandė. Jei visi pasirinktų šį problemos sprendimo būdą, seniai nebūtų likę nė vieno medžio. Galite palaukti, kol vėžlys nukris pats, užkluptas kito vėjo gūsio. Dažniausiai jie bando numušti banglentę akmeniu. Tokį elgesio modelį rinksimės ir mes. Be to, mes žinome kūno judėjimo dėsnius.

MODELIAVIMO TIKSLAS

Ištirkite kūno, mesto kampu į horizontalę, judėjimą. Pasirinkite pradines metimo greičio ir kampo reikšmes, kad mestas kūnas pasiektų taikinį.

PROBLEMOS FORMALIZAVIMAS

Pastaba. Norėdami nustatyti smūgio tikslumą , reikia atsižvelgti į kūno dydį.

Pataikymo tikslumas turėtų būti ne daugiau kaip pusė mažiausio geometrinio kūno dydžio.

Taigi, pavyzdžiui, jei taikinys yra maždaug 7 cm skersmens vėžlys, tada = 3,5 cm Jei tikslas yra 40 cm skersmens krepšinio lankas, tada = 20 cm.Jei taikinys yra 5 m aukščio balionas, tai = 2,5 m.

II etapas. Modelio kūrimas

INFORMACINIS MODELIS

Objektų charakteristikas ir procesą pateikiame lentelės pavidalu.

Kūno judėjimo parametrai pateikti 3.4 pav. Kūno, mesto kampu į horizontalę, judėjimas apibūdinamas formulėmis


KOMPIUTERIO MODELIS

Modeliavimui pasirinksime lentelės procesoriaus aplinką. Šioje aplinkoje lentelės informacija ir matematiniai modeliai sujungiami į lentelę, kurią sudaro trys sritys:

♦ pradiniai duomenys;
♦ tarpiniai skaičiavimai;
♦ rezultatai.

1. Užpildykite šaltinio duomenų sritį pagal pavyzdį.

Stulpeliai A, B, C, D, E, F užpildykite iš viršaus į apačią panašiomis formulėmis.

2. Užpildykite tarpinių skaičiavimų ir rezultatų sritį.


EKSPERIMENTINIS PLANAS

BANDYMAS

1 EKSPERIMENTAS

Tyrinėkite kūno judesius.

2 EKSPERIMENTAS

Ištirkite kūno judėjimo kitimą pasikeitus pradiniam greičiui.

3 EKSPERIMENTAS

Ištirkite kūno judėjimo kitimą pasikeitus metimo kampui.

4 EKSPERIMENTAS

Keisdami pradinį greitį ir metimo kampą, ištirkite kūno judėjimo pobūdį ir jo padėtį taikinio atžvilgiu.

5 EKSPERIMENTAS

Keisdami pradinį pradinį greitį ir kampą, pasirinkite reikšmes taip, kad mestas kūnas pasiektų taikinį nurodytu tikslumu.

TYRIMŲ ATLIKIMAS

BANDYMAS

1. Užpildykite tiek skaičiavimo lentelės eilučių, kiek koordinačių adresu netaps mažesnis už nulį.

2. Palyginkite bandymo skaičiavimo rezultatus su skaičiavimo pavyzdyje pateiktais rezultatais. Žemiau esančioje lentelėje pateikiamos kelios eilutės su skaičiavimų, pagrįstų pateiktais pradiniais duomenimis, rezultatais.

3. Naudodami B ir C stulpelius sukonstruokite judėjimo diagramą. Pavyzdys parodytas 3.6 pav. Norėdami sudaryti diagramą, paimkite tiek daug apskaičiuotų verčių, kad kreivė kirstų horizontalią ašį X .

4. Kaip nustatyti, kiek skaičiavimo taškų reikia paimti diagramai sukonstruoti?

Išvada. Norėdami sudaryti diagramą, turite paimti apskaičiuotas reikšmes, kurių koordinatės y didesnė nei 0 ir viena neigiama reikšmė.

EKSPERIMENTAS 1. Kūno judėjimo tyrimas

1. Naudodami testo atvejo diagramą apibūdinkite, kaip juda kūnas.

2. Paaiškinkite, kaip pagal diagramą nustatyti didžiausio kūno aukščio tašką.

3. Paaiškinkite, ką diagramoje reiškia kreivės susikirtimas su horizontalia x ašimi. Kaip nustatyti šį tašką naudojant skaičiavimo lentelę?

4. Iš diagramos nustatykite, kokiu atstumu nuo metimo taško kūnas kris ant žemės.

5. Iš skaičiavimo lentelės nustatykite:

Maksimalus kėlimo aukštis;
kelionės laikas iki aukščiausio taško;
atstumas nuo metimo taško iki smūgio į žemę taško;
judėjimo laikas prieš kritimą.

Laisvoje skaičiuoklės srityje užrašykite kūno judėjimo tyrimo rezultatus pagal siūlomą modelį.

6. Įveskite kitą pradinių duomenų versiją, užpildykite jiems skirtą eksperimento rezultatų lentelę.

2 EKSPERIMENTAS. Kūno judėjimo priklausomybė nuo pradinio greičio (metimo kampas nepakitęs)

1. Keisdami pradinį greitį nuo 5 iki 20 m/s, stebėkite, kaip kinta maksimalus kėlimo aukštis (y koordinatė)

2. Stebėkite, kaip keičiasi skrydžio nuotolis (x koordinatė) didėjant pradiniam greičiui.

3. Atlikite skaičiavimus tam tikru kampu ir apibendrinkite tyrimo rezultatus į lentelę (2 lentelė), sudarytą laisvajame skaičiuoklės laukelyje.

4. Išvadas remiantis eksperimento rezultatais surašykite į lentelę: kaip keičiasi aukštis ir skrydžio nuotolis keičiantis pradiniam greičiui (esant pastoviam metimo kampui)?


EKSPERIMENTAS 3. Kūno judėjimo priklausomybė nuo metimo kampo (pradinis judėjimo greitis nekinta)

1. Atlikite skaičiavimus naudodami modelį, padidindami metimo kampą nuo 5° iki 85° ir palikdami nepakeistą pradinį greitį (pvz., 15 m/s).

2. Stebėkite kėlimo aukščio pasikeitimą (y koordinatė) didėjant metimo kampui, pradinis greitis išlieka nepakitęs.

3. Stebėkite skrydžio nuotolio pasikeitimą (x koordinatė) padidėjus metimo kampui.

4. Skaičiavimų rezultatus pateikite laisvajame skaičiuoklės laukelyje (3 lentelė).

5. Išvadas remiantis eksperimento rezultatais surašykite į lentelę: kaip keičiasi skrydžio aukštis ir nuotolis, kintant metimo kampui (esant pastoviam pradiniam greičiui)?

EKSPERIMENTAS 4. Kūno judėjimo pobūdžio ir jo padėties taikinio atžvilgiu tyrimas

3.7 paveiksle parodytos kūno judėjimo kreivės vietos atžvilgiu taikinio parinktys. Juos galima apibūdinti taip:

1. Judėdamas kūnas nepasiekia tokio aukščio, kuriame yra taikinys ir nukrenta ant žemės nepasiekęs X ts .

2. Judant kūnas nepasiekia tokio aukščio, kuriame yra taikinys, o krenta toliau į žemę X c.

3. Judant kūnas pakyla aukščiau Y c, bet krenta ant žemės nepasiekęs X c.

4. Judant kūnas pakyla aukščiau Y c ir krenta toliau ant žemės X c.

Stulpeliais D, E ir F skaičiuojamos vertės S x , S y , S, kurie parodo kūno padėtį taikinio atžvilgiu.

1. Ištirkite, ką reiškia ženklas S x ir S yįvairiais laiko momentais.

Išvada.

2. Ištirkite, kaip tai keičiasi S kai kūnas juda.

Išvada. Bendras atstumas iki taikinio pirmiausia mažėja, o paskui didėja.

3. Laisvame skaičiuoklės lauke (4 lentelė) pasirinkite pradinius duomenis (pradinį greitį ir metimo kampą), atitinkančius 3.7 pav. pateiktas kūno judėjimo parinktis.


EKSPERIMENTAS 5. Pradinių reikšmių parinkimas pataikyti į taikinį

Visų pirma pažymime, kad yra begalinis skaičius pradinių duomenų patekimo į tikslą variantų. Mūsų užduotis yra pasirinkti vieną variantą.

1. Pagal stulpelį F nustatyti mažiausią vertę S. Šiuo metu kūnas skrenda arčiausiai tikslo.

2. Nubraižykite stulpelį G smūgių analizė. Laikysime, kad kūnas pataikė į taikinį, jei atstumas iki taikinio bus mažesnis už nurodytą tikslumą (ląstelė $D$10). Norėdami tai padaryti, ląstelėje G16įveskite formulę =IF(F16<$D$10; «попал»; «мимо») .

3. Pakeiskite įvesties duomenis, kad gautumėte geriausią apytikslį tikslą.

4. Tyrimo rezultatus surašykite laisvajame skaičiuoklės laukelyje (5 lentelė).

5. Pasirinkite kitą pradinių duomenų rinkinį, kuriame kūnas pataikys į taikinį „iškyša“, tai yra, įveikęs aukščiausią pakilimo tašką.

6. Pakeiskite tikslo koordinates ir pasirinkite naujos taikinio padėties pradinio greičio ir metimo kampo reikšmes.

Eksperimentų metu gautus rezultatus ir išvadas pateikti ataskaitos forma tekstiniame dokumente. Savo pranešime pateikite atsakymus į šiuos klausimus:

1. Kaip juda kūnas, mestas kampu į horizontalę?
2. Kaip nustatyti aukščiausią pakilimo tašką?
3. Kaip nustatyti skrydžio atstumą?
4. Kaip kinta didžiausias kėlimo aukštis, didėjant pradiniam greičiui ir pastoviam metimo kampui?
5. Kaip keičiasi skrydžio nuotolis didėjant pradiniam greičiui ir pastoviam metimo kampui?
6. Kaip kinta didžiausias kėlimo aukštis didėjant metimo kampui ir pastoviam pradiniam greičiui?
7. Kaip keičiasi skrydžio nuotolis didėjant metimo kampui ir pastoviam pradiniam greičiui?
8. Kaip galime apskaičiuoti kūno padėtį taikinio atžvilgiu kiekvienu laiko momentu? Kaip tai galima nustatyti iš skaičiavimo lentelės?
9. Kaip keičiasi atstumas nuo kūno iki taikinio judant ir kaip tai galima nustatyti naudojant skaičiavimo lentelę?

PROBLEMA 3.25*. Parašiutininkų judėjimas

* Pažangus iššūkis

I etapas. Problemos formulavimas

UŽDUOTIES APRAŠYMAS

Kai parašiutininkas nukrenta ant žemės, jis patiria gravitacijos jėgą ir oro pasipriešinimą. Eksperimentiškai nustatyta, kad pasipriešinimo jėga priklauso nuo judėjimo greičio: kuo didesnis greitis, tuo didesnė jėga. Judant ore ši jėga yra proporcinga greičio kvadratui su tam tikru pasipriešinimo koeficientu k, kuris priklauso nuo parašiuto konstrukcijos ir žmogaus svorio R pasipriešinimas = kV 2 .Kokia turėtų būti šio koeficiento reikšmė, kad parašiutininkas nusileistų ant žemės greičiu ne daugiau kaip 8 m/s kad nekelia pavojaus sveikatai?

Nustatyti modeliavimo tikslus ir formalizuoti problemą.

II etapas. Modelio kūrimas

INFORMACINIS MODELIS

Sukurkite informacinį modelį patys.

MATEMATINIS MODELIS

3.8 paveiksle parodytos jėgos, veikiančios parašiutininką. Pagal antrąjį Niutono dėsnį judėjimas, veikiamas jėgų, gali būti parašytas kaip lygybė. Šią lygybę projektuojame ant judėjimo ašies ir pakeičiame oro pasipriešinimo jėgą ma = mg - kV 2 .

Gaukime pagreičio skaičiavimo formulę

Mes apskaičiuosime greitį ir atstumą, kurį parašiutininkas nuskriejo reguliariais intervalais △ ne. Laiko momentų skaičiavimo formulė yra tokia: t aš+1 +t i + △t. 

Kur V i- greitis intervalo pradžioje ( V o- pradinis greitis). Greitis intervalo pabaigoje (ir atitinkamai kito pradžioje) apskaičiuojamas naudojant tolygiai pagreitinto judėjimo formulę

Atstumas, kurį parašiutininkas nuskriejo, yra lygus atstumo, kurį nuplaukė iki kito laikotarpio pradžios, sumai ( S i) ir per šį intervalą nuvažiuotą atstumą:


KOMPIUTERIO MODELIS

Modeliavimui pasirinksime skaičiuoklės aplinką. Šioje aplinkoje informacija ir matematiniai modeliai sujungiami į lentelę, kurią sudaro trys sritys:

♦ pradiniai duomenys;
♦ tarpiniai skaičiavimai;
♦ rezultatai.

1. Užpildykite šaltinio duomenų sritį.

2. Užpildykite apskaičiuotus stulpelius A, B, C, D, kuriame apskaičiuojami parašiutininko judėjimo parametrai:

Laikas;
greitis;
atstumas;
pagreitis.

3. Į skaičiavimo langelius įveskite formules. Skaičiavimo lentelės užpildymo pavyzdys:


III etapas. Kompiuterinis eksperimentas


EKSPERIMENTINIS PLANAS

BANDYMAS

Atlikite kompiuterinio modelio bandomąjį skaičiavimą, naudodami lentelėje pateiktus duomenis.

1 EKSPERIMENTAS

Ištirti kūno judėjimą veikiant gravitacijai ir oro pasipriešinimui.

2 EKSPERIMENTAS

Pasirinkite pasipriešinimo koeficiento vertę k už saugų parašiutininko nusileidimą.

3 EKSPERIMENTAS

Ištirti greičio ir pagreičio priklausomybę nuo pradinio judėjimo greičio.

4 EKSPERIMENTAS

Ištirkite, kaip kinta skrydžio nuotolis, kol nusistovi kritimo greitis.

TYRIMŲ ATLIKIMAS

BANDYMAS

1. Palyginkite bandomojo skaičiavimo rezultatus su skaičiavimo pavyzdyje pateiktais rezultatais. Bandymo skaičiavimo pavyzdys:

2. Sukonstruoti greičio, pagreičio ir atstumo pokyčių schemą priklausomai nuo laiko.

EKSPERIMENTAS 1. Kūno judėjimo tyrimas atsižvelgiant į oro pasipriešinimą

1. Iš diagramos ir lentelės nustatykite, kaip laikui bėgant keičiasi parašiutininko greitis. Kiek sekundžių reikia, kad nuosmukio greitis stabilizuotųsi?

2. Iš diagramos ir lentelės nustatykite, kaip laikui bėgant keičiasi parašiutininko pagreitis.

3. Iš diagramos ir lentelės nustatykite, kiek parašiutininkas nuskris, kol greitis stabilizuosis. Padėkite rezultatus tuščioje skaičiuoklės vietoje.

4. Pakeiskite laiko žingsnį (0,1 s) ir nustatykite judėjimo stabilizavimo greitį, skrydžio atstumą iki stabilizavimo. Tyrimo rezultatai pateikti lentelėje.

EKSPERIMENTAS 2. Atsparumo koeficiento parinkimas

Keičiant koeficiento reikšmę k (ląstelė SZ), pasirinkite judesio stabilizavimo greitį, kuris būtų saugus treniruotam žmogui nusileisti (8 m/s).

EKSPERIMENTAS 3. Greičio ir atstumo stabilizavimo, priklausomai nuo pradinio greičio, tyrimas

Parašiutininkas, iššokęs iš lėktuvo, kurį laiką skrenda laisvu kritimu, įgyja pakankamai didelį greitį ir tik tada atidaro parašiutą.

1. Pakeiskite pradinę greičio reikšmę (10 m/s).

2. Naudodami skaičiavimo lentelę nustatykite, kaip pasikeis:

Pradinis pagreitis;
stabilizavimo greitis;
skrydžio atstumą, kol greitis stabilizuosis.

3. Eksperimento rezultatus surašykite laisvajame skaičiuoklės laukelyje. Padarykite išvadą.

3 eksperimento rezultatai:

Pastaba. Atkreipkite dėmesį, kaip keičiasi pradinis pagreitis. Atkreipkite dėmesį, kad jis negali būti didelis, nes pagreitis yra didesnis 3 g (30 m/s2) sukelia labai dideles perkrovas.

IV etapas. Modeliavimo rezultatų analizė

Remdamiesi kompiuterinio eksperimento rezultatais, atsakykite į šiuos klausimus:

1. Kaip bėgant laikui keičiasi parašiutininko greitis?
2. Kaip keičiasi parašiutininko greitis pasikeitus pasipriešinimo koeficientui?
3. Koks turi būti pasipriešinimo koeficientas, kad parašiutininkas nusileistų ant žemės 8 m/s greičiu?
4. Kaip kinta judėjimo greitis ir kaip pastovus parašiutininko tolygaus judėjimo greitis priklauso nuo pradinio greičio?
5. Kiek sekundžių nuo judėjimo pradžios parašiutininko greitis gali būti laikomas pastoviu?
6. Kokiame aukštyje nuo žemės parašiutininkas turėtų atidaryti parašiutą, kad nusileistų nurodytu greičiu.

SAVARANKIŠKO DARBO UŽDUOTYS

3.26. Krepšinio žaidėjas.

Naudodamiesi sukonstruotu kampu mesto kūno judėjimo modeliu, apskaičiuokite, kokiu pradiniu greičiu ir kokiu kampu reikia mesti krepšinio kamuolį, kad patektumėte į lanką.

Atlikdami skaičiavimus, atsižvelkite į šias sąlygas:

Pradinis rutulio greitis metant gali svyruoti iki 15 m/s;
žiedo koordinates adresu = 3 m, X = 0,5 ÷ 7 m;
smūgio tikslumas yra susijęs su žiedo skersmeniu ir yra lygus = 20 cm;
kamuolys turi atsitrenkti į žiedo „baldakimą“, tai yra, praėjęs aukščiausią pakilimo tašką.

Modifikuoti matematinius ir kompiuterinius kampu mesto kūno judėjimo modelius, kad pagal juos būtų galima apskaičiuoti kūno, išmesto iš tam tikro pradinio aukščio, judesį. y 0

3.27. Skęstančio žmogaus gelbėjimas.

Kokiu greičiu ir kokiu kampu reikia mesti ratą nuo gelbėjimo laivo iki skęstančiojo? Atlikdami skaičiavimus, atsižvelkite į šias sąlygas:


skęstančiojo atstumas nuo laivo;
pataikymo tikslumas yra = 0,5 m;
metimo kampas gali būti neigiamas;
laivo borto aukštis virš jūros lygio.

3.28. Akrobatai.

Daugelis yra matę tokį akrobatinį veiksmą cirke. Vienas akrobatas stovi ant šokinėjimo lentos iš vienos pusės, antras šokinėja iš kito galo. Kokiu pradiniu greičiu ir kokiu kampu turėtų skristi pirmasis akrobatas, kad tiksliai nusileistų ant trečiojo akto dalyvio pečių? Atlikdami skaičiavimus, atsižvelkite į šias sąlygas:

Pradinis greitis gali svyruoti iki 10 m/s;
aukštis ir trečiojo akrobato pašalinimas;
pataikymo tikslumas yra = 0,1 m.

Tęsiame straipsnių seriją apie akrobatinių manevrų automatizavimą mažuose dronuose. Šis straipsnis, visų pirma, turi edukacinį tikslą: čia parodysime, kaip galite sukurti paprastą automatinio valdymo sistemą (ACS), naudodamiesi užduoties atlikti akrobatinį manevrą „statinėle“ valdant orlaivį tik eleronais. Straipsnis yra antrasis iš leidinių serijos „Aerobatic UAV“, kuriame kalbama apie savaeigių ginklų aparatinės ir programinės įrangos dalių kūrimo procesą mokymo forma.

Įvadas

Taigi nusprendėme „statinę“ įdiegti automatiniu režimu. Akivaizdu, kad norint automatiškai įvykdyti figūrą, būtina suformuluoti atitinkamą valdymo dėsnį. Išradimo procesas bus daug neskausmingas ir greitesnis, jei naudosite matematinį orlaivio judėjimo modelį. Kontrolės dėsnio išbandymas skrydžio eksperimente, nors ir įmanomas, reikalauja daug daugiau laiko, be to, prietaiso praradimo ar sugadinimo atveju gali būti daug brangiau.

Kadangi esant mažais orlaivio atakos ir slydimo kampais, jo riedėjimo judėjimas praktiškai nesusijęs su judėjimu kitais dviem kanalais: bėgiu ir išilginiu - norint atlikti paprastą „statinę“, pakaks sukurti judėjimo modelį tik aplinkui. viena ašis – ašis OI susijusi SC. Dėl tos pačios priežasties elerono valdymo įstatymas iš esmės nepasikeis, kai reikia sukurti pilną valdymo sistemą.

Judėjimo modelis

Lėktuvo judėjimo aplink išilginę ašį lygtis OI susietas SC yra labai paprastas:

Kur yra inercijos momentas apie ašį OI, o momentas susideda iš kelių komponentų, iš kurių tikroviškam mūsų orlaivio judėjimo aprašymui pakanka atsižvelgti tik į du:

Kur yra momentas, kurį sukelia orlaivio sukimasis aplink savo ašį OI(slopinimo momentas), - momentas, atsirandantis dėl elero įlinkio (valdymo momentas). Paskutinė išraiška parašyta tiesine forma: riedėjimo momentas tiesiškai priklauso nuo kampinio greičio ir elero įlinkio kampo su pastoviais proporcingumo koeficientais ir atitinkamai.

Kaip žinoma (pavyzdžiui, iš Wiki), tiesinė diferencialinė lygtis

Atitinka pirmosios eilės periodinę nuorodą

Kur yra perdavimo funkcija, yra diferenciacijos operatorius, yra laiko konstanta ir yra stiprinimas.

Kaip pereiti nuo diferencialinės lygties prie perdavimo funkcijos?

Mūsų atveju nuo lygties parametrų prie perdavimo funkcijos parametrų galime pereiti taip (žinant, kad išvestinė yra neigiama):




Periodinio ryšio laiko konstanta yra lygi laikui, per kurį išvesties vertė, atliekant vieną laipsnišką įvesties vertės veiksmą, įgyja vertę, kuri skiriasi nuo pastovios būsenos vertės ~5%, ir stiprinimo koeficientas. yra skaitine prasme lygi išvesties vertės pastoviai reikšmei atliekant vieną laipsnišką veiksmą:


Sukurtame judėjimo modelyje yra du nežinomi parametrai: stiprinimas ir laiko konstanta. Šie parametrai išreiškiami fizinės sistemos charakteristikomis: inercijos momentu, taip pat riedėjimo momento išvestiniais ir:

Taigi, jei žinomas inercijos momentas, tai nustačius modelio parametrus, iš jų galima atkurti sistemos parametrus.

Modelio parametrai. Inercijos momentas

Mūsų orlaivį sudaro šios dalys: sparnas, fiuzeliažas su uodega, variklis, akumuliatorius (baterija) ir aviacijos elektronika:

Avionika apima: autopiloto plokštę, SNS imtuvo plokštę, radijo modemo plokštę, signalų imtuvo plokštę iš valdymo įrangos, du įtampos reguliatorius, variklio greičio reguliatorių ir jungiamuosius laidus.

Dėl nedidelio avionikos svorio jos indėlio į bendrą inercijos momentą galima nepaisyti.

Kaip buvo įvertintas inercijos momento dydis?

Inercijos momentas gali būti įvertintas taip. Pažiūrėkime į plokštumą išilgai jos ašies OI:

Ir tada pateikiame jį tokio supaprastinto modelio forma:


Inercijos momento skaičiavimo schema. Kairėje viršuje yra akumuliatorius, apačioje dešinėje - variklis. Variklis ir akumuliatorius yra ant korpuso ašies

Matyti, kad kuriant modelį buvo atsisakyta: kilio, horizontalios uodegos, propelerio ir avionikos. Tuo pačiu metu liko: fiuzeliažas, sparnas, akumuliatorius, variklis. Išmatavus kiekvienos dalies mases ir būdingus matmenis, galima apskaičiuoti kiekvienos dalies inercijos momentus fiuzeliažo išilginės ašies atžvilgiu:


Bendra orlaivio inercijos momento ašies atžvilgiu vertė OI gauname sudėjus dalių inercijos momentus:

Įvertinus kiekvienos orlaivio dalies indėlį į bendrą inercijos momentą, buvo gauta:

  • sparnas – 96,3 proc.
  • fiuzeliažas – 1,6 proc.
  • variklis ir akumuliatorius - 2%,
Matyti, kad pagrindinį indėlį į bendrą inercijos momentą įneša sparnas. Taip yra dėl to, kad sparnas yra gana didelio skersinio dydžio (sparno plotis - 1 m):

Todėl, nepaisant nedidelio svorio (apie 20% visos orlaivio kilimo masės), sparnas turi didelį inercijos momentą.

Modelio parametrai. Ritimo momento išvestiniai ir

Riedėjimo momento išvestinių skaičiavimas yra gana sudėtinga užduotis, susijusi su orlaivio aerodinaminių charakteristikų apskaičiavimu skaitiniais metodais arba naudojant inžinerines technikas. Pirmojo ir antrojo naudojimas reikalauja didelių laiko, intelektinių ir skaičiavimo sąnaudų, kurios yra pateisinamos kuriant valdymo sistemas dideliems orlaiviams, kai klaidos kaina vis tiek viršija gero modelio sukūrimo išlaidas. Kontroliuojant UAV, kurio masė neviršija 2 kg, šis metodas vargu ar pateisinamas. Kitas būdas apskaičiuoti šias išvestines yra skrydžio eksperimentas. Atsižvelgiant į mažą mūsų orlaivio kainą, taip pat į tinkamo lauko, skirto tokiam eksperimentui, artumą, pasirinkimas mums buvo akivaizdus.

Į autopilotą įrašę programinę įrangą rankiniam valdymui ir parametrų įrašymui, surinkome orlaivį ir paruošėme jį bandymams:

Skrydžio eksperimento metu pavyko gauti duomenis apie eleronų nukrypimo kampą ir orlaivio sukimosi kampinį greitį. Pilotas orlaivį valdė rankiniu būdu, atlikdamas ratus, posūkius ir riedėjimus, o lėktuvo įranga fiksavo ir siuntė reikiamą informaciją į antžeminę stotį. Dėl to gautos reikiamos priklausomybės: (deg/s) ir (b/r). Vertė reiškia normalizuotą elero įlinkio kampą: 1 reikšmė atitinka didžiausią įlinkį, o –1 – mažiausią:

Kaip dabar galime nustatyti iš gautų duomenų? Atsakymas yra išmatuoti pereinamojo proceso parametrus naudojant grafikus ir .

Kaip buvo nustatyti koeficientai k ir T?

Stiprinimas buvo nustatytas susiejant pastovaus kampinio greičio vertę su elero įlinkio verte:


Elero įlinkio kampo ir riedėjimo kampinio greičio priklausomybės nuo laiko, gautos atliekant skrydžio eksperimentą

Ankstesniame paveikslėlyje kampinio greičio pastovios būsenos vertės atkarpos maždaug atitinka, pavyzdžiui, atkarpas, esančias netoli 422, 425 ir 438 s (paveiksle pažymėtos tamsiai raudona spalva).
Laiko konstanta buvo nustatyta pagal tuos pačius grafikus. Tam buvo rastos aštrių elero įlinkio kampo pokyčių sritys, o tada išmatuotas laikas, per kurį kampinis greitis įgavo vertę, kuri nuo pastovios būsenos vertės skyrėsi 5%.


Laiko konstantos ir stiprinimo reikšmių nustatymo rezultatas yra toks: , . Šios koeficientų reikšmės su žinoma inercijos momento reikšme atitinka šias riedėjimo momento išvestinių vertes:

Modelio patikrinimas

Taigi, sukūrę modelį, pagrįstą periodine nuoroda

Tai galima patikrinti į įvestį pritaikius signalą, gautą iš skrydžio eksperimento, o modelio išėjimo signalą palyginus su taip pat eksperimento metu gauta reikšme.

Kaip buvo atliktas modeliavimas?

Modeliavimo įrankį pasirinkome, visų pirma, remdamiesi galimybe pakartoti rezultatus daugeliui skaitytojų: tai visų pirma reiškia, kad programa turi būti vieša. Iš esmės pirmosios eilės aperiodinės nuorodos elgesio modeliavimo problemą galima išspręsti sukuriant savo įrankį nuo nulio. Tačiau kadangi modelis ateityje taps sudėtingesnis, savo įrankio kūrimas gali atitraukti dėmesį nuo pagrindinės užduoties – sukurti savaeiges akrobatinių dronų valdymo sistemas. Atsižvelgdami į priemonės atvirumo principą, pasirinkome JSBsim.

Ankstesniame skyriuje mes gavome koeficientų ir reikšmes. Juos naudojame lėktuvo judėjimui imituoti. Iš ankstesnio straipsnio prisimename, kad orlaivio modelio konfigūracija JSBsim yra nurodyta naudojant XML failą. Sukurkime savo modelį:
0.2 1.0 0.2 0.03 0.5 0.03 0.5 -0.025 0 0.05 0.018 0.018 0.018 1.2 0 0 0 fcs/aileron-cmd-norm -1 1 Roll_moment_due_to_roll_rate greičiai/p-aero-rad_sec -0.24 Roll_moment_due_to_aileron fcs/aileron-cmd-norm 2.4 Greičiai/vc-kts Aero/alphadot-deg_sec Aero/betadot-deg_sec Fcs/throttle-cmd-norm IŠJUNGTA IŠJUNGTA IŠJUNGTA ĮJUNGTA ĮJUNGTA ĮJUNGTA IŠJUNGTA IŠJUNGTA ĮJUNGTA IŠJUNGTA IŠJUNGTA ĮJUNGTA IŠJUNGTA
Kadangi kuriame tik riedėjimo transporto priemonės judėjimo modelį, daugelį failo skilčių paliksime tuščias. Šios charakteristikos yra nuosekliai nurodytos modelio faile.

Geometriniai matmenys orlaiviai yra nurodyti skyriuje metrikos: sparno plotas, tarpatramis, vidutinis aerodinaminis stygos ilgis, horizontalus uodegos plotas, horizontali uodegos svirtis, vertikali uodegos sritis, vertikali uodegos svirtis, aerodinaminio fokusavimo padėtis.

Masės charakteristikos orlaiviai yra nurodyti skyriuje masės_balansas: orlaivio inercijos tenzorius, tuščio orlaivio svoris, masės centro padėtis.

Verta paminėti, kad absoliučios aerodinaminio židinio ir orlaivio masės centro padėtys nėra susijusios su transporto priemonės dinamikos skaičiavimu, svarbi jų santykinė padėtis.
Po to seka skyriai, kuriuose aprašomos orlaivio važiuoklės ir jo jėgainės charakteristikos.

Kitame skyriuje atsakingas už valdymo sistema, užpildykime kanalą, atsakingą už riedėjimo valdymą: nurodykite vienintelę įvestį fcs/aileron-cmd-norm, kurios reikšmė bus normalizuota nuo -1 iki 1.

Aerodinaminės charakteristikos yra nurodyti skyriuje aerodinamika: jėgos nurodytos greičio koordinačių sistemoje, momentai - susijusioje. Mus domina rutulio momentas. Skyriuje ašies pavadinimas = "ROLL" nurodytos funkcijos, kurios nustato jėgų momentus iš įvairių aerodinaminių jėgų momento projekcijos į ašį komponentų. JAUTIS susijusi koordinačių sistema. Mūsų modelyje yra du tokie komponentai. Pirmasis komponentas yra slopinimo momentas, kuris yra lygus kampinio greičio ir anksčiau nustatyto koeficiento sandaugai. Antroji dedamoji yra momentas nuo eleronų esant fiksuotam skrydžio greičiui: jis lygus anksčiau nustatyto koeficiento sandaugai iš elero įlinkio dydžio.

Verta paminėti, kad nustatant koeficientą buvo naudojama matmenų vertė. Mūsų skrydžio duomenyse kampinis greitis buvo matuojamas laipsniais per sekundę, o JSBSim naudojami radianai per sekundę, todėl koeficientas turi būti sumažintas iki mums reikalingo matmens, tai yra padalintas iš 180 laipsnių ir padaugintas iš radianų. Šiuos aerodinaminių jėgų momento komponentus užrašome gaminio funkcijų viduje produktas. Modeliuojant sumuojamas visų funkcijų atlikimo rezultatas ir gaunama aerodinaminio momento projekcijos į atitinkamą ašį reikšmė.

Sukurtą modelį galima patikrinti naudojant eksperimentinius duomenis, gautus skrydžio bandymų metu. Norėdami tai padaryti, sukurkite scenarijų su tokiu turiniu:
sim-time-sek ge 0.0 Pateikite elero laiko istorijos įvestį sim-time-s ge 0

sim-time-sek 0 0.00075 0.1 0.00374 0.2 -0.00075 0.3 -0.00075 0.4 -0.00075 0.5 -0.00075 0.6 0.00075 0.7 0.00075 ... 48.8 -0.00075 48.9 0.00000 49 -0.00075

kur taškai rodo trūkstamus duomenis. Scenarijaus faile, kuris mums pažįstamas iš ankstesnio straipsnio, pasirodė naujas įvykio tipas ( „Laiko pranešimas“), leidžianti nurodyti nuolatinį parametro pokytį laikui bėgant. Parametro priklausomybė nuo laiko nurodoma lentelės funkcija. JSBSim Tiesiškai interpoliuoja funkcijos reikšmę tarp lentelės duomenų. Ritimo judesio modelio tikrinimo procedūra susideda iš šio scenarijaus vykdymo sukurtame modelyje ir rezultatų palyginimo su eksperimentiniais.


Patikrinimo rezultatas parodytas paveikslėlyje:


Kaip matyti iš paveikslo, modelio ir tikrovės sutapimas yra šiek tiek mažesnis nei išsamus.

Valdymo sintezė „statinei“ atlikti

Gavus modelį nesunku nustatyti, kiek ir kiek laiko reikia nukreipti eleronus, kad būtų galima atlikti riedėjimą. Vienas iš variantų yra toks atmetimo algoritmas:



0,1 s trunkančių segmentų buvimas elero nukreipimo algoritmo pradžioje ir pabaigoje imituoja servo pavaros inerciją, kuri negali akimirksniu nukreipti paviršių. Modelis rodo, kad esant tokiam elero deformacijos įstatymui, orlaivis turi atlikti vieną pilną apsisukimą aplink savo ašį OI, patikrinsim?

Skrydžio eksperimentas

Gautas elero valdymo įstatymas buvo užprogramuotas orlaivyje įdiegtame autopilote. Eksperimento idėja paprasta: pakelkite lėktuvą į horizontalų skrydį ir naudokite gautą valdymo dėsnį. Jei tikrasis orlaivio riedėjimo judesys atitinka sukurtą modelį, tuomet orlaivis turi atlikti „statinės riedėjimą“ – vieną pilną apsisukimą 360 laipsnių kampu.

Ypatingai dėkojame mūsų ištikimam pilotui už darbą, profesionalumą ir patogią Priore universalo bagažinę!

Eksperimento metu paaiškėjo, kad riedėjimo judėjimo modelis buvo sukonstruotas sėkmingai – lėktuvas atliko vieną „statinę“ po kitos, kai tik pilotas įjungė užprogramuotą valdymo dėsnį. Toliau pateiktame paveikslėlyje parodytas eksperimento metu užfiksuotas kampinis greitis, gautas iš modeliavimo rezultatų, taip pat posūkio ir nuolydžio kampas iš skrydžio eksperimento:


Toliau pateiktame paveikslėlyje pavaizduoti signalai, užfiksuoti per skrydžio eksperimentą eleronams, liftui (ER) ir vairui (RU):


Vertikalios linijos rodo „statinės“ vykdymo pradžios ir pabaigos momentus. Iš paveikslų aišku, kad „statinės ridenimo“ metu pilotas netrukdo valdyti elevatoriaus ir vairo; taip pat aišku, kad „statinės riedėjimo“ metu nuolydžio kampas visada linkęs mažėti - lėktuvas traukiamas. į nardymą, kaip buvo prognozuojama iš modeliavimo rezultatų skrydžio treniruoklyje (žr. straipsnį „Aerobatinis UAV. Kaip teisingai padaryti statinės riedėjimą“). Jei atidžiai išnagrinėsite ankstesnius grafikus, pamatysite, kad trečioji „statinė“ net nebuvo baigta, nes pilotas įsikišo į valdiklius, kad ištrauktų lėktuvą iš nardymo: atliekant „statinę“ nuolydžio kampas labai pasikeičia. tik su eleronais.

Pastabos

išvadas

Atlikto darbo rezultatas – vienas iš būdų sukurti UAV judėjimo modelį pagal kampinį greitį. Skrydžio eksperimento metu buvo įrodyta, kad sukurtas judėjimo modelis visiškai atitinka imituojamą objektą. Remiantis sukurtu modeliu, buvo gautas programos valdymo dėsnis, leidžiantis atlikti „statinę“ automatiniu režimu. Taip pat įsitikinome, kad naudojant vien eleronus nepavyks atlikti teisingo „ritimo“, taip pat tai aiškiai pademonstravome.

Kitas etapas bus kontrolės įstatymo patikslinimas, įtraukiant grįžtamąjį ryšį, taip pat lifto įtraukimas į valdymą. Pastarajam reikės sukurti mūsų lėktuvo išilginio judėjimo modelį. Remiantis darbo rezultatais, bus išleistas kitas leidinys.

Tarkime, važiuojate dviračiu ir staiga jus kažkas pastumia iš šono. Norėdami greitai atgauti pusiausvyrą ir nenukristi, pasukite dviračio vairą stūmimo kryptimi. Dviratininkai tai daro refleksiškai, tačiau nuostabu, kad dviratis šį veiksmą gali atlikti pats. Šiuolaikiniai dviračiai gali savarankiškai išlaikyti pusiausvyrą net judėdami be kontrolės. Pažiūrėkime, kaip šis efektas gali būti modeliuojamas naudojant COMSOL Multiphysics.

Ką mes žinome apie savaime balansuojančius dviračius?

Šiuolaikinis dviratis labai nesiskiria nuo saugus dviratis- vienas pirmųjų dizainų, pasirodžiusių XIX amžiaus 80-aisiais. Praėjus daugiau nei šimtui metų, mokslininkai vis dar bando išsiaiškinti, koks poveikis dviračiui subalansuoja save. Kitaip tariant, kaip nevaldomas dviratis išlaiko pusiausvyrą, kai stovi vertikaliai? Daugelis publikuotų darbų buvo skirti dviračio judėjimui aprašyti naudojant analitines lygtis. Viena iš pirmųjų svarbių publikacijų šia tema buvo Franciso Whipple'o darbas, kuriame jis išvedė bendras netiesines dviračio, kurį valdo dviratininkas, nenaudodamas rankų, dinamikos lygtis.

Visuotinai priimta, kad dviračio stabilumą užtikrina du veiksniai – giroskopinė priekinio rato precesija ir stabilizuojantis efektas. išilginis sukimosi ašies polinkis ratai. Visai neseniai mokslininkų komanda iš Delfto ir Kornelio (žr.) paskelbė išsamią Whipple dviračio modelio tiesinių judesių lygčių apžvalgą. Savo rezultatus jie panaudojo demonstruodami savaime išsibalansuojantį dviratį. Jų tyrimai rodo, kad nėra paprasto šio reiškinio paaiškinimo. Daugybė veiksnių, įskaitant giroskopinius ir stabilizavimo efektus, dviračio geometriją, greitį ir masės pasiskirstymą, leidžia nevairuojamam dviračiui išlikti vertikaliai.

Įkvėpti šio darbo, sukūrėme dinaminį kelių kėbulų sistemos modelį, kad parodytume savaime balansuojantį dviračio, valdomo laisvų rankų įrangos dviratininko, judesį.

Dviračio padėtis skirtingu laiku.

Daugiakūnis dviračio modelis

Norint užtikrinti švarų ratų riedėjimą ir riboti ratų slydimą trimis kryptimis, reikia trijų ribinių sąlygų.


Rato modelis, rodantis kryptis, kuriomis judėjimas ribojamas.

Taikomi šie apribojimai: Nėra slydimo į priekį:

(\frac(d\bold(u))(dt).\bold(e)_(2)=r\frac(d\bold(\theta)_s)(dt))

Nėra šoninio slydimo:

\frac(d\bold(u))(dt).\bold(e)_(3)=r\frac(d\bold(\theta)_(l))(dt)

Neslysta statmenai žemės sąlyčio paviršiui:

\frac(d\bold(u))(dt).\bold(e)_(4)=0

kur \bold(e)_(2) , \bold(e)_(3) ir \bold(e)_(4) yra momentinė kryptis (pasvirusi ašis), skersinė kryptis (sukimosi ašis) ir normalioji kontaktinis paviršius (\bold(e)_(4)=\bold(e)_(2) \times\bold(e)_(3)), atitinkamai;

\frac(d\bold(u))(dt) — transliacijos greitis; r yra rato spindulys; \frac(d\bold(\theta)_(s))(dt) — sukimosi kampinis greitis; \frac(d\bold(\theta)_(l))(dt) yra kampinis pasvirimo greitis.

Kadangi šių ribinių sąlygų greičiui pritaikyti neįmanoma, jos yra diskretizuojamos laike ir nustatomos taip:

(\bold(u)-\bold(u)_(p)).\bold(e)_(2)=r(\bold(\theta)_(s)-\bold(\theta)_(sp ))

(\bold(u)-\bold(u)_(p)).\bold(e)_(3)=r(\bold(\theta)_(l)-\bold(\theta)_(lp ))

(\bold(u)-\bold(u)_(p)).\bold(e)_(4)=0

kur \bold(u)_(p) , \bold(\theta)_(sp) ir \bold(\theta)_(lp) yra atitinkamai poslinkio vektorius, sukimosi ir pasvirimo kampas ankstesniu metu.

Esant atskiroms ribinėms sąlygoms, užtikrinančioms, kad neslysta, naudojamas rato padėties skaičiavimo rezultatas ankstesniame laiko žingsnyje. Standžios kūno padėties, sukimosi ir momentinės ašių padėtys ankstesniame laiko etape išsaugomos naudojant pasaulines lygtis ir mazgą Ankstesnis sprendimas nestacionariame sprendiklyje.

Savaime balansuojančio dviračio judėjimo modeliavimas

Analizei pasirinkome dviratį su 18° vairavimo kampu. Pradinis dviračio greitis – 4,6 m/s. Praėjus 1 sekundei nuo judėjimo pradžios, dviratį labai trumpą laiką veikia 500 N jėga.Jėgos įtakoje dviratis nukrypsta nuo tiesios trajektorijos tam tikra kryptimi.

Pirmą sekundę dviratis pastoviu greičiu juda pirmyn iš pradžių nurodyta kryptimi. Tada šoninė jėga sukelia deformaciją. Atkreipkite dėmesį, kad dviratininkas nelaiko rankų ant vairo ir negali valdyti dviračio pusiausvyros. Kas bus toliau? Galime pastebėti, kad vos tik dviratis pradeda pasvirti, vairas pasisuka kritimo kryptimi. Vairo padėties koregavimas kritimo atveju atstato dviračio pusiausvyrą.

Dviratis toliau juda į priekį, o judėdamas pradeda svirti į priešingą pusę. Šis posvyris yra mažesnio dydžio, o vairavimo judesys glaudžiai seka posvyrį su nedideliu atsilikimu. Šis svyravimas iš kairės į dešinę tęsiasi ir galiausiai išnyksta. Dviratis juda į priekį griežtai vertikalioje padėtyje ir šiek tiek padidina greitį. Vairo vibracijos, posūkio kampai ir kampinis greitis palaipsniui mažėja ir išnyksta.

Dviračio judėjimas lygiu paviršiumi nukrypstant nuo tiesios linijos. Rodyklė rodo dviračio pasvirimą.

Dviračio vairo pasvirimo ir sukimosi kampų (kairėje) ir santykinio kampinio greičio (dešinėje) skaičiavimo rezultatai.

Stabilumo analizės atlikimas

Taip sužinojome, kad dviratis gali savarankiškai išsibalansuoti. Tyrimas parodė, kad neįmanoma išskirti vieno parametro, lemiančio dviračio stabilumą. Dviračio konstrukcija, svorio pasiskirstymas ir važiavimo greitis yra veiksniai, turintys įtakos stabilumui. Norėdami geriau suprasti šį reiškinį, atlikome papildomas analizes, kad ištirtume dviejų parametrų – pradinio greičio ir vairo ašies posvyrio – įtaką. Kaip pradinę konfigūraciją naudojome aukščiau aprašytą dviračio modelį, kurio vairo kampas 18° ir pradinis greitis 4,6 m/s, ir atlikome šių dviejų veiksnių įtakos parametrinę analizę.

Įvairūs pradiniai greičiai

Stovėdamas dviratis negali likti griežtai vertikalioje padėtyje. Norėdami įvertinti šio parametro poveikį, keitėme judėjimo greitį nuo 2,6 m/s iki 6,6 m/s 1 m/s žingsniu. 2,6–3,6 m/s diapazone dviratis per daug pasviręs ir nestabilus. Esant 5,6 m/s greičiui, pasvirimo greitis linkęs į nulį, tačiau pats pasvirimo kampas įgyja ne nulinę reikšmę. Nors ši konfigūracija yra stabili, dviratis judės ratu šiek tiek pasvirus. Esant 6,6 m/s greičiui, pasvirimo ir vairavimo kampas laikui bėgant didėja, todėl judėjimas tampa nestabilus.

Nestabilus Tvarus Nestabilus
2,6 m/s 3,6 m/s 4,6 m/s 5,6 m/s 6,6 m/s

Stabilus korpusas atitinka 5,6 m/s greitį (kairėje), o nestabilus – 6,6 m/s (dešinėje).

Vairavimo kampas

Vairo mechanizmas yra labai svarbus dviračio savaiminiam balansavimui. Jeigu dviračio valdyti nepavyks (pavyzdžiui, užstrigo vairas), tai dviratis negalės kompensuoti pasvirimo, todėl ilgainiui nukris. Šiuo atžvilgiu vairavimo ašies, kuri kontroliuoja šakės eigą, sukimasis taip pat turi įtakos dviračio savaiminiam balansavimui.

Norėdami išanalizuoti vairavimo ašies sukimosi poveikį dviračio stabilumui, vairavimo kampus keitėme nuo 15° iki 21° 1° žingsniais. Esant 15° kampui, posvyrio ir vairavimo kampas laikui bėgant didėja, todėl ši konfigūracija tampa nestabili. Dviratis yra stabilus nuo 16° iki 19° ir nestabilus didesniu kampu. Kai sukimosi vertės yra didesnės nei 19°, žingsnis ir sukimosi kampas svyruoja, o šie svyravimai laikui bėgant didėja, todėl prarandamas stabilumas.

Šiame įraše parodėme, kaip imituoti nevairuojamo, savaime balansuojančio dviračio judėjimą naudojant COMSOL Multiphysics modulį Multibody Dynamics. Mes pademonstravome, kaip įgyvendinti standaus rato slydimo apribojimus per lygtis, o tada šiuos apribojimus sujungėme su kelių kėbulų dviračio modeliu. Tada išanalizavome pradinio greičio ir ašies sukimosi poveikį dviračio stabilumui. Įvertinę šiuos parametrus pamatėme, kad vienoje komplektacijoje dviratis gali išlikti stabilus, o kitoje jį prarasti.

Savaiminis dviračio balansavimas yra daugelio veiksnių pasekmė. Atlikdami savo analizę ir vadovaudamiesi ankstesniais tyrimais, parodėme, kad dviračio stabilumas yra susijęs su jo gebėjimu „pasukti“ liesos kryptimi.