Joonas Sarajärvi Reaaliaikainen kuvaprosessointi robottihelikopterissa

Koko: px
Aloita esitys sivulta:

Download "Joonas Sarajärvi Reaaliaikainen kuvaprosessointi robottihelikopterissa"

Transkriptio

1 TIETOTEKNIIKAN OSASTO Joonas Sarajärvi Reaaliaikainen kuvaprosessointi robottihelikopterissa Diplomityö Tietotekniikan koulutusohjelma Toukokuu 2014

2 Sarajärvi L.J. (2014) Reaaliaikainen kuvaprosessointi robottihelikopterissa. Oulun yliopisto, Tietotekniikan osasto. Diplomityö, 54 s. TIIVISTELMÄ Kameran kalibrointi on menettely, jolla selvitetään kameran tuottamien kuvapisteiden ja kameralla kuvatun näkymän geometrian suhde. Tavallisesti suhde esitetään kameramallin avulla. Tyypillisesti kalibrointimenetelmät sovittavat jonkin kameramallin parametrit vastaamaan kameran kuvista tehtyjä havaintoja. Kalibrointi on tarpeellinen, mikäli kameran kuvasta mitataan geometrisia suureita. Tässä työssä toteutetaan ohjelmisto, joka noudattaa Oulun yliopiston konenäön tutkimuskeskuksessa kehitettyä kameramallia. Ohjelmiston avulla AR.Drone 2.0 -robottihelikopterin kameralle suoritettua kalibrointia voi hyödyntää AR.Drone 2.0:n omalla suorittimella. Ohjelmisto sopii myös muihin sulautettuihin järjestelmiin ja PC-tietokoneisiin. Taustatietona tarkastellaan olemassa olevia kameramalleja ja verrataan toteutuksen noudattamaa kameramallia näihin malleihin. AR.Drone 2.0:n laitteistoa ja ohjelmistoa tarkastellaan toteutettavan ohjelmiston kohdealustana toimimisen näkökulmasta. Toteutetuista kuvankäsittelymenetelmistä esitetään perustoteutus ja sitä nopeuttavia optimointeja. Erityisesti ohjelmiston ja suorittimen välimuistin vuorovaikutukseen kiinnitetään huomiota. Valittujen menetelmien todetaan soveltuvan myös jaettavaksi usealle suoritinytimelle rinnakkaiseen laskentaan. Lopuksi toteutetun ohjelmiston suorituskykyä arvioidaan sekä ARMsuoritinarkkitehtuuria edustavissa sulautetuissa järjestelmissä että PC-työasemissa. Toteutetulla ohjelmistolla voi korjata kalibroidun kameran kuvia perspektiivimallin mukaiseksi. ARM Cortex-A8 -suorittimella ohjelmisto kykenee korjaamaan AR.Drone 2.0:n kameran tuottamia kuvia reaaliajassa. Avainsanat: kameran kalibrointi, sulautettu järjestelmä, välimuistin optimointi

3 Sarajärvi L.J. (2014) Real time image processing in a robot helicopter. University of Oulu, Department of Computer Science and Engineering. Master s thesis, 54 p. ABSTRACT Camera calibration is a means of finding out the relationship between pixels produced by a camera and the geometry of the scene that is imaged. Usually the relationship is expressed as a camera model. Typically, calibration techniques fit the parameters of a specific camera model to match observations made from images produced by a camera. A calibration should be performed for a camera if images produced by it are used for measurement of geometric attributes. In this work, a camera model developed at the Center for Machine Vision Research of Oulu University is implemented in software. The implemented software can be run on the AR.Drone 2.0 robot helicopter, enabling application of calibration to the camera that is used in the device. The software is also suitable for being run in other embedded systems and in conventional personal computers. For background, a number of existing camera models are discussed. The model used in the software implementation is compared to other models. The computer hardware and software present in the AR.Drone 2.0 is discussed from the point of view of writing software for them. Of the implemented algorithms, both a basic implementation and various optimiziation techniques are described. This thesis focuses on the interaction between software and the CPU caches. A description on how the algorithms are suitable for concurrent processing on multiple CPU cores is given. Finally, the performance of the implemented software is evaluated on ARM-based systems and personal computers. The software implemented as part of the work can be used for correcting images produced by a calibrated camera to obey the perspective model. On an ARM Cortex-A8 CPU, the images taken by an AR.Drone 2.0 can be corrected in real time. Keywords: camera calibration, cache optimization, embedded system

4 SISÄLLYSLUETTELO TIIVISTELMÄ ABSTRACT SISÄLLYSLUETTELO ALKULAUSE LYHENTEIDEN JA MERKKIEN SELITYKSET 1. JOHDANTO 8 2. KAMERAN KALIBROINTI Kameramallit Geneeriset kameramallit Aksiaaliset kameramallit Pistemäiset kameramallit Perspektiivikameramalli Laajennettu perspektiivimalli Xiong-Turkowski -malli Kannala-Brandt -malli Mallin yksityiskohdat Käänteinen malli Mallin valinta KUVAPROSESSOINTI SULAUTETUSSA OHJELMISTOSSA Kohdejärjestelmän kuvaus OMAP ARM Cortex-A Signaalinkäsittelysuoritin AR.Drone 2.0:n vakio-ohjelmistot Yhteensopivuus Välimuisti Ohjelmointikielet Pohdinta KEHITETTY OHJELMISTO Twirl-kirjasto Polynomit Matriisit Kannala-Brandt -mallin toteutus Kuvan korjaus perspektiivimallin mukaiseksi Korjauksen hakutaulukko-optimointi Twirr-kirjasto Käyttöliittymät ja testaus

5 5. TULOKSET Testiympäristöt Kalibrointi Tarkkuus Laskennalliset resurssit Ohjelmiston koko Keskusmuistikapasiteetti Kuvan korjaus perspektiivimallin mukaiseksi Hakutaulukko-optimoitu kuvan korjaus Rinnakkainen kuvan korjaus Rinnakkainen hakutaulukko-optimoitu kuvan korjaus Hakutaulukkohaun PLD-optimointi Cortex-A8:ssa Pohdinta YHTEENVETO LÄHTEET 53

6 ALKULAUSE Tämä diplomityö kirjoitettiin keväällä 2014 Oulun yliopiston tietotekniikan osastolle. Haluan kiittää ohjaajiani Jari Hannukselaa ja Jani Boutellieria kannustavasta ja rakentavasta opastuksesta. Lisäksi kiitän Juho Kannalaa ja Antti Tikanmäkeä asiantuntijaavusta työhön liittyvien teknisten yksityiskohtien selvittämisessä. Työnantajaani Embelin Oy:ta kiitän mahdollisuudesta järjestää opintojen ohessa työskentelyni niin, että työn loppuun saattaminen tänä keväänä tuli mahdolliseksi. Lämpimät kiitokset ansaitsee myös vaimoni Kati, jonka piristävä tuki on toistuvasti kannustanut selvittämään hankalatkin ongelmat. Oulussa 22. toukokuuta 2014 Joonas Sarajärvi

7 LYHENTEIDEN JA MERKKIEN SELITYKSET (a, b) T ARM DRAM GCC GiB KiB MiB OMAP PNG SoC SRAM (u, v) T WLAN x86 Sarakevektori ARM Holdings:n kehittämä suoritinarkkitehtuuri Dynamic Random Access Memory GNU Compiler Collection Gibitavu, tavua Kibitavu, 1024 tavua Mebitavu, tavua Open Multimedia Applications Platform Portable network graphics, kuvatiedostoformaatti System-on-Chip Static Random Access Memory Kuvapisteen sijainti pikseleissä Wireless Local Area Network, langaton lähiverkko Intel 386-suorittimen kanssa yhteensopivat suoritinarkkitehtuurit x86-64 x86-suoritinarkkitehtuurin 64-bittinen laajennos x = (x, y) T Kuvapisteen sijainti kameran sensorissa

8 8 1. JOHDANTO Viime vuosina markkinoille on ilmaantunut suuret määrät edullisia, alle tuhannen euron hintaisia pienoisilma-aluksia, joita periaatteessa kuka hyvänsä asiasta kiinnostunut pystyy hankkimaan ja käyttämään. Leluluonteisten tuotteiden lisäksi saatavilla on myös vakavammin otettavaksi tarkoitettuja laitteita, joilla esimerkiksi voi edullisesti ottaa ilmakuvaa lähiympäristöstä. Yksi suosittu tuote on Parrot:n valmistama AR.Drone 2.0 -lentolaite, joka on alle puolen kilogramman painoinen, neljällä roottorilla lentävä ns. nelikopteri. Laite sisältää tietojärjestelmän, joka WLAN-yhteyttä käyttäen vastaanottaa käyttäjältä ohjauskomentoja ja lähettää reaaliaikaista videokuvaa kameroistaan. Laite on sellaisenaan pitkälle tuotteistettu, eikä sen ohjaaminen vaadi erityistä harrastuneisuutta pienoisilmailuun. [1] AR.Drone 2.0:n ohjaamiseen käytetään normaalisti WLAN-yhteyttä hyödyntävää älypuhelinsovellusta. Laite kykenee ilman ulkoista ohjausta pitämään itsensä vakaana paikallaan, mutta suuri osa toiminnasta perustuu käyttäjältä, lentolaitteen ulkopuolelta vastaanotettuihin komentoihin. Mielenkiintoiseksi erilaisiin harraste- ja tutkimusprojekteihin AR.Drone 2.0:n tekevät laitteen matala noin 300 euron hinta ja se, että ohjaamiseen käytettävät protokollat ovat julkisesti saatavilla [2]. Protokolladokumentaatio on parantanut Parrotin ulkopuolisten tahojen mahdollisuuksia kehittää omia työkaluja laitteen ohjaamiseen. Viestiliikennettä laitteen kameroiden, sensorien, ohjainpiirien ja WLAN-liitännän välillä ohjaa AR.Drone 2.0:ssa OMAP3630 -piiri, jossa suoritetaan Linuxiin perustuvaa käyttöjärjestelmää [3]. Piirin 1 GHz kellotaajuudella toimiva Cortex-A8 -suoritin on laskentakapasiteetiltaan vastaava kuin esimerkiksi monien älypuhelinten suorittimet. AR.Drone 2.0:n sisäistä ohjelmistoa ei varsinaisesti ole tarkoitettu käyttäjän vaihdettavaksi, mutta niin pystyy tekemään laitteen tarjoamista verkkorajapinnoista. Tämän takia laite on houkutteleva kokeilualusta erilaisiin lentäviä robotteja koskeviin projekteihin. Mikäli AR.Drone 2.0:n tai muun vastaavan laitteen haluttaisiin kykenevän suorittamaan tehtäviä itsenäisesti ilman jatkuvaa ulkopuolista ohjausta, voitaisiin videokuvaa lähettävät toiminnot korvata laitteen sisäisessä suorittimessa toimivalla automaattiohjauksella. Automaattiohjauksen avulla laite voisi suunnistaa haluttuun kohteeseen ja sieltä takaisin itsenäisesti. Maanpinnan lähellä ilma-alusta ei kuitenkaan voi ohjata pelkästään esimerkiksi GPS-paikannuksen avulla, vaan laitteen tulee esimerkiksi pystyä havaitsemaan ja kiertämään ympärillä olevat esteet. Usein ympäristön kartoittamiseen kameran kuvan avulla käytetyt menetelmät vaativat tai vähintään hyötyvät siitä, että kuvasta havaittujen piirteiden suunnat suhteessa kameraan tunnetaan riittävän tarkasti. Perinteistä perspektiivimallia noudattavien kameroiden optiikassa esiintyy kuitenkin tyypillisesti vääristymää, joka heikentää mittausten tarkkuutta erityisesti kuvien reuna-alueilla. Esimerkiksi AR.Drone 2.0:n kameran kuvissa vääristymä on todettavissa silmämääräiselläkin tarkastelulla. Lisäksi osa laajakulmaisista kameraratkaisuista ei noudata perspektiivimallia lainkaan. Kuvasta havaittujen piirteiden koordinaatit voidaan määrittää tarkemmin, jos kamera kalibroidaan. Kalibroidusta kamerasta tunnetaan tarkasti, missä suunnassa mikäkin havaittu esine on. Kalibrointi tapahtuu usein soveltamalla mallia, joka huomioi edellä mainitut vääristymät. Sopivia malleja on vuosien aikana kehitetty lukuisia [4]. Usein

9 mallin toteutus saattaa olla esimerkiksi Matlab-ohjelma, jonka ajaminen AR.Dronen kaltaisessa sulautetussa järjestelmässä on vaikeaa. Muita kuin Matlabilla toteutettuja ratkaisuja vääristymien korjaamiseen on saatavilla esimerkiksi OpenCV -projektista, mutta nekään eivät ole toteutettu erityisesti sulautettuja järjestelmiä silmälläpitäen. Tässä työssä toteutetaan AR.Drone 2.0-lentolaitteeseen tai muuhun vastaavaan sulautettuun järjestelmään soveltuva kuvankorjausohjelmisto, joka noudattaa Oulun yliopiston konenäköryhmässä [5] kehitettyä menetelmää. Ohjelmisto mahdollistaa perspektiivimallista poikkeavien kuvien korjaamisen perspektiivimallin mukaisiksi, mikä helpottaa kuvatun esineen tai ympäristön geometrian mittaamista. Lisäksi kuvan korjaaminen perspektiivimallin mukaiseksi on usein hyödyllistä esimerkiksi yhdisteltäessä suurempi panoraamakuva useasta pienestä kuvasta. AR.Drone 2.0 sisältää kaksi kameraa. Kameroista tarkempi osoittaa eteen päin ja tuottaa x720 pikselin kuvaa sekunnissa. Alas päin osoittava kamera tuottaa kuvia jopa 60 kappaletta sekunnissa, mutta on tarkkuudeltaan vain 320x240 pikseliä. Kuvadataa on siis paljon käsiteltäväksi yhdellä 1 GHz suorittimella. Mikäli AR.Drone 2.0:ssa toimiva ohjelmisto tarvitsisi tietoa jokaisesta etukameran kuvasta esimerkiksi oman nopeutensa seuraamiseen, sille jäisi noin 33 millisekuntia yhden kuvan käsittelyyn. Kellosykleinä tämä olisi kymmeniä miljoonia, mutta etukameran kuvassa on pikseleitäkin lähes miljoona. Käsiteltävän kuvadatan määrää voi tarvittaessa pienentää alinäytteistämällä videokuvaa paikkatasossa tai jättämällä osan kuvista käsittelemättä. Tämä on tarkkuuden kannalta kompromissi, mutta useimmissa sovelluksissa suoritinaikaa pitää jättää käytettäväksi myös muille toiminnoille kuin kuvan perspektiivikorjaustoiminnolle. Jotta tasapainoilua laskennan nopeuden ja tarkkuuden välillä tarvitsisi tehdä mahdollisimman vähän, kiinnitetään toteutettavan ohjelmiston suorituskykyyn paljon huomiota. Työn aluksi kuvataan erilaisia kameran kalibrointiin käytettyjä kameramalleja. Tämän jälkeen tutustutaan AR.Drone 2.0:n tarjoamaan laitteistoon ja siihen, minkälaiset valmiudet ohjelmistojen suorittamiseen AR.Drone 2.0 tarjoaa. Kun oleellisimmat työhön liittyvät taustatiedot on käsitelty, esitellään työn osana toteutetun ohjelmiston teknisiä ratkaisuja. Lopuksi tarkastellaan toteutetun ohjelmiston suorituskykyä ja soveltuvuutta käyttötarkoitukseensa. 9

10

11

12

13 13 Mikäli tunnetaan kameran R 3 -koordinaatistossa oleva piste (x, y, z), voidaan edellä mainitun merkintätavan mukainen esitys tulokulmalle laskea sijoittamalla x, y ja z piste yhtälöön Φ = ( ) θ = φ ( ) arctan( x2 + y 2, z). (2) arctan(y, x) Yhtälössä (2) käytetään kaksiparametrista arctan-funktiota, joka tässä työssä määritellään perinteisen yksiparametrisen arctan-funktion kautta yhtälön arctan(y/x) : x > 0 π/2 : x = 0, y > 0 arctan(y, x) = π + arctan(y/x), : x < 0, (3) π/2 : x = 0, y < 0 0 : x = 0, y = 0 mukaisesti. Määritelmän arctan(0, 0) = 0 -haara on mielivaltaisesti valittu. Käytännössä tässä työssä ei ole väliä sillä, mikä arvo φ-kulmalle valitaan silloin kun valonsäde tulee suoraan kameran edestä. Kannalan ym. [12] mukaan myös useimmat sellaiset kamerat, jotka eivät ole pistemäisiä, ovat kuitenkin häviävän pieniä verrattuna kameralla kuvattavaan järjestelmään. Tällaisessa tilanteessa kameraa voidaan kohdella pistemäisenä ja käyttää pistemäistä kameramallia Perspektiivikameramalli Kameramalleista mahdollisesti perinteisin on pistemäisiin kameramalleihin kuuluva perspektiivikameramalli, joka on tunnettu jo ainakin renessanssista asti [11]. Perspektiivimallin mukaista kameraa kutsutaan perspektiivikameraksi. Vaikka perspektiivikameramalli muistuttaa suuresti perinteisen neulanreikäkameran geometriaa, on Grossbergin mukaan myös muita kameroita rakennettu siten, että ne noudattavat samaa mallia [11]. Myös Kannalan ym. [12] mukaan perspektiivikameramallia voi soveltaa useimpiin tavanomaisiin kameroihin. Perspektiivikameramalli noudattaa yhtälöä ( x y ) = ( f X/Z f Y/Z ), (4) missä (x, y) T on kuvapisteen sijainti kameran sensorissa, f on kameran polttoväli ja (X, Y, Z) T on kuvatun pisteen sijainti. [13 s. 154] Hartleyn ja Zissermanin mukaan perspektiivikameran kuvaamien tasojen kuvautuminen kuvatasoon voidaan esitttää P 2 :n projektiivisena muunnoksena. Projektiivinen muunnos kuvaa suorat suoriksi. [13 s. 25] Tämän lisäksi perspetiivikameran tuottamaan kuvaan voidaan soveltaa myös muita projektiiviseen geometriaan nojaavia menetelmiä. Kannalan mukaan perspektiivikameraa voi pitää suuntailmaisimena, joka kuvaa kunkin kameraan tulevan valonsäteen suunnan joksikin pikseliksi seuraavan yhtälön ( x y ) = tan(θ) ( cos(φ) sin(φ) ) (5)

