• Ei tuloksia

ABB IRB 120 -robotin ja konenäön yhdistäminen

N/A
N/A
Info
Lataa
Protected

Academic year: 2022

Jaa "ABB IRB 120 -robotin ja konenäön yhdistäminen"

Copied!
102
0
0

Kokoteksti

(1)

MIKKO TIRKKONEN

ABB IRB 120 -robotin ja konenäön yhdistäminen

SÄHKÖ- JA AUTOMAATIOTEKNIIKAN KOULUTUSOHJELMA

2020

(2)

Tekijä(t)

Tirkkonen, Mikko

Julkaisun laji Opinnäytetyö, AMK

Päivämäärä 12/2020

Sivumäärä 66

Julkaisun kieli Suomi

Julkaisun nimi

ABB IRB 120 -robotin ja konenäön yhdistäminen Tutkinto-ohjelma

Sähkö- ja automaatiotekniikka Tiivistelmä

Työn tarkoituksena oli yhdistää Cognexin 5100C-älykamera ABB:n IRB 120 -robottiin.

Kamera ja robotti kommunikoivat keskenään Telnet-protokollan avulla.

Älykameralle luotiin kaksi eri ohjelmaa. Yksi tunnistamaan noppia ja niiden väri sekä silmäluku ja toinen, joka tunnisti kuulia ja niiden värin. ABB:n robottia varten luotiin ohjelma, joka tiputti nopat kameran kuvausalueelle ja noukki ne pois kameralta saatujen tietojen perusteella. Lisäksi robotin ohjelma päästi kuulat vierimään kuvausalueelle ja poimi ne kameralta saatujen tietojen perusteella takaisin alustalleen.

Noppia ja kuulia varten 3D-tulostettiin omat alustat. Kameran kuvausaluetta varten suunniteltiin ja valmistettiin oma alusta. Robotin ohjelmaan tehtiin virhetilanteita tun- nistavia ominaisuuksia.

Aika ja laiterajoitusten vuoksi sovelluksesta ei tullut noppien osalta niin toimintavarmaa kuin haluttiin. Kuulien osalta sovellus oli varmatoimisempi.

Asiasanat

Automaattiset järjestelmät, konenäkö, robotiikka, tekniset järjestelmät

(3)

Author(s)

Tirkkonen, Mikko

Type of Publication Bachelor’s thesis, AMK

Date 12 2020

Number of pages

66 Language of publication:

Finnish

Title of publication

Connecting ABB IRB 120 robot to machine vision system Degree program

Electrical and Automation Engineering Abstract

The objective of the work was to connect a Cognex 5100C series smart camera to an ABB IRB 120 robot. The camera and robot communicated with each other over the Telnet protocol.

Two programs were created for the smart camera. One to recognize dice, their color and eye count and one to recognize colored marbles. The robot was programmed to pick the dice one by one and drop them in the field of view of the camera. Based on data received from the camera, the robot would pick the dice and return them to their point of origin.

Additionally, the robot was programmed to let loose the marbles, so they’d drop into the cameras field of view. The robot would then pick the marbles based on their color and return them to their point of origin.

Stands were designed and 3D printed for the dice and marbles. Additionally, a base was designed and made for where they would be dropped. The program for the robot con- tained some error handling capabilities.

Due to time and material limitations the dice part of the program did not end up as reliable as originally desired. The marbles part ended up more reliable.

Key words

Self-acting systems, machine vision, robotics, technical systems

(4)

SISÄLLYS

1 JOHDANTO ... 6

1.1 Tilaajan esittely ... 6

1.2 Työn esittely ... 6

2 LAITTEISTO, OHJELMISTOT JA TEKNOLOGIAT ... 8

2.1 Solidworks ... 8

2.2 Kamera ja In-Sight Explorer ... 8

2.3 RobotStudio ja ABB IRB 120 -robotti ... 9

2.4 3D-tulostus ... 10

3 ALUSTOJEN JA KIINNIKKEIDEN SUUNNITTELU JA TOTEUTUS ... 11

3.1 Pudotusalusta ... 11

3.2 Marmorikuulien alusta ... 12

3.3 Noppien alustat... 12

3.4 Kameran kiinnike ... 12

4 FYYSINEN YMPÄRISTÖ JA KYTKENNÄT ... 14

4.1 Kuvien tasalaatuisuuden varmistus ... 14

4.2 Kameran sijoittaminen ja kytkeminen ... 15

4.3 Pumpun kytkentä ... 15

4.4 Lisävalon kytkentä ... 17

5 ÄLYKAMERAN OHJELMAT ... 18

5.1 Noppien ohjelma ... 18

5.1.1 Noppien tunnistus ... 18

5.1.2 Kuvan kalibrointi ... 23

5.1.3 Silmälukujen tunnistus ... 26

5.1.4 Värien tunnistus ... 28

5.1.5 Tietojen koostaminen ... 31

5.1.6 Lisätietoja robotin ohjelmalle ... 32

5.2 Kuulien ohjelma ... 32

5.2.1 Kuulien tunnistus ... 33

5.2.2 Värien tunnistus ... 37

5.2.3 Kuulien kuvan kalibrointi ... 38

5.2.4 Paikka- ja väritietojen koostaminen ... 38

5.3 Telnet-kommunikointi ... 39

5.4 Native Mode -komennot ... 39

6 ROBOTIN OHJELMA ... 41

6.1 Ohjelman toimintalogiikka... 41

(5)

6.2 Work objectit ... 42

6.3 Paikkapisteet ... 43

6.3.1 wobjWoodBase-paikkapisteet ... 44

6.3.2 wobjVision-paikkapisteet ... 44

6.4 Ohjelmassa käytetyt funktiot... 45

6.4.1 SocketCreate ... 45

6.4.2 SocketConnect... 45

6.4.3 SocketSend ... 46

6.4.4 SocketReceive ... 46

6.4.5 StrPart ... 47

6.4.6 TPWrite & TPErase ... 47

6.4.7 StrLen ... 48

6.4.8 StrFind ... 48

6.4.9 StrToVal ... 49

6.4.10 NumToStr ... 49

6.4.11 Liikekäskyt MoveL, MoveJ ja offs ... 50

6.5 Ohjelman koodi ... 51

6.5.1 Main() ... 51

6.5.2 ConnectToInsight() ... 52

6.5.3 CheckStatus() ... 52

6.5.4 ChangeJobDice() & ChangeJobMarbles() ... 53

6.5.5 DropDice2() ... 53

6.5.6 GetVisionDataDice() ... 54

6.5.7 PickDiceRoutine() ja PickDiceRouticeC() ... 58

6.5.8 PickDiceConditionsW() ja PickDiceConditionsC() ... 58

6.5.9 PickDice() ... 58

6.5.10 MarbleDropSlide() ... 60

6.5.11 GetVisionDataMarbles() ... 60

6.5.12 MarblePickSlide() ... 60

7 ONGELMIA JA HAASTEITA... 62

7.1 COVID-19 ... 62

7.2 Robotin imukuppiongelmia ... 63

7.3 Valaistus ... 63

8 YHTEENVETO ... 65 LÄHTEET

LIITTEET

(6)

1 JOHDANTO

Tässä luvussa esitellään työn tilaaja ja käydään lävitse mitä työssä on tarkoitus tehdä.

1.1 Tilaajan esittely

Satakunnan Ammattikorkeakoulu on noin 6000 opiskelijan ja 400 työntekijän monia- lainen ja kansainvälisesti suuntautunut korkeakoulu. Koulu on painottunut teollisuus- korkeakouluksi. Vahvuusaloina ovat automaatio, robotiikka ja tekoäly sekä meren- kulku ja ikääntyvien palvelut. Koulun pääasiallinen kampus sijaitsee Porissa. Tämän lisäksi tiloja on Raumalla, Huittisissa sekä Kankaanpäässä. (Satakunnan Ammattikor- keakoulun www-sivut 2020.)

1.2 Työn esittely

Satakunnan Ammattikorkeakoulun Porin kampus jakaa tilansa K-Supermarketin ja ap- teekin kanssa. Lisäksi kampuksen vieressä on linja-autoasema sekä juna-asema. Kam- puksella on kaikille avoin kahvila. Tämä tuo kampuksen tiloihin paljon koulun ulko- puolista liikennettä. Automaatiolaboratoriossa on useita robotteja, jotka on sijoitettu ikkunoiden taakse niin, että ohikulkijat voivat nähdä niiden työskentelyä. ABB:n IRB 120-robotilla ei tällä hetkellä kuitenkaan ole olemassa mitään demo-ohjelmaa, joka voisi olla ohikulkijoiden iloksi käytössä. Tämä on erityisen valitettavaa, sillä robotin ikkuna on suoraan yhtä K-supermarketin sisääntuloa vastapäätä ja tarjoaisi hyvän mahdollisuuden esitellä robotin kykyjä ohikulkijoille.

Tämän työn tarkoitus on luoda robotille demo tätä tarkoitusta varten. Tarkoitus on, että robotti poimii alustan, jolla on erivärisiä marmorikuulia, ja kaataa ne älykameran nä- köalueelle olevalle alustalle. Tämän jälkeen robotti palauttaa kuulien alustan paikal- leen ja poimii kuulat takaisin sille, kameralta saatujen paikkatietojen perusteella. Oh- jelman toisessa vaiheessa, robotti tarttuu toiseen alustaan, jolla on noppia, ja kippaa ne kameran näköalueella olevalle alustalle. Tämän jälkeen robotti palauttaa noppien alus- tan paikalleen, ja poimii nopat takaisin alustalle silmälukuun perustuvassa järjestyk- sessä älykameran sille antamien tietojen perusteella.

(7)

Älykamerana käytetään Cognexin 5000-sarjan kameraa. Robotin ja älykameran ohjel- mien lisäksi demoa varten pitää mallintaa ja valmistaa kuulien ja noppien alustat. Li- säksi pitää valmistaa alue, jolle kuulat ja nopat kaadetaan.

(8)

2 LAITTEISTO, OHJELMISTOT JA TEKNOLOGIAT

Työssä käytettiin monia eri ohjelmia ja tekniikoita. Tässä luvussa esitellään ja käydään niitä tarkemmin lävitse.

2.1 Solidworks

Solidworks on Dassault Systemsin valmistama ohjelmistopaketti, joka sisältää 3D- mallinnusohjelman, jota käytetään erityisesti teolliseen suunnitteluun. Ohjelmapaketti sisältää myös muihin tarkoituksiin suunnattuja osia. Kokonaisuudesta löytyy muun- muassa virtapiirien suunniteluun tarkoitettu ohjelma sekä kappaleiden fysiikan simu- lointiin soveltuva ohjelma. 3D-mallinnusohjelman avulla suunniteltiin kameran kiin- nike ja käytetyt alustat. (Solidworks www-sivut 2020.)

2.2 Kamera ja In-Sight Explorer

