Simularea mișcării personajelor de jocuri pe computer. Lecție de informatică „modelare în mișcare” Metoda de integrare Verlet

Acest tutorial vine cu o scenă 3D.

Scurta introducere

De altfel, în lecțiile anterioare au fost deja menționate anumite aspecte ale fizicii în Cinema 4D: de exemplu, chiar în prima lecție de pe acest site am scăpat o minge pe o suprafață plană, ulterior modelul fizic al Cinema 4D a fost considerat ca fiind una dintre modalitățile de a simula un generator de mișcare infinită. Dar până acum acestea au fost doar aspecte parțiale, extrem de superficiale și cele mai primitive ale fizicii.

În această lecție, vom trece la cel mai interesant lucru: un studiu aprofundat al fizicii în Cinema 4D bazat pe un exemplu concret - vom încerca să creăm și să configuram (cel puțin în cea mai primitivă versiune) un sistem complet funcțional. modelul fizic al mișcării mașinii pe teren accidentat, simulând în termeni generali aceleași principii după care o mașină se mișcă în lumea reală.

Necesitatea de a folosi un model fizic de mișcare a vehiculului constă în cuvintele „pe teren accidentat”. În majoritatea cazurilor, atunci când modelăm traficul auto, nu este nevoie să folosiți un model fizic: mașinile se deplasează uniform de-a lungul unei traiectorii (acesta este exact tipul de flux de trafic pe care am învățat să creăm dintr-un singur model de mașină, vă amintiți?), interacționând vizual practic. în nici un caz cu mediul înconjurător, iar acest lucru ușor și simplu de descris folosind mijloace simple, fără a apela la fizică. Totuși, de îndată ce vorbim despre terenul complex pe care circulă mașina, sau despre comportamentul extraordinar al mașinii în sine (derivare, derapare sau coliziuni) - aici vine rândul fizicii, cu excepția cazului în care tu și cu mine vrem plasați manual un număr mare de taste și editați curbele de comportament ale unui model tridimensional pentru fiecare secundă din comportamentul acestuia din urmă (și asta fără a garanta plauzibilitatea vizuală a randării finale).

Teluri si obiective

În primul rând, să ne definim scopurile și obiectivele. În această lecție, scopul nostru este să descriem comportamentul mai mult sau mai puțin plauzibil al unei mașini atunci când conducem pe o suprafață denivelată. Mai precis: mașina ar trebui să sară și să se rostogolească atunci când lovește denivelări și, de asemenea, să atârne roțile peste gropi. Și, desigur, ar trebui să încetinească atunci când depășește nervozitatea și să accelereze pe zonele plate.

Dacă nu ar fi accelerația și decelerația mașinii în funcție de teren, atunci poate ne-am simplifica sarcina „suspendând” mașina unui „lider” invizibil care se deplasează de-a lungul unei anumite traiectorii - în acest caz, mașina ar fi ca o sanie pentru copii, a cărei viteză nu depinde de înălțimea zăpezii de sub alergători și de viteza pasului tatălui, care își târăște fiul pe o sanie. În cazul nostru, această soluție la problemă nu este potrivită pentru tine și pentru mine, adică va trebui să echipăm modelul de mașină cu cel mai funcțional motor. Pentru un efect maxim, vom face din mașina noastră un SUV cu tracțiune spate.

Să începem?

Să începem cu modelarea aspectului mașinii (și anume aspectul, nu modelul fizic - acesta nu este același lucru!). Mașina noastră va consta doar din cinci elemente tridimensionale: o caroserie și patru roți. Sper că înțelegeți că fiecare roată ar trebui să fie un element separat al modelului. În plus, este recomandabil să faceți fiecare dintre roți solidă (monolitică), adică constând dintr-un singur element, și nu dintr-un set de elemente, altfel mai târziu veți întâmpina o mulțime de dificultăți - va trebui să fixați împreună. toate elementele fiecăreia dintre roți folosind modificatori fizici, ceea ce, în opinia mea, ar fi o pierdere de timp complet inutilă. Principiul de bază pe baza căruia am împărțit elementele modelului este posibilitatea deplasării vizuale ulterioare a elementelor unul față de celălalt în timp ce SUV-ul se mișcă.

Vă rugăm să rețineți că există decupaje pentru roți în partea de jos a caroseriei SUV-ului - voi face imediat o rezervare că absența lor nu ar interfera cu munca viitorului nostru model fizic (mai târziu veți vedea singur), dar în timp ce vizionați animația ai putea să vezi roțile trecând chiar prin partea de jos, ceea ce, desigur, ar fi o eroare vizuală gravă.

Acum să trecem la cel mai important lucru: crearea modelului fizic real al SUV-ului. Ați putea presupune imediat că este timpul să atașați roțile la caroserie. În niciun caz! Nu acum, nici mai târziu. Si de aceea. Cert este că, dacă ați atașat roțile direct de corp, ați avea din nou o mulțime de dificultăți: modelul fizic al Cinema 4D ar percepe roțile ca fiind în interiorul corpului(adică, ca și cum ar fi blocat în interiorul ei), și cu orice preț ar încerca să le elibereze, drept urmare, în loc de comportamentul mai mult sau mai puțin plauzibil al roților, ați vedea în principal vibrația lor mică, non-stop și o reacție minimă la interacțiunea fizică cu alte obiecte din jurul SUV-ului. Desigur, această problemă poate fi rezolvată complet prin reglarea fină și ajustarea consumatoare de timp a valorilor dinamicii scenei și modelelor, cum ar fi intervalele la atingerea cărora începe interacțiunea elementelor tridimensionale, dar noi va lua un traseu mai simplu.

Vom urma un traseu mai simplu - și de data aceasta vom crea nu un model vizual, ci unul fizic al caroseriei mașinii. Așa cum a fost proiectat de autor, acesta este cel mai obișnuit cub poligonal. În al tău, acesta ar putea fi orice alt obiect poligonal - principalul lucru este că nu este vizibil sub caroseria SUV-ului și că este un model poligonal, ale cărui margini sunt suficient de departe de roți. În mod convențional, vom numi acest element centru de greutate.

De ce este așa, vă întrebați? De ce nu poate fi un obiect NULL sau un spline?

Pentru că centrul de greutate pe care l-am creat, prin definiție și în virtutea numelui său, este destinat să participe activ la modelul fizic al SUV-ului. Nici spline și nici obiectele NULL, fiind dotate cu caracteristici fizice, nu le folosesc pe acestea din urmă, deoarece nu au suprafață fizică.

Deci, centrul de greutate al SUV-ului a fost creat. Să trecem la atașarea roților. În absența unui model fizic, le-am subordona pur și simplu unui cub (sau chiar unui corp) în managerul de obiecte și asta ar fi destul. În cazul nostru, roțile nu ar trebui să fie atașate rigid, ci ținând cont de o anumită libertate fizică, adică de capacitatea de a se deplasa ușor față de centrul greutății atunci când interacțiunea fizică are loc cu alte obiecte din scenă (de exemplu, cu inegale suprafețe de drum).

Pentru acest tip de prindere, Cinema 4D oferă obiecte de tip „Conector” (din engleză „connect” - „to connect”). Accesați meniul de sus, căutați elementul „Simulare”, selectați subelementul „Dynamics” din elementul de meniu derulant și faceți clic pe „Conector” în submeniul derulant.

Vedem că un obiect nou a apărut în fereastra de lucru, iar numele său a apărut în managerul de obiecte. Să începem cu roata din față dreaptă. Amplasăm conectorul în punctul în care se află centrul geometric al roții, care va fi atașat de corp folosind conectorul - în timp ce centrul geometric al roții în sine ar trebui să fie situat în locul în care se află centrul butucului roții. situat la volan.

Acum trebuie să configurați conectorul. Selectați numele acestuia în managerul de obiecte și vedeți fereastra de proprietăți care se deschide mai jos.

Primul parametru a cărui valoare ar trebui să o modificăm este tipul de conexiune (parametrul „Tip”), acesta determină modul în care se va mișca roata față de caroserie. Evident, cel mai potrivit tip de conexiune în cazul nostru va fi „Suspensia roților”. În câmpul de lângă cuvintele „Obiect A”, trageți numele centrului de greutate din managerul de obiecte; în imaginea de mai jos este desemnat ca „Bază” - aceasta este obiect la care Atașăm roata. În câmpul de lângă cuvintele „Obiect B”, trageți numele roții (în imaginea indicată ca „Wheel_FR”, de la abrevierea „Wheel Front Right”) - aceasta este obiect că ti-l atasam. Nu vom atinge parametrii „Anexa A” și „Atașamentul B” - ei indică unde sunt centrele de masă ale obiectelor, iar valorile implicite în acest caz ni se potrivesc destul de bine.

Să trecem la reglarea fină a conectorului.

Setarea „Ignorați coliziunile” este pentru atunci când doriți să evitați interacțiunea fizică între roată și centrul de greutate - de exemplu, dacă setările conectorului permit roții să devieze până la 45 de grade, dar roata se sprijină în continuare pe obiectul în care se află atașat și nu se poate abate la unghiul maxim permis, atunci această setare poate ajuta. Parametrul „Unghiul de direcție” este unghiul maxim permis de abatere a roții de la poziția inițială. Parametrul „Suspension Rest Position” determină deplasarea verticală a roții în repaus (adică în acele momente în care roata nu interacționează cu nimic). În cazul nostru, valoarea este -15 cm.- dacă o schimbați la -25, atunci caroseria SUV-ului va fi ridicată în raport cu roțile chiar mai sus decât în ​​prezent, iar garda la sol va crește, dar la în același timp, stabilitatea SUV-ului va scădea, deoarece centrul de greutate va fi mai mare - nu-i așa, aceasta seamănă deja cu echilibrul stabilității mașinilor din lumea reală? Moliciunea suspensiei depinde de valoarea parametrului „Riditatea suspensiei”. Cu cât valoarea este mai mică, cu atât suspensia va fi mai moale. Parametrul „Suspension Dumping” determină „saritul” suspensiei. Și, în sfârșit, dacă doriți, puteți activa parametrii „Limita inferioară Y” și „Limita superioară Y” și să specificați pentru aceștia valorile distanței dincolo de care roata nu se poate abate.

După ce am terminat de configurat conectorul, repetăm ​​aceeași operațiune - începând cu crearea unui nou conector - pentru a doua roată din față, de data aceasta cea din stânga. În loc să călătoriți prin meniul de sus, așa cum probabil v-ați dat seama deja, puteți găsi pur și simplu conectorul roții din dreapta față pe care l-am creat mai devreme și apăsând și menținând apăsată tasta „Ctrl” de pe tastatură cu toată puterea, trageți numele conectorului într-un spațiu gol din managerul de obiecte - După finalizarea acestei operațiuni, voi și cu mine vom primi o nouă copie a conectorului, care va moșteni și toate setările din originalul său. Principalul lucru este să vă amintiți să schimbați numele roții din dreapta cu numele celei din stânga în câmpul „Obiect B” al proprietăților noului conector.

Rotile din fata sunt finisate. Să trecem în spate.

Și ne confruntăm imediat cu o întrebare oarecum neevidentă la prima vedere: câte motoare ar trebui să aibă SUV-ul nostru? Ce întrebare ciudată, spui - una, desigur.

Permiteți-mi să vă explic cu ce este legată această întrebare. Într-un mecanism de mașină real, cuplul este transmis la ambele roți motrice simultan printr-un sistem destul de complex de acționări mecanice. Nu are sens pentru tine și pentru mine să modelăm acest sistem de propulsie, deoarece nu avem sarcina de a vizualiza structura internă a unui SUV, ceea ce înseamnă că în loc de funcționarea completă a motorului, ne putem permite orice imitație fizică simplificată a asta, atâta timp cât roțile motoare se învârt și împing mașina înainte.

Astfel, tu și cu mine avem două soluții alternative: dacă avem nevoie disperată de a descrie tracțiune separată a două roți motrice, putem adăuga două motoare separate la designul virtual, fiecare dintre ele își va învârti propria roată. Dacă nu trebuie să modelăm o tracțiune separată, atunci cel mai eficient și simplu mod de a pune mașina în mișcare este să creăm o așa-numită „pereche de roți” - două roți strâns cimentate, care sunt antrenate de un singur motor.

În această lecție, vom alege a doua metodă, mai simplă - crearea unui set de roți și rotirea acestuia cu un singur motor. Cu avertismentul că, în principiu, dacă doriți, puteți complica această metodă - de exemplu, rotiți nu setul de roți, ci axa cu roțile motoare atașate la el folosind conectori, astfel încât acestea din urmă să se clătinească liber înainte și înapoi, ca am configurat deja pentru roțile din față Cu toate acestea, în această lecție nu ne vom complica sarcina în mod inutil; dacă aveți o dorință, experimentați pe cont propriu pe baza scenei atașate acestei lecție; un link către aceasta poate fi găsit la începutul lecției.