14 14 mukaisesti. Kannalan mukaan yhtälön perusteella on selvää, että perspektiivikameran kuvakulman laajuus voi olla puolipalloa suurempi. Jos θ -kulma lähestyisi ääretöntä, kasvaisi (x, y) T -vektorin pituus äärettömän suureksi. [8] Devernayn ja Faugeras:n [7] mukaan useimmat kolmiulotteisen konenäön algoritmit hyödyntävät perspektiivimallia. Grossberg:n ja Nayar:n [9] mukaan sekä optiikkaa että konenäköä kehitettäessä on keskitytty juuri perspektiivimallin ominaisuuksiin. Lisäksi esimerkiksi Fitzgibbon [14] esittää algoritmeja, joiden tarkkuus edellyttää, että kuvien vastinpisteet haetaan perspektiivimallin mukaisista kuvista. Koska perspektiivimalli on yksinkertainen, yleinen ja hyvin tunnettu, usein kuva korjataan perspektiivimallin mukaiseksi Laajennettu perspektiivimalli Koska suuressa osassa perspektiivimallin mukaisiksikin tarkoitettuja kameroita esiintyy perspektiivimallin vastaisia vääristymiä, on usein päädytty laajentamaan perspektiivimallia rakenteilla, jotka huomioivat nämä vääristymät. Mikäli malliin lisätyt rakenteet saadaan sovitettua vastaamaan jossain tunnetussa kamerassa esiintyviä vääristymiä, voidaan mallin avulla korjata vääristymiä pois kuvasta. Vaihtoehtoisesti voidaan korjata vääristyneestä kuvasta havaittuja koordinaatteja vastaamaan paremmin kuvattujen esineiden todellisia sijainteja. Laajennoksia perspektiivimallille on esitetty useita. Esimerkiksi Heikkilä ja Silvén [15] ovat käyttäneet mallia, jossa perinteisen perspektiivimallin antamaa kameratason sijaintia (x, y) vastaa yhtälön ( u v ) = G(x, y) = [ Du s u (x + x(k 1 r 2 + k 2 r ) + 2p 1 xy + p 2 (r 2 + 2x 2 )) D v (y + y(k 1 r 2 + k 2 r ) + p 1 (r 2 + 2y 2 ) + 2p 2 xy) mukainen kuvapiste. Yhtälössä (6) r saadaan suoraan lausekkeesta x 2 + y 2, kun taas {k 1, k 2,...}, p 1 ja p 2 ovat mallin vääristymän kuvaavia parametreja, jotka voidaan selvittää Heikkilän ja Silvén:n esittämällä kalibrointimenettelyllä. ] (6) 2.4. Xiong-Turkowski -malli Xiong ja Turkowski [16] esittivät vuonna 1997 pistemäisen kameramallin, joka poikkeaa huomattavasti perspektiivikameramallista ja sen laajennoksista. Perspektiivimallia ei käytetty mallin perustana varsinkin siksi, että se erittäin laajakulmaisten linssien koko kuva-alaa ei saada perspektiivimallilla mallinnettua. Malli esittää yhtälön (1) kaltaisten (θ, φ) -parien kuvautumisen valosensorin pinnalle yhtälön. ( ) ( ) x cos(φ) = r(θ) (7) y sin(φ) mukaisesti. Yhtälössä (7) funktio r(θ) kuvaa kameran akselin ja valonsäteen välisen kulman etäisyydeksi sensorin keskipisteestä yhtälön r(θ) = c 1 θ + c 2 θ 2 + c 3 θ (8)

15

16 16 missä r(θ) on yhtälön r(θ) = k 1 θ + k 2 θ 3 + k 3 θ 5 + k 4 θ 7 + k 5 θ (11) mukainen parittomia kertoimia sisältävä polynomifunktio. Yhtälöissä (10) ja (11) θ on kameran symmetria-akselin ja kameraan tulevan valonsäteen välinen kulma ja φ kierto symmetria-akselin ympäri. Epäsymmetrinen vääristymä mallinnetaan erikseen radiaaliseen ja tangentiaaliseen suuntaan. Radiaaliseen suuntaan vääristymän suuruus on yhtälön r (θ, φ) = (l 1 θ + l 2 θ 3 + l 3 θ 5 )(i 1 cos φ + i 2 sin φ + i 3 cos 2φ + i 4 sin 2φ) (12) mukainen. Vääristymän suuruus riippuu siis θ:n ja φ:n avulla ilmaistusta havaitun valonsäteen tulokulmasta. Tangentiaaliseen suuntaan epäsymmetrisen vääristymän suuruus kuvataan yhtälön t (θ, φ) = (m 1 θ + m 2 θ 3 + m 3 θ 5 )(j 1 cos φ + j 2 sin φ + j 3 cos 2φ + j 4 sin 2φ) (13) mukaisesti funktiolla, joka on hyvin samannäköinen kuin yhtälössä (12) esitetty r - funktio. t -funktion kertoimet ovat kuitenkin täysin erilliset. Yhtälöistä (12) ja (13) voidaan yhdistellä epäsymmetrisen vääristymän aiheuttaman poikkeaman kuvatasossa kuvaava funktio S yhtälön s = S(Φ) = r (θ, φ)u r (φ) + t (θ, φ)u t (φ) (14) mukaisesti. Mallin epäsymmetrisen osan yhdistäminen symmetriseen osaan on esitetty yhtälössä ( ) xd x d = = x + s = r(θ)u r (φ) + r (θ, φ)u r (φ) + t (θ, φ)u t (φ), (15) y d missä x d on symmetrisen mallin antaman tuloksen ja epäsymmetristen vääristymien summavektori, u r (φ) on yksikkövektori kameran sensorin koordinaatistossa radiaaliseen suuntaan ja u t (φ) on yksikkövektori tangentiaaliseen suuntaan. Kuvatason koordinaatit valosensorin pikseleiden koordinaateiksi kuvaa malliin sisältyvä affiini H -muunnos määritellään kertoimien {m u, m v, u 0, v 0 } kautta yhtälön ( ) [ ] ( ) ( ) u mu 0 xd u0 = + (16) v 0 m v mukaisesti. Yhtälön voi järjestää uudelleen muotoon ( ) ( ) u mu x = H(x v d, y d ) = d + u 0. (17) m v y d + v 0 y d v Käänteinen malli Yhtälössä (15) määritelty malli on funktio, joka kuvaa kameran keskipisteen läpi kulkevien valonsäteiden kulmat sijainneiksi kameran sensorikennolla. Usein on kuitenkin myös tarpeen selvittää, mitä valonsädettä jokin pikseli vastaa. Tämän kulman

17 17 laskemisesta kutsutaan käänteiseksi projisoinniksi (eng. backprojection). Yhtälöä (9) vastaava käänteinen projisointi voidaan kuvata yhtälön ( ) θ = Pc 1 (u, v) = (F 1 D 1 H 1 )(u, v) (18) φ mukaisella Pc 1 -funktiolla, jonka komponentit ovat suoraan yhtälön (9) käänteisoperaatioita. Kannalan ja Brandt:n [5] mukaan F 1 ja H 1 ovat suoraviivaiset laskea. Haasteellisempi on D 1, mutta sitä voi approksimoida seuraavasti: D 1 (x d ) x d ( I + Yhtälössä (15) S on yhtälön Φ ( ) (( ) ) 1 1 S F Φ F 1 (x d ) Φ F 1 (x d )) (S F 1 )(x d ) S Φ = ( sx θ s y θ s x φ s y φ ) (19) (20) mukainen osittaisderivaattamatriisi ja F Φ F Φ = on yhtälön ( x θ y θ x φ y φ ) (21) mukainen osittaisderivaattamatriisi Mallin valinta AR.Drone 2.0:n etukameralle aksiaaliset ja täysin geneeriset kameramallit ovat tarpeettoman joustavia, koska käytännössä kameraa voi sen fyysisten mittojen takia pitää pistemäisenä. Puhdas perspektiivimalli sopisi AR.Drone 2.0:n kameralle huonosti. Kameran kuvissa on perspektiivimallista poikkeavaa vääristymää niin paljon, että se on helposti havaittavissa silmämääräisestikin tarkasteltuna. Jokin perspektiivimallin vääristymiä huomioiva laajennus olisi mahdollinen, koska kameran kuva ei yllä π 2 poikkeamiin kameran keskilinjasta. Tässä työssä sovelletaan edellä esiteltyä Kannala-Brandt -kameramallia. Malli soveltuu Kannalan ja Brandt:n [5] mukaan soveltuu tavanomaisille kameroille yhtä hyvin kuin perinteisemmät kameramallit. AR.Drone 2.0:n kamera ei ole niin laajakulmainen että Kannala-Brandt -mallin sopivuudella kalansilmälinsseille olisi tässä sovelluksessa merkitystä. Mahdollisuus myös kalansilmälinssien käyttämiseen jossain muussa sovelluksessa tai esimerkiksi optiikaltaan muunnellussa AR.Drone 2.0:ssa on hyödyllinen piirre. Lisäksi mallin odotetaan olevan yksinkertaisempi, kuin vääristymän huomioivaksi laajennettu perspektiivikameramalli.

18 18 3. KUVAPROSESSOINTI SULAUTETUSSA OHJELMISTOSSA Tässä osassa työtä kuvataan seikkoja, jotka huomioidaan kirjoitettaessa ohjelmistoa sulaututettuun järjestelmään tai muuhun ympäristöön, jossa laskennalliset resurssit ovat rajalliset. Muut sulautettujen järjestelmien erityispiirteet jäävätkin toteutettavan ohjelmiston laskentapainotteisuuden takia vähälle huomiolle Kohdejärjestelmän kuvaus Työssä kehitetyn ohjelmiston halutaan olevan yhteensopiva erilaisten laitealustojen kanssa. Toisaalta sen suorituskykyyn nimenomaan AR.Drone 2.0:n sisältämässä laitteistossa kiinnitetään erityistä huomiota. Tässä luvussa esitellään AR.Drone 2.0:n ominaisuuksia ohjelmoijan näkökulmasta OMAP3630 AR.Drone 2.0 sisältämä [3], Texas Instrumentsin kehittämä OMAP3630-piiri on integroitu kokonainen tietojärjestelmä eli niinsanottu SoC (eng. System-on-Chip). 1 GHz ARM Cortex-A8 -suorittimen lisäksi OMAP3630 sisältää useita muita laitteita yhtenä kokonaisuutena. Integroituna OMAP3630:ssa on muun muassa 64 KiB SRAMmuistia, USB-isäntäohjain (eng. USB host controller), näytönohjain, SD-korttiliitäntä ja erilaisia matalan tason sarjaliikenneliitäntöjä. [18] Sisäisen SRAM-muistin lisäksi OMAP363 voi hyödyntää ulkoisia SDRAM-muisteja [18]. AR.Drone 2.0:ssa SDRAM-muistia on 128 MiB [3] ARM Cortex-A8 Cortex-A8 on ARM Holdings plc:n kehittämä suoritinydin, joka toteuttaa 32-bittisen ARMv7-A -käskykannan. ARMv7-A:n pakollisen toiminnallisuuden lisäksi Cortex- A8 tukee sekä VFPv3-D32 -liukulukukäskyjä että NEON -liukulukukäskyjä. Suorittimen kellotaajuus on tyypillisesti 600 MHz - 1 GHz. L1 -välimuistia suorittimessa on 32 tai 64 kilotavua datalle ja 32 tai 64 kilotavua käskyille. L2-välimuistin koko on laitevalmistajan mukautettavissa, mutta sitä voi olla korkeintaan 1 MiB. [19] ARDrone 2.0:n OMAP3630 -SoC sisältämässä Cortex-A8:sa välimuistien kapasiteetit on valittu siten, että L1-välimuistit ovat 32 KiB kokoisia ja L2-välimuistin koko on 256 KiB [18] Signaalinkäsittelysuoritin OMAP3630-piiriin sisältyy komponenteista on IVA 2.2-signaalinkäsittelylohko, joka perustuu Texas Instruments:n TMS320DMC64X+ -suorittimeen. Suoritin on 32- bittinen kiinteäpisteistä aritmetiikkaa käyttävä signaalinkäsittelysuoritin, joka on op-

19 19 timoitu erityisesti kuvan- ja videonkäsittelyyn. Suoritin pystyy suorittamaan jopa kahdeksan operaatiota kellosyklissä. [18]. Tässä työssä signaalinkäsittelysuoritinta ei juuri huomioida, koska ohjelmistokehitys signaalinkäsittelysuorittimille vaatii usein enemmän työtä kuin vastaavan ohjelmiston kehittäminen yleiskäyttöiselle suorittimelle. Ohjelmistokehitys signaalinkäsittelysuorittimelle vaatii usein suoritinkohtaisia erikoistyökaluja ja erityisosaamista. Yleiskäyttöiselle suorittimelle ohjelmoitaessa työkalut ovat kehittäjille usein ennalta muista projekteista tuttuja. Työssä kehitetyn ohjelmiston osalta työmäärää olisi kasvattanut erityisesti TMS320DMC64X+-suorittimen vaatima kiinteän pisteen aritmetiikan käyttö. Voi olla, että toteutettu ohjelmisto tai osia siitä lopulta on sovitettavissa signaalinkäsittelysuorittimelle. Alustana TMS320DMC64X+:a yleisemmät tavanomaiset ARMsuorittimet ovat kuitenkin ainakin projektin alkuvaiheessa paljon houkuttelevampi kohdealusta AR.Drone 2.0:n vakio-ohjelmistot Parrot:n mukaan [1, 3] AR.Drone 2.0 -laitteeseen sisältyy Linux. Ohjelmistoa ei kuitenkaan ole dokumentoitu muuten kuin sen käyttämien verkkoprotokollien osalta [2]. Jotta toteutetun ohjelmiston soveltuvuutta vakio-ohjelmiston rinnalle voitaisiin arvioida, suoritettiin työn osana katsaus erään AR.Drone 2.0-yksilön sisältöön. AR.Drone 2.0 toimii normaalisti avoimena WLAN-tukiasemana, johon normaalisti laitetta käytettäessä yhdistetäisiin älypuhelimella laitteen ohjaamista varten [3]. Myös muita WLAN-sovittimella varustettuja laitteita voi kuitenkin käyttää. Tässä kuvattua tarkastelua varten laitteeseen yhdistettiin kannettavalla tietokoneella. Luomassaan WLAN-verkossa AR.Drone 2.0 tarjoaa muun muassa telnet-palvelun, jonka kautta voi vuorovaikuttaa laitteen kanssa tekstipohjaisen käyttöliittymän kautta. Kun laitteeseen yhdistää telnet-asiakasohjelmalla, päästää AR.Drone 2.0 ilman salasanakyselyä käyttämään AR.Drone 2.0:ssa suoritettavaa BusyBox -komentokehottetta. Kehotteen kautta voi suorittaa muita AR.Drone 2.0-järjestelmään sisältyviä ohjelmia. Komentokehote suoritetaan käyttöjärjestelmän pääkäyttäjänä, joten järjestelmää pystyy tutkimaan hyvin esteettömästi. Tietoturvan kannalta voi pitää arveluttavana laitetta, joka käynnistyttyään automaattisesti luo avoimen WLAN-verkon ja lisäksi antaa ilman salasanakyselyä suorittaa komentokehotteen kautta mitä tahansa laitteen ohjelmistoja pääkäyttäjänä. Ratkaisun suojaamattomuus kuitenkin luultavasti haittaa laitteen käyttäjiä hyvin vähän, koska normaalissa käytössä AR.Drone 2.0:n tietojärjestelmä on käynnissä vain jotain kymmeniä minuutteja kerrallaan. Tämän työn kannalta ratkaisu on erittäin käytännöllinen, koska se mahdollistaa sekä vakio-ohjelmiston tutkimisen että mahdollisen muokkaamisen ja korvaamisen. Komentokehotteesta järjestelmää tutkimalla havaitaan, että suuri osa järjestelmän komentorivityökalusta hakemistoissa /bin, /sbin, /usr/bin ja /usr/sbin ovat symbolisia linkkejä /bin/busybox -työkaluun. Tämä on normaali käytäntö järjestelmässä, jossa BusyBoxia käytetään toteuttamaan suuri osa Linux-ytimen ulkopuolisesta käyttöjärjestelmästä.