Satakunnan Ammattikorkeakoulu antoi työtä varten Cognex 5100C -värikameran. Ka- meran sensori on kooltaan 1/3 tuumaa ja sillä pystyy ottamaan värillisiä kuvia 640x480 resoluutiolla. Kamerassa on ohjelmia varten 32MB muistia ja kuvien käsittelyä varten 64MB muistia. Kameraan oli kiinnitetty 12 mm linssi. (Cognex 2009, 18.)

Cognexin kameraan tehdään ohjelmia In-Sight Explorer nimisellä ohjelmistolla. Oh- jelmasta on tarjolla monia eri versioita. Työssä käytettiin versiota 4.9.1, sillä se on todettu kameran firmware-version kanssa yhteensopivaksi. In-Sight Explorer on Ex- cel-tyylinen taulukkoon perustuva ohjelmointiympäristö. Taulukon soluihin voidaan raahata erilaisia työkaluja, kirjoittaa kaavoja tai pelkkää tekstiä. Soluihin voidaan myös viitata samalla tavalla kuin Excelissä. Esimerkiksi B15 viittaa sarakkeen B riviin 15. (Leino n.d., 23.)

Raahatessa erilaisia työkaluja taulukkoon on hyvä pitää mielessä, että työkalu voi syöt- tää ulos tuloksia. Nämä tulokset voivat viedä useampia rivejä ja sarakkeita. Väljyys työkalujen sijoittelussa on siis syytä pitää mielessä, ettei esimerkiksi vahingossa yli- kirjoita jotain aiempaa tulosta tai työkalua. (Leino n.d., 42.)

(9)

2.3 RobotStudio ja ABB IRB 120 -robotti

RobotStudio on ABB:n tekemä simulointiohjelmisto ja offline-ohjelmointiympäristö, jolla voidaan mallintaa eri ABB-robotteja. Sillä voidaan etukäteen tehdä lähes kaikki robotin ohjelmointi liikeradoista erilaisiin monimutkaisempiin ohjelmiin asti. Ohjel- malla tehdyn koodin voi siirtää fyysiseen robottiin ja ottaa käyttöön.

ABB IRB 120 on kuusiakselinen käsivarsirobotti. Robotti painaa 25 kiloa ja on 700 mm korkea. Sen käsivarren ulottuvuus on 0,58 metriä (kuvat 1 ja 2) ja kantokyky kolme kilogrammaa. Robotti on IP30-suojattu ja sen voi asentaa mihin tahansa kul- maan. Robotin ranteesta löytyy 10 signaalilähtöä ja neljä ilmaläpivientiä. (ABB 2019, 2.)

Kuva 1. Robotin työskentelyalue sivultapäin katsottuna (ABB 2019, 2)

(10)

Kuva 2. Robotin työskentelyalue ylähäältäpäin katsottuna (ABB 2019, 2)

2.4 3D-tulostus

3D-tulostuksessa tietokoneella tehdystä 3D-mallista tulostetaan fyysinen esine. Tämä tapahtuu lisäämällä kerroksittain materiaalia, kunnes kappale on valmis. Materiaaleina käytetään yleensä erilaisia muoveja, mutta myös metallin käyttö on mahdollista. Tek- niikkaa käytettiin alustojen ja kameran kiinnikkeen valmistukseen. Tulostukseen käy- tettiin sekä ASA- että PLA-muoveja. (3dprinting.com www-sivut 2020.)

(11)

3 ALUSTOJEN JA KIINNIKKEIDEN SUUNNITTELU JA TOTEU- TUS

Alun perin tarkoituksena oli, että alustat suunnittelisi ja valmistaisi työn tekijä. Olo- suhteiden muutoksen takia puisen alustan sekä noppien alustat suunnitteli työn ohjaaja.

Kuulien alustan suunnitteli työn tekijä.

3.1 Pudotusalusta

Pudotusalusta valmistettiin puusta. Siinä on neljä koko alustasta läpi menevää reikää, jotta se saadaan kiinnitettyä robotin työpöytään tukevasti kiinni. Alustassa on mustalla kankaalla vuorattu, syvenevä alue, jolle noppia ja kuulia pudotetaan. Noppien alus- toille on omat, matalammat syvennyksensä kuten myös kuulien alustalle. Kuvassa 3 näkyy kaikki alustat.

Kuva 3. Alustakokonaisuus

(12)

Puinen alusta toimii koko työn toiminta-alustana. Siihen opetetaan robottia varten oma Object Frame, johon robotin liikkeet sidotaan noppien ja kuulien pudotusta varten.

Myös kameran kuvausalueelle tehdään oma Object Frame, joka taas sidotaan alustaan tehtyyn Object Frameen. Tällä tavoin, mikäli alustaa siirretään, tarvitsee vain opettaa uudelleen sen sijainti ja loput Object Framet liikkuvat samassa suhteessa.

3.2 Marmorikuulien alusta

Kuulien alusta on 3D-tulostettu, 10 asteen kulmassa alaspäin viettävä mäki. Mäessä on 12 cm pitkä osuus, jolle kuulia tiputetaan. Tämän jälkeen tulee levennys porttia varten, joka estää kuulia liukumasta kameran näköalueelle. Portin yläpäässä on pyöreä alue, josta robotti tarttuu siihen ja nostaa sen pois paikaltaan, kun kuulien halutaan liukuvan kameran kuvausalueelle. Mäkeä varten tulostettiin kaksi jalkaa, jotka asetta- vat mäen 10 asteen kulmaan. Kuvassa 3 mäki on vasemmalla, mustan pudotusalueen alapuolella. Tarkempi piirustus alustasta, portista ja kahdesta jalasta löytyy liitteestä 1.

3.3 Noppien alustat

Noppia varten on kaksi 3D-tulostettua alustaa. Alustan keskellä on robottia varten tart- tumisalue. Alueen vasemmalla ja oikealla puolella on tilaa kahdelle nopalle. Jokaisella nopalla on oma syvennyksensä, jossa on pieni ramppi, jotta noppa vierii helpommin pois alustalta. Värillisten noppien alustassa syvennykset ovat hieman pienempiä, koska myös nopat ovat valkoisia pienempiä. Kuvassa 3 noppien alustat ovat oikealla, mustan pudotusalueen alapuolella.

3.4 Kameran kiinnike

Kamera kiinnitettiin robotin yläpuolella olevaan alumiiniseen palkkiin. Palkissa itses- sään ei ole sopivaa kiinnityskohtaa kameraa varten, joten sellainen oli tehtävä. Kiin- nike valmistettiin 3D-tulostamalla. Kappale mallinnettiin Solidworksissa. Se on U:n

(13)

muotoinen, jossa on siivekkeet kameran ruuveja varten. Keskikohta menee alumiini- sen palkin päälle, jolloin kamera voidaan kiinnittää sen alapuolelle. Kuva 4 näyttää kameran takapuolen tarkat mitat, joihin kiinnike perustuu.

Kuva 4. Piirros kameran takalevyn kiinnityksistä (Cognex 2011, 11)

Reiät ovat M4-kierteellä ja 8,0 mm syviä. Leveyssuunnassa reikien etäisyys on 50,0 mm ja pituussuunnassa 98,0 mm. Näiden mittojen mukaan suunniteltiin valmistettava kiinnike. Tarkempi piirustus kiinnikkeestä löytyy liitteestä 2.

(14)

4 FYYSINEN YMPÄRISTÖ JA KYTKENNÄT

Robotti on sijoitettu ikkunan eteen. Kuvassa 5 näkyy myös oikealla ja vasemmalla erikseen asennetut suojaseinät. Robottia ympäröi siis kolmelta sivulta fyysinen este, joka estää robotin työskentelyalueelle kulun. Kuvassa 5 oikealla näkyvä keltainen palkki on valoverho, joka lauetessaan pysäyttää robotin. Valoverho suojaa ainoaa kul- kureittiä robotin työskentelyalueelle.

Kuva 5. Kokonaiskuva robotista

4.1 Kuvien tasalaatuisuuden varmistus

Tehtäessä kuvantunnistusta on ensiarvoisen tärkeää, että kuvat ovat tasalaatuisia.

Muutos valaistukseen tai ohitse kulkevan ihmisen varjo voivat johtaa siihen, että oh- jelman asetuksilla ei enää tunnisteta kuvasta siinä olevia esineitä.

Valaistuksen tasaisena pitäminen vaati lisävalaistuksen asentamista, vaikka tila si- nänsä oli hyvin valaistu jo valmiiksi. Robotti on ikkunan takana, jota vastapäätä on

(15)

kaupan lasiset sisääntulo-ovet. Näiden ovien kautta ulkoa tuleva valo riitti muuttamaan kuvan valoisuutta sen verran, että aurinkoisena päivänä kappaleet saattoivat löytyä hy- vin, mutta pilvisenä päivänä raja-arvoja täytyi säätää, jotta kappaleet löytyivät. Lisä- valaistuksen myötä ulkoa tuleva valo vaikutti kuviin vähemmän. Suora auringonvalo oli kuitenkin edelleen riittävän voimakas, että sen kohdalle osuminen oli otettava huo- mioon kameran ja robotin ohjelmia tehtäessä.

Käytetty tausta ja sen väri on myös tärkeää huomioida. Valkoinen noppa ei erotu val- koiselta taustalta kovin hyvin ja toisaalta varjot näkyvät valkoisella taustalla selkeästi häiriten kuvasta tunnistamista. Tämän vuoksi työhön valittiin musta tausta. Se eliminoi varjot sekä mahdolliset valon heijastukset taustasta.

4.2 Kameran sijoittaminen ja kytkeminen

Kamera ripustettiin robotin työpöydän yläpuolelle alumiinisia palkkeja sekä 3D-tulos- tettua kiinnikettä käyttäen. Kamera kytkettiin Ethernet-johdolla suoraan robotin kont- rolleriin kiinni. Johdon pituus katsottiin sopivaksi, koska ylimääräistä johtoa ei jäänyt suurta määrää.

4.3 Pumpun kytkentä

Imukuppia varten robotti tarvitsi erillisen vakuumipumpun. Robotissa oli aikaisemmin ollut pumppu kytkettynä, joten robotin kontrollerissa oli jo valmiiksi tehty tarvittavat kytkennät, että imun saa päälle. Pumppu tarvitsi vain fyysisesti kytkeä robotin jalus- tassa olevaan ilmaletkuun sekä robotin pöydän alla olevaan releeseen ja virtalähtee- seen. Pumppu on Rietschle Thomas:n valmistama 1420VP/24V-mallinen, johon on kytkettynä Univerin AA-0211-venttiili. Laitteet löytyvät kuvasta 6. Niiden sähkökyt- kentä löytyy kuvasta 7.

(16)

Kuva 6. Pumppu ja venttiili

Kuva 7. Pumpun ja venttiilin sähkökytkentä

Pumpun ja venttiilin (+) johdot (kuva 7, punaiset johdot) kytkettiin rinnakkain relee- seen, joka on kytkettynä sen vieressä olevaan virtalähteeseen. Pumpun ja venttiilin (-) johdot (kuva 7, mustat johdot, joissa valkoinen kaulus) kytkettiin virtalähteen (-V) lii-

(17)