Deci, sa decis - creăm un set de roți: selectați cele două roți din spate - puteți în fereastra de lucru, puteți merge la managerul de obiecte, unde este mai convenabil pentru dvs. - apoi în managerul de obiecte facem clic dreapta pe orice dintre ele și în meniul contextual derulant căutăm elementul „Conectează” + Ștergere” („Conectează și șterge”). O linie de mai sus, în același meniu contextual, există un element „Conectare” - atunci când combină elemente, creează un nou obiect, lăsând neatinse originalele modelelor îmbinate; nu vom avea nevoie de originalele roților din spate separate.

Vedem că roțile din spate ale SUV-ului au devenit un element tridimensional - care este ceea ce aveam nevoie.

Creăm un alt conector - de data aceasta pentru setul de roți din spate și, având în vedere natura sa monolitică, există doar unul și apoi îl configuram. Îl plasăm, firesc, în centrul setului de roți.

Acum să creăm un motor: meniul de sus, din nou elementul „Simulare”, meniul derulant, subelementul „Dinamica”, subelementul „Motor” din meniul derulant.

Amplasăm motorul creat în același loc cu conectorul pentru setul de roți - la mijloc între roțile din spate (sau, științific vorbind, în centrul geometric al setului de roți din spate), apoi selectăm numele acestuia în managerul de obiecte, mișcăm ușor. privirea noastră către fereastra proprietăților motorului care se deschide mai jos și mergem la un șantier.

În câmpul de lângă cuvintele „Obiect A”, trageți numele setului de roți din spate din managerul de obiecte (în imagine este indicat ca „Roți din spate”). Nu tragem nimic în câmpul de lângă cuvintele „Obiect B”. Pentru parametrul „Tip”, selectați valoarea „Angular” - totul este corect, deoarece pentru ca SUV-ul să se miște, motorul pe care l-am creat trebuie să rotească continuu setul de roți motrice la un anumit unghi. Setați parametrul „Mod” la „Regulare Speed”. Și, în final, indicăm valorile numerice pentru parametrii „Viteza țintă unghiulară” și „Cuplu”.

Probabil că ești gata să rulezi animația și să verifici rezultatele. Dacă da, atunci este puțin devreme: la urma urmei, tu și cu mine am terminat doar o parte a lucrării - am creat un impact fizic asupra obiectelor, în timp ce nu avem încă obiectele fizice în sine. Și roțile, zici, și caroseria și cubul de greutate? Este adevărat, au fost create modele poligonale, dar fizic pentru forțele de influență nu există încă nici roțile, nici corpul, nici cubul de greutate - până când eticheta de dinamică este atribuită roților, caroseriei și cubului de greutate. Deoarece eticheta de dinamică atribuită unui element poligonal al unei scene tridimensionale indică faptul că acest element participă la interacțiunea cu alte elemente care au caracteristici dinamice.

Să începem configurarea caracteristicilor fizice ale SUV-ului. Și în același timp construim o structură ierarhică a elementelor din care constă. În primul rând, creăm un grup în care vor fi colectate toate elementele mașinii (dacă acest lucru nu a fost deja făcut) - acest lucru se poate face combinând primele câteva elemente care vin la îndemână folosind combinația de taste Alt + G (Vă reamintesc că, spre deosebire de metoda general acceptată în Cinema 4D, apăsarea secvențială a tastelor separate, această combinație este apăsată simultan!), sau prin crearea unui obiect NULL.

În continuare, numim grupului creat un cuvânt unic, inimitabil și de neuitat (de exemplu, autorul l-a numit „MAȘINĂ”) și punem în el toate elementele legate de SUV: caroserie, roți, conectori, cub de greutate și motor.

Acum desemnăm elementele grupului ca participanți la interacțiunea fizică cu modelul fizic din jur: selectați numele grupului, faceți clic dreapta pe el, în meniul derulant, mutați cursorul mouse-ului peste elementul „Etichete dinamice” iar în meniul drop-down din ultimul submeniu, selectați singurul articol - „Dynamics Body”.

Dacă ați citit cu atenție această lecție până acum, s-ar putea să vă întrebați: cum poate grupul „MAȘINĂ”, fiind un obiect NULL, să interacționeze fizic într-un model fizic? Așa este, obiectul NULL în sine nu funcționează. Dar proprietățile dinamicii pot fi moștenite de la ea de către toate elementele subordonate acesteia și nu este nevoie să atribuiți o etichetă de dinamică fiecărui element în mod individual. Principalul lucru este să configurați corect eticheta de dinamică a grupului. Configurați: selectați eticheta și în fereastra de proprietăți care se deschide mai jos, selectați fila „Dynamics”, în care activăm parametrul „Activat” (incluzând astfel fizica interacțiunii) și selectam valoarea „On” pentru parametrul „Dynamic” ( indicând astfel participarea grupului la toate regulile comune pentru scena fizică, cum ar fi gravitația etc.)...

Apoi accesați fila „Coliziune” din aceeași fereastră de proprietăți și specificați valorile care forțează elementele grupului să moștenească regulile de dinamică: „Aplicați eticheta copiilor” pentru parametrul „Moștenire etichetă” „(„Moștenire”), „Toate” pentru „Elemente individuale”, o bifă pentru „Auto-coliziune” și „Automat (MoDynamics)” pentru „Formă” („Circuit”). Configuram restul parametrilor dupa gustul dumneavoastra.

Aici ar fi potrivit să ne amintim în sfârșit despre caroseria unui SUV. Conform ideii noastre, ar trebui să interacționeze și cu modelul fizic înconjurător al scenei tridimensionale - de exemplu, să arunce cu nasul un perete de cutii de carton - dar, în același timp, nu ar trebui să interacționeze cu alte elemente ale propriului grup. - cu un cub de greutate și roți. Pentru a obține acest rezultat, îl vom subordona cubului de greutate și vom atribui o etichetă de dinamică individuală caroseriei - la fel ca un grup de elemente de mașină - dar în eticheta de dinamică a caroseriei vom dezactiva parametrul „Dynamic” (setați valoarea „Oprit” pentru el) în fila „Dinamică” (rețineți că parametrul „Activat” rămâne activat, altfel corpul nu va mai participa cu totul la modelul fizic al scenei și orice obstacol care iese în calea SUV-ului va trece liber prin corp!). În fila „Coliziune” a etichetei de dinamică atribuită corpului, puteți specifica „Niciunul” și „Oprit” pentru parametrii „Moștenire etichetă” și respectiv „Elemente individuale”, corpul nu are elemente subordonate cărora proprietățile dinamice ale corpului ar trebui să fie transferate.

Tot ce rămâne este să adăugați scenei tridimensionale modelul fizic din jur menționat în mod repetat mai sus - o oarecare relief neuniform, care în animația finală ar dezvălui o reacție fizică plauzibilă a mașinii la interacțiunea cu gropile. În scena atașată lecției, este o aparență grosieră a unui fel de arenă cu un nucleu punctat cu movile.

In cele din urma

În această lecție, am studiat crearea celui mai simplu model fizic de mișcare a mașinii - fără pluginuri și module suplimentare, folosind instrumente standard Cinema 4D. În lecție, după cum ați observat, modelarea virajelor nu este discutată; modelul creat de noi este capabil să se miște doar în linie dreaptă - desigur, cu excepția cazului în care terenul denivelat de sub roți modifică traiectoria mișcării (ceea ce se întâmplă). în videoclipul de mai jos). Apropo, autorul a ajustat în mod deliberat parametrii modelului fizic al scenei tridimensionale, astfel încât mișcarea SUV-ului să fie, parcă, exagerată, pentru a demonstra în mod clar interacțiunea dintre roți și caroseria mașinii cu nereguli. În plus, scena atașată lecției include și alte elemente nemenționate în lecție, destinate filmării și luminii. Ulterior, poate, pe site vor fi luate în considerare modele fizice mai complexe.

Rezultatul final este sub formă de animație.


Traducere prescurtată-repovestire a articolului: .

Introducere

Articolul descrie elementele de bază ale unei abordări de modelare a mișcării obiectelor, care este convenabil de utilizat în jocurile pe calculator. Această abordare este simplă, programele care o implementează funcționează rapid și sunt destul de stabile. În plus, nu sunt necesare cunoștințe matematice speciale pentru a înțelege elementele de bază (deși abordarea în sine are baze matematice solide). Cu ajutorul acestuia, puteți simula mișcarea țesuturilor, a corpurilor moi și dure, precum și a corpurilor ținând cont de conexiuni.

Modelarea fizică, adică modelarea mișcării personajelor bazată pe legile fizicii (sau mai bine zis, mecanicii), a fost studiată destul de mult timp. În literatura de specialitate sunt propuse diverse abordări (vezi etc.), și s-a investit mult efort în crearea unor algoritmi precisi și fiabili. Metode precise de modelare a mișcării sunt cunoscute în fizică de mult timp. Cu toate acestea, pentru jocuri și sisteme de realitate virtuală, acuratețea nu este cel mai important avantaj (deși este bună atunci când este). Mult mai importantă este plauzibilitatea (programatorul poate distorsiona modelul realității atât cât dorește, atâta timp cât reușește să captiveze jucătorul) și viteza de execuție (doar o parte din timpul pe care o durează un cadru de animație este alocată pentru a performa. calcule pentru modelarea mișcării). În cazul modelării fizice, termenul „plauzibilitate” implică și stabilitate: o metodă de modelare în care corpurile pătrund în obstacole sau sară atunci când ar trebui să stea nemișcate nu poate fi considerată reușită. Metodele descrise în această lucrare au fost dezvoltate în primul rând pentru a obține plauzibilitatea și viteza de calcul. Au performanțe ridicate și sunt destul de simplu de implementat (cel puțin în comparație cu alte metode care rezolvă aceleași probleme).

Metoda luată în considerare este iterativă, astfel încât, pornind de la un anumit pas, poate fi oprită în orice moment. Acest lucru permite un compromis între acuratețea calculului și timpul petrecut: dacă o anumită cantitate de eroare este considerată acceptabilă, codul poate fi lăsat să ruleze mai rapid; Mai mult, mărimea erorii poate fi selectată adaptiv în timpul execuției. Metoda gestionează, de asemenea, coliziunile și contactele de repaus și face față modelării unui teanc de corpuri stivuite unul peste altul, ceea ce reprezintă o problemă pentru multe motoare de fizică.

Succesul metodei depinde de combinarea corectă și utilizarea avantajelor mai multor tehnici:

  • Metoda de integrare numerică Verlet;
  • gestionarea coliziunilor și penetrarea corpului folosind proiecția;
  • un simplu rezolvator de constrângeri folosind relaxarea;
  • aproximarea rădăcinii pătrate, care mărește viteza calculelor;
  • modelarea solidelor ca particule legate prin legături.

Vom oferi o scurtă explicație pentru fiecare dintre aceste tehnici. În redactarea acestui document, autorul a încercat să îl facă accesibil unui public cât mai larg fără a pierde informațiile esențiale necesare implementării. Aceasta înseamnă că explicațiile și justificările matematice sunt reduse la minimum, cu excepția cazului în care sunt cruciale pentru înțelegerea subiectului. Scopul lucrării este de a demonstra posibilitatea implementării unei metode de modelare fizică destul de avansată și robustă, fără a fi blocat în subtilități matematice.

Conținutul este organizat după cum urmează. Secțiunea 2 descrie reprezentarea unui sistem de particule fără utilizarea vitezei. Această reprezentare are o serie de avantaje, dintre care cele mai semnificative sunt stabilitatea și ușurința de implementare a conexiunilor și alte constrângeri. Secțiunea 3 descrie modul în care are loc gestionarea coliziunilor. Apoi, în Secțiunea 4, sistemul de particule este mărit cu conexiuni care permit simularea mișcării țesăturii. Secțiunea 5 explică cum să configurați un sistem de particule interconectate pentru a modela un corp rigid. În continuare, în Secțiunea 6, arătăm cum să implementăm conexiunile între corpuri (în special, balamale). Secțiunea 7 conține diverse note scurte și ceva experiență în implementarea frecării.

În cele ce urmează, vectorii sunt notați cu litere cu săgeți, iar componentele lor prin indice: \(\vec(x)=(x_1,x_2,x_3)\) .

Metoda de integrare Verlet