20 20 Järjestelmästä tarkasteltiin ajossa olevia prosesseja. Havaittiin, että prosessien lukumäärä on noin 20. Määrä on Linuxiin perustuvalle järjestelmälle pieni. Suurin osa prosesseista, esimeriksi tutkimisen mahdollistava telnetd -prosessi ja WLAN-verkon osoitteita jakava udhcpd-palvelin, ovat BusyBoxin osia. Järjestelmän vapaan muistin määrä selvitettiin free-komennolla, jonka tuloste on listauksessa 1. Listauksen perusteella muistista on vakio-ohjelmistolla käytettynä noin kolme neljäsosaa. Käyttämätöntä muistia on KiB, eli noin kaksikymmentä megatavua. Ohjelmiston lisäämisen kannalta selvästi tarpeellista on, että lisättävät ohjelmistot eivät käytä kymmeniä megatavuja muistia. Jonkin verran muistia olisi tarpeen jättää myös käyttämättä. total used free shared buffers Mem: Swap: Total: Listaus 1. Keskusmuistin käyttö AR.Drone 2.0:n vakio-ohjelmistossa. Keskusmuistin lisäksi myös tallennustilaa laitteessa on rajallisesti. Listauksessa 2 olevan df-komennon tulosteen perusteella käyttämätöntä levytilaa on ohjelmisto-osiolla noin 12 megatavua ja erillisellä dataosiolla noin 50 megatavua. Tilan arvioidaan olevan enemmänkin kuin riittävä pienelle määrälle ylimääräisiä laskentarutiineja. Filesystem Size Used Available Use% Mounted on ubi1:system 26.3M 12.8M 12.2M 51% / tmp 57.7M 632.0K 57.1M 1% /tmp dev 57.7M M 0% /dev ubi0:factory 4.8M 80.0K 4.5M 2% /factory ubi2:update 13.2M 28.0K 12.5M 0% /update ubi2:data 53.5M 1.0M 49.8M 2% /data Listaus 2. Tallennustilan käyttö AR.Drone 2.0:n vakio-ohjelmistossa. Kattava käsitys AR.Drone 2.0:n vakio-ohjelmiston toiminnasta vaatisi huomattavasti perusteellisempaa tutkimista, kuin mitä tässä on tehty. Tässä esitetty katsaus kuitenkin vähäisessä määrin havainnollistaa, minkälaisesta Linuxiin perustuvasta järjestelmästä on kyse. Pääpiirteissään järjestelmä näyttäisi olevan rakennettu lähinnä Linux-käyttöjärjestelmäytimen ja BusyBoxin päälle. Tämäntyyppinen yhdistelmä on melko yleinen ja laajasti tunnettu Yhteensopivuus Kuvankäsittelyalgoritmit itsessään eivät edellytä minkäänlaista vuorovaikuttamista ulkomaailman kanssa. Tämän takia toteutettava ohjelmisto kannattaakin rakentaa siten, että laskentaa tekevät osat eivät suoraan liity käyttöjärjestelmään. Ohjelmisto tarvitsee liitännän laskennan parametrien siirtämiseen ohjelmistoon sisään ja ulos, mutta se on syytä tehdä mahdollisimman geneerisiksi ja laitteisto- ja käyttöjärjestelmäriippumattomaksi. Koska AR.Drone 2.0:n käyttöjärjestelmä perustuu Linux-ytimeen, on syytä varmistaa että toteutettu ohjelmisto soveltuu vähintään Linux-ympäristöön.

21 21 Vaikka ohjelmiston toisaalta haluttaan toimivan riittävän nopeasti juuri tietyntyyppisellä ARM-suorittimella, haluttiin sen olevan helposti hyödynnettävissä myös muunlaisella laitteistolla. Markkinoilla olevien robottihelikoptereiden tarjoamat suorittimet voivat ajan kuluessa vaihtua, ja kameran kalibrointia voi muutenkin hyödyntää robottihelikopterisovellusten ulkopuolella. helpottavan ohjelman hyödyntämistä muissa kuin tämän työn esittämässä Lisäksi mahdollisuus suorittaa ohjelmaa tai sen osia tavanomaisella PC-työasemalla helpottaa koko kehitysprosessia. Osassa suorittimia, erityisesti sulautettuihin järjestelmiin tarkoitetuissa, ei ole liukulukulaskentayksikköä. Liukulukujen laskentaoperaatioiden käyttäminen tällaisella suorittimella voi olla hidasta. Esimerkiksi Iordachen ja Tang:n [20] mukaan tehokas ohjelmistopohjainen liukulukujen toteutus ARMv5 -käskykannan toteuttavalle Intel XScale-suorittimelle käyttää yli 30 kellosykliä liukulukujen yhteenlaskuun. Työssä kehitettävän ohjelmiston halutaan toimivan, mikäli vähintään normaalin tarkkuuden liukulukuoperaatiot ovat kohdealustalla käytettävissä. Vaikka työssä on tarkoitus toteuttaa siirrettävä ohjelmisto, voidaan hyväksyä se että se toimii hitaammin laitteistolla joka soveltuu huonosti liukulukujen laskemiseen Välimuisti Nykyaikaisen tietokoneen keskusmuisti on lähes aina hidasta verrattuna suorittimen omaan laskentakapasiteettiin. Tämän takia muistia lukeva tai kirjoittava operaatio voi kestää satoja suorittimen kellosyklejä. Käytännön sovellukset vaativat yleensä suhteellisen suurikapasiteettista muistia, mutta sekä nopeudeltaan että kapasiteetiltaan suuret muistit ovat epäkäytännöllisen kalliita. Tyypillisesti tietokoneet piilottavat suurikapasiteettisen keskusmuistin pitkän vasteajan käyttämällä pienikapasiteettista, nopeaa muistia välimuistina. Välimuisti on yleensä toteutettu niin, että sen toiminta on ohjelmoijalle läpinäkyvää. Järjestys, jossa ohjelma käsittelee muistissa olevaa tietoa, voi kuitenkin vaikuttaa ohjelmiston suorituksen vaatimaan aikaan jopa useita suuruusluokkia. [21] Tyypillisesti välimuistin kannalta muisti on jaettu välimuistiriveihin (eng. cache line), jotka tavallisimmin ovat 64 tavun kokoisia. Osasta keskusmuistin sisällöstä pidetään kopioituna välimuistiin. Kun suoritin pyytää muistista tietoa josta on kopio välimuistissa, tilannetta kutsutaan välimuistiosumaksi (eng. cache hit). Välimuistiosuman tapauksessa tietoa muistista lataava käsky saadaan suoritettua nopeasti, koska hidasta keskusmuistia ei jouduta odottamaan. Kun muistista tarvitaan sellaista dataa joka ei satu olemaan välimuistissa, joudutaan välimuistihuti (eng. cache miss) käsittelemään lataamalla haettu tieto keskumuistista. [21] DRAM-muistin liitäntä tyypillisesti vaatii useita muistin kellosyklejä, että muistiväylää pitkin lähetetty komentosekvenssi tuottaa muistin sisältöä väylälle. Sekvenssiä hieman pidentämällä voidaan kuitenkin ladata kerralla useita tavuja. Välimuistihuti käsitelläänkin yleensä siten, että muistista ladataan halutun tavun tai sanan sisältävä välimuistirivi kokonaisuudessaan välimuistiin. [21] Mikäli ohjelmiston osassa käsiteltävä tietomäärä mahtuu kokonaan L1d-välimuistiin, ei Drepper:n [21] mittauksissa havaita suurta eroa suorituskyvyssä satunnaisten ja peräkkäisten muistinkäsittelyoperaatioiden välillä. Suuremmilla tietomäärillä erot ovat kuitenkin hyvin merkittäviä. Drepper:n käyttämässä esimerkkitapauksessa yksinker-

22

23 23 käsittelyjärjestyksen voi valita vapaasti, kannattaa se valita siten että kaikki samaan välimuistiriviin sisältyvät pikselit käsitellään peräkkäin. Tällöin yhteen välimuistiriviin sisältyvän pikseliryhmän käsittelyssä muut kuin ensimmäinen käsiteltävä pikseli ovat todennäköisesti valmiiksi L1d-välimuistissa kun niitä tarvitaan. Cortex-A8-suorittimessa ohjelmoija voi tehostaa välimuistimekanismin toimintaa käyttämällä ARMv7-käskykannan PLD-käskyä. PLD-käskyllä suorittimelle kerrotaan, että jostain muistiosoitteesta tullaan lataamaan hetken kuluttua. Dokumentaation mukaan Cortex-A8 reagoi PLD-käskyyn lataamalla käskyn parametrina annetun muistiosoitteen L2-välimuistiin mikäli se ei jo valmiiksi ole L1d-välimuistissa tai L2-välimuistissa. [22] PLD-käskyllä voi vähentää L2-hudista aiheutuvaa viivettä, koska välimuistirivien lataaminen välimuistiin saadaan sen avulla aloitettua jonkin verran ennen kuin se tehtäisiin ilman PLD-käskyä. PLD-käskystä saatava hyöty on kuitenkin hyvin suoritinriippuvainen, koska ARMv7-arkkitehtuuridokumentaation mukaan suorittimen toteuttajalla on hyvin vapaat kädet sen suhteen, miten käskyyn reagoidaan. Eräs sallittu ratkaisu on esimerkiksi jättää käsky kokonaan huomiotta. [23] Drepper [21] varoittaa ennakkolataamisen olevan haasteellista. Eräs mainittu ongelma on, että liiallinen ennakkolataaminen voi korvata välimuistista hyödyllisiä välimuistirivejä vähemmän hyödyllisillä. Kuvankäsittelyrutiineissa esimerkiksi kuvadatan liiallinen ennakkolataaminen voisi huonontaa suorituskykyä, mikäli ennakkolataaminen todennäköisesti aiheuttaisi kameran kalibrointiparametrit sisältävän välimuistirivin ennenaikaisen poistumisen välimuistista. Lisäksi sopivan latausennakon valitsemiseen joutuu kiinnittämään huomiota. Liian myöhään lataaminen auttaa vain vähän, ja liian aikaisin lataamalla ennakkoladattu tieto saattaa poistua välimuistista ennen kuin se hyödynnetään. Mikäli ennakkolataamista hyödynnetään vain huolella valituissa osissa ohjelmistoa, voi niiden hyödyllisyyden varmistaa mittaamalla niistä saatavan nopeusedun Ohjelmointikielet Linux-käyttöjärjestelmäytimen päällä on mahdollista suorittaa ohjelmia, jotka voivat olla toteutettu millä tahansa suuresta joukosta ohjelmointikieliä. Esimerkiksi C, C++, Java ja Python olisivat tarvittaessa käytettävissä. Työssä toteutettava ohjelmisto on kuitenkin erityisen mielekäs toteuttaa matalan tason kielillä, koska toteutettaviin algoritmeihin ei liity lainkaan esimerkiksi tietoverkkojen käyttöä tai tekstimuotoisen datan käsittelyä. Toisaalta algoritmit toteutetaan juuri numeerisen laskennan kautta, jolloin on edullista suorittaa ohjelmakoodia suoraan prosessorilla eikä esimerkiksi javan virtuaalikoneen tulkkaamana. Lisäksi AR.Drone 2.0:n tapauksessa käytettävän laitteiston tallennuskapasiteetti kokonaisuudessaan on 128 MiB, joten korkean tason toteutusalustan vaatimat ajonaikaiset kirjastot (eng. runtime) voivat kokonsa puolesta olla ongelmallisia. Yleinen piirre korkean tason kielissä on myös se, että ohjelmoija ei välttämättä voi helposti vaikuttaa siihen, miten käsiteltävä muisti jaetaan eri osiin muistia. Luvussa 3.3 mainitut välimuistien erityispiirteet on siksi helpompi huomioida ohjelmoitaessa matalan tason kielillä.

24 24 Sulautetuissa järjestelmissä yleisiä matalan tason ohjelmointikieliä ovat C ja C++ ja suoritinarkkitehtuurikohtaiset assembly-kielet. Näistä jälkimmäisten käyttäminen on ristiriidassa sen kanssa, että toteutettava ohjelma on yhteensopiva erilaisten suorittimien kanssa. C ja C++ kuitenkin ovat molemmat mahdollisia ratkaisuja. Sekä C:n että C++:n määritelmissä osa kielen semantiikasta on jätetty kieltä toteuttavan tahon määriteltäväksi. Esimerkiksi int-muuttujatyypin tallentamiseen jokin toteutus voi käyttää kaksi tavua, jolloin sen arvoalue olisi kokonaisluvut alkaen luvusta ja päättyen lukuun Jossain toisessa toteutuksessa int-tyypin koko voi olla neljä tavua, missä tapauksessa int-tyyppisen muuttujan arvo voisi olla vähintään ja korkeintaan Muun muassa tästä, mutta myös muista eroista johtuen sama ohjelma voi käyttäytyä eri kielen toteutuksilla eri tavalla. Esimerkiksi listauksen 3 funktio parametrilla 200 palauttaa tuloksenaan luvun , mikäli int-tyypin koko on 2 tavua. Jos taas int-tyypin koko on 4 tavua, saadaan tuloksena int foo(int a) { return a * a + 2 * a; } Listaus 3. Esimerkki funktiosta, jonka toimintaa C-standardi ei kokonaan määrittele. Ohjelmointikielen toteutuksella tässä työssä tarkoitetaan kaikkia niitä asioita, mitkä vaikuttavat eroihin joita kielen määritelmän mukaisesti kirjoitetun ohjelman käyttäytymisessä voi havaita. Esimerkiksi GNU GCC kääntäjän long-tyyppi on 4 tavun kokoinen ARMv7-suoritimelle ohjelmia kääntävässä kokoonpanossa, mutta 8 tavun kokoinen käännettäessä X86-64:lle. Tämän vuoksi listauksen 4 ohjelma tulostaa eri tekstin riippuen siitä, mille suorittemelle se on käännetty. #include <stdio.h> int main() { int const i = sizeof(long); printf("size of long is %d\n", i); return 0; } Listaus 4. C99-standardin mukainen ohjelma, jonka tuloste riippuu käytettävästä C- kielen toteutuksesta. Työssä kehitetettävän ohjelmiston halutaan toimivan samalla tavalla riippumatta siitä, mitä ohjelmointikielen toteutusta käytetään. Yksikään edellä mahdollisiksi ohjelmiston toteutuskieliksi esitetyistä ohjelmointikielistä ei ole määritelty siten, että kaikki määritelmän mukaiset ohjelmat tuottaisivat kaikissa tapauksissa samat tulokset. Tämän vuoksi ohjelmistoa kehitettäessä kiinnitetään erityistä huomiota siihen, että valitun kielen toteutusten erot eivät vaikuta ohjelmiston käyttäytymiseen.

25 Pohdinta AR.Drone 2.0:n tarjoamat laskennalliset resurssit ovat sulautetuksi järjestelmäksi suhteellisen suuret. Kokonaisia kuvia käsittelevät toimenpiteet, kuten kuvan korjaus perspektiivimallin mukaiseksi, ovat kuitenkin käytettävissä oleviin resursseihin nähden raskaita. AR.Drone 2.0:n etukameran tuottamat x720 -kokoista kuvaa sekunnissa tarkoittavat, että 1 GHz suorittimella on noin 36 kellosykliä aikaa yhden kuvapisteen käsittelyyn. Yksittäinen muistia lukeva käsky voi huonossa tapauksessa vaatia jopa satoja kellosyklejä suoritinaikaa. Jos muistin lukemisesta aiheutuu näin suuri viive jokaisen korjattavan kuvan kuvapisteen kohdalla, on selvää, että kaikkia 30 kuvaa sekunnissa ei ehditä korjata. Luvussa 3.3 esitettyihin ilmiöihin huomiota kiinnittämällä huolehditaan siitä, että suorittimen välimuistijärjestelmä saa lyhennettyä muistin käytöstä aiheutuvaa viivettä. Kohdejärjestelmän tarkastelusta päätellään, että kovin suurta ohjelmistoa AR.Drone 2.0:ssa ei voi suorittaa. Levytilan määrä on rajallinen, mutta erityisesti keskusmuistia ei sovi käyttää paljoa. Käsiteltävän muistimäärän minimoimisesta on myös se etu, että suurempi osa käsiteltävästä tiedosta mahtuu välimuistiin. Koska ohjelmiston toteutuksessa on tarve voida hallita muistin käyttöä sekä määrällisesti että asettelun ja tietorakenteiden osalta, matalan tason ohjelmointikielten käyttö toteutukseen on luontevaa. Uudelleenkäytettävyyden maksimoimiseksi kannattaa kuitenkin mahdollisimman suuri osa ohjelmistosta toteuttaa alustariippumattomaksi.

26 26 4. KEHITETTY OHJELMISTO Opinnäytetyön ohjelmisto-osuus toteuttaa luvussa 2.5 esitellyn Kannala-Brandt -kameramallin mukaisia menetelmiä. Toteutetun ohjelmiston avulla voi sulautetussa järjestelmässä hyödyntää Kannalan kirjoittaman kalibrointiohjelmiston [17] suorittamaa kameran kalibrointia. Ohjelmisto on vapaasti hyödynnettävissä ja ladattavissa osoitteesta https://bitbucket.org/muep/twirl. Työssä toteutettu ohjelmisto koostuu noin 8000 rivistä C++-lähdekoodia. Ohjelmisto on yhteensopiva ainakin GNU GCC 4.8 -kääntäjän ja LLVM Clang 3.3 -kääntäjän kanssa. Ohjelmiston keskeisimmät osat ovat yhteensopivia myös Microsoft Visual Studio Express 2013 for Windows -kääntäjän kanssa. Perinteisemmän C-kielen sijaan C++-kieltä käytetään sen tarjoamien lisäominaisuuksien takia. Toteutettu ohjelmisto koostuu joukosta moduuleja, joiden piirteitä esitellään jäljempänä. Ohjelmiston keskeisin osa on kuvaprosessointirutiinit toteuttavasta lähdekoodista koostuva Twirl-kirjastomoduuli. Kirjasto toteuttaa joukon puhtaita laskentaoperaatioita ja tarjoaa helppokäyttöisen ohjelmointirajapinnan niiden käyttöön. Muita toteutetun ohjelmiston moduuleita ovat uudelleenkäytettäviä apurutiineita sisältävä Twirr-kirjasto, suorituskyvun mittauksessa käytettävä benchmarks-työkalukokoelma, kalibrointiobjektin kontrollipisteitä havaitseva ctrlpoint_extractor -työkalu, twirl-cmd -komentorivityökalu, graafinen twirl_viewer -työkalu ja joukko automaattisia testejä Twirl-kirjasto Twirl-projektin twirl -kirjasto sisältää kameraa mallintavia laskurutiineja. Rutiinien toteutuksessa kiinnitettiin erityistä huomiota ohjelmiston siirrettävyyteen. Niiden hyödyntäminen vaatii C++-kääntäjän lisäksi C-standardikirjaston seuraavat asiat: stdint.h -otsikkotiedoston kokonaislukutyypit memcpy -funktio math.h -otsikkotiedoston trigonometriafunktiot Niiltä osin kuin Twirl-kirjaston toiminnallisuus vaatii muistin varaamista dynaamisesti ohjelman ajon aikana, on sen varaaminen jätetty täysin kirjastoa käyttävän ohjelman vastuulle. Kirjasto itse käyttää vain paikallisia muuttujia ja kutsuvasta ohjelmasta välitettyä muistia tietojen tallentamiseen ja käsittelyyn. Dynaamisen muistinvarauksen välttämisellä voidaan jonkin verran parantaa ohjelman siirrettävyyttä. Esimerkiksi AVR-mikrokontrollereilla malloc -funktion käyttö on usein vaativaa [24]. Muistin varaamisen lisäksi Twirl-kirjastossa vältetään myös kaikenlaisia muita sivuvaikutuksia, kuten tiedostojen tai globaalien muuttujien kirjoittamista. Kaikki kirjastossa käsiteltävä tieto on siis joko sen paikallisissa muuttujissa tai kirjastoa kutsuvan ohjelman varaamassa muistissa. Siten esimerkiksi monisäikeinen ohjelmisto voi kutsua kirjaston funktiota ongelmitta monesta säikeestä, kunhan se varmistaa että muut säikeet eivät kirjoita samoihin osoitin- tai viittausparametreina välitettyihin muistin osiin.