täntöihin. Robotissa oli valmiina digitaalinen ulostulo, jolla relettä pystyttiin komen- tamaan päälle ja pois. Kun robotissa oleva digitaalinen ulostulo laitetaan päälle, niin pumppu käynnistyy ja imu lähtee päälle.

4.4 Lisävalon kytkentä

Lisävalo on sarja alumiiniseen palkkiin kiinnitettyjä ledejä. Ledeistä lähti + ja – johdot.

Virtaa antamaan otettiin kannettavan muuntaja. Muuntaja ja LED-palkin johdot kyt- kettiin toisiinsa kytkentäriman avulla. Muuntajan johto oli rakenteeltaan kerrokselli- nen. Miinusjohdin kulki ulkokuoren alla. Plusjohto kulki erillisen suojakerroksen alla, miinusjohtimen ympäröimänä.

Lisävalo ripustettiin samalla tavalla kuin kameran palkki. Se sijoitettiin hieman sivuun kuvausalueesta, koska suoraan yläpuolelta tullessa, sen luoma valo loi liikaa heijas- tuksia.

(18)

5 ÄLYKAMERAN OHJELMAT

Älykameran ohjelmat toteutettiin In-Sight Explorer -ohjelman versiolla 4.9.1. Ensim- mäisen ohjelman tuli tunnistaa erivärisiä noppia, kertoa niiden sijainnin koordinaatis- tossa, sekä mikä silmäluku minkäkin värisellä nopalla on. Toisessa ohjelmassa kame- ran tulee tunnistaa värillisiä kuulia ja kertoa niiden väri ja sijainti.

5.1 Noppien ohjelma

Noppien ohjelman tarkoituksena on tunnistaa noppien sijainti, laskea niiden määrä sekä tunnistaa niiden väri ja silmäluku. Jokaisen yksittäisen nopan tiedot kootaan merkkijonoksi, jonka robotin ohjelma lukee kameralta.

5.1.1 Noppien tunnistus

Noppien tunnistukseen käytetään TrainPatMaxPattern- sekä FindPatMaxPattern-työ- kaluja. Ensimmäisenä kuvasta luodaan harmaasävyinen versio käyttäen ColorTo- GreyscaleFilter-työkalua (kuva 8). Työkalun saa raahattua ohjelman oikeassa reunassa olevasta työkaluvalikosta, kohdasta Image.

Kuva 8. ColorToGreyscaleFilter-työkalun asetukset

(19)

Työkalulle tarvitsee kertoa vain missä solussa sijaitsee kuva, joka halutaan muuttaa harmaasävyiseksi. Tässä tapauksessa kuva sijaitsee solussa P4. Laittamalla $-merkit P:n ja 4:n eteen lukitaan viittaus soluun. Mikäli työkalu siirretään taulukossa toiseen soluun, niin ohjelma ei koita automaattisesti muuttaa viittausta suhteessa kuvan sijain- tiin.

Seuraavaksi taulukkoon tuodaan PointFilter-niminen työkalu. Sillä muutetaan kuva mustavalkoiseksi. Työkalun asetukset löytyvät kuvasta 9.

Kuva 9. PointFilter-työkalun asetukset

Image-kohdassa viitataan soluun, jossa sijaitsee kuva, joka halutaan muuttaa musta- valkoiseksi. Työkalu tarjoaa erilaisia vaihtoehtoja, miten kuva muutetaan. Tässä ta- pauksessa käytetään Threshold range -tapaa. Minimi- ja maksimiarvoja, sekä

(20)

threshold-arvoa muuttamalla, haetaan sellaiset asetukset, että nopat löytyvät kokonai- sina neliöinä kuvasta. Noppien silmälukujen ei tule näkyä löytyneissä kuvioissa. Esi- merkki siitä, miltä tämän tulisi näyttää, löytyy kuvasta 10.

Kuva 10. Noppien hahmot PointFilter-työkalua käyttäen

Koska valkoiset ja värilliset nopat ovat erilaisia, pitää molempien kuvio opettaa erik- seen. Kuvion opetukseen käytetään TrainPatMaxPattern-työkalua. Työkalun asetukset löytyvät kuvasta 11 ja esimerkki opetetusta kuviosta kuvasta 12.

(21)

Kuva 11. TrainPatMaxPattern-työkalun asetukset

Image-kohdassa asetetaan työkalu hakemaan kuviota PointFilter-työkalun kuvasta.

Tuplaklikkaamalla Pattern Region -kohtaa, saadaan avattua ikkuna, jossa voidaan määritellä alue, jolla opetettava kuvio on. Punaista hakualuetta saa siirrettyä ja kokoa muutettua sen reunoista vetämällä. Alue hyväksytään painamalla Enter-näppäintä. En- simmäisenä opetettiin valkoisten noppien kuvio.

Kuva 12. Opetettu nopan kuvio.

Samanlainen työkalu luotiin vielä värillisille nopille. Kun molemmat kuviot on ope- tettu, voidaan alkaa etsiä noppia kuvasta. Tämä tapahtuu FindPatMaxPattern-työkalua käyttäen. Työkalun asetuksista löytyy esimerkki kuvasta 13.

(22)

Kuva 13. FindPatMaxPattern-työkalun asetukset

Noppia haetaan jälleen PointFilter-kuvasta. Tämä määritellään image-kohtaan. Find Region -kohdassa määritellään alue, jolta opetettua kuviota haetaan. Tuplaklikkaa- malla otsikkoa, aukeaa näkymä, jossa on punainen neliö, joka määrää hakualueen. Pu- nainen neliö tulee suurentaa niin, että se kattaa koko kuvan. Alue hyväksytään paina- malla Enter-näppäintä.

Pattern kohtaan laitetaan viittaus soluun, johon TrainPatMaxPattern-työkalulla on ope- tettu kuvio (esim. B5). Number to Find -kohdassa määritellään, montako kuviota etsi- tään. Valkoisia noppia on neljä, joten arvoksi annetaan tämä. Accept-kohdan arvoa muuttamalla voidaan määritellä, kuinka tarkkaan löytyneen kuvion tulee vastata ope- tettua.

Hyväksytään asetukset painamalla Ok. Työkalu lisää taulukkoon useita rivejä ja sa- rakkeita, sisältäen löytyneiden kuvioiden sijainnin, kulman, skaalan sekä työkalun an- taman pistemäärän. Värillisiä noppia varten luodaan oma työkalu samalla tavalla.

(23)

5.1.2 Kuvan kalibrointi

Kuvan kalibroinnilla tarkoitetaan pikselien linkittämistä oikean maailman mittayksi- öihin, kuten esimerkiksi millimetreihin. Tämän lisäksi kalibroinnissa voidaan kertoa kameran ohjelmalle, missä suunnassa X- ja Y-akselit ovat. Tämä toimenpide on teh- tävä, jotta robotille saadaan siirrettyä noppien sijainti robotin käyttämässä koordinaa- tistossa.

Kalibrointi tapahtuu CalibrateGrid-nimisellä työkalulla. Työkalun saa raahattua tau- lukkoon oikealla olevasta työkaluvalikosta. Tämän jälkeen aukeaa kuvan 14 mukainen ikkuna.

Kuva 14. CalibrateGrid-ikkuna

Aukeavasta Setup-ikkunasta saa tulostettua kalibrointia varten tarvittavan ruudukon.

Tulostettavaa ruudukkoa voi muokata tarvetta vastaavaksi. Tässä tapauksessa Grid Type, Grid Spacing ja Grid Units ovat ne, jotka kiinnostavat.

(24)

Grid Type -kohdassa valitaan, minkä tyylinen ruudukko tulostetaan. Valitaan kohtaan Checkerboard, with fiducial. Cherkerboard tarkoittaa ruudukkoa, jossa on vuoron pe- rään mustia ja valkoisia neliöitä. Lisäys, with fiducial, tuo ruudukkoon lisäksi kaksi valkoista palkkia, jotka kertovat X- ja Y-akselien suunnan.

Grid Spacing kohdassa pystyy määrittelemään, kuinka suuri yksi neliö ruudukossa on.

Mikäli kameran kuva-alue on laaja, niin isommat neliöt ovat järkeviä, kun taas kuva- alueen ollessa pieni, pienemmät neliöt ovat järkeviä. Työssä käytetyn ruudukon kooksi on valittu 10 mm ja ruudukko on tulostettu niin, että se on A4-paperin kokoinen. Grid Units -kohdassa määritellään, mitä mittayksikkö ruudukossa käytetään. Tähän valittiin millimetrit.

Kun asetukset ovat halutulla tavalla kunnossa, niin tulostetaan ruudukko. Tulostetusta ruudukosta on tämän jälkeen otettava kameralla kuva samassa asennossa kuin kuvat- tavat kohteet ovat. Kuvasta on pyrittävä saamaan mahdollisimman tarkka, jotta kalib- rointi onnistuu hyvin. Asetusikkuna löytyy kuvasta 15.

Kuva 15. Kalibroinnin Pose-näkymä

(25)

Kuvan voi ottaa joko niin, että sen tallentaa erilliseen tiedostoon, jonka jälkeen se hae- taan Pose-kohdassa From File -nappia painamalla. Kuvan voi myös ottaa livenä Trig- ger-nappia painamalla. Kun kuva on haettu, painetaan Calibrate-nappia, minkä jälkeen näkyviin tulee kuvan 16 mukainen tulosruutu.

Kuva 16. Kalibroinnin tulosruutu

Tulosruutu kertoo, kuinka hyvä kalibrointikuva on. Mikäli tulos on huono, otetaan uusi, parempi kuva, ja suoritetaan kalibrointi uudelleen. Mikäli tulos on hyväksyttävä, painetaan ok ja taulukkoon ilmestyy kalibroitu kuva siihen soluun, johon työkalu lai- tettiin.

Kalibroinnin jälkeen on varmistettava, että ColorToGreyScale-, PointFilter-, TrainPat- MaxPattern- sekä FindPatMaxPattern-työkalut käyttävät kalibroitua kuvaa. ColorTo- GreyScale-työkalulla on myös luotava versio, joka on kalibroimaton, sillä sitä käyte- tään silmälukujen tunnistuksessa.

(26)

5.1.3 Silmälukujen tunnistus

Noppien silmälukujen tunnistus toteutetaan ExtractBlobs-työkalun avulla. Ennen tätä on kuitenkin työkalua varten luotava X- ja Y-koordinaatteja varten tarvittavat tiedot.

Tämä tapahtuu käyttäen TransWorldToPixel-työkalua. Työkaluun haetaan FindPat- maxPattern-työkalujen antamat Col- ja Row-tiedot. Esimerkki työkalun asetuksista löytyy kuvasta 17.

Kuva 17. TransWorldToPixel-työkalun asetukset

Calib-kohtaan annetaan solu, josta löytyy kalibroitu kuva. Point-kohtaa laajentamalla saadaan X- ja Y-koordinaattien solujen paikat. X tarkoittaa Colum-arvoa ja Y tarkoit- taa Row-arvoa FindPatMaxPattern-työkalusta. Jokaiselle löytyneelle nopalle tulee luoda oma TransWorldToPixel-työkalunsa. Silmälukujen etsiminen voidaan aloittaa, kun nämä työkalut on tehty. Käytetyn ExtractBlobs-työkalun asetukset löytyvät ku- vasta 18.

