Logistieke Robots/les 6: verschil tussen versies

Uit Lab
Naar navigatie springen Naar zoeken springen
Geen bewerkingssamenvatting
Geen bewerkingssamenvatting
Regel 120: Regel 120:
== Kunnen reageren op andere robots ==
== Kunnen reageren op andere robots ==
We gaan er in deze paragraaf voor zorgen dat de robots elkaar kunnen herkennen en op elkaar kunnen reageren. Hiervoor moeten we veranderingen doorvoeren in de opzet van het pakhuis en veranderingen doorvoeren in de controller van de robot.
We gaan er in deze paragraaf voor zorgen dat de robots elkaar kunnen herkennen en op elkaar kunnen reageren. Hiervoor moeten we veranderingen doorvoeren in de opzet van het pakhuis en veranderingen doorvoeren in de controller van de robot.
===Veranderen pakhuis omgeving===
Omdat we de controller van de robot gaan veranderen, mag je robot 9, 10 en 11 weer verwijderen. En de volgende stappen uitvoeren:
'''Stap 1:'''
Voeg aan de robot een string game property toe met de naam  “Robot”. Dit is om elkaar te kunnen herkennen met een Radar
'''Stap 2:'''
Zet de Physics Type op Character en vink de box Actor aan:
[[Bestand: balk_actor.png]]
[[Bestand: set_as_actor.png]]
'''Stap 3:'''
Omdat we de robots nu niet meer helemaal kunnen controleren, ze kunnen immers afwijken van de directe route tussen de tafel en de kast, moeten we het pakhuis iets veranderen. Verander de physics van de kasten op de volgende manier:
[[Bestand: change_physics.png]]
Creëer extra wanden door de bestaande wanden te kopiëren, te verplaatsen en om hun as te draaien zodat we er doorheen kunnen blijven kijken. Verwijder Desk 1 t/m Desk 5 en verdeel Desk 6 t/m Desk 11 over de ruimte. De arena ziet er nu als volgt uit, waarbij er bij jou maar 1 robot staat bij Desk 8:
[[Bestand: nieuwe_arena.png]]

Versie van 9 dec 2014 15:23

Logistieke Robots

Lessen

  1. Les 1
  2. Les 2
  3. Les 3
  4. Les 4
  5. Les 5
  6. Les 6
  7. Les 7
  8. Les 8

Software

Zie ook Regels en richtlijnen
Zie ook Artikelen bewerken

Les 6 - Robots van elkaar laten leren

Voordat we naar les 6 gaan, bespreken we een aantal verbeteringen in de huidige code zodat we er vervolgens makkelijker mee kunnen werken. Deze verandering moet je ook doorvoeren als je door wilt werken met je huidige bestand. Je mag ook les 6 starten met de file "warehouse_team_collission.blend".

Verbetering code na les 5

We gaan een functie set_articles() maken zodat er een array aangemaakt wordt met de artikelen.

def get_order():
    # get articles from central controller
    set_articles()
    print(robot["articles"])
    # set game properties
    robot["article_number"] = 1 
    robot["target_desk"] = False 
    # distance variables
    robot["distance"] = 0.0
    robot["location1"] = robot.position[0]
    robot["location2"] = robot.position[1]
    robot["location3"] = robot.position[2]

Vervang ook de declaratie van robot[“robot_id”] door onderstaande. De central controller hoeft zo niet meer te vertellen om welke robot het gaat.

# get the current controller 
cont = bge.logic.getCurrentController()
robot = cont.owner
robot["robot_id"] = robot.name[6:]

De functie set_articles() ziet er als volgt uit:

def set_articles():
    message = start_sens.bodies[0][1:]    
    order_length = len(re.findall(r'[^\s ]+', message))
    robot["articles"] = [""]*order_length
    for i in range(order_length):
        robot["articles"][i] = re.findall(r'[^\s ]+', message)[i]

De main() functie ziet er nu overzichtelijker uit:

def main(): 
    if robot["target_desk"] == False:
        shelf_sens.propName = "Shelf"
        if robot["article_number"] <= len(robot["articles"]):
            track_act.target = robot["articles"][robot["article_number"]-1]
    else:
        shelf_sens.propName = "Desk"
        track_act.target = "Desk_" + str(robot["robot_id"])
    if shelf_sens.positive:
        if robot["target_desk"] == True:
            robot["article_number"] += 1
            if robot["article_number"]  == len(robot["articles"]) +1:
                cont.deactivate(track_act)
                print("done robot "+ str(robot["robot_id"]))
                GameLogic.sendMessage("Done", robot["robot_id"] , "Ground", "")
                GameLogic.sendMessage("Done", str(robot["distance"]) , "Ground", "")
        robot["target_desk"]=  not robot["target_desk"]


We veranderen ook de physics van de robot zodat de robot niet om kan vallen. Ga op de robot staan en ga in het rechter window naar:

Balk physics.png

Verander dan de form factor in 0.0:

Form factor.png

Doe dit voor beide robots.