27 27 namespace twirl { struct polynomy { /*... */ real_t derivative(const real_t * coeffs, uint_fast16_t polynomial_order, uint_fast16_t derivative_order, real_t x) const; /*... */ }; } Listaus 5. twirl::polynomy::derivative -funktion esittely Kirjaston laskentafunktioiden toteutuksissa C++:n ominaisuuksista pyrittiin käyttämään vain sellaisia, joista ei aiheudu merkittävää eroa suorituskyvyssä tai siirrettävyydessä verrattuna C-kieliseen vastaavaan ohjelmaan. Näiltä osin täysin ongelmattomia piirteitä ovat esimerkiksi nimiavaruudet, viittaukset ja muuttujien tyypin automaattinen valinta (ns. auto -tyypiset muuttujat). Edellä mainittujen funktioiden toteutuksessa C++:n template-toimintoja käytetään huolimatta siitä, että niiden varomaton käyttö saattaa paisuttaa käännetyn ohjelman kokoa. Kääntäjän generoiman konekielisen koodin kokoa seuraamalla voi kuitenkin havaita tilanteet, joissa ohjelman osasta meinaa syntyä liian suuri konekielinen vastine. Tarvittaessa ohjelman osan voi toteuttaa uudelleen ilman template-toimintoja. Rakenteet, joita erityisesti vältettiin laskentafunktioiden toteutuksissa, olivat muun muassa poikkeukset, virtuaaliset luokkien jäsenfunktiot ja dynaaminen muistin varaaminen. Näistä rajoituksista johtuen myöskin C++:n standardikirjaston käyttö rajattiin twirl-kirjaston ulkopuolelle. Kirjasto toteutettiin siten, että sen käyttämän liukulukutietotyypin voi valita käännön asetustentekovaiheessa. Käytännössä tätä mahdollisuutta ei juuri hyödynnetty ja kaikissa tämän työn osissa voi olettaa että twirl::real_t on oikeasti float. Ohjelmistossa käytetyn twirl::real_t -tyypin voi kuitenkin tarvittaessa vaihtaa helposti tarkoittamaan C++:n double-tyyppiä Polynomit Kannala-Brandt -kameramallin määritelmässä esiintyy polynomifunktioita ja niiden derivaattoja ja käänteisfunktioita. Niiden laskemiseen toteutettiin polynomy-niminen moduuli, joka tarjoaa funktiot edellä mainittuihin toimintoihin. Moduulin toteutuksessa tärkeimpiä osia on twirl::polynomy::derivative -funktio, joka laskeen N:n asteen polynomifunktion M:nnen derivaatan kohdassa x, missä N voi olla mikä tahansa kokonaisluku ja M joko 0, 1 tai 2. Funktion esittely on listauksessa 5. Huomioitavaa twirl::polynomy::derivative -funktiossa on, että sen rajapinta on tarpeettoman joustava. Joustavuudesta funktion konekieliseen vastineeseen seuraa ehdollisia hyppykäskyjä, joissa suoritin voi joutua pysäyttämään laskentalinjaston. Cortex- A8:n tapauksessa hyppykäskystä seuraava viive on 13 kellosykliä, mikäli suoritin ei ennakoi ehdollisen hyppykäskyn jälkeistä ohjelmalaskurin arvoa oikein [22].

28 28 namespace twirl { /*... */ real_t polynomy::value_135(const real_t * const k, real_t const x) const { real_t const poly[] = { 0, k[0], 0, k[1], 0, k[2] }; return this->derivative( poly, 5, 0, x ); } /*... */ } /* namespace twirl */ Listaus 6. twirl::polynomy::value_135 -funktion totetutus. Toteutettu ohjelmisto tekee suuren määrän polynomilaskuja, joissa polynomin aste ja nollasta poikkeavien kertoimien sijannit ovat kiinnitettyjä. Tämän vuoksi usein toistuville erikoistapauksille polynomy-moduulissa on omat funktionsa, joissa rajapinta ei ole derivative-funktion tavoin joustava. Esimerkiksi listauksen 6 value_135-funktion, laskee arvon polynomille jossa vain ensimmäisen, kolmannen ja viidennen asteen kertoimet ovat nollasta poikkeavia. Toteutus value_135 -funktiolle kirjoitettiin siten, että se luo vaaditut ylimääräiset parametrit paikallisiksi muuttujiksi ja kutsuu yleiskäyttöistä derivative-funktiota. Suoraan käännettynä tällaisen funktion toteutus olisi korkeintaan yhtä nopea kuin sen kutsuma derivative-funktio. Käytännössä kääntäjän on mahdollista tuottaa huomattavasti derivative-funktiota nopeampi konekielinen vastine value_135-funktiolle. Nopeaan toteutukseen käännetään mukaan inline-kopio sellaisesta derivative-funktiosta, jossa value_135:ssa vakioksi asetetut parametrit ovat vakioita. Esimerkiksi työssä käytetty GCC 4.8 -kääntäjä tuottaa value_135:sta listauksen 7 mukaisen konekielisen vastineen. Koska kääntäjä havaitsee, että derivative-funktion silmukan kierrosmäärä on annetuilla parametreilla vakio, voi se poistaa silmukan ja luoda tilalle suoraan kertolaskukäskyt, jotka vastaavat poistetun silmukan suorittamia aritmetiikkakäskyjä. Listauksen 7 käännöksessä kaikki laskenta mahtuu käytettävissä oleviin rekistereihin. Konekielisen ohjelman ei tarvitse esimerkiksi luoda muistiin kuuden alkion real_t -taulukkoa tai silmukkarakenteita, vaikka lähdekoodia seuraamalla sellaiset voi havaita. Laskenta pystytään siis määrittelemään yhden kerran joustavarajapintaisella, hitaalla funktiolla, josta kääntäjä optimoi nopeammin toimivan erikoistapauksen. Testatuista kääntäjistä sekä Clang että GCC tuottivat myös x alustalla value_135-funktiosta vastaavanrakenteisen konekielisen funktion.