(27)

Kuva 18. Esimerkki ExtractBlobs-työkalun asetuksista

Image kohdassa viitataan kalibroimattomaan harmaasävykuvaan. Region-kohtaa kak- soisklikkaamalla pystytään määrittämään alue, jolta blobeja haeteen. Alue tulee raa- hata sen nopan ylle, johon työkalu sidotaan. Alueen koko tulee rajata niin, että se on hieman noppaa pienempi, mutta kattaa kuitenkin alueen, jolla silmälukuja esiintyy.

Kuvassa 18 työkalu on sidottu ensimmäiseen löytyneeseen valkoiseen noppaan.

Fixture-kohtaa laajentamalla päästään sitomaan hakualue löytyneen nopan sijaintiin.

Row-kohdassa viitataan TransWorldToPixel-työkalun antamaan X-arvoon ensimmäi- sestä löytyneestä valkoisesta nopasta. Y-kohdassa viitataan taas Column-arvoon.

Theta on viittaus ensimmäisen löytyneen valkoisen nopan Angle-arvoon.

Number to sort -kohdassa kerrottaan, montako blobia maksimissaan haetaan. Koska käytössä on kuusisivuiset nopat, annetaan kohdan arvoksi 6. Threshold-kohdassa mää- ritellään raja-arvoa blobin löytymiselle. Arvoksi laitetaan 90, jotta vältytään siltä, että työkalu löytäisi esimerkiksi valon heijastuman silmäluvun sijaan.

(28)

Valkoisen nopan ollessa kyseessä, Color: Blob -kohtaan valitaan black ja Color: Back- round -kohtaan valitaan white. Värillisten noppien kohdalla näiden kohtien arvot ovat toisinpäin, koska värillisten noppien silmäluvut ovat valkoisia eikä mustia.

Area Limit -kohdilla rajataan vielä, kuinka suuria blobeja haetaan. ExtractBlobs-työ- kaluja tehdään jokaiselle nopalle omansa. On tärkeää, että noppien hakualueet laite- taan aina vastaamaan sitä löytynyttä noppaa, jonka tietoja haetaan.

5.1.4 Värien tunnistus

Värien tunnistuksessa käytetään TrainMatchColor- ja MatchColor-työkaluja. Työka- lut raahataan taulukkoon samalla tavalla kuin muutkin työkalut. TrainMatchColor-työ- kalulla opetetaan värit ja MatchColor-työkalulla opetettuja värejä tunnistetaan ku- vasta. Koska noppien värit on ennalta määrättyjä ja valkoiset nopat ovat isompia kuin värilliset, ei valkoista väriä tarvitse opettaa. Voidaan aina olettaa, että valkoiset nopat ovat siihen tarkoitetulla työkalulla etsittyjä.

TrainMatchColor-työkalussa uusi väri lisätään painamalla Add New Color -nappia.

Tämä aukaisee ikkunan, jossa määritellään, miltä alueelta väri opetetaan. Oletuksena tarjolla on ympyrän muotoinen alue, jonka kokoa ja sijaintia voi muuttaa. Alue sijoi- tetaan niin, että siinä on mahdollisimman paljon haluttua väriä. Tämän jälkeen alue hyväksytään painamalla Enter-näppäintä. Värin nimen voi muuttaa kaksoisklikkaa- malla sen nimeä listassa. Color Tolerance -kohdasta on mahdollista kertoa työkalulle, kuinka paljon tummempi tai vaaleampi väri vielä hyväksytään opetetuksi väriksi. Ku- vassa 19 näkyy TrainMatchColor-työkalun asetusikkuna.

(29)

Kuva 19. TrainMatchColor-työkalun asetusikkuna

Tarvittaessa Add New Color -napin yläpuolelta löytyy erimuotoisia aluetyökaluja sekä myös työkalu vapaasti piirrettävän alueen käyttöön. Loput opetettavat värit opetetaan samalla periaatteella.

MatchColor-työkalu etsii opetettuja värejä. Tämä työkalu antaa ulos tuloksia, joten sille on hyvä varata tilaa taulukosta. Jokaiselle nopalle luodaan oma MatchColor-työ- kalu. Kuvassa 20 näkyy Pose-ikkuna.

(30)

Kuva 20. MatchColor-työkalun asetukset

Image-kohdassa viitataan soluun, josta löytyy alkuperäinen värikuva. Match Color Library -kohdassa viitataan soluun, johon TrainMatchColor-työkalu sijoitettiin. Näin työkalu saa tietoonsa, mitä värejä sen tulee etsiä.

Fixture-kohdassa määritellään mihin löytyneeseen kappaleeseen hakualue sidotaan.

Linkitys tapahtuu samalla tavalla kuin ExtractBlobs-työkaluilla silmälukujen haun yh- teydessä. Koska tietoja haetaan vain värillisistä nopista, vain näiden tietoihin tehdään linkitys. Työkaluja luodaan siis vain neljä kappaletta.

Region-kohdassa määritellään miltä alueelta värejä etsitään. Hakualue määritellään sa- malla tavalla, kuin ExtraBlobs-työkaluille silmälukujen etsinnässä.

Colors-välilehdeltä löytyy lista väreistä, joita työkalu etsii. On syytä tarkistaa, että jo- kaisen värin kohdalla on ruksi ruudussa. Muutoin väriä ei etsitä.

(31)

5.1.5 Tietojen koostaminen

Tuloksien koostamiseen käytetään FormatString-työkalua. Sen avulla voidaan koota useammassa solussa oleva tieto yhteen soluun. Kun työkalun raahaa taulukkoon, niin aukeaa kuvan 21 mukainen ikkuna.

Kuva 21. FormatString-asetusikkuna

Tiedot erotellaan toisistaan puolipistettä käyttäen. Syntynyt merkkijono myös pääte- tään puolipisteellä. Robotin ohjelmassa tiedot haetaan tämän erotusmerkin perusteella.

Koottuun merkkijonoon haetaan kalibroidusta FindPatMaxPattern-työkalusta Row-, Column- ja Angle-tiedot sekä nopan silmäluku ja väri. Valkoisten noppien osalta vä- ritieto on kirjattu erikseen soluihin ja värillisten noppien osalta tieto haetaan Match- Color-työkalun tiedoista. Decimal places -kohdassa voidaan määritellä, monenko de- simaalin tarkkuudella kukin luku esitetään.

(32)

5.1.6 Lisätietoja robotin ohjelmalle

Robotin ohjelma tarvitsee kameralta vielä muutamia lisätietoja. Ensimmäisenä tarvi- taan tieto siitä, montako kappaletta kuvasta on löydetty. Noppia on maksimissaan kah- deksan kuvassa, joten siitä vähennetään FindPatMaxPattern-työkalujen Angle-koh- dasta löytyvien virheellisten solujen määrä. Mikäli kaikki nopat löytyvät, solu saa ar- vokseen luvun 7. Mikäli esimerkiksi kaksi noppaa jää jostain syystä uupumaan, niin solu saa arvokseen luvun 6.

Robotin ohjelmalle välitetään myös tieto löytyneiden virheellisten solujen määrästä.

Tätä tietoa käytetään robotin ohjelmassa päättämään, tarvitseeko ottaa uusi kuva. Tä- hän käytetään jälleen CountError-työkalua ja hakualueeksi annetaan molempien FindPatMaxPattern-työkalujen tulosalueet.

5.2 Kuulien ohjelma

Kuulien ohjelma toteutetaan hieman eri tavalla kuin noppien ohjelma. Käytetyt työka- lut ovat kuitenkin samoja, TrainPatMaxPattern sekä FindPatMaxPattern. Työn alussa tehdään mustavalkoinen kuva samalla tavalla (ColorToGreyScaleFilter-työkalulla), kuin noppien kanssa. Kuvassa 22 näkyy ohjelma kokonaisuudessaan yleiskuvan saa- miseksi.

(33)

Kuva 22. Kuulien ohjelma kokonaisuudessaan

5.2.1 Kuulien tunnistus

Kuulien tunnistamiseksi soluun B3 luodaan PointFilter-niminen työkalu. Tämä luo ku- vasta mustavalkoisen version, jossa jokainen kuula erottuu valkoisena ympyränä. Työ- kalun asetuksista klikataan region-kohtaa ja aukeavasta näkymästä raahataan punainen hakualue niin, että se kattaa koko kuva-alueen. Alue hyväksytään Enteriä painamalla.

Valikossa määritellään myös mihin kuvaan (Image) työkalu kohdistetaan. Tähän lai- tetaan viittaus kalibroituun kuvaan, joka löytyy solusta P4. Kuvassa 23 on esimerkki, miltä kuvausalue näyttää työkalun kanssa.

(34)

Kuva 23. PointFilterin kuva-alue

Seuraavaksi ohjelmaan tuodaan TrainPatMaxPattern-työkalu. Työkalulle opetetaan yksi valkoinen ympyrä samalla tavalla kuin noppien ohjelmassa. Esimerkki haetusta kuviosta löytyy kuvasta 24. Image-kenttään laitetaan viittaus soluun B3, jossa on PointFilterin luoma kuva.

Kuva 24. TrainPatMaxPattern-työkalun kuvio

(35)

Soluun G1 luodaan työkalu EditCompositeRegion. Työkalulla saadaan rajattua haku- aluetta niin, että siinä on vain valkoinen ympyrä ja sen ympärillä olevat valkoiset pis- teet jäävät pois. Tämän tapahtuu ensin raahaamalla punainen neliö niin, että se sisältää valkoisen ympyrän. Tämän jälkeen klikataan neliön sisälle oikealla hiiren napilla ja valitaan aukeavasta valikosta Add subregion → Circle. Raahataan ympyrä neliön si- sällä niin, että se sisältää valkoisen ympyrän. Lopputuloksen tulisi näyttään kuvan 25 mukaiselta.

Kuva 25. EditCompositeRegion-työkalun alueet

Hyväksytään alueet painamalla enteriä. Klikataan TrainPatMaxPattern-työkalu jälleen auki ja lisätään ExternalRegion-kohtaan viittaus EditCompositeRegion-työkaluun eli soluun G1. Esimerkki asetuksista löytyy kuvasta 26.

(36)

Kuva 26. TrainPatMaxPattern-työkalun asetukset

Soluun A6 lisätään FindPatMaxPattern-työkalu. Image kohtaan laitetaan työkalu viit- taamaan soluun B3. Find Region määritellään kattamaan koko kuva-alue. Pattern- kohta laitetaan viittamaan soluun D3, josta löytyy juuri tehty pattern. Number to find -kohdan arvoksi laitetaan 7, joka on kuulien maksimimäärä. Hyväksytään asetukset klikkaamalla ok. Taulukkoon ilmestyy löytyneet patternit koordinaatteineen.

