Omnivision

Allikas: Digilabor

Sisukord

Projektist

Antud projekt sai valitud 2014. aasta Robotexiks valmistudes, kui kogu Tiina meeskonnale hakkas üha enam ja enam meeldima idee paraboolpeegliga robotist. Meeskonna kapten ja peaprogrammeeria Andres väitis, et paraboolpeegliga roboti programmeerimine pole eriline kunst.

Väideti, et Tartu Ülikoolil pole lähiajal mitte ühtegi peegliga robotit olnud, sest selle tootmine ning hooldamine pidi olema omaette protsess ning kõvasti raha nõudma. Kuna Joonasel olid tutvused kiletehnoloogia laboris hakkas ta Ragnariga koos juba Robotexi ajal mõtteid hauduma, kuidas nad suudaksid toota hästi odava peegli.

Kuna projektide jaotamisel taheti nende käes veel mingisugust programmi ning kogenumad väitsid, et peegli kuju arvutamine on tükk tööd, kaasasid nad projekti ka MituPeade kapteni ning programmeria Lauri.

Meeskond

kontakt


Nõuded

  • Peegel peab tagama nähtavusulatuse, mis on piisav Robotexi jalgpalliväljakul pallide nägemiseks.
  • Peegel peab olema kaistud mehaaniliste vigastuste eest.
  • Peegel peab olema kinnitatud kaitse toru külge nii, et peegel omaks fikseeritud horisontaalset ja vertikaalset asendit.
  • Peegli kinnitus ei tohi lasta valgust läbi viisil, et see valgustaks peegli pinda tagant poolt.
  • Peegli mooduli osad ei tohi tekitada müra peegeldusi, mis häirivad vaatevälja.
  • Peegli kalibreerimiseks programmiga peab peegel olema ainult telgsümmeetriline.

Projekti lõpuks valmib kasutatav iseseisev omnivision moodul, mida on võimalik lihtsasti integreerida oma robotisse.

Info

Kood: https://github.com/lwd8cmd/pyXiQ

Programmi dokumentatsioon: pyXiQ dokumentatsioon

NUCi kasutamise juhend

Kulud

Kulude tabel

Ideed

  • Vormida plastmass ketas parapooli kujuks ning seejärel katta peegeldava kihiga.
  • Kasutada vaakum pumpa ja sobivat ahju, plastiku sulamise piirini viimiseks. Esialgne vorm valmib kipsist ja ahju asemel katsetame kuumaõhu puhuriga.
  • Vorm on täis pisikesi auke mille kaudu vaakumiga tõmmatakse materjal õigesse kujusse, kui see on saavutanud sobiva temperatuuri.
  • Plastiku kroomimine võib osutuda peegli vamistamise seisukohalt kõige kallimaks protseduuriks - samas idee pärineb meid ümbritsevast kõik võimalikest plastikust kroomitud tarbeesemetelt (mänguasjad, ehted, sanitaar tarbed).

Märkmed

-
Joonis 1. Hüperbooli võrrand v3

Nõupärimisel spetsialistide Martin Järvekülg ja Margus Koduga, jõudsime järeldusele, et esialgne plastiku vormimise idee on väga hea, lihtsa töödeldavuse tõttu ja arvatavasti sobiv peegli pinna loomise meetod oleks vaakumaurustamisel sadestamine. Kui valmib esimene peegli alus, uurime professor Jaan Aarikult, mis tema meie ideest arvab.

Peegli kuju

Kunas meile ei antud luba näppida Dragoni peeglit peame ise uurima kuju ning mõõtmete kohta.

Artikkel omnivisioni peegli loomisest roboti jaoks. (valemitega)

Hüperbooli võrrandiga kirjeldatud peegli pilti kaameras sai uuritud Pythonis. Joonisel 1 on kujutatud kiirte peegeldust hüperbooli pealt. Vasakul üleval on peegel ja all roboti kere, kaugel paremal on värav. Kaamera vaateväli on jaotatud võrdseteks tükkideks ja nende kiirte teekond kujutatud graafikul. Kaugel on vähem kiiri ja kaamera näeb seal asuvaid objekte palju väiksemana. Kaugemal olevaid palle on suurem võimalus tuvastada. Graafikud on tehtud eeldusel, et robot näeks ühe värava eest teist väravat ja kaameral on 1024x1024 pikslit.