29 c <twirl::polynomy::value_135(float const*, float) const>: 44c: ed9f7a1d vldr s14, [pc, #116] ; 4c8 450: eef07a47 vmov.f32 s15, s14 454: edd06a00 vldr s13, [r0] 458: ed913a00 vldr s6, [r1] 45c: edd02a01 vldr s5, [r0, #4] 460: edd03a02 vldr s7, [r0, #8] 464: edd14a01 vldr s9, [r1, #4] 468: ed904a03 vldr s8, [r0, #12] 46c: ee467a87 vmla.f32 s15, s13, s14 470: ed905a04 vldr s10, [r0, #16] 474: edd16a02 vldr s13, [r1, #8] 478: ed906a05 vldr s12, [r0, #20] 47c: e24dd018 sub sp, sp, #24 480: ee223a83 vmul.f32 s6, s5, s6 484: ee407a03 vmla.f32 s15, s0, s6 488: ee633a87 vmul.f32 s7, s7, s14 48c: eef05a47 vmov.f32 s11, s14 490: ee207a00 vmul.f32 s14, s0, s0 494: ee477a23 vmla.f32 s15, s14, s7 498: ee644a24 vmul.f32 s9, s8, s9 49c: ee207a07 vmul.f32 s14, s0, s14 4a0: ee477a24 vmla.f32 s15, s14, s9 4a4: ee655a25 vmul.f32 s11, s10, s11 4a8: ee207a07 vmul.f32 s14, s0, s14 4ac: ee477a25 vmla.f32 s15, s14, s11 4b0: ee200a07 vmul.f32 s0, s0, s14 4b4: ee267a26 vmul.f32 s14, s12, s13 4b8: ee477a00 vmla.f32 s15, s14, s0 4bc: eeb00a67 vmov.f32 s0, s15 4c0: e28dd018 add sp, sp, #24 4c4: e12fff1e bx lr 4c8: word 0x Listaus 7. twirl::polynomy::value_135 -funktion ARM-käännös Matriisit Pienten matriisien perusoperaatioiden laskemiseen kirjoitettiin C++-malli (eng. template), jonka toteutuksen oleellisimpia piirteitä on poimittu listaukseen 8. Malli kokonaisuudessaan on saatavilla toteutetun ohjelmiston tiedostosta include/twirl/matrix.hpp. Matriiseja tarvitaan lähinnä Kannala-Brandt -mallin käänteisessä projisoinnissa, joten sen merkitys ohjelmiston suorituskyvylle ei ole erityisen suuri. C++-malleille perinteinen käyttöesimerkki olisi tyypin suhteen geneeristen tietorakenteiden kirjoittaminen. Tässä tapauksessa mallissa ei ollut tarvetta hyödyntää useita tietotyyppejä, joten se kirjoitettiin käsittelemään ainoastaan twirl::real_t -tyyppisiä lukuja. Tyypin sijaan mallin geneerisyys liittyykin matriisin kokoon. Käytännössä ratkaisusta seuraa, että ohjelmointikielen tyyppijärjestelmä kohtelee erikokoisia matriiseja eri tyyppeinä. Matriisityypeille tämä sopii erityisen hyvin, koska matriisien kertolaskuoperaatiot on perinteisesti määritelty vain yhteensopivan kokoisille matriiseille. Kuten listauksen 8 viimeisistä riveistä havaitaan, ovat mallin luomat tyypit rakenteeltaan C-tyylisiä 2-ulotteisia taulukoita (eng. array), jotka on pakattu struct:n sisään. Tämä sopii hyvin tavoitteeseen välttää dynaaminen muistin varaaminen. Toisaalta valittu toteutus voi käyttää suhteellisen paljon muistia paikallisille muuttujille, mikä joissain järjestelmissä voisi olla ongelma. Esimerkiksi neljän rivin neliömatriisissa olisi 16 4 tavun kokoista alkiota, jolloin koko muuttujan koko olisi 64 tavua. AR.Drone

30 30 template <int H, int W> struct matrix { /* constructors... */ template<int W2> matrix<h,w2> operator*(const matrix<h,w2> &o) const { /*... */ } matrix operator*(real_t const v) const { /*... */ } matrix operator+(const matrix &o) const { /*... */ } static matrix identity() { /*... */ } static matrix ones() { /*... */ } real_t a[h][w]; }; Listaus 8. twirl::matrix -mallin pääpiirteitä. 2.0:n tapauksessa ongelmaa ei pitäisi kuitenkaan olla, koska Linux-ohjelmissa funktiokutsupinon kokoa ei yleensä ole rajattu erityisen pieneksi. Matriisirakenteita voisi käyttää ohjelmakoodissa esimerkiksi listauksen 9 mukaisesti. Listauksen f-funktiossa luodaan aluksi kahden rivin ja kolmen sarakkeen kokoinen matriisi, jonka arvot alustetaan paikallisista muuttujista. Toinen, kolmirivinen ja kaksisarakkeinen matriisi luodaan 1-alkioita sisältävän matriisin alustavalla funktiolla. Matriisien kertolasku tuottaa kaksirivisen neliömatriisin joka annetaan g-funktiolle parametrina. Matriisien toteutustapa on varsin käytännöllinen käyttää. Toisaalta se voi kuitenkin johtaa tarpeettoman suureen määrään paikallisia muuttujia. Mikäli riittävän suuri osa void g(const twirl::matrix<2,2> &mx); void f() { using twirl::matrix; using twirl::real_t; real_t const values[] = { 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f }; auto const m0 = matrix<2,3>(values); auto const m1 = matrix<3,2>::ones(); auto const m2 = m0 * m1; } g(m2); Listaus 9. Esimerkki twirl::matrix -mallin käytöstä.

31 31 laskettavien matriisien alkioista tunnetaan nolliksi, voisi mahdollisesti ainakin suorituskykykriittisissä osissa ohjelmaa sieventää kertolaskuoperaatiot paperilla ja kirjoittaa vain sievennetyt lausekkeet ilman tähän työhön toteutettua matriisimoduulia. Luvussa esitettyjen matriisilausekkeiden kirjoittamisessa ratkaisu kuitenkin koettiin hyväksi Kannala-Brandt -mallin toteutus Totetettuun ohjelmistoon kirjoitettiin twirl::kannala -niminen moduuuli joka toteuttaa luvussa 2.5 esitetyt yhtälöt. Moduuli projisoi molempiin suuntiin, eli sille voi sekä antaa valonsäteen tulokulman ja saada vastauksena pikselin sijainnin, että selvittää tulokulman joka vastaa jotain tunnettua pikselin sijaintia. Moduulin laskenta toteutettiin suoraan luvun 2.5 lausekkeista. Osalle lausekkeista derivoitiin paperilla vastaavat derivaattalausekkeet, mutta polynomilausekkeiden tapauksessa voitiin hyödyntää polynomy-moduulin sisäänrakennettua derivaattatoiminnallisuutta. Mallin toteutus vaatii monessa kohdassa sinin ja kosinin laskemista (θ, φ)-kulmaparin φ-kulmalle. Lisäksi osa funktioista tarvitsi arvot lausekkeille sin(2φ) ja cos(2φ). Tämän takia toteutettiin mallin rajapinta sellaiseksi, että twirl::kannala -moduulin funktioita kutsuva koodi laskee kyseiset arvot valmiiksi mikäli niitä tarvitaan. Arvojen laskeminen tapahtuu käytännössä muuntamalla twirl::ray_direction -muuttuja twirl::kannala::raydir_plus -tyyppiseksi, jolloin tyypin toteutus huolehtii arvojen täyttämisestä paikalleen. Listaukseen 10 on poimittu raydir_plus -tyypin oleellisimmat piirteet. Tyyppi on periytetty yksinkertaisesta ray_direction -tyypistä, koska sen haluttiin joka tapauksessa sisältävän alkuperäisen kulmatiedon. Myöskin on käytännöllistä että tyypin muuttujia voi suoraan käyttää tilanteissa, missä voi käyttää laajentamatonta ray_direction -muuttujaa. Muodostin raydir_plus -tyypille kuitenkin on sellainen, että korotus suurempaan tyyppiin pitää tehdä explisiittisesti. Tämä helpotti ohjelmiston kehitystä vaiheessa, jossa sini- ja kosinifunktioiden kutsujen määrää pyrittiin minimoimaan suoritinaikavaatimusten pienentämiseksi. Vastaavasti kuin raydir_plus -luokalla laajennettiin twirl::ray_direction -tyyppiä, laajennettiin raydir_plus-tyypistä edelleen raydir_plus2, jossa on myös kaksinkertaisen φ:n sini ja kosini Kuvan korjaus perspektiivimallin mukaiseksi Ohjelmiston reproject -komponentilla voi muuntaa kokonaisia Kannala-Brandt -mallin mukaisia kuvia perspektiivimallin mukaisiksi. Tätä varten toteutettuun ohjelmistiin sisältyy pinhole-nimoinen moduuli, jonka avulla voi laskea, mihin pikseliin jonkin perspektiivikameran havaitsema valonsäde osuu. Vastaavasti kuin Kannala-Brandt - mallille, tästäkin laskennasta on toteutettu myös käänteinen versio joka kertoo, mikä valonsäde vastaa jotain tunnettua pikseliä. Laskenta toteutettiin suoraan yhtälön (5) mukaisesti, jotta sille muodostuva ohjelmointirajapinta olisi mahdollisimman saman-

32

33

34 34 void correct_with_lut(const lut_entry *const lut, uint32_t const from_pos, uint32_t const to_pos, uint32_t const black, const uint32_t * const data_in, uint32_t * const data_out) { for (uint32_t pos = from_pos; pos < to_pos; ++pos) { auto const entry = lut[pos]; #ifdef TWIRL_USE_ARM_TWEAKS { int const pld_offset = 7; const void * const p = lut + (pos + pld_offset); asm( "pld [%[foo]]" /* asm */: : /* output operands */ [foo] "r" (p) : /* input operands */ /* clobber list */ ); } #endif auto const color = detail::is_invalid(entry)? black : data_in[entry.offset]; } } data_out[pos] = color; Listaus 11. twirl::reproject::correct_with_lut -funktio Hakutaulun luonti edellyttää funktiota, joka tekee lähes tarkalleen samat asiat kuin luvussa esitelty mekanismi. Hakutaulua ja listauksen 11 funktiota käyttämällä korjauksen pitäisi kuitenkin tapahtua huomattavan nopeasti, koska nyt korjausfunktio joutuu jokaiselle pikselille tekemään vain pienen joukon hyvin keveitä operaatioita. Aluksi haetaan hakutaulusta yksi 32 bitin kokonaisluku, joka kertoo vastinpikselin sijainnin. Sijaintimuuttujan arvoalueesta arvo 0xffffffff käytettiin merkitsemään korjatun kuvan sijainteja, joille korjattavassa kuvassa ei ole vastinpikseleitä. Listauksessa näkyvä is_invalid -funktiokutsu tekee siis vain yhtäsuuruusvertailun vakioarvoa vasten. Listauksen 11 TWIRL_USE_ARM_TWEAKS -esikääntäjämakrosta riippuen ehdollisesti käännetty lohko on suorituskykyoptimointi, joka ei vaikuta funktion antamiin tuloksiin. Optimointi hyödyntää luvussa 3.3 esiteltyä ARMv7-käskykannan PLDkäskyä. Koska lut-parametrina saadun taulukkon alkioita käydään läpi lineaarisesti, voidaan suoritimelle käskyn avulla etukäteen ilmaista, että lut-taulun nykyisen kohdan lisäksi myös seuraavia alkioita tullaan tarvitsemaan pian. Lohkossa käytetty pld_offset on ennakon suuruus, joka kertoo, kuinka monen taulukon alkion päästä esiladataan. Ennakon suuruuden valintaa ja sen vaikutuksia käsitellään jäljempänä luvussa Hakutaulukko-optimoitu korjausfunktio koostuu jokaiselle pikselille suoritettavasta silmukasta joka sisältää lähes pelkästään muistin lukemista ja kirjoittamista. Tämän vuoksi on luultavaa, että luvussa 3.3 esitetyllä välimuistin toiminnalla on merkittävä vaikutus funktion suorituskykyyn.

35 correct_with_lut: 414: e cmp r1, r2 418: e92d01f0 push {r4, r5, r6, r7, r8} 41c: e59d4014 ldr r4, [sp, #20] 420: 2a00001e bcs 4a0 <correct_with_lut+0x8c> 424: e add r5, r1, #1 428: e1a05105 lsl r5, r5, #2 42c: e245c004 sub ip, r5, #4 430: e add r0, r0, r5 434: e59d5018 ldr r5, [sp, #24] 438: e085c00c add ip, r5, ip 43c: e ldr r8, [r0, #-4] 440: e add r1, r1, #4 444: e ldr r7, [r0] 448: e28cc010 add ip, ip, #16 44c: e cmn r8, #1 450: e ldr r6, [r0, #4] 454: e ldr r5, [r0, #8] 458: e add r0, r0, #16 45c: ldrne r8, [r4, r8, lsl #2] 460: 01a08003 moveq r8, r3 464: e cmn r7, #1 468: ldrne r7, [r4, r7, lsl #2] 46c: 01a07003 moveq r7, r3 470: e cmn r6, #1 474: ldrne r6, [r4, r6, lsl #2] 478: 01a06003 moveq r6, r3 47c: e cmn r5, #1 480: ldrne r5, [r4, r5, lsl #2] 484: 01a05003 moveq r5, r3 488: e cmp r2, r1 48c: e50c8010 str r8, [ip, #-16] 490: e50c700c str r7, [ip, #-12] 494: e50c6008 str r6, [ip, #-8] 498: e50c5004 str r5, [ip, #-4] 49c: 8affffe6 bhi 43c <correct_with_lut+0x28> 4a0: e8bd01f0 pop {r4, r5, r6, r7, r8} 4a4: e12fff1e bx lr Listaus 12. twirl::reproject::correct_with_lut -funktion ARM-käännös Parametrina saatua lut-hakutaulua käydään läpi muistiosoitejärjestyksessä. Tämän perusteella oletetaan, että suurella todennäköisyydellä välimuistirivin alkuun sijoittuvan hakutaulukkoalkion jälkeen myös muut samalle välimuistiriville sijoittuvat alkiot luetaan, ennen kuin kyseinen välimuistirivi poistuu välimuistista jonkun muun tiedon tieltä. Korjattavan kuvan pikseleiden osalta tilanne on jännittävämpi. Esimerkiksi siirryttäessä korjatussa kuvassa yksi pikseli vasemmalta oikealle, siirtyy luultavasti myös korjattavan kuvan vastinkohta jonkin verran oikealle. Määrä kuitenkin voi olla enemmän tai vähemmän kuin yksi pikseli, ja osassa korjatun kuvan siirtymiä vastinkohta voi siirtyä myös pystysuunnassa. Luultavasti kuitenkin myös korjattavan kuvan sisältävän muistin osalta laskenta etenee ainakin osan ajasta siten, että ajallisesti lähekkäin ladataan pikseleitä jotka osuvat samalle välimuistiriville. Myös korjatun kuvan pikselit kirjoitetaan muistiosoitejärjestyksessä, minkä odotetaan olevan edullinen tilanne suorittimen muistinkirjoituspuskuroinnin kannalta. Hakutaulukkoa käyttämällä saatua suorituskykyä verrataan perustoteutukseen jäljempänä luvussa

36 Twirr-kirjasto Toteutettuun ohjelmistoon sisältyy myös toinen, Twirr-niminen uudelleenkäytettäviä komponentteja sisältävä moduuli. Erona Twirl-komponenttiin on se, että Twirr sisältää vain toiminnallisuutta joka on yhteistä Twirl:n kehittämisen tukena kehitetyille muille ohjelmille. Twirr sisältää muun muassa komentorivin jäsentämiseen käytettäviä rutiineja ja esikääntäjämakroja, joita tarvitaan osassa aputyökalujen lähdekoodia kääntäjäyhteensopivuuden parantamiseksi. Twirr-kirjaston osien ei ole tarpeen olla yhtä joustavasti käytettävissä eri alustoilla kun laskenta-algoritmien ydinosien. Tämän vuoksi sen toteutuksessa hyödynnetään C++-standardikirjaston tarjoamaa toiminnallisuutta. Eräs Twirr-kirjaston osista suorittaa luvussa esiteltyjä kuvankorjausrutiineja niin, että kuorma jaetaan usealle säikeelle. Tämän ei odoteta tuovan suorituskykyhyötyä AR.Drone 2.0:n yksiytimisellä suorittimella. Joissain muissa sulautetuissa ARMsuorittimeen perustuvissa järjestelmissä suoritinytimiä kuitenkin on kaksi tai enemmän, eikä yksinkertaisen useaan säikeeseen jakamisen toteuttaminen vaadi suurta lisäystä toteutettuun ohjelmistoon. Monisäikeistä suoritetusta sovelletaan kuvan perspektiivimallin mukaiseksi korjaavan funktion perustoteutukseen, ja lisäksi hakutaulun luontiin ja hakutaulukkoa käyttävään kuvankorjaukseen. Kaikki näistä toiminnoista on toteutettu siten, että operaatio tuottaa vain osan tuloksena saatavasta kuvasta tai hakutaulukosta. Kaikki säikeisiin jako toteutetussa ohjelmistossa toimii siten, että kuva tai hakutaulukko jaetaan pystysuunnassa valitulle määrälle säikeitä. Esimerkiksi kolmelle säikeelle jaettaessa yksi säie saa laskettavakseen korjatun kuvan ylimmät rivit, toinen keskimmäiset ja kolmas alimmat rivit. Hakutaulukon tapauksessa jako on vastaava, kun tarkastellaan hakutaulukon alkioita vastaavia kuvapisteitä. Koska kuvan korjauksen aikana kameramallin kuvaavaa tietorakennetta, lähdekuvaa tai hakutaulukkoa ei tarvitse kirjoittaa, voivat kaikki luodut säikeet turvallisesti lukea samaa kopiota niistä. Myös korjatun kuvan kuvapisteiden kirjoittaminen voidaan tehdä siten, että kukin säie kirjoittaa omalla vastuullaan olevan korjatun kuvan pisteet tai hakutaulukon alkiot suoraan samaan tuloksena saatavaan kuvaan tai hakutaulukkoon. Säikeisiin jaon toteuttava rutiini suorittaa työn jakamisen ja työn osia vastaavien säikeiden käynnistyksen. Säikeet käynnistetään C++-standardikirjaston sisältämällä std::async-funktiomallilla. Kun kaikki työn osat on näin käynnistetty, rutiini yksinkertaisesti odottaa säikeiden päättyvän. Tämän ei koeta olevan erityisen elegantti ratkaisu, koska monisäikeisessä sovelluksessa on usein muutenkin säikeitä ja esimerkiksi jonkinlainen työjono, minkä kautta laskenta kannattaisi järjestää suoritettavaksi. Mikäli valittu ratkaisu kuitenkin kykenee yksinkertaisessa käyttötilanteessa parantamaan laskennan suorituskykyä, on se riittävän hyvä osoittamaan että säikeistämällä hyötyä saavuttaa Käyttöliittymät ja testaus Twirl- ja Twirr -kirjastojen lisäksi toteutettuun ohjelmistoon sisältyy noin kaksikymmentä suoritettavaa ohjelmaa. Ohjelmat eivät ole välttämättömiä Twirl-kirjaston käyttämiseen, mutta niillä on suuri merkitys kokonaisuuden kehittämisen kannalta. Suu-

37 37 rin osa ohjelmista on yksinkertaisia testiohjelmia. Osa testiohjelmista laskee Twirlkirjaston rutiineilla tuloksia ja ilmoittaa, vastaavatko ne ennalta tunnettuja odotettuja tuloksia. Loput testiohjelmat ovat yksinkertaisia työkaluja, jotka tyypillisesti kutsuvat jotain tiettyä Twirl:n funktiota useita kertoja. Näiden työkalujen suoritusaikaa mittaamalla voi ainakin karkeasti arvioida, miten paljon suoritinaikaa kunkin ohjelman testaama funktio vaatii. Toteutettun ohjelmistoon sisältyy twirl-cmd -niminen komentorivityökalu, jonka avulla voi muun muassa tulostaa kalibrointiparametritiedoston sisältämät arvot ja korjata kuvia perspektiivimallin mukaiseksi. Työkalu on käyttökelpoinen sekä Twirlkirjaston käyttöesimerkkinä ohjelmoijalle että työkaluna ohjelmiston toiminnallisuuden testaamiseen. Kuvien korjaamisen twirl-cmd pystyy tekemään vain PNG -muotoisille kuville, joiden lukemiseen ja kirjoittamiseen se käyttää libpng-kirjastoa. Ohjelman voi tarvittaessa kääntää myös käyttämättä libpng -kirjastoa, mikäli kuvien korjaustoiminnallisuutta ei tarvita. Kuva 9. Kuvankaappaus twirl_viewer -työkalusta. Komentorivikäyttöliittymän lisäksi toteutettu ohjelmisto sisältää kuvassa 9 esitetyn, twirl_viewer -nimisen graafisen työkalun. Työkaluun voi ladata Kannala-Brandt - kameramallin parametrit ja kuvia tiedostoista. Ohjelmaan ladatut kuvat korjataan twirlkirjaston korjaustoiminnolla perspektiivimallin mukaisiksi ja näytetään käyttäjälle korjattuna. Työkalun käyttäjä voi myös halutessaan tallentaa korjatun kuvan tiedostoon. Lisäksi twirl_viewer piirtää kahta erilaista kuvaajaa, jotka auttavat hahmottamaan

38 parametrien kuvaaman kameran ominaisuuksia. Kameramallin parametreja voi muuttaa ohjelman vasemman laidan lomakkeen kautta. Twirl-viewer toteutettiin Qt-sovelluskehyksen avulla. Toisin kuin aiempana mainittu twirl-cmd, twirl_viewer käyttää twirl-kirjaston reproject-moduulin funktioita Qt:n QImage-luokan ohessa. Koska QImage-luokka tarjoaa kattavan tuen erilaisten kuvatiedostoformaattien lukemiseen ja kirjoittamiseen, kykenee twirl_viewer avaamaan PNG-muotoisten kuvien lisäksi myös esimerkiksi JPEG-kuvia. Tarkka tuettujen kuvatiedostoformaattien joukko riippuu siitä, minkä Qt-version kanssa ohjelmistoa suoritetaan. 38

39 39 5. TULOKSET Tässä osassa työtä kuvataan työssä toteutetun ohjelmiston testiympäristö, testaamiseen käytetyt menetelmät. Lisäksi ohjelmiston suorituskykyä mitataan eri alustoilla ja esitetään, miten erilaiset suorituskyvyn parantamiseen tähtäävät ratkaisut onnistuivat Testiympäristöt Työssä kehitetyn ohjelmiston suorituskykyä havainnoitiin yhteensä neljässä eri järjestelmässä, jotka on lueteltu taulukossa 1. Järjestelmistä IGEPv2 ja Jolla perustuvat ARM -arkkitehtuuria edustaviin suorittimiin. PC-1 ja PC-2 ovat tavanomaisia PCtyöasemia. Testilaittestojen esittelyssä keskitytään ensisijaisesti suorittimen ominaisuuksiin. Suorituskykyä mittaavat ohjelmat kirjoitettiin siten, että niiden ei tarvitse esimerkiksi lukea tai kirjoittaa tietoja massamuisteihin. Tämän vuoksi jätetään huomiotta esimerkiksi se, että joissain testijärjestelmissä ainoana tallennustilana toimiva SD-kortti on perinteiseen kiintolevyyn verrattuna erittän hidas. Lisäksi oletetaan, että testijärjestelmässä käytetty käyttöjärjestelmä ei suuresti vaikuta mittaustulokseen. Kaikki mittaukset tehtiin jonkin Linuxiin perustuvan käyttöjärjestelmän alaisena, mutta laitteistojen erilaisuudesta johtuen täysin identtisen ohjelmistokokoonpanon käyttäminen olisi ollut mahdotonta. Taulukko 1. Kehitetyn ohjelmiston suorituskyvyn mittauksessa käytetyt järjestelmät Nimi Suoritin Käyttöjärjestelmä IGEPv2 Cortex-A8, 720 Mhz Fedora 20 Jolla Krait 300, 2 x 1,4 GHz Sailfish OS PC-1 Pentium 4, 2.8 GHz Exherbo PC-2 AMD A8-3850, 4 x 2,9 GHz Fedora 20 Testijärjestelmistä eniten AR.Drone 2.0:n tarjoamaa ympäristöä muistuttaa kuvassa 10 havainnollistettu IGEPv2. Kuten AR.Drone 2.0:n OMAP3630 -piiri, myös IGEPv2:n OMAP3530 -piiri sisältää Cortex-A8 -suorittimen. Järjestelmät ovat siis huomattavan samankaltaiset, on niiden eroavaisuuksia lueteltu taulukossa 2. IGEPv2:n käyttöjärjestelmänä käytettiin Fedora 20:n ARMv7-suorittimille käännettyä versiota. Käyttöjärjestelmän mukana tulevaa GCC kääntäjää käytettiin kaikkien suotituskykytestissä käytettyjen ARM-binäärien kääntämiseen. Toisena ARM-arkkitehtuuria edustavana testijärjestelmänä käytettiin Jolla Oy:n Jollamatkapuhelinta. Laitteen Sailfish OS -käyttöjärjestelmä sisältää GNU/Linux -ympäris- Taulukko 2. AR.Drone 2.0:n ja IGEPv2:n eroavaisuuksia Järjestelmä AR.Drone 2.0 IGEPv2 SoC OMAP3630 OMAP3530 Kellotaajuus 1000 MHz 720 MHz L1-välimuisti 32 KiB 16 KiB Keskusmuisti 128 MiB 512 MiB

40 40 Kuva 10. IGEPv2. tön, jossa Fedora 20:n ARM-version GCC:lla käännettyjä C++-ohjelmia voi suorittaa ilman muutoksia. Jollan Qualcomm Snapdragon 400 -piiri on laskentakapasiteetiltaan huomattavasti suurempi kuin IGEPv2:ssa käytetty OMAP3530. Lisäksi mielenkiintoisena piirteenä Jollan suoritin on kaksiytiminen. Kahdesta testeihin käytetyistä PC-työasemasta vanhempi PC-1 on varustettu 32- bittisellä 2,8 GHz Pentium 4 -suorittimella. Suorittimessa on vain yksi ydin, mutta HyperThreading -toiminnon takia se voi suorittaa kahta säiettä osittain rinnakkain. PC-1:n testit käännettiin Exherbon paketoimalla GCC:n versiolla. Käytetyistä testikokoonpanoista suurin laskentakapasiteetti on PC-2:ssa. Sen suoritin edustaa vuoden 2012 tyypillistä pöytätietokoneratkaisua. Suorittimessa on 4 ydintä ja se tukee 64-bittistä X käskykantaa. Suorituskyvyn arviointia varten työssä kehitetyn ohjelmiston kääntäjäastukset valittiin suorittamalla Cmake-työkalu listauksessa 13 kuvatuilla parametreilla. Cmake käyttää annettuja parametreja ja totetutetun ohjelmiston CMakeLists.txt -tiedostoja GCCkääntäjän parametrien valintaan. Listaukseen 14 on kopioitu yhden projektiin kuuluvan tiedoston käännössä käytetyt, Cmaken valitsemat valitsimet. Käytännössä tässä käytetyillä, laitteistoriippumattomilla asetuksilla ohjelmiston laitteistolle sovittaminen jää kääntäjän vastuulle. Tässä työssä esiteltyä suorituskykyä saattaa siis olla mahdollinen parantaa ainoastaan kääntäjän asetuksia muuttamalla. Ellei toisin mainita, luvussa mainittua PLD-optimointia ei hyödynnetä suorituskykymittauksissa. Kyseisellä suoritinkohtaisella optimointimenettelyllä saavutettua nopeusetua käsitellään erikseen luvussa

41 41 env \ CFLAGS="-Wall -std=c11 -march=native" \ CXXFLAGS="-Wall -std=c++11 -march=native" \ cmake -DCMAKE_BUILD_TYPE=Release \ -DTWIRL_USE_LIBPNG=ON \ -DTWIRL_USE_QT5=ON \ -DTWIRL_USE_THREADS=ON.. Listaus 13. Käännössä käytetyt asetukset /usr/bin/c++ -Wall -std=c++11 -march=native -O3 -DNDEBUG \ -I/home/muep/src/twirl/build-bench-gcc -I/home/muep/src/twirl/include\ -o CMakeFiles/bench_reproject_lut_v2.dir/bench_reproject_lut_v2.cpp.o\ -c /home/muep/src/twirl/src/benchmarks/bench_reproject_lut_v2.cpp Listaus 14. Esimerkki GCC-kääntäjälle asetetuista valitsimista 5.2. Kalibrointi Kannala-Brandt -kameramalli kalibroitiin Matlab-työkalulla [17], joka sovittaa mallin parametrit siten että ne vastaavat mallinnettavan kameran tuottamia kuvia. Matlab-työkalua hyödynnettiin yhdessä Seppälän [25] kuvaaman kalibrointikuvasarjan avulla. Kuvasarja koostuu 20 kuvan 11 kaltaisesta kuvasta, jotka on otettu AR.Drone 2.0:n kameralla. Kussakin sarjan kuvassa on kuvattu samaa mustavalkoruutuista kalibrointiobjektia siten, että kalibrointiobjekti sijoittuu eri kohtiin kuvaa. Kuva 11. Yksi kalibrointikuvasarjan kuvista. Kuvasta 11 on silmämääräisestikin todettavissa, että ympäristön suorat piirteet eivät ole kuvautuneet suoriksi. Esimerkiksi kuvan oikeassa laidassa olevan hyllyn reuna on selvästi kaareva. Lisäksi myös kalibrointiobjektin ruuduissa voidaan havaita selvää vääristymää. Suoraan AR.Drone 2.0:n kamerasta saadut kuvat eivät siis noudata perspektiivimallia kovin hyvin, vaikka kuvasta voikin vielä helposti hahmottaa, minkälaisia esineitä kameralla on kuvattu.

42

43 43 Toteutetun ohjelmiston twirl-cmd -työkalulla korjattiin kameramallin kalibrointiin käytettyjä kuvia. Kuvassa 13 on esitetty kuva 11 korjattuna perspektiivimallin mukaiseksi. Toisin kuin kuvassa 11, kuvan 13 sisältämät suorat piirteet ovat myös kuvautuneet silmämääräisesti arvioiden suoriksi. Kuva 13. Perspektiivimallin mukaiseksi korjattu esimerkkikuva Tarkkuus Suurin osa työssä toteutetun ohjelmiston laskennasta perustuu suoraan Kannalan ja Brandt:n esittämiin suljetun muodon lausekkeisiin. Työssä ei huomioida sitä, että liukulukuaritmetiikan pyöristyksistä aiheutuu epätarkkuutta laskennan tuloksiin. Liukulukujen tarjoaman äärellisen tarkkuuden lisäksi epätarkkuutta aiheutuu kahdesta approksimaatiosta, jotka molemmat liittyvät Kannala-Brandt -kameramallin käänteisprojektiofunktion toteutukseen. Mallin symmetrisessä osassa käytetään Newtonin menetelmää kasvavan polynomifunktion nollakohdan hakemiseen. Menetelmä mahdollistaa nollakohdan tarkkuuden valinnan hyvinkin tarkaksi, mutta laskenta-ajan säästämiseksi iteroinnin lopetusehto lopettaa tarkentamisen, kun löydetään kohta, jossa polynomin arvo poikkeaa nollasta vähemmän kuin rad. Nollakohdan haussa tehtyä kompromissia suuremman virheen aiheuttaa luultavasti Kannalan esittämä approksimaatio epäsymmetrisen vääristymän käänteisfunktiolle. Kannala-Brandt -mallin mukaiseen projisointiin ei liity vaiheita, joissa poikettaisiin Kannalan ja Brandt:n esittämistä lausekkeista muuten kuin liukulukuoperaatioissa tapahtuvien pyöristyksen osalta. Mallin käänteisprojisoinnin tarkkuutta arvioidaan tässä verrattuna eteenpäin projisoinnin tuloksiin. Luvussa 5.2 esitellyllä esimerkkikalibroinnilla laskettiin käänteisprojektio jokaiselle 1280x720-kokoisen kuvan pikselille, mistä tuloksena saatu valonsäteen suunta taas projisoitiin. Mikäli käänteismalli olisi ideaalisen tarkka, päästäisiin näin tekemällä samoihin pikseleiden sijainteihin.

815338A Ohjelmointikielten periaatteet Harjoitus 3 vastaukset

815338A Ohjelmointikielten periaatteet Harjoitus 3 vastaukset 815338A Ohjelmointikielten periaatteet 2015-2016. Harjoitus 3 vastaukset Harjoituksen aiheena ovat imperatiivisten kielten muuttujiin liittyvät kysymykset. Tehtävä 1. Määritä muuttujien max_num, lista,

Lisätiedot

TAMPEREEN TEKNILLINEN YLIOPISTO Digitaali- ja tietokonetekniikan laitos. Harjoitustyö 4: Cache, osa 2

TAMPEREEN TEKNILLINEN YLIOPISTO Digitaali- ja tietokonetekniikan laitos. Harjoitustyö 4: Cache, osa 2 TAMPEREEN TEKNILLINEN YLIOPISTO Digitaali- ja tietokonetekniikan laitos TKT-3200 Tietokonetekniikka I Harjoitustyö 4: Cache, osa 2.. 2010 Ryhmä Nimi Op.num. 1 Valmistautuminen Cache-työn toisessa osassa

Lisätiedot

Malleja ja menetelmiä geometriseen tietokonenäköön

Malleja ja menetelmiä geometriseen tietokonenäköön Malleja ja menetelmiä geometriseen tietokonenäköön Juho Kannala 7.5.2010 Johdanto Tietokonenäkö on ala, joka kehittää menetelmiä automaattiseen kuvien sisällön tulkintaan Tietokonenäkö on ajankohtainen

Lisätiedot

Luento 1 Tietokonejärjestelmän rakenne

Luento 1 Tietokonejärjestelmän rakenne Luento 1 Tietokonejärjestelmän rakenne Järjestelmän eri tasot Laitteiston nopeus 1 Tietokonejärjestelmä Käyttäjä Tietokonelaitteisto Oheislaitteet (peripheral or I/O devices) Tietokone (computer) 2 Luento

Lisätiedot

CUDA. Moniydinohjelmointi 17.4.2012 Mikko Honkonen

CUDA. Moniydinohjelmointi 17.4.2012 Mikko Honkonen CUDA Moniydinohjelmointi 17.4.2012 Mikko Honkonen Yleisesti Compute Unified Device Architecture Ideana GPGPU eli grafiikkaprosessorin käyttö yleiseen laskentaan. Nvidian täysin suljetusti kehittämä. Vuoden

Lisätiedot

Luento 1 (verkkoluento 1) Tietokonejärjestelmä

Luento 1 (verkkoluento 1) Tietokonejärjestelmä Luento 1 (verkkoluento 1) Tietokonejärjestelmä Järjestelmän eri tasot Ohjelman sijainti Ohjelman esitysmuoto Laitteiston nopeus 1 Tietokonejärjestelmä Käyttäjä This image cannot currently be displayed.

Lisätiedot

Luento 1 Tietokonejärjestelmän rakenne

Luento 1 Tietokonejärjestelmän rakenne Luento 1 Tietokonejärjestelmän rakenne Järjestelmän eri tasot Laitteiston nopeus 1 Tietokonejärjestelmä Käyttäjä Tietokonelaitteisto Oheislaitteet (peripheral or I/O devices) Tietokone (computer) 2 Tietokone

Lisätiedot

Luento 1 Tietokonejärjestelmän rakenne. Järjestelmän eri tasot Laitteiston nopeus

Luento 1 Tietokonejärjestelmän rakenne. Järjestelmän eri tasot Laitteiston nopeus Luento 1 Tietokonejärjestelmän rakenne Järjestelmän eri tasot Laitteiston nopeus 1 Tietokonejärjestelmä Käyttäjä Tietokonelaitteisto Oheislaitteet (peripheral or I/O devices) Tietokone (computer) 2 Tietokone

Lisätiedot

11/20: Konepelti auki

11/20: Konepelti auki Ohjelmointi 1 / syksy 2007 11/20: Konepelti auki Paavo Nieminen nieminen@jyu.fi Tietotekniikan laitos Informaatioteknologian tiedekunta Jyväskylän yliopisto Ohjelmointi 1 / syksy 2007 p.1/11 Tämän luennon

Lisätiedot

S11-04 Kompaktikamerat stereokamerajärjestelmässä. Projektisuunnitelma

S11-04 Kompaktikamerat stereokamerajärjestelmässä. Projektisuunnitelma AS-0.3200 Automaatio- ja systeemitekniikan projektityöt S11-04 Kompaktikamerat stereokamerajärjestelmässä Projektisuunnitelma Ari-Matti Reinsalo Anssi Niemi 28.1.2011 Projektityön tavoite Projektityössä

Lisätiedot

AS-0.1103 C-ohjelmoinnin peruskurssi 2013: C-kieli käytännössä ja erot Pythoniin

AS-0.1103 C-ohjelmoinnin peruskurssi 2013: C-kieli käytännössä ja erot Pythoniin AS-0.1103 C-ohjelmoinnin peruskurssi 2013: C-kieli käytännössä ja erot Pythoniin Raimo Nikkilä Aalto-yliopiston sähkötekniikan korkeakoulu - Automaation tietotekniikan tutkimusryhmä 17. tammikuuta 2013

Lisätiedot

TIEP114 Tietokoneen rakenne ja arkkitehtuuri, 3 op. Assembly ja konekieli

TIEP114 Tietokoneen rakenne ja arkkitehtuuri, 3 op. Assembly ja konekieli TIEP114 Tietokoneen rakenne ja arkkitehtuuri, 3 op Assembly ja konekieli Tietokoneen ja ohjelmiston rakenne Loogisilla piireillä ja komponenteilla rakennetaan prosessori ja muistit Prosessorin rakenne

Lisätiedot

Luento 1 (verkkoluento 1) Ohjelman sijainti Ohjelman esitysmuoto Laitteiston nopeus

Luento 1 (verkkoluento 1) Ohjelman sijainti Ohjelman esitysmuoto Laitteiston nopeus Luento 1 (verkkoluento 1) Tietokonejärjestelmä Järjestelmän e eri tasot Ohjelman sijainti Ohjelman esitysmuoto Laitteiston nopeus 1 Tietokone- järjestelmäj ä Käyttäjä Tietokonelaitteisto Oheislaitteet

Lisätiedot

S11-09 Control System for an. Autonomous Household Robot Platform

S11-09 Control System for an. Autonomous Household Robot Platform S11-09 Control System for an Autonomous Household Robot Platform Projektisuunnitelma AS-0.3200 Automaatio- ja systeemitekniikan projektityöt Quang Doan Lauri T. Mäkelä 1 Kuvaus Projektin tavoitteena on

Lisätiedot

Harjoitustyö: virtuaalikone

Harjoitustyö: virtuaalikone Harjoitustyö: virtuaalikone Toteuta alla kuvattu virtuaalikone yksinkertaiselle olio-orientoituneelle skriptauskielelle. Paketissa on testaamista varten mukana kaksi lyhyttä ohjelmaa. Ohjeita Noudata ohjelman

Lisätiedot

S09 04 Kohteiden tunnistaminen 3D datasta

S09 04 Kohteiden tunnistaminen 3D datasta AS 0.3200 Automaatio ja systeemitekniikan projektityöt S09 04 Kohteiden tunnistaminen 3D datasta Loppuraportti 22.5.2009 Akseli Korhonen 1. Projektin esittely Projektin tavoitteena oli algoritmin kehittäminen

Lisätiedot

Arkkitehtuurikuvaus. Ratkaisu ohjelmistotuotelinjan monikielisyyden hallintaan Innofactor Oy. Ryhmä 14

Arkkitehtuurikuvaus. Ratkaisu ohjelmistotuotelinjan monikielisyyden hallintaan Innofactor Oy. Ryhmä 14 Arkkitehtuurikuvaus Ratkaisu ohjelmistotuotelinjan monikielisyyden hallintaan Innofactor Oy Ryhmä 14 Muutoshistoria Versio Pvm Päivittäjä Muutos 0.4 1.11.2007 Matti Eerola 0.3 18.10.2007 Matti Eerola 0.2

Lisätiedot

TIES530 TIES530. Moniprosessorijärjestelmät. Moniprosessorijärjestelmät. Miksi moniprosessorijärjestelmä?

TIES530 TIES530. Moniprosessorijärjestelmät. Moniprosessorijärjestelmät. Miksi moniprosessorijärjestelmä? Miksi moniprosessorijärjestelmä? Laskentaa voidaan hajauttaa useammille prosessoreille nopeuden, modulaarisuuden ja luotettavuuden vaatimuksesta tai hajauttaminen voi helpottaa ohjelmointia. Voi olla järkevää

Lisätiedot

Sulautettujen järjestelmien skaala on niin laaja, että on erittäin vaikea antaa yleispätevää kuvausta siitä millainen on sulautettu järjestelmä.

Sulautettujen järjestelmien skaala on niin laaja, että on erittäin vaikea antaa yleispätevää kuvausta siitä millainen on sulautettu järjestelmä. Sulautettujen järjestelmien skaala on niin laaja, että on erittäin vaikea antaa yleispätevää kuvausta siitä millainen on sulautettu järjestelmä. On arvioitu, että maailmassa on tällä hetkellä enemmän sulautettuja

Lisätiedot

4. Lausekielinen ohjelmointi 4.1

4. Lausekielinen ohjelmointi 4.1 4. Lausekielinen ohjelmointi 4.1 Sisällys Konekieli, symbolinen konekieli ja lausekieli. Hyvä ohjelmointitapa. Lausekielestä konekieleksi: - Lähdekoodi, tekstitiedosto ja tekstieditorit. - Kääntäminen

Lisätiedot

TT00AA12-2016 - Ohjelmoinnin jatko (TT10S1ECD)

TT00AA12-2016 - Ohjelmoinnin jatko (TT10S1ECD) TT00AA12-2016 - Ohjelmoinnin jatko (TT10S1ECD) Ohjelmointikäytännöt 21/3/11 Mikko Vuorinen Metropolia Ammattikorkeakoulu 1 Sisältö 1) Mitä on hyvä koodi? 2) Ohjelmointikäytäntöjen merkitys? 3) Koodin asettelu

Lisätiedot

Tietorakenteet ja algoritmit

Tietorakenteet ja algoritmit Tietorakenteet ja algoritmit Rekursio Rekursion käyttötapauksia Rekursio määritelmissä Rekursio ongelmanratkaisussa ja ohjelmointitekniikkana Esimerkkejä taulukolla Esimerkkejä linkatulla listalla Hanoin

Lisätiedot

Ongelma(t): Miten mikro-ohjelmoitavaa tietokonetta voisi ohjelmoida kirjoittamatta binääristä (mikro)koodia? Voisiko samalla algoritmin esitystavalla

Ongelma(t): Miten mikro-ohjelmoitavaa tietokonetta voisi ohjelmoida kirjoittamatta binääristä (mikro)koodia? Voisiko samalla algoritmin esitystavalla Ongelma(t): Miten mikro-ohjelmoitavaa tietokonetta voisi ohjelmoida kirjoittamatta binääristä (mikro)koodia? Voisiko samalla algoritmin esitystavalla ohjelmoida useita komponenteiltaan ja rakenteeltaan

Lisätiedot

CT50A2602 Käyttöjärjestelmät Seminaarityö. Tietokoneen muisti nyt ja tulevaisuudessa

CT50A2602 Käyttöjärjestelmät Seminaarityö. Tietokoneen muisti nyt ja tulevaisuudessa CT50A2602 Käyttöjärjestelmät Seminaarityö Tietokoneen muisti nyt ja tulevaisuudessa Jyrki Eurén Raimo Asikainen Janne Laitinen Teppo Lapinkoski Manu Toivanen Pasi Ruuth Johdanto Taustaa Työn taustana ryhmän

Lisätiedot

C-kielessä taulukko on joukko peräkkäisiä muistipaikkoja, jotka kaikki pystyvät tallettamaan samaa tyyppiä olevaa tietoa.

C-kielessä taulukko on joukko peräkkäisiä muistipaikkoja, jotka kaikki pystyvät tallettamaan samaa tyyppiä olevaa tietoa. Taulukot C-kielessä taulukko on joukko peräkkäisiä muistipaikkoja, jotka kaikki pystyvät tallettamaan samaa tyyppiä olevaa tietoa. Taulukon muuttujilla (muistipaikoilla) on yhteinen nimi. Jokaiseen yksittäiseen

Lisätiedot

n! k!(n k)! n = Binomikerroin voidaan laskea pelkästään yhteenlaskun avulla käyttäen allaolevia ns. palautuskaavoja.

n! k!(n k)! n = Binomikerroin voidaan laskea pelkästään yhteenlaskun avulla käyttäen allaolevia ns. palautuskaavoja. IsoInt Tietokoneiden muisti koostuu yksittäisistä muistisanoista, jotka nykyaikaisissa koneissa ovat 64 bitin pituisia. Muistisanan koko asettaa teknisen rajoituksen sille, kuinka suuria lukuja tietokone

Lisätiedot

Ohjelmistoradio. Mikä se on:

Ohjelmistoradio. Mikä se on: 1 Mikä se on: SDR = Software Defined Radio radio, jossa ohjelmisto määrittelee toiminnot ja ominaisuudet: otaajuusalue olähetelajit (modulaatio) olähetysteho etuna joustavuus, jota tarvitaan sovelluksissa,

Lisätiedot

Algoritmit 1. Luento 3 Ti Timo Männikkö

Algoritmit 1. Luento 3 Ti Timo Männikkö Algoritmit 1 Luento 3 Ti 17.1.2017 Timo Männikkö Luento 3 Algoritmin analysointi Rekursio Lomituslajittelu Aikavaativuus Tietorakenteet Pino Algoritmit 1 Kevät 2017 Luento 3 Ti 17.1.2017 2/27 Algoritmien

Lisätiedot

Perusteet. Pasi Sarolahti Aalto University School of Electrical Engineering. C-ohjelmointi Kevät Pasi Sarolahti

Perusteet. Pasi Sarolahti Aalto University School of Electrical Engineering. C-ohjelmointi Kevät Pasi Sarolahti C! Perusteet 19.1.2017 Palautteesta (1. kierros toistaiseksi) (Erittäin) helppoa Miksi vain puolet pisteistä? Vaikeinta oli ohjelmointiympäristön asennus ja käyttö Ei selvää että main funktion pitikin

Lisätiedot

TIEP114 Tietokoneen rakenne ja arkkitehtuuri, 3 op. Assembly ja konekieli

TIEP114 Tietokoneen rakenne ja arkkitehtuuri, 3 op. Assembly ja konekieli TIEP114 Tietokoneen rakenne ja arkkitehtuuri, 3 op Assembly ja konekieli Tietokoneen ja ohjelmiston rakenne Loogisilla piireillä ja komponenteilla rakennetaan prosessori ja muistit Prosessorin rakenne

Lisätiedot

Moderneissa grafiikkakorteissa hyödynnetään myös samanlaista toimintamallia

Moderneissa grafiikkakorteissa hyödynnetään myös samanlaista toimintamallia 1 Datan rinnakkaistamisessa siis eri prosessointiyksiköt suorittavat saman operaation annetulle datalle, joka pilkotaan prosessointiyksikköjen kesken. Pointti on siis se, että kyseessä ei ole tehtävien

Lisätiedot

Tietueet. Tietueiden määrittely

Tietueet. Tietueiden määrittely Tietueet Tietueiden määrittely Tietue on tietorakenne, joka kokoaa yhteen eri tyyppistä tietoa yhdeksi asiakokonaisuudeksi. Tähän kokonaisuuteen voidaan viitata yhteisellä nimellä. Auttaa ohjelmoijaa järjestelemään

Lisätiedot

Datatähti 2009 -alkukilpailu

Datatähti 2009 -alkukilpailu Datatähti 2009 -alkukilpailu Ohjelmointitehtävä 1/3: Hissimatka HUOM: Tutustuthan huolellisesti tehtävien sääntöihin ja palautusohjeisiin (sivu 7) Joukko ohjelmoijia on talon pohjakerroksessa, ja he haluavat

Lisätiedot

Tietokoneen muisti nyt ja tulevaisuudessa. Ryhmä: Mikko Haavisto Ilari Pihlajisto Marko Vesala Joona Hasu

Tietokoneen muisti nyt ja tulevaisuudessa. Ryhmä: Mikko Haavisto Ilari Pihlajisto Marko Vesala Joona Hasu Tietokoneen muisti nyt ja tulevaisuudessa Ryhmä: Mikko Haavisto Ilari Pihlajisto Marko Vesala Joona Hasu Yleisesti Muisti on yksi keskeisimmistä tietokoneen komponenteista Random Access Memory on yleistynyt

Lisätiedot

D-OHJELMOINTIKIELI. AA-kerho, 33. Antti Uusimäki. Arto Savolainen

D-OHJELMOINTIKIELI. AA-kerho, 33. Antti Uusimäki. Arto Savolainen D-OHJELMOINTIKIELI AA-kerho, 33 Antti Uusimäki Arto Savolainen 2 D-OHJELMOINTIKIELI D-kielen historia alkaa vuodesta 1999, kun Walter Bright aloitti uuden ohjelmointikielen kehittämisen. Ensimmäinen versio

Lisätiedot

815338A Ohjelmointikielten periaatteet Harjoitus 4 vastaukset

815338A Ohjelmointikielten periaatteet Harjoitus 4 vastaukset 815338A Ohjelmointikielten periaatteet 2015-2016. Harjoitus 4 vastaukset Harjoituksen aiheena ovat imperatiivisten kielten lauseisiin, lausekkeisiin ja aliohjelmiin liittyvät kysymykset. Tehtävä 1. Mitä

Lisätiedot

15. Ohjelmoinnin tekniikkaa 15.1

15. Ohjelmoinnin tekniikkaa 15.1 15. Ohjelmoinnin tekniikkaa 15.1 Sisällys For-each-rakenne. Lueteltu tyyppi enum. Override-annotaatio. Geneerinen ohjelmointi. 15.2 For-each-rakenne For-rakenteen variaatio taulukoiden ja muiden kokoelmien

Lisätiedot

4. Lausekielinen ohjelmointi 4.1

4. Lausekielinen ohjelmointi 4.1 4. Lausekielinen ohjelmointi 4.1 Sisällys Konekieli, symbolinen konekieli ja lausekieli. Lausekielestä konekieleksi: - Lähdekoodi, tekstitiedosto ja tekstieditorit. - Kääntäminen ja tulkinta. - Kääntäminen,

Lisätiedot

JAVA on ohjelmointikieli, mikä on kieliopiltaan hyvin samankaltainen, jopa identtinen mm. C++

JAVA on ohjelmointikieli, mikä on kieliopiltaan hyvin samankaltainen, jopa identtinen mm. C++ JAVA alkeet JAVA on ohjelmointikieli, mikä on kieliopiltaan hyvin samankaltainen, jopa identtinen mm. C++ ja Javascriptin kanssa. Huom! JAVA ja JavaScript eivät silti ole sama asia, eivätkä edes sukulaiskieliä.

Lisätiedot

Tähtitieteen käytännön menetelmiä Kevät 2009 Luento 4: Ohjelmointi, skriptaus ja Python

Tähtitieteen käytännön menetelmiä Kevät 2009 Luento 4: Ohjelmointi, skriptaus ja Python Tähtitieteen käytännön menetelmiä Kevät 2009 Luento 4: Ohjelmointi, skriptaus ja Python 31. tammikuuta 2009 Ohjelmointi Perusteet Pythonin alkeet Esittely Esimerkkejä Muuttujat Peruskäsitteitä Käsittely

Lisätiedot

3. Muuttujat ja operaatiot 3.1

3. Muuttujat ja operaatiot 3.1 3. Muuttujat ja operaatiot 3.1 Sisällys Imperatiivinen laskenta. Muuttujat. Nimi ja arvo. Muuttujan nimeäminen. Muuttujan tyyppi. Operaattorit. Operandit. Arvon sijoitus muuttujaan. Aritmeettiset operaattorit.

Lisätiedot

Digikamera. Perustietoa digikamerasta ja kuvien siirtämisestä tietokoneelle

Digikamera. Perustietoa digikamerasta ja kuvien siirtämisestä tietokoneelle TEEMA 1 Tietokoneen peruskäyttö Digikamera Perustietoa digikamerasta ja kuvien siirtämisestä tietokoneelle Tämä tietopaketti hahmottaa lukijalle, millä tavalla kuvat voidaan siirtää kamerakännykästä tai

Lisätiedot

C++ Ohjelmoijan käsikirja. Johdanto

C++ Ohjelmoijan käsikirja. Johdanto Johdanto C++ Ohjelmoijan käsikirja Johdanto Tervetuloa Inside C++-kirjan pariin. Tämä on opaskirja standardi C++:n käyttöön. Käsittelemme kirjassa kaikki syntaksin, kieliopin, olio-ohjelmoinnin ja standardikirjastojen

Lisätiedot

Luento 3: 3D katselu. Sisältö

Luento 3: 3D katselu. Sisältö Tietokonegrafiikan perusteet T-.43 3 op Luento 3: 3D katselu Lauri Savioja Janne Kontkanen /27 3D katselu / Sisältö Kertaus: koordinaattimuunnokset ja homogeeniset koordinaatit Näkymänmuodostus Kameran

Lisätiedot

Ohjelmistojen mallintaminen, mallintaminen ja UML

Ohjelmistojen mallintaminen, mallintaminen ja UML 582104 Ohjelmistojen mallintaminen, mallintaminen ja UML 1 Mallintaminen ja UML Ohjelmistojen mallintamisesta ja kuvaamisesta Oliomallinnus ja UML Käyttötapauskaaviot Luokkakaaviot Sekvenssikaaviot 2 Yleisesti

Lisätiedot

Kertausluento 1 (lu01, lu02, lu03) Tietokonejärjestelmän rakenne ttk-91 ja sillä ohjelmointi

Kertausluento 1 (lu01, lu02, lu03) Tietokonejärjestelmän rakenne ttk-91 ja sillä ohjelmointi Kertausluento 1 (lu01, lu02, lu03) Tietokonejärjestelmän rakenne ttk-91 ja sillä ohjelmointi Järjestelmän eri tasot Laitteiston nopeus ttk-91 rakenne ja käskykantaarkkitehtuuri Konekielinen ohjelmointi

Lisätiedot

Tietokoneen toiminta, Kevät Copyright Teemu Kerola Järjestelmän eri tasot Laitteiston nopeus

Tietokoneen toiminta, Kevät Copyright Teemu Kerola Järjestelmän eri tasot Laitteiston nopeus Kertausluento 1 (lu01, lu02, lu03) Tietokonejärjestelmän rakenne ttk-91 ja sillä ohjelmointi Järjestelmän eri tasot Laitteiston nopeus ttk-91 rakenne ja käskykantaarkkitehtuuri Konekielinen ohjelmointi

Lisätiedot

Ohjelmassa muuttujalla on nimi ja arvo. Kääntäjä ja linkkeri varaavat muistilohkon, jonne muuttujan arvo talletetaan.

Ohjelmassa muuttujalla on nimi ja arvo. Kääntäjä ja linkkeri varaavat muistilohkon, jonne muuttujan arvo talletetaan. Osoittimet Ohjelmassa muuttujalla on nimi ja arvo. Kääntäjä ja linkkeri varaavat muistilohkon, jonne muuttujan arvo talletetaan. Muistilohkon koko riippuu muuttujan tyypistä, eli kuinka suuria arvoja muuttujan

Lisätiedot

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python Ohjelmoinnin perusteet Y Python T-106.1208 21.1.2009 T-106.1208 Ohjelmoinnin perusteet Y 21.1.2009 1 / 32 Tyypeistä Monissa muissa ohjelmointikielissä (esim. Java ja C) muuttujat on määriteltävä ennen

Lisätiedot

RATKAISUT a + b 2c = a + b 2 ab = ( a ) 2 2 ab + ( b ) 2 = ( a b ) 2 > 0, koska a b oletuksen perusteella. Väite on todistettu.

RATKAISUT a + b 2c = a + b 2 ab = ( a ) 2 2 ab + ( b ) 2 = ( a b ) 2 > 0, koska a b oletuksen perusteella. Väite on todistettu. RATKAISUT 198 197 198. Olkoon suorakulmion erisuuntaisten sivujen pituudet a ja b sekä neliön sivun pituus c. Tehtävä on mielekäs vain, jos suorakulmio ei ole neliö, joten oletetaan, että a b. Suorakulmion

Lisätiedot

Operaattoreiden ylikuormitus. Operaattoreiden kuormitus. Operaattoreiden kuormitus. Operaattoreista. Kuormituksesta

Operaattoreiden ylikuormitus. Operaattoreiden kuormitus. Operaattoreiden kuormitus. Operaattoreista. Kuormituksesta C++ - perusteet Java-osaajille luento 5/7: operaattoreiden ylikuormitus, oliotaulukko, parametrien oletusarvot, komentoriviparametrit, constant, inline, Operaattoreiden ylikuormitus Operaattoreiden kuormitus

Lisätiedot

Sisällys. 3. Muuttujat ja operaatiot. Muuttujat ja operaatiot. Muuttujat. Operaatiot. Imperatiivinen laskenta. Muuttujat. Esimerkkejä: Operaattorit.

Sisällys. 3. Muuttujat ja operaatiot. Muuttujat ja operaatiot. Muuttujat. Operaatiot. Imperatiivinen laskenta. Muuttujat. Esimerkkejä: Operaattorit. 3. Muuttujat ja operaatiot Sisällys Imperatiivinen laskenta. Muuttujat. Nimi ja arvo. Muuttujan nimeäminen. Muuttujan tyyppi.. Operandit. Arvon sijoitus muuttujaan. Aritmeettiset operaattorit. Arvojen

Lisätiedot

Ongelma(t): Miten jollakin korkeamman tason ohjelmointikielellä esitetty algoritmi saadaan suoritettua mikro-ohjelmoitavalla tietokoneella ja siinä

Ongelma(t): Miten jollakin korkeamman tason ohjelmointikielellä esitetty algoritmi saadaan suoritettua mikro-ohjelmoitavalla tietokoneella ja siinä Ongelma(t): Miten jollakin korkeamman tason ohjelmointikielellä esitetty algoritmi saadaan suoritettua mikro-ohjelmoitavalla tietokoneella ja siinä olevilla komponenteilla? Voisiko jollakin ohjelmointikielellä

Lisätiedot

T740103 Olio-ohjelmointi Osa 5: Periytyminen ja polymorfismi Jukka Jauhiainen OAMK Tekniikan yksikkö 2010

T740103 Olio-ohjelmointi Osa 5: Periytyminen ja polymorfismi Jukka Jauhiainen OAMK Tekniikan yksikkö 2010 12. Periytyminen Johdantoa Käytännössä vähänkään laajemmissa ohjelmissa joudutaan laatimaan useita luokkia, joiden pitäisi pystyä välittämään tietoa toisilleen. Ohjelmien ylläpidon kannalta olisi lisäksi

Lisätiedot

Valppaan asennus- ja käyttöohje

Valppaan asennus- ja käyttöohje Versio Päiväys Muokkaaja Kuvaus 0.9 16.2.2006 Tuukka Laakso Korjattu versio 0.1 Antti Kettunen Alustava versio Sisällysluettelo 1 Johdanto...2 2 Valppaan asennus...3 2.1 Valppaan kääntäminen...3 2.2 Valmiiksi

Lisätiedot

Octave-opas. Mikä on Octave ja miksi? Asennus

Octave-opas. Mikä on Octave ja miksi? Asennus Octave-opas Mikä on Octave ja miksi? Asennus Käynnistys ja käyttöliittymä Komennot tiedostojen hallintaan SciTE-editor.m-tiedostot Ohjeita muualla Mikä on Octave ja miksi? Octave on numeeriseen laskentaan

Lisätiedot

Software product lines

Software product lines Thomas Gustafsson, Henrik Heikkilä Software product lines Metropolia Ammattikorkeakoulu Insinööri (AMK) Tietotekniikan koulutusohjelma Asiantuntijateksti 17.11.2013 Sisällys 1 Johdanto 1 2 Software product

Lisätiedot

Loppukurssin järjestelyt C:n edistyneet piirteet

Loppukurssin järjestelyt C:n edistyneet piirteet C! Loppukurssin järjestelyt C:n edistyneet piirteet 30.3.2017 Ohjelmassa Ohjelmontitehtävän järjestelyt Tietokonetentin järjestelyt Esikääntäjä Parametrilistat Funktio-osoittimet Kunniamainintoja Kuura

Lisätiedot

Tieto- ja tallennusrakenteet

Tieto- ja tallennusrakenteet Tieto- ja tallennusrakenteet Sisältö Tyyppi, abstrakti tietotyyppi, abstraktin tietotyypin toteutus Tallennusrakenteet Taulukko Linkitetty rakenne Abstraktit tietotyypit Lista (Puu) (Viimeisellä viikolla)

Lisätiedot

Maa-57.260. Kameran kalibrointi. TKK/Fotogrammetria/PP

Maa-57.260. Kameran kalibrointi. TKK/Fotogrammetria/PP Kameran kalibrointi Kameran kalibroinnilla tarkoitetaan sen kameravakion, pääpisteen paikan sekä optiikan aiheuttamien virheiden määrittämistä. Virheillä tarkoitetaan poikkeamaa ideaalisesta keskusprojektiokuvasta.

Lisätiedot

5.6. C-kielen perusteet, osa 6/8, Taulukko 6.1.2008, pva, kuvat jma

5.6. C-kielen perusteet, osa 6/8, Taulukko 6.1.2008, pva, kuvat jma 5.6. C-kielen perusteet, osa 6/8, Taulukko 6.1.2008, pva, kuvat jma Every cloud has a silver line. - englantilainen sananlasku Tässä osiossa tärkeää: yksi- ja moniulotteinen taulukko Sisältö Yleistä Yksiulotteinen

Lisätiedot

Ongelma(t): Jotta tietokone olisi mahdollisimman yleiskäyttöinen ja suorituskykyinen, niin miten tietokoneen resurssit tulisi tarjota ohjelmoijalle,

Ongelma(t): Jotta tietokone olisi mahdollisimman yleiskäyttöinen ja suorituskykyinen, niin miten tietokoneen resurssit tulisi tarjota ohjelmoijalle, Ongelma(t): Jotta tietokone olisi mahdollisimman yleiskäyttöinen ja suorituskykyinen, niin miten tietokoneen resurssit tulisi tarjota ohjelmoijalle, sovellusohjelmille ja käyttäjille? 2012-2013 Lasse Lensu

Lisätiedot

Linux. 00 Keskeiset piirteet. Unix ja Linux Helsingin ammattikorkeakoulu Stadia Vesa Ollikainen (muokannut M.Mäki-Uuro) Kysymyksiä

Linux. 00 Keskeiset piirteet. Unix ja Linux Helsingin ammattikorkeakoulu Stadia Vesa Ollikainen (muokannut M.Mäki-Uuro) Kysymyksiä Linux 00 Keskeiset piirteet Tux-pingviinin kuva: Larry Ewing, Simon Budig ja Anja Gerwinski Kysymyksiä 1. Mikä Linux on? 2. Kuinka Linux syntyi ja kehittyy? 3. Mitkä ovat Linuxin vahvuudet? 2 1 Linux on

Lisätiedot

Toinen harjoitustyö. ASCII-grafiikkaa

Toinen harjoitustyö. ASCII-grafiikkaa Toinen harjoitustyö ASCII-grafiikkaa Yleistä Tehtävä: tee Javalla ASCII-merkkeinä esitettyä grafiikkaa käsittelevä ASCIIArt-ohjelma omia operaatioita ja taulukoita käyttäen. Työ tehdään pääosin itse. Ideoita

Lisätiedot

Jakso 4 Aliohjelmien toteutus

Jakso 4 Aliohjelmien toteutus Jakso 4 Aliohjelmien toteutus Tyypit Parametrit Aktivointitietue (AT) AT-pino Rekursio 1 Aliohjelmatyypit (2) Korkean tason ohjelmointikielen käsitteet: aliohjelma, proseduuri parametrit funktio parametrit,

Lisätiedot

Ongelma(t): Miten tietokoneen käyttöjärjestelmä toimii sisäisesti, jotta resurssit saadaan tehokkaaseen käyttöön?

Ongelma(t): Miten tietokoneen käyttöjärjestelmä toimii sisäisesti, jotta resurssit saadaan tehokkaaseen käyttöön? Ongelma(t): Miten tietokoneen käyttöjärjestelmä toimii sisäisesti, jotta resurssit saadaan tehokkaaseen käyttöön? 2013-2014 Lasse Lensu 2 Systeemiohjelmat ovat tietokoneen laitteistoa lähellä olevia ohjelmia,

Lisätiedot

Tietotyypit ja operaattorit

Tietotyypit ja operaattorit Tietotyypit ja operaattorit Luennossa tarkastellaan yksinkertaisten tietotyyppien int, double ja char muunnoksia tyypistä toiseen sekä esitellään uusia operaatioita. Numeeriset tietotyypit ja muunnos Merkkitieto

Lisätiedot

Näin asennat MS-DOS käyttöjärjestelmän virtuaalikoneeseen

Näin asennat MS-DOS käyttöjärjestelmän virtuaalikoneeseen Näissä ohjeissa käydään läpi Microsoftin MS-DOS 6.22 -käyttöjärjestelmän asennus Microsoftin Virtual PC 2007 -virtuaalikoneeseen. Asennusta varten sinulla on oltava Virtual PC 2007 asennettuna tietokoneellasi

Lisätiedot

LUKUJA, DATAA KÄSITTELEVÄT FUNKTIOT JA NIIDEN KÄYTTÖ LOGIIKKAOHJAUKSESSA

LUKUJA, DATAA KÄSITTELEVÄT FUNKTIOT JA NIIDEN KÄYTTÖ LOGIIKKAOHJAUKSESSA LUKUJA, DATAA KÄSITTELEVÄT FUNKTIOT JA NIIDEN KÄYTTÖ LOGIIKKAOHJAUKSESSA Tavallisimmin lukuja käsittelevien datasanojen tyypiksi kannattaa asettaa kokonaisluku 16 bitin INT, jonka vaihtelualueeksi tulee

Lisätiedot

Ohjelmointi 2. Jussi Pohjolainen. TAMK» Tieto- ja viestintäteknologia , Jussi Pohjolainen TAMPEREEN AMMATTIKORKEAKOULU

Ohjelmointi 2. Jussi Pohjolainen. TAMK» Tieto- ja viestintäteknologia , Jussi Pohjolainen TAMPEREEN AMMATTIKORKEAKOULU Ohjelmointi 2 Jussi Pohjolainen TAMK» Tieto- ja viestintäteknologia Tietotyypeistä C++ - kielessä useita tietotyyppejä Kirjaimet: char, wchar_t Kokonaisluvut: short, int, long Liukuluvut: float, double

Lisätiedot

TIE Principles of Programming Languages CEYLON

TIE Principles of Programming Languages CEYLON TIE-20306 Principles of Programming Languages CEYLON SISÄLLYSLUETTELO 1. YLEISTIETOA KIELESTÄ JA SEN KEHITTÄMISESTÄ... 1 2. CEYLONIN OMINAISUUKSIA... 2 2.1 Modulaarisuus... 2 2.2 Tyypit... 2 2.3 Muita

Lisätiedot

Diplomi-insinööri- ja arkkitehtikoulutuksen yhteisvalinta 2017 Insinöörivalinnan matematiikan koe , Ratkaisut (Sarja A)

Diplomi-insinööri- ja arkkitehtikoulutuksen yhteisvalinta 2017 Insinöörivalinnan matematiikan koe , Ratkaisut (Sarja A) Diplomi-insinööri- ja arkkitehtikoulutuksen yhteisvalinta 017 Insinöörivalinnan matematiikan koe 30..017, Ratkaisut (Sarja A) 1. a) Lukujen 9, 0, 3 ja x keskiarvo on. Määritä x. (1 p.) b) Mitkä reaaliluvut