Inima unei simulări (adică simularea unui proces fizic folosind un sistem computerizat) este un sistem de particule. De obicei, la implementarea unui astfel de sistem, se presupune că fiecare particulă are două caracteristici principale: coordonatele (poziția) \(\vec(x)\) și viteza \(\vec(v)\) . Apoi, noile valori ale coordonatelor \(\vec(x)^\prime\) și viteza \(\vec(v)^\prime\) sunt calculate folosind formulele

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

unde \(\Delta t\) este pasul de timp, \(\vec(a)\) este accelerația calculată în conformitate cu legea a 2-a a lui Newton \(\vec(f)=m \vec(a)\) (unde \(\vec(f)\) este forța totală care acționează asupra particulei). Formulele date implementează cea mai simplă metodă de integrare numerică - metoda lui Euler.

Vom lua în considerare o altă descriere a unei particule în care viteza nu este utilizată: în loc să stocăm poziția și viteza fiecărei particule, vom stoca poziția curentă a particulei \(\vec(x)\) și poziția acesteia la precedenta. pasul de integrare \(\vec(x)^ (*)\) . Presupunând că pasul de integrare este constant, obținem următoarele formule pentru calcularea noilor valori:

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

Această metodă de integrare numerică se numește metoda Verlet (vezi) și este utilizată activ în dinamica moleculară.

Metoda Verlet se bazează pe o formulă aproximativă de calcul a derivatei a doua

$$ \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) $$

Această aproximare nu este cea mai precisă (există metode mai avansate de integrare numerică), dar este stabilă și funcționează rapid. Prin reducerea factorului 2 la, să zicem, 1,99, introducem astfel o forță de rezistență care disipă energia sistemului. De asemenea, rețineți că \(\vec(x)-\vec(x)^(*)\) este distanța parcursă în timpul ultimului pas de integrare (\(\vec(v)\Delta t\) ).

La sfârșitul etapei de integrare, poziția curentă a fiecărei particule \(\vec(x)\) este stocată în variabila corespunzătoare \(\vec(x)^(*)\) pentru a fi utilizată în pasul următor. Dacă există multe particule în sistem, atunci în loc să le copiați coordonatele, este convenabil să utilizați redirecționarea pointerului.

Codul care implementează ideile descrise mai sus ar putea arăta astfel (clasa Vector3 conține toate operațiunile necesare asupra vectorilor)

clasa ParticleSystem ( Vector3 m_x [ NUM_PARTICLES ]; // Pozitie curenta Vector3 m_oldx [ NUM_PARTICLES ]; // Pozitia anterioara Vector3 m_a [ NUM_PARTICLES ]; // Forța totală (accelerație) Vector3 m_vGravitate ; // Plutire gravitațională m_fTimeStep ; public : void TimeStep(); privat : void Verlet(); void SatisfyConstraints(); void AccumulateForces(); // (vom omite constructorii, inițializarea câmpului etc.) }; // pas de integrare prin metoda Verlet void ParticleSystem::Verlet() (pentru (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 ; } } // însumarea forțelor care acționează asupra fiecărei particule void ParticleSystem::AccumulateForces() ( // Toate particulele sunt sub influența gravitației pentru (int i = 0; i< NUM_PARTICLES ; i ++ ) m_a [ i ] = m_vGravity ; } // verificarea respectării conexiunilor suprapuse void ParticleSystem::SatisfyConstraints() ( // Acum nu ne interesează cum este implementat.) // pasul de calcul void ParticleSystem :: TimeStep () ( AccumulateForces (); Verlet (); SatisfyConstraints (); )

Până acum, totul descris mai sus nu pare foarte impresionant. Avantajele acestei abordări vor deveni clare odată ce trecem la utilizarea constrângerilor și la descrierea corpurilor rigide.

Încercați să setați \(\vec(a)=(0,0,1)\) și condițiile inițiale \(\vec(x)=(1,0,0)\) , \(\vec(x)^*= (0,0,0)\) . Calculați câțiva pași manual și vedeți ce se întâmplă.

Ciocniri și manipularea contactelor folosind proiecție

Metodele de procesare a contactelor dintre corpuri, bazate pe utilizarea funcțiilor de penalizare (scheme bazate pe penalități), sugerează că în punctul de contact, unde este posibilă pătrunderea corpurilor unul în celălalt, trebuie să introduceți un arc pentru a simula acest contact. Această abordare este ușor de implementat, dar duce la o serie de probleme serioase. În special, este foarte dificil să se selecteze rigiditatea arcului, astfel încât, pe de o parte, obiectele să nu pătrundă prea adânc unele în altele, iar pe de altă parte, astfel încât sistemul să nu-și piardă stabilitatea din cauza rigidității arcului. fiind prea sus. O altă abordare a procesării coliziunilor este aceea că, atunci când este detectată o coliziune, timpul este „rebobinat” înapoi, până la momentul exact de contact al corpurilor (de exemplu, folosind o căutare binară), apoi pozițiile și vitezele corpurilor sunt corectate. (folosind formulele pentru coliziuni cunoscute de la cursul de fizică), după care calculul începe din nou din acest moment. Și așa - pentru fiecare coliziune. Nu este o abordare foarte economică dacă intenționați să simulați mișcarea multor corpuri în timp real.

Aici vom analiza o abordare diferită. Vom proiecta particule care au pătruns în obstacol din afara obstacolului. Prin proiecție înțelegem mișcarea unei particule, suficient de mică pentru a o elibera de obstacol. În mod obișnuit, aceasta implică deplasarea particulei în direcția normală cu suprafața de contact (obstacol) - de unde și originea termenului de „proiecție”.

Luați în considerare următorul exemplu. Fie „lumea” noastră interiorul unui cub de dimensiune (0,0,0)--(1000,1000,1000) și, în plus, coeficientul de restituire al particulelor este zero (adică particulele care se ciocnesc cu suprafața lui). cubul nu se reflectă din el). Pentru a ne asigura că coordonatele particulelor rămân în interiorul cubului, scriem următorul cod care implementează proiecția:

// Forțează particulele să rămână în interiorul cubului void ParticleSystem :: SatisfyConstraints () ( pentru (int i = 0 ; i< NUM_PARTICLES ; i ++ ) { // Pentru toate particulele Vector3 & x = m_x [ i ]; x = vmin(vmax(x, Vector3(0, 0, 0)), Vector3(1000, 1000, 1000)); ) )

(vmax este operația pe componente de calcul a maximului, iar vmin este calculul echivalent al minimului). Acest cod gestionează atât coliziunile, cât și contactele de repaus (adică cazurile în care un punct este în repaus pe suprafața unui cub) și stochează poziția tuturor particulelor în interiorul cubului. Frumusețea metodei Verlet este că modificările corespunzătoare ale valorilor vitezei se fac automat. În apelurile ulterioare la TimeStep(), viteza va fi ajustată astfel încât să nu conțină o componentă perpendiculară pe suprafața cubului (care corespunde unui factor de recuperare zero). A se vedea figura 1.

Încercați să faceți singur aceste calcule - și veți vedea că nu este nevoie să reduceți viteza în direcția perpendiculară pe peretele cubului - acest lucru se întâmplă „de la sine”. Acest lucru poate părea banal dacă ne limităm la modelarea particulelor, dar principalele avantaje ale metodei Verlet vor apărea de îndată ce vom trece la luarea în considerare a legăturilor și a corpurilor rigide conectate. Adică chiar acum.

Prelucrarea mai multor conexiuni impuse simultan folosind metoda relaxării

Un model de țesătură este de obicei un sistem de particule conectate prin arcuri. Nu este dificil să construiți ecuații diferențiale pentru un astfel de sistem. Dar una este de construit și cu totul altceva de rezolvat. În același timp, apar toate problemele pe care le-am avut atunci când folosim funcțiile de penalizare: arcurile prea rigide duc la însuși sistemul de ecuații să devină „sistem rigid”, iar acest lucru duce la instabilitate dacă sunt folosite cele mai simple metode de integrare numerică sau la munca lenta, daca se folosesc metode mai avansate, in ambele cazuri este garantata o durere de cap. În schimb, arcurile prea moi vor face ca materialul să pară nerealist elastic.

Totuși, cel mai interesant lucru se întâmplă dacă rigiditatea arcului este direcționată către infinit: sistemul devine brusc rezolvabil chiar și pentru o metodă de integrare foarte simplă (și rapidă), rămânând în același timp stabil. Dar înainte de a continua să vorbim despre țesătură, să ne întoarcem la exemplul anterior. Cubul cu care aveam de-a face poate fi gândit ca o colecție de constrângeri unilaterale (adică constrângeri scrise sub formă de inegalități) - câte una pentru fiecare latură a cubului - care trebuie efectuate pe tot parcursul simulării.

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

În exemplul luat în considerare, pentru a respecta restricțiile impuse de legături (pentru ca particulele să rămână în interiorul cubului), este suficient să proiectăm pur și simplu coordonatele particulelor „scărcate” pe suprafața cubului. Această idee este descrisă în următorul pseudocod:

// Pseudocod pentru a impune constrângeri (1) pentru i = 1 , 2 , 3 set xi = min ( max ( xi , 0 ), 1000 )

Acest lucru poate fi gândit ca și cum particula și suprafața obstacolului sunt conectate printr-un arc infinit de rigid, care, dacă este alungit, revine instantaneu la lungimea sa normală, egală cu zero.

Să ne extindem modelul adăugând o tijă cu lungimea de 100. Pentru a face acest lucru, trebuie să definim două particule (\(\vec(x)_1\) și \(\vec(x)_2\) ) și să cerem ca distanța dintre ele să fie întotdeauna egală cu 100. Notația matematică pentru această relație bilaterală este:

\begin(ecuația) |\vec(x)_2-\vec(x)_1| = 100. \label(eq:C2) \end(equation)

Chiar dacă în momentul inițial de timp pozițiile particulelor îndeplinesc condițiile \eqref(eq:C2), atunci în momentul următor aceste condiții cel mai probabil nu vor fi îndeplinite. Pentru a obține valoarea corectă a distanței, deplasăm particulele, proiectându-le pe setul de soluții descris de \eqref(eq:C2). Pentru a face acest lucru, particulele fie se îndepărtează unele de altele, fie sunt atrase mai aproape, în funcție de distanța obținută prin integrare numerică este mică sau mare. Vezi Figura 2.

Mișcarea particulelor pentru a corecta o distanță care nu satisface constrângerea \eqref(eq:C2)

Pseudocod care implementează condițiile \eqref(eq:C2):

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

Rețineți că delta este un vector, iar delta*delta este un produs scalar. Acest pseudocod va îndepărta particulele sau le va muta pentru a atinge distanța necesară între ele. Din nou, ne putem gândi la acesta ca la un arc infinit de rigid care se întoarce instantaneu la lungimea normală de 100.

Acum să presupunem că, pe lângă condiția \eqref(eq:C2), trebuie îndeplinită și condiția \eqref(eq:C1) (particulele trebuie să fie în interiorul cubului). Se poate dovedi că atunci când încercați să îndepliniți condiția \eqref(eq:C2), unele dintre particulele tijei vor încălca cerințele \eqref(eq:C1) (tija va ieși din cub). Puteți, desigur, să proiectați din nou particula ofensătoare pe suprafața cubului executând \eqref(eq:C1), dar apoi \eqref(eq:C2) va fi rupt.

Pentru a satisface simultan cerințele \eqref(eq:C1) și \eqref(eq:C2) trebuie să rezolvăm un sistem de ecuații. Vom face acest lucru, dar nu direct: pur și simplu vom repeta două fragmente de pseudocod unul după altul de un anumit număr de ori, în speranța că rezultatul va fi util. Această abordare este implementată în următorul cod:

//implementarea modelării unei tije în interiorul unui cub void ParticleSystem :: SatisfyConstraints () ( pentru (int j = 0 ; j)< NUM_ITERATIONS ; j ++ ) { // Mai întâi îndeplinim condițiile (1) pentru (int i = 0; i< NUM_PARTICLES ; i ++ ) { // Pentru toate particulele Vector3 & x = m_x [ i ]; x = vmin(vmax(x, Vector3(0, 0, 0)), Vector3(1000, 1000, 1000)); ) // Acum să ne mulțumim (2) Vector3 & x1 = m_x [ 0 ]; Vector3 & x2 = m_x [ 1 ]; Vector3 delta = x2 - x1 ; float deltalength = sqrt(delta * delta); float diff = (deltangth - restlength ) / deltalength ; x1 -= delta * 0,5 * dif ; x2 += delta * 0,5 * dif ; ) )

(inițializarea particulelor este omisă aici). Deși această metodă de repetiție „prost” poate părea oarecum naivă, ea converge totuși spre soluția pe care o căutăm! În matematică se numește metoda de relaxare(sau Jacobi, sau Gauss-Seidel - în funcție de exact cum o faci, vezi). Funcționează prin satisfacerea secvențială a constrângerilor individuale și converge către o configurație globală care satisface toate constrângerile simultan. Această metodă este foarte utilă în situațiile în care trebuie îndeplinite simultan mai multe constrângeri independente.