Kui värvid on hästi kalibreeritud, on võimalik headel tingimustel ka 8 piksli suuruse palli (4,5 cm diameeter) tuvastamine, millele vastab 0,7 pikslit cm kohta.

Kasutatud hüperbooli võrrand:

r = 5 #peegli raadius

h = 4 #peegli kõrgus

y0 = 34 #peegli ülemise osa kaugus maast

a = 0.4 #peegli kumerust iseloomustav tegur (mida suurem, seda kumeram)

y = a * (sqrt(1 + (h^2 + 2*a*h)*(x/(r*a))^2) - 1) + y0 - h


Peegli toorikute valemid:

y=sqrt(0.8 * x^2 + 100), x=0..33.5

sqrt(0.7 * x^2 + 50)

Mehaanika osa

Vaakumvormid

Vaakumvormi karbi valmistas Joonas, millele oli plaan panna vaakumit tõmbama esialgu kiletehnoloogia laboris leiduv vaakumpump. Pumba vooliku läbimõõt oli paraku liiga väike ning sellega ei saavutatud piisavat tõmmet, et vaakumvorme teha. Seepeale otsustati proovida tolmuimejaga, millega on siiani kõik vormid tehtud.

Vormi võtmise töökäik:

  • Akrüüli kinnitamine raami külge.
  • Kuumaõhu püstoliga raami küljes oleva akrüüli sulamistemperatuurile viimine.
  • Sulamistemperatuuril oleva plasti vormile peale surumine.
  • Toruga vormile külgede surumine.
  • Samal ajal käivitatakse tolmuimeja.


Tooriku materjal

Kõik vormid on võetud K-rautast ostetud "Plastklaas solar-extra"-st, mille paksuseks on 1mm.

Peeglid

1. peegel 2. peegel 3. peegel 4. peegel
Eesmärk Peegel sai toodetud proof of concept põhimõttega, et saaks kiiremas korras õppejõududele näidata, et idee töötab ning ei tuldud niisama EAP-sid ootama.Peegel valmistatud netist leitud valemi katsetamiseksLeida kahe eelneva peegli vahepealne variant, vähendasime ka diameetrit, et mahutada peegel oma toru sisse.Valmistada viimane peegel, millega jääda rahule.
Millest tulenes peegli kuju? Antud peegli mudeli leidis Joonas mingi poe lehelt.Netist leitud valemi järgi arvutas Lauri meile sobivate parameetritega kuju.Kuju sai arvutatud arvestades eelnevate katsetustega, kasutades 2. peegli valemitPeegli kuju sarnaneb kõvasti eelmisega, lisandus kumerus külgedele.
Kust pärineb ja millest valmistatud vaakumvorm Vormi treis Joonas välja kodus puuhalust, hiljem parandas Ragnar vormi veidi autopahtligaVaakumvormi lasime treida Ekkomis "Soome papist"Vorm sai prinditud 3D printeriga TÜTIsEsialgselt 3D printimise teel, kuid kui peegel on korras, tellitakse see Ekkomist.
Mis on head/halba peeglis Peegli kujust tingituna on meie nägemisväli liiga kõrgel, objektid on selgesti eristatavad, kuid võistlusolukorras on üleliia näha.Peegel venitab liialt pilti ning sellega on nägemisväli liiga väike3D printimisega tekkinud nõgusused rikuvad pildi ära, samas näeme rohkem kui 2. peegligax
Pilt peeglist Pilt:Neljas P.png
Pilt peeglist läbi ximea kaamera
Peegli mudel .stl formaadis [peegli mudel][peegli mudel]peegli mudelpeegli mudel

Toru

Toru kinnitusena idee peale tuli Ragnar, kes internetis ringi vaadates leidis lehekülje, kust on võetud toru idee kui ka peegli valem. Toru on tellitud Tööstusplastist mõõtmetega: 90/84x2000mm, toru hinnaks on 17,11€/m+km lõpplikuks hinnaks (pärast mõõtu lõikumist) kujunes 70.66€. Toru pole mõtet lasta Tööstusplastis lõigata, sest nende teenustasu on liiga suur. Tellides lasime lõigata toru viieks 23.5cm-seks tükiks ning lõikamise eest võeti 15€, samas oleks selle töö saanud ära teha ka nurksaega lõigates.