Lisätiedot

Luento 4 Aliohjelmien toteutus

Luento 4 Aliohjelmien toteutus Luento 4 Aliohjelmien toteutus Tyypit Parametrit Aktivointitietue (AT) AT-pino Rekursio 1 Aliohjelmatyypit (2) Korkean tason ohjelmointikielen käsitteet: aliohjelma, proseduuri parametrit funktio parametrit,

Lisätiedot

Kertausluento luennoista 1-3 1

Kertausluento luennoista 1-3 1 Kertausluento 1 (lu01, lu02, lu03) Tietokonejärjestelmän rakenne ttk-91 ja sillä ohjelmointi Järjestelmän eri tasot Laitteiston nopeus ttk-91 rakenne ja käskykantaarkkitehtuuri Konekielinen ohjelmointi

Lisätiedot

9. Vektorit. 9.1 Skalaarit ja vektorit. 9.2 Vektorit tasossa

9. Vektorit. 9.1 Skalaarit ja vektorit. 9.2 Vektorit tasossa 9. Vektorit 9.1 Skalaarit ja vektorit Skalaari on koon tai määrän mitta. Tyypillinen esimerkki skalaarista on massa. Lukumäärä on toinen hyvä esimerkki skalaarista. Vektorilla on taas suuruus ja suunta.