Numărul de iterații necesare depinde de sistemul modelat și de natura mișcării. Puteți face alegerea acestui număr adaptabilă, măsurând modificarea care a avut loc în raport cu iterația anterioară. Dacă oprim iterațiile prea devreme, rezultatul nu va fi suficient de precis, dar, datorită metodei lui Verlet, probabil va fi puțin mai bine în cadrul următor, și chiar mai bine în cadrul următor etc. Aceasta înseamnă că și oprirea relaxării. devreme nu va distruge complet animația, ci va face imaginea mai sacadată.

Modelarea țesăturilor

Faptul că o constrângere de tip tijă poate fi considerată ca un arc foarte rigid permite ca acest tip de constrângere să fie utilizat pentru modelarea țesuturilor. Să presupunem, de exemplu, că țesătura este reprezentată de o plasă hexagonală constând din triunghiuri. Fiecare nod de plasă reprezintă o particulă, iar fiecare față este o conexiune de tip tijă care leagă particulele (lungimea normală a unei tije este egală cu distanța dintre nodurile pe care le conectează).

Funcția HandleConstraints(), care este responsabilă pentru procesarea constrângerilor, folosește relaxarea peste toate constrângerile. Ciclul de relaxare poate fi repetat de mai multe ori. Cu toate acestea, în majoritatea cazurilor, o singură iterație este suficientă pentru a obține o animație cu aspect frumos. Aceasta înseamnă că consumul de timp al unei simulări de țesătură depinde în principal de cât timp durează pentru a efectua \(N\) rădăcină pătrată și \(N\) operațiuni de divizare (unde \(N\) este numărul de muchii din plasa care simulează țesătura). Mai jos vă vom arăta un truc pentru a scăpa de calculul rădăcinii pătrate. Dar mai întâi, să ne uităm la cum arată procesarea constrângerilor.

// Implementarea modelării țesăturilor struct Constraint ( int particulăA , particulăB ; float restlength ; ); // Să presupunem că matricea m_constraints există deja void ParticleSystem :: SatisfyConstraints () ( pentru (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 ; } // Atașați una dintre particulele care alcătuiesc țesătura la origine m_x [ 0 ] = Vector3 ( 0 , 0 , 0 ); ) )

Acum să discutăm cum să scăpăm de calculul rădăcinii pătrate. Dacă toate restricțiile sunt îndeplinite (bine, sau aproape îndeplinite), atunci, după cum știm deja, rezultatul calculării rădăcinii pătrate tinde spre \(r\) - lungimea normală a conexiunii (tija). Folosim acest fapt pentru a obține o expresie aproximativă pentru funcția rădăcină pătrată. Să înlocuim funcția \(\sqrt(x)\) cu un termen de ordinul 1 din extinderea seriei Taylor în vecinătatea lungimii \(r\) (aceasta este echivalentă cu o iterație a metodei Newton-Raphson cu aproximarea initiala \(r\)). După câteva transformări, obținem următorul pseudocod:

// Pseudocod pentru a aplica constrângerile (2) folosind aproximarea sqrt delta = x2 - x1 ; delta *= restlength * restlength / (delta * delta + restlength * restlength ) - 0,5 ; x1 -= delta ; x2 += delta ;

Rețineți că dacă distanța îndeplinește deja constrângerile (adică dacă |delta|=restlength), atunci vom obține delta egală cu (0,0,0) și nu se va produce nicio modificare.

Acum nu mai folosim rădăcini pătrate atunci când procesăm fiecare relație. În plus, pătratul restlength * restlength poate fi calculat în avans. Operațiile consumatoare de timp sunt reduse la efectuarea \(N\) diviziuni pe cadru (și accesarea memoriei corespunzătoare) - este greu să ne gândim la ceva care rulează semnificativ mai rapid.

Constrângerile nu vor fi neapărat satisfăcute într-o singură iterație, dar, datorită metodei Verlet, sistemul converge rapid la starea corectă (când toate constrângerile sunt îndeplinite) - literalmente în câteva cadre. De fapt, utilizarea unei singure iterații și a aproximării rădăcinii pătrate elimină problema rigidității sistemului de ecuații, care ar apărea neapărat într-un sistem cu tije absolut rigide.

Prin plasarea legăturilor pin între perechi de vârfuri adiacente, algoritmul de modelare a țesuturilor poate fi extins la modelarea plantelor.

Codul și ecuațiile discutate în această secțiune presupun că toate particulele au aceeași masă. Particulele cu mase diferite pot fi modelate în același mod, dar ecuațiile rezultate vor fi puțin mai complicate.

Astfel, respectarea constrângerii \eqref(eq:C2) pentru particule cu mase diferite este implementată de următorul pseudocod:

// Pseudocod pentru a impune constrângeri (2) delta = x2 - x1 ; deltalength = sqrt(delta * delta); diff = (deltangth - restlength ) / (deltalength * (invmass1 + invmass2 )); x1 -= invmass1 * delta * diff ; x2 += invmass2 * delta * diff ;

Aici invmass1 și invmass2 stochează masele inverse ale particulelor \(\vec(x)_1\) și \(\vec(x)_2\) . Dacă dorim ca particula să rămână staționară, trebuie să o setăm la invmass = 0, care corespunde unei mase infinite. Ca mai sus, calculele aproximative ale rădăcinii pătrate pot fi folosite pentru a accelera calculele.

Solide

Ecuațiile de mișcare ale corpurilor rigide au fost propuse cu mult înainte de inventarea computerelor moderne. Pentru a obține rezultate utile în acele vremuri, matematicienii trebuiau să efectueze transformări de formule. Acest lucru a condus la apariția unor astfel de concepte și instrumente utile precum tensorul de inerție, momentul unghiular, momentul forței, cuaternionii pentru a reprezenta orientarea etc. Între timp, capacitatea de a procesa cantități uriașe de date în formă digitală permite acum efectuarea de calcule. pentru elemente mai simple și, în unele cazuri, chiar fac astfel de calcule mai profitabile. În cazul solidelor tridimensionale, aceasta înseamnă că poate fi convenabil să modelați solidul cu patru particule și șase legături (dând numărul corect de grade de libertate: \(4\cdot 3 - 6 = 6\)). Acest lucru simplifică o mulțime de lucruri și asta vom face în continuare.

Luați în considerare un tetraedru cu o particulă plasată la fiecare dintre cele patru vârfuri ale sale. În plus, fiecare dintre cele șase margini ale tetraedrului reprezintă o constrângere de tip bară discutată în secțiunea anterioară. Acest lucru este suficient pentru a simula un corp solid. Tetraedrul poate fi plasat în interiorul cubului discutat mai sus, iar integratorul Verlet va asigura mișcarea corectă a acestuia. Funcția SatisfyConstraints() trebuie să aibă grijă de două lucruri: 1) ca particulele să rămână în interiorul cubului și 2) să fie respectate cele șase constrângeri ale tulpinii. Acest lucru se poate face, ca și înainte, folosind relaxarea: de obicei sunt suficiente 3-4 iterații. Nu uitați și de calculele eficiente ale rădăcinii pătrate.

Cu toate acestea, este clar că în timpul coliziunilor, corpurile solide se vor comporta diferit față de tetraedrele „scheletice”. Există o altă problemă: până acum am detectat faptul unei coliziuni între un corp rigid și „lumea” înconjurătoare doar pe baza informațiilor despre vârfuri: dacă un vârf era în afara cubului, era din nou proiectat în interior. Acest lucru funcționează excelent atâta timp cât interiorul „lumii” este convex. Dacă nu este cazul, atunci tetraedrul va putea pătrunde în granița „lumii” chiar și atunci când niciunul dintre vârfurile sale nu a depășit această limită (vezi Fig. 3, unde triunghiul este un analog plat al tetraedrului). Să vedem cum se rezolvă această problemă.

Mai întâi, să ne uităm la o versiune mai simplă a problemei. Să luăm o tijă, să o plasăm într-o „lume” cubică și să presupunem că cubul are o mică proeminență îndreptată spre interior. Acum tija poate traversa granițele „lumii”, deși ambele particule de la capete rămân în interiorul cubului (Fig. 4). Nu vom intra în complexitatea dezvoltării unui mecanism de detectare a coliziunilor, deoarece aceasta este o știință complet separată. Să presupunem, în schimb, că un subsistem de detectare a coliziunilor există deja și își face treaba: determinând adâncimea de penetrare și coordonatele punctelor de penetrare pentru fiecare dintre cele două obiecte care se ciocnesc. O definiție a punctelor de penetrare și a adâncimii de penetrare este: adâncimea de penetrare \(d_p\) este cea mai scurtă distanță pe care două obiecte trebuie separate într-o direcție adecvată pentru a evita ciocnirea lor. Punctele de penetrare sunt punctele de pe fiecare dintre obiectele în care obiectele se ating între ele după ce a avut loc transferul menționat mai sus.

Aruncă o altă privire la Figura 4. Aici, după pasul de integrare numerică, tija a pătruns prin graniță. Detectorul de coliziune a identificat două puncte de penetrare: \(\vec(p)\) și \(\vec(q)\) . În Fig. 4a, punctul \(\vec(p)\) coincide de fapt cu una dintre particulele de capăt: \(\vec(p)=\vec(x)_1\) . În Fig. 4b, \(\vec(p)\) se află între \(\vec(x)_1\) și \(\vec(x)_2\) la o distanță de 1/4 din lungimea tijei de la \ (\vec(x)_1\) . În ambele cazuri, punctul \(\vec(p)\) se află pe tijă și, prin urmare, coordonatele sale pot fi exprimate ca o combinație liniară a coordonatelor punctelor \(\vec(x)_1\) și \ (\vec(x) _2\) : \(\vec(p) = c_1\vec(x)_1 + c_2\vec(x)_2\) astfel încât \(c_1 + c_2 = 1\) . În primul caz, \(c_1 = 1\) , \(c_2 = 0\) , iar în al doilea - \(c_1 = 0,75\) și \(c_2 = 0,25\) . Aceste valori ne spun cât de departe trebuie mutate particulele corespunzătoare.

Pentru a corecta poziția tijei, mutați-o astfel încât punctul \(\vec(p)\) să coincidă cu \(\vec(q)\) . Pentru a face acest lucru, mutăm particulele \(\vec(x)_1\) și \(\vec(x)_2\) în direcția specificată de vectorul care leagă \(\vec(p)\) și \(\ vec(q)\ ): .

În primul caz (Fig. 4a), proiectăm pur și simplu \(\vec(x)_1\) în afara regiunii în care este „interzis” să fie, așa cum am făcut înainte (în direcția \(\vec(q) )\) ). Acest lucru va fi suficient, iar coordonatele \(\vec(x)_2\) nu trebuie schimbate deloc. În al doilea caz (Fig. 4b), punctul \(\vec(x)_1\) trebuie de asemenea mutat la o distanță mai mare decât \(\vec(x)_2\), deoarece punctul \(\vec (p)\) este situat mai aproape de \(\vec(x)_1\) (într-adevăr, deoarece \(\vec(p) = 0,75\vec(x)_1 + 0,25\vec(x)_2\), apoi de fiecare dată când mișcăm \(\vec(x)_1\) cu o sumă de 0,75, mișcăm \(\vec(x)_2\) doar cu 0,25). Cu alte cuvinte, noile poziții ale particulelor \(\vec(x)_1^\prime\) și \(\vec(x)_2^\prime\) sunt date de relațiile

\begin(equation) \begin(aligned) \vec(x)_1^\prime &= \vec(x)_1 + 0,75\lambda\cdot\vec(\Delta), \\ \vec(x)_2^\ prim &= \vec(x)_2 + 0,25\lambda\cdot\vec(\Delta), \end(aligned) \label(eq:x_new) \end(equation)

unde \(\lambda\) este o cantitate necunoscută. Noua poziție a particulei \(\vec(p)\) - \(\vec(p)^\prime\) - este calculată folosind formula

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

Să ne amintim că dorim să realizăm acel \(\vec(p)^\prime = \vec(q)\), adică trebuie să alegem \(\lambda\) exact astfel încât \(\vec(p ) ^\prime\) ca rezultat a coincis cu \(\vec(q)\) . Deoarece mișcăm particulele numai în direcția \(\vec(\Delta)\), atunci \(\vec(p)\) se mișcă și în direcția \(\vec(\Delta)\) și, prin urmare, soluția la ecuația \ (\vec(p)^\prime = \vec(q)\) poate fi găsită prin exprimarea \(\lambda\) din

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