Hervat les 6 - Robots van elkaar laten leren

Nu we weten hoe we een team aan kunnen sturen en we weten dat er efficiëntie winst te bepalen viel, willen we dit natuurlijk op grote schaal toepassen. Wanneer we meer teams in gaan zetten lopen we wel tegen het probleem aan dat ze elkaar voor de voeten kunnen lopen. Dit probleem gaan we ontdekken en een manier vinden om dit op te lossen. We kunnen zo’n “botsingen probleem” op 2 manieren op lossen. We kunnen de robot vertellen wat hij moet doen of we kunnen de robot een manier aangeven waardoor de robot zelf kan leren wat een optimaal ontwijkingsmechanisme is. De robots worden nu zelf lerend. Dit laatste is natuurlijk veel leuker en daarom gaan we dat doen.

Observeren van botsingen

Open het bestand “warehouse_team_collission.blend” en voeg hier nog twee Morsy robots aan toe op dezelfde manier als in les 5 met de namen Robot_9 en Robot_8. De centrale controller moet ook veranderd worden omdat we nu twee teams hebben. Doe daarvoor de volgende aanpassingen:

if sens.positive:
    robot_team = ["10","11"]
    central["active_robots"] = [0,0,0,0,0,0,0,0,0,0,0]
    central["distance"] =0
    central["time"] = 0.0
    Send_order(robot_team)
if message.positive:
    central["active_robots"][int(message.bodies[0])-1]=0
    central["distance"] += float(message.bodies[1])
    if central["boxes_done"] < central["boxes_tot"]-1 and central["active_robots"][10-1]+central["active_robots"][11-1]==0:
        central["boxes_done"] +=1
        print("number of boxes done:")
        print(central["boxes_done"])
        Send_order(["10","11"])
    if central["boxes_done"] < central["boxes_tot"]-1 and central["active_robots"][9-1]+central["active_robots"][8-1]==0:
        central["boxes_done"] +=1
        print("number of boxes done:")
        print(central["boxes_done"])
        Send_order(["8","9"])
    if sum(central["active_robots"]) == 0: 
        print("Total walked distance:")
        print(central["distance"])
        print(central["time"])

Wanneer je nu de robots de orders laat verzamelen zie je dat de paden van de robots elkaar kunnen kruizen. Wanneer ze elkaar tegemoet lopen reageren ze niet op elkaar en botsen ze dus tegen elkaar op. Omdat ze allebei naar voren bewegen, komen ze allebei niet voorruit. We kunnen, zoals eerder genoemd, nu twee aanpakken kiezen om hier mee om te gaan:

  1. We kunnen gedragsregels opstellen voor de robots. De robots weten dat wanneer ze een artikel opgehaald hebben, ze weer terug naar tafel moeten en op deze manier kunnen we ze ook vertellen wat ze moeten doen als ze een andere robot zien. Bijvoorbeeld: doe altijd een stap naar links als je dicht bij een andere robot bent.
  2. We kunnen de robots ook een methode geven om van elkaar te leren hoe ze om moeten gaan met elkaar. Dit kun je doen als je zelf ook niet precies weet hoe de robots zich moeten gedragen. Deze methode die we hiervoor kunnen gebruiken heet een evolutionair algoritme. Voor een voorbeeld kun je kijken op : https://www.youtube.com/watch?v=AnuLXVp-Zf0. In dit filmpje zie je een e-puck robot aan het leren om obstakels te ontwijken. Dit is ook wat wij willen bereiken.

We kiezen voor algoritme 2 om te laten zien hoe je een robot van slimme kennis voorziet.

Kunnen reageren op andere robots

We gaan er in deze paragraaf voor zorgen dat de robots elkaar kunnen herkennen en op elkaar kunnen reageren. Hiervoor moeten we veranderingen doorvoeren in de opzet van het pakhuis en veranderingen doorvoeren in de controller van de robot.

Veranderen pakhuis omgeving

Omdat we de controller van de robot gaan veranderen, mag je robot 9, 10 en 11 weer verwijderen. En de volgende stappen uitvoeren:

Stap 1: Voeg aan de robot een string game property toe met de naam “Robot”. Dit is om elkaar te kunnen herkennen met een Radar

Stap 2: Zet de Physics Type op Character en vink de box Actor aan:

Balk actor.png

Set as actor.png

Stap 3: Omdat we de robots nu niet meer helemaal kunnen controleren, ze kunnen immers afwijken van de directe route tussen de tafel en de kast, moeten we het pakhuis iets veranderen. Verander de physics van de kasten op de volgende manier:

Change physics.png

Creëer extra wanden door de bestaande wanden te kopiëren, te verplaatsen en om hun as te draaien zodat we er doorheen kunnen blijven kijken. Verwijder Desk 1 t/m Desk 5 en verdeel Desk 6 t/m Desk 11 over de ruimte. De arena ziet er nu als volgt uit, waarbij er bij jou maar 1 robot staat bij Desk 8:

Nieuwe arena.png