Lisätiedot

Projektinhallintaa paikkatiedon avulla

Projektinhallintaa paikkatiedon avulla Projektinhallintaa paikkatiedon avulla Tampereen Teknillinen Yliopisto / Porin laitos Teemu Kumpumäki teemu.kumpumaki@tut.fi 25.6.2015 1 Paikkatieto ja projektinhallinta Paikkatiedon käyttäminen projektinhallinnassa

Lisätiedot

812341A Olio-ohjelmointi, I Johdanto

812341A Olio-ohjelmointi, I Johdanto 812341A Olio-ohjelmointi, 2016 I Johdanto Sisältö 1. Abstraktiosta 2. Olio-ohjelmoinnin historiaa 3. Olioparadigmasta 4. Peruskäsitteiden kertausta 812341A Olio-ohjelmointi, Johdanto 2 1 Abstraktiosta

Lisätiedot

Vaatimusmäärittely Ohjelma-ajanvälitys komponentti

Vaatimusmäärittely Ohjelma-ajanvälitys komponentti Teknillinen korkeakoulu 51 Vaatimusmäärittely Ohjelma-ajanvälitys komponentti Versio Päiväys Tekijä Kuvaus 0.1 21.11.01 Oskari Pirttikoski Ensimmäinen versio 0.2 27.11.01 Oskari Pirttikoski Lisätty termit