Scriind expresia din partea stângă a egalității, obținem

$$ \begin(aligned) \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( aliniat)$$

care, ținând cont de partea dreaptă \eqref(eq:pq), dă

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

Înlocuind \(\lambda\) găsit în \eqref(eq:x_new), obținem pozițiile corectate ale particulelor \(\vec(x)_1\) și \(\vec(x)_2\) la care \( \vec(p)^\prime\) se va potrivi cu \(\vec(q)\) .

Figura 5 arată poziția care apare după mișcarea particulelor. Nu mai există nicio pătrundere reciprocă a obiectelor, dar a fost încălcată cerința ca lungimea tijei să rămână constantă. Pentru a remedia acest lucru, să mai facem o iterație a ciclului de relaxare (sau chiar mai multe), după care completăm ciclul de corectare a pozițiilor particulelor.

În cazul unui tetraedru, strategia descrisă mai sus va funcționa similar. În primul rând, se găsesc punctele de întrepătrundere \(\vec(p)\) și \(\vec(q)\) (pot fi situate și în interiorul triunghiului) și \(\vec(p)\) este reprezentat ca o combinație liniară de patru particule \(\vec(p)=c_1\vec(x)_1+c_2\vec(x)_2+c_3\vec(x)_3+c_4\vec(x)_4\) astfel încât \(c_1+c_2+c_3+c_4=1\) (acest lucru va necesita rezolvarea unui mic sistem de ecuații liniare). Odată găsit \(\vec(\Delta) = \vec(q)-\vec(p)\), va fi posibil să găsiți valoarea \(\lambda\) folosind formula

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

iar poziţiile corectate ale particulelor sunt definite ca

$$ \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(align*) $$

Deci, am luat în considerare ciocnirea unui corp rigid cu o „lume” nemișcată. Metoda descrisă mai sus poate fi generalizată cu ușurință pentru a gestiona coliziunile mai multor corpuri rigide. În acest caz, coliziunile sunt procesate pentru o pereche de corpuri odată și, în loc să vă mișcați doar \(\vec(p)\) , va trebui să mutați \(\vec(p)\) și \(\vec (q)\ ) unul față de celălalt.

Și din nou, după ajustarea pozițiilor particulelor pentru a evita pătrunderea reciprocă a corpurilor, este necesar să aveți grijă de îndeplinirea a încă șase restricții - invariabilitatea distanțelor dintre particulele care alcătuiesc corpul solid. Folosind această metodă, tetraedrul poate fi chiar imbricat în interiorul altui obiect, ceea ce este mai convenabil de utilizat în locul tetraedrului însuși atunci când se gestionează coliziuni. Figura 6 prezintă un tetraedru plasat într-un cub.

În primul rând, cubul trebuie să fie atașat de tetraedru într-un fel. O abordare este să alegeți centrul de masă al tetraedrului ca centru al cubului \(0,25\cdot (\vec(x)_1 + \vec(x)_2 + \vec(x)_3 + \vec(x)_4)\), iar apoi, folosind coordonatele curente ale tetraedrului, calculați coordonatele vârfurilor cubului. Când este detectată o coliziune, punctul de contact \(\vec(p)\) (care se află acum pe cub) este procesat în același mod ca mai sus. Coordonatele actualizate ale particulelor sunt calculate în același mod. Pentru a accelera calculele, puteți precalcula coeficienții \(c_1\) -\(c_4\) pentru toate vârfurile cubului. Dacă \(\vec(p)\) se întâmplă să fie un vârf, atunci valorile \(c_1\) -\(c_4\) pot fi găsite și utilizate direct. În caz contrar, \(\vec(p)\) se află în interiorul triunghiului sau pe una dintre laturile acestuia, iar valorile lui \(c_1\)-\(c_4\) pot fi obținute din valorile precalculate ale vârfurile triunghiului folosind interpolare.

De regulă, 3-4 iterații sunt suficiente pentru a face față coliziunilor. Dacă relaxarea este oprită prea devreme, corpurile nu se vor comporta la fel de complet solide. Dar acest lucru este chiar bine, deoarece corpurile absolut solide nu există în natură. În plus, acest lucru face sistemul mai stabil.

La rearanjarea pozițiilor particulelor care alcătuiesc tetraedrul, proprietățile fizice ale corpului trebuie modificate corespunzător (matematic, aceasta înseamnă că tensorul de inerție al corpului se modifică, în funcție de pozițiile și masele particulelor).

Folosind același principiu ca și tetraedrul, puteți seta o altă configurație similară de particule și legături prin plasarea particulelor în puncte cu coordonatele \((0,0,0)\), \((1,0,0)\), \( (0,1,0)\) și \((0,0,1)\) . Fie \(\vec(a)\) , \(\vec(b)\) și \(\vec(c)\) să fie vectori direcționați de la particula 1 către particulele 2, 3 și, respectiv, 4. Limităm pozițiile particulelor prin cerința ca vectorii \(\vec(a)\) , \(\vec(b)\) și \(\vec(c)\) să aibă lungimea unitară și unghiul între fiecare dintre cele trei perechi de vectori a fost egală cu \(90^\circ\) (produsele scalare corespunzătoare trebuie să fie egale cu zero). Rețineți că acest lucru, ca și în cazul tetraedrului, va da 4 particule și 6 legături.

Corpuri articulate

Acum putem conecta mai multe corpuri rigide folosind balamale (cilindrice, sferice etc.). Presupunând că două corpuri au o particulă comună, obținem o balama sferică (articulație cu știft), iar dacă două particule sunt comune, atunci obținem o balama cilindrică (balama) (Fig. 7). În același mod, puteți conecta două corpuri folosind o tijă sau orice alt tip de conexiune - trebuie doar să vă amintiți să adăugați cod pentru a gestiona noul tip de conexiune în bucla de relaxare.

Această abordare ne permite să construim un model complet al corpului uman articulat. Realismul va crește dacă implementați suplimentar restricții privind mișcările unghiulare în balamale. Există mai multe modalități de a implementa astfel de restricții. Cea mai simplă metodă presupune utilizarea unei constrângeri de tip tijă, care se declanșează numai atunci când distanța dintre două particule scade sub o anumită valoare de prag (în acest caz avem de-a face cu o cuplare unidirecțională a formei \(|\vec(x)_2 - \vec(x)_1| > 100\)). Ca o consecință a acestui fapt, ambele particule nu se pot apropia niciodată prea mult una de cealaltă (Fig. 8).

O altă metodă pentru a crea restricții asupra mișcărilor unghiulare necesită următoarea condiție pentru ca produsul punctual să fie îndeplinit:

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

De asemenea, puteți limita mișcarea particulei la un anumit plan. Din nou, pozițiile particulelor care nu satisfac constrângerile date trebuie corectate. Acest lucru se face similar cu cazul unei lansete, deși formulele corespunzătoare vor fi puțin mai complicate.

| Modelare în foi de calcul

Lecțiile 17 - 18
Modelare în foi de calcul

Simularea mișcării corpului sub influența gravitației

Sunt bine cunoscute exemple de mișcare sub influența gravitației. Aceasta este căderea unui corp de la o anumită înălțime și mișcarea unui corp aruncat în sus cu o anumită viteză și mișcarea unui corp aruncat într-un unghi față de orizont. Dacă în astfel de probleme nu se ia în considerare forța de rezistență a aerului, atunci toate tipurile de mișcare enumerate sunt descrise prin formule binecunoscute. Dar problemele în care se ia în considerare rezistența aerului nu sunt mai puțin interesante.

PROBLEMA 3.24. Lovirea țintei

Etapa I. Formularea problemei

DESCRIEREA SARCINII

Băieții joacă badminton. O rafală de vânt a ridicat volanul și l-a dus la ramurile unui copac. Sarcina dificilă este să obțineți volanul. Problema poate fi rezolvată în mai multe moduri. Fiecare metodă are avantajele și dezavantajele sale.

Puteți, de exemplu, să vă cățărați într-un copac. Dar aceasta este o activitate foarte periculoasă: cu cât ramurile copacilor sunt mai înalte, cu atât sunt mai subțiri. Există o mare probabilitate de cădere. Puteți tăia un copac. Dar, se pare, nimeni nu a încercat încă acest mod de a rezolva problema. Dacă toată lumea ar fi ales această metodă de rezolvare a problemei, atunci nici măcar un copac nu ar fi rămas cu mult timp în urmă. Poți aștepta ca volanul să cadă singur, prins de următoarea rafală de vânt. Cel mai adesea încearcă să doboare volanul cu o piatră. Vom alege și noi acest model de comportament. Mai mult, cunoaștem legile mișcării corpului.

SCOPUL SIMULĂRII

Investigați mișcarea unui corp aruncat în unghi față de orizontală. Selectați valorile inițiale ale vitezei și unghiului de aruncare, astfel încât corpul aruncat să lovească ținta.

FORMALIZAREA PROBLEMEI

Notă. Pentru a seta precizia loviturii , trebuie să ții cont de dimensiunea corpului.

Precizia loviturii nu trebuie să depășească jumătate din cea mai mică dimensiune geometrică a corpului.

Deci, de exemplu, dacă ținta este un volan care măsoară aproximativ 7 cm în diametru, atunci = 3,5 cm.Dacă obiectivul este un coș de baschet cu diametrul de 40 cm, atunci = 20 cm.Dacă ținta este un balon de 5 m înălțime, atunci = 2,5 m.

Etapa II. Dezvoltarea modelului

MODEL INFORMATIV

Prezentăm caracteristicile obiectelor și procesul sub forma unui tabel.

Parametrii mișcării corpului sunt prezentați în Figura 3.4. Mișcarea unui corp aruncat în unghi față de orizontală este descrisă de formule


MODEL DE COMPUTER

Pentru modelare, vom alege un mediu de procesor de masă. În acest mediu, informațiile tabelare și modelele matematice sunt combinate într-un tabel care conține trei zone:

♦ date inițiale;
♦ calcule intermediare;
♦ rezultate.

1. Completați zona de date sursă conform eșantionului.

Coloane A, B, C, D, E, F completați de sus în jos cu formule similare.

2. Completați zona de calcule intermediare și rezultate.


PLAN EXPERIMENTAL

TESTARE

EXPERIMENTUL 1

Explorează mișcarea corpului.

EXPERIMENTUL 2

Investigați modificarea mișcării unui corp atunci când viteza inițială se modifică.

EXPERIMENTUL 3

Investigați schimbarea mișcării corpului atunci când se schimbă unghiul de aruncare.

EXPERIMENTUL 4

Schimbând viteza inițială și unghiul de aruncare, examinați natura mișcării corpului și poziția acestuia în raport cu ținta.

EXPERIMENTUL 5

Schimbând viteza și unghiul inițial inițial, selectați valorile astfel încât corpul aruncat să lovească ținta cu precizia specificată.

EFECTUAREA DE CERCETĂRI

TESTARE

1. Completați atâtea rânduri din tabelul de calcul câte coordonate la nu va deveni mai mic de zero.

2. Comparați rezultatele calculului testului cu rezultatele date în exemplul de calcul. Tabelul de mai jos prezintă mai multe rânduri cu rezultatele calculelor bazate pe datele inițiale date.

3. Folosind coloanele B și C, construiți o diagramă de mișcare. Un exemplu este prezentat în Figura 3.6. Pentru a construi o diagramă, luați atât de multe valori calculate, astfel încât curba să intersecteze axa orizontală X .

4. Cum se determină câte puncte de calcul trebuie luate pentru a construi o diagramă?

Concluzie. Pentru a construi o diagramă, trebuie să luați valori calculate ale căror coordonate y mai mare decât 0 și o valoare negativă.

EXPERIMENTUL 1. Studiul mișcării corpului

1. Folosind diagrama cazului de testare, descrieți cum se mișcă corpul.

2. Explicați cum să determinați punctul de cea mai mare înălțime a corpului din diagramă.

3. Explicați ce reprezintă pe diagramă intersecția curbei cu axa x orizontală. Cum se determină acest punct folosind tabelul de calcul?

4. Determinați din diagramă la ce distanță de punctul de aruncare va cădea corpul la pământ.

5. Determinați din tabelul de calcul:

Inaltime maxima de ridicare;
timpul de călătorie până la punctul cel mai înalt;
distanța de la punctul de aruncare până la punctul de impact pe sol;
timpul de mișcare înainte de cădere.

În zona liberă a foii de calcul, notați rezultatele studiului mișcării corpului conform modelului propus.

6. Introduceți o altă versiune a datelor inițiale, completați tabelul cu rezultatele experimentului pentru acestea.

EXPERIMENTUL 2. Dependența mișcării corpului de viteza inițială (unghiul de aruncare neschimbat)