Soluun I3 luodaan kopio jo tehdystä PointFilter-työkalusta ja asetetaan sen Image- kohtaan arvoksi B2. Solusta löytyy kalibroimaton ColorToGreyScaleFilter-kuva. Tä- män jälkeen luodaan kopio jo luodusta FindPatmaxPattern-työkalusta. Kopio asetetaan soluun H6. Työkalun image-kohta muutetaan viittaamaan soluun I3. Näin saadaan vä- rien hakua varten kalibroimattomat sijainnit löytyneille patterneille.

(37)

5.2.2 Värien tunnistus

Värien tunnistus toteutetaan samalla tavalla kuin noppien kanssa. Käytetään siis TrainMatchColor- ja MatchColor-työkaluja. Kuulien sijaintitietoina käytetään kalib- roimattoman FindPatMaxPattern-työkalun tietoja. Värien opetus tapahtuu helpoiten käyttämällä ympyränmuotoista opetusaluetta. Esimerkit työkalujen asetuksista löyty- vät kuvista 27 ja 28.

Kuva 27. Kuulien värien opetus

Kuva 28. Esimerkki kuulan värin hakemisesta

(38)

5.2.3 Kuulien kuvan kalibrointi

Kuulien kuvan kalibroinnissa käytetään samaa tapaa ja kuvaa kuin noppien kanssa.

CalibrateGrid-työkalu sijoitetaan soluun O4 ja CalibrateImage-soluun P4. Näillä kuu- lien kuva saadaan kalibroitua niin, että kameran antamat pikselilukemat muuttuvat oi- keanmaailman mittayksiköiksi. Kuten noppienkin työssä, yksikköinä käytetään milli- metrejä.

5.2.4 Paikka- ja väritietojen koostaminen

Paikka- ja väritiedot koostetaan robotin ohjelmaa varten käyttäen FormatString-työka- lua. Erottimena käytetään puolipistettä ja jokainen kerätty tieto myös päätetään puoli- pisteellä. Robotille lähetetään X-, Y- ja väritiedot. Esimerkki tietojen koostamisesta löytyy kuvasta 29. Tiedot lähetetään robotille yhden desimaalin tarkkuudella.

Kuva 29. Tietojen koostaminen

(39)

5.3 Telnet-kommunikointi

Kommunikointi toteutetaan Telnet-protokollaa käyttäen Cognexin Native Mode -ko- mennoilla. Telnet-yhteyden luontia varten ei tarvitse tehdä mitään erityisiä asetuksia.

On kuitenkin hyvä varmistaa, mitä porttia kamera käyttää kommunikointiin. Tämän saa selville In-Sight Explorer -ohjelmassa menemällä valikkoon Sensor → Network Settings. Aukeavasta valikosta löytyy kohta Telnet Port. Oletuksena arvon pitäisi olla 23. Valikosta saa myös selville kameran IP-osoitteen, jotta yhteyttä voi testata.

Yhteyden testaamiseen käy mikä tahansa Telnet-ohjelmisto. On syytä huomioida, että joissain ohjelmissa Telnet-yhteyden muodostustavaksi pitää valita passiivinen. Muu- toin yhteys ei toimi.

Onnistuneen yhteyden luonnin jälkeen kamera kysyy käyttäjätunnusta ja salasanaa.

Oletuksena sisään pääsee tunnuksella admin. Salasana on tyhjä. Oikeassa tuotantoym- päristössä salasanan asettaminen olisi tietoturvan kannalta järkevää, joskin tällöinkin hyöty olisi kyseenalaista, koska Telnet ei salaa tiedonkulkua millään tavalla. Salasana kulkisi siis verkon ylitse selkokielisenä ja olisi helposti hyökkääjän siepattavissa.

5.4 Native Mode -komennot

Cognex tarjoaa laajan valikoiman niin kutsuttuja Native Mode -komentoja, joilla ka- meraa voidaan käskyttää. Tämän työn osalta komentoja tarvitaan kuvan ottamiseen, tulosten hakuun, työn vaihtamiseen sekä kameran asettamiseen Online- ja Offline-ti- loihin. Komennot eivät erottele isoja tai pieniä kirjaimia. Jokainen komento päättyy Carrier Return (CR)- ja Line Feed (LF)-merkkeihin (ASCII merkit 13 + 10) Telnet- yhteyttä käyttäessä. Jokainen komento palauttaa luvun 1, mikäli komento onnistuu ja tämän jälkeen tulostaa tuloksen. Mikäli komento epäonnistuu, se palauttaa negatiivi- sen luvun (esim. -2). Mikäli palautettava luku on 0, on komento tuntematon. (Cognex In-Sight Explorer Help 2020.)

(40)

Työssä käytetään seuraavia komentoja:

• SW8 - Ottaa kuvan. Palauttaa 1 onnistuessaan.

• SJ[numero] - Asettaa annetun numeroisen työn aktiiviseksi. Kameran pitää olla offline-tilassa. Työn tiedostonimessä tulee olla ensimmäisenä kirjaimena työn numero, jotta komento tunnistaa oikean työn. Sopiva työn nimi on siis esimer- kiksi 1dice.job tai 2marbles.job.

• GV[Sarake][Rivi] - Hakee annetun solun arvon. Esimerkiksi komento GVC001 palauttaa solun C1 arvon.

• SO[Numero] - Kameran asettaminen online tilaan [1] tai offline [0] tilaan

(41)

6 ROBOTIN OHJELMA

Tämän työn tarkoituksena ei ole toimia johdatuksena RAPID-ohjelmointikieleen tai ohjelmointiin ylipäätänsä. Koodia ei käydä rivi riviltä läpi eikä ohjelmointikielen syn- taksia ja muita ominaispiirteitä avata sen tarkemmin. Ohjelmakokonaisuus käydään kuitenkin läpi niin, että sen toimintaperiaate tulee selväksi ja ohjelmointikielen perus- teet osaava pystyy sen, ja liitteenä olevan kommentoidun koodin avulla, toteuttamaan vastaavan kokonaisuuden.

6.1 Ohjelman toimintalogiikka

Ennen kuin kirjoittaa riviäkään koodia, on hyvä olla selvillä, mitä ohjelman pitäisi tehdä. Tässä tapauksessa ohjelmalla on selkeitä erillisiä toimintakokonaisuuksia ja as- keleita. Selostuksen selkeyttämiseksi alustoille on annettu omat kirjaimensa. A tar- koitta puista alustaa ja siinä olevaa kuvausaluetta, B viitta kuulien alustaan, C valkois- ten noppien alustaan ja D värillisten noppien alustaan.

1. Ohjelma käynnistetään ja robotti ottaa yhteyden kameraan Telnetin ylitse.

2. Robotti noukkii nopan alustalta (C).

3. Robotti tiputtaa nopan sille varatulle alustalle (A).

4. Robotti noukkii loput nopat yksitellen alustalta (C), tiputtaa ne alustalle (A) ja toistaa toimenpiteen alustan (D) nopille.

5. Robotti antaa käskyn älykameralle ottaa alustasta (A) kuvan ja palauttaa robo- tille tiedon noppien silmäluvusta, väristä ja sijainnista.

6. Robotti noukkii nopat alustalta (A) silmäluvun ja värien määräämässä järjes- tyksessä ja palauttaa ne alustalle (C ja D).

7. Robotti nostaa alustan (B) porttia, jotta kuulat vierivät alustalle (A).

8. Robotti palauttaa alustan (B) portin paikalleen.

9. Robotti antaa käskyn älykameralle ottaa alustasta (A) kuvan ja palauttaa robo- tille tiedon kuulien väristä ja sijainnista.

10. Robotti noukkii kuulat värin perusteella alustalta (A) ja palauttaa ne niille va- ratulle alustalle (B).

11. Ohjelma suoritetaan uudelleen alusta alkaen päättymättömänä kierroksena.

(42)

Näin esitettynä ohjelman toiminnallisuus on helppo tajuta. Lisäksi se on pilkottu pie- nempiin osiin, jotka on helppo toteuttaa yksitellen omina kokonaisuuksinaan.

6.2 Work objectit

Work object eli työkohde on robotille opetettu koordinaatisto, jolla on tietyt ominai- suudet. Työkohteita käytetään yksinkertaistamaan ohjelmointia tilanteissa, joissa työ- kappale voi siirtyä eri paikkaan. (ABB 2018, 192.)

Esimerkiksi tässä työssä wobjWoodBase on nimensä mukaisesti sidottu puiseen alus- taan, jolla kaikki muut työn osat ovat. Kun robotille opetetaan paikkapisteet suhteessa tähän koordinaatistoon, niin mikäli alusta siirtyy, tarvitsee vain opettaa uudelleen, missä wobjWoodBase-koordinaatiston origo on. Yksittäisiä paikkapisteitä ei siis tar- vitse erikseen opettaa uudelleen.

Ohjelmaa varten luodaan kaksi erillistä work objectia. wobjWoodBase opetetaan pui- sen alustan reunan mukaan ja wobjVision opetetaan suhteutettuna wobjWoodBase koordinaatistoon niin, että sen origo vastaa älykameran kalibroinnin yhteydessä mää- ritellyn origon sijaintia. Kuvassa 30 suuntaa antavasti, missä koordinaatistojen origot sijaitsevat.

(43)

Kuva 30. Koordinaatistojen origojen sijainnit

Työkoordinaatistojen opetukseen käytettiin kolmipiste menetelmää. Menetelmässä opetetaan X-akselilta kaksi pistettä ja yksi piste Y-askelilta. Tarkempi ohje, miten ope- tus tapahtuu, löytyy sivulta 194 ABB:n Käyttäjän opas – IRC5 ja FlexPendant doku- mentista (2018).

6.3 Paikkapisteet

Paikkapiste on johonkin robotin käytössä olevaan koordinaatistoon opetettu piste. Sen avulla robotille kerrotaan, minne sen tulisi liikkua ja missä asennossa sen akselien tu- lisi olla pisteeseen päästyään. (ABB 2010, 1176.)

Kappaleiden pudotukseen ja takaisin paikalleen laittoon liittyvät paikkapisteet opete- taan suhteutettuna wobjWoodBase-koordinaatistoon. Ainoat pisteet, jotka opetetaan wobjVision-koordinaatistoon suhteutettuna, ovat kappaleiden poimintaan ja pudotuk- seen käytetyt pisteet.

(44)

Pisteiden opetukseen löytyy ohje ABB:n dokumentista Käyttäjän Opas – IRC5 ja Flex- Pendant sivulta 166 alkaen (2018). Pisteitä opettaessa on tärkeää pitää mielessä, että robottia liikutetaan ja opetetaan silloin, kun käytössä on oikea työkoordinaatisto.

6.3.1 wobjWoodBase-paikkapisteet

Kappaleiden pudotukseen ja paikalleen nostoon liittyvät paikkapisteet opetettiin wob- jWoodBase-koordinaatiston suhteen. Tämä pitää sisällään kuulien portin nostoon liit- tyvät paikkapisteet sekä kuulien takaisin paikalleen pudotusta varten tehdyt pisteet.

Myös noppien pudotukseen liittyvät pisteet opetettiin tämän koordinaatiston suhteen, poissulkien kuvausalueen yläpuolella oleva piste. Noppien takaisin alustalle pudotuk- seen liittyvät pisteet opetettiin myös tämän koordinaatiston suhteen.