Lisätiedot

Talousmatematiikan perusteet: Luento 13. Rajoittamaton optimointi Hessen matriisi Ominaisarvot ja vektorit Ääriarvon laadun tarkastelu

Talousmatematiikan perusteet: Luento 13. Rajoittamaton optimointi Hessen matriisi Ominaisarvot ja vektorit Ääriarvon laadun tarkastelu Talousmatematiikan perusteet: Luento 13 Rajoittamaton optimointi Hessen matriisi Ominaisarvot ja vektorit Ääriarvon laadun tarkastelu Viime luennolla Aloimme tarkastella yleisiä, usean muuttujan funktioita

Lisätiedot

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python Ohjelmoinnin perusteet Y Python T-106.1208 1.4.2009 T-106.1208 Ohjelmoinnin perusteet Y 1.4.2009 1 / 56 Tentti Ensimmäinen tenttimahdollisuus on pe 8.5. klo 13:00 17:00 päärakennuksessa. Tämän jälkeen

Lisätiedot

Testiraportti Android virtuaalikone vs. natiivikoodi Ville Laine, Delta 23

Testiraportti Android virtuaalikone vs. natiivikoodi Ville Laine, Delta 23 Testiraportti Android virtuaalikone vs. natiivikoodi Ville Laine, Delta 23 1 Sisällys 1. Johdanto...3 2. Testiohjelma...3 2.1. Testi 1: Raaka funktiokutsu...3 2.2. Testi 2: Yhteenlaskutesti...3 2.3. Testi

Lisätiedot

Muutamia peruskäsitteitä

Muutamia peruskäsitteitä Muutamia peruskäsitteitä Huom. 1: nämä peruskäsitteet eivät muodosta hyvin määriteltyä keskenään yhteensopivien käsitteiden joukkoa, vaan käsitteet ovat osittain päällekkäisiä ja eri yhteyksissä niillä

Lisätiedot

.NET ajoympäristö. Juha Järvensivu 2007

.NET ajoympäristö. Juha Järvensivu 2007 .NET ajoympäristö Juha Järvensivu juha.jarvensivu@tut.fi 2007 Käännösprosessi C# lähdekoodi C# kääntäjä CILtavukoodi JITkäännös Ajettava natiivikoodi Kehitysympäristössä ohjelmoijan toimesta Ajonaikana.NET

Lisätiedot

JAVA-PERUSTEET. JAVA-OHJELMOINTI 3op A274615 JAVAN PERUSTEET LYHYT KERTAUS JAVAN OMINAISUUKSISTA JAVAN OMINAISUUKSIA. Java vs. C++?

JAVA-PERUSTEET. JAVA-OHJELMOINTI 3op A274615 JAVAN PERUSTEET LYHYT KERTAUS JAVAN OMINAISUUKSISTA JAVAN OMINAISUUKSIA. Java vs. C++? JAVA-OHJELMOINTI 3op A274615 JAVAN PERUSTEET LYHYT KERTAUS Teemu Saarelainen teemu.saarelainen@kyamk.fi Lähteet: http://java.sun.com/docs/books/tutorial/index.html Vesterholm, Kyppö: Java-ohjelmointi,

Lisätiedot

Ongelma(t): Miten tietokoneen komponentteja voi ohjata siten, että ne tekevät yhdessä jotakin järkevää? Voiko tietokonetta ohjata (ohjelmoida) siten,

Ongelma(t): Miten tietokoneen komponentteja voi ohjata siten, että ne tekevät yhdessä jotakin järkevää? Voiko tietokonetta ohjata (ohjelmoida) siten, Ongelma(t): Miten tietokoneen komponentteja voi ohjata siten, että ne tekevät yhdessä jotakin järkevää? Voiko tietokonetta ohjata (ohjelmoida) siten, että se pystyy suorittamaan kaikki mahdolliset algoritmit?

Lisätiedot

Laboratoriotyö. 1. Laitteisto. 1.1 Kamera

Laboratoriotyö. 1. Laitteisto. 1.1 Kamera Laboratoriotyö 1. Laitteisto 1.1 Kamera Järjestelmän kamerassa (Hitachi, VK-C77E) on CCD -kenno ja mahdollisuus kuvan asynkroniseen päivitykseen. Kamerassa on sarjaliitäntä, jonka kautta voidaan ohjata

Lisätiedot

Määrittelydokumentti

Määrittelydokumentti Määrittelydokumentti Aineopintojen harjoitustyö: Tietorakenteet ja algoritmit (alkukesä) Sami Korhonen 014021868 sami.korhonen@helsinki. Tietojenkäsittelytieteen laitos Helsingin yliopisto 23. kesäkuuta

Lisätiedot

Matriisilaskenta Laskuharjoitus 1 - Ratkaisut / vko 37

Matriisilaskenta Laskuharjoitus 1 - Ratkaisut / vko 37 Matriisilaskenta Laskuharjoitus 1 - Ratkaisut / vko 37 Tehtävä 1: Käynnistä Matlab-ohjelma ja kokeile laskea sillä muutama peruslaskutoimitus: laske jokin yhteen-, vähennys-, kerto- ja jakolasku. Laske

Lisätiedot

SIMULINK S-funktiot. SIMULINK S-funktiot

SIMULINK S-funktiot. SIMULINK S-funktiot S-funktio on ohjelmointikielellä (Matlab, C, Fortran) laadittu oma algoritmi tai dynaamisen järjestelmän kuvaus, jota voidaan käyttää Simulink-malleissa kuin mitä tahansa valmista lohkoa. S-funktion rakenne

Lisätiedot

MATEMATIIKKA 5 VIIKKOTUNTIA. PÄIVÄMÄÄRÄ: 8. kesäkuuta 2009

MATEMATIIKKA 5 VIIKKOTUNTIA. PÄIVÄMÄÄRÄ: 8. kesäkuuta 2009 EB-TUTKINTO 2009 MATEMATIIKKA 5 VIIKKOTUNTIA PÄIVÄMÄÄRÄ: 8. kesäkuuta 2009 KOKEEN KESTO: 4 tuntia (240 minuuttia) SALLITUT APUVÄLINEET: Eurooppa-koulun antama taulukkovihkonen Funktiolaskin, joka ei saa

Lisätiedot

Muuttujien roolit Kiintoarvo cin >> r;

Muuttujien roolit Kiintoarvo cin >> r; Muuttujien roolit Muuttujilla on ohjelmissa eräitä tyypillisiä käyttötapoja, joita kutsutaan muuttujien rooleiksi. Esimerkiksi muuttuja, jonka arvoa ei muuteta enää kertaakaan muuttujan alustamisen jälkeen,

Lisätiedot

Ohjelmistojen mallintaminen

Ohjelmistojen mallintaminen Ohjelmistojen mallintaminen - Mallit - Ohjelmiston kuvaaminen malleilla 31.10.2008 Harri Laine 1 Malli: abstraktio jostain kohteesta Abstrahointi: asian ilmaiseminen tavalla, joka tuo esiin tietystä näkökulmasta

Lisätiedot

Väylät. Prosessorin tie ulkomaailmaan Pienissä järjestelmissä vain yksi väylä. Osoite, data ja ohjaussignaalit Prosessori ainoa herra (master)

Väylät. Prosessorin tie ulkomaailmaan Pienissä järjestelmissä vain yksi väylä. Osoite, data ja ohjaussignaalit Prosessori ainoa herra (master) Prosessorin tie ulkomaailmaan Pienissä järjestelmissä vain yksi väylä Prosessoriväylä Osoite, data ja ohjaussignaalit Prosessori ainoa herra (master) Suuremmissa erillisiä väyliä Muistiväylä Oheislaiteväylät

Lisätiedot

Tietokone. Tietokone ja ylläpito. Tietokone. Tietokone. Tietokone. Tietokone

Tietokone. Tietokone ja ylläpito. Tietokone. Tietokone. Tietokone. Tietokone ja ylläpito computer = laskija koostuu osista tulostuslaite näyttö, tulostin syöttölaite hiiri, näppäimistö tallennuslaite levy (keskusyksikössä) Keskusyksikkö suoritin prosessori emolevy muisti levy Suoritin

Lisätiedot

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python Ohjelmoinnin perusteet Y Python T-106.1208 2.3.2009 T-106.1208 Ohjelmoinnin perusteet Y 2.3.2009 1 / 28 Puhelinluettelo, koodi def lue_puhelinnumerot(): print "Anna lisattavat nimet ja numerot." print

Lisätiedot

Hakemistojen sisällöt säilötään linkitetyille listalle.

Hakemistojen sisällöt säilötään linkitetyille listalle. Harjoitustyö 1 Harjoitustyö Tehtävä: ohjelmoi Java-kielellä komentoikkunaa (komentotulkkia, komentoriviä) simuloiva olioperustainen ohjelma. Hakemistojen sisällöt säilötään linkitetyille listalle. Työ

Lisätiedot

Visual Basic -sovelluskehitin Juha Vitikka

Visual Basic -sovelluskehitin Juha Vitikka Visual Basic -sovelluskehitin Helsinki 30.10.2000 Seminaari HELSINGIN YLIOPISTO Tietojenkäsittelytieteen laitos Visual Basic sovelluskehitin Seminaari: Ohjelmistotuotantovälineet Tietojenkäsittelytieteen

Lisätiedot

tään painetussa ja käsin kirjoitetussa materiaalissa usein pienillä kreikkalaisilla

tään painetussa ja käsin kirjoitetussa materiaalissa usein pienillä kreikkalaisilla 2.5. YDIN-HASKELL 19 tään painetussa ja käsin kirjoitetussa materiaalissa usein pienillä kreikkalaisilla kirjaimilla. Jos Γ ja ovat tyyppilausekkeita, niin Γ on tyyppilauseke. Nuoli kirjoitetaan koneella

Lisätiedot

Osoitin ja viittaus C++:ssa

Osoitin ja viittaus C++:ssa Osoitin ja viittaus C++:ssa Osoitin yksinkertaiseen tietotyyppiin Osoitin on muuttuja, joka sisältää jonkin toisen samantyyppisen muuttujan osoitteen. Ohessa on esimerkkiohjelma, jossa määritellään kokonaislukumuuttuja

Lisätiedot

OHJELMISTOKEHITYS -suuntautumisvaihtoehto

OHJELMISTOKEHITYS -suuntautumisvaihtoehto OHJELMISTOKEHITYS -suuntautumisvaihtoehto Suuntautumisvaihtoehdon esittely 1. vuoden opiskelijoille Kari Laitinen www.oamk.fi/~karil/opetus.html Ohjelmistokehitys -opintosuunnan valitsevista henkilöistä

Lisätiedot