1. Variând viteza inițială de la 5 la 20 m/s, observați cum se modifică înălțimea maximă de ridicare (coordonata y)

2. Observați cum se modifică intervalul de zbor (coordonata x) cu creşterea vitezei iniţiale.

3. Efectuați calcule pentru un anumit unghi și rezumați rezultatele cercetării într-un tabel (Tabelul 2), întocmit pe câmpul liber al foii de calcul.

4. Notați concluziile pe baza rezultatelor experimentului în tabel: cum se modifică altitudinea și intervalul de zbor atunci când se schimbă viteza inițială (cu un unghi de aruncare constant)?


EXPERIMENTUL 3. Dependența mișcării corpului de unghiul de aruncare (viteza inițială de mișcare este neschimbată)

1. Efectuați calcule folosind modelul, mărind unghiul de aruncare de la 5° la 85° și lăsând neschimbată viteza inițială (de exemplu, 15 m/s).

2. Observați modificarea înălțimii de ridicare (coordonata y) pe măsură ce unghiul de aruncare crește, viteza inițială rămâne neschimbată.

3. Observați modificarea intervalului de zbor (coordonata x) pe măsură ce unghiul de aruncare crește.

4. Tabelați rezultatele calculelor în câmpul liber al foii de calcul (Tabelul 3).

5. Notați concluziile pe baza rezultatelor experimentului în tabel: cum se modifică altitudinea și raza de acțiune a zborului când se modifică unghiul de aruncare (cu o viteză inițială constantă)?

EXPERIMENTUL 4. Studiul naturii mișcării corpului și al poziției acestuia în raport cu ținta

Figura 3.7 prezintă opțiuni pentru localizarea curbei de mișcare a corpului în raport cu ținta. Ele pot fi caracterizate astfel:

1. La mișcare, corpul nu atinge înălțimea la care se află ținta și cade la pământ fără să ajungă X ts .

2. La mișcare, corpul nu atinge înălțimea la care se află ținta, ci cade mai departe la pământ X c.

3. Corpul se ridică mai sus când se mișcă Y c, dar cade la pământ fără să ajungă X c.

4. Corpul se ridică mai sus când se mișcă Y cși cade mai departe la pământ X c.

În coloane D, E și F valorile sunt calculate S x , S y , S, care arată poziţia corpului în raport cu ţinta.

1. Cercetați ce înseamnă semnul S x și S yîn diferite momente în timp.

Concluzie.

2. Explorați cum se schimbă S când corpul se mișcă.

Concluzie. Distanța totală până la țintă scade mai întâi și apoi crește.

3. Selectați datele inițiale (viteza inițială și unghiul de aruncare), corespunzătoare opțiunilor de mișcare a corpului prezentate în Figura 3.7, în câmpul liber al foii de calcul (Tabelul 4).


EXPERIMENTUL 5. Selectarea valorilor inițiale pentru atingerea țintei

În primul rând, observăm că există un număr infinit de opțiuni pentru ca datele inițiale să atingă ținta. Sarcina noastră este să alegem o opțiune.

1. După coloană F determina cea mai mica valoare S. În acest moment corpul zboară cel mai aproape de țintă.

2. Trasează coloana G analiza loviturilor. Vom presupune că corpul a lovit ținta dacă distanța până la țintă devine mai mică decât precizia specificată (celula $D$10). Pentru a face acest lucru, în celulă G16 introduceți formula =DACA(F16<$D$10; «попал»; «мимо») .

3. Modificați datele de intrare pentru a obține cea mai bună aproximare a obiectivului.

4. Notați rezultatele cercetării pe câmpul liber al foii de calcul (Tabelul 5).

5. Selectați un alt set de date inițiale, în care corpul va lovi ținta „surplontă”, adică după ce depășește punctul cel mai înalt al ascensiunii.

6. Modificați coordonatele țintei și selectați valorile vitezei inițiale și ale unghiului de aruncare pentru noua poziție țintă.

Prezentați rezultatele și concluziile obținute în experimente sub forma unui raport într-un document text. În raportul dvs., furnizați răspunsuri la următoarele întrebări:

1. Cum se mișcă un corp aruncat în unghi față de orizontală?
2. Cum se determină cel mai înalt punct de ascensiune?
3. Cum se determină raza de zbor?
4. Cum se modifică înălțimea maximă de ridicare cu o creștere a vitezei inițiale și un unghi constant de aruncare?
5. Cum se modifică intervalul de zbor cu o creștere a vitezei inițiale și un unghi constant de aruncare?
6. Cum se modifică înălțimea maximă de ridicare odată cu creșterea unghiului de aruncare și viteza inițială constantă?
7. Cum se modifică intervalul de zbor odată cu creșterea unghiului de aruncare și viteza inițială constantă?
8. Cum putem calcula poziția corpului în raport cu ținta în fiecare moment de timp? Cum se poate determina acest lucru din tabelul de calcul?
9. Cum se modifică distanța de la corp la țintă în timpul mișcării și cum se poate determina aceasta folosind tabelul de calcul?

PROBLEMA 3.25*. Mișcarea parașutistului

*Provocare avansată

Etapa I. Formularea problemei

DESCRIEREA SARCINII

Când un parașutist cade la pământ, el experimentează forța gravitației și rezistența aerului. S-a stabilit experimental că forța de rezistență depinde de viteza de mișcare: cu cât viteza este mai mare, cu atât forța este mai mare. Când se deplasează în aer, această forță este proporțională cu pătratul vitezei cu un anumit coeficient de rezistență k, care depinde de designul parașutei și de greutatea persoanei R rezistenţă = kV 2 .Care ar trebui să fie valoarea acestui coeficient pentru ca parașutistul să aterizeze la sol cu ​​o viteză nu mai mult de 8 m/s care nu reprezintă un pericol pentru sănătate?

Determinați obiectivele modelării și formalizați problema.

Etapa II. Dezvoltarea modelului

MODEL INFORMATIV

Creați singur un model de informații.

MODEL MATEMATIC

Figura 3.8 prezintă forțele care acționează asupra parașutistului. Conform celei de-a doua legi a lui Newton, mișcarea sub influența forțelor poate fi scrisă ca egalitate. Proiectăm această egalitate pe axa de mișcare și înlocuim expresia forței de rezistență a aerului ma = mg - kV 2 .

Să obținem formula pentru calcularea accelerației

Vom calcula viteza și distanța pe care a zburat parașutistul la intervale regulate △t. Formula de calcul a momentelor în timp este: t i+1 + t i + △t. 

Unde V i- viteza la inceputul intervalului ( V o- viteza de pornire). Viteza la sfârșitul intervalului (și, în consecință, la începutul următorului) este calculată folosind formula pentru mișcarea uniform accelerată

Distanța pe care a zburat parașutistul este egală cu suma distanței parcurse până la începutul următoarei perioade de timp ( S i), și distanța parcursă în acest interval:


MODEL DE COMPUTER

Pentru modelare, vom alege un mediu de foi de calcul. În acest mediu, informațiile și modelele matematice sunt combinate într-un tabel care conține trei zone:

♦ date inițiale;
♦ calcule intermediare;
♦ rezultate.

1. Completați zona de date sursă.

2. Completați coloanele calculate A, B, C, D,în care se calculează parametrii de mișcare ai parașutistului:

Timp;
viteză;
distanţă;
accelerare.

3. Introduceți formule în celulele de calcul. Exemplu de completare a unui tabel de calcul:


Etapa III. Experiment pe calculator


PLAN EXPERIMENTAL

TESTARE

Efectuați un calcul de test al modelului computerizat folosind datele din tabel.

EXPERIMENTUL 1

Investigați mișcarea unui corp sub influența gravitației și a rezistenței aerului.

EXPERIMENTUL 2

Selectați valoarea coeficientului de rezistență k pentru aterizarea în siguranță a parașutistului.

EXPERIMENTUL 3

Investigați dependența vitezei și a accelerației de viteza inițială de mișcare.

EXPERIMENTUL 4

Investigați cum se modifică distanța de zbor până când viteza de cădere se stabilizează.

EFECTUAREA DE CERCETĂRI

TESTARE

1. Comparați rezultatele calculului testului cu rezultatele prezentate în exemplul de calcul. Exemplu de calcul de testare:

2. Construiți o diagramă a modificărilor vitezei, accelerației și distanței în funcție de timp.

EXPERIMENTUL 1. Studiul mișcării corpului ținând cont de rezistența aerului

1. Determinați din diagramă și tabel modul în care viteza parașutistului se modifică în timp. Câte secunde durează până se stabilizează rata de declin?

2. Determinați din diagramă și tabel cum se modifică accelerația parașutistului în timp.

3. Determinați din diagramă și tabel cât de departe va zbura parașutistul înainte ca viteza să se stabilească. Puneți rezultatele într-un spațiu liber din foaia de calcul.

4. Modificați pasul de timp (0,1 s) și determinați viteza de stabilizare a mișcării, distanța de zbor până la stabilizare. Rezultatele studiului sunt prezentate în tabel.

EXPERIMENTUL 2. Selectarea coeficientului de rezistență

Prin modificarea valorii coeficientului k (celula SZ), selectați o viteză de stabilizare a mișcării care este sigură pentru o persoană instruită să aterizeze (8 m/s).

EXPERIMENTUL 3. Studiul stabilizării vitezei și distanței în funcție de viteza inițială

Un parașutist, care a sărit dintr-un avion, zboară în cădere liberă de ceva timp, câștigă o viteză suficient de mare și abia apoi deschide parașuta.

1. Modificați valoarea inițială a vitezei (10 m/s).

2. Folosind tabelul de calcul, determinați cum se vor schimba următoarele:

Accelerația inițială;
viteza de stabilizare;
distanța de zbor până când viteza se stabilizează.

3. Notați rezultatele experimentului pe câmpul liber al foii de calcul. Trage o concluzie.

Rezultatele experimentului 3:

Notă. Observați cum se modifică accelerația inițială. Vă rugăm să rețineți că nu poate fi mare, deoarece accelerația este mai mare 3g (30 m/s2) provoacă supraîncărcări foarte mari.

Etapa IV. Analiza rezultatelor simulării

Pe baza rezultatelor experimentului pe calculator, răspundeți la următoarele întrebări:

1. Cum se schimbă viteza parașutistului în timp?
2. Cum se schimbă viteza parașutistului când se modifică coeficientul de rezistență?
3. Care ar trebui să fie coeficientul de rezistență pentru ca parașutistul să coboare la sol cu ​​o viteză de 8 m/s?
4. Cum se schimbă viteza de mișcare și cum depinde viteza de mișcare uniformă a unui parașutist de viteza inițială?
5. La câte secunde după începerea mișcării viteza parașutistului poate fi considerată constantă?
6. La ce înălțime de la sol ar trebui un parașutist să-și deschidă parașuta pentru a ateriza cu o viteză dată.

SARCINI PENTRU MUNCĂ INDEPENDENTĂ

3.26. Jucător de baschet.

Folosind modelul construit al mișcării unui corp aruncat în unghi, calculați cu ce viteză inițială și în ce unghi trebuie să aruncați o minge de baschet pentru a intra în cerc.

Când faceți calcule, luați în considerare următoarele condiții:

Viteza inițială a mingii atunci când este aruncată poate varia până la 15 m/s;
coordonatele inelului la = 3 m, X = 0,5 ÷ 7 m;
precizia lovirii este legată de diametrul inelului și este egală cu = 20 cm;
mingea trebuie să lovească „baldachinul” inelului, adică după ce a trecut de cel mai înalt punct al ridicării.

Modificați modelele matematice și informatice ale mișcării unui corp aruncat în unghi, astfel încât să poată fi utilizate pentru a calcula mișcarea unui corp aruncat de la o anumită înălțime inițială y 0

3.27. Salvarea unui bărbat care se îneacă.

Cu ce ​​viteză și în ce unghi trebuie aruncat un cerc de pe o navă de salvare către o persoană care se îneacă? Când faceți calcule, luați în considerare următoarele condiții:


distanța persoanei care se îneacă față de navă;
precizia loviturii este = 0,5 m;
unghiul de aruncare poate fi negativ;
înălțimea bordului navei deasupra nivelului mării.

3.28. Acrobații.

Mulți au văzut un astfel de act acrobatic la circ. Un acrobat stă pe tabla de sărituri pe o parte, al doilea sare pe celălalt capăt. Cu ce ​​viteză inițială și în ce unghi ar trebui să zboare primul acrobat pentru a ateriza exact pe umerii celui de-al treilea participant la act? Când faceți calcule, luați în considerare următoarele condiții:

Viteza inițială poate varia până la 10 m/s;
înălțimea și îndepărtarea celui de-al treilea acrobat;
precizia loviturii este = 0,1 m.

Continuăm seria articolelor despre automatizarea efectuării manevrelor acrobatice pe drone mici. Acest articol are, în primul rând, un scop educativ: aici vom arăta cum puteți crea un sistem de control automat simplu (ACS) folosind exemplul sarcinii de a efectua o manevră acrobatică „în baril” atunci când controlați o aeronavă numai cu eleronoane. Articolul este al doilea din seria de publicații „Aerobatic UAV”, care vorbește despre procesul de construire a componentelor hardware și software ale armelor autopropulsate într-o formă de antrenament.

Introducere

Deci, am decis să implementăm „butoiul” în modul automat. Evident, pentru a executa automat o figură, este necesar să se formuleze legea de control corespunzătoare. Procesul de inventare va fi mult nedureros și mai rapid dacă utilizați un model matematic al mișcării aeronavei. Testarea legii de control într-un experiment de zbor, deși posibilă, necesită mult mai mult timp și poate fi, de asemenea, mult mai costisitoare în cazul pierderii sau deteriorării dispozitivului.

Deoarece la unghiuri mici de atac și alunecare ale aeronavei, mișcarea sa de rulare nu are practic legătură cu mișcarea în celelalte două canale: cale și longitudinală - pentru a efectua un simplu „butoi” va fi suficient să construiți un model de mișcare numai în jurul valorii de o axă - axa OH asociat SC. Din același motiv, legea controlului eleronului nu se va schimba semnificativ atunci când vine vorba de crearea unui sistem de control complet.

Model de mișcare

Ecuația mișcării aeronavei în jurul axei longitudinale OH SC asociat este extrem de simplu:

Unde este momentul de inerție față de axă OH, iar momentul constă din mai multe componente, dintre care pentru o descriere realistă a mișcării aeronavei noastre este suficient să luăm în considerare doar două:

Unde este momentul cauzat de rotația aeronavei în jurul axei sale OH(momentul de amortizare), - momentul cauzat de deformarea eleronanelor (momentul de control). Ultima expresie este scrisă sub formă liniarizată: momentul de ruliu depinde liniar de viteza unghiulară și de unghiul de deviere al eleronului cu coeficienți de proporționalitate constanți și, respectiv.

După cum se știe (de exemplu, de la Wiki), ecuația diferențială liniară

Corespunde legăturii aperiodice de ordinul întâi

Unde este funcția de transfer, este operatorul de diferențiere, este constanta de timp și este câștigul.

Cum se trece de la o ecuație diferențială la o funcție de transfer?

În cazul nostru, putem trece de la parametrii ecuației la parametrii funcției de transfer după cum urmează (știind că derivata este negativă):




Pentru o legătură aperiodică, constanta de timp este egală cu timpul în care valoarea de ieșire, sub o singură acțiune în trepte a valorii de intrare, ia o valoare care diferă de valoarea în regim staționar cu ~5% și factorul de câștig este numeric egală cu valoarea de echilibru a valorii de ieșire într-o singură acțiune în trepte:


În modelul de mișcare construit există doi parametri necunoscuți: câștig și constantă de timp. Acești parametri sunt exprimați prin caracteristicile sistemului fizic: momentul de inerție, precum și derivatele momentului de ruliu și:

Astfel, dacă se cunoaște momentul de inerție, atunci, după determinarea parametrilor modelului, este posibilă restabilirea parametrilor sistemului din aceștia.

Parametrii modelului. Moment de inerție

Aeronava noastră este formată din următoarele părți: aripă, fuselaj cu coadă, motor, baterie (baterie) și avionică:

Avionica include: o placă de pilot automat, o placă de recepție SNS, o placă de modem radio, o placă de recepție de semnal de la echipamentul de control, două regulatoare de tensiune, un controler de turație a motorului și fire de conectare.

Datorită greutății reduse a avionicii, contribuția acesteia la momentul total de inerție poate fi neglijată.

Cum a fost evaluată mărimea momentului de inerție?

Momentul de inerție poate fi estimat după cum urmează. Să ne uităm la avionul de-a lungul axei sale OH:

Și apoi îl prezentăm sub forma următorului model simplificat:


Schema de calcul al momentului de inerție. Sus din stânga este bateria, jos din dreapta este motorul. Motorul și bateria sunt situate pe axa fuselajului

Se poate observa că pentru a crea modelul au fost aruncate următoarele: chila, coada orizontală, elicea și avionica. Totodată, au rămas următoarele: fuselaj, aripă, baterie, motor. Măsurând masele și dimensiunile caracteristice ale fiecărei piese, este posibil să se calculeze momentele de inerție ale fiecărei piese în raport cu axa longitudinală a fuselajului:


Valoarea totală a momentului de inerție al aeronavei față de axă OH obținem prin adunarea momentelor de inerție ale pieselor:

După evaluarea contribuției fiecărei părți a aeronavei la momentul total de inerție, s-au obținut următoarele:

  • aripă - 96,3%,
  • fuzelaj - 1,6%,
  • motor și baterie - 2%,
Se poate observa că principala contribuție la momentul total de inerție o are aripa. Acest lucru se datorează faptului că aripa are o dimensiune transversală destul de mare (anvergura aripii - 1 m):

Prin urmare, în ciuda greutății sale modeste (aproximativ 20% din masa totală la decolare a aeronavei), aripa are un moment semnificativ de inerție.

Parametrii modelului. Derivate ale momentului de rulare și

Calcularea derivatelor momentului de ruliu este o sarcină destul de dificilă asociată cu calcularea caracteristicilor aerodinamice ale unei aeronave folosind metode numerice sau folosind tehnici de inginerie. Utilizarea primului și celui de-al doilea necesită timp semnificativ, costuri intelectuale și de calcul, care sunt justificate atunci când se dezvoltă sisteme de control pentru aeronave mari, unde costul unei erori depășește totuși costul construirii unui model bun. Pentru sarcina de a controla un UAV a cărui masă nu depășește 2 kg, această abordare este greu justificată. O altă modalitate de a calcula aceste derivate este printr-un experiment de zbor. Având în vedere costul scăzut al aeronavei noastre, precum și proximitatea unui câmp potrivit pentru desfășurarea unui astfel de experiment, alegerea ne-a fost evidentă.

După ce am scris firmware pentru controlul manual și înregistrarea parametrilor în pilotul automat, am asamblat aeronava și am pregătit-o pentru testare:

În experimentul de zbor, a fost posibil să se obțină date despre unghiul de deviere al eleroanelor și viteza unghiulară de rotație a aeronavei. Pilotul a controlat manual aeronava, efectuând cercuri, viraje și rostogoliri, iar echipamentul de bord a înregistrat și trimis informațiile necesare la stația de la sol. Ca urmare, s-au obținut dependențele necesare: (deg/s) și (b/r). Valoarea reprezintă unghiul de deviere normalizat al eleronului: o valoare de 1 corespunde deformarii maxime, iar o valoare de -1 corespunde minimului:

Cum putem determina acum din datele obținute? Răspunsul este de a măsura parametrii procesului tranzitoriu folosind graficele și .

Cum au fost determinați coeficienții k și T?

Câștigul a fost determinat prin raportarea valorii vitezei unghiulare la starea staționară cu valoarea deflexiei eleronului:


Dependențe ale unghiului de deviere a eleronului și ale vitezei unghiulare de rulare în timp, obținute într-un experiment de zbor

În figura anterioară, secțiunile valorii în regim de echilibru a vitezei unghiulare corespund aproximativ, de exemplu, secțiunilor din apropierea timpilor 422, 425 și 438 s (marcate cu roșu închis în figură).
Constanta de timp a fost determinată din aceleași grafice. Pentru a face acest lucru, s-au găsit zone de modificări bruște ale unghiului de deviere a eleronului și apoi a fost măsurat timpul în care viteza unghiulară a luat o valoare care diferă de valoarea de echilibru cu 5%.


Rezultatul determinării valorilor constantei de timp și câștigului este următorul: , . Aceste valori ale coeficienților cu o valoare cunoscută a momentului de inerție corespund următoarelor valori ale derivatelor momentului de rulare:

Verificarea modelului

Deci, după ce am construit un model bazat pe legătura aperiodică

Se poate verifica prin aplicarea unui semnal obținut dintr-un experiment de zbor la intrare și comparând semnalul de ieșire al modelului cu valoarea obținută și în experiment.

Cum a fost efectuată simularea?

Am ales instrumentul pentru realizarea simulării, în primul rând, pe baza posibilității de repetare a rezultatelor de către o gamă largă de cititori: aceasta, în primul rând, înseamnă că programul ar trebui să fie în domeniul public. În principiu, problema modelării comportamentului unei legături aperiodice de ordinul întâi poate fi rezolvată prin crearea propriei instrumente de la zero. Dar, deoarece modelul va deveni mai complex în viitor, crearea propriei instrumente poate distrage atenția de la sarcina principală - crearea de sisteme de control autopropulsate pentru dronele acrobatice. Ținând cont de principiul deschiderii instrumentului, am ales JSBsim.

În secțiunea anterioară am obținut valorile coeficienților și . Le folosim pentru a simula mișcarea unei aeronave. Din articolul precedent ne amintim că configurația modelului de aeronavă în JSBsim este specificat folosind XML fişier. Să ne creăm propriul 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 viteze/p-aero-rad_sec -0.24 Roll_moment_due_to_aileron fcs/aileron-cmd-norm 2.4 Viteze/vc-kts Aero/alphadot-deg_sec Aero/betadot-deg_sec Fcs/throttle-cmd-norm OFF OFF OFF PE PE PE OFF OFF PE OFF OFF PE OFF
Deoarece construim un model al mișcării vehiculului doar în rulou, vom lăsa multe dintre secțiunile fișierului goale. Următoarele caracteristici sunt specificate secvenţial în fişierul model.

Dimensiuni geometrice aeronavele sunt specificate în secțiune metrici: zona aripii, anvergura, lungimea medie a coardei aerodinamice, zona cozii orizontale, brațul cozii orizontal, zona cozii verticale, brațul cozii verticale, poziția de focalizare aerodinamică.

Caracteristicile masei aeronavele sunt specificate în secțiune balanța_masă: tensorul de inerție al aeronavei, greutatea aeronavei goale, poziția centrului de masă.

Este de remarcat faptul că pozițiile absolute ale focalizării aerodinamice și ale centrului de masă al aeronavei nu sunt implicate în calcularea dinamicii vehiculului; locația lor relativă este importantă.
Acesta este urmat de secțiuni care descriu caracteristicile trenului de aterizare al aeronavei și ale centralei sale electrice.

În secțiunea următoare, responsabil pentru sistem de control, să umplem canalul responsabil pentru controlul rulării: indicați singura intrare fcs/aileron-cmd-norm, a cărui valoare va fi normalizată de la -1 la 1.

Caracteristici aerodinamice sunt specificate în secțiune aerodinamica: forțele sunt specificate în sistemul de coordonate ale vitezei, momentele - în cel aferent. Suntem interesați de momentul rulării. In sectiune numele axei="ROLL" sunt specificate funcții care determină momentul forțelor din diferite componente ale proiecției momentului forțelor aerodinamice pe axă BOU sistemul de coordonate asociat. În modelul nostru există două astfel de componente. Prima componentă este momentul de amortizare, care este egal cu produsul dintre viteza unghiulară și coeficientul determinat anterior. A doua componentă este momentul de la eleroni la o viteză fixă ​​de zbor: este egal cu produsul coeficientului determinat anterior cu valoarea deflexiei eleronului.

Este de remarcat faptul că la determinarea coeficientului a fost utilizată valoarea dimensională. În datele noastre de zbor, viteza unghiulară a fost măsurată în grade pe secundă, în timp ce în JSBSim se folosesc radiani pe secundă, deci coeficientul trebuie redus la dimensiunea de care avem nevoie, adică împărțit la 180 de grade și înmulțit cu radiani. Notăm aceste componente ale momentului forțelor aerodinamice în interiorul funcțiilor produsului produs. La modelare se însumează rezultatul îndeplinirii tuturor funcțiilor și se obține valoarea proiecției momentului aerodinamic pe axa corespunzătoare.

Modelul creat poate fi verificat folosind datele experimentale obținute în timpul testelor de zbor. Pentru a face acest lucru, creați un script cu următorul conținut:
sim-time-sec ge 0.0 Furnizați o intrare istorică pentru eleron sim-time-sec ge 0

sim-timp-sec 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

unde punctele indică datele lipsă. În fișierul script care ne este familiar din articolul anterior, a apărut un nou tip de eveniment ( „Notă de timp”), care vă permite să specificați o modificare continuă a parametrului în timp. Dependența parametrului de timp este specificată de o funcție de tabel. JSBSim Interpolează liniar valoarea unei funcții între datele tabelare. Procedura de verificare a unui model de mișcare de rulare constă în executarea acestui script pe modelul creat și compararea rezultatelor cu cele experimentale.


Rezultatul verificării este prezentat în figură:


După cum se poate observa din figură, acordul dintre model și realitate este puțin mai puțin decât complet.

Sinteza de control pentru efectuarea unui „baril”

După ce a primit modelul, este ușor să determinați în ce cantitate și pentru cât timp este necesar să deviați eleronoanele pentru a efectua o rulare. O opțiune este următorul algoritm de respingere:



Prezența segmentelor care durează 0,1 s la începutul și la sfârșitul algoritmului de deviere a eleronului simulează inerția servomotor, care nu poate devia suprafețele instantaneu. Modelul arată că, cu o astfel de lege de deviere a eleronului, aeronava trebuie să efectueze o revoluție completă în jurul axei sale. OH, verificăm?

Experiment de zbor

Legea de control a eleronului rezultată a fost programată în pilotul automat instalat pe aeronavă. Ideea experimentului este simplă: luați avionul în zbor orizontal și apoi utilizați legea de control rezultată. Dacă mișcarea reală de rulare a aeronavei corespunde modelului creat, atunci aeronava trebuie să efectueze o „rulare a cilindrului” - o rotație completă de 360 ​​de grade.

Ne exprimăm în mod deosebit recunoștința față de pilotul nostru fidel pentru munca, profesionalismul și portbagajul convenabil pe break-ul său Priore!

În timpul experimentului, a devenit clar că modelul de mișcare de rostogolire a fost construit cu succes - avionul a executat un „butoaie” după altul, de îndată ce pilotul a activat legea de control programată. Următoarea figură arată viteza unghiulară înregistrată în timpul experimentului și obținută din rezultatele simulării, precum și unghiul de rulare și înclinare din experimentul de zbor:


Și următoarea figură arată semnalele înregistrate în experimentul de zbor pentru eleroni, elevator (ER) și cârmă (RU):


Liniile verticale indică momentele începutului și sfârșitului execuției „butoiului”. Din cifre reiese clar că în timpul „ruliului de țeavă” pilotul nu interferează cu controlul elevatorului și al cârmei; este, de asemenea, clar că unghiul de înclinare tinde invariabil să scadă în timpul „ruliui de butoi” - avionul este tras. într-o scufundare, așa cum a fost prezis din rezultatele simulării într-un simulator de zbor (a se vedea articolul „Acrobatic UAV. Cum să faci o rulare corectă a butoiului”). Dacă examinați cu atenție graficele anterioare, veți vedea că cel de-al treilea „butoi” nici măcar nu a fost finalizat, deoarece pilotul a intervenit în comenzi pentru a scoate avionul dintr-o scufundare: unghiul de înclinare se schimbă atât de mult la efectuarea unui „toc”. doar cu elerone.

Note

concluzii

Ca rezultat al muncii efectuate, am arătat una dintre modalitățile de a crea un model de mișcare a UAV bazat pe viteza unghiulară. În experimentul de zbor, s-a dovedit că modelul de mișcare creat corespunde pe deplin obiectului simulat. Pe baza modelului dezvoltat s-a obținut o lege de control al programului care permite efectuarea „butoiului” în mod automat. De asemenea, ne-am asigurat că nu va fi posibilă efectuarea unei „rulări” corecte doar folosind eleronoanele și am demonstrat clar acest lucru.

Următoarea etapă va fi rafinarea legii de control prin adăugarea de feedback, precum și includerea liftului în control. Acesta din urmă va necesita crearea unui model al mișcării longitudinale a aeronavei noastre. Pe baza rezultatelor lucrării, va fi publicată următoarea publicație.

Să presupunem că mergi pe bicicletă și dintr-o dată cineva te împinge din lateral. Pentru a-ți recăpăta rapid echilibrul și a evita căderea, rotiți ghidonul bicicletei în direcția împingerii. Bicicliștii fac acest lucru în mod reflex, dar este uimitor că o bicicletă poate efectua această acțiune singură. Bicicletele moderne pot menține echilibrul în mod independent chiar și atunci când se deplasează fără control. Să vedem cum acest efect poate fi modelat în COMSOL Multiphysics.

Ce știm despre bicicletele cu auto-echilibrare?

O bicicletă modernă nu este foarte diferită de bicicleta sigura- unul dintre primele modele apărute în anii 80 ai secolului al XIX-lea. Peste o sută de ani mai târziu, oamenii de știință încă încearcă să-și dea seama ce efecte fac o bicicletă să se auto-echilibraze. Cu alte cuvinte, cum se menține echilibrată o bicicletă scăpată de sub control atunci când este în poziție verticală? Multe lucrări publicate au fost dedicate descrierii mișcării unei biciclete folosind ecuații analitice. Una dintre primele publicații importante pe această temă a fost o lucrare a lui Francis Whipple, în care a derivat ecuații generale neliniare pentru dinamica unei biciclete controlate de un biciclist fără a-și folosi mâinile.

În general, este acceptat că stabilitatea unei biciclete este asigurată de doi factori - precesia giroscopică a roții din față și efectul de stabilizare. înclinarea longitudinală a axei de rotație rotile. Mai recent, o echipă de cercetători de la Delft și Cornell (vezi) a publicat o revizuire cuprinzătoare a ecuațiilor liniarizate ale mișcării pentru modelul bicicletei Whipple. Ei și-au folosit rezultatele pentru a demonstra o bicicletă care se echilibrează singur. Cercetările lor arată că nu există o explicație simplă pentru acest fenomen. O combinație de factori, inclusiv efectele giroscopice și de stabilizare, geometria bicicletei, viteza și distribuția masei, permit unei biciclete fără direcție să rămână în poziție verticală.

Inspirați de această muncă, am construit un model dinamic al unui sistem multicorp pentru a demonstra mișcarea de auto-echilibrare a unei biciclete controlate de un biciclist fără mâini.

Poziția bicicletei la momente diferite.

Model de bicicleta multicorp

Pentru a asigura rularea curată a roții și pentru a limita alunecarea roții în trei direcții, avem nevoie de trei condiții limită.


Modelul unei roți care arată direcțiile în care mișcarea este limitată.

Se aplică următoarele restricții: Fără alunecare înainte:

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

Fără alunecare laterală:

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

Fără alunecare perpendiculară pe suprafața de contact cu solul:

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

unde \bold(e)_(2) , \bold(e)_(3) și \bold(e)_(4) sunt direcția instantanee (axa înclinată), direcția transversală (axa de rotație) și normala față de suprafata de contact (\bold(e)_(4)=\bold(e)_(2) \times\bold(e)_(3)), respectiv;

\frac(d\bold(u))(dt) — viteza de translație; r este raza roții; \frac(d\bold(\theta)_(s))(dt) — viteza unghiulară de rotație; \frac(d\bold(\theta)_(l))(dt) este viteza unghiulară de înclinare.

Deoarece nu este posibil să se aplice aceste condiții la limită vitezei, ele sunt discretizate în timp și impuse după cum urmează:

(\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

unde \bold(u)_(p) , \bold(\theta)_(sp) și \bold(\theta)_(lp) sunt vectorul deplasării, respectiv unghiul de rotație și de înclinare la momentul anterior.

În condiții la limită discrete care asigură absența alunecării, se utilizează rezultatul calculării poziției roții la pasul de timp anterior. Poziția corpului rigid, rotația și pozițiile instantanee ale axei la pasul de timp anterior sunt stocate folosind ecuații globale și un nod Soluția anterioarăîntr-un rezolvator nestaționar.

Simularea mișcării unei biciclete cu auto-echilibrare

Pentru analiză am ales o bicicletă cu unghi de virare de 18°. Viteza inițială a bicicletei este de 4,6 m/s. La 1 secundă după începerea mișcării, o forță de 500 N este aplicată bicicletei pentru o perioadă foarte scurtă de timp.Sub influența forței, bicicleta se abate de la o traiectorie dreaptă într-o direcție dată.

În timpul primei secunde, bicicleta se deplasează înainte de-a lungul direcției specificate inițial cu o viteză constantă. Forța laterală determină apoi deviație. Rețineți că biciclistul nu își ține mâinile pe ghidon și nu poate controla echilibrul bicicletei. Ce se întâmplă în continuare? Putem observa că de îndată ce bicicleta începe să se încline, ghidonul se întoarce în direcția căderii. Corectarea poziției ghidonului în caz de cădere restabilește echilibrul bicicletei.

Bicicleta continuă să se miște înainte și, pe măsură ce se mișcă, începe să se încline în direcția opusă. Această înclinare este mai mică ca mărime, iar mișcarea direcției urmează îndeaproape înclinarea cu o ușoară întârziere. Această oscilație stânga-dreapta continuă și în cele din urmă dispare. Bicicleta se deplasează înainte într-o poziție strict verticală și crește ușor viteza. Vibrațiile volanului, unghiurile de rotire și viteza unghiulară scad și se estompează treptat.

Mișcarea unei biciclete pe o suprafață plană atunci când devii de la o linie dreaptă. Săgeata arată înclinarea bicicletei.

Rezultatele calculării unghiurilor de înclinare și rotație ale volanului (stânga) și a vitezei unghiulare relativă (dreapta) a bicicletei.

Efectuarea unei analize de stabilitate

Astfel, am învățat că o bicicletă se poate autoechilibra. Studiul a arătat că este imposibil să se evidențieze un parametru care determină stabilitatea unei biciclete. Designul bicicletei, distribuția greutății și viteza de deplasare sunt toți factori care afectează stabilitatea. Pentru a înțelege mai bine acest fenomen, am efectuat analize suplimentare pentru a examina influența a doi parametri - viteza inițială și înclinarea axei de direcție. Am folosit modelul de bicicletă descris mai sus cu un unghi al ghidonului de 18° și o viteză inițială de 4,6 m/s ca configurație inițială și am efectuat o analiză parametrică a influenței acestor doi factori.

Diverse viteze inițiale

Bicicleta nu poate rămâne într-o poziție strict verticală când sta pe loc. Am variat viteza de mișcare de la 2,6 m/s la 6,6 m/s în pași de 1 m/s pentru a evalua efectul acestui parametru. În intervalul de 2,6–3,6 m/s, bicicleta se înclină prea mult și este instabilă. La o viteză de 5,6 m/s, viteza de înclinare tinde spre zero, dar unghiul de înclinare însuși capătă o valoare diferită de zero. Deși această configurație este stabilă, bicicleta se va mișca în cerc cu o ușoară înclinare. La 6,6 m/s, înclinarea și unghiul de virare cresc în timp, făcând mișcarea instabilă.

Instabil Durabil Instabil
2,6 m/s 3,6 m/s 4,6 m/s 5,6 m/s 6,6 m/s

Cazul stabil corespunde unei viteze de 5,6 m/s (stânga), iar cazul instabil corespunde unei viteze de 6,6 m/s (dreapta).

Unghiul de direcție

Ansamblul de direcție este foarte important pentru autoechilibrarea bicicletei. Dacă bicicleta nu poate fi controlată (de exemplu, dacă ghidonul este blocat), atunci bicicleta nu va putea compensa înclinarea, așa că în cele din urmă va cădea. În acest sens, rotirea axei de direcție, care controlează cursa furcii, afectează și autoechilibrarea bicicletei.

Pentru a analiza efectul rotației axei de direcție asupra stabilității bicicletei, am variat unghiurile de direcție de la 15° la 21° în trepte de 1°. La un unghi de 15°, unghiul de brazare și de virare cresc în timp, făcând această configurație instabilă. Bicicleta este stabilă de la 16° la 19° și instabilă la unghiuri mai mari. La valori de rotație mai mari de 19°, pasul și unghiul de rotație fluctuează, iar aceste oscilații cresc în timp, ducând la pierderea stabilității.

În această postare, am arătat cum să simulăm mișcarea unei biciclete neorientabile, cu autoechilibrare, folosind modulul Multibody Dynamics din COMSOL Multiphysics. Am demonstrat cum să implementăm constrângerile de alunecare pe o roată rigidă prin ecuații și apoi am combinat aceste constrângeri cu un model de bicicletă multicorp. Am analizat apoi efectele vitezei inițiale și ale rotației osiilor asupra stabilității bicicletei. După evaluarea acestor parametri, am văzut că o bicicletă poate rămâne stabilă într-o configurație și o poate pierde în alta.

Autoechilibrarea unei biciclete este o consecință a mai multor factori. Prin analiza noastră și în conformitate cu cercetările anterioare, am demonstrat că stabilitatea bicicletei este legată de capacitatea sa de a „vira” în direcția înclinării.