6.3.2 wobjVision-paikkapisteet

pVisPick on paikkapiste, joka opetetaan wobjVision-työkoordinaatiston suhteen. Se sijoitetaan wobjVision-koordinaatiston origoon. Paikkapistettä käytetään kameran nä- köalueella olevien kappaleiden poimintaan. Paikkapistettä siirretään käyttäen Off-ko- mentoa, sekä antamalla sille parametreinä kameralta saadut sijainti tiedot.

MoveL Offs(pVisPick,arrMarbleX{Index},arrMarbleY{Index},- 12),v500,fine,tool0\WObj:=wobjVision;

Yllä oleva liikekäsky siirtää robotin kuulasta saadun X- ja Y-koordinaattien osoitta- maan sijaintiin ja menee 12 millimetriä alemmaksi, kuin opetettu piste.

pVisDrop-paikkapiste on noppien yksitellen pudottamiseen opetettu piste. Sitä siirrel- lään Offs-komennolla, jotta vältyttäisiin siltä, että nopat putoaisivat toistensa päälle.

(45)

6.4 Ohjelmassa käytetyt funktiot

Tässä luvussa käydään tarkemmin lävitse työssä käytettyjä funktioita. Ohjelmassa käytetään RAPID-kielen omia funktioita tiettyjen asioiden tekemiseen, joten niiden käyttötarkoitus ja toiminta on syytä käydä läpi, jotta koodista saa helpommin selvää.

6.4.1 SocketCreate

SocketCreate-komentoa käytetään luomaan uusi socket TCP/IP- tai UDP/IP-yhteyden luomista varten. Tätä varten luodaan uusi muuttuja, jonka tyyppi on socketdev. Ko- mento hyväksyy vain socketdev-tyyppisiä muuttujia.

Esimerkkikoodi:

VAR socketdev socket1;

...

SocketCreate socket1;

Kaikki Socket-komennot vaativat, että robotin kontrollerissa on enabloitu PC Interface -ominaisuus. (ABB 2010, 460.)

6.4.2 SocketConnect

SocketConnect-komennolla luodaan yhteys toiseen laitteeseen. Komennolla kerrotaan SocketCreate-komennolla luodulle socket-muuttujalle kohdelaitteen IP-osoite sekä portti numero, johon yhteyttä koitetaan luoda.

Esimerkkikoodi:

SocketConnect socket1, "192.168.0.1", 23;

(46)

Edellinen komento luo yhteyden IP-osoitteeseen 192.168.0.1 ja käyttää porttia 23. Mi- käli nämä tiedot sijoitetaan muuttujiin, tulee IP-osoitteen olla muotoa merkkijono ja portin numeerista tietoa. (ABB 2010, 457.)

6.4.3 SocketSend

SocketSend-komennolla voidaan lähettää dataa toiselle laitteelle. Toimiakseen ko- mento vaatii, että SocketCreate-komennolla on luotu socket kommunikaatiota varten ja yhteys toiseen laitteeseen on luoto SocketConnect-komennolla. (ABB 2010, 469.)

Esimerkkikoodi:

SocketSend socket1 \Str := "Hello world";

Edellinen komento lähettää “Hello World” -merkkijonon toiselle laitteelle.

6.4.4 SocketReceive

SocketReceive-komentoa käytetään datan vastaanottoon toiselta laitteelta. Vastaanote- tut viestit voivat olla tyypiltään merkkijonoja (string), raakadataa, aikakoodeja tai bit- timäärien lukemista. Toimiakseen komento vaatii, että SocketCreate-komennolla on luotu socket kommunikaatiota varten ja yhteys toiseen laitteeseen on luotu SocketCon- nect-komennolla. (ABB 2010, 464.)

Esimerkkikoodi string-tyyppisen datan vastaanotosta:

VAR string str_data;

...

SocketReceive socket1 \Str := str_data;

Koodi lukee vastaanotetun datan str_data-nimiseen muuttujaan. Huomattavaa on, että RAPID-kielessä luettavan merkkijonon maksimipituus on 80 merkkiä. (ABB 2010, 464.)

(47)

6.4.5 StrPart

StrPart (String Part) -komento etsii annetusta merkkijonosta määritellyltä merkkivä- liltä löytyvät merkit ja muodostaa niistä uuden merkkijonon.

Esimerkkikoodi:

VAR string part;

part := StrPart("Robotics",1,5);

Ensin määritellään merkkijonotyyppinen muuttuja part. Tämän jälkeen muuttujaan luetaan StrPart-komennolla ensimmäiset viisi merkkiä sanasta “Robotics”. Part-muut- tuja saa siis arvokseen “Robot”. Annettu merkkijono voi olla tyypiltään muuttuja, kun- han se on merkkijonotyyppiä. Myös alku- ja loppu-arvot voidaan antaa muuttujilla, kunhan ne ovat tyypiltään numeerisia. (ABB 2010, 1005.)

6.4.6 TPWrite & TPErase

TPWrite-komennolla kirjoitetaan viesti robotin flexpendantin näytölle. Tämä on kä- tevä tapa antaa käyttäjälle palautetta siitä, mitä ohjelma tekee.

Esimerkkikoodi:

TPWrite "Execution started";

Komento kirjoittaa flexpendantin näytölle merkkijono “Execution started”. Komen- toon on mahdollista lisätä tietoa muuttujista, olivat ne sitten tyypiltään numeerisia tai merkkijonomuotoisia. (ABB 2010, 568.)

TPErase-komennolla pyyhitään flexpendantin näytölle jo kirjoitetut viestit. Tämä on kätevä tapa vähentää pendantille lähetettyjen viestien aiheuttamaa tietovyöryä. Ko- mento ei ota vastaan erillisiä argumentteja. (ABB 2010, 556.)

(48)

6.4.7 StrLen

StrLen (String Length) -komennolla voidaan selvittää annetun merkkijonon pituus.

Tämä tieto voidaan sijoittaa uuteen muuttujaan, joka on numeerista muotoa.

Esimerkkikoodi:

VAR num len;

len := StrLen("Robotics");

Esimerkissä len-muuttuja saa arvokseen 8, koska “Robotics” merkkijonossa on 8 merkkiä. Len-muuttujaa voidaan puolestaan tämän jälkeen käyttää esimerkiksi StrPart komennon yhteydessä. (ABB 2010, 996.)

Esimerkkikoodi:

part := StrPart("Robotics",2,len);

Part-muuttuja saisi esimerkkikoodissa arvokseen “obotics”, sillä haettavien merkkien väliksi tulisi merkistä 2 merkkiin 8.

6.4.8 StrFind

StrFind (String Find) -komennolla voidaan etsiä määriteltyä merkkiä alkaen määritel- lystä kohdasta merkkijonoa. Komento palauttaa numeerisena arvona, monesko merkki merkkijonossa vastaa etsittyä merkkiä. (ABB 2010, 994.)

Esimerkkikoodi:

VAR num found;

found := StrFind("Robotics",1,"aeiou");

(49)

Ensimmäisenä argumenttina StrFind ottaa merkkijonon, josta merkkiä etsitään. Toi- sena argumenttina annetaan kohta merkkijonossa, josta etsintä aloitetaan. Kolmantena annetaan merkit, joita etsitään. Esimerkissä found-muuttuja saa arvon 2, sillä toisena merkkinä on o-kirjain, ja tämä on kirjainten joukossa, jota etsitään. Antamalla komen- nolle eri määreitä kolmantena argumenttina, on myös mahdollista etsiä ensimmäistä numeromuotoista merkkiä (STR_DIGIT), välilyöntiä (STR_WHITE) tai merkkiä, joka ei ole määriteltyjen etsittävien joukossa ("aeiou"\NotInSet). (ABB 2010, 994.)

Käyttämällä StrFind-, StrLen- ja StrPart-komentoja yhdessä on mahdollista pilkkoa pitkiäkin merkkijonoja yksittäisiksi tiedon paloiksi, kunhan merkkijonossa käytetään jotain tiedossa olevaa erottelu merkkiä.

6.4.9 StrToVal

StrToVal (String To Val) –komento muuttaa string-tyyppisen muuttujan minkä ta- hansa muun tyyppiseksi muuttujaksi.

Esimerkkikoodi:

VAR bool ok;

VAR num nval;

ok := StrToVal("3.85",nval);

Muutos laitetaan boolean-tyyppisen muuttujan taakse. Näin saadaan helposti varmis- tettua, onnistuiko muutos, sillä muuttuja ok saa arvon TRUE vain, mikäli muutos on- nistuu. StrToVal-komento ottaa ensimmäisenä argumenttina string-tyyppisen muuttu- jan tai suoraan merkkijonon. Toisena arguenttina tulee muuttuja, mihin muunnettu tieto tallennetaan. Esimerkissä nval-muuttuja saa siis arvokseen 3.85. (ABB 2010, 1010.)

6.4.10 NumToStr

NumToStr (Numeric To String) –komento muuttaa numeerisen arvon stringiksi.

(50)

Esimerkkikoodi:

VAR string str;

str := NumToStr(0.38521,3);

NumToStr ottaa ensimmäiseksi argumentiksi numeerisen arvon joko suoraan numeron tai muuttujaa kutsumalla. Toisella argumentilla määritellään, monenko desimaalin tarkkuudella numero esitetään. Tässä tapauksessa str-muuttuja saa arvokseen “0.385”

eli numero muutetaan stringiksi kolmen desimaalin tarkkuudella. (ABB 2010, 904.)

6.4.11 Liikekäskyt MoveL, MoveJ ja offs

MoveL-käsky liikuttaa robottia lineaarisesti niin, että työkalupiste liikkuu suoraa vii- vaap pitkin määriteltyyn pisteeseen. Komento saa parametreinä paikkapisteen, mihin robotti ajetaan (p1), nopeuden (v1000), tarkkuuden (z30) sekä käytetyön työkalupis- teen (tool2). (ABB 2010, 264.)

Esimerkki komennosta:

MoveL p1, v1000, z30, tool2;

MoveJ-komentoa käytetään, kun robotin ei tarvitse liikkua annettuun pisteeseen line- aarisesti, vaan robotti voi itse päättää niveltensä liikuttamisen ja siten sen, miten pyy- dettyyn pisteeseen liikutaan. Liikekäskyä käyttäessä robotin liike on siis epälineaa- rista. Komento ottaa vastaan samat parametrin, kuin MoveL komento. (ABB 2010, 253.)

Offs-komentoa käytetään ilmoittamaan robotille uusi piste suhteessa jo opetettuun pis- teeseen. Sitä käytetään yhdessä MoveL- tai MoveJ-komentojen kanssa. Komento saa parametreinä tunnetun paikapisteen sekä muutoksen suhteessa tunnetun paikkapisteen X-, Y- tai Z-koordinaatteihin. (ABB 2010, 906.)

(51)

Esimerkki komennosta:

MoveL Offs(p2, 0, 0, 10), v1000, z50, tool1;