Toru täidab antud moodulis kahte eesmärki:

  • Kaitseb toru sees olevat peeglit kriimustuste ja näpujälgede eest.
  • Hoiab peeglit kaamera kohal, katmata meie vaatevälja.

Peegli kinnitus

Kinnitus hoiab peeglit torus õigel kaugusel, et fookus oleks meile vajalikul kaugusel ning pilt teravaim meile vajalikus peegli osas. Kinnitusega on võimalik veel peeglit loodida.

Valminud

Projekti raames on valminud:

  • Paraboolpeegel
  • Peegli kinnitamise süsteem
  • Programm (kood on leitav alapealkirjast "info")

Mida tehti

23.02-01.03

  • Lauri otsis välja sibiva kaamera, mida kasutada ning sai küsitud hinnapakkumine.
  • Valmistasime vormi, millesse hakkame vaakumseadmega tõmbama oma pleksiklaasi vastavasse kujusse
  • Valmistasime karbi, millega luua vaakum vormi alla
  • Muretsesime endale ligipääsu vaakumpumbale, millega luua vormi vaakum
  • Ostsime ühe ruutmeetri pleksiklaasi (K-Rauta, 7,35 Eur).


02.03-08.03

Pleksiklaasist sai valmistatud mitu plastikust peegli vormi.

09.03-15.03

Valmistasime puidust peegli "prototüübi" mida kasutame negatiivina, et vaakumi abil sinna pleksiklaas peale tõmmata. Esimene katse näitas, et vaakumiga tõmmates kanduvad negatiivi vead plastile üle ning saadud tulemus pole just kõige parem. Mõningad vead sai kõrvaldatud manuaalselt lihvpaberiga nühkides ning hiljem poleerides, et saavutada täiuslikult sile pind. Poleerimisel tulid välja ikkagi suuremad defektid, mis olid puidust negatiivil.

Kujusse tõmmatud plastist koonusele sai vaakumaurustamise teel sadestatud hõbedat, mis andis meile peegeldava pinna. Pinda oli tarvis veel veidi poleerida, et saavutada täiuslik peegeldus. Esimesed pildid andsid aimu sellest, milline peaks olema roboti nähtavus, kui kasutada antud peeglit. Fookus tuleb seada manuaalselt, sest vastasel juhul fokusseerib kaamera peegli tipu ning "omnivisionist" ei tule midagi välja.

-
Pilt 1. Esimese peegli tulemused

16.03-22.03

Kaameraga sai pildistatud Robotexi võistluspalle erinevatel kaugustel. Kaamera on asetatud UT Robotex 2014 standardplatvormi peale, peegli ülemine osa on maast 34 cm kõrgusel.

Vajalikud objektiivi parameetrid:

Fookuskaugus f = 25 cm (kaugus kaamera sensorist hüperbooli fookuseni).

Vaateväli FOV = atan(r / f) = atan(4 cm / 25 cm) * 2 = 20 degC (r=peegli raadius).

Kaameraga sobivad kinnitused: CS / C mount.

Kaamera sensori suurus: 1/2".

-
Pall kaugusel 320 cm
-
Palli pikslite arvu sõltuvus kaugusest


23.03-29.03

-
Pall kaugusel 320 cm remapitult

Saime kätte testimiseks Ximea kaamera (laenatud Reikolt). Huvi pärast sai vaadatud, kuidas näeb välja lahti pakitud pildid (perspektiiv tehtud sarnaseks tavalisele kaamerale). Osad sirged objektid lähevad pildil kõveraks, sest piltide tegemisel ei ole peegel pandud maaga paralleelseks. Piltide eesmärgiks oli vaadata palli suurust erinevatel kaugustel ja ei ole kulutatud aega täppisloodimiseks statiiviga. Roboti pilditöötlus ei tohiks sõltuda peegli täpsest paigutusest ja moonutustest, programm vajab eelkalibratsiooni.

-
Solidworksi simulatsioon

Solidworksiga modelleeriti kaamera pilti erinevate hüperbooli parameetrite korral. Allpool on pilt hüperbooli võrrandiga y=4.8*(sqrt(0.025 * x^2 + 1)-1) (x ja y ühikuks on millimeeter).

