Preskoči na sadržaj
FORTRONIQ
IzbornikDigitalni sadržajiVirtualna stvarnost3. Razvoj okruženja virtualne stvarnosti3.6 Integracija modela, logike i uređaja u funkcionalno okruženje

MODUL 3 · RAZVOJ OKRUŽENJA VIRTUALNE STVARNOSTI

Nastavna jedinica 3.6

Integracija modela, logike i uređaja u funkcionalno okruženje

Kako se pripremljeni modeli, programska logika i uređaji spajaju u jednu aplikaciju koja radi: uvoz i sklapanje mobilnog robota MR-1, kolizije i fizika, veza sa simulatorom robota koji vraća kutove zglobova te izgradnja istog projekta za računalo s mišem, PC-VR i samostalne naočale.

Moći ću:
  • uvesti model robota u scenu i provjeriti mjerilo, osi, ishodišta i nazive dijelova
  • izraditi sklapanje rukama s utorima za priklapanje i stanjem sklopa
  • dodijeliti kolizijske oblike i slojeve kolizija dijelovima i ruci
  • povezati točke interesa sa simulatorom robota porukama u oba smjera
  • izgraditi isti projekt za računalo s mišem, PC-VR i samostalne naočale
  • prilagoditi scenu ograničenjima ciljne platforme
  • izračunati brzinu robota, zakret kotača po poruci i najveću starost podatka iz simulatora

Tri sloja koja treba spojiti

Do ove jedinice nastali su odvojeni dijelovi: modeli iz prvog modula, rig s kamerom, kontrolerima i rukama, hvatanje i točke interesa te kretanje. Integracija je trenutak u kojem oni postaju jedna aplikacija. Korisno je razlikovati tri sloja:

  • Modeli — geometrija, materijali, razine detalja, kolizijski oblici i ishodišta. Dolaze iz lanca CAD sustav → program za obradu mreže (npr. Blender) → razvojno okruženje.
  • Logika — nacrti ili skripte: hvatanje, priklapanje, točke interesa, kretanje, izbornik i veza prema vanjskim programima.
  • Uređaji — pokretač OpenXR, rig za ciljnu opremu, ulazne akcije i postavke izgradnje za ciljnu platformu.

Pravilo koje štedi najviše vremena: slojevi se spajaju tako da se svaki može zamijeniti bez diranja drugih. Točka interesa ne zna koji ju je ulaz odabrao (miš, pogled, kontroler ili gesta), dio robota ne zna na kojim naočalama se prikazuje, a simulator ne zna da ga netko gleda kroz naočale. Tako se isti projekt gradi za tri platforme i povezuje sa simulatorom bez prepravljanja.

CAD sustav STEP 38 MB Mreža i LOD glTF 3,2 MB Razvojno okruženje OpenXR PC s mišem PC-VR (A) naočale (B) Most ZMQ, ROS 2, Python Simulator robota poiId, naredba kutovi zglobova glava i ruke: lokalno, 90 Hz robot: prema porukama simulatora prikaz nikad ne čeka simulator
Slika 3.6.1 — Isti projekt nastaje iz jednog lanca modela i gradi se za tri platforme. Veza sa simulatorom robota ide preko mosta: aplikacija šalje naredbu, simulator vraća kutove zglobova.

Uvoz modela robota i provjera nakon uvoza

Model robota MR-1 stiže kao datoteka glTF od 3,2 MB s 12 dijelova i tri razine detalja (LOD0 28 000, LOD1 9 000 i LOD2 2 500 trokuta). Prva radnja nakon uvoza nije sklapanje, nego provjera, jer se pogreška iz ove faze kasnije pojavljuje u svakom sljedećem koraku:

ProvjeraOčekivano za MR-1Česti uzrok pogreške
Mjerilovanjske mjere 220 × 180 × 110 mm; kotač Ø65 mmizvoz u milimetrima, uvoz kao metri (robot 1000 puta veći)
Osirobot stoji na kotačima, prednja strana prema +X ili prema dogovoru projektarazličit dogovor o osi „gore" (Y ili Z) između programa
Ishodištasvaki dio ima ishodište na mjestu priklapanja; kotač u osi vrtnjeishodište ostalo u ishodištu CAD sklopa
Nazivijednoznačni, bez razmaka: Sasija, Motor_L, Kotac_L…automatski nazivi tipa „Part1.003"
Točke interesa6 praznih objekata POI_motor, POI_kotac, POI_baterija, POI_plocica, POI_senzor, POI_prekidacprazni objekti izgubljeni pri izvozu
Razine detaljaprijelaz na LOD1 od 1,5 m, na LOD2 od 4 msve razine učitane kao zasebni vidljivi objekti

