ITI0140:Ülesanne 7

Allikas: Kursused
Mine navigeerimisribale Mine otsikasti

Robotite aardejaht

Tudeng Taavil õnnestus odava raha eest ports lihtsaid metallidetektoriga varustatud roboteid hankida. Taavi palub teie käest abi, et roboteid programmeerida aardeid otsima. Ta soovitab alustuseks proovida ühe robotiga aardeid otsida ja seejärel juba mitme robotiga koos aardeid otsida.

Laadige alla simulaatorifail nimega simulator.py

Teie esimeseks ülesandeks on luua klass Robot, mis pärineb klassist Agent (defineeritud moodulis simulator.py). Klassis Agent on defineeritud kolm olulist funktsiooni:

1) detect(direction) - sensorite abil ümbruse tajumine (0 = põhi, 1 = kirre, 2 = ida, 3 = kagu, 4 = lõuna, 5 = edel, 6 = lääs, 7 = loe).
2) turn_and_drive_straight(way) - pööramine vasakule või paremale(-2 = 90 kraadi vasakule, -1 = 45 kraadi vasakule, 1 = 45 kraadi paremale, 2 = 90 kraadi paremale)
3) compass() - tagastab roboti praeguse liikumissuuna

Simulaatori kasutamine

<source lang="python"> import simulator import random

world = simulator.World(width = 10, height = 10, sleep_time = 1, treasure = None, obstacles = [(5, 5)], reliability = 0.9, endurance = 10000)


robots = []

robots.append(Robot(world, 4, 1, 4))

robots.append(Robot(world, 2, 3, 0))

while True:

   for robot in robots:
       robot.turn(random.randint(-1, 1))
   world.print_state()
   world.tick()

</source>

NB! Vaadake täpsemat kirjeldust slaididelt!

Teie põhiülesandeks on kirjutada teie loodud Robot klassile funktsioon decide(), mis kasutades funktsiooni detect(direction) annab robotile juhtkäske rakendades turn(way) funktsiooni.

Eesmärk: leida aare kasutades detect() funktsiooni ja sõita robotiga sellele ruudule.

Piirangud:

1) Robot liigub iga ajaühikuga alati ühe ruudu võrra edasi (ei ole võimalik peatuda).

2) Robot saab pöörata ühe ajaühiku jooksul ainult ühe korra (turn(way) kasutamisel toimub liikumine kas vasakule->otse või paremale->otse, ei saa pöörata mitu korda (vasakule-vasakule->otse))

3) Robotid ei tohi sõita vastu seina, takistuste pihta ega põrgata teineteisega kokku.

4) Ei tohi "häkkida" simulaatorit ja kasutada simulaatoris olevaid olekumuutujaid robotite ja maailma kohta. Robot suhtleb simulatsioonikeskkonnaga ainult detect() ja turn() funktsioonide kaudu.

Kui soovite alati aarde leida ajapiiranguid arvesse võttes, siis tasub kaart salvestada ja/või teateid robotite vahel saata (võib näiteks kaardi jagada sektoriteks, mida iga individuaalne robot peab katma jne). Siinkohal tuleb meeles pidada, et robotil on maailmaga side ainult eelnevalt mainitud funktsioonide kaudu (robot ei tea kui suur on kaart või kuskohas ta alguses asub - seda on võimalik kindlaks teha kui robot sõidab seinte juurde näiteks).