Komento ajaa robotin lineaarisesti 10 mm ylemmäksi Z-suunnassa, kuin mitä paikka- piste p2 on alun perin opetettu. Komennon hyöty on siinä, että uutta paikkapistettä ei välttämättä tarvitse erikseen opettaa. Tämä on hyödyllistä esimerkiksi, kun samanko- koisia kappaleita pitää latoa vierekkäin. Jokaiselle kappaleelle ei tarvitse opettaa omaa paikkapistettä, vaan riittää, että on opetettu yksi paikkapiste ja robottia käsketään liik- kumaan sen suhteen seuraavia kappaleita ladottaessa.

6.5 Ohjelman koodi

Ohjelma on toteutettu useiden aliohjelmien avulla. Se pohjautuu Cognexin esimerkki- koodiin, joskin siihen on tehty huomattavia lisäyksiä ja muutoksia. Rivittämätön esi- merkkikoodi löytyy In-Sight Explorerin help-kannasta. Ohjelman koodi löytyy koko- naisuudessaan liitteestä 3. (Cognex Support Site www-sivut 2020.)

6.5.1 Main()

Jokaisessa RAPID-ohjelmassa on Main-ohjelma, jota robotti suorittaa. Tapa, jolla oh- jelma on toteutettu tässä työssä johtaa siihen, että Main-kohdassa kutsutaan lähinnä vain muita aliohjelmia, jotka hoitavat kaiken robotin liikkeistä, kameraan yhdistämi- seen ja tietojen lukemiseen kameralta. Osion rakenne vastaakin hyvin pitkälti luvussa 7.1 esiteltyä toimintalogiikkaa.

Esimmäisenä kutsutaan ConnectToInsight-ohjelmaa, joka yhdistää robotin kameraan Telnetin ylitse. Seuraavaksi kutsutaan ChangeJobDice-ohjelmaa, joka varmistaa, että kameraan on ladattu noppien ohjelma. Sitten kutsutaan ohjelmaa DropDice2, joka oh- jaa robotin pudottamaan nopat kameran kuvausalueelle. Tämän jälkeen kutsutaan oh-

(52)

jelmaa GetVisionDataDicev2, joka ohjeistaa kameraa ottamaan kuvan ja robottia lu- kemaan tulokset ohjelmaan. Seuraavaksi kutsutaan ohjelmaa PickDice, joka ohjaa ro- botin poimimaan nopat ja palauttamaan ne alustoilleen.

Tämän jälkeen kutsutaan ohjelmaa ChangeJobMarbles, joka lataa kameraan marmo- rikuulien ohjelman. Tätä seuraa MarbleDropSlide-ohjelma, joka ohjeistaa robottia pudottamaan kuulat kameran näköalueelle. Kuulien sijaintitedot haetaan kutsumalla ohjelmaa GetVisionDataMarbles. Kuulat poimitaan takaisin alustalleen kutsumalla MarblePickSlide-ohjelmaa. Yksi ohjelman sykli on tämän jälkeen ajettu läpi. Ohjel- man ajo voidaan aloittaa alusta.

6.5.2 ConnectToInsight()

ConnectToInsight-ohjelma alkaa luomalla socket-tyyppinen muuttuja (SocketCreate ComSocket), johon määritellään kameran IP-osoite sekä portti, johon yhteyttä koite- taan luoda (SocketConnect). Tietoja vastaanotetaan komennolla SocketReceive Com- Socket. Tiedot tuleva merkkijonona, joten ne luetaan merkkijono (string) -tyyppiseen muuttujaan. Tämän jälkeen ohjelma tarkistaa, että vastaanotettu merkkijono vastaa käyttäjänimeä pyytävää kehotetta. Mikäli näin ei ole, niin ohjelma kirjoittaa robotin pendantille virheilmoituksen ja ohjelman suoritus pysäytetään.

Mikäli käyttäjänimeä pyytävä kehote on paikallaan, ohjelma lähettää käyttäjänimen ja salasanan. Tämä tapahtuu komennolla SocketSend ComSocket \Str:="admin"+CRLF;.

Salasana lähtee samanlaisella komennolla, joskin lähetettävä merkkijono on tyhjä, jo- ten lähetetään vain komento CRLF.

Lopuksi ohjelma tarkistaa, että kameralta saadaan “User Logged In” merkkijono. Näin varmistetaan, että sisäänkirjautuminen on onnistunut.

6.5.3 CheckStatus()

CheckStatus on pieni apuohjelma, jonka avulla tarkistetaan komentojen onnistunut suoritus. Se tarkistaa, että lähetetyn komennon jälkeen kameran vastaus on “1”+CRLF,

(53)

eli merkki komennon onnistumisesta. Mikäli kamera vastaa jotain muuta, ohjelma kir- joittaa virheilmoituksen robotin pendantille ja ohjelman suoritus pysäytetään. Tätä apuohjelmaa hyödynnetään lähes jokaisessa muussa ohjelmassa.

6.5.4 ChangeJobDice() & ChangeJobMarbles()

ChangeJobDice-ohjelma vaihtaa kamerassa olevan työn noppien työksi. Ensimmäi- senä ohjelma tarkistaa, onko kamera Online- vai Offline-tilassa. Työn vaihto onnistuu vain Offline-tilassa, joten ohjelma asettaa kameran Offline-tilaan, mikäli se on tarpeen.

Tämä käy komennolla SocketSend ComSocket \Str:="SO0"+CRLF;. Komennon on- nistuminen tarkistetaan kutsumalla CheckStatus-ohjelmaa.

Kun kamera on Offline-tilassa, aktiivinen työ asetetaan komennolla SocketSend Com- Socket \Str:="SJ1"+CRLF;. Komennon onnistuminen tarkistetaan jälleen CheckSta- tus-ohjelmaa kutsumalla. Onnistumisesta kirjoitetaan myös robotin pendantille viesti.

Kun työ on onnistuneesti vaihdettu, kamera asetetaan jälleen Online-tilaan. Tämä ta- pahtuu komennolla SocketSend ComSocket \Str:="SO1"+CRLF;. Onnistuminen tar- kistetaan jälleen CheckStatus-ohjelmaa kutsumalla.

ChangeJobMarbles-ohjelma toimii muutoin samoin kuin ChangeJobDice, mutta se la- taa kameran käyttöön kuulien ohjelman. Tämä tapahtuu komennolla SocketSend Com- Socket \Str:="SJ2"+CRLF;. Muutoin ohjelman toiminta on täysin identtinen Chan- geJobDice-ohjelman kanssa.

6.5.5 DropDice2()

DropDice2-ohjelma sisältää tarvittavat liikekäskyt noppien pudottamiseen alustalle sekä imun päälle ja pois laittamiseen. Opetettuja paikkapisteitä on lähestymispiste noppien yläpuolelle, nopan nostopiste sekä noppien alustalle pudottamista varten tehty

(54)

piste. Noppien noukkimiseen alustalta on vain yksi piste, jota siirretään offs-komen- nolla sen mukaan, monesko noppa on noukittavana. Näiden pisteiden avulla robottia ohjataan käyttäen joko liikerataa (MoveL) tai (MoveJ).

6.5.6 GetVisionDataDice()

GetVisionDataDice-ohjelma on vastuussa tietojen hakemisesta kameralta. Haetut X-, Y-, Angle-, silmäluku- ja nopan väri -tiedot tallennetaan jokainen omaan taulukko (ar- ray) -tyyppiseen muuttujaan (esim. arrX, arrY). Tiedonhaun toteuttamiseen koitettiin kahta eri tapaa. Ensimmäinen tapa on toteutukseltaan suoraviivaisempi, kun taas tapa kaksi vaatii hieman enemmän ohjelmoinnin ymmärtämistä. Näistä tapa kaksi todettiin nopeammaksi, joten sitä käytettiin lopullisessa ohjelmassa. Tässä kuitenkin käydään molemmat toteutustavat lävitse, sillä kumpikin on toimiva. Käytettävän tavan valinta riippuu omasta sovelluksesta ja sen tarpeista.

Tapa 1: Jokaisen tiedon haku yksitellen

Tavassa 1 varsinaiset tiedonhakukomennot sijoitetaan while-silmukaan, jota suorite- taan, kunnes boolean-tyyppinen muuttuja bPartFound saa arvon TRUE. Muuttuja saa arvon TRUE, kun löydettyjen osien lukumäärä vastaa jokaisella suorituskierroksella kasvavaa Index-muuttujan arvoa.

Seuraavaksi ohjelma tarkistaa, että yhteys kameraan on muodostettu. Tämän jälkeen se ohjeistaa kameraa ottamaan kuvan, lähettämällä native mode -komennon SW8. Tä- män jälkeen ohjelma pyytää tiedon solun B018 arvosta. Soluun on tallennettu tieto, kuinka monta #ERROR-arvoista solua kameran ohjelmassa on löytyneiden kappalei- den alueella. Mikäli erroreita ei ole, ohjelma jatkaa suorittamista. Mikäli erroreita on, otetaan uusi kuva, kunnes saadaan sellainen, jossa ei ole error-arvoisia soluja.

Tämän jälkeen ohjelma pyytää tiedon solun O008 arvosta. Tähän soluun on tallennettu tieto, montako kappaletta kameran ohjelma on löytänyt. Tämä tieto tallennetaan muut- tujaan PartsFound.

(55)

Tämän jälkeen alkaa FOR-silmukka, joka käy pyytämässä kameralta tiedot solu ker- rallaan. Silmukkaa suoritetaan, kunnes muuttujan i arvo vastaa muuttujan PartFound arvoa.

Esimerkkikoodi yhden X-arvon hausta:

SocketSend ComSocket \Str:="gvd0" + CellsRangeStartstr + CRLF;

! Read the data

SocketReceive ComSocket \Str:=stReceived;

StringLength:=StrLen(stReceived)-5;

XData:= StrPart(stReceived, 4, StringLength);

bOK:=StrToVal(xData,nXData);

arrX{Index}:=nXData;

Ohjelma lähettää käskyn hakea tieto solusta D0 + CellsRangeStarstr-muuttujan arvo.

Ohjelman suorituksen alussa, muuttujan arvo on 11, joten ensimmäinen tieto löytyy solusta D011. Jokaisen silmukan lopussa muuttujan arvoa kasvatetaan yhdellä. Näin seuraavalla suorituskerralla tieto haetaan yhtä solua alempaa (D012, D013 jne.). Ka- meran vastaus tallennetaan muuttujaan stReveived, josta se sijoitetaan muuttujaan XData niin, että viestin mukana tullut turha tieto (esim. viestin lopussa oleva rivin- vaihto komento) jää pois.

FOR-silmukan lopussa muuttuja XData muutetaan numeeriseksi ja sijoitetaan muut- tujaan nXData. Tämä numeerinen muuttuja taas sijoitetaan arrX-taulukkoon Index- muuttujan määrittelemään paikkaan. Index-muuttujan arvoa kasvatetaan jokaisella sil- mukan suorituskerralla. Näin kolmannen kappaleen X-koordinaatti tallentuu taulukon kohtaan 3, ensimmäisen kohtaan 1 jne.

Y-, Angle-, silmäluku- ja väritiedot haetaan samalla periaatteella. Ainoa muutos on solun sijainti, josta tieto löytyy, sekä muuttuja, johon saatu tieto sijoitetaan.

(56)

On huomioitava, että jokaiseen kameralle tehtyyn kyselyyn kuluu tietty määrä aikaa.

Mikäli kyselyitä on suuri määrä voi syntyä tilanne, jossa robotti on pitkänkin aikaa tekemättä mitään. Se, onko tämä ongelma, riippuu ohjelman käyttötarkoituksesta. Esi- merkkikoodi tämän tavan toteutuksesta löytyy liitteestä 3.

Tapa 2: Tietojen haku koostetusti

Tavassa kaksi jokaisen nopan tiedot koostetaan kameran ohjelmassa omaksi merkki- jonoksi, jonka robotin ohjelma lukee. Tämän jälkeen robotin ohjelma purkaa merkki- jonon yksittäisiin osiin ja tallentaa saadun tiedon niille varattuihin taulukoihin. Tällä tavalla verkon yli menevien kyselyjen määrä saadaan vähennettyä neljästäkymme- nestä kahdeksaan. Tämä nopeuttaa huomattavasti ohjelman toimintaa.

Ohjelman rakenne on muutoin sama kuin tavassa yksi, mutta tiedonhaku tapahtuu vain yhdestä sarakkeesta. Koostetut tiedot löytyvät sarakkeesta K riviltä 31 alaspäin. Tiedot haetaan siis komennolla SocketSend ComSocket \Str:="gvk0" + CellsRangeStartstr + CRLF;.

CellsrangeStartstr-muuttujalle on annettu arvoksi 31. Muuttujan arvoa kasvatetaan jo- kaisella toistorakenteen suorituskerralla. Vastauksena saadaan merkkijono, joka voi olla esimerkiksi ”-14.5;-31.2;-177.2;4;w;”. Purettuna merkkijono tarkoittaa, että kap- paleen sijainti on X-suunnassa -14.5, Y-suunnassa -31.2, sen kulma on -177.2, silmä- luku on 4 ja väri on w eli valkoinen. Seuraavaksi robotin ohjelma pilkkoo saadun merkkijonon sen sisältämiin yksittäisiin tietoihin.

Prosessi alkaa selvittämällä, missä jokainen erottajamerkkinä toimiva puolipiste sijait- see. Tähän käytetään StrFind-funktiota.

nXPos:=StrFind(stReceived, 3, ";");

nYPos:=StrFind(stReceived, nXpos+1, ";");

nAnglePos:=StrFind(stReceived, nYpos+1, ";");

nEyeCountPos:=StrFind(stReceived, nAnglePos+1, ";");

nColourPos:=StrFind(stReceived, nEyeCountPos+1, ";");

(57)

StrFind palauttaa numerona tiedon siitä, kuinka monentena etsitty merkki on merkki- jonossa. Näin saadaan selvitettyä erotusmerkkien sijainnit. Seuraavan merkin etsintä aloitetaan aina yhden edellistä löytynyttä merkkiä edempää. Kun erotusmerkkien si- jainnit on saatu selville, voidaan merkkijono pilkkoa sen yksittäisiin osiin.

xData:=StrPart(stReceived, 3, nXPos-2);

yData:=StrPart(stReceived, nXPos+1, nYPos-nXPos-1);

sAngle:=StrPart(stReceived, nYPos+1, nAnglePos-nYPos-1);

sEyeCount:=StrPart(stReceived, nAnglePos+1, nEyeCountPos- nAnglePos-1);

sDiceColour:=StrPart(stReceived, nEyeCountPos+1, nColourPos- nEyeCountPos-1);

Pilkkomiseen käytetään StrPart-funktiota. Merkkijono on tallennettu muuttujaan stReceived. Etsintäalue määräytyy erotinmerkkien sijainnin avulla. Esimerkiksi yData-muuttujaan tieto etsitään yksi merkki eteenpäin nXPos-erottimen sijainnista ja lopetetaan yksi merkki ennen nYPos-erottimen sijainnista, kun siitä on vähennetty nXPos-erottimen sijainti. Samalla logiikalla käydään koko merkkijono lävitse. Lo- puksi ykisttäiset tiedot tallennetaan niille varattuihin talukoihin.

bOK:=StrToVal(xData,nXData);

arrX{Index}:=nXData;

bOK:=StrToVal(yData,nYData);

arrY{Index}:=nYData;

bOK:=StrToVal(sAngle,nAngle);

arrAngle{Index}:=nAngle;

bOK:=StrToVal(sEyeCount,nEyeCount);

arrDiceNumber{Index}:=nEyeCount;

arrDiceColour{Index}:=sDiceColour;

Tiedon sijainti taulukossa määräytyy Index-muuttujan arvon mukaan. Sen arvo ensim- mäisellä toistorakenteen suorituksella on 1 ja sitä kasvatetaan jokaisella kierroksella.

(58)

Tavasta yksi poiketen verkkokyselyjä syntyy tällä tavalla vain niin monta, kuin noppia on alustalla. Robotin ohjelma on huomattavasti nopeampi pilkkomaan merkkijonoja verrattuna verkkokyselyn vaatimaan aikaan. Robotin hakiessa tietoja yksitellen ohjel- malla saattoi kestää jopa seitsemän tai kahdeksan sekuntia ennen, kuin kaikki tiedot oli haettu. Koostetulla tavalla saman tiedon keruuseen menee vain sekunti tai kaksi.

Hyöty ohjelman toimintanopeuteen on siis huomattava ja tämän vuoksi tapa valittiin lopulliseen ohjelmaan.

6.5.7 PickDiceRoutine() ja PickDiceRouticeC()

PickDiceRoutine- ja PickDiceRouticeC-ohjelmien tarkoitus on vähentää koodin tois- toa. PickDiceRoutine sisältää valkoisien noppien poimintaa varten vaadittavat liike- käskyt ja vastaavasti PickDiceRoutineC sisältää värillisiä noppia varten liikkeet. Oh- jelmat ovat erikseen, koska nopat ovat erikokoisia, joten työkalua täytyy tuoda värilli- siä noppia varten alemmaksi kuin valkoisia poimiessa. Ohjelmia kutsutaan PickDice- ohjelmassa, kun noppa pitää poimia kameran näkemältä alueelta.

6.5.8 PickDiceConditionsW() ja PickDiceConditionsC()

PickDiceConditionsW- ja PickDiceConditionsC-ohjelmat sisältävät noppien alustalle pudotukseen vaadittavat liikekäskyt, sekä pudotuspisteen siirrot. Pudotuspisteen si- jaintia muutetaan nXOffs- ja nYOffs-muuttujilla riippuen siitä, monesko poimittava noppa on kyseessä. Koska ohjelma poimii aina valkoiset nopat ensin ja tämän jälkeen värilliset, sijainnit voidaan koodata pysyvämmin, kuin jos noppien poimintajärjestys muuttuisi ohjelmaa suorittaessa.

6.5.9 PickDice()

Ensimmäinen toimenpide PickDice-ohjelmassa on laskea kulma, jonka verran robotin tulee kääntää noppaa, jotta se on pudotusalustaan nähden suorassa kulmassa. Tämä tarvitsee tehdä, koska nopille on varattu neliönmuotoiset kolot alustalla. Mikäli noppaa ei käännetä oikein, se ei putoa sille varattuun koloon, vaan jää vinoon. Tällöin nopan poiminta uudella suorituskerralla epäonnistuu.

(59)

Kulman laskenta tapahtuu FOR-toistorakenteen sisällä olevilla WHILElauseilla. Las- kennan tulos tallennetaan arrAngle-taulukkoon, kunkin nopan kohdalle.

PickDice-ohjelma käy löydetyt nopat lävitse ja poimii ne määrätyssä järjestyksessä.

Ensimmäisenä poimitaan valkoiset nopat, suurimmasta silmäluvusta pienimpään. Tä- män jälkeen värilliset nopat järjestyksessä punainen, lila, sininen, vihreä. Seuraavassa on esimerkkikoodi oikean nopan löytämiseksi:

FOR i FROM 1 TO PartsFound DO

! Only pick dice if Colour is white and eyecount is 6

IF arrDiceColour{Index}="w" AND arrDiceNumber{Index}=6 THEN PickDiceRoutine;

Incr nDicePicked;

PickDiceConditionsW;

ENDIF Incr Index;

ENDFOR

FOR-silmukkaa suoritetaan, kunnes i:n arvo vastaa PartsFound-muuttujan arvoa, ts.

kunnes kaikki löytyneet kappaleet on käyty läpi. FOR-silmukan sisällä oleva IF-sil- mukka toteutuu vain, jos nopan väri on valkoinen ja sen silmäluku on 6. Mikäli nämä ehdot täyttyvät, ohjeistetaan robotti poimimaan noppa saaduista koordinaateista ja ti- puttamaan se alkuperäiselle alustalle. Tämä tapahtuu kutsumalla PickDiceRoutine- sekä PickDiceConditionsW-ohjelmia. Lopuksi kasvatetaan Index-muuttujan arvoa, jotta seuraavalla kierroksella käydään läpi eri nopan tiedot. Näitä silmukoita on omansa jokaista nopan silmälukua varten.

Värillisten noppien läpikäynti toimii täysin samoin käyttäen värillisille nopille tarkoi- tettuja ohjelmia. Noppien poimintajärjestys määräytyy niiden värin mukaan, ensim- mäisenä punainen, sitten lila, sininen ja vihreä.

Viittaukset

LIITTYVÄT TIEDOSTOT

Tämän jälkeen pelasimme aiheeseen liittyen netistä löytyvää Geoguessr-peliä, josta oppilaat innostuivat. Oppilaat eivät kovin kauaa jaksaneet keskittyä tiettyyn aihealueeseen,

Etäosallistujalla on näkymä luokkahuoneeseen robotin videoyhteyden kautta (kuva 2), ja hän pystyy liikuttamaan robottia luokkahuoneessa nuolinäppäimiä käyttämällä.. Robotissa

FIGURE 5 Sample object placed in real target image (Vuforia 2017.).. 3.2.4 Video Background Renderer and

VTT:n kehittämä robotin dynaaminen tur- vajärjestelmä mahdollistaa aidattoman ro- bottisolun, jossa ihminen ja robotti voivat työskennellä samalla alueella ja robottia

Maailmakoordinaatisto on robotin työskentely-ympäristöön, esimerkiksi rakennukseen, kuljettimeen tai robotin oheislaitteisiin sidottu robotin ulkopuolinen koordinaatisto

Maailmakoordinaatisto on robotin työskentely-ympäristöön, esimerkiksi rakennukseen, kuljettimeen tai robotin oheislaitteisiin sidottu robotin ulkopuolinen koordinaatisto

Sitä varten minut määrättiin täyttämään lomake, jossa kerroin mitä aioin tehdä.. Sitten

Arvioinnin avulla oppilas saa tietoa kielitaitonsa vah- vuuksista ja edistymisestä sekä itsestään oman äidin- kielen oppijana ja taidostaan hyödyntää kielitaitoaan oppimisen