-
Solidworksi simulatsioon erinevate kumerustega

Simulatsiooni tulemused erinevate kumerustega. Hüperbooli võrrandid y=A*(sqrt(B * x^2 + 1)-1).

Kaadrid on parameetritega (A,B)={(0.005, 11.25), (0.01,7.73), (0.025, 4.8), (0.05, 3.37), (0.1, 2.38), (0.2, 1.68)}. Parim tulemus on 3. kaadril (0.025, 4.8).

Objektiiviks on valitud järgmine isend:

https://www.thorlabs.de/newgrouppage9.cfm?objectgroup_id=1822

Item # MVL16M23

Focal Length 16 mm

Aperture (Max) f/1.4

Min Object Distance 200 mm (7.9")

Field of View (1/1.8")diagonal 30.2°

Filter Threading M25.5 x 0.5

Camera Threading C-Mount (1.00"-32)

30.03-05.04

Ximea kaamera kasutab oma APId, mistõttu peab kirjutama enda moodule kaameraga suhtlemiseks. Repo:

https://github.com/lwd8cmd/pyXiQ

06.04-12.04

Tellisin kaamera objektiivi ära. Valikusse jäi siiski mudel MVL12M23, mis on eelmisega küll sama kallis, aga suudab lähemale fokuseerida ja vaateväli on veidi suurem:

Item # MVL12M23

Focal Length 12 mm

Aperture (Max) f/1.4

Min Object Distance 150 mm

Field of View (1/1.8")diagonal 39.1°

Sellise objektiiviga näeb 20 cm kaugusel 8,3 cm diameetriga ala. (tan(3/5 * 39.1° / 2) * 20cm * 2)

Lisasin Ximea kaamera Pythoni moodulisse objektide tuvastuse. Pythoni C wrapper https://github.com/lwd8cmd/pyXiQ/blob/master/pyXiQ.c kasvas umbes 1000 rea pikkuseks. Objekti tuvastuse põhiline osa on CMVisionist pärit. Muudetud sai värvide min_area loogikat: töödeldakse ainult selliste värvidega blobe, mille vastu huvi tuntakse. Pythonis saab küsida terve segmenteeritud pildi puhvri ja eraldi iga värvi blobide kaugused, nurgad (vajab eraldi kauguste kalibratsiooni), ala suuruse, keskme koordinaadid ja bounding boxi koordinaadid. RGB värviruumis sai objektid 1280x1024 resolutsiooniga 60 korda sekundis küll tuvastatud, aga kogu võttis 100% lõime resurssidest. RAW8 formaadis söödab kaamera RGGB ploki ühe värvi väärtuse ja sellest ise RGB väärtuseid kokku pannes saab pilditöötluse 60% lõime resurssidega tööle.

-
Värvide kalibreerimine (Kaamera on 2x2 binningus)


-
Blobi leidmine täisresolutsiooniga


Mooduli kasutamise näidis:

import numpy as np

import pyXiQ

cam = pyXiQ.Camera()

cam.setInt("exposure", 10000)

colors = np.zeros((256,256,256), dtype=np.uint8)

colors[0:200,1:201,2:202] = 1#select colors where blue=0..200, green=1..201, red=2..202

cam.setColors(colors)

cam.setColorMinArea(1, 100)#show only blobs larger than 100

cam.start()

cam.analyse()

blobs = cam.getBlobs(1)

Kasutatavaid meetodeid on oluliselt rohkem, digiwikisse tuleks luua eraldi dokumentatsioon mooduli kasutamise kohta.

Järgmise nädala plaanid:

  • pyXiQ moodulis segmenteeritud puhvri küsimise lihtsustamine. Praegune meetod np.frombuffer(cam.getBuffer(), dtype=np.uint8).reshape(cam.shape()) asemel võiks olla lihtsalt cam.getBuffer(). C moodul peaks pointeri tagastamise asemel ise looma numpy-le array, mille andmed jäävad seotuks c puhvriga.
  • mooduli dokumentatsioon
  • kauguste ja nurkade kalibratsiooni meetodi väljatöötamine. Väikseima vea saab kasutades 10x10 meetriks malelaua mustriga alust, programm saab igale pikslile pildi järgi kohe vastavusse seada asukoha reaalsel väljakul. Kui kalibratsiooni on vaja korduvalt läbi viia (mängu jooksul peegel nihkub), siis võib nii suure aluse kasutamine olla tülikas ja on vaja kergemat, aga samas mitte nii täpset meetodit. Asetada pall neljale erinevale kaugusele, pöörata robotit 90 kraadi, ja korrata neljas erinevas sihis ja interpoleerida vahetulemused?

20.04-26.04

-
Kaamera, objektiivi, peegli mõõtmed

Objektiib saabus kohale. Mõõtsin erinevatel kaugustel kaamera vertikaalse vaateala ära, et leida väätevälja (FOV) ja fookuse asukoha. Vaateväli on paar protsenti väiksem tehnilistest andmetest, vahe tuleb ilmselt sensori mõõtmetest/kaugusest. Ideaalis võiks peegli diameeter seega olla ka paar protsenti väiksem.

-
Peegli vorm

Saime kätte treitud tooriku, mis on valmistatud peegli solidworksi faili alusel. Plastikust vorm on tõmmatud, tuleb vaid hõbedaga katta.

-
Pilt vaatealast ülalpool olevate prožektoritega
-
Pilt vaatealas olevate prožektoritega

Valmistasime ajutise läbipaistva toru, et kontrollida, kas plastiktoru tekitab segavaid peegeldusi. Väljaku keskel asuvat läbipaistva toru peal asuv peeglit valgustati prožektoritest. Väljakul valged jooned on tõmmatud läikiva teibiga, valgustades peegeldab sealt valgust, aga need eksisteeriks ka ilma toruta. Otse väljaku kohalt valgustades näeb peegli kriime ja heledamat joont peegli keskkohani, aga need on peegli enda tekitatud. Ajutine toru on valmistatud kokkurullitud plastikuplaadist, mis on kuju säilitamiseks kinnitatud läbipaistva teibiga. Ühenduskohas on näha heledamat laiku, aga tellitaval plastiktorul ei eksisteeri selliseid kinnituskohti. Prožektoritega valgustamine on ka päris ekstreemne juht, võistlusolukorras saab peegeldusi lugeda tühiseks.

27.04-03.04

Koodi on lisatud kauguste kalibratsioon ja aktiivsete pikslite määramine. Digiwikis on olemas pyXiQ dokumentatsioon.

Peegli kinnituse mahutamiseks tuleb uus peegel 70mm diameetriga. Kaamera näeb täilikult peeglit, kui kaamera alumise osa ja peegli laiema osa kaugus on 21cm.

Tööplaan

23.02-01.03

Uurida hüpperbool peegli kuju kohta ning välja mõelda mingid mõõtmed meie peeglile Valimistada esimene vorm, millest võtta kips negatiiv. Osta ära pleks millega oli plaanis esimesed alused vormida. Valmistada karp kips negatiivi ja vaakumi jaoks.

  • Üritada teha esimene peegli alus.
    • Analüüsida kui hästi või halvasti aluse valmistamine õnnestus - kas senine plaan võib jätkuda.
    • Eesmärk võimalikult kiiresti saada valmis realse peegli proto.
  • KAAMERA

02.03-08.03

  • Luua hinnanguline projekti maksumus.
  • Muretseda endale küttekeha, millega sulatada vormimiseks valmis pleksiklaas.
  • Proovida luua esimene pleksiklaasist toorik.
  • Analüüsida kui hästi või halvasti aluse valmistamine õnnestus - kas senine plaan võib jätkuda.
  • Minna esimese peegli alusega vaakumaurustamisse.
  • Analüüsida saavutatud tulemust - kas senine plaan võib jätkuda.
  • Tuleb teha otsus, kas jääme esialgse idee juurde või võtame käiku teise plaani.

09.03-15.03

Kui proto valmib edukalt on esmane praktiline töö mõneks ajaks tehtud ja asuda tuleb valemite kallale - ehk leida meile sobiva peegli valem kooskõlas kaamera parameetritega. Otsida valemite närimisel abi.

16.03-22.03

Võimalik, et tegeleme endiselt peegli valemi ja kaamera leidmisega.

23.03-29.03

Mindi üle tasklistile

Personaalsed tööriistad
Navigeerimine
Käsitöö