Mjerilo se najbrže provjerava tako da se u scenu stavi kocka brida 1 m i pogleda uz robot, a zatim i u naočalama: robot od 22 cm na stolu visine 750 mm odmah otkriva pogrešku mjerila koja se na zaslonu računala lako previdi. Točke interesa postavljene u programu za obradu mreže kao prazni objekti s jasnim imenima dolaze u razvojno okruženje kao prazni objekti na točnim položajima. Na njih se zatim dodaje komponenta točke interesa i kolizijski oblik iz jedinice 3.4.

Sklapanje rukama: utori i priklapanje

Korisnik u VR-1 uzima dijelove sa stola i slaže ih na šasiju. Aplikacija ne može očekivati da će dio biti postavljen točno na milimetar, pa se sklapanje izvodi priklapanjem (engl. snapping). Na šasiji je za svaki dio jedan utor (engl. socket, attach point): prazni objekt čije se ishodište i orijentacija poklapaju s ishodištem dijela u sklopljenom stanju.

  1. Dok korisnik drži dio, aplikacija računa udaljenost ishodišta dijela od pripadnog utora i razliku zakreta.
  2. Kada su obje unutar tolerancije, prikazuje se prozirni „duh" dijela na konačnom mjestu i utor se ističe.
  3. Kad korisnik pusti dio, on se glatko, u desetinki-dvije, premjesti na utor, postaje dijete šasije u hijerarhiji i prestaje biti fizički slobodan.
  4. Stanje sklopa (koji su utori popunjeni) sprema se u varijablu. Utora je 11: dvanaesti dio je sama šasija, koja nosi utore i od početka se računa kao postavljena, a kotači sjedaju na utore motora. Kad je svih 11 dijelova na svojim utorima, brojač pokazuje 12 / 12 i aplikacija omogućuje vožnju.

Tolerancije su projektna odluka koja se potvrđuje ispitivanjem; u VR-1 iznose 15 mm i 10° za sve dijelove. Za dijelove koji stoje blizu jedan drugome (pločica, senzori) treba provjeriti da se područja tolerancije susjednih utora ne preklapaju. Ako je tolerancija prevelika, dio „skoči" na krivo mjesto; ako je premala, korisnik se muči namještanjem. Redoslijed se može zadati (motor prije kotača, jer kotač sjeda na vratilo) ili ostaviti slobodnim tamo gdje ne smeta. Zadani redoslijed ujedno je i sadržaj učenja: korisnik doznaje zašto se nešto sklapa prije nečeg drugog.

Objekt u hijerarhiji Kolizijski oblik MR1_sklop — (ishodište na podu) Sasija kutija utor_motor_L (prazni) Motor_L valjak Kotac_L valjak Ø65 mm utor_motor_D → Motor_D → Kotac_D kao lijeva strana još 7 utora: baterija, pločica, senzori… kutije POI_motor … POI_prekidac (6) kugle, samo za zraku utor = prazni objekt s ishodištem i zakretom dijela u sklopljenom stanju
Slika 3.6.2 — Hijerarhija sklopa MR-1: dijelovi se priklapaju na utore šasije i postaju njezina djeca. Kotač je dijete motora, pa se vrti oko osi vratila. Točke interesa imaju vlastite kolizijske kugle koje služe samo zraci.

Kolizije i fizika u sklopu

Za prikaz se koristi mreža od 28 000 trokuta, ali za sudare nikad. Kolizijski oblik (engl. collision shape) dijela je jednostavno tijelo: kutija za šasiju, bateriju i pločicu, valjak za motor i kotač, kugla za kuglični oslonac. Provjera sudara između nekoliko kutija i valjaka zanemarivo je jeftina, a provjera između dviju mreža od više tisuća trokuta može pojesti velik dio vremena okvira.

Važno je i tko se s kim sudara. Razvojna okruženja to rješavaju slojevima ili kanalima kolizija (naziv ovisi o alatu):

  • ruka i dio: da, radi hvatanja;
  • dio i stol: da, da dio ne propadne kroz stol kad se ispusti;
  • dijelovi unutar sklopa međusobno: ne, jer bi se stalno odgurivali;
  • zraka za točke interesa: samo kugle točaka interesa, da zraka ne zapinje za poklopac;
  • luk teleporta: samo pod i stol, ne dijelovi robota.

Dio koji se drži u ruci obično je kinematički: prati ruku, a gravitacija na njega ne djeluje. Kad se pusti izvan utora, postaje fizički slobodan i pada na stol. Masa sklopa od 1,2 kg u sceni služi samo simulaciji padanja i vožnje, a ne osjećaju težine, jer kontroler ne može prenijeti težinu u ruku.

Pažnja

Najčešća pogreška pri integraciji je dio čiji je kolizijski oblik nespretno smješten. U ispitivanju VR-1 upravo zato nije prošao slučaj hvatanja prekidača: prekidač je bio ispod ruba stola, a kolizijski oblik stola zaklanjao ga je ruci. Nakon uvoza svakog dijela uključite prikaz kolizijskih oblika i pogledajte ih iz položaja korisnika.

Veza sa simulacijom robota

Kada je robot sklopljen, korisnik ga pušta da vozi. Vožnju može izvoditi i sama fizika razvojnog okruženja, ali vjernije je prepustiti je simulatoru robota (npr. CoppeliaSim) koji radi na istom računalu i računa kinematiku, pogone i senzore. Razvojno okruženje tada je prikaz i sučelje, a simulator je model ponašanja.

Tok je dvosmjeran. Klik na točku interesa ili gumb šalje simulatoru poruku (npr. identifikator točke interesa i naredbu „kreni" ili „vozi po liniji"). Simulator izvodi naredbu i vraća kutove zglobova, za MR-1 kutove dvaju kotača i položaj šasije, po kojima aplikacija pomiče model. Veza se ostvaruje npr. knjižnicom za razmjenu poruka ZMQ, programskim okvirom ROS 2 ili, za početak najjednostavnije, malim mostom u Pythonu koji s jedne strane prima poruke aplikacije, a s druge poziva sučelje simulatora.

Primjer kostura mosta (načelo i primjer za provjeru u vlastitoj inačici; koje klijente i pozive nudi vaš simulator, provjerite u njegovoj dokumentaciji):

# most: prima naredbu iz VR aplikacije, vraća kutove kotača i položaj šasije
import zmq

def simulator_korak(poruka):
    # ovdje se poziva sučelje simulatora; zamjenska vrijednost za probu
    return 0.0, 0.0, [0.0, 0.0, 0.0]      # kut L, kut D [°], šasija [x, y, kut]

ctx = zmq.Context()
s = ctx.socket(zmq.REP)                   # zahtjev-odgovor: jedan odgovor na svaki zahtjev
s.bind("tcp://*:5555")
while True:
    poruka = s.recv_json()                # npr. {"poi": "POI_motor", "naredba": "kreni"}
    kut_l, kut_d, sasija = simulator_korak(poruka)
    s.send_json({"kotac_L": kut_l, "kotac_D": kut_d, "sasija": sasija})

Obrazac zahtjev-odgovor prikladan je za pojedinačne naredbe. Za stalni tok kutova tijekom vožnje bolji je obrazac objavi-pretplati, u kojem simulator šalje stanje stalnom frekvencijom, na primjer 50 puta u sekundi, a aplikacija uvijek uzima najnovije. Budući da aplikacija iscrtava 90 okvira u sekundi, između dviju poruka prođu prosječno 1,8 okvira; položaj se zato interpolira između zadnje dvije primljene vrijednosti, inače robot vozi u trzajima.

Zapamtite

Praćenje glave i ruku nikad ne čeka simulator. Ako poruka kasni ili izostane, robot na stolu stane ili nastavi po zadnjem poznatom stanju, ali slika koju korisnik vidi i dalje se osvježava 90 puta u sekundi uz kašnjenje od pokreta do fotona do 20 ms.

Izgradnja za računalo, PC-VR i samostalne naočale

Isti projekt gradi se za tri cilja. Mijenjaju se samo XR oprema u sceni (rig i ulazi) i ciljna platforma u postavkama izgradnje, a scena, modeli i logika točaka interesa ostaju isti. Preporučeni redoslijed rada: najprije inačica za računalo s mišem, dok logika točaka interesa i sklapanja ne radi, pa tek onda XR oprema. Tako polaznici mogu raditi i bez naočala, a pogreške u logici ne miješaju se s pogreškama u postavkama uređaja.

CiljUlaziOgraničenja scenePaket
PC s mišemzraka iz kamere kroz položaj miša, tipkovnicakao za A—
Uređaj A (PC-VR)kontroleri, vanjsko praćenje, 90 Hz≤ 750 000 trokuta, ≤ 1000 poziva za crtanje≤ 1,5 GB
Uređaj B (samostalne)kontroleri, ruke, unutarnje praćenje, 90 Hz≤ 300 000 trokuta, ≤ 150 poziva za crtanje≤ 500 MB

Uređaj B računa sliku na vlastitom mobilnom procesoru, pa su njegova ograničenja znatno stroža. Za njega se u postavkama izgradnje obično odabire drugačija kompresija tekstura, niža kvaliteta sjena i jednostavniji materijali, a naknadna obrada slike se isključuje. Neka razvojna okruženja to rješavaju profilima kvalitete po platformi, što je bolje od održavanja dviju scena. Izgradnja za B zahtijeva i alate za ciljni mobilni operacijski sustav te uključen razvojni način rada na naočalama; točni koraci ovise o proizvođaču i inačici.

Vožnja robota i starost podataka iz simulatora

Brzina robota slijedi iz okretaja i promjera kotača, v = π · D · n / 60. Kutni pomak kotača po poruci je 360° · n / (60 · fs). Najveća starost podatka koji korisnik vidi zbroj je kašnjenja mosta, razmaka između dviju poruka simulatora i jednog okvira prikaza:

tst = L + 1000 / fs + 1000 / fp   [ms]

Vožnja robota MR-1 i veza sa simulatoromRačunski prikaz

Računa brzinu robota i vrijeme prelaska stola, zakret kotača između dviju poruka simulatora i najveću starost podatka koji korisnik vidi.

Brzina robota—
Prelazak stola 1600 mm—
Zakret kotača po poruci—
Najveća starost podatka—

Uz primjer od 100 o/min i kotač Ø65 mm robot vozi 0,34 m/s i prijeđe radni stol duljine 1600 mm za 4,7 s. Pri 50 poruka u sekundi kotač se između dviju poruka zakrene za 12°, a pri 90 Hz prikaza između dva okvira za 6,7°; zato se kut interpolira. Najveća starost podatka iznosi 10 + 20 + 11,1 = 41,1 ms. To je prihvatljivo za robota koji vozi po stolu, jer ga korisnik samo promatra, ali bilo bi neprihvatljivo za glavu ili ruke; zato praćenje ostaje lokalno i ne ide kroz most. Ako se simulator uspori na 20 poruka u sekundi, starost naraste na 71,1 ms, a zakret po poruci na 30°, što se bez interpolacije jasno vidi kao trzanje.

Ključni pojmovi

PojamZnačenje
Utor za priklapanje (engl. socket, attach point)prazni objekt s ishodištem i zakretom dijela u sklopljenom stanju
Most prema simulatoru (engl. bridge)mali program koji prenosi poruke između VR aplikacije i simulatora robota
Priklapanje (engl. snapping)automatsko postavljanje dijela na utor kad je unutar tolerancije
Kolizijski oblik (engl. collision shape)jednostavno tijelo koje zamjenjuje mrežu pri provjeri sudara
Sloj kolizija (engl. collision layer / channel)skupina objekata za koju se zadaje s kojim se skupinama sudara
Kinematičko tijelo (engl. kinematic body)tijelo koje pomiče program, a ne fizika; tako se ponaša dio u ruci
Kutovi zglobova (engl. joint angles)stanje robota koje simulator vraća aplikaciji
Interpolacija (engl. interpolation)računanje međuvrijednosti između dviju primljenih poruka za glatko gibanje
Ciljna platforma (engl. target platform)operacijski sustav i uređaj za koji se izgrađuje paket aplikacije

Provjeri se

Kratka provjera prije prelaska na sljedeću jedinicu. Odgovor se potvrđuje klikom, a obrazloženje se prikazuje odmah.

Pitanje 1 od 4

Što se pri izgradnji istog projekta za PC-VR i samostalne naočale mijenja?

Scena, modeli i logika ostaju isti. Mijenja se rig s ulazima i ciljna platforma, a za samostalne naočale i postavke kvalitete zbog strožih ograničenja.

Pitanje 2 od 4

Zašto se za provjeru sudara dijela robota ne koristi njegova mreža od 28 000 trokuta?

Kutije, valjci i kugle provjeravaju se gotovo bez troška, a provjera između dviju gustih mreža može pojesti velik dio vremena okvira.

Pitanje 3 od 4

Simulator šalje kutove kotača 50 puta u sekundi, a prikaz radi na 90 Hz. Što treba učiniti da vožnja bude glatka?

Između dviju poruka prođe prosječno 1,8 okvira. Interpolacija daje međuvrijednosti; prikaz nikad ne smije čekati simulator.

Pitanje 4 od 4

Pri kojem je stanju dio koji korisnik drži u ruci?

Dio u ruci prati ruku i na njega ne djeluje gravitacija. Tek kad se pusti izvan utora postaje fizički slobodan, a na utoru postaje dijete šasije.

Odgovoreno 0 od 4.

Vježbe uz jedinicu

Gradivo ove jedinice priprema za sljedeće vježbe: