<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="nl">
	<id>https://infvo.nl/lab/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Jacqueline</id>
	<title>Lab - Gebruikersbijdragen [nl]</title>
	<link rel="self" type="application/atom+xml" href="https://infvo.nl/lab/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Jacqueline"/>
	<link rel="alternate" type="text/html" href="https://infvo.nl/lab/index.php?title=Speciaal:Bijdragen/Jacqueline"/>
	<updated>2026-04-26T09:43:51Z</updated>
	<subtitle>Gebruikersbijdragen</subtitle>
	<generator>MediaWiki 1.43.3</generator>
	<entry>
		<id>https://infvo.nl/lab/index.php?title=Logistieke_Robots&amp;diff=477</id>
		<title>Logistieke Robots</title>
		<link rel="alternate" type="text/html" href="https://infvo.nl/lab/index.php?title=Logistieke_Robots&amp;diff=477"/>
		<updated>2014-12-17T17:23:40Z</updated>

		<summary type="html">&lt;p&gt;Jacqueline: /* Over het project */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Zijbalk Logistieke Robots}}&lt;br /&gt;
&lt;br /&gt;
== Over het project==&lt;br /&gt;
[[Bestand:stofzuig_robot.png|thumb|240px|right|zie: https://www.youtube.com/watch?v=hKzMWGVi-YM]] &lt;br /&gt;
&lt;br /&gt;
We zien robots steeds meer in ons dagelijkse leven verschijnen, van simpele stofzuigers (zie rechts voor link) tot zelf rijdende auto’s. Deze robots moeten over een passende intelligentie beschikken om hun taak goed uit te kunnen voeren. Robots worden in vele sectoren in het bedrijfsleven gebruikt waaronder de logistieke sector. Een goed voorbeeld hiervan is de Kiva robot. Deze robot helpt werknemers bestellingen in te pakken in een pakhuis (zie rechts voor link).&lt;br /&gt;
[[Bestand:Kiva_Robot.jpg|thumb|240px|right|zie: https://www.youtube.com/watch?v=6KRjuuEVEZs]] &lt;br /&gt;
&lt;br /&gt;
In dit project leer je hoe je soortgelijke “brein software” kan ontwikkelen om een groep robots aan te sturen om bestellingen in te pakken in een magazijn. &lt;br /&gt;
&lt;br /&gt;
=== Blender ===&lt;br /&gt;
&lt;br /&gt;
Het softwareprogramma wat ons hierbij zal ondersteunen is Blender. Blender is gratis, opensource en erg snel te installeren op meerdere platforms (Windows, Mac OS X,Linux).&lt;br /&gt;
&lt;br /&gt;
=== Leerdoelen ===&lt;br /&gt;
&lt;br /&gt;
Na het succesvol afronden van dit project kun je:&lt;br /&gt;
# overweg met het simulatiepakket Blender in combinatie met Python,&lt;br /&gt;
# robot software ontwikkelen voor individuele robots,&lt;br /&gt;
# robot software ontwikkelen voor een samenwerkende robots,&lt;br /&gt;
# zelf verbeterende robot software ontwikkelen voor een groep samenwerkende robots,&lt;br /&gt;
# het experimenteel testen en beoordelen van robot gedrag, &lt;br /&gt;
# het koppelen van bovenstaande aan een werkveld, met name Logistiek.&lt;br /&gt;
&lt;br /&gt;
Het project is opgebouwd uit 8 lessen. Iedere les duurt 2-3 uur. Iedere les heeft een verschillend aantal plusopdrachten waar je tussen de lessen door mee aan de slag kunt.&lt;br /&gt;
De opdrachtomschrijving is getest op een Mac en Windows. Indien je een ander platform gebruikt, kun je wellicht op problemen stuiten. Het wordt dus aangeraden een Mac of Windows computer te gebruiken maar andere platformen zouden ook mogelijk kunnen zijn&lt;br /&gt;
&lt;br /&gt;
Je kan nu beginnen met Les 1!&lt;br /&gt;
&lt;br /&gt;
== Ontwikkeling ==&lt;br /&gt;
Het maken van dit lesmateriaal is mogelijk gemaakt dankzij subsidie van de gemeente Amsterdam. Het project is uitgevoerd aan de Vrije Universiteit Amsterdam, afdeling Computational Intelligence, in samenwerking met ICT in de Wolken Amsterdam.&lt;br /&gt;
&lt;br /&gt;
Voor vragen over de totstandkoming van dit project kunt u terecht bij:&lt;br /&gt;
&lt;br /&gt;
* Jacqueline Heinerman (j.v.heinerman@vu.nl)&lt;br /&gt;
* Eelco Dijkstra (eelco@infvo.com)&lt;br /&gt;
&lt;br /&gt;
== Referenties ==&lt;br /&gt;
* [[/Bestanden]]&lt;/div&gt;</summary>
		<author><name>Jacqueline</name></author>
	</entry>
	<entry>
		<id>https://infvo.nl/lab/index.php?title=Logistieke_Robots&amp;diff=476</id>
		<title>Logistieke Robots</title>
		<link rel="alternate" type="text/html" href="https://infvo.nl/lab/index.php?title=Logistieke_Robots&amp;diff=476"/>
		<updated>2014-12-17T17:23:30Z</updated>

		<summary type="html">&lt;p&gt;Jacqueline: /* Over het project */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Zijbalk Logistieke Robots}}&lt;br /&gt;
&lt;br /&gt;
== Over het project==&lt;br /&gt;
[[Bestand:stofzuig_robot.png|thumb|240px|right|zie: https://www.youtube.com/watch?v=hKzMWGVi-YM]] &lt;br /&gt;
&lt;br /&gt;
We zien robots steeds meer in ons dagelijkse leven verschijnen, van simpele stofzuigers (zie rechts voor link) tot zelf rijdende auto’s. Deze robots moeten over een passende intelligentie beschikken om hun taak goed uit te kunnen voeren. Robots worden in vele sectoren in het bedrijfsleven gebruikt waaronder de logistieke sector. Een goed voorbeeld hiervan is de Kiva robot. Deze robot helpt werknemers bestellingen in te pakken in een pakhuis (zie rechts voor link).&lt;br /&gt;
[[Bestand:Kiva_Robot.jpg|thumb|240px|right|zie: https://www.youtube.com/watch?v=6KRjuuEVEZs]] &lt;br /&gt;
&lt;br /&gt;
In dit project leer je hoe je soortgelijke “brein software” kan ontwikkelen om een groep robots aan te sturen om bestellingen in te pakken in een magazijn. &lt;br /&gt;
&lt;br /&gt;
TEST&lt;br /&gt;
&lt;br /&gt;
=== Blender ===&lt;br /&gt;
&lt;br /&gt;
Het softwareprogramma wat ons hierbij zal ondersteunen is Blender. Blender is gratis, opensource en erg snel te installeren op meerdere platforms (Windows, Mac OS X,Linux).&lt;br /&gt;
&lt;br /&gt;
=== Leerdoelen ===&lt;br /&gt;
&lt;br /&gt;
Na het succesvol afronden van dit project kun je:&lt;br /&gt;
# overweg met het simulatiepakket Blender in combinatie met Python,&lt;br /&gt;
# robot software ontwikkelen voor individuele robots,&lt;br /&gt;
# robot software ontwikkelen voor een samenwerkende robots,&lt;br /&gt;
# zelf verbeterende robot software ontwikkelen voor een groep samenwerkende robots,&lt;br /&gt;
# het experimenteel testen en beoordelen van robot gedrag, &lt;br /&gt;
# het koppelen van bovenstaande aan een werkveld, met name Logistiek.&lt;br /&gt;
&lt;br /&gt;
Het project is opgebouwd uit 8 lessen. Iedere les duurt 2-3 uur. Iedere les heeft een verschillend aantal plusopdrachten waar je tussen de lessen door mee aan de slag kunt.&lt;br /&gt;
De opdrachtomschrijving is getest op een Mac en Windows. Indien je een ander platform gebruikt, kun je wellicht op problemen stuiten. Het wordt dus aangeraden een Mac of Windows computer te gebruiken maar andere platformen zouden ook mogelijk kunnen zijn&lt;br /&gt;
&lt;br /&gt;
Je kan nu beginnen met Les 1!&lt;br /&gt;
&lt;br /&gt;
== Ontwikkeling ==&lt;br /&gt;
Het maken van dit lesmateriaal is mogelijk gemaakt dankzij subsidie van de gemeente Amsterdam. Het project is uitgevoerd aan de Vrije Universiteit Amsterdam, afdeling Computational Intelligence, in samenwerking met ICT in de Wolken Amsterdam.&lt;br /&gt;
&lt;br /&gt;
Voor vragen over de totstandkoming van dit project kunt u terecht bij:&lt;br /&gt;
&lt;br /&gt;
* Jacqueline Heinerman (j.v.heinerman@vu.nl)&lt;br /&gt;
* Eelco Dijkstra (eelco@infvo.com)&lt;br /&gt;
&lt;br /&gt;
== Referenties ==&lt;br /&gt;
* [[/Bestanden]]&lt;/div&gt;</summary>
		<author><name>Jacqueline</name></author>
	</entry>
	<entry>
		<id>https://infvo.nl/lab/index.php?title=Logistieke_Robots/les_6&amp;diff=475</id>
		<title>Logistieke Robots/les 6</title>
		<link rel="alternate" type="text/html" href="https://infvo.nl/lab/index.php?title=Logistieke_Robots/les_6&amp;diff=475"/>
		<updated>2014-12-17T17:18:52Z</updated>

		<summary type="html">&lt;p&gt;Jacqueline: /* Les 6 - Robots van elkaar laten leren */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Zijbalk Logistieke Robots}}&lt;br /&gt;
&lt;br /&gt;
==Les 6 - Robots van elkaar laten leren ==&lt;br /&gt;
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 [https://googledrive.com/host/0B4Wf_Tca5KDuNnFUWTc4R09jblU/logistieke-robots/warehouse_team_collission.blend warehouse_team_collission.blend]&lt;br /&gt;
&lt;br /&gt;
==Verbetering code na les 5 ==&lt;br /&gt;
We gaan een functie set_articles() maken zodat er een array aangemaakt &lt;br /&gt;
wordt met de artikelen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot; line&amp;gt;&lt;br /&gt;
def get_order():&lt;br /&gt;
    # get articles from central controller&lt;br /&gt;
    set_articles()&lt;br /&gt;
    print(robot[&amp;quot;articles&amp;quot;])&lt;br /&gt;
    # set game properties&lt;br /&gt;
    robot[&amp;quot;article_number&amp;quot;] = 1 &lt;br /&gt;
    robot[&amp;quot;target_desk&amp;quot;] = False &lt;br /&gt;
    # distance variables&lt;br /&gt;
    robot[&amp;quot;distance&amp;quot;] = 0.0&lt;br /&gt;
    robot[&amp;quot;location1&amp;quot;] = robot.position[0]&lt;br /&gt;
    robot[&amp;quot;location2&amp;quot;] = robot.position[1]&lt;br /&gt;
    robot[&amp;quot;location3&amp;quot;] = robot.position[2]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vervang ook de declaratie van robot[“robot_id”] door onderstaande. De central controller hoeft zo niet meer te vertellen om welke robot het gaat.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot; line&amp;gt;&lt;br /&gt;
# get the current controller &lt;br /&gt;
cont = bge.logic.getCurrentController()&lt;br /&gt;
robot = cont.owner&lt;br /&gt;
robot[&amp;quot;robot_id&amp;quot;] = robot.name[6:]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
De functie set_articles() ziet er als volgt uit:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot; line&amp;gt;&lt;br /&gt;
def set_articles():&lt;br /&gt;
    message = start_sens.bodies[0][1:]    &lt;br /&gt;
    order_length = len(re.findall(r&#039;[^\s ]+&#039;, message))&lt;br /&gt;
    robot[&amp;quot;articles&amp;quot;] = [&amp;quot;&amp;quot;]*order_length&lt;br /&gt;
    for i in range(order_length):&lt;br /&gt;
        robot[&amp;quot;articles&amp;quot;][i] = re.findall(r&#039;[^\s ]+&#039;, message)[i]  &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
De main() functie ziet er nu overzichtelijker uit:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot; line&amp;gt;&lt;br /&gt;
def main(): &lt;br /&gt;
    if robot[&amp;quot;target_desk&amp;quot;] == False:&lt;br /&gt;
        shelf_sens.propName = &amp;quot;Shelf&amp;quot;&lt;br /&gt;
        if robot[&amp;quot;article_number&amp;quot;] &amp;lt;= len(robot[&amp;quot;articles&amp;quot;]):&lt;br /&gt;
            track_act.target = robot[&amp;quot;articles&amp;quot;][robot[&amp;quot;article_number&amp;quot;]-1]&lt;br /&gt;
    else:&lt;br /&gt;
        shelf_sens.propName = &amp;quot;Desk&amp;quot;&lt;br /&gt;
        track_act.target = &amp;quot;Desk_&amp;quot; + str(robot[&amp;quot;robot_id&amp;quot;])&lt;br /&gt;
    if shelf_sens.positive:&lt;br /&gt;
        if robot[&amp;quot;target_desk&amp;quot;] == True:&lt;br /&gt;
            robot[&amp;quot;article_number&amp;quot;] += 1&lt;br /&gt;
            if robot[&amp;quot;article_number&amp;quot;]  == len(robot[&amp;quot;articles&amp;quot;]) +1:&lt;br /&gt;
                cont.deactivate(track_act)&lt;br /&gt;
                print(&amp;quot;done robot &amp;quot;+ str(robot[&amp;quot;robot_id&amp;quot;]))&lt;br /&gt;
                GameLogic.sendMessage(&amp;quot;Done&amp;quot;, robot[&amp;quot;robot_id&amp;quot;] , &amp;quot;Ground&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
                GameLogic.sendMessage(&amp;quot;Done&amp;quot;, str(robot[&amp;quot;distance&amp;quot;]) , &amp;quot;Ground&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
        robot[&amp;quot;target_desk&amp;quot;]=  not robot[&amp;quot;target_desk&amp;quot;]  &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
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:&lt;br /&gt;
&lt;br /&gt;
[[Bestand:balk_physics.png]]&lt;br /&gt;
&lt;br /&gt;
Verander dan de form factor in 0.0:&lt;br /&gt;
&lt;br /&gt;
[[Bestand:form_factor.png]]&lt;br /&gt;
&lt;br /&gt;
Doe dit voor beide robots.&lt;br /&gt;
&lt;br /&gt;
==Hervat les 6 - Robots van elkaar laten leren ==&lt;br /&gt;
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. &lt;br /&gt;
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.&lt;br /&gt;
Het eindresultaat kun je zien op https://www.youtube.com/watch?v=LwOjSqbDy0g&lt;br /&gt;
&lt;br /&gt;
==Observeren van botsingen==&lt;br /&gt;
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.&lt;br /&gt;
De centrale controller moet ook veranderd worden omdat we nu twee teams hebben. Doe daarvoor de volgende aanpassingen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot; line&amp;gt;&lt;br /&gt;
if sens.positive:&lt;br /&gt;
    robot_team = [&amp;quot;10&amp;quot;,&amp;quot;11&amp;quot;]&lt;br /&gt;
    central[&amp;quot;active_robots&amp;quot;] = [0,0,0,0,0,0,0,0,0,0,0]&lt;br /&gt;
    central[&amp;quot;distance&amp;quot;] =0&lt;br /&gt;
    central[&amp;quot;time&amp;quot;] = 0.0&lt;br /&gt;
    Send_order(robot_team)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot; line&amp;gt;&lt;br /&gt;
if message.positive:&lt;br /&gt;
    central[&amp;quot;active_robots&amp;quot;][int(message.bodies[0])-1]=0&lt;br /&gt;
    central[&amp;quot;distance&amp;quot;] += float(message.bodies[1])&lt;br /&gt;
    if central[&amp;quot;boxes_done&amp;quot;] &amp;lt; central[&amp;quot;boxes_tot&amp;quot;]-1 and central[&amp;quot;active_robots&amp;quot;][10-1]+central[&amp;quot;active_robots&amp;quot;][11-1]==0:&lt;br /&gt;
        central[&amp;quot;boxes_done&amp;quot;] +=1&lt;br /&gt;
        print(&amp;quot;number of boxes done:&amp;quot;)&lt;br /&gt;
        print(central[&amp;quot;boxes_done&amp;quot;])&lt;br /&gt;
        Send_order([&amp;quot;10&amp;quot;,&amp;quot;11&amp;quot;])&lt;br /&gt;
    if central[&amp;quot;boxes_done&amp;quot;] &amp;lt; central[&amp;quot;boxes_tot&amp;quot;]-1 and central[&amp;quot;active_robots&amp;quot;][9-1]+central[&amp;quot;active_robots&amp;quot;][8-1]==0:&lt;br /&gt;
        central[&amp;quot;boxes_done&amp;quot;] +=1&lt;br /&gt;
        print(&amp;quot;number of boxes done:&amp;quot;)&lt;br /&gt;
        print(central[&amp;quot;boxes_done&amp;quot;])&lt;br /&gt;
        Send_order([&amp;quot;8&amp;quot;,&amp;quot;9&amp;quot;])&lt;br /&gt;
    if sum(central[&amp;quot;active_robots&amp;quot;]) == 0: &lt;br /&gt;
        print(&amp;quot;Total walked distance:&amp;quot;)&lt;br /&gt;
        print(central[&amp;quot;distance&amp;quot;])&lt;br /&gt;
        print(central[&amp;quot;time&amp;quot;])&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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:&lt;br /&gt;
# 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.&lt;br /&gt;
# 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. &lt;br /&gt;
We kiezen voor algoritme 2 om te laten zien hoe je een robot van slimme kennis voorziet.&lt;br /&gt;
&lt;br /&gt;
== Kunnen reageren op andere robots ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
===Veranderen pakhuis omgeving===&lt;br /&gt;
Omdat we de controller van de robot gaan veranderen, mag je robot 9, 10 en 11 weer verwijderen. En de volgende stappen uitvoeren:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Stap 1:&#039;&#039;&#039;&lt;br /&gt;
Voeg aan de robot een string game property toe met de naam  “Robot”. Dit is om elkaar te kunnen herkennen met een Radar&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Stap 2:&#039;&#039;&#039;&lt;br /&gt;
Zet de Physics Type op Character en vink de box Actor aan:&lt;br /&gt;
&lt;br /&gt;
[[Bestand: balk_actor.png]]&lt;br /&gt;
&lt;br /&gt;
[[Bestand: set_as_actor.png]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Stap 3:&#039;&#039;&#039;&lt;br /&gt;
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:&lt;br /&gt;
&lt;br /&gt;
[[Bestand: change_physics.png]]&lt;br /&gt;
&lt;br /&gt;
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:&lt;br /&gt;
&lt;br /&gt;
[[Bestand: nieuwe_arena.png]]&lt;br /&gt;
&lt;br /&gt;
===Veranderen robot controller ===&lt;br /&gt;
De robots moeten elkaar nu herkennen, hier op reageren en vervolgens weer doorgaan met het ophalen van artikelen. We moeten veel gaan veranderen aan de controller. We nemen dit stap voor stap door:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Stap 1:&#039;&#039;&#039;&lt;br /&gt;
We hebben een extra Radar nodig om een ontwijkactie te starten en we moeten kunnen meten of de robot een goede actie gedaan heeft. Dit doen we met een collission sensor. De always sensor is nodig om de taak weer op te pakken na de ontwijkactie:&lt;br /&gt;
[[Bestand: add_radar.png]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Stap 2:&#039;&#039;&#039;&lt;br /&gt;
De ontwijkactie houdt in dat de robot, na het detecteren van een andere robot, een aantal seconden rondjes draait, weg loopt van de robot en daarna zijn taak weer oppakt. Dit definiëren we in een extra state: &lt;br /&gt;
[[Bestand: add_state.png]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Stap 3:&#039;&#039;&#039;&lt;br /&gt;
Voeg extra game properties toe:&lt;br /&gt;
[[Bestand: add_game_property.png]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Stap 4:&#039;&#039;&#039;&lt;br /&gt;
Het script moet ook onder handen genomen worden. Er moet een extra package geïmporteerd worden omdat we de robot een willekeurige waarde geven voor het draaien om zijn eigen as en het weglopen van de radar locatie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot; line&amp;gt;&lt;br /&gt;
# import necessary packages&lt;br /&gt;
import bge&lt;br /&gt;
import GameLogic&lt;br /&gt;
import re&lt;br /&gt;
import random&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
De extra sensors moeten gedefinieerd worden: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot; line&amp;gt;&lt;br /&gt;
# get sensors and actuators&lt;br /&gt;
start_sens = cont.sensors[&amp;quot;Start&amp;quot;]&lt;br /&gt;
shelf_sens = cont.sensors[&amp;quot;Shelf&amp;quot;]&lt;br /&gt;
track_act = cont.actuators[&amp;quot;TrackTo&amp;quot;]&lt;br /&gt;
robot_radar = cont.sensors[&amp;quot;RobotRadar&amp;quot;]&lt;br /&gt;
robot_collission = cont.sensors[&amp;quot;RobotCollission&amp;quot;]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wanneer de robot voor de eerste keer begint met de order, worden de parameters gedefinieerd die te maken hebben met het ontwijken van de andere robot:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot; line&amp;gt;&lt;br /&gt;
if start_sens.positive:&lt;br /&gt;
    cont.activate(track_act) &lt;br /&gt;
    print(&amp;quot;Start new order:&amp;quot;)&lt;br /&gt;
    get_order()  &lt;br /&gt;
    # set avoidance parameters and evaluation variables&lt;br /&gt;
    print(&amp;quot;begin&amp;quot;)&lt;br /&gt;
    if robot[&amp;quot;active&amp;quot;] == False:&lt;br /&gt;
        robot[&amp;quot;sec_rot&amp;quot;] = random.uniform(0,2)&lt;br /&gt;
        robot[&amp;quot;sec_walk&amp;quot;] = random.uniform(0,2)&lt;br /&gt;
        robot[&amp;quot;active&amp;quot;] =True&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wanneer een robot iemand op de radar heeft, moet de robot de ontwijkactie uit gaan voeren in de andere state. Ook moet bijgehouden worden of de robot alsnog tegen een ander aan stoot. Wanneer de robot een slechte ontwijkactie heeft en vaak tegen iemand op botst, willen we dat deze robot een nieuwe ontwijkreactie krijgt. Dit noemen we een “reset”. Dit is nodig als de robot ergens vast zit:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot; line&amp;gt;&lt;br /&gt;
if robot_radar.positive == True:&lt;br /&gt;
    cont.deactivate(track_act)&lt;br /&gt;
    robot[&amp;quot;radar&amp;quot;] +=1&lt;br /&gt;
    robot[&amp;quot;time&amp;quot;] = 0.0&lt;br /&gt;
    robot.state = 2&lt;br /&gt;
&lt;br /&gt;
if robot_collission.positive:&lt;br /&gt;
    robot[&amp;quot;collission&amp;quot;] +=1&lt;br /&gt;
    &lt;br /&gt;
if robot[&amp;quot;collission&amp;quot;] &amp;gt;=20:&lt;br /&gt;
    #reset parameters because its stuck&lt;br /&gt;
    robot[&amp;quot;sec_rot&amp;quot;] = random.uniform(0,2)&lt;br /&gt;
    robot[&amp;quot;sec_walk&amp;quot;] = random.uniform(0,2)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In de extra state hebben we gezien dat er nog een “avoiding.py” gemaakt moet worden. Deze ziet er als volgt uit:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot; line&amp;gt;&lt;br /&gt;
# import necessary packages&lt;br /&gt;
import bge&lt;br /&gt;
import GameLogic&lt;br /&gt;
import re&lt;br /&gt;
&lt;br /&gt;
# get the current controller &lt;br /&gt;
cont = bge.logic.getCurrentController()&lt;br /&gt;
robot = cont.owner&lt;br /&gt;
robot[&amp;quot;robot_id&amp;quot;] = robot.name[6:]&lt;br /&gt;
&lt;br /&gt;
# get sensors and actuators&lt;br /&gt;
rot_act = cont.actuators[&amp;quot;Rotate&amp;quot;]&lt;br /&gt;
walk_act = cont.actuators[&amp;quot;Walk&amp;quot;]&lt;br /&gt;
robot_collission2 = cont.sensors[&amp;quot;RobotCollission2&amp;quot;]&lt;br /&gt;
robot_radar2 = cont.sensors[&amp;quot;RobotRadar2&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
robot[&amp;quot;time&amp;quot;] += 1/60&lt;br /&gt;
&lt;br /&gt;
if robot[&amp;quot;time&amp;quot;] &amp;lt; robot[&amp;quot;sec_rot&amp;quot;]:&lt;br /&gt;
    cont.activate(rot_act)&lt;br /&gt;
&lt;br /&gt;
if robot[&amp;quot;time&amp;quot;] &amp;gt; robot[&amp;quot;sec_rot&amp;quot;] and robot[&amp;quot;time&amp;quot;] &amp;lt; (robot[&amp;quot;sec_rot&amp;quot;] + robot[&amp;quot;sec_walk&amp;quot;]):&lt;br /&gt;
    cont.deactivate(rot_act)&lt;br /&gt;
    cont.activate(walk_act)&lt;br /&gt;
&lt;br /&gt;
if robot[&amp;quot;time&amp;quot;] &amp;gt; (robot[&amp;quot;sec_rot&amp;quot;] + robot[&amp;quot;sec_walk&amp;quot;]):&lt;br /&gt;
    robot.state =1&lt;br /&gt;
&lt;br /&gt;
if robot_collission2.positive:&lt;br /&gt;
    robot[&amp;quot;collission&amp;quot;] +=1&lt;br /&gt;
&lt;br /&gt;
if robot_radar2.positive:&lt;br /&gt;
    robot[&amp;quot;radar&amp;quot;] +=1&lt;br /&gt;
    robot[&amp;quot;time&amp;quot;] = 0.0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wanneer je de robots nu laat starten met het ophalen van bestellingen, zie je dat ze op elkaar reageren en hun ontwijkactie uitvoeren. De acties die ze uitvoeren zijn hetzelfde maar hoelang ze deze actie uit voeren kan verschillen. Sommige robots zullen beter kunnen ontwijken en sneller door kunnen gaan met hun bestelling dan andere robots. De robots die een goede ontwijkstrategie hebben kunnen hun strategie doorgeven aan de andere robots.&lt;br /&gt;
&lt;br /&gt;
==Optimaliseren van reactie==&lt;br /&gt;
Wanneer de robots met hun eigen ontwijkingsstrategie orders gaan verzamelen, zul je verschillen zien in de aanpak. De ene robot draait lang een rondje terwijl de andere robot bijna gelijk weer verder gaat met de bestelling. Je wilt dat de robots van elkaar leren en de beste strategieën nadoen zodat ze totaal zo min mogelijk botsen. Botsen kan er namelijk voor zorgen dat de robot kapot gaat of dat een artikel op de grond valt.&lt;br /&gt;
Omdat we 6 robots hebben beginnen we met 6 verschillende strategieën (ieder tweetal met het aantal seconden rondjes draaien en rechtdoor lopen is een strategie). Na een bepaalde tijd moeten we weten hoe goed de strategie van iedere robot is zodat de goede robots dit door kunnen geven aan de andere robots.&lt;br /&gt;
Het uitwisselen van deze informatie en het veranderen van de strategie gebeurd in de centrale controller op de volgende manier:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Stap 1:&#039;&#039;&#039;&lt;br /&gt;
Importeer extra package numpy:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot; line&amp;gt;&lt;br /&gt;
# import necessary packages&lt;br /&gt;
import bge&lt;br /&gt;
import GameLogic&lt;br /&gt;
import random&lt;br /&gt;
import numpy&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Stap 2:&#039;&#039;&#039;&lt;br /&gt;
Voeg een extra team toe met robot 6 en 7. Je weet van de vorige les al hoe dit moet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Stap 3:&#039;&#039;&#039;&lt;br /&gt;
Voeg een extra tijd meting toe om de strategieën te kunnen updaten: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot; line&amp;gt;&lt;br /&gt;
central[&amp;quot;time&amp;quot;]+= 1/60&lt;br /&gt;
central[&amp;quot;time_minute&amp;quot;]+= 1/60&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Stap 4:&#039;&#039;&#039;&lt;br /&gt;
Per minuut gaan we de strategieën van de robots herzien en veranderen op de volgende manier:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot; line&amp;gt;&lt;br /&gt;
if central[&amp;quot;time_minute&amp;quot;] &amp;gt;=60:&lt;br /&gt;
    central[&amp;quot;time_minute&amp;quot;] = 0&lt;br /&gt;
    robots = [&amp;quot;Robot_6&amp;quot;, &amp;quot;Robot_7&amp;quot;, &amp;quot;Robot_8&amp;quot;, &amp;quot;Robot_9&amp;quot;, &amp;quot;Robot_10&amp;quot;, &amp;quot;Robot_11&amp;quot;]&lt;br /&gt;
    result = [[0,0,0,&amp;quot;&amp;quot;] for i in range(len(robots))]&lt;br /&gt;
    alg_result = 0&lt;br /&gt;
    for i in range(len(robots)):&lt;br /&gt;
        robot = scene.objects[robots[i]]&lt;br /&gt;
        result[i][0] = robot[&amp;quot;collission&amp;quot;] &lt;br /&gt;
        result[i][1] = robot[&amp;quot;sec_rot&amp;quot;]&lt;br /&gt;
        result[i][2] = robot[&amp;quot;sec_walk&amp;quot;]&lt;br /&gt;
        result[i][3] = robot&lt;br /&gt;
        alg_result += robot[&amp;quot;collission&amp;quot;]&lt;br /&gt;
        robot[&amp;quot;collission&amp;quot;] = 0&lt;br /&gt;
        robot[&amp;quot;radar&amp;quot;]=0   &lt;br /&gt;
    central[&amp;quot;algorithm&amp;quot;].append(alg_result)&lt;br /&gt;
    # print number of collissions per minute&lt;br /&gt;
    print(central[&amp;quot;algorithm&amp;quot;])&lt;br /&gt;
    result = sorted(result, key=lambda a_entry: a_entry[0]) &lt;br /&gt;
    print(result)&lt;br /&gt;
    print(&amp;quot;Total walked distance:&amp;quot;)&lt;br /&gt;
    print(central[&amp;quot;distance&amp;quot;])&lt;br /&gt;
    print(central[&amp;quot;time&amp;quot;])&lt;br /&gt;
    # update values&lt;br /&gt;
    for i in range(len(robots)):&lt;br /&gt;
        robot = scene.objects[robots[i]]&lt;br /&gt;
        take_from = random.choice([0,1])&lt;br /&gt;
        robot[&amp;quot;sec_rot&amp;quot;] = max(0,result[take_from][1] + random.gauss(0, 0.1))&lt;br /&gt;
        robot[&amp;quot;sec_walk&amp;quot;] = max(0,result[take_from][2] + random.gauss(0, 0.1))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wat we in deze functie doen is het evalueren van de prestatie van de robots. Met prestatie bedoelen we het aantal keer opbotsen tegen de andere robots. Hoe minder dit gebeurd, hoe beter. Voor iedere robot wordt dit aantal opgeslagen samen met de twee waarden die hiervoor zorgden. Deze prestatie wordt opgeteld bij het algehele resultaat van de groep en de waarden worden weer op 0 gezet voor de volgende minuut. &lt;br /&gt;
Vervolgens worden de strategieën van de robots aangepast. We nemen de strategieën van de 2 beste robots, de robots met het minste aantal botsingen, om door te geven aan de anderen. Op deze waarden passen we nog een kleine variatie toe om te kijken of we in de volgende minuut nog een betere strategie tegen gaan komen. Zo kunnen de robots blijven leren. &lt;br /&gt;
&lt;br /&gt;
==Experimenten==&lt;br /&gt;
Wanneer je de robots nu aan het werk zet zie je per minuut een update van de prestatie van het algoritme uitgeprint in de Terminal. Het is moeilijk te analyseren of deze methode echt werkt als je alleen naar deze geprinte waarden. Je kan de robots aan het werk zetten en een aantal boxen laten vullen en deze cijfers in de gaten houden maar je kan er pas echt wat over zeggen als je een goed experiment uitvoert. Dit gaan we doen in Les 7.&lt;br /&gt;
&lt;br /&gt;
==Plusopdracht==&lt;br /&gt;
Denk alvast na over hoe je kan testen of dit algoritme werkt.&lt;/div&gt;</summary>
		<author><name>Jacqueline</name></author>
	</entry>
	<entry>
		<id>https://infvo.nl/lab/index.php?title=Logistieke_Robots/les_6&amp;diff=474</id>
		<title>Logistieke Robots/les 6</title>
		<link rel="alternate" type="text/html" href="https://infvo.nl/lab/index.php?title=Logistieke_Robots/les_6&amp;diff=474"/>
		<updated>2014-12-17T17:18:39Z</updated>

		<summary type="html">&lt;p&gt;Jacqueline: /* Les 6 - Robots van elkaar laten leren */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Zijbalk Logistieke Robots}}&lt;br /&gt;
&lt;br /&gt;
==Les 6 - Robots van elkaar laten leren ==&lt;br /&gt;
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 https://googledrive.com/host/0B4Wf_Tca5KDuNnFUWTc4R09jblU/logistieke-robots/warehouse_team_collission.blend warehouse_team_collission.blend]&lt;br /&gt;
&lt;br /&gt;
==Verbetering code na les 5 ==&lt;br /&gt;
We gaan een functie set_articles() maken zodat er een array aangemaakt &lt;br /&gt;
wordt met de artikelen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot; line&amp;gt;&lt;br /&gt;
def get_order():&lt;br /&gt;
    # get articles from central controller&lt;br /&gt;
    set_articles()&lt;br /&gt;
    print(robot[&amp;quot;articles&amp;quot;])&lt;br /&gt;
    # set game properties&lt;br /&gt;
    robot[&amp;quot;article_number&amp;quot;] = 1 &lt;br /&gt;
    robot[&amp;quot;target_desk&amp;quot;] = False &lt;br /&gt;
    # distance variables&lt;br /&gt;
    robot[&amp;quot;distance&amp;quot;] = 0.0&lt;br /&gt;
    robot[&amp;quot;location1&amp;quot;] = robot.position[0]&lt;br /&gt;
    robot[&amp;quot;location2&amp;quot;] = robot.position[1]&lt;br /&gt;
    robot[&amp;quot;location3&amp;quot;] = robot.position[2]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vervang ook de declaratie van robot[“robot_id”] door onderstaande. De central controller hoeft zo niet meer te vertellen om welke robot het gaat.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot; line&amp;gt;&lt;br /&gt;
# get the current controller &lt;br /&gt;
cont = bge.logic.getCurrentController()&lt;br /&gt;
robot = cont.owner&lt;br /&gt;
robot[&amp;quot;robot_id&amp;quot;] = robot.name[6:]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
De functie set_articles() ziet er als volgt uit:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot; line&amp;gt;&lt;br /&gt;
def set_articles():&lt;br /&gt;
    message = start_sens.bodies[0][1:]    &lt;br /&gt;
    order_length = len(re.findall(r&#039;[^\s ]+&#039;, message))&lt;br /&gt;
    robot[&amp;quot;articles&amp;quot;] = [&amp;quot;&amp;quot;]*order_length&lt;br /&gt;
    for i in range(order_length):&lt;br /&gt;
        robot[&amp;quot;articles&amp;quot;][i] = re.findall(r&#039;[^\s ]+&#039;, message)[i]  &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
De main() functie ziet er nu overzichtelijker uit:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot; line&amp;gt;&lt;br /&gt;
def main(): &lt;br /&gt;
    if robot[&amp;quot;target_desk&amp;quot;] == False:&lt;br /&gt;
        shelf_sens.propName = &amp;quot;Shelf&amp;quot;&lt;br /&gt;
        if robot[&amp;quot;article_number&amp;quot;] &amp;lt;= len(robot[&amp;quot;articles&amp;quot;]):&lt;br /&gt;
            track_act.target = robot[&amp;quot;articles&amp;quot;][robot[&amp;quot;article_number&amp;quot;]-1]&lt;br /&gt;
    else:&lt;br /&gt;
        shelf_sens.propName = &amp;quot;Desk&amp;quot;&lt;br /&gt;
        track_act.target = &amp;quot;Desk_&amp;quot; + str(robot[&amp;quot;robot_id&amp;quot;])&lt;br /&gt;
    if shelf_sens.positive:&lt;br /&gt;
        if robot[&amp;quot;target_desk&amp;quot;] == True:&lt;br /&gt;
            robot[&amp;quot;article_number&amp;quot;] += 1&lt;br /&gt;
            if robot[&amp;quot;article_number&amp;quot;]  == len(robot[&amp;quot;articles&amp;quot;]) +1:&lt;br /&gt;
                cont.deactivate(track_act)&lt;br /&gt;
                print(&amp;quot;done robot &amp;quot;+ str(robot[&amp;quot;robot_id&amp;quot;]))&lt;br /&gt;
                GameLogic.sendMessage(&amp;quot;Done&amp;quot;, robot[&amp;quot;robot_id&amp;quot;] , &amp;quot;Ground&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
                GameLogic.sendMessage(&amp;quot;Done&amp;quot;, str(robot[&amp;quot;distance&amp;quot;]) , &amp;quot;Ground&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
        robot[&amp;quot;target_desk&amp;quot;]=  not robot[&amp;quot;target_desk&amp;quot;]  &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
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:&lt;br /&gt;
&lt;br /&gt;
[[Bestand:balk_physics.png]]&lt;br /&gt;
&lt;br /&gt;
Verander dan de form factor in 0.0:&lt;br /&gt;
&lt;br /&gt;
[[Bestand:form_factor.png]]&lt;br /&gt;
&lt;br /&gt;
Doe dit voor beide robots.&lt;br /&gt;
&lt;br /&gt;
==Hervat les 6 - Robots van elkaar laten leren ==&lt;br /&gt;
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. &lt;br /&gt;
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.&lt;br /&gt;
Het eindresultaat kun je zien op https://www.youtube.com/watch?v=LwOjSqbDy0g&lt;br /&gt;
&lt;br /&gt;
==Observeren van botsingen==&lt;br /&gt;
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.&lt;br /&gt;
De centrale controller moet ook veranderd worden omdat we nu twee teams hebben. Doe daarvoor de volgende aanpassingen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot; line&amp;gt;&lt;br /&gt;
if sens.positive:&lt;br /&gt;
    robot_team = [&amp;quot;10&amp;quot;,&amp;quot;11&amp;quot;]&lt;br /&gt;
    central[&amp;quot;active_robots&amp;quot;] = [0,0,0,0,0,0,0,0,0,0,0]&lt;br /&gt;
    central[&amp;quot;distance&amp;quot;] =0&lt;br /&gt;
    central[&amp;quot;time&amp;quot;] = 0.0&lt;br /&gt;
    Send_order(robot_team)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot; line&amp;gt;&lt;br /&gt;
if message.positive:&lt;br /&gt;
    central[&amp;quot;active_robots&amp;quot;][int(message.bodies[0])-1]=0&lt;br /&gt;
    central[&amp;quot;distance&amp;quot;] += float(message.bodies[1])&lt;br /&gt;
    if central[&amp;quot;boxes_done&amp;quot;] &amp;lt; central[&amp;quot;boxes_tot&amp;quot;]-1 and central[&amp;quot;active_robots&amp;quot;][10-1]+central[&amp;quot;active_robots&amp;quot;][11-1]==0:&lt;br /&gt;
        central[&amp;quot;boxes_done&amp;quot;] +=1&lt;br /&gt;
        print(&amp;quot;number of boxes done:&amp;quot;)&lt;br /&gt;
        print(central[&amp;quot;boxes_done&amp;quot;])&lt;br /&gt;
        Send_order([&amp;quot;10&amp;quot;,&amp;quot;11&amp;quot;])&lt;br /&gt;
    if central[&amp;quot;boxes_done&amp;quot;] &amp;lt; central[&amp;quot;boxes_tot&amp;quot;]-1 and central[&amp;quot;active_robots&amp;quot;][9-1]+central[&amp;quot;active_robots&amp;quot;][8-1]==0:&lt;br /&gt;
        central[&amp;quot;boxes_done&amp;quot;] +=1&lt;br /&gt;
        print(&amp;quot;number of boxes done:&amp;quot;)&lt;br /&gt;
        print(central[&amp;quot;boxes_done&amp;quot;])&lt;br /&gt;
        Send_order([&amp;quot;8&amp;quot;,&amp;quot;9&amp;quot;])&lt;br /&gt;
    if sum(central[&amp;quot;active_robots&amp;quot;]) == 0: &lt;br /&gt;
        print(&amp;quot;Total walked distance:&amp;quot;)&lt;br /&gt;
        print(central[&amp;quot;distance&amp;quot;])&lt;br /&gt;
        print(central[&amp;quot;time&amp;quot;])&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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:&lt;br /&gt;
# 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.&lt;br /&gt;
# 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. &lt;br /&gt;
We kiezen voor algoritme 2 om te laten zien hoe je een robot van slimme kennis voorziet.&lt;br /&gt;
&lt;br /&gt;
== Kunnen reageren op andere robots ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
===Veranderen pakhuis omgeving===&lt;br /&gt;
Omdat we de controller van de robot gaan veranderen, mag je robot 9, 10 en 11 weer verwijderen. En de volgende stappen uitvoeren:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Stap 1:&#039;&#039;&#039;&lt;br /&gt;
Voeg aan de robot een string game property toe met de naam  “Robot”. Dit is om elkaar te kunnen herkennen met een Radar&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Stap 2:&#039;&#039;&#039;&lt;br /&gt;
Zet de Physics Type op Character en vink de box Actor aan:&lt;br /&gt;
&lt;br /&gt;
[[Bestand: balk_actor.png]]&lt;br /&gt;
&lt;br /&gt;
[[Bestand: set_as_actor.png]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Stap 3:&#039;&#039;&#039;&lt;br /&gt;
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:&lt;br /&gt;
&lt;br /&gt;
[[Bestand: change_physics.png]]&lt;br /&gt;
&lt;br /&gt;
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:&lt;br /&gt;
&lt;br /&gt;
[[Bestand: nieuwe_arena.png]]&lt;br /&gt;
&lt;br /&gt;
===Veranderen robot controller ===&lt;br /&gt;
De robots moeten elkaar nu herkennen, hier op reageren en vervolgens weer doorgaan met het ophalen van artikelen. We moeten veel gaan veranderen aan de controller. We nemen dit stap voor stap door:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Stap 1:&#039;&#039;&#039;&lt;br /&gt;
We hebben een extra Radar nodig om een ontwijkactie te starten en we moeten kunnen meten of de robot een goede actie gedaan heeft. Dit doen we met een collission sensor. De always sensor is nodig om de taak weer op te pakken na de ontwijkactie:&lt;br /&gt;
[[Bestand: add_radar.png]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Stap 2:&#039;&#039;&#039;&lt;br /&gt;
De ontwijkactie houdt in dat de robot, na het detecteren van een andere robot, een aantal seconden rondjes draait, weg loopt van de robot en daarna zijn taak weer oppakt. Dit definiëren we in een extra state: &lt;br /&gt;
[[Bestand: add_state.png]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Stap 3:&#039;&#039;&#039;&lt;br /&gt;
Voeg extra game properties toe:&lt;br /&gt;
[[Bestand: add_game_property.png]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Stap 4:&#039;&#039;&#039;&lt;br /&gt;
Het script moet ook onder handen genomen worden. Er moet een extra package geïmporteerd worden omdat we de robot een willekeurige waarde geven voor het draaien om zijn eigen as en het weglopen van de radar locatie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot; line&amp;gt;&lt;br /&gt;
# import necessary packages&lt;br /&gt;
import bge&lt;br /&gt;
import GameLogic&lt;br /&gt;
import re&lt;br /&gt;
import random&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
De extra sensors moeten gedefinieerd worden: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot; line&amp;gt;&lt;br /&gt;
# get sensors and actuators&lt;br /&gt;
start_sens = cont.sensors[&amp;quot;Start&amp;quot;]&lt;br /&gt;
shelf_sens = cont.sensors[&amp;quot;Shelf&amp;quot;]&lt;br /&gt;
track_act = cont.actuators[&amp;quot;TrackTo&amp;quot;]&lt;br /&gt;
robot_radar = cont.sensors[&amp;quot;RobotRadar&amp;quot;]&lt;br /&gt;
robot_collission = cont.sensors[&amp;quot;RobotCollission&amp;quot;]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wanneer de robot voor de eerste keer begint met de order, worden de parameters gedefinieerd die te maken hebben met het ontwijken van de andere robot:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot; line&amp;gt;&lt;br /&gt;
if start_sens.positive:&lt;br /&gt;
    cont.activate(track_act) &lt;br /&gt;
    print(&amp;quot;Start new order:&amp;quot;)&lt;br /&gt;
    get_order()  &lt;br /&gt;
    # set avoidance parameters and evaluation variables&lt;br /&gt;
    print(&amp;quot;begin&amp;quot;)&lt;br /&gt;
    if robot[&amp;quot;active&amp;quot;] == False:&lt;br /&gt;
        robot[&amp;quot;sec_rot&amp;quot;] = random.uniform(0,2)&lt;br /&gt;
        robot[&amp;quot;sec_walk&amp;quot;] = random.uniform(0,2)&lt;br /&gt;
        robot[&amp;quot;active&amp;quot;] =True&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wanneer een robot iemand op de radar heeft, moet de robot de ontwijkactie uit gaan voeren in de andere state. Ook moet bijgehouden worden of de robot alsnog tegen een ander aan stoot. Wanneer de robot een slechte ontwijkactie heeft en vaak tegen iemand op botst, willen we dat deze robot een nieuwe ontwijkreactie krijgt. Dit noemen we een “reset”. Dit is nodig als de robot ergens vast zit:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot; line&amp;gt;&lt;br /&gt;
if robot_radar.positive == True:&lt;br /&gt;
    cont.deactivate(track_act)&lt;br /&gt;
    robot[&amp;quot;radar&amp;quot;] +=1&lt;br /&gt;
    robot[&amp;quot;time&amp;quot;] = 0.0&lt;br /&gt;
    robot.state = 2&lt;br /&gt;
&lt;br /&gt;
if robot_collission.positive:&lt;br /&gt;
    robot[&amp;quot;collission&amp;quot;] +=1&lt;br /&gt;
    &lt;br /&gt;
if robot[&amp;quot;collission&amp;quot;] &amp;gt;=20:&lt;br /&gt;
    #reset parameters because its stuck&lt;br /&gt;
    robot[&amp;quot;sec_rot&amp;quot;] = random.uniform(0,2)&lt;br /&gt;
    robot[&amp;quot;sec_walk&amp;quot;] = random.uniform(0,2)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In de extra state hebben we gezien dat er nog een “avoiding.py” gemaakt moet worden. Deze ziet er als volgt uit:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot; line&amp;gt;&lt;br /&gt;
# import necessary packages&lt;br /&gt;
import bge&lt;br /&gt;
import GameLogic&lt;br /&gt;
import re&lt;br /&gt;
&lt;br /&gt;
# get the current controller &lt;br /&gt;
cont = bge.logic.getCurrentController()&lt;br /&gt;
robot = cont.owner&lt;br /&gt;
robot[&amp;quot;robot_id&amp;quot;] = robot.name[6:]&lt;br /&gt;
&lt;br /&gt;
# get sensors and actuators&lt;br /&gt;
rot_act = cont.actuators[&amp;quot;Rotate&amp;quot;]&lt;br /&gt;
walk_act = cont.actuators[&amp;quot;Walk&amp;quot;]&lt;br /&gt;
robot_collission2 = cont.sensors[&amp;quot;RobotCollission2&amp;quot;]&lt;br /&gt;
robot_radar2 = cont.sensors[&amp;quot;RobotRadar2&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
robot[&amp;quot;time&amp;quot;] += 1/60&lt;br /&gt;
&lt;br /&gt;
if robot[&amp;quot;time&amp;quot;] &amp;lt; robot[&amp;quot;sec_rot&amp;quot;]:&lt;br /&gt;
    cont.activate(rot_act)&lt;br /&gt;
&lt;br /&gt;
if robot[&amp;quot;time&amp;quot;] &amp;gt; robot[&amp;quot;sec_rot&amp;quot;] and robot[&amp;quot;time&amp;quot;] &amp;lt; (robot[&amp;quot;sec_rot&amp;quot;] + robot[&amp;quot;sec_walk&amp;quot;]):&lt;br /&gt;
    cont.deactivate(rot_act)&lt;br /&gt;
    cont.activate(walk_act)&lt;br /&gt;
&lt;br /&gt;
if robot[&amp;quot;time&amp;quot;] &amp;gt; (robot[&amp;quot;sec_rot&amp;quot;] + robot[&amp;quot;sec_walk&amp;quot;]):&lt;br /&gt;
    robot.state =1&lt;br /&gt;
&lt;br /&gt;
if robot_collission2.positive:&lt;br /&gt;
    robot[&amp;quot;collission&amp;quot;] +=1&lt;br /&gt;
&lt;br /&gt;
if robot_radar2.positive:&lt;br /&gt;
    robot[&amp;quot;radar&amp;quot;] +=1&lt;br /&gt;
    robot[&amp;quot;time&amp;quot;] = 0.0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wanneer je de robots nu laat starten met het ophalen van bestellingen, zie je dat ze op elkaar reageren en hun ontwijkactie uitvoeren. De acties die ze uitvoeren zijn hetzelfde maar hoelang ze deze actie uit voeren kan verschillen. Sommige robots zullen beter kunnen ontwijken en sneller door kunnen gaan met hun bestelling dan andere robots. De robots die een goede ontwijkstrategie hebben kunnen hun strategie doorgeven aan de andere robots.&lt;br /&gt;
&lt;br /&gt;
==Optimaliseren van reactie==&lt;br /&gt;
Wanneer de robots met hun eigen ontwijkingsstrategie orders gaan verzamelen, zul je verschillen zien in de aanpak. De ene robot draait lang een rondje terwijl de andere robot bijna gelijk weer verder gaat met de bestelling. Je wilt dat de robots van elkaar leren en de beste strategieën nadoen zodat ze totaal zo min mogelijk botsen. Botsen kan er namelijk voor zorgen dat de robot kapot gaat of dat een artikel op de grond valt.&lt;br /&gt;
Omdat we 6 robots hebben beginnen we met 6 verschillende strategieën (ieder tweetal met het aantal seconden rondjes draaien en rechtdoor lopen is een strategie). Na een bepaalde tijd moeten we weten hoe goed de strategie van iedere robot is zodat de goede robots dit door kunnen geven aan de andere robots.&lt;br /&gt;
Het uitwisselen van deze informatie en het veranderen van de strategie gebeurd in de centrale controller op de volgende manier:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Stap 1:&#039;&#039;&#039;&lt;br /&gt;
Importeer extra package numpy:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot; line&amp;gt;&lt;br /&gt;
# import necessary packages&lt;br /&gt;
import bge&lt;br /&gt;
import GameLogic&lt;br /&gt;
import random&lt;br /&gt;
import numpy&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Stap 2:&#039;&#039;&#039;&lt;br /&gt;
Voeg een extra team toe met robot 6 en 7. Je weet van de vorige les al hoe dit moet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Stap 3:&#039;&#039;&#039;&lt;br /&gt;
Voeg een extra tijd meting toe om de strategieën te kunnen updaten: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot; line&amp;gt;&lt;br /&gt;
central[&amp;quot;time&amp;quot;]+= 1/60&lt;br /&gt;
central[&amp;quot;time_minute&amp;quot;]+= 1/60&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Stap 4:&#039;&#039;&#039;&lt;br /&gt;
Per minuut gaan we de strategieën van de robots herzien en veranderen op de volgende manier:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot; line&amp;gt;&lt;br /&gt;
if central[&amp;quot;time_minute&amp;quot;] &amp;gt;=60:&lt;br /&gt;
    central[&amp;quot;time_minute&amp;quot;] = 0&lt;br /&gt;
    robots = [&amp;quot;Robot_6&amp;quot;, &amp;quot;Robot_7&amp;quot;, &amp;quot;Robot_8&amp;quot;, &amp;quot;Robot_9&amp;quot;, &amp;quot;Robot_10&amp;quot;, &amp;quot;Robot_11&amp;quot;]&lt;br /&gt;
    result = [[0,0,0,&amp;quot;&amp;quot;] for i in range(len(robots))]&lt;br /&gt;
    alg_result = 0&lt;br /&gt;
    for i in range(len(robots)):&lt;br /&gt;
        robot = scene.objects[robots[i]]&lt;br /&gt;
        result[i][0] = robot[&amp;quot;collission&amp;quot;] &lt;br /&gt;
        result[i][1] = robot[&amp;quot;sec_rot&amp;quot;]&lt;br /&gt;
        result[i][2] = robot[&amp;quot;sec_walk&amp;quot;]&lt;br /&gt;
        result[i][3] = robot&lt;br /&gt;
        alg_result += robot[&amp;quot;collission&amp;quot;]&lt;br /&gt;
        robot[&amp;quot;collission&amp;quot;] = 0&lt;br /&gt;
        robot[&amp;quot;radar&amp;quot;]=0   &lt;br /&gt;
    central[&amp;quot;algorithm&amp;quot;].append(alg_result)&lt;br /&gt;
    # print number of collissions per minute&lt;br /&gt;
    print(central[&amp;quot;algorithm&amp;quot;])&lt;br /&gt;
    result = sorted(result, key=lambda a_entry: a_entry[0]) &lt;br /&gt;
    print(result)&lt;br /&gt;
    print(&amp;quot;Total walked distance:&amp;quot;)&lt;br /&gt;
    print(central[&amp;quot;distance&amp;quot;])&lt;br /&gt;
    print(central[&amp;quot;time&amp;quot;])&lt;br /&gt;
    # update values&lt;br /&gt;
    for i in range(len(robots)):&lt;br /&gt;
        robot = scene.objects[robots[i]]&lt;br /&gt;
        take_from = random.choice([0,1])&lt;br /&gt;
        robot[&amp;quot;sec_rot&amp;quot;] = max(0,result[take_from][1] + random.gauss(0, 0.1))&lt;br /&gt;
        robot[&amp;quot;sec_walk&amp;quot;] = max(0,result[take_from][2] + random.gauss(0, 0.1))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wat we in deze functie doen is het evalueren van de prestatie van de robots. Met prestatie bedoelen we het aantal keer opbotsen tegen de andere robots. Hoe minder dit gebeurd, hoe beter. Voor iedere robot wordt dit aantal opgeslagen samen met de twee waarden die hiervoor zorgden. Deze prestatie wordt opgeteld bij het algehele resultaat van de groep en de waarden worden weer op 0 gezet voor de volgende minuut. &lt;br /&gt;
Vervolgens worden de strategieën van de robots aangepast. We nemen de strategieën van de 2 beste robots, de robots met het minste aantal botsingen, om door te geven aan de anderen. Op deze waarden passen we nog een kleine variatie toe om te kijken of we in de volgende minuut nog een betere strategie tegen gaan komen. Zo kunnen de robots blijven leren. &lt;br /&gt;
&lt;br /&gt;
==Experimenten==&lt;br /&gt;
Wanneer je de robots nu aan het werk zet zie je per minuut een update van de prestatie van het algoritme uitgeprint in de Terminal. Het is moeilijk te analyseren of deze methode echt werkt als je alleen naar deze geprinte waarden. Je kan de robots aan het werk zetten en een aantal boxen laten vullen en deze cijfers in de gaten houden maar je kan er pas echt wat over zeggen als je een goed experiment uitvoert. Dit gaan we doen in Les 7.&lt;br /&gt;
&lt;br /&gt;
==Plusopdracht==&lt;br /&gt;
Denk alvast na over hoe je kan testen of dit algoritme werkt.&lt;/div&gt;</summary>
		<author><name>Jacqueline</name></author>
	</entry>
	<entry>
		<id>https://infvo.nl/lab/index.php?title=Logistieke_Robots/les_5&amp;diff=473</id>
		<title>Logistieke Robots/les 5</title>
		<link rel="alternate" type="text/html" href="https://infvo.nl/lab/index.php?title=Logistieke_Robots/les_5&amp;diff=473"/>
		<updated>2014-12-17T17:17:47Z</updated>

		<summary type="html">&lt;p&gt;Jacqueline: /* Bijhouden van de gelopen afstand */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Zijbalk Logistieke Robots}}&lt;br /&gt;
&lt;br /&gt;
==Les 5 - Robots laten samen werken ==&lt;br /&gt;
In de vorige les heb je een controller gemaakt voor 1 robot om bestellingen te kunnen verzamelen. In deze les leer je om een team van twee robots samen te laten werken om mogelijk sneller de bestellingen te laten verzamelen. &lt;br /&gt;
&lt;br /&gt;
Je kan een team van twee robots op veel verschillende manieren met elkaar samen laten werken. In de praktijk heb je vaak te maken met beperkingen zoals het maximale gewicht wat een robot kan tillen. Wij gaan in onze simulatie uit van de volgende restrictie:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Robots kunnen in één keer meerdere artikelen meenemen uit een kast indien deze artikelen dezelfde zijn. Dit geldt niet voor verschillende artikelen.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Bij een enkele robot kunnen we ons dus voorstellen dat hij eerst de hele bestelling doorneemt om te kijken of er dezelfde artikelen in zitten. Wanneer dit het geval is loopt de robot naar de juiste kast en pakt een pakket waar al twee dezelfde artikelen in zitten. Een efficiëntie verbetering kunnen we vervolgens uitdrukken als het aantal minder gelopen meters.&lt;br /&gt;
&lt;br /&gt;
We implementeren in deze les het volgende scenario: 2 robots werken samen om 2 bestellingen op te halen waarbij de bovengenoemde voorwaarde nog steeds geld en waarbij de robots niet naar dezelfde kasten lopen. We richten ons in deze les vooral op de programmering dan op de visualisatie.&lt;br /&gt;
&lt;br /&gt;
== Bijhouden van de gelopen afstand ==&lt;br /&gt;
Voordat we efficiëntie verbeteringen kunnen detecteren, moeten we eerst de huidige situatie kunnen meten. Dit doen we aan de hand van de gelopen afstand in meters van de robot. Hoe je dit doet leer je in deze paragraaf. Je kan verder gaan met je eigen bestand maar je kan ook starten met [https://googledrive.com/host/0B4Wf_Tca5KDuNnFUWTc4R09jblU/logistieke-robots/warehouse_team.blend warehouse_team.blend]&lt;br /&gt;
&lt;br /&gt;
=== Verandering robot controller ===&lt;br /&gt;
Logisch is dat we een extra variabele gaan creëren die de gelopen afstand van de robot opslaat. Minder logisch is dat we ook de 3 verschillende coördinaten bijhouden van de robot. De coördinaten van de x,y en z as kun je ophalen met de functie positon. Waarom dit nodig is zien we zo. De variabelen declareer je op de volgende positie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
def get_order():&lt;br /&gt;
    # get articles from central controller&lt;br /&gt;
    robot[&amp;quot;articles&amp;quot;] = start_sens.bodies[0][1:]&lt;br /&gt;
    print(robot[&amp;quot;articles&amp;quot;])&lt;br /&gt;
    # set game properties&lt;br /&gt;
    robot[&amp;quot;article_number&amp;quot;] = 1 &lt;br /&gt;
    robot[&amp;quot;target_desk&amp;quot;] = False &lt;br /&gt;
    robot[&amp;quot;robot_id&amp;quot;] = start_sens.bodies[1]&lt;br /&gt;
    # distance variables&lt;br /&gt;
    robot[&amp;quot;distance&amp;quot;] = 0.0&lt;br /&gt;
    robot[&amp;quot;location1&amp;quot;] = robot.position[0]&lt;br /&gt;
    robot[&amp;quot;location2&amp;quot;] = robot.position[1]&lt;br /&gt;
    robot[&amp;quot;location3&amp;quot;] = robot.position[2]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wanneer de order ingepakt is geef je niet alleen de robot id mee aan de centrale controller maar ook de gelopen afstand. Wanneer de robot een nieuwe order krijgt wordt de afstand namelijk weer op 0 gezet. Hoe de centrale controller omgaat met dit bericht zien we in de volgende paragraaf.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
GameLogic.sendMessage(&amp;quot;Done&amp;quot;, robot[&amp;quot;robot_id&amp;quot;] , &amp;quot;Ground&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
GameLogic.sendMessage(&amp;quot;Done&amp;quot;, str(robot[&amp;quot;distance&amp;quot;]) , &amp;quot;Ground&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Het updaten van de gelopen afstand gaat op de volgende manier:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
main()&lt;br /&gt;
robot[&amp;quot;distance&amp;quot;] += robot.getVectTo([robot[&amp;quot;location1&amp;quot;], robot[&amp;quot;location2&amp;quot;], robot[&amp;quot;location3&amp;quot;]])[0]&lt;br /&gt;
loc1 = robot.position[0]&lt;br /&gt;
loc2 = robot.position[1]&lt;br /&gt;
loc3 = robot.position[2]&lt;br /&gt;
robot[&amp;quot;location1&amp;quot;] = loc1&lt;br /&gt;
robot[&amp;quot;location2&amp;quot;] = loc2&lt;br /&gt;
robot[&amp;quot;location3&amp;quot;] = loc3&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Iedere keer als je de controller aanroept gebruik je de functie getVectTo() om de afstand te berekenen tussen de locatie waar de robot op dat moment is en de laatst opgeslagen locatie. Vervolgend update je de locatie coördinaten naar degene waar de robot nu staat. Zo kan je de totaal gelopen afstand van de robot bijhouden.&lt;br /&gt;
&lt;br /&gt;
=== Verandering centrale controller ===&lt;br /&gt;
De robot moet zijn eigen gelopen afstand bij houden maar de centrale controller moet dit voor alle robots doen. Hiervoor is dus ook een variabele nodig:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
if sens.positive:&lt;br /&gt;
    robot = &amp;quot;11&amp;quot;&lt;br /&gt;
    central[&amp;quot;distance&amp;quot;] = 0&lt;br /&gt;
    Send_order(robot)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
De waarde van de variabele wordt aangepast als de centrale controller een message krijgt. De gelopen afstand is het tweede bericht gestuurd door de robot en deze is dus te vinden in message.bodies[1]. &lt;br /&gt;
Wanneer alle orders zijn vervuld, kun je de totale afstand van de robot printen op de volgende manier:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
if message.positive:&lt;br /&gt;
    central[&amp;quot;boxes_done&amp;quot;] +=1&lt;br /&gt;
    print(&amp;quot;number of boxes done:&amp;quot;)&lt;br /&gt;
    print(central[&amp;quot;boxes_done&amp;quot;])&lt;br /&gt;
    central[&amp;quot;distance&amp;quot;] += float(message.bodies[1])&lt;br /&gt;
    if central[&amp;quot;boxes_done&amp;quot;] &amp;lt; central[&amp;quot;boxes_tot&amp;quot;]&lt;br /&gt;
        robot = message.bodies[0]&lt;br /&gt;
        Send_order(robot)&lt;br /&gt;
    else:&lt;br /&gt;
        print(&amp;quot;Total walked distance:&amp;quot;)&lt;br /&gt;
        print(central[&amp;quot;distance&amp;quot;])&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Experiment ===&lt;br /&gt;
Nu kunnen we gaan meten hoe efficiënt de robot is in de huidige situatie. Dit doen we door het huidige algoritme een aantal keer te draaien: we gaan een experiment doen. Meerder runs zijn nodig omdat de bestelling steeds verschilt. Op basis van één run kunnen we niet zeggen hoe het algoritme gemiddeld presteert. Het kan namelijk zo zijn dat je alleen naar de dichtstbijzijnde kast hoeft te lopen. Dit is geen goede representatie van een gemiddelde bestelling. Daarom doen we nu 5 runs. &lt;br /&gt;
&lt;br /&gt;
Hieronder staan de uitkomsten van een experiment:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Run !! Afstand&lt;br /&gt;
|-&lt;br /&gt;
|Run 1	|| 615&lt;br /&gt;
|-&lt;br /&gt;
|Run 2 ||	709&lt;br /&gt;
|-&lt;br /&gt;
|Run 3 ||	683&lt;br /&gt;
|-&lt;br /&gt;
|Run 4 ||	698&lt;br /&gt;
|-&lt;br /&gt;
|Run 5||	719&lt;br /&gt;
|-&lt;br /&gt;
|Gemiddelde	|| 684,8&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Doe zelf ook een experiment met minimaal 5 runs en bekijk of het gemiddelde overeenkomt met de resultaten in bovenstaande tabel. Hoe meer runs je hebt, hoe preciezer je schatting van de prestatie van de robot.&lt;br /&gt;
&lt;br /&gt;
==Efficiëntie verbetering voor 1 robot==&lt;br /&gt;
In het vorige algoritme kon het zo zijn dat de robot 2 keer naar dezelfde kast moest lopen. Het gevolg van de voorwaarde die we in het begin van deze les introduceerden is dat dit niet meer hoeft. We gaan nu zien hoe we dit moeten veranderen en wat het gevolg is op de prestatie. &lt;br /&gt;
&lt;br /&gt;
===Verandering centrale controller===&lt;br /&gt;
&lt;br /&gt;
We moeten nu gaan bedenken wat de beste manier is om deze opzet te implementeren in het systeem. Logischer is dat de robot de order doorgaat en zoekt naar dubbelen. Maar dit is programmeer technisch gezien meer werk. Daarom laten we de centrale controller kijken of er dubbele in de order zitten. We hoeven dan geen aanpassingen te doen in de robot controller en maar een kleine aanpassing in de centrale controller:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
def Send_order(robot_team):&lt;br /&gt;
    pre_order = [random.choice(box_articles) for t in range(central[&amp;quot;box_size&amp;quot;])]&lt;br /&gt;
    pre_order = list(set(pre_order))&lt;br /&gt;
    order = &amp;quot;&amp;quot;&lt;br /&gt;
    for j in range(len(pre_order)):&lt;br /&gt;
            order += &amp;quot; &amp;quot; + pre_order[j]&lt;br /&gt;
    GameLogic.sendMessage(&amp;quot;Start&amp;quot;, order , &amp;quot;Robot_&amp;quot;+robot, &amp;quot;Ground&amp;quot;)&lt;br /&gt;
    GameLogic.sendMessage(&amp;quot;Start&amp;quot;, robot , &amp;quot;Robot_&amp;quot;+robot, &amp;quot;Ground&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zoals je kunt zien moet je nu gebruik maken van een array voor het aanmaken van de bestelling. Dan kun je namelijk de functie list() en set() gebruiken voor het eruit halen van dubbele artikelen. Aan de robot kunnen we alleen een string meegeven en daarom moeten we de array nog omzetten in een string. De grootte van de order kan nu 1, 2 of nog steeds 3 zijn.&lt;br /&gt;
&lt;br /&gt;
===Experiment ===&lt;br /&gt;
De resultaten zijn nu als volgt:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Run !! Afstand&lt;br /&gt;
|-&lt;br /&gt;
|Run 1	|| 495&lt;br /&gt;
|-&lt;br /&gt;
|Run 2 ||	592&lt;br /&gt;
|-&lt;br /&gt;
|Run 3 ||	599&lt;br /&gt;
|-&lt;br /&gt;
|Run 4 ||	437&lt;br /&gt;
|-&lt;br /&gt;
|Run 5||	648&lt;br /&gt;
|-&lt;br /&gt;
|Gemiddelde	|| 554,2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Te zien is dat de gemiddelde afstand van een run naar beneden is gegaan met 130,6 meter. &lt;br /&gt;
Als je deze afstand omzet naar de tijd die de robot daardoor sneller is kun je nadenken of je moet investeren in robots die meer artikelen uit een kast kunnen halen. Wanneer de investering namelijk kleiner is dan de opbrengt zal dit voor extra winst zorgen. &lt;br /&gt;
&lt;br /&gt;
==Efficiëntie verbetering door samenwerking==&lt;br /&gt;
Dat we een verbetering zouden zien is natuurlijk begrijpelijk omdat de robots ineens meer kunnen tillen. Interessanter is dat we met deze simulatie hebben kunnen zien wat de efficiëntie winst precies zal zijn en of het zin heeft om in deze complexere machines te investeren.   &lt;br /&gt;
&lt;br /&gt;
We gaan nu kijken naar de efficiëntie verbetering is door met een team van 2 robots te werken. Naast de vermindering in totaal gelopen meters gaan we nu ook kijken naar de tijd die het kost om de orders in te pakken. &lt;br /&gt;
&lt;br /&gt;
===Creëren team===&lt;br /&gt;
De robots gaan nu in tweetallen werken om de artikelen op te halen. Er zijn veel mogelijkheden hoe de robots samen kunnen werken. Verdelen van soorten artikelen, eerstvolgende artikel op de lijst ophalen, eerst de verste artikelen etc. Omdat de robots naast elkaar staan maakt het qua gelopen afstand niet veel uit welke robot welk artikel haalt. Het gaat hier dus vooral om de winst in tijd.&lt;br /&gt;
We gaan twee verschillende algoritmen implementeren. Eerst geven we de robots verantwoordelijkheid over de helft van de artikelen en vervolgens kijken we naar een goede verdeling op basis van de binnengekregen order.&lt;br /&gt;
&lt;br /&gt;
Om een team aan het werk te kunnen zetten, moeten we wel een team hebben. Selecteer Robot_11 en kopieer de robot (ctrl+c, ctrl+v voor Windows en cmd+c, cmd+v voor Mac) druk op de toets G en de toets X en sleep robot naar achter. Je hebt nu twee robots:&lt;br /&gt;
&lt;br /&gt;
[[Bestand:2_robots.png]]&lt;br /&gt;
&lt;br /&gt;
Verander de naam van de tweede robot in Robot_10 op de volgende manier:&lt;br /&gt;
&lt;br /&gt;
[[Bestand:rename_robot.png]]&lt;br /&gt;
&lt;br /&gt;
Verwijder de extra python controllers door deze te selecteren en op ‘x’ te drukken. Zorg ervoor dat je alleen de twee onderstaande controllers overhoudt:&lt;br /&gt;
&lt;br /&gt;
[[Bestand:delete_controllers.png]]&lt;br /&gt;
&lt;br /&gt;
Voeg de robot controller toe aan Robot_10:&lt;br /&gt;
&lt;br /&gt;
[[Bestand:change_controller.png]]&lt;br /&gt;
&lt;br /&gt;
===Veranderingen centrale controller===&lt;br /&gt;
We nemen de code weer stap voor stap onder handen. Bij het definiëren van de box_articles is het nu handiger als de “Shelf_” er niet voor staat. Waarom zien we zo.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
# define game properties&lt;br /&gt;
central[&amp;quot;boxes_tot&amp;quot;] = 5&lt;br /&gt;
central[&amp;quot;box_size&amp;quot;] = 3&lt;br /&gt;
box_articles = [1,2,3,4,5,6,7,8]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In plaats dat we nu een robot meegeven aan Send_order() geven we een team mee. We moeten nu ook bijhouden of de robots op hun teammaatje aan het wachten zijn voordat een nieuwe order kan gaan starten. Hiervoor maken we een array aan met de waarden 0/1 voor 11 robots. Naast de afstand houden we ook de tijd bij.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
if sens.positive:&lt;br /&gt;
    robot_team = [&amp;quot;10&amp;quot;,&amp;quot;11&amp;quot;]&lt;br /&gt;
    central[&amp;quot;active_robots&amp;quot;] = [0,0,0,0,0,0,0,0,0,0,0]&lt;br /&gt;
    central[&amp;quot;distance&amp;quot;] =0&lt;br /&gt;
    central[&amp;quot;time&amp;quot;] = 0.0&lt;br /&gt;
    Send_order(robot_team)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
De order wordt nu twee keer zo lang omdat de robots samen werken. We knippen de order op bij artikel 4. Robot 10 gaat dus artikelen 1, 2, 3 en 4 ophalen en Robot 11 de rest:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
def Send_order(robot_team):&lt;br /&gt;
    pre_order = [random.choice(box_articles) for t in range(len(robot_team)*central[&amp;quot;box_size&amp;quot;])]&lt;br /&gt;
    pre_order = list(set(pre_order))&lt;br /&gt;
    pre_order.sort()&lt;br /&gt;
    order = &amp;quot;&amp;quot;&lt;br /&gt;
    order2= &amp;quot;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    for j in range(len(pre_order)):&lt;br /&gt;
        if j &amp;lt;= len(pre_order)/2 -1 :&lt;br /&gt;
            order += &amp;quot; Shelf_&amp;quot; + str(pre_order[j])&lt;br /&gt;
        else:&lt;br /&gt;
            order2 += &amp;quot; Shelf_&amp;quot; + str(pre_order[j])&lt;br /&gt;
    GameLogic.sendMessage(&amp;quot;Start&amp;quot;, order , &amp;quot;Robot_&amp;quot;+robot_team[0] , &amp;quot;Ground&amp;quot;)&lt;br /&gt;
    GameLogic.sendMessage(&amp;quot;Start&amp;quot;, robot_team[0] , &amp;quot;Robot_&amp;quot;+robot_team[0] , &amp;quot;Ground&amp;quot;)&lt;br /&gt;
    central[&amp;quot;active_robots&amp;quot;][int(robot_team[0])-1]=1&lt;br /&gt;
    GameLogic.sendMessage(&amp;quot;Start&amp;quot;, order2 , &amp;quot;Robot_&amp;quot;+robot_team[1] , &amp;quot;Ground&amp;quot;)&lt;br /&gt;
    GameLogic.sendMessage(&amp;quot;Start&amp;quot;, robot_team[1] , &amp;quot;Robot_&amp;quot;+robot_team[1] , &amp;quot;Ground&amp;quot;)&lt;br /&gt;
    central[&amp;quot;active_robots&amp;quot;][int(robot_team[1])-1]=1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wanneer de robot klaar is met zijn deel van de bestelling moet hij wachten op zijn teamgenoot voordat er een nieuwe order kan starten. Dit kan op de volgende manier geprogrammeerd worden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
if message.positive:&lt;br /&gt;
    central[&amp;quot;active_robots&amp;quot;][int(message.bodies[0])-1]=0&lt;br /&gt;
    central[&amp;quot;distance&amp;quot;] += float(message.bodies[1])&lt;br /&gt;
    if central[&amp;quot;boxes_done&amp;quot;] &amp;lt; central[&amp;quot;boxes_tot&amp;quot;]-1 and central[&amp;quot;active_robots&amp;quot;][10-1]+central[&amp;quot;active_robots&amp;quot;][11-1]==0:&lt;br /&gt;
        central[&amp;quot;boxes_done&amp;quot;] +=1&lt;br /&gt;
        print(&amp;quot;number of boxes done:&amp;quot;)&lt;br /&gt;
        print(central[&amp;quot;boxes_done&amp;quot;])&lt;br /&gt;
        Send_order([&amp;quot;10&amp;quot;,&amp;quot;11&amp;quot;])&lt;br /&gt;
    if sum(central[&amp;quot;active_robots&amp;quot;]) == 0: &lt;br /&gt;
        print(&amp;quot;Total walked distance:&amp;quot;)&lt;br /&gt;
        print(central[&amp;quot;distance&amp;quot;])&lt;br /&gt;
        print(central[&amp;quot;time&amp;quot;])&lt;br /&gt;
 &lt;br /&gt;
central[&amp;quot;time&amp;quot;]+= 1/60&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
De tijd wordt bijgehouden met central[“time”]. Hiervoor moet je een Always sensor toevoegen met een pulse. Deze geeft 60 keer per seconde een pulse aan de central controller. Door bij iedere pulse 1/60 toe te voegen aan de variabele, kunnen we de tijd bijhouden. &lt;br /&gt;
&lt;br /&gt;
[[Bestand:add_pulse.png]]&lt;br /&gt;
&lt;br /&gt;
In de robot.py kun je print(“done robot 11”) vervangen door onderstaande regel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
print(&amp;quot;done robot &amp;quot;+ str(robot[&amp;quot;robot_id&amp;quot;]))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Experiment===&lt;br /&gt;
Hieronder staan de resultaten van een experiment.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Experiment 1&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Run !! Afstand !! Tijd&lt;br /&gt;
|-&lt;br /&gt;
|Run 1	|| 929 ||	124&lt;br /&gt;
|-&lt;br /&gt;
|Run 2 ||	879 ||	134&lt;br /&gt;
|-&lt;br /&gt;
|Run 3 ||	1092 ||	154&lt;br /&gt;
|-&lt;br /&gt;
|Run 4 ||	863	|| 121&lt;br /&gt;
|-&lt;br /&gt;
|Run 5||	805	|| 109&lt;br /&gt;
|-&lt;br /&gt;
|Gemiddelde	|| 913,6 ||	128,4&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Als we de gemiddelde afstand willen vergelijken met de afstanden uit de vorige experimenten moeten we dit getal eerst delen door 2 omdat er nu 2 keer zoveel bestellingen gedaan worden. We zien dan weer een verbetering in het totaal gelopen meters. Omdat dit niet erg verassend is gaan we nu kijken naar het tweede algoritme. Hier bekijken we een slimmere aanpak voor het verdelen van de artikelen in de order zodat de robots minder lang op elkaar wachten. We kunnen zo een winst in tijd behalen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Experiment 2&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Nu kan het voorkomen dat het aantal op te halen artikelen erg verschillend is doordat de artikelen alleen in kast 1 t/m 4 of 5 t/m 8 staan. Dit willen we gaan verbeteren. Dit kun je op de volgende manier doen: kijk naar het aantal artikelen in de array pre_order en deel dit door 2. Bij een oneven aantal artikelen krijgt Robot 11 het extra artikel. De code ziet er dan als volgt uit:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
def Send_order(robot_team):&lt;br /&gt;
    pre_order = [random.choice(box_articles) for t in range(len(robot_team)*central[&amp;quot;box_size&amp;quot;])]&lt;br /&gt;
    pre_order = list(set(pre_order))&lt;br /&gt;
    pre_order.sort()&lt;br /&gt;
    order = &amp;quot;&amp;quot;&lt;br /&gt;
    order2= &amp;quot;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    for j in range(len(pre_order)):&lt;br /&gt;
        if j &amp;lt;= len(pre_order)/2 -1 :&lt;br /&gt;
            order += &amp;quot; Shelf_&amp;quot; + str(pre_order[j])&lt;br /&gt;
        else:&lt;br /&gt;
            order2 += &amp;quot; Shelf_&amp;quot; + str(pre_order[j])&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
De resultaten van het experiment zijn nu:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Run !! Afstand !! Tijd&lt;br /&gt;
|-&lt;br /&gt;
|Run 1	|| 950 ||	114&lt;br /&gt;
|-&lt;br /&gt;
|Run 2 ||	940 ||	111&lt;br /&gt;
|-&lt;br /&gt;
|Run 3 ||	940 ||	112&lt;br /&gt;
|-&lt;br /&gt;
|Run 4 ||	993	|| 117&lt;br /&gt;
|-&lt;br /&gt;
|Run 5||	996	|| 116&lt;br /&gt;
|-&lt;br /&gt;
|Gemiddelde	|| 963,8 ||	114&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
We zien dat, ondanks de verhoging van het aantal gelopen meters, de totale tijd afgenomen is. Dit is dus een echte verbetering van het algoritme omdat dezelfde opstelling gebruikt wordt maar er slimmer gebruik wordt gemaakt van de robots.&lt;br /&gt;
&lt;br /&gt;
===Plusopdracht===&lt;br /&gt;
Bedenk andere manieren om de taken tussen de robots te verdelen om de gelopen afstand of tijd naar beneden te krijgen. Doe hier experimenten mee&lt;/div&gt;</summary>
		<author><name>Jacqueline</name></author>
	</entry>
	<entry>
		<id>https://infvo.nl/lab/index.php?title=Logistieke_Robots/Blender_installeren&amp;diff=472</id>
		<title>Logistieke Robots/Blender installeren</title>
		<link rel="alternate" type="text/html" href="https://infvo.nl/lab/index.php?title=Logistieke_Robots/Blender_installeren&amp;diff=472"/>
		<updated>2014-12-17T16:48:58Z</updated>

		<summary type="html">&lt;p&gt;Jacqueline: /* Downloaden en installeren Blender */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Downloaden en installeren Blender ==&lt;br /&gt;
&lt;br /&gt;
Blender is erg snel te downloaden en installeren aan de hand van het volgende stappenplan:&lt;br /&gt;
&lt;br /&gt;
# Ga naar http://www.blender.org/download/ om de 2.71 versie van Blender te downloaden&lt;br /&gt;
# Ga naar de tab overeenkomstig met jouw platform (Windows, Mac of iets anders) &amp;lt;br&amp;gt;  [[Bestand:Download-tabel.png|550px|Download-tabel]]&lt;br /&gt;
# Klik op ’64 bit’ of ’32 bit’ afhankelijk van jouw processor. Als je niet weet welke processor je hebt kun je onderstaande stappen volgen:&lt;br /&gt;
## Windows &amp;lt;br&amp;gt; Druk op de “Start” knop en vervolgens met de rechtermuisknop op “Computer” en erna op “Eigenschappen”. Bij “Systeem” staat het systeemtype weergegeven.&lt;br /&gt;
## Mac &amp;lt;br&amp;gt; Druk op “Over deze Mac”, vervolgens op “Meer informatie” en “systeem rapport” en kijk bij de hardware tap naar de Processor Naam. Vergelijk deze naam met onderstaande tabel:&lt;br /&gt;
# Wacht tot het downloaden klaar is&lt;br /&gt;
# Open het .exe bestand en volg de instructies. Het installeren duurt een aantal minuten&lt;br /&gt;
# Open Blender als dit niet automatisch na de installatie gebeurt&lt;br /&gt;
# Blender is succesvol geïnstalleerd wanneer je scherm er als volgt uit ziet: &amp;lt;br&amp;gt;  [[Bestand:Blender-openingscherm.png|600px|Blender openingscherm]]&lt;br /&gt;
&lt;br /&gt;
Voor hulp zie: https://www.youtube.com/watch?v=7oIdiRAjueM&lt;/div&gt;</summary>
		<author><name>Jacqueline</name></author>
	</entry>
	<entry>
		<id>https://infvo.nl/lab/index.php?title=Logistieke_Robots/les_1&amp;diff=471</id>
		<title>Logistieke Robots/les 1</title>
		<link rel="alternate" type="text/html" href="https://infvo.nl/lab/index.php?title=Logistieke_Robots/les_1&amp;diff=471"/>
		<updated>2014-12-17T16:48:33Z</updated>

		<summary type="html">&lt;p&gt;Jacqueline: /* Inhoud les 1 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Zijbalk Logistieke Robots}}&lt;br /&gt;
&lt;br /&gt;
== Inhoud les 1 ==&lt;br /&gt;
 &lt;br /&gt;
In deze les leer je hoe je voor een robot eenvoudige “brein software” kunt ontwikkelen in Blender. Deze “Brein software” zullen we vanaf nu een controller noemen. Je gaat eerst een controller ontwikkelen die je kunt aansturen via het toetsenbord: https://www.youtube.com/watch?v=Nzy56Jjr_2o.&lt;br /&gt;
In latere lessen zul je deze controller verder automatiseren, door middel van een Python-programma, zodat de robot zelfstandig (autonoom) aan de slag kan.&lt;br /&gt;
&lt;br /&gt;
Voordat je hiermee kunnen starten moet je ervoor zorgen dat Blender op je systeem geïnstalleerd is. [[../Blender installeren|Installeren Blender]]&lt;br /&gt;
&lt;br /&gt;
== Werken met Blender ==&lt;br /&gt;
&lt;br /&gt;
Het openen van Blender kan wat overweldigend zijn. Er zijn erg veel knoppen en getallen te zien en dit is nog niet alles. Voor dit project gebruiken we lang niet alle mogelijkheden die Blender heeft. We bespreken daarom ook niet alle knoppen die je nu ziet. Veel van de uitleg in deze paragraaf is overgenomen van http://wiki.blender.org/index.php/Doc:NL/2.6/Manual.&lt;br /&gt;
&lt;br /&gt;
Mocht je geïnteresseerd zijn in alle mogelijkheden van Blender kun je op deze site kijken. Ook zijn er mensen die graag hun creaties in Blender willen delen via het internet. We zullen hier verderop ook gebruik van maken.&lt;br /&gt;
&lt;br /&gt;
=== Blender interface ===&lt;br /&gt;
&lt;br /&gt;
De pop-up is het opstartscherm. Hier kun je recent geopende bestanden zien als je die hebt. Wanneer je een nieuw bestand wilt beginnen klik je ergens buiten het opstartscherm. Nu is de standaard lay-out zichtbaar met een kubus voorzien van assen. De standaard lay-out kan opgedeeld worden in verschillende vensters. Deze vensters, inclusief de meest gebruikte basiselementen, zijn aangegeven in figuur 1.&lt;br /&gt;
&lt;br /&gt;
[[Bestand:Blender-vensters.png|600px|Blender vensters]]&lt;br /&gt;
&lt;br /&gt;
Figuur 1&lt;br /&gt;
 &lt;br /&gt;
De vijf vensters in het startscherm zijn:&lt;br /&gt;
* Info Window: bovenaan het scherm, bestaande uit alleen een header&lt;br /&gt;
* 3D Window: hier kun je de uiteindelijke robots in actie zien&lt;br /&gt;
* Timeline Window: deze zullen we in dit project niet gebruiken&lt;br /&gt;
* Outliner Window: dit scherm geeft alle gemaakte objecten (inclusief de robots) weer in de omgeving&lt;br /&gt;
* Properties Window: hier kun je kenmerken van objecten wijzigen (bijvoorbeeld kleur en naam)&lt;br /&gt;
Er zijn meerdere Windows die je kan weergeven in je scherm. Het type venster kun je wijzigen door het Window Type te veranderen, te vinden in de linkerhoek van de headers van de windows.&lt;br /&gt;
Voor hulp zie: https://www.youtube.com/watch?v=TLJThln4eOE&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
De meest gebruikte basiselementen zijn:&lt;br /&gt;
* Current Screen Layout: Blender heeft passende startschermen voor verschillende gebruiksdoeleinden. Wij gebruiken Default of Scripting.&lt;br /&gt;
* Current Scene: je kunt verschillende 3D windows ontwikkelen. Dit zijn scenes. Wij zullen maar een Scene ontwikkelen&lt;br /&gt;
* Current Rendering Engine:&lt;br /&gt;
* Toggle Fullscreen: schakel de fullscreen mode aan/uit&lt;br /&gt;
* 3D Transform Manipulator: visueel hulpmiddel bij het transformeren van objecten (grab/verplaatsen, roteren en schalen). Dit kan ook met behulp van het toetsenbord (G, R, S)&lt;br /&gt;
* 3D cursor: heeft meerdere functies. Nieuwe objecten worden hier bijvoorbeeld geplaats en het geeft aan waar het rotatiepunt zit&lt;br /&gt;
* Cube Mesh / Light / Camera: bij het openen van een nieuw bestand in Blender is er standaard Cube Mesh, een Light en een Camera aanwezig&lt;br /&gt;
* Selected object: dit veld toont de naam van het huidige geselecteerde object&lt;br /&gt;
* 3D Window Header: alle vensters in Blender hebben een header, maar deze zit aan de onderkant. Hij bestaat onder andere uit:&lt;br /&gt;
** Viewport shading: hiermee kan het shading type aangegeven worden. Deze functie zal niet aangepast worden tijdens dit project&lt;br /&gt;
** Layers: wanneer je vele objecten hebt gecreëerd kan het makkelijk zijn om deze te ordenen in functionele groepen (robots in de ene layer, de omgeving in de andere). Hier zullen we geen gebruik van maken&lt;br /&gt;
* Buttons (Properties) Window Header: dit venster toont panels en deze panels zijn gegroepeerd. Om een andere groep te zien kunnen de knoppen in de header aangeklikt worden &amp;lt;br&amp;gt; [[Bestand:venster-knoppen.png|400px|Venster-knoppen]]&lt;br /&gt;
* Outliner Window: dit venster laat alle objecten in een scene zien.&lt;br /&gt;
* Timeline Window: Dit venster laat een tijdlijn zien die gebruikt kan worden voor karakter animaties. Dit zullen we niet gaan toepassen in dit project&lt;br /&gt;
* Window types: zoals eerder gezegd zijn er vele mogelijke vensters. Ieder venster werkt onafhankelijk van de anderen en het is mogelijk om het zelfde type venster meerdere keren open te hebben. We zullen niet alle types gebruiken. Degene die we wel gaan gebruiken, naast de basis schermen, zijn:&lt;br /&gt;
** Logic Editor: hiermee kan een controller gemaakt worden&lt;br /&gt;
** Text editor: hier schrijven we Python code&lt;br /&gt;
** Console: hier kun je de output zien van de Python code.&lt;br /&gt;
&lt;br /&gt;
===  Besturen van het 3D scherm ===&lt;br /&gt;
&lt;br /&gt;
Alle handelingen in Blender kun je doen door te werken met de muis. Voor iedere handeling is er ook een shortcut beschikbaar via het keyboard. Blender maakt gebruik van alle functies op een muis. Om deze reden is het aan te raden dat je een uitgebreide muis gebruikt (met een scrol functie die ingedrukt kan worden) voor de Windows computer. Voor de Mac is de touchpad toereikend. Gedurende dit project zullen we onderstaande codes gebruikten om te refereren naar handelingen met de muis.&lt;br /&gt;
* LMB  - Linker muisknop&lt;br /&gt;
* MMB  - Druk op het scroll wiel alsof het een knop is&lt;br /&gt;
* RMB  - Rechter muisknop&lt;br /&gt;
* Wheel  - Scrol wiel&lt;br /&gt;
 &lt;br /&gt;
De muis gebruik je voornamelijk om de 3D view te besturen&lt;br /&gt;
* MMB: hiermee kun je de scene vanuit alle hoeken bekijken&lt;br /&gt;
* Wheel: in/uitzoomen&lt;br /&gt;
* LMB: vastpakken van een object&lt;br /&gt;
* RMB: selecteren van een object&lt;br /&gt;
&lt;br /&gt;
De opdrachten hebben altijd betrekking op het subvenster waar de cursor staat. Je kunt bijvoorbeeld zowel in het 3D View als in het logic control venster in- en uitzoomen.&lt;br /&gt;
&lt;br /&gt;
== Aansturen van Morsy de Robot ==&lt;br /&gt;
[[Bestand:Morsy.png|thumb|200px|right|Morsy]]&lt;br /&gt;
&lt;br /&gt;
Nu gaan we echt aan de slag met Blender. We gaan een robot aansturen via het toetsenbord. Voordat we een robot kunnen aansturen moeten we er natuurlijk een hebben.&lt;br /&gt;
We gebruiken, om snel aan de slag te kunnen met de controller, een robot die al is ontwikkeld genaamd Morsy. Morsy komt uit de MORSE code, de Modular OpenRobots Simulation Engine. (https://www.openrobots.org/wiki/morse/)&lt;br /&gt;
Een plaatje van Morsy zie je hiernaast.&lt;br /&gt;
&lt;br /&gt;
Merk op dat deze logistieke robot geen armen heeft. Het oppakken van objecten om te verplaatsen zal dus meer symbolisch zijn. Het is mogelijk om armen met een animatie toe te voegen om een object op te pakken. Omdat dit niet het doel is van het project zullen we dit niet behandelen.&lt;br /&gt;
&lt;br /&gt;
=== Stap 1 ===&lt;br /&gt;
Open [https://googledrive.com/host/0B4Wf_Tca5KDuNnFUWTc4R09jblU/logistieke-robots/morsy.blend morsy.blend] (je moet deze eerst naar je eigen computer downloaden).&lt;br /&gt;
Je ziet dat we te maken hebben met dezelfde basis omgeving maar dat de Cube Mesh vervangen is door de Morsy robot.&lt;br /&gt;
&lt;br /&gt;
=== Stap 2 ===&lt;br /&gt;
Verander zonodig het window type van de timeline window (links onder) naar de logic editor (zie hiernaast).&lt;br /&gt;
&lt;br /&gt;
[[Bestand:Selecteer-logic-editor.png|thumb|200px|right|Selecteer Logic Editor]]&lt;br /&gt;
&lt;br /&gt;
=== Stap 3 ===&lt;br /&gt;
Maak de ruimte voor de logic editor iets groter en zoom indien nodig in (met de muis/touch pad) zodat de letters leesbaar zijn. Je kunt nu zien dat de logic editor bestaat uit sensoren, controllers en actuatoren. Sensoren zijn gebeurtenissen die Morsy kan waarnemen vanuit de omgeving. De controller bepaalt hoe je op deze gebeurtenis ingaat om zo eventueel een actuator aan te sturen.&lt;br /&gt;
&lt;br /&gt;
=== Stap 4: controller, sturen naar rechts ===&lt;br /&gt;
We kunnen nu de controller gaan maken. We willen de robot aansturen met de pijltjes op het toetsenbord. Iedere toets is dan een sensor. Wanneer deze sensor actief is (en dus ingedrukt wordt) moet de robot een bepaalde kant op gaan lopen. We beginnen met naar rechts lopen&lt;br /&gt;
Wanneer we de toets → indrukken willen we dat Morsy naar rechts gaat lopen (voor Morsy zelf is dit naar links). In de linker beneden hoek van het 3D scherm zien we de assen waarover de robot kan bewegen. We zien dat we Morsy moeten laten lopen over de –X as om deze naar rechts te laten gaan. Dit gaat als volgt:&lt;br /&gt;
* Voor het aanmaken van deze actie moeten we een sensor hebben die detecteert of we de toets → indrukken. Klik op “Add Sensor” en dan op Keyboard.&lt;br /&gt;
* Geef de Keyboard de naam “Right” en ga erna in het vakje “Key” staan waardoor je ziet “Press a key” en druk op →&lt;br /&gt;
* Ga naar “Add Controller” en voeg een “And” controller toe. Maak een link tussen de sensor en controller door de twee punten met elkaar te verbinden. Het moet er nu als volgt uit zien: &amp;lt;br&amp;gt; [[Bestand:Les1-keyboard-controller.png|700px|Keyboard sensor en controller]] &amp;lt;br&amp;gt; Wanneer we op de → toets drukken geeft dit een positief signaal aan de controller. De controller moet positieve signalen ontvangen van alle sensoren die verbonden zijn met deze controller om zelf een positief signaal door te kunnen geven. Dit is er nu maar 1. Wanneer alleen de toets → ingedrukt wordt geeft de controller dus een positief signaal.&lt;br /&gt;
*  Nu gaan we de controller verbinden aan een actie: lopen. Ga naar “Add Actuator” en voeg een “Motion” actuator toe. Geef deze ook de naam “Right” en een X loc waarde van -0.3. Druk ook op de L achter deze regel. Dit geeft aan dat we willen bewegen ten opzichte van de assen en niet ten opzichte van de locatie van Morsy zelf.  Maak een link tussen de controller en actuator. &amp;lt;br&amp;gt; [[Bestand:Les1-motion-actuator.png|700px|Add motion actuator]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Toevoegen van de vloer ====&lt;br /&gt;
Graag willen we nu weten of de robot naar rechts kan lopen. Als we nu in de “play” modus zouden gaan, zou de robot naar beneden vallen omdat we nog geen vloer hebben toegevoegd. Je zet Blender in de “play” modus door met de muis in het 3D view te staan en dan op ‘P’ te drukken. Je komt weer uit deze modus door op ‘Esc’ te drukken.&lt;br /&gt;
Voeg een vloer toe door in de header van de 3D view te klikken op “Add”, dan op “Mesh” en dan op “Plane”.&lt;br /&gt;
&lt;br /&gt;
[[Bestand:Les1-add-plane.png|350px|Add plane]]&lt;br /&gt;
   &lt;br /&gt;
Verschuif het vierkant onder Morsy door op de assen te klikken en de grond te verschuiven. Druk op “S” en gebruik de “Wheel” om de grond groter te maken.&lt;br /&gt;
Verander de kleur van de vloer door in het property venster te gaan naar:&lt;br /&gt;
&lt;br /&gt;
[[Bestand:Les1-plane-newmaterial.png|350px|Add new material]]&lt;br /&gt;
&lt;br /&gt;
en klik op “+ New”. Bij diffuse kun je een kleur uitkiezen.&lt;br /&gt;
Als het goed is ziet het 3D window er nu als volgt uit:&lt;br /&gt;
&lt;br /&gt;
[[Bestand:Les1-morsy-floor.png|700px|Morsy op het speelveld]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Druk nu op “P” en kijk of Morsy naar rechts beweegt bij het indrukken van de pijl naar rechts. Wanneer je dit getest hebt, druk weer op “Esc”. Wanneer Morsy niet naar rechts loopt, moet je stap 4 nogmaals doorlopen om te zien of je alles juist ingevoerd hebt.&lt;br /&gt;
* als Morsy naar links loopt, moet je het teken van de X-verplaatsing veranderen (bijv. van 0.2 naar -0.2);&lt;br /&gt;
* als Morse te snel of te langzaam loopt, moet je de verplaatsing kleiner of groter maken (bijv. van 0.4 naar 0.2);&lt;br /&gt;
* als er helemaal niets gebeurt, moet je controleren of je (i) de juiste toets ingevoerd hebt, in de Keyboard sensor; (ii) of je de verbinding tussen sensor en controller en controller en actuator gemaakt hebt;&lt;br /&gt;
&lt;br /&gt;
=== Stap 5: sturen naar links, achter en voor  ===&lt;br /&gt;
Zorg ervoor dat Morsy ook naar links, achter en naar voren kan lopen door middel van het toetsenbord.&lt;br /&gt;
&lt;br /&gt;
=== Stap 6: bestand opslaan voor vervolg ===&lt;br /&gt;
Sla het bestand op om volgende les mee verder te gaan.&lt;br /&gt;
&lt;br /&gt;
== Plusopdracht ==&lt;br /&gt;
Zorg ervoor dat de robot via het toetsenbord:&lt;br /&gt;
* Een rondje kan draaien om zijn eigen as met de toets ‘R’.&lt;br /&gt;
* Kan springen bij wanneer de Spacebar en toets J ingedrukt zijn.&lt;br /&gt;
Voor hulp zie: https://www.youtube.com/watch?v=Lpb8yCNgDQ8&lt;br /&gt;
&lt;br /&gt;
== Referenties ==&lt;br /&gt;
&lt;br /&gt;
* [[../Blender installeren]]&lt;br /&gt;
* MORSE code, de Modular OpenRobots Simulation Engine. (https://www.openrobots.org/wiki/morse/)&lt;/div&gt;</summary>
		<author><name>Jacqueline</name></author>
	</entry>
	<entry>
		<id>https://infvo.nl/lab/index.php?title=Logistieke_Robots/les_1&amp;diff=470</id>
		<title>Logistieke Robots/les 1</title>
		<link rel="alternate" type="text/html" href="https://infvo.nl/lab/index.php?title=Logistieke_Robots/les_1&amp;diff=470"/>
		<updated>2014-12-17T16:48:00Z</updated>

		<summary type="html">&lt;p&gt;Jacqueline: /* Plusopdracht */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Zijbalk Logistieke Robots}}&lt;br /&gt;
&lt;br /&gt;
== Inhoud les 1 ==&lt;br /&gt;
 &lt;br /&gt;
In deze les leer je hoe je voor een robot eenvoudige “brein software” kunt ontwikkelen in Blender. Deze “Brein software” zullen we vanaf nu een controller noemen. Je gaat eerst een controller ontwikkelen die je kunt aansturen via het toetsenbord.&lt;br /&gt;
In latere lessen zul je deze controller verder automatiseren, door middel van een Python-programma, zodat de robot zelfstandig (autonoom) aan de slag kan.&lt;br /&gt;
&lt;br /&gt;
Voordat je hiermee kunnen starten moet je ervoor zorgen dat Blender op je systeem geïnstalleerd is. [[../Blender installeren|Installeren Blender]]&lt;br /&gt;
&lt;br /&gt;
== Werken met Blender ==&lt;br /&gt;
&lt;br /&gt;
Het openen van Blender kan wat overweldigend zijn. Er zijn erg veel knoppen en getallen te zien en dit is nog niet alles. Voor dit project gebruiken we lang niet alle mogelijkheden die Blender heeft. We bespreken daarom ook niet alle knoppen die je nu ziet. Veel van de uitleg in deze paragraaf is overgenomen van http://wiki.blender.org/index.php/Doc:NL/2.6/Manual.&lt;br /&gt;
&lt;br /&gt;
Mocht je geïnteresseerd zijn in alle mogelijkheden van Blender kun je op deze site kijken. Ook zijn er mensen die graag hun creaties in Blender willen delen via het internet. We zullen hier verderop ook gebruik van maken.&lt;br /&gt;
&lt;br /&gt;
=== Blender interface ===&lt;br /&gt;
&lt;br /&gt;
De pop-up is het opstartscherm. Hier kun je recent geopende bestanden zien als je die hebt. Wanneer je een nieuw bestand wilt beginnen klik je ergens buiten het opstartscherm. Nu is de standaard lay-out zichtbaar met een kubus voorzien van assen. De standaard lay-out kan opgedeeld worden in verschillende vensters. Deze vensters, inclusief de meest gebruikte basiselementen, zijn aangegeven in figuur 1.&lt;br /&gt;
&lt;br /&gt;
[[Bestand:Blender-vensters.png|600px|Blender vensters]]&lt;br /&gt;
&lt;br /&gt;
Figuur 1&lt;br /&gt;
 &lt;br /&gt;
De vijf vensters in het startscherm zijn:&lt;br /&gt;
* Info Window: bovenaan het scherm, bestaande uit alleen een header&lt;br /&gt;
* 3D Window: hier kun je de uiteindelijke robots in actie zien&lt;br /&gt;
* Timeline Window: deze zullen we in dit project niet gebruiken&lt;br /&gt;
* Outliner Window: dit scherm geeft alle gemaakte objecten (inclusief de robots) weer in de omgeving&lt;br /&gt;
* Properties Window: hier kun je kenmerken van objecten wijzigen (bijvoorbeeld kleur en naam)&lt;br /&gt;
Er zijn meerdere Windows die je kan weergeven in je scherm. Het type venster kun je wijzigen door het Window Type te veranderen, te vinden in de linkerhoek van de headers van de windows.&lt;br /&gt;
Voor hulp zie: https://www.youtube.com/watch?v=TLJThln4eOE&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
De meest gebruikte basiselementen zijn:&lt;br /&gt;
* Current Screen Layout: Blender heeft passende startschermen voor verschillende gebruiksdoeleinden. Wij gebruiken Default of Scripting.&lt;br /&gt;
* Current Scene: je kunt verschillende 3D windows ontwikkelen. Dit zijn scenes. Wij zullen maar een Scene ontwikkelen&lt;br /&gt;
* Current Rendering Engine:&lt;br /&gt;
* Toggle Fullscreen: schakel de fullscreen mode aan/uit&lt;br /&gt;
* 3D Transform Manipulator: visueel hulpmiddel bij het transformeren van objecten (grab/verplaatsen, roteren en schalen). Dit kan ook met behulp van het toetsenbord (G, R, S)&lt;br /&gt;
* 3D cursor: heeft meerdere functies. Nieuwe objecten worden hier bijvoorbeeld geplaats en het geeft aan waar het rotatiepunt zit&lt;br /&gt;
* Cube Mesh / Light / Camera: bij het openen van een nieuw bestand in Blender is er standaard Cube Mesh, een Light en een Camera aanwezig&lt;br /&gt;
* Selected object: dit veld toont de naam van het huidige geselecteerde object&lt;br /&gt;
* 3D Window Header: alle vensters in Blender hebben een header, maar deze zit aan de onderkant. Hij bestaat onder andere uit:&lt;br /&gt;
** Viewport shading: hiermee kan het shading type aangegeven worden. Deze functie zal niet aangepast worden tijdens dit project&lt;br /&gt;
** Layers: wanneer je vele objecten hebt gecreëerd kan het makkelijk zijn om deze te ordenen in functionele groepen (robots in de ene layer, de omgeving in de andere). Hier zullen we geen gebruik van maken&lt;br /&gt;
* Buttons (Properties) Window Header: dit venster toont panels en deze panels zijn gegroepeerd. Om een andere groep te zien kunnen de knoppen in de header aangeklikt worden &amp;lt;br&amp;gt; [[Bestand:venster-knoppen.png|400px|Venster-knoppen]]&lt;br /&gt;
* Outliner Window: dit venster laat alle objecten in een scene zien.&lt;br /&gt;
* Timeline Window: Dit venster laat een tijdlijn zien die gebruikt kan worden voor karakter animaties. Dit zullen we niet gaan toepassen in dit project&lt;br /&gt;
* Window types: zoals eerder gezegd zijn er vele mogelijke vensters. Ieder venster werkt onafhankelijk van de anderen en het is mogelijk om het zelfde type venster meerdere keren open te hebben. We zullen niet alle types gebruiken. Degene die we wel gaan gebruiken, naast de basis schermen, zijn:&lt;br /&gt;
** Logic Editor: hiermee kan een controller gemaakt worden&lt;br /&gt;
** Text editor: hier schrijven we Python code&lt;br /&gt;
** Console: hier kun je de output zien van de Python code.&lt;br /&gt;
&lt;br /&gt;
===  Besturen van het 3D scherm ===&lt;br /&gt;
&lt;br /&gt;
Alle handelingen in Blender kun je doen door te werken met de muis. Voor iedere handeling is er ook een shortcut beschikbaar via het keyboard. Blender maakt gebruik van alle functies op een muis. Om deze reden is het aan te raden dat je een uitgebreide muis gebruikt (met een scrol functie die ingedrukt kan worden) voor de Windows computer. Voor de Mac is de touchpad toereikend. Gedurende dit project zullen we onderstaande codes gebruikten om te refereren naar handelingen met de muis.&lt;br /&gt;
* LMB  - Linker muisknop&lt;br /&gt;
* MMB  - Druk op het scroll wiel alsof het een knop is&lt;br /&gt;
* RMB  - Rechter muisknop&lt;br /&gt;
* Wheel  - Scrol wiel&lt;br /&gt;
 &lt;br /&gt;
De muis gebruik je voornamelijk om de 3D view te besturen&lt;br /&gt;
* MMB: hiermee kun je de scene vanuit alle hoeken bekijken&lt;br /&gt;
* Wheel: in/uitzoomen&lt;br /&gt;
* LMB: vastpakken van een object&lt;br /&gt;
* RMB: selecteren van een object&lt;br /&gt;
&lt;br /&gt;
De opdrachten hebben altijd betrekking op het subvenster waar de cursor staat. Je kunt bijvoorbeeld zowel in het 3D View als in het logic control venster in- en uitzoomen.&lt;br /&gt;
&lt;br /&gt;
== Aansturen van Morsy de Robot ==&lt;br /&gt;
[[Bestand:Morsy.png|thumb|200px|right|Morsy]]&lt;br /&gt;
&lt;br /&gt;
Nu gaan we echt aan de slag met Blender. We gaan een robot aansturen via het toetsenbord. Voordat we een robot kunnen aansturen moeten we er natuurlijk een hebben.&lt;br /&gt;
We gebruiken, om snel aan de slag te kunnen met de controller, een robot die al is ontwikkeld genaamd Morsy. Morsy komt uit de MORSE code, de Modular OpenRobots Simulation Engine. (https://www.openrobots.org/wiki/morse/)&lt;br /&gt;
Een plaatje van Morsy zie je hiernaast.&lt;br /&gt;
&lt;br /&gt;
Merk op dat deze logistieke robot geen armen heeft. Het oppakken van objecten om te verplaatsen zal dus meer symbolisch zijn. Het is mogelijk om armen met een animatie toe te voegen om een object op te pakken. Omdat dit niet het doel is van het project zullen we dit niet behandelen.&lt;br /&gt;
&lt;br /&gt;
=== Stap 1 ===&lt;br /&gt;
Open [https://googledrive.com/host/0B4Wf_Tca5KDuNnFUWTc4R09jblU/logistieke-robots/morsy.blend morsy.blend] (je moet deze eerst naar je eigen computer downloaden).&lt;br /&gt;
Je ziet dat we te maken hebben met dezelfde basis omgeving maar dat de Cube Mesh vervangen is door de Morsy robot.&lt;br /&gt;
&lt;br /&gt;
=== Stap 2 ===&lt;br /&gt;
Verander zonodig het window type van de timeline window (links onder) naar de logic editor (zie hiernaast).&lt;br /&gt;
&lt;br /&gt;
[[Bestand:Selecteer-logic-editor.png|thumb|200px|right|Selecteer Logic Editor]]&lt;br /&gt;
&lt;br /&gt;
=== Stap 3 ===&lt;br /&gt;
Maak de ruimte voor de logic editor iets groter en zoom indien nodig in (met de muis/touch pad) zodat de letters leesbaar zijn. Je kunt nu zien dat de logic editor bestaat uit sensoren, controllers en actuatoren. Sensoren zijn gebeurtenissen die Morsy kan waarnemen vanuit de omgeving. De controller bepaalt hoe je op deze gebeurtenis ingaat om zo eventueel een actuator aan te sturen.&lt;br /&gt;
&lt;br /&gt;
=== Stap 4: controller, sturen naar rechts ===&lt;br /&gt;
We kunnen nu de controller gaan maken. We willen de robot aansturen met de pijltjes op het toetsenbord. Iedere toets is dan een sensor. Wanneer deze sensor actief is (en dus ingedrukt wordt) moet de robot een bepaalde kant op gaan lopen. We beginnen met naar rechts lopen&lt;br /&gt;
Wanneer we de toets → indrukken willen we dat Morsy naar rechts gaat lopen (voor Morsy zelf is dit naar links). In de linker beneden hoek van het 3D scherm zien we de assen waarover de robot kan bewegen. We zien dat we Morsy moeten laten lopen over de –X as om deze naar rechts te laten gaan. Dit gaat als volgt:&lt;br /&gt;
* Voor het aanmaken van deze actie moeten we een sensor hebben die detecteert of we de toets → indrukken. Klik op “Add Sensor” en dan op Keyboard.&lt;br /&gt;
* Geef de Keyboard de naam “Right” en ga erna in het vakje “Key” staan waardoor je ziet “Press a key” en druk op →&lt;br /&gt;
* Ga naar “Add Controller” en voeg een “And” controller toe. Maak een link tussen de sensor en controller door de twee punten met elkaar te verbinden. Het moet er nu als volgt uit zien: &amp;lt;br&amp;gt; [[Bestand:Les1-keyboard-controller.png|700px|Keyboard sensor en controller]] &amp;lt;br&amp;gt; Wanneer we op de → toets drukken geeft dit een positief signaal aan de controller. De controller moet positieve signalen ontvangen van alle sensoren die verbonden zijn met deze controller om zelf een positief signaal door te kunnen geven. Dit is er nu maar 1. Wanneer alleen de toets → ingedrukt wordt geeft de controller dus een positief signaal.&lt;br /&gt;
*  Nu gaan we de controller verbinden aan een actie: lopen. Ga naar “Add Actuator” en voeg een “Motion” actuator toe. Geef deze ook de naam “Right” en een X loc waarde van -0.3. Druk ook op de L achter deze regel. Dit geeft aan dat we willen bewegen ten opzichte van de assen en niet ten opzichte van de locatie van Morsy zelf.  Maak een link tussen de controller en actuator. &amp;lt;br&amp;gt; [[Bestand:Les1-motion-actuator.png|700px|Add motion actuator]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Toevoegen van de vloer ====&lt;br /&gt;
Graag willen we nu weten of de robot naar rechts kan lopen. Als we nu in de “play” modus zouden gaan, zou de robot naar beneden vallen omdat we nog geen vloer hebben toegevoegd. Je zet Blender in de “play” modus door met de muis in het 3D view te staan en dan op ‘P’ te drukken. Je komt weer uit deze modus door op ‘Esc’ te drukken.&lt;br /&gt;
Voeg een vloer toe door in de header van de 3D view te klikken op “Add”, dan op “Mesh” en dan op “Plane”.&lt;br /&gt;
&lt;br /&gt;
[[Bestand:Les1-add-plane.png|350px|Add plane]]&lt;br /&gt;
   &lt;br /&gt;
Verschuif het vierkant onder Morsy door op de assen te klikken en de grond te verschuiven. Druk op “S” en gebruik de “Wheel” om de grond groter te maken.&lt;br /&gt;
Verander de kleur van de vloer door in het property venster te gaan naar:&lt;br /&gt;
&lt;br /&gt;
[[Bestand:Les1-plane-newmaterial.png|350px|Add new material]]&lt;br /&gt;
&lt;br /&gt;
en klik op “+ New”. Bij diffuse kun je een kleur uitkiezen.&lt;br /&gt;
Als het goed is ziet het 3D window er nu als volgt uit:&lt;br /&gt;
&lt;br /&gt;
[[Bestand:Les1-morsy-floor.png|700px|Morsy op het speelveld]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Druk nu op “P” en kijk of Morsy naar rechts beweegt bij het indrukken van de pijl naar rechts. Wanneer je dit getest hebt, druk weer op “Esc”. Wanneer Morsy niet naar rechts loopt, moet je stap 4 nogmaals doorlopen om te zien of je alles juist ingevoerd hebt.&lt;br /&gt;
* als Morsy naar links loopt, moet je het teken van de X-verplaatsing veranderen (bijv. van 0.2 naar -0.2);&lt;br /&gt;
* als Morse te snel of te langzaam loopt, moet je de verplaatsing kleiner of groter maken (bijv. van 0.4 naar 0.2);&lt;br /&gt;
* als er helemaal niets gebeurt, moet je controleren of je (i) de juiste toets ingevoerd hebt, in de Keyboard sensor; (ii) of je de verbinding tussen sensor en controller en controller en actuator gemaakt hebt;&lt;br /&gt;
&lt;br /&gt;
=== Stap 5: sturen naar links, achter en voor  ===&lt;br /&gt;
Zorg ervoor dat Morsy ook naar links, achter en naar voren kan lopen door middel van het toetsenbord.&lt;br /&gt;
&lt;br /&gt;
=== Stap 6: bestand opslaan voor vervolg ===&lt;br /&gt;
Sla het bestand op om volgende les mee verder te gaan.&lt;br /&gt;
&lt;br /&gt;
== Plusopdracht ==&lt;br /&gt;
Zorg ervoor dat de robot via het toetsenbord:&lt;br /&gt;
* Een rondje kan draaien om zijn eigen as met de toets ‘R’.&lt;br /&gt;
* Kan springen bij wanneer de Spacebar en toets J ingedrukt zijn.&lt;br /&gt;
Voor hulp zie: https://www.youtube.com/watch?v=Lpb8yCNgDQ8&lt;br /&gt;
&lt;br /&gt;
== Referenties ==&lt;br /&gt;
&lt;br /&gt;
* [[../Blender installeren]]&lt;br /&gt;
* MORSE code, de Modular OpenRobots Simulation Engine. (https://www.openrobots.org/wiki/morse/)&lt;/div&gt;</summary>
		<author><name>Jacqueline</name></author>
	</entry>
	<entry>
		<id>https://infvo.nl/lab/index.php?title=Logistieke_Robots/les_1&amp;diff=469</id>
		<title>Logistieke Robots/les 1</title>
		<link rel="alternate" type="text/html" href="https://infvo.nl/lab/index.php?title=Logistieke_Robots/les_1&amp;diff=469"/>
		<updated>2014-12-17T16:47:45Z</updated>

		<summary type="html">&lt;p&gt;Jacqueline: /* Plusopdracht */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Zijbalk Logistieke Robots}}&lt;br /&gt;
&lt;br /&gt;
== Inhoud les 1 ==&lt;br /&gt;
 &lt;br /&gt;
In deze les leer je hoe je voor een robot eenvoudige “brein software” kunt ontwikkelen in Blender. Deze “Brein software” zullen we vanaf nu een controller noemen. Je gaat eerst een controller ontwikkelen die je kunt aansturen via het toetsenbord.&lt;br /&gt;
In latere lessen zul je deze controller verder automatiseren, door middel van een Python-programma, zodat de robot zelfstandig (autonoom) aan de slag kan.&lt;br /&gt;
&lt;br /&gt;
Voordat je hiermee kunnen starten moet je ervoor zorgen dat Blender op je systeem geïnstalleerd is. [[../Blender installeren|Installeren Blender]]&lt;br /&gt;
&lt;br /&gt;
== Werken met Blender ==&lt;br /&gt;
&lt;br /&gt;
Het openen van Blender kan wat overweldigend zijn. Er zijn erg veel knoppen en getallen te zien en dit is nog niet alles. Voor dit project gebruiken we lang niet alle mogelijkheden die Blender heeft. We bespreken daarom ook niet alle knoppen die je nu ziet. Veel van de uitleg in deze paragraaf is overgenomen van http://wiki.blender.org/index.php/Doc:NL/2.6/Manual.&lt;br /&gt;
&lt;br /&gt;
Mocht je geïnteresseerd zijn in alle mogelijkheden van Blender kun je op deze site kijken. Ook zijn er mensen die graag hun creaties in Blender willen delen via het internet. We zullen hier verderop ook gebruik van maken.&lt;br /&gt;
&lt;br /&gt;
=== Blender interface ===&lt;br /&gt;
&lt;br /&gt;
De pop-up is het opstartscherm. Hier kun je recent geopende bestanden zien als je die hebt. Wanneer je een nieuw bestand wilt beginnen klik je ergens buiten het opstartscherm. Nu is de standaard lay-out zichtbaar met een kubus voorzien van assen. De standaard lay-out kan opgedeeld worden in verschillende vensters. Deze vensters, inclusief de meest gebruikte basiselementen, zijn aangegeven in figuur 1.&lt;br /&gt;
&lt;br /&gt;
[[Bestand:Blender-vensters.png|600px|Blender vensters]]&lt;br /&gt;
&lt;br /&gt;
Figuur 1&lt;br /&gt;
 &lt;br /&gt;
De vijf vensters in het startscherm zijn:&lt;br /&gt;
* Info Window: bovenaan het scherm, bestaande uit alleen een header&lt;br /&gt;
* 3D Window: hier kun je de uiteindelijke robots in actie zien&lt;br /&gt;
* Timeline Window: deze zullen we in dit project niet gebruiken&lt;br /&gt;
* Outliner Window: dit scherm geeft alle gemaakte objecten (inclusief de robots) weer in de omgeving&lt;br /&gt;
* Properties Window: hier kun je kenmerken van objecten wijzigen (bijvoorbeeld kleur en naam)&lt;br /&gt;
Er zijn meerdere Windows die je kan weergeven in je scherm. Het type venster kun je wijzigen door het Window Type te veranderen, te vinden in de linkerhoek van de headers van de windows.&lt;br /&gt;
Voor hulp zie: https://www.youtube.com/watch?v=TLJThln4eOE&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
De meest gebruikte basiselementen zijn:&lt;br /&gt;
* Current Screen Layout: Blender heeft passende startschermen voor verschillende gebruiksdoeleinden. Wij gebruiken Default of Scripting.&lt;br /&gt;
* Current Scene: je kunt verschillende 3D windows ontwikkelen. Dit zijn scenes. Wij zullen maar een Scene ontwikkelen&lt;br /&gt;
* Current Rendering Engine:&lt;br /&gt;
* Toggle Fullscreen: schakel de fullscreen mode aan/uit&lt;br /&gt;
* 3D Transform Manipulator: visueel hulpmiddel bij het transformeren van objecten (grab/verplaatsen, roteren en schalen). Dit kan ook met behulp van het toetsenbord (G, R, S)&lt;br /&gt;
* 3D cursor: heeft meerdere functies. Nieuwe objecten worden hier bijvoorbeeld geplaats en het geeft aan waar het rotatiepunt zit&lt;br /&gt;
* Cube Mesh / Light / Camera: bij het openen van een nieuw bestand in Blender is er standaard Cube Mesh, een Light en een Camera aanwezig&lt;br /&gt;
* Selected object: dit veld toont de naam van het huidige geselecteerde object&lt;br /&gt;
* 3D Window Header: alle vensters in Blender hebben een header, maar deze zit aan de onderkant. Hij bestaat onder andere uit:&lt;br /&gt;
** Viewport shading: hiermee kan het shading type aangegeven worden. Deze functie zal niet aangepast worden tijdens dit project&lt;br /&gt;
** Layers: wanneer je vele objecten hebt gecreëerd kan het makkelijk zijn om deze te ordenen in functionele groepen (robots in de ene layer, de omgeving in de andere). Hier zullen we geen gebruik van maken&lt;br /&gt;
* Buttons (Properties) Window Header: dit venster toont panels en deze panels zijn gegroepeerd. Om een andere groep te zien kunnen de knoppen in de header aangeklikt worden &amp;lt;br&amp;gt; [[Bestand:venster-knoppen.png|400px|Venster-knoppen]]&lt;br /&gt;
* Outliner Window: dit venster laat alle objecten in een scene zien.&lt;br /&gt;
* Timeline Window: Dit venster laat een tijdlijn zien die gebruikt kan worden voor karakter animaties. Dit zullen we niet gaan toepassen in dit project&lt;br /&gt;
* Window types: zoals eerder gezegd zijn er vele mogelijke vensters. Ieder venster werkt onafhankelijk van de anderen en het is mogelijk om het zelfde type venster meerdere keren open te hebben. We zullen niet alle types gebruiken. Degene die we wel gaan gebruiken, naast de basis schermen, zijn:&lt;br /&gt;
** Logic Editor: hiermee kan een controller gemaakt worden&lt;br /&gt;
** Text editor: hier schrijven we Python code&lt;br /&gt;
** Console: hier kun je de output zien van de Python code.&lt;br /&gt;
&lt;br /&gt;
===  Besturen van het 3D scherm ===&lt;br /&gt;
&lt;br /&gt;
Alle handelingen in Blender kun je doen door te werken met de muis. Voor iedere handeling is er ook een shortcut beschikbaar via het keyboard. Blender maakt gebruik van alle functies op een muis. Om deze reden is het aan te raden dat je een uitgebreide muis gebruikt (met een scrol functie die ingedrukt kan worden) voor de Windows computer. Voor de Mac is de touchpad toereikend. Gedurende dit project zullen we onderstaande codes gebruikten om te refereren naar handelingen met de muis.&lt;br /&gt;
* LMB  - Linker muisknop&lt;br /&gt;
* MMB  - Druk op het scroll wiel alsof het een knop is&lt;br /&gt;
* RMB  - Rechter muisknop&lt;br /&gt;
* Wheel  - Scrol wiel&lt;br /&gt;
 &lt;br /&gt;
De muis gebruik je voornamelijk om de 3D view te besturen&lt;br /&gt;
* MMB: hiermee kun je de scene vanuit alle hoeken bekijken&lt;br /&gt;
* Wheel: in/uitzoomen&lt;br /&gt;
* LMB: vastpakken van een object&lt;br /&gt;
* RMB: selecteren van een object&lt;br /&gt;
&lt;br /&gt;
De opdrachten hebben altijd betrekking op het subvenster waar de cursor staat. Je kunt bijvoorbeeld zowel in het 3D View als in het logic control venster in- en uitzoomen.&lt;br /&gt;
&lt;br /&gt;
== Aansturen van Morsy de Robot ==&lt;br /&gt;
[[Bestand:Morsy.png|thumb|200px|right|Morsy]]&lt;br /&gt;
&lt;br /&gt;
Nu gaan we echt aan de slag met Blender. We gaan een robot aansturen via het toetsenbord. Voordat we een robot kunnen aansturen moeten we er natuurlijk een hebben.&lt;br /&gt;
We gebruiken, om snel aan de slag te kunnen met de controller, een robot die al is ontwikkeld genaamd Morsy. Morsy komt uit de MORSE code, de Modular OpenRobots Simulation Engine. (https://www.openrobots.org/wiki/morse/)&lt;br /&gt;
Een plaatje van Morsy zie je hiernaast.&lt;br /&gt;
&lt;br /&gt;
Merk op dat deze logistieke robot geen armen heeft. Het oppakken van objecten om te verplaatsen zal dus meer symbolisch zijn. Het is mogelijk om armen met een animatie toe te voegen om een object op te pakken. Omdat dit niet het doel is van het project zullen we dit niet behandelen.&lt;br /&gt;
&lt;br /&gt;
=== Stap 1 ===&lt;br /&gt;
Open [https://googledrive.com/host/0B4Wf_Tca5KDuNnFUWTc4R09jblU/logistieke-robots/morsy.blend morsy.blend] (je moet deze eerst naar je eigen computer downloaden).&lt;br /&gt;
Je ziet dat we te maken hebben met dezelfde basis omgeving maar dat de Cube Mesh vervangen is door de Morsy robot.&lt;br /&gt;
&lt;br /&gt;
=== Stap 2 ===&lt;br /&gt;
Verander zonodig het window type van de timeline window (links onder) naar de logic editor (zie hiernaast).&lt;br /&gt;
&lt;br /&gt;
[[Bestand:Selecteer-logic-editor.png|thumb|200px|right|Selecteer Logic Editor]]&lt;br /&gt;
&lt;br /&gt;
=== Stap 3 ===&lt;br /&gt;
Maak de ruimte voor de logic editor iets groter en zoom indien nodig in (met de muis/touch pad) zodat de letters leesbaar zijn. Je kunt nu zien dat de logic editor bestaat uit sensoren, controllers en actuatoren. Sensoren zijn gebeurtenissen die Morsy kan waarnemen vanuit de omgeving. De controller bepaalt hoe je op deze gebeurtenis ingaat om zo eventueel een actuator aan te sturen.&lt;br /&gt;
&lt;br /&gt;
=== Stap 4: controller, sturen naar rechts ===&lt;br /&gt;
We kunnen nu de controller gaan maken. We willen de robot aansturen met de pijltjes op het toetsenbord. Iedere toets is dan een sensor. Wanneer deze sensor actief is (en dus ingedrukt wordt) moet de robot een bepaalde kant op gaan lopen. We beginnen met naar rechts lopen&lt;br /&gt;
Wanneer we de toets → indrukken willen we dat Morsy naar rechts gaat lopen (voor Morsy zelf is dit naar links). In de linker beneden hoek van het 3D scherm zien we de assen waarover de robot kan bewegen. We zien dat we Morsy moeten laten lopen over de –X as om deze naar rechts te laten gaan. Dit gaat als volgt:&lt;br /&gt;
* Voor het aanmaken van deze actie moeten we een sensor hebben die detecteert of we de toets → indrukken. Klik op “Add Sensor” en dan op Keyboard.&lt;br /&gt;
* Geef de Keyboard de naam “Right” en ga erna in het vakje “Key” staan waardoor je ziet “Press a key” en druk op →&lt;br /&gt;
* Ga naar “Add Controller” en voeg een “And” controller toe. Maak een link tussen de sensor en controller door de twee punten met elkaar te verbinden. Het moet er nu als volgt uit zien: &amp;lt;br&amp;gt; [[Bestand:Les1-keyboard-controller.png|700px|Keyboard sensor en controller]] &amp;lt;br&amp;gt; Wanneer we op de → toets drukken geeft dit een positief signaal aan de controller. De controller moet positieve signalen ontvangen van alle sensoren die verbonden zijn met deze controller om zelf een positief signaal door te kunnen geven. Dit is er nu maar 1. Wanneer alleen de toets → ingedrukt wordt geeft de controller dus een positief signaal.&lt;br /&gt;
*  Nu gaan we de controller verbinden aan een actie: lopen. Ga naar “Add Actuator” en voeg een “Motion” actuator toe. Geef deze ook de naam “Right” en een X loc waarde van -0.3. Druk ook op de L achter deze regel. Dit geeft aan dat we willen bewegen ten opzichte van de assen en niet ten opzichte van de locatie van Morsy zelf.  Maak een link tussen de controller en actuator. &amp;lt;br&amp;gt; [[Bestand:Les1-motion-actuator.png|700px|Add motion actuator]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Toevoegen van de vloer ====&lt;br /&gt;
Graag willen we nu weten of de robot naar rechts kan lopen. Als we nu in de “play” modus zouden gaan, zou de robot naar beneden vallen omdat we nog geen vloer hebben toegevoegd. Je zet Blender in de “play” modus door met de muis in het 3D view te staan en dan op ‘P’ te drukken. Je komt weer uit deze modus door op ‘Esc’ te drukken.&lt;br /&gt;
Voeg een vloer toe door in de header van de 3D view te klikken op “Add”, dan op “Mesh” en dan op “Plane”.&lt;br /&gt;
&lt;br /&gt;
[[Bestand:Les1-add-plane.png|350px|Add plane]]&lt;br /&gt;
   &lt;br /&gt;
Verschuif het vierkant onder Morsy door op de assen te klikken en de grond te verschuiven. Druk op “S” en gebruik de “Wheel” om de grond groter te maken.&lt;br /&gt;
Verander de kleur van de vloer door in het property venster te gaan naar:&lt;br /&gt;
&lt;br /&gt;
[[Bestand:Les1-plane-newmaterial.png|350px|Add new material]]&lt;br /&gt;
&lt;br /&gt;
en klik op “+ New”. Bij diffuse kun je een kleur uitkiezen.&lt;br /&gt;
Als het goed is ziet het 3D window er nu als volgt uit:&lt;br /&gt;
&lt;br /&gt;
[[Bestand:Les1-morsy-floor.png|700px|Morsy op het speelveld]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Druk nu op “P” en kijk of Morsy naar rechts beweegt bij het indrukken van de pijl naar rechts. Wanneer je dit getest hebt, druk weer op “Esc”. Wanneer Morsy niet naar rechts loopt, moet je stap 4 nogmaals doorlopen om te zien of je alles juist ingevoerd hebt.&lt;br /&gt;
* als Morsy naar links loopt, moet je het teken van de X-verplaatsing veranderen (bijv. van 0.2 naar -0.2);&lt;br /&gt;
* als Morse te snel of te langzaam loopt, moet je de verplaatsing kleiner of groter maken (bijv. van 0.4 naar 0.2);&lt;br /&gt;
* als er helemaal niets gebeurt, moet je controleren of je (i) de juiste toets ingevoerd hebt, in de Keyboard sensor; (ii) of je de verbinding tussen sensor en controller en controller en actuator gemaakt hebt;&lt;br /&gt;
&lt;br /&gt;
=== Stap 5: sturen naar links, achter en voor  ===&lt;br /&gt;
Zorg ervoor dat Morsy ook naar links, achter en naar voren kan lopen door middel van het toetsenbord.&lt;br /&gt;
&lt;br /&gt;
=== Stap 6: bestand opslaan voor vervolg ===&lt;br /&gt;
Sla het bestand op om volgende les mee verder te gaan.&lt;br /&gt;
&lt;br /&gt;
== Plusopdracht ==&lt;br /&gt;
Zorg ervoor dat de robot via het toetsenbord:&lt;br /&gt;
* Een rondje kan draaien om zijn eigen as met de toets ‘R’. Voor hulp zie: https://www.youtube.com/watch?v=Lpb8yCNgDQ8&lt;br /&gt;
* Kan springen bij wanneer de Spacebar en toets J ingedrukt zijn&lt;br /&gt;
* …&lt;br /&gt;
&lt;br /&gt;
== Referenties ==&lt;br /&gt;
&lt;br /&gt;
* [[../Blender installeren]]&lt;br /&gt;
* MORSE code, de Modular OpenRobots Simulation Engine. (https://www.openrobots.org/wiki/morse/)&lt;/div&gt;</summary>
		<author><name>Jacqueline</name></author>
	</entry>
	<entry>
		<id>https://infvo.nl/lab/index.php?title=Logistieke_Robots/les_2&amp;diff=468</id>
		<title>Logistieke Robots/les 2</title>
		<link rel="alternate" type="text/html" href="https://infvo.nl/lab/index.php?title=Logistieke_Robots/les_2&amp;diff=468"/>
		<updated>2014-12-17T16:46:53Z</updated>

		<summary type="html">&lt;p&gt;Jacqueline: /* Les 2 - Objecten zoeken en verplaatsen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Zijbalk Logistieke Robots}}&lt;br /&gt;
&lt;br /&gt;
== Les 2 - Objecten zoeken en verplaatsen ==&lt;br /&gt;
 &lt;br /&gt;
In dit project willen we robots toepassen in de logistieke sector. Wanneer robots actief zijn in de logistieke sector betekent dit vaak dat robots bepaalde objecten moeten zoeken, oppakken en naar een doel moeten brengen. Hoe we een robot moeten aansturen die dit kan gaan we zien in deze les. Het eindresultaat van deze les ziet er als volgt uit: https://www.youtube.com/watch?v=z22EOFDgOj4.&lt;br /&gt;
 &lt;br /&gt;
Voor deze les maken we gebruik van het bestand [https://googledrive.com/host/0B4Wf_Tca5KDuNnFUWTc4R09jblU/logistieke-robots/living_room.blend living_room.blend]. Wanneer je het bestand opent zie je een huiskamer en een aantal boeken die rondslingeren in de kamer. We willen dat de robot de boeken kan herkennen, er naar toe kan lopen, op kan pakken en in de boekenkast kan zetten. In paragraaf 1 zullen we de robot aansturen via het toetsenbord en in paragraaf 2 laten we de robot deze taak autonoom (=zelfstandig) uitvoeren.&lt;br /&gt;
&lt;br /&gt;
== Object naar het doel verplaatsten met het toetsenbord ==&lt;br /&gt;
Aan de hand van 5 stappen kunnen we de controller gaan maken. Zorg ervoor dat je eerst zelf nadenkt over de stappen die je uit moet voeren voordat je naar de print kijkt hoe de controller eruit moet zien.&lt;br /&gt;
 &lt;br /&gt;
=== Stap 1: Naar het boek lopen ===&lt;br /&gt;
Wanneer je op Morsy klikt, zie je in de logic editor dat er vier Keyboard sensors aangemaakt zijn. Hier kunnen we Morsy mee naar een boek laten lopen. Als je goed kijkt zie je ook dat er een Game Property aangemaakt is met de naam Morsy. Zo kunnen andere objecten Morsy herkennen. Waarom dit nodig is zien we later.&lt;br /&gt;
 &lt;br /&gt;
=== Stap 2: Boek vastpakken ===&lt;br /&gt;
Omdat Morsy geen armen heeft kan hij het boek niet vasthouden zoals wij dat zouden doen met onze handen. Morsy kan wel naar het boek lopen en wanneer hij contact heeft met het boek kun je je voorstellen dat het boek vast zit aan Morsy door middel van een magneet. Dit kunnen we als volgt doen:&lt;br /&gt;
Ga naar de controller van book_blue_ground en voeg een Collision sensor toe. Geef bij Property aan dat het om Morsy gaat.&lt;br /&gt;
Voeg een Parent actuator toe waarbij je bij Parent Object Morsy selecteert. Verbind de twee met elkaar. Er komt dan automatisch een And controller tussen.&lt;br /&gt;
Wanneer je nu in de spelmodus gaat (druk op P) en naar het blauwe boek loopt, zie je dat het blauwe boek vast blijft zitten aan Morsy. De controller ziet er als volgt uit: &lt;br /&gt;
&lt;br /&gt;
[[Bestand:Les2-book-controller.png|700px]]&lt;br /&gt;
&lt;br /&gt;
=== Stap 3: Naar het doel lopen ===&lt;br /&gt;
Het doel, de kast waar de drie dezelfde boeken wel in de kast staan, kan bereikt worden door middel van het toetsenbord.&lt;br /&gt;
Wanneer Morsy met het boek bij de kast is wil je dat het boek in de kast komt te staan. Het visualiseren van deze actie is niet een van de leerdoelen van dit project. Uiteraard mag je Morsy voorzien van een grijparm en visualiseren hoe Morsy het boek in de kast zet maar dit zal veel tijd in beslag nemen. Daarom gebruiken we een eenvoudiger methode.&lt;br /&gt;
 &lt;br /&gt;
=== Stap 4: Boek in de kast plaatsen ===&lt;br /&gt;
Wanneer Morsy de kast bereikt met een boek, wil je dat dit boek verdwijnt en dat het boek in de kast zichtbaar wordt. Voordat Morsy kan herkennen of er aanraking plaatsvindt met de kast, moet de kast een Game Property hebben.&lt;br /&gt;
&lt;br /&gt;
==== Voeg kast-game property &amp;quot;Goal&amp;quot; toe ====&lt;br /&gt;
Selecteer de kast en voeg een ‘String’ Game Property toe aan de kast met de naam ‘Goal’:&lt;br /&gt;
[[Bestand:Les2-stap4-goal.png|700px|Add property: Goal]]&lt;br /&gt;
&lt;br /&gt;
==== Voeg Morsy-sensoren en actuatoren toe ====&lt;br /&gt;
&lt;br /&gt;
Selecteer nu weer Morsy en voeg een Collision sensor toe en twee Message actuatoren naar het blauwe boek op de grond en in de kast met als Subject ‘Done’: &lt;br /&gt;
[[Bestand:Les2-stap4-done.png|700px|Add message actuators: Done]]&lt;br /&gt;
&lt;br /&gt;
==== Boek op de grond wordt opgepakt (onzichtbaar) ====&lt;br /&gt;
Zorg ervoor dat het blauwe boek op de grond het bericht kan ontvangen en hierna onzichtbaar wordt: &lt;br /&gt;
[[Bestand:Les2-stap4-book.png|700px|Boek wordt onzichtbaar]]&lt;br /&gt;
&lt;br /&gt;
==== Boek in de kast wordt zichtbaar ====&lt;br /&gt;
Zorg er ook voor dat het boek in de kast vanaf het begin onzichtbaar is &lt;br /&gt;
totdat deze het bericht ‘Done’ krijgt van Morsy. Neem zelf even de tijd om te bedenken hoe dit moet. &lt;br /&gt;
[[Bestand:Les2-stap4-shelf.png|700px|Boek wordt in kast zichtbaar]]&lt;br /&gt;
&lt;br /&gt;
=== Uiteindelijk resultaat ===&lt;br /&gt;
Het kan er uiteindelijk als volgt uit zien:  &lt;br /&gt;
&lt;br /&gt;
[[Bestand:Les2-stap5-afronden.png|500px|Morsy verplaatst het boek]]&lt;br /&gt;
Voor hulp zie: https://www.youtube.com/watch?v=nEgubbYwRy0&lt;br /&gt;
&lt;br /&gt;
Wanneer je zelf andere sensoren en actuatoren gebruikt die hetzelfde resultaat als gevolg hebben, mag dit ook.&lt;br /&gt;
&lt;br /&gt;
== Object herkennen met een radar ==&lt;br /&gt;
&lt;br /&gt;
In deze paragraaf leren we hoe Morsy zelf naar de boeken kan lopen zonder aansturing via het toetsenbord. &lt;br /&gt;
Hiervoor moet Morsy tussen verschillende States (toestanden) kunnen schakelen. Morsy moet eerst de kamer afzoeken naar de boeken. Wanneer Morsy een boek gevonden heeft moet hij hier naartoe lopen en erna mogelijk weer verder zoeken om vervolgens de boeken bij de kast af te leveren.&lt;br /&gt;
&lt;br /&gt;
We gebruiken de volgende toestanden (states):&lt;br /&gt;
* 1: zoeken naar boek 1 (met een radar-sensor), bewegen naar het boek, en oppakken van het boek&lt;br /&gt;
* 2: oppakken van boek 1 en in de kast plaatsen&lt;br /&gt;
* 3: zoeken naar boek 2&lt;br /&gt;
* 4: oppakken van boek 4 &lt;br /&gt;
* 5: loop naar de kast en plaats de boeken daarin   &lt;br /&gt;
&lt;br /&gt;
=== Stap 1: Opzetten ===&lt;br /&gt;
In de vorige paragraaf konden wij de boeken zien liggen en Morsy erheen sturen via het toetsenbord. Nu willen we dat Morsy zelf de boeken kan vinden. Geef de boeken die op de grond liggen de Game Property ‘book_1’ en ‘book_2’ en verwijder alle sensorsen en actuators van Morsy.&lt;br /&gt;
&lt;br /&gt;
=== Stap 2: Boeken detecteren ===&lt;br /&gt;
We gaan Morsy voorzien van verschillende Radars die de boeken kunnen detecteren. We voegen eerst een radar toe voor &amp;lt;code&amp;gt;book_1&amp;lt;/code&amp;gt;&lt;br /&gt;
* Om de boeken te kunnen zien met de Radars moet Morsy rondjes draaien. Voeg een Always sensor toe die een Motion actuator activeert waarbij je 2 graden om de Z as beweegt. &lt;br /&gt;
** controleer of deze werkt;&lt;br /&gt;
* Voeg een Radar sensor toe met Property &amp;lt;code&amp;gt;book_1&amp;lt;/code&amp;gt;, over de –X as (&amp;lt;code&amp;gt;-X axis&amp;lt;/code&amp;gt;), een hoek (&amp;lt;code&amp;gt;Angle&amp;lt;/code&amp;gt;) van 50 graden en een afstand (&amp;lt;code&amp;gt;Distance&amp;lt;/code&amp;gt;) van 8 meter. &lt;br /&gt;
** Om de radar te kunnen zien in de 3D view, kun je in de info window van Blender drukken op &amp;lt;code&amp;gt;Game &amp;gt; Show Physics Visualization&amp;lt;/code&amp;gt;. Wanneer je nu naar de spel modus gaat kun je de radar zien.  Je kunt de Physics Visualization hierna weer uitzetten.&lt;br /&gt;
&lt;br /&gt;
=== Stap 3: Boeken ophalen in verschillende states ===&lt;br /&gt;
* Voeg aan Morsy een Integer Game Property toe genaamd ‘number’. Dit is het aantal boeken dat Morsy opgepakt heeft. We laten Morsy de boeken in een speciale volgorde ophalen. Dit is nodig wanneer je met de logic bricks werkt. In de volgende les zien we dat het met Python sneller kan. Wanneer de radar het boek ziet met property &amp;lt;code&amp;gt;book_1&amp;lt;/code&amp;gt; en deze moet ophalen (property number is dan nog 0) gaat Morsy naar state 2. De controller ziet er nu als volgt uit: &amp;lt;br&amp;gt; [[Bestand:Les2-state1.png|700px|Controller state 1]]&lt;br /&gt;
&lt;br /&gt;
Nu moeten we een invulling gaan geven aan de controller in state 2.&lt;br /&gt;
* Druk op het plusje links naast de Controller bar. En ga naar state 2. Initial geeft aan in welke state je begint. &amp;lt;br&amp;gt; In deze state wil je dat Morsy naar een bepaald boek loopt. In dit geval het boek met property book_1. Dit kan met een Steering actuator. Je kan variëren met de snelheid en afstand om het ophalen zo natuurlijk mogelijk te laten verlopen.&lt;br /&gt;
* Wanneer Morsy het boek bereikt heeft moeten er een aantal dingen gebeuren. &lt;br /&gt;
** Morsy moet laten weten aan het boek dat het zich vast moet klampen aan de robot.&lt;br /&gt;
** Vervolgens gaat de number property 1 omhoog zodat Morsy op zoek kan naar het volgende boek wanneer hij teruggezet wordt naar state 1. De controller ziet er nu als volgt uit: &amp;lt;br&amp;gt; [[Bestand:Les2-state2.png|700px|Controller state 2]]  &lt;br /&gt;
* Wanneer we een bericht sturen naar het boek, moeten we de controller van het boek wel aanpassen. De Collision sensor van het boek veranderen we in een Message sensor op de volgende manier: &amp;lt;br&amp;gt;  [[Bestand:Voorbeeld.png]]&lt;br /&gt;
&lt;br /&gt;
Herhaal deze procedure voor boek 2 en 3 (gebruik states 3 en 4 hiervoor). Wanneer Morsy alle boeken gevonden heeft, zal de number property op 3 staan en moet Morsy terug naar de kast. Het lopen naar de kast kan gezien worden als state 5. Voeg in state 1 een property sensor toe. Als deze gelijk is aan 3, zet Morsy dan in state 5.&lt;br /&gt;
&lt;br /&gt;
In state 5 moet je altijd sturen naar de kast. Als je hier bent stuur je een Done message naar alle boeken. Zet Morsy vervolgens in state 6: een lege state. State 5 ziet er als volgt uit:&lt;br /&gt;
[[Bestand:Voorbeeld.png]]&lt;br /&gt;
&lt;br /&gt;
voor hulp zie: https://www.youtube.com/watch?v=s3YjWyM_QWs&lt;br /&gt;
&lt;br /&gt;
== Plusopdracht ==&lt;br /&gt;
Het is je vast al opgevallen dat het best lastig is om van een toetsenbord controller naar een autonome controller te gaan. In de plusopdracht verbeter je twee aspecten:&lt;br /&gt;
# Wanneer de radar afstand van Morsy kleiner is, moet Morsy naast alleen draaien ook gaan wandelen om de boeken te kunnen detecteren. &lt;br /&gt;
# Met een toetsenbord kun je makkelijker om een obstakel heen navigeren. Nu zal Morsy tegen alles opbotsen wat tussen hem en het doel instaat. Zorg ervoor dat Morsy om obstakels heen kan lopen.&lt;br /&gt;
Als je even niet meer wilt programmeren kun je ook gaan werken met de camera&#039;s&lt;br /&gt;
# Probeer de kamer vanuit Morsy te bekijken. Voor hulp zie: https://www.youtube.com/watch?v=Rmeq85kt8zE&lt;/div&gt;</summary>
		<author><name>Jacqueline</name></author>
	</entry>
	<entry>
		<id>https://infvo.nl/lab/index.php?title=Logistieke_Robots/les_2&amp;diff=467</id>
		<title>Logistieke Robots/les 2</title>
		<link rel="alternate" type="text/html" href="https://infvo.nl/lab/index.php?title=Logistieke_Robots/les_2&amp;diff=467"/>
		<updated>2014-12-17T16:46:13Z</updated>

		<summary type="html">&lt;p&gt;Jacqueline: /* Stap 3: Boeken ophalen in verschillende states */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Zijbalk Logistieke Robots}}&lt;br /&gt;
&lt;br /&gt;
== Les 2 - Objecten zoeken en verplaatsen ==&lt;br /&gt;
 &lt;br /&gt;
In dit project willen we robots toepassen in de logistieke sector. Wanneer robots actief zijn in de logistieke sector betekent dit vaak dat robots bepaalde objecten moeten zoeken, oppakken en naar een doel moeten brengen. Hoe we een robot moeten aansturen die dit kan gaan we zien in deze les.&lt;br /&gt;
 &lt;br /&gt;
Voor deze les maken we gebruik van het bestand [https://googledrive.com/host/0B4Wf_Tca5KDuNnFUWTc4R09jblU/logistieke-robots/living_room.blend living_room.blend]. Wanneer je het bestand opent zie je een huiskamer en een aantal boeken die rondslingeren in de kamer. We willen dat de robot de boeken kan herkennen, er naar toe kan lopen, op kan pakken en in de boekenkast kan zetten. In paragraaf 1 zullen we de robot aansturen via het toetsenbord en in paragraaf 2 laten we de robot deze taak autonoom (=zelfstandig) uitvoeren.&lt;br /&gt;
&lt;br /&gt;
== Object naar het doel verplaatsten met het toetsenbord ==&lt;br /&gt;
Aan de hand van 5 stappen kunnen we de controller gaan maken. Zorg ervoor dat je eerst zelf nadenkt over de stappen die je uit moet voeren voordat je naar de print kijkt hoe de controller eruit moet zien.&lt;br /&gt;
 &lt;br /&gt;
=== Stap 1: Naar het boek lopen ===&lt;br /&gt;
Wanneer je op Morsy klikt, zie je in de logic editor dat er vier Keyboard sensors aangemaakt zijn. Hier kunnen we Morsy mee naar een boek laten lopen. Als je goed kijkt zie je ook dat er een Game Property aangemaakt is met de naam Morsy. Zo kunnen andere objecten Morsy herkennen. Waarom dit nodig is zien we later.&lt;br /&gt;
 &lt;br /&gt;
=== Stap 2: Boek vastpakken ===&lt;br /&gt;
Omdat Morsy geen armen heeft kan hij het boek niet vasthouden zoals wij dat zouden doen met onze handen. Morsy kan wel naar het boek lopen en wanneer hij contact heeft met het boek kun je je voorstellen dat het boek vast zit aan Morsy door middel van een magneet. Dit kunnen we als volgt doen:&lt;br /&gt;
Ga naar de controller van book_blue_ground en voeg een Collision sensor toe. Geef bij Property aan dat het om Morsy gaat.&lt;br /&gt;
Voeg een Parent actuator toe waarbij je bij Parent Object Morsy selecteert. Verbind de twee met elkaar. Er komt dan automatisch een And controller tussen.&lt;br /&gt;
Wanneer je nu in de spelmodus gaat (druk op P) en naar het blauwe boek loopt, zie je dat het blauwe boek vast blijft zitten aan Morsy. De controller ziet er als volgt uit: &lt;br /&gt;
&lt;br /&gt;
[[Bestand:Les2-book-controller.png|700px]]&lt;br /&gt;
&lt;br /&gt;
=== Stap 3: Naar het doel lopen ===&lt;br /&gt;
Het doel, de kast waar de drie dezelfde boeken wel in de kast staan, kan bereikt worden door middel van het toetsenbord.&lt;br /&gt;
Wanneer Morsy met het boek bij de kast is wil je dat het boek in de kast komt te staan. Het visualiseren van deze actie is niet een van de leerdoelen van dit project. Uiteraard mag je Morsy voorzien van een grijparm en visualiseren hoe Morsy het boek in de kast zet maar dit zal veel tijd in beslag nemen. Daarom gebruiken we een eenvoudiger methode.&lt;br /&gt;
 &lt;br /&gt;
=== Stap 4: Boek in de kast plaatsen ===&lt;br /&gt;
Wanneer Morsy de kast bereikt met een boek, wil je dat dit boek verdwijnt en dat het boek in de kast zichtbaar wordt. Voordat Morsy kan herkennen of er aanraking plaatsvindt met de kast, moet de kast een Game Property hebben.&lt;br /&gt;
&lt;br /&gt;
==== Voeg kast-game property &amp;quot;Goal&amp;quot; toe ====&lt;br /&gt;
Selecteer de kast en voeg een ‘String’ Game Property toe aan de kast met de naam ‘Goal’:&lt;br /&gt;
[[Bestand:Les2-stap4-goal.png|700px|Add property: Goal]]&lt;br /&gt;
&lt;br /&gt;
==== Voeg Morsy-sensoren en actuatoren toe ====&lt;br /&gt;
&lt;br /&gt;
Selecteer nu weer Morsy en voeg een Collision sensor toe en twee Message actuatoren naar het blauwe boek op de grond en in de kast met als Subject ‘Done’: &lt;br /&gt;
[[Bestand:Les2-stap4-done.png|700px|Add message actuators: Done]]&lt;br /&gt;
&lt;br /&gt;
==== Boek op de grond wordt opgepakt (onzichtbaar) ====&lt;br /&gt;
Zorg ervoor dat het blauwe boek op de grond het bericht kan ontvangen en hierna onzichtbaar wordt: &lt;br /&gt;
[[Bestand:Les2-stap4-book.png|700px|Boek wordt onzichtbaar]]&lt;br /&gt;
&lt;br /&gt;
==== Boek in de kast wordt zichtbaar ====&lt;br /&gt;
Zorg er ook voor dat het boek in de kast vanaf het begin onzichtbaar is &lt;br /&gt;
totdat deze het bericht ‘Done’ krijgt van Morsy. Neem zelf even de tijd om te bedenken hoe dit moet. &lt;br /&gt;
[[Bestand:Les2-stap4-shelf.png|700px|Boek wordt in kast zichtbaar]]&lt;br /&gt;
&lt;br /&gt;
=== Uiteindelijk resultaat ===&lt;br /&gt;
Het kan er uiteindelijk als volgt uit zien:  &lt;br /&gt;
&lt;br /&gt;
[[Bestand:Les2-stap5-afronden.png|500px|Morsy verplaatst het boek]]&lt;br /&gt;
Voor hulp zie: https://www.youtube.com/watch?v=nEgubbYwRy0&lt;br /&gt;
&lt;br /&gt;
Wanneer je zelf andere sensoren en actuatoren gebruikt die hetzelfde resultaat als gevolg hebben, mag dit ook.&lt;br /&gt;
&lt;br /&gt;
== Object herkennen met een radar ==&lt;br /&gt;
&lt;br /&gt;
In deze paragraaf leren we hoe Morsy zelf naar de boeken kan lopen zonder aansturing via het toetsenbord. &lt;br /&gt;
Hiervoor moet Morsy tussen verschillende States (toestanden) kunnen schakelen. Morsy moet eerst de kamer afzoeken naar de boeken. Wanneer Morsy een boek gevonden heeft moet hij hier naartoe lopen en erna mogelijk weer verder zoeken om vervolgens de boeken bij de kast af te leveren.&lt;br /&gt;
&lt;br /&gt;
We gebruiken de volgende toestanden (states):&lt;br /&gt;
* 1: zoeken naar boek 1 (met een radar-sensor), bewegen naar het boek, en oppakken van het boek&lt;br /&gt;
* 2: oppakken van boek 1 en in de kast plaatsen&lt;br /&gt;
* 3: zoeken naar boek 2&lt;br /&gt;
* 4: oppakken van boek 4 &lt;br /&gt;
* 5: loop naar de kast en plaats de boeken daarin   &lt;br /&gt;
&lt;br /&gt;
=== Stap 1: Opzetten ===&lt;br /&gt;
In de vorige paragraaf konden wij de boeken zien liggen en Morsy erheen sturen via het toetsenbord. Nu willen we dat Morsy zelf de boeken kan vinden. Geef de boeken die op de grond liggen de Game Property ‘book_1’ en ‘book_2’ en verwijder alle sensorsen en actuators van Morsy.&lt;br /&gt;
&lt;br /&gt;
=== Stap 2: Boeken detecteren ===&lt;br /&gt;
We gaan Morsy voorzien van verschillende Radars die de boeken kunnen detecteren. We voegen eerst een radar toe voor &amp;lt;code&amp;gt;book_1&amp;lt;/code&amp;gt;&lt;br /&gt;
* Om de boeken te kunnen zien met de Radars moet Morsy rondjes draaien. Voeg een Always sensor toe die een Motion actuator activeert waarbij je 2 graden om de Z as beweegt. &lt;br /&gt;
** controleer of deze werkt;&lt;br /&gt;
* Voeg een Radar sensor toe met Property &amp;lt;code&amp;gt;book_1&amp;lt;/code&amp;gt;, over de –X as (&amp;lt;code&amp;gt;-X axis&amp;lt;/code&amp;gt;), een hoek (&amp;lt;code&amp;gt;Angle&amp;lt;/code&amp;gt;) van 50 graden en een afstand (&amp;lt;code&amp;gt;Distance&amp;lt;/code&amp;gt;) van 8 meter. &lt;br /&gt;
** Om de radar te kunnen zien in de 3D view, kun je in de info window van Blender drukken op &amp;lt;code&amp;gt;Game &amp;gt; Show Physics Visualization&amp;lt;/code&amp;gt;. Wanneer je nu naar de spel modus gaat kun je de radar zien.  Je kunt de Physics Visualization hierna weer uitzetten.&lt;br /&gt;
&lt;br /&gt;
=== Stap 3: Boeken ophalen in verschillende states ===&lt;br /&gt;
* Voeg aan Morsy een Integer Game Property toe genaamd ‘number’. Dit is het aantal boeken dat Morsy opgepakt heeft. We laten Morsy de boeken in een speciale volgorde ophalen. Dit is nodig wanneer je met de logic bricks werkt. In de volgende les zien we dat het met Python sneller kan. Wanneer de radar het boek ziet met property &amp;lt;code&amp;gt;book_1&amp;lt;/code&amp;gt; en deze moet ophalen (property number is dan nog 0) gaat Morsy naar state 2. De controller ziet er nu als volgt uit: &amp;lt;br&amp;gt; [[Bestand:Les2-state1.png|700px|Controller state 1]]&lt;br /&gt;
&lt;br /&gt;
Nu moeten we een invulling gaan geven aan de controller in state 2.&lt;br /&gt;
* Druk op het plusje links naast de Controller bar. En ga naar state 2. Initial geeft aan in welke state je begint. &amp;lt;br&amp;gt; In deze state wil je dat Morsy naar een bepaald boek loopt. In dit geval het boek met property book_1. Dit kan met een Steering actuator. Je kan variëren met de snelheid en afstand om het ophalen zo natuurlijk mogelijk te laten verlopen.&lt;br /&gt;
* Wanneer Morsy het boek bereikt heeft moeten er een aantal dingen gebeuren. &lt;br /&gt;
** Morsy moet laten weten aan het boek dat het zich vast moet klampen aan de robot.&lt;br /&gt;
** Vervolgens gaat de number property 1 omhoog zodat Morsy op zoek kan naar het volgende boek wanneer hij teruggezet wordt naar state 1. De controller ziet er nu als volgt uit: &amp;lt;br&amp;gt; [[Bestand:Les2-state2.png|700px|Controller state 2]]  &lt;br /&gt;
* Wanneer we een bericht sturen naar het boek, moeten we de controller van het boek wel aanpassen. De Collision sensor van het boek veranderen we in een Message sensor op de volgende manier: &amp;lt;br&amp;gt;  [[Bestand:Voorbeeld.png]]&lt;br /&gt;
&lt;br /&gt;
Herhaal deze procedure voor boek 2 en 3 (gebruik states 3 en 4 hiervoor). Wanneer Morsy alle boeken gevonden heeft, zal de number property op 3 staan en moet Morsy terug naar de kast. Het lopen naar de kast kan gezien worden als state 5. Voeg in state 1 een property sensor toe. Als deze gelijk is aan 3, zet Morsy dan in state 5.&lt;br /&gt;
&lt;br /&gt;
In state 5 moet je altijd sturen naar de kast. Als je hier bent stuur je een Done message naar alle boeken. Zet Morsy vervolgens in state 6: een lege state. State 5 ziet er als volgt uit:&lt;br /&gt;
[[Bestand:Voorbeeld.png]]&lt;br /&gt;
&lt;br /&gt;
voor hulp zie: https://www.youtube.com/watch?v=s3YjWyM_QWs&lt;br /&gt;
&lt;br /&gt;
== Plusopdracht ==&lt;br /&gt;
Het is je vast al opgevallen dat het best lastig is om van een toetsenbord controller naar een autonome controller te gaan. In de plusopdracht verbeter je twee aspecten:&lt;br /&gt;
# Wanneer de radar afstand van Morsy kleiner is, moet Morsy naast alleen draaien ook gaan wandelen om de boeken te kunnen detecteren. &lt;br /&gt;
# Met een toetsenbord kun je makkelijker om een obstakel heen navigeren. Nu zal Morsy tegen alles opbotsen wat tussen hem en het doel instaat. Zorg ervoor dat Morsy om obstakels heen kan lopen.&lt;br /&gt;
Als je even niet meer wilt programmeren kun je ook gaan werken met de camera&#039;s&lt;br /&gt;
# Probeer de kamer vanuit Morsy te bekijken. Voor hulp zie: https://www.youtube.com/watch?v=Rmeq85kt8zE&lt;/div&gt;</summary>
		<author><name>Jacqueline</name></author>
	</entry>
	<entry>
		<id>https://infvo.nl/lab/index.php?title=Logistieke_Robots/les_3&amp;diff=466</id>
		<title>Logistieke Robots/les 3</title>
		<link rel="alternate" type="text/html" href="https://infvo.nl/lab/index.php?title=Logistieke_Robots/les_3&amp;diff=466"/>
		<updated>2014-12-17T16:12:07Z</updated>

		<summary type="html">&lt;p&gt;Jacqueline: /* Morsy besturen met Python */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Zijbalk Logistieke Robots}}&lt;br /&gt;
&lt;br /&gt;
== Morsy besturen met Python ==&lt;br /&gt;
In de vorige les hebben we gezien dat de controller van Morsy veel complexer wordt als we hem autonoom aan willen sturen. Wanneer we Morsy nog meer taken willen geven, en wanneer we Morsy in een groep willen laten werken, zijn de logic bricks niet meer toereikend. Daarom gaan we Blender combineren met de programmeertaal Python. Het eindresultaat van deze les is: https://www.youtube.com/watch?v=-TvRNqFqew8.&lt;br /&gt;
&lt;br /&gt;
Controleer eerst of de juiste versie van Python op je systeem geïnstalleerd is, op de juiste plaats. (Zie: [[../Python installeren|Python installeren]] voor verdere aanwijzingen.) In sommige gevallen is Python geïnstalleerd als onderdeel van Blender.&lt;br /&gt;
&lt;br /&gt;
== Blender combineren met programmeertaal Python ==&lt;br /&gt;
In deze les gebruiken we [https://googledrive.com/host/0B4Wf_Tca5KDuNnFUWTc4R09jblU/logistieke-robots/warehouse.blend warehouse.blend]. Deze omgeving zullen we gedurende de rest van het project gebruiken. Het openen van het bestand gaat nu anders omdat we de Python output willen zien. Dit is verschillend voor de Windows en voor de OS X versie van Blender.&lt;br /&gt;
&lt;br /&gt;
=== OS X: Blender opstarten met Terminal ===&lt;br /&gt;
&lt;br /&gt;
Ga naar de Blender applicatie en open de Package Contents van Blender.&lt;br /&gt;
&lt;br /&gt;
[[Bestand:osx-show-package.png|350px|Show Package contents]]&lt;br /&gt;
&lt;br /&gt;
Open vervolgens het blender executable bestand via het openen van de volgende folders: &amp;lt;code&amp;gt;Contents &amp;gt; MacOS &amp;gt; blender &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bestand:osx-blender-terminal.png|700px|Blender starten met terminal]]&lt;br /&gt;
&lt;br /&gt;
Als Blender opstart, kun je via &amp;lt;code&amp;gt;File&amp;gt;Open&amp;lt;/code&amp;gt; het bestand “warehouse.blend” openen.&lt;br /&gt;
&lt;br /&gt;
=== Windows: ===&lt;br /&gt;
&lt;br /&gt;
Open Blender op de gebruikelijke manier. Ga naar de Info Window en klik op &amp;lt;code&amp;gt;Window &amp;gt;Toggle System Console&amp;lt;/code&amp;gt;. Er is nu een extra scherm in beeld.&lt;br /&gt;
&lt;br /&gt;
Wanneer je de file “warehouse.blend” geopend hebt, zie je in het window linksonder een Tekst Editor. Hier kun je een Python controller ontwikkelen.&lt;br /&gt;
&lt;br /&gt;
=== Controleren of Python werkt in Blender ===&lt;br /&gt;
&lt;br /&gt;
Om te testen of de link tussen Blender en Python werkt, voeren we de volgende stappen uit:&lt;br /&gt;
# Voeg aan Robot_11 (de voorste) een Always sensor toe.&lt;br /&gt;
# Maak een nieuw Python script aan:&lt;br /&gt;
## klik op de &amp;quot;+&amp;quot; onderin het Text Editor venster (naast de naam van het bestand).&lt;br /&gt;
## verander de naam van het bestand in &amp;quot;Text.py&amp;quot;&lt;br /&gt;
## typ in de Text Editor:      &amp;lt;code&amp;gt;print(“Hello”)&amp;lt;/code&amp;gt;&lt;br /&gt;
# Voeg aan Robot_11 een Python controller: &amp;lt;br&amp;gt; [[Bestand:Les3-robot11-python-controller.png|350px|Voeg Python controller toe]]&lt;br /&gt;
# Selecteer als script voor deze Python-controller: &amp;quot;Text.py&amp;quot;&lt;br /&gt;
# Link de controller met de sensor: &amp;lt;br&amp;gt; [[Bestand:Les3-robot11-sensor-controller.png|700px|Link sensor en controller]]&lt;br /&gt;
# Ga na de spel modus (of, voor OS X, naar de Terminal) en kijk naar de console. Dit moet er nu in de console te zien zijn: &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Blender Game Engine Started&lt;br /&gt;
Hello&lt;br /&gt;
Blender Game Engine Finished&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voor hulp zie: https://www.youtube.com/watch?v=9dRd-pU2dKQ&lt;br /&gt;
&lt;br /&gt;
== Ontwikkelen van een controller in Python ==&lt;br /&gt;
 &lt;br /&gt;
Nu je weet hoe je Python aan Blender moet koppelen, kunnen we een Python controller maken. We gaan Morsy, nu genaamd Robot_11, naar een kast laten lopen om een artikel op te halen en in de box te zetten op tafel. Voordat we hieraan kunnen beginnen moeten we begrijpen hoe je sensoren kunt opvangen en actuatoren kunt aansturen via een Python controller.&lt;br /&gt;
&lt;br /&gt;
=== Morsy laten lopen door een Python controller ===&lt;br /&gt;
&lt;br /&gt;
Wat je in deze paragraaf gaat leren lijkt op wat je geleerd hebt in les 2, het autonoom laten ophalen van objecten en naar een bepaald doel brengen, maar nu doen we dat via een Python controller.&lt;br /&gt;
&lt;br /&gt;
==== Stap 1: Onderdelen van een script ====&lt;br /&gt;
Blender heeft al een opzet voor hoe je een robot moet aansturen. Ga in de Tekst editor window naar &amp;lt;code&amp;gt;Templates &amp;gt; Python&amp;gt; GameLogic Simple&amp;lt;/code&amp;gt;. Je ziet nu de volgende code verschijnen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot; line&amp;gt;&lt;br /&gt;
import bge&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
&lt;br /&gt;
    cont = bge.logic.getCurrentController()&lt;br /&gt;
    own = cont.owner&lt;br /&gt;
&lt;br /&gt;
    sens = cont.sensors[&#039;mySensor&#039;]&lt;br /&gt;
    actu = cont.actuators[&#039;myActuator&#039;]&lt;br /&gt;
&lt;br /&gt;
    if sens.positive:&lt;br /&gt;
        cont.activate(actu)&lt;br /&gt;
    else:&lt;br /&gt;
        cont.deactivate(actu)&lt;br /&gt;
&lt;br /&gt;
main()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dit heet een script. Dit script bestaat uit verschillende onderdelen.&lt;br /&gt;
* (r. 1) &amp;lt;code&amp;gt;import bge&amp;lt;/code&amp;gt; importeert de Blender Game Engine module voor Python. In deze module is onder andere de functie &amp;lt;code&amp;gt;logic.getCurrentController()&amp;lt;/code&amp;gt; gedefinieerd.&lt;br /&gt;
* (r. 4-15) De definitie van de functie &amp;lt;code&amp;gt;main()&amp;lt;/code&amp;gt;; &lt;br /&gt;
* (r. 17) Een aanroep van de functie &amp;lt;code&amp;gt;main()&amp;lt;/code&amp;gt;: de opdrachten in de definitie daarvan worden uitgevoerd.&lt;br /&gt;
&lt;br /&gt;
Het is belangrijk om te begrijpen hoe een script werkt. Wanneer deze controller geactiveerd wordt (bijvoorbeeld door een sensor), wordt het script uitgevoerd, en gebeurt er het volgende:&lt;br /&gt;
# &amp;lt;code&amp;gt;import bge&amp;lt;/code&amp;gt;    - Het script importeert de module ‘bge’ en beschikt zo over alle gedefinieerde functies in de bge module.&lt;br /&gt;
# &amp;lt;code&amp;gt;def main():&amp;lt;/code&amp;gt;    - definieert de functie main met de daarop volgende opdrachten. &lt;br /&gt;
# &amp;lt;code&amp;gt;main() &amp;lt;/code&amp;gt;  - aanroep van de functie main. De opdrachten in de definitie (“body”) van de functie main worden uitgevoerd.&lt;br /&gt;
&lt;br /&gt;
=== Stap 2: Sensoren en actuatoren toevoegen ===&lt;br /&gt;
Als we op ENTER (ofwel Return) drukken willen we dat Morsy naar de voorste kast gaat lopen. Ga door de volgende stappen heen om de juiste sensors en actuators toe te voegen:&lt;br /&gt;
# Verander de Always sensor in een Keyboard sensor met als Key de ENTER knop. Geef deze sensor de naam ‘Start’ &lt;br /&gt;
# Voeg een Steering actuator toe. Laat deze de naam ‘Steering’ houden en over de –X as bewegen.&lt;br /&gt;
# Voeg een Collission sensor genaamd ‘AtTarget’ toe link deze aan de Python controller.&lt;br /&gt;
Dit zijn alle actuators en sensors die we nodig hebben om de genoemde taak uit te voeren.&lt;br /&gt;
&lt;br /&gt;
=== Stap 3: Triggers ontvangen en versturen door de Python controller ===&lt;br /&gt;
In de vorige lessen hadden we een sensor, bijvoorbeeld een Keyboard sensor, aan een And controller gekoppeld. Wanneer je de juiste toets aanraakt op je toetsenbord gaat er een positieve ‘trigger’ naar de And controller die de bijbehorende actuator activeert.&lt;br /&gt;
&lt;br /&gt;
Nu moeten we de Start trigger op zien te vangen in de Python controller. Doe dit als volgt:&lt;br /&gt;
&lt;br /&gt;
* Het script moet de &#039;&#039;controller&#039;&#039; kunnen aanroepen waar de sensoren en actuatoren aan gekoppeld zijn. Dit kan door de functie &amp;lt;code&amp;gt;bge.logic.getCurrentController()&amp;lt;/code&amp;gt;&lt;br /&gt;
* Vervolgens moet de controller kunnen herkennen welke van de inkomende sensoren een trigger geeft om een juiste actuator aan te roepen. Je kunt deze sensoren vinden via &amp;lt;code&amp;gt;cont.sensors[“Start”]&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;cont.sensors[“AtTarget”]&amp;lt;/code&amp;gt;&lt;br /&gt;
Om de  code overzichtelijk te houden kun je verwijzingen maken naar de sensoren en actuatoren. Je mag deze namen zelf verzinnen of de volgende gebruiken:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
import bge&lt;br /&gt;
cont = bge.logic.getCurrentController()&lt;br /&gt;
start = cont.sensors[“Start”]&lt;br /&gt;
collision = cont.sensors[“AtTarget”]&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
  # define function main…&lt;br /&gt;
&lt;br /&gt;
main()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*  Bij het indrukken van de ENTER key, willen we dat Morsy zijn taak uit gaat voeren. Zowel het indrukken als het loslaten van de ENTER key geeft een trigger aan de controller. Het indrukken is een positive pulse en loslaten een negative pulse. Via een boolean (met waarde TRUE of FALSE) wordt aangegeven of er een pulse gegeven wordt. We willen dat de main() alleen aangeroepen wordt als start.positive TRUE is. Omdat start.positive een boolean is kun je dit als volgt opschrijven:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
if start.positive&lt;br /&gt;
    main()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
(Let op: een Tab in Python staat gelijk aan 4 spaties en is nodig om aan te geven wat er moet gebeuren als de conditie van de if &amp;lt;code&amp;gt;TRUE&amp;lt;/code&amp;gt; is)&lt;br /&gt;
* Zorg ervoor dat in de definitie van de functie &amp;lt;code&amp;gt;main() &amp;lt;/code&amp;gt; de Steering actuator geactiveerd wordt en naar Shelf_8 toe gaat (de voorste kast). De code ziet er nu als volgt uit:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
import bge&lt;br /&gt;
&lt;br /&gt;
cont = bge.logic.getCurrentController()&lt;br /&gt;
start = cont.sensors[“Start”]&lt;br /&gt;
collision = cont.sensors[“AtTarget”]&lt;br /&gt;
steering - cont.actuators[“Steering”]&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    steering.target = “Shelf_8”&lt;br /&gt;
    cont.activate(steering)&lt;br /&gt;
&lt;br /&gt;
if start.positive:&lt;br /&gt;
    main()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Stap 4: Script afmaken ===&lt;br /&gt;
Wanneer je nu in de play modus gaat en op ENTER drukt zie je dat Morsy naar Shelf_8 gaat lopen.&lt;br /&gt;
&lt;br /&gt;
In deze stap ga je zelf uitzoeken hoe  Morsy heen en weer loopt naar de kast. Het is geen vereiste meer dat de ENTER key voor de start zorgt. Morsy mag gelijk van start gaan in de play modus. Denk zelf na hoe je dit moet doen.&lt;br /&gt;
&lt;br /&gt;
Tips: je moet een Game Property aanmaken voor Desk_11, Shelf_8 en een voor Robot_11 om aan te geven waar hij heen moet lopen. Deze kun je aanroepen en veranderen via de variabele &amp;lt;code&amp;gt;cont.owner[“naam van game propery”]&amp;lt;/code&amp;gt; . Ook moet je in de Collision sensor de Tap button aanklikken om maar 1 trigger te geven bij aanraking van de tafel of kast.&lt;br /&gt;
&lt;br /&gt;
De Start sensor kun je veranderen in een Always sensors zodat Morsy gelijk begint met lopen.&lt;br /&gt;
 &lt;br /&gt;
Het is niet erg als je er zelf nog niet helemaal uit bent gekomen. Juist als het niet werkt zoals je wilt leer je hier meer van doordat je de verkeerde code moet herstellen. Wanneer je er niet uit komt kun je naar onderstaande uitwerking kijken:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
import bge&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    print(&amp;quot;main called&amp;quot;)&lt;br /&gt;
    cont = bge.logic.getCurrentController()&lt;br /&gt;
    own = cont.owner&lt;br /&gt;
&lt;br /&gt;
    collision1 = cont.sensors[&#039;AtTarget&#039;]&lt;br /&gt;
    steering = cont.actuators[&#039;Steering&#039;]&lt;br /&gt;
   &lt;br /&gt;
    if collision1.positive:&lt;br /&gt;
        print(&amp;quot;Collision   target=&amp;quot; + steering.target.name)&lt;br /&gt;
        if steering.target.name == &amp;quot;Shelf_8&amp;quot;:&lt;br /&gt;
            steering.target = &amp;quot;Desk_11&amp;quot;&lt;br /&gt;
            collision1.propName = &amp;quot;Desk&amp;quot;&lt;br /&gt;
        else:&lt;br /&gt;
            steering.target = &amp;quot;Shelf_8&amp;quot;&lt;br /&gt;
            collision1.propName = &amp;quot;Shelf&amp;quot;&lt;br /&gt;
    else:&lt;br /&gt;
        print(&amp;quot;no Collision&amp;quot;)        &lt;br /&gt;
&lt;br /&gt;
    cont.activate(steering)&lt;br /&gt;
&lt;br /&gt;
main()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voor hulp zie: https://www.youtube.com/watch?v=y36ZGsFDA2E&lt;br /&gt;
&lt;br /&gt;
plus: visualiseer pakket https://www.youtube.com/watch?v=wJYlWa5D0hc&lt;/div&gt;</summary>
		<author><name>Jacqueline</name></author>
	</entry>
	<entry>
		<id>https://infvo.nl/lab/index.php?title=Logistieke_Robots/les_3&amp;diff=465</id>
		<title>Logistieke Robots/les 3</title>
		<link rel="alternate" type="text/html" href="https://infvo.nl/lab/index.php?title=Logistieke_Robots/les_3&amp;diff=465"/>
		<updated>2014-12-17T16:11:12Z</updated>

		<summary type="html">&lt;p&gt;Jacqueline: /* Stap 4: Script afmaken */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Zijbalk Logistieke Robots}}&lt;br /&gt;
&lt;br /&gt;
== Morsy besturen met Python ==&lt;br /&gt;
In de vorige les hebben we gezien dat de controller van Morsy veel complexer wordt als we hem autonoom aan willen sturen. Wanneer we Morsy nog meer taken willen geven, en wanneer we Morsy in een groep willen laten werken, zijn de logic bricks niet meer toereikend. Daarom gaan we Blender combineren met de programmeertaal Python.&lt;br /&gt;
&lt;br /&gt;
Controleer eerst of de juiste versie van Python op je systeem geïnstalleerd is, op de juiste plaats. (Zie: [[../Python installeren|Python installeren]] voor verdere aanwijzingen.) In sommige gevallen is Python geïnstalleerd als onderdeel van Blender.&lt;br /&gt;
&lt;br /&gt;
== Blender combineren met programmeertaal Python ==&lt;br /&gt;
In deze les gebruiken we [https://googledrive.com/host/0B4Wf_Tca5KDuNnFUWTc4R09jblU/logistieke-robots/warehouse.blend warehouse.blend]. Deze omgeving zullen we gedurende de rest van het project gebruiken. Het openen van het bestand gaat nu anders omdat we de Python output willen zien. Dit is verschillend voor de Windows en voor de OS X versie van Blender.&lt;br /&gt;
&lt;br /&gt;
=== OS X: Blender opstarten met Terminal ===&lt;br /&gt;
&lt;br /&gt;
Ga naar de Blender applicatie en open de Package Contents van Blender.&lt;br /&gt;
&lt;br /&gt;
[[Bestand:osx-show-package.png|350px|Show Package contents]]&lt;br /&gt;
&lt;br /&gt;
Open vervolgens het blender executable bestand via het openen van de volgende folders: &amp;lt;code&amp;gt;Contents &amp;gt; MacOS &amp;gt; blender &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bestand:osx-blender-terminal.png|700px|Blender starten met terminal]]&lt;br /&gt;
&lt;br /&gt;
Als Blender opstart, kun je via &amp;lt;code&amp;gt;File&amp;gt;Open&amp;lt;/code&amp;gt; het bestand “warehouse.blend” openen.&lt;br /&gt;
&lt;br /&gt;
=== Windows: ===&lt;br /&gt;
&lt;br /&gt;
Open Blender op de gebruikelijke manier. Ga naar de Info Window en klik op &amp;lt;code&amp;gt;Window &amp;gt;Toggle System Console&amp;lt;/code&amp;gt;. Er is nu een extra scherm in beeld.&lt;br /&gt;
&lt;br /&gt;
Wanneer je de file “warehouse.blend” geopend hebt, zie je in het window linksonder een Tekst Editor. Hier kun je een Python controller ontwikkelen.&lt;br /&gt;
&lt;br /&gt;
=== Controleren of Python werkt in Blender ===&lt;br /&gt;
&lt;br /&gt;
Om te testen of de link tussen Blender en Python werkt, voeren we de volgende stappen uit:&lt;br /&gt;
# Voeg aan Robot_11 (de voorste) een Always sensor toe.&lt;br /&gt;
# Maak een nieuw Python script aan:&lt;br /&gt;
## klik op de &amp;quot;+&amp;quot; onderin het Text Editor venster (naast de naam van het bestand).&lt;br /&gt;
## verander de naam van het bestand in &amp;quot;Text.py&amp;quot;&lt;br /&gt;
## typ in de Text Editor:      &amp;lt;code&amp;gt;print(“Hello”)&amp;lt;/code&amp;gt;&lt;br /&gt;
# Voeg aan Robot_11 een Python controller: &amp;lt;br&amp;gt; [[Bestand:Les3-robot11-python-controller.png|350px|Voeg Python controller toe]]&lt;br /&gt;
# Selecteer als script voor deze Python-controller: &amp;quot;Text.py&amp;quot;&lt;br /&gt;
# Link de controller met de sensor: &amp;lt;br&amp;gt; [[Bestand:Les3-robot11-sensor-controller.png|700px|Link sensor en controller]]&lt;br /&gt;
# Ga na de spel modus (of, voor OS X, naar de Terminal) en kijk naar de console. Dit moet er nu in de console te zien zijn: &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Blender Game Engine Started&lt;br /&gt;
Hello&lt;br /&gt;
Blender Game Engine Finished&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voor hulp zie: https://www.youtube.com/watch?v=9dRd-pU2dKQ&lt;br /&gt;
&lt;br /&gt;
== Ontwikkelen van een controller in Python ==&lt;br /&gt;
 &lt;br /&gt;
Nu je weet hoe je Python aan Blender moet koppelen, kunnen we een Python controller maken. We gaan Morsy, nu genaamd Robot_11, naar een kast laten lopen om een artikel op te halen en in de box te zetten op tafel. Voordat we hieraan kunnen beginnen moeten we begrijpen hoe je sensoren kunt opvangen en actuatoren kunt aansturen via een Python controller.&lt;br /&gt;
&lt;br /&gt;
=== Morsy laten lopen door een Python controller ===&lt;br /&gt;
&lt;br /&gt;
Wat je in deze paragraaf gaat leren lijkt op wat je geleerd hebt in les 2, het autonoom laten ophalen van objecten en naar een bepaald doel brengen, maar nu doen we dat via een Python controller.&lt;br /&gt;
&lt;br /&gt;
==== Stap 1: Onderdelen van een script ====&lt;br /&gt;
Blender heeft al een opzet voor hoe je een robot moet aansturen. Ga in de Tekst editor window naar &amp;lt;code&amp;gt;Templates &amp;gt; Python&amp;gt; GameLogic Simple&amp;lt;/code&amp;gt;. Je ziet nu de volgende code verschijnen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot; line&amp;gt;&lt;br /&gt;
import bge&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
&lt;br /&gt;
    cont = bge.logic.getCurrentController()&lt;br /&gt;
    own = cont.owner&lt;br /&gt;
&lt;br /&gt;
    sens = cont.sensors[&#039;mySensor&#039;]&lt;br /&gt;
    actu = cont.actuators[&#039;myActuator&#039;]&lt;br /&gt;
&lt;br /&gt;
    if sens.positive:&lt;br /&gt;
        cont.activate(actu)&lt;br /&gt;
    else:&lt;br /&gt;
        cont.deactivate(actu)&lt;br /&gt;
&lt;br /&gt;
main()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dit heet een script. Dit script bestaat uit verschillende onderdelen.&lt;br /&gt;
* (r. 1) &amp;lt;code&amp;gt;import bge&amp;lt;/code&amp;gt; importeert de Blender Game Engine module voor Python. In deze module is onder andere de functie &amp;lt;code&amp;gt;logic.getCurrentController()&amp;lt;/code&amp;gt; gedefinieerd.&lt;br /&gt;
* (r. 4-15) De definitie van de functie &amp;lt;code&amp;gt;main()&amp;lt;/code&amp;gt;; &lt;br /&gt;
* (r. 17) Een aanroep van de functie &amp;lt;code&amp;gt;main()&amp;lt;/code&amp;gt;: de opdrachten in de definitie daarvan worden uitgevoerd.&lt;br /&gt;
&lt;br /&gt;
Het is belangrijk om te begrijpen hoe een script werkt. Wanneer deze controller geactiveerd wordt (bijvoorbeeld door een sensor), wordt het script uitgevoerd, en gebeurt er het volgende:&lt;br /&gt;
# &amp;lt;code&amp;gt;import bge&amp;lt;/code&amp;gt;    - Het script importeert de module ‘bge’ en beschikt zo over alle gedefinieerde functies in de bge module.&lt;br /&gt;
# &amp;lt;code&amp;gt;def main():&amp;lt;/code&amp;gt;    - definieert de functie main met de daarop volgende opdrachten. &lt;br /&gt;
# &amp;lt;code&amp;gt;main() &amp;lt;/code&amp;gt;  - aanroep van de functie main. De opdrachten in de definitie (“body”) van de functie main worden uitgevoerd.&lt;br /&gt;
&lt;br /&gt;
=== Stap 2: Sensoren en actuatoren toevoegen ===&lt;br /&gt;
Als we op ENTER (ofwel Return) drukken willen we dat Morsy naar de voorste kast gaat lopen. Ga door de volgende stappen heen om de juiste sensors en actuators toe te voegen:&lt;br /&gt;
# Verander de Always sensor in een Keyboard sensor met als Key de ENTER knop. Geef deze sensor de naam ‘Start’ &lt;br /&gt;
# Voeg een Steering actuator toe. Laat deze de naam ‘Steering’ houden en over de –X as bewegen.&lt;br /&gt;
# Voeg een Collission sensor genaamd ‘AtTarget’ toe link deze aan de Python controller.&lt;br /&gt;
Dit zijn alle actuators en sensors die we nodig hebben om de genoemde taak uit te voeren.&lt;br /&gt;
&lt;br /&gt;
=== Stap 3: Triggers ontvangen en versturen door de Python controller ===&lt;br /&gt;
In de vorige lessen hadden we een sensor, bijvoorbeeld een Keyboard sensor, aan een And controller gekoppeld. Wanneer je de juiste toets aanraakt op je toetsenbord gaat er een positieve ‘trigger’ naar de And controller die de bijbehorende actuator activeert.&lt;br /&gt;
&lt;br /&gt;
Nu moeten we de Start trigger op zien te vangen in de Python controller. Doe dit als volgt:&lt;br /&gt;
&lt;br /&gt;
* Het script moet de &#039;&#039;controller&#039;&#039; kunnen aanroepen waar de sensoren en actuatoren aan gekoppeld zijn. Dit kan door de functie &amp;lt;code&amp;gt;bge.logic.getCurrentController()&amp;lt;/code&amp;gt;&lt;br /&gt;
* Vervolgens moet de controller kunnen herkennen welke van de inkomende sensoren een trigger geeft om een juiste actuator aan te roepen. Je kunt deze sensoren vinden via &amp;lt;code&amp;gt;cont.sensors[“Start”]&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;cont.sensors[“AtTarget”]&amp;lt;/code&amp;gt;&lt;br /&gt;
Om de  code overzichtelijk te houden kun je verwijzingen maken naar de sensoren en actuatoren. Je mag deze namen zelf verzinnen of de volgende gebruiken:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
import bge&lt;br /&gt;
cont = bge.logic.getCurrentController()&lt;br /&gt;
start = cont.sensors[“Start”]&lt;br /&gt;
collision = cont.sensors[“AtTarget”]&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
  # define function main…&lt;br /&gt;
&lt;br /&gt;
main()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*  Bij het indrukken van de ENTER key, willen we dat Morsy zijn taak uit gaat voeren. Zowel het indrukken als het loslaten van de ENTER key geeft een trigger aan de controller. Het indrukken is een positive pulse en loslaten een negative pulse. Via een boolean (met waarde TRUE of FALSE) wordt aangegeven of er een pulse gegeven wordt. We willen dat de main() alleen aangeroepen wordt als start.positive TRUE is. Omdat start.positive een boolean is kun je dit als volgt opschrijven:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
if start.positive&lt;br /&gt;
    main()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
(Let op: een Tab in Python staat gelijk aan 4 spaties en is nodig om aan te geven wat er moet gebeuren als de conditie van de if &amp;lt;code&amp;gt;TRUE&amp;lt;/code&amp;gt; is)&lt;br /&gt;
* Zorg ervoor dat in de definitie van de functie &amp;lt;code&amp;gt;main() &amp;lt;/code&amp;gt; de Steering actuator geactiveerd wordt en naar Shelf_8 toe gaat (de voorste kast). De code ziet er nu als volgt uit:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
import bge&lt;br /&gt;
&lt;br /&gt;
cont = bge.logic.getCurrentController()&lt;br /&gt;
start = cont.sensors[“Start”]&lt;br /&gt;
collision = cont.sensors[“AtTarget”]&lt;br /&gt;
steering - cont.actuators[“Steering”]&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    steering.target = “Shelf_8”&lt;br /&gt;
    cont.activate(steering)&lt;br /&gt;
&lt;br /&gt;
if start.positive:&lt;br /&gt;
    main()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Stap 4: Script afmaken ===&lt;br /&gt;
Wanneer je nu in de play modus gaat en op ENTER drukt zie je dat Morsy naar Shelf_8 gaat lopen.&lt;br /&gt;
&lt;br /&gt;
In deze stap ga je zelf uitzoeken hoe  Morsy heen en weer loopt naar de kast. Het is geen vereiste meer dat de ENTER key voor de start zorgt. Morsy mag gelijk van start gaan in de play modus. Denk zelf na hoe je dit moet doen.&lt;br /&gt;
&lt;br /&gt;
Tips: je moet een Game Property aanmaken voor Desk_11, Shelf_8 en een voor Robot_11 om aan te geven waar hij heen moet lopen. Deze kun je aanroepen en veranderen via de variabele &amp;lt;code&amp;gt;cont.owner[“naam van game propery”]&amp;lt;/code&amp;gt; . Ook moet je in de Collision sensor de Tap button aanklikken om maar 1 trigger te geven bij aanraking van de tafel of kast.&lt;br /&gt;
&lt;br /&gt;
De Start sensor kun je veranderen in een Always sensors zodat Morsy gelijk begint met lopen.&lt;br /&gt;
 &lt;br /&gt;
Het is niet erg als je er zelf nog niet helemaal uit bent gekomen. Juist als het niet werkt zoals je wilt leer je hier meer van doordat je de verkeerde code moet herstellen. Wanneer je er niet uit komt kun je naar onderstaande uitwerking kijken:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
import bge&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    print(&amp;quot;main called&amp;quot;)&lt;br /&gt;
    cont = bge.logic.getCurrentController()&lt;br /&gt;
    own = cont.owner&lt;br /&gt;
&lt;br /&gt;
    collision1 = cont.sensors[&#039;AtTarget&#039;]&lt;br /&gt;
    steering = cont.actuators[&#039;Steering&#039;]&lt;br /&gt;
   &lt;br /&gt;
    if collision1.positive:&lt;br /&gt;
        print(&amp;quot;Collision   target=&amp;quot; + steering.target.name)&lt;br /&gt;
        if steering.target.name == &amp;quot;Shelf_8&amp;quot;:&lt;br /&gt;
            steering.target = &amp;quot;Desk_11&amp;quot;&lt;br /&gt;
            collision1.propName = &amp;quot;Desk&amp;quot;&lt;br /&gt;
        else:&lt;br /&gt;
            steering.target = &amp;quot;Shelf_8&amp;quot;&lt;br /&gt;
            collision1.propName = &amp;quot;Shelf&amp;quot;&lt;br /&gt;
    else:&lt;br /&gt;
        print(&amp;quot;no Collision&amp;quot;)        &lt;br /&gt;
&lt;br /&gt;
    cont.activate(steering)&lt;br /&gt;
&lt;br /&gt;
main()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voor hulp zie: https://www.youtube.com/watch?v=y36ZGsFDA2E&lt;br /&gt;
&lt;br /&gt;
plus: visualiseer pakket https://www.youtube.com/watch?v=wJYlWa5D0hc&lt;/div&gt;</summary>
		<author><name>Jacqueline</name></author>
	</entry>
	<entry>
		<id>https://infvo.nl/lab/index.php?title=Logistieke_Robots/les_3&amp;diff=464</id>
		<title>Logistieke Robots/les 3</title>
		<link rel="alternate" type="text/html" href="https://infvo.nl/lab/index.php?title=Logistieke_Robots/les_3&amp;diff=464"/>
		<updated>2014-12-17T16:10:09Z</updated>

		<summary type="html">&lt;p&gt;Jacqueline: /* Controleren of Python werkt in Blender */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Zijbalk Logistieke Robots}}&lt;br /&gt;
&lt;br /&gt;
== Morsy besturen met Python ==&lt;br /&gt;
In de vorige les hebben we gezien dat de controller van Morsy veel complexer wordt als we hem autonoom aan willen sturen. Wanneer we Morsy nog meer taken willen geven, en wanneer we Morsy in een groep willen laten werken, zijn de logic bricks niet meer toereikend. Daarom gaan we Blender combineren met de programmeertaal Python.&lt;br /&gt;
&lt;br /&gt;
Controleer eerst of de juiste versie van Python op je systeem geïnstalleerd is, op de juiste plaats. (Zie: [[../Python installeren|Python installeren]] voor verdere aanwijzingen.) In sommige gevallen is Python geïnstalleerd als onderdeel van Blender.&lt;br /&gt;
&lt;br /&gt;
== Blender combineren met programmeertaal Python ==&lt;br /&gt;
In deze les gebruiken we [https://googledrive.com/host/0B4Wf_Tca5KDuNnFUWTc4R09jblU/logistieke-robots/warehouse.blend warehouse.blend]. Deze omgeving zullen we gedurende de rest van het project gebruiken. Het openen van het bestand gaat nu anders omdat we de Python output willen zien. Dit is verschillend voor de Windows en voor de OS X versie van Blender.&lt;br /&gt;
&lt;br /&gt;
=== OS X: Blender opstarten met Terminal ===&lt;br /&gt;
&lt;br /&gt;
Ga naar de Blender applicatie en open de Package Contents van Blender.&lt;br /&gt;
&lt;br /&gt;
[[Bestand:osx-show-package.png|350px|Show Package contents]]&lt;br /&gt;
&lt;br /&gt;
Open vervolgens het blender executable bestand via het openen van de volgende folders: &amp;lt;code&amp;gt;Contents &amp;gt; MacOS &amp;gt; blender &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bestand:osx-blender-terminal.png|700px|Blender starten met terminal]]&lt;br /&gt;
&lt;br /&gt;
Als Blender opstart, kun je via &amp;lt;code&amp;gt;File&amp;gt;Open&amp;lt;/code&amp;gt; het bestand “warehouse.blend” openen.&lt;br /&gt;
&lt;br /&gt;
=== Windows: ===&lt;br /&gt;
&lt;br /&gt;
Open Blender op de gebruikelijke manier. Ga naar de Info Window en klik op &amp;lt;code&amp;gt;Window &amp;gt;Toggle System Console&amp;lt;/code&amp;gt;. Er is nu een extra scherm in beeld.&lt;br /&gt;
&lt;br /&gt;
Wanneer je de file “warehouse.blend” geopend hebt, zie je in het window linksonder een Tekst Editor. Hier kun je een Python controller ontwikkelen.&lt;br /&gt;
&lt;br /&gt;
=== Controleren of Python werkt in Blender ===&lt;br /&gt;
&lt;br /&gt;
Om te testen of de link tussen Blender en Python werkt, voeren we de volgende stappen uit:&lt;br /&gt;
# Voeg aan Robot_11 (de voorste) een Always sensor toe.&lt;br /&gt;
# Maak een nieuw Python script aan:&lt;br /&gt;
## klik op de &amp;quot;+&amp;quot; onderin het Text Editor venster (naast de naam van het bestand).&lt;br /&gt;
## verander de naam van het bestand in &amp;quot;Text.py&amp;quot;&lt;br /&gt;
## typ in de Text Editor:      &amp;lt;code&amp;gt;print(“Hello”)&amp;lt;/code&amp;gt;&lt;br /&gt;
# Voeg aan Robot_11 een Python controller: &amp;lt;br&amp;gt; [[Bestand:Les3-robot11-python-controller.png|350px|Voeg Python controller toe]]&lt;br /&gt;
# Selecteer als script voor deze Python-controller: &amp;quot;Text.py&amp;quot;&lt;br /&gt;
# Link de controller met de sensor: &amp;lt;br&amp;gt; [[Bestand:Les3-robot11-sensor-controller.png|700px|Link sensor en controller]]&lt;br /&gt;
# Ga na de spel modus (of, voor OS X, naar de Terminal) en kijk naar de console. Dit moet er nu in de console te zien zijn: &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Blender Game Engine Started&lt;br /&gt;
Hello&lt;br /&gt;
Blender Game Engine Finished&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voor hulp zie: https://www.youtube.com/watch?v=9dRd-pU2dKQ&lt;br /&gt;
&lt;br /&gt;
== Ontwikkelen van een controller in Python ==&lt;br /&gt;
 &lt;br /&gt;
Nu je weet hoe je Python aan Blender moet koppelen, kunnen we een Python controller maken. We gaan Morsy, nu genaamd Robot_11, naar een kast laten lopen om een artikel op te halen en in de box te zetten op tafel. Voordat we hieraan kunnen beginnen moeten we begrijpen hoe je sensoren kunt opvangen en actuatoren kunt aansturen via een Python controller.&lt;br /&gt;
&lt;br /&gt;
=== Morsy laten lopen door een Python controller ===&lt;br /&gt;
&lt;br /&gt;
Wat je in deze paragraaf gaat leren lijkt op wat je geleerd hebt in les 2, het autonoom laten ophalen van objecten en naar een bepaald doel brengen, maar nu doen we dat via een Python controller.&lt;br /&gt;
&lt;br /&gt;
==== Stap 1: Onderdelen van een script ====&lt;br /&gt;
Blender heeft al een opzet voor hoe je een robot moet aansturen. Ga in de Tekst editor window naar &amp;lt;code&amp;gt;Templates &amp;gt; Python&amp;gt; GameLogic Simple&amp;lt;/code&amp;gt;. Je ziet nu de volgende code verschijnen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot; line&amp;gt;&lt;br /&gt;
import bge&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
&lt;br /&gt;
    cont = bge.logic.getCurrentController()&lt;br /&gt;
    own = cont.owner&lt;br /&gt;
&lt;br /&gt;
    sens = cont.sensors[&#039;mySensor&#039;]&lt;br /&gt;
    actu = cont.actuators[&#039;myActuator&#039;]&lt;br /&gt;
&lt;br /&gt;
    if sens.positive:&lt;br /&gt;
        cont.activate(actu)&lt;br /&gt;
    else:&lt;br /&gt;
        cont.deactivate(actu)&lt;br /&gt;
&lt;br /&gt;
main()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dit heet een script. Dit script bestaat uit verschillende onderdelen.&lt;br /&gt;
* (r. 1) &amp;lt;code&amp;gt;import bge&amp;lt;/code&amp;gt; importeert de Blender Game Engine module voor Python. In deze module is onder andere de functie &amp;lt;code&amp;gt;logic.getCurrentController()&amp;lt;/code&amp;gt; gedefinieerd.&lt;br /&gt;
* (r. 4-15) De definitie van de functie &amp;lt;code&amp;gt;main()&amp;lt;/code&amp;gt;; &lt;br /&gt;
* (r. 17) Een aanroep van de functie &amp;lt;code&amp;gt;main()&amp;lt;/code&amp;gt;: de opdrachten in de definitie daarvan worden uitgevoerd.&lt;br /&gt;
&lt;br /&gt;
Het is belangrijk om te begrijpen hoe een script werkt. Wanneer deze controller geactiveerd wordt (bijvoorbeeld door een sensor), wordt het script uitgevoerd, en gebeurt er het volgende:&lt;br /&gt;
# &amp;lt;code&amp;gt;import bge&amp;lt;/code&amp;gt;    - Het script importeert de module ‘bge’ en beschikt zo over alle gedefinieerde functies in de bge module.&lt;br /&gt;
# &amp;lt;code&amp;gt;def main():&amp;lt;/code&amp;gt;    - definieert de functie main met de daarop volgende opdrachten. &lt;br /&gt;
# &amp;lt;code&amp;gt;main() &amp;lt;/code&amp;gt;  - aanroep van de functie main. De opdrachten in de definitie (“body”) van de functie main worden uitgevoerd.&lt;br /&gt;
&lt;br /&gt;
=== Stap 2: Sensoren en actuatoren toevoegen ===&lt;br /&gt;
Als we op ENTER (ofwel Return) drukken willen we dat Morsy naar de voorste kast gaat lopen. Ga door de volgende stappen heen om de juiste sensors en actuators toe te voegen:&lt;br /&gt;
# Verander de Always sensor in een Keyboard sensor met als Key de ENTER knop. Geef deze sensor de naam ‘Start’ &lt;br /&gt;
# Voeg een Steering actuator toe. Laat deze de naam ‘Steering’ houden en over de –X as bewegen.&lt;br /&gt;
# Voeg een Collission sensor genaamd ‘AtTarget’ toe link deze aan de Python controller.&lt;br /&gt;
Dit zijn alle actuators en sensors die we nodig hebben om de genoemde taak uit te voeren.&lt;br /&gt;
&lt;br /&gt;
=== Stap 3: Triggers ontvangen en versturen door de Python controller ===&lt;br /&gt;
In de vorige lessen hadden we een sensor, bijvoorbeeld een Keyboard sensor, aan een And controller gekoppeld. Wanneer je de juiste toets aanraakt op je toetsenbord gaat er een positieve ‘trigger’ naar de And controller die de bijbehorende actuator activeert.&lt;br /&gt;
&lt;br /&gt;
Nu moeten we de Start trigger op zien te vangen in de Python controller. Doe dit als volgt:&lt;br /&gt;
&lt;br /&gt;
* Het script moet de &#039;&#039;controller&#039;&#039; kunnen aanroepen waar de sensoren en actuatoren aan gekoppeld zijn. Dit kan door de functie &amp;lt;code&amp;gt;bge.logic.getCurrentController()&amp;lt;/code&amp;gt;&lt;br /&gt;
* Vervolgens moet de controller kunnen herkennen welke van de inkomende sensoren een trigger geeft om een juiste actuator aan te roepen. Je kunt deze sensoren vinden via &amp;lt;code&amp;gt;cont.sensors[“Start”]&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;cont.sensors[“AtTarget”]&amp;lt;/code&amp;gt;&lt;br /&gt;
Om de  code overzichtelijk te houden kun je verwijzingen maken naar de sensoren en actuatoren. Je mag deze namen zelf verzinnen of de volgende gebruiken:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
import bge&lt;br /&gt;
cont = bge.logic.getCurrentController()&lt;br /&gt;
start = cont.sensors[“Start”]&lt;br /&gt;
collision = cont.sensors[“AtTarget”]&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
  # define function main…&lt;br /&gt;
&lt;br /&gt;
main()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*  Bij het indrukken van de ENTER key, willen we dat Morsy zijn taak uit gaat voeren. Zowel het indrukken als het loslaten van de ENTER key geeft een trigger aan de controller. Het indrukken is een positive pulse en loslaten een negative pulse. Via een boolean (met waarde TRUE of FALSE) wordt aangegeven of er een pulse gegeven wordt. We willen dat de main() alleen aangeroepen wordt als start.positive TRUE is. Omdat start.positive een boolean is kun je dit als volgt opschrijven:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
if start.positive&lt;br /&gt;
    main()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
(Let op: een Tab in Python staat gelijk aan 4 spaties en is nodig om aan te geven wat er moet gebeuren als de conditie van de if &amp;lt;code&amp;gt;TRUE&amp;lt;/code&amp;gt; is)&lt;br /&gt;
* Zorg ervoor dat in de definitie van de functie &amp;lt;code&amp;gt;main() &amp;lt;/code&amp;gt; de Steering actuator geactiveerd wordt en naar Shelf_8 toe gaat (de voorste kast). De code ziet er nu als volgt uit:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
import bge&lt;br /&gt;
&lt;br /&gt;
cont = bge.logic.getCurrentController()&lt;br /&gt;
start = cont.sensors[“Start”]&lt;br /&gt;
collision = cont.sensors[“AtTarget”]&lt;br /&gt;
steering - cont.actuators[“Steering”]&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    steering.target = “Shelf_8”&lt;br /&gt;
    cont.activate(steering)&lt;br /&gt;
&lt;br /&gt;
if start.positive:&lt;br /&gt;
    main()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Stap 4: Script afmaken ===&lt;br /&gt;
Wanneer je nu in de play modus gaat en op ENTER drukt zie je dat Morsy naar Shelf_8 gaat lopen.&lt;br /&gt;
&lt;br /&gt;
In deze stap ga je zelf uitzoeken hoe  Morsy heen en weer loopt naar de kast. Het is geen vereiste meer dat de ENTER key voor de start zorgt. Morsy mag gelijk van start gaan in de play modus. Denk zelf na hoe je dit moet doen.&lt;br /&gt;
&lt;br /&gt;
Tips: je moet een Game Property aanmaken voor Desk_11, Shelf_8 en een voor Robot_11 om aan te geven waar hij heen moet lopen. Deze kun je aanroepen en veranderen via de variabele &amp;lt;code&amp;gt;cont.owner[“naam van game propery”]&amp;lt;/code&amp;gt; . Ook moet je in de Collision sensor de Tap button aanklikken om maar 1 trigger te geven bij aanraking van de tafel of kast.&lt;br /&gt;
&lt;br /&gt;
De Start sensor kun je veranderen in een Always sensors zodat Morsy gelijk begint met lopen.&lt;br /&gt;
 &lt;br /&gt;
Het is niet erg als je er zelf nog niet helemaal uit bent gekomen. Juist als het niet werkt zoals je wilt leer je hier meer van doordat je de verkeerde code moet herstellen. Wanneer je er niet uit komt kun je naar onderstaande uitwerking kijken:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
import bge&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    print(&amp;quot;main called&amp;quot;)&lt;br /&gt;
    cont = bge.logic.getCurrentController()&lt;br /&gt;
    own = cont.owner&lt;br /&gt;
&lt;br /&gt;
    collision1 = cont.sensors[&#039;AtTarget&#039;]&lt;br /&gt;
    steering = cont.actuators[&#039;Steering&#039;]&lt;br /&gt;
   &lt;br /&gt;
    if collision1.positive:&lt;br /&gt;
        print(&amp;quot;Collision   target=&amp;quot; + steering.target.name)&lt;br /&gt;
        if steering.target.name == &amp;quot;Shelf_8&amp;quot;:&lt;br /&gt;
            steering.target = &amp;quot;Desk_11&amp;quot;&lt;br /&gt;
            collision1.propName = &amp;quot;Desk&amp;quot;&lt;br /&gt;
        else:&lt;br /&gt;
            steering.target = &amp;quot;Shelf_8&amp;quot;&lt;br /&gt;
            collision1.propName = &amp;quot;Shelf&amp;quot;&lt;br /&gt;
    else:&lt;br /&gt;
        print(&amp;quot;no Collision&amp;quot;)        &lt;br /&gt;
&lt;br /&gt;
    cont.activate(steering)&lt;br /&gt;
&lt;br /&gt;
main()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voor hulp zie: https://www.youtube.com/watch?v=y36ZGsFDA2E&lt;/div&gt;</summary>
		<author><name>Jacqueline</name></author>
	</entry>
	<entry>
		<id>https://infvo.nl/lab/index.php?title=Logistieke_Robots/les_6&amp;diff=463</id>
		<title>Logistieke Robots/les 6</title>
		<link rel="alternate" type="text/html" href="https://infvo.nl/lab/index.php?title=Logistieke_Robots/les_6&amp;diff=463"/>
		<updated>2014-12-17T16:09:27Z</updated>

		<summary type="html">&lt;p&gt;Jacqueline: /* Hervat les 6 - Robots van elkaar laten leren */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Zijbalk Logistieke Robots}}&lt;br /&gt;
&lt;br /&gt;
==Les 6 - Robots van elkaar laten leren ==&lt;br /&gt;
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 &amp;quot;warehouse_team_collission.blend&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==Verbetering code na les 5 ==&lt;br /&gt;
We gaan een functie set_articles() maken zodat er een array aangemaakt &lt;br /&gt;
wordt met de artikelen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot; line&amp;gt;&lt;br /&gt;
def get_order():&lt;br /&gt;
    # get articles from central controller&lt;br /&gt;
    set_articles()&lt;br /&gt;
    print(robot[&amp;quot;articles&amp;quot;])&lt;br /&gt;
    # set game properties&lt;br /&gt;
    robot[&amp;quot;article_number&amp;quot;] = 1 &lt;br /&gt;
    robot[&amp;quot;target_desk&amp;quot;] = False &lt;br /&gt;
    # distance variables&lt;br /&gt;
    robot[&amp;quot;distance&amp;quot;] = 0.0&lt;br /&gt;
    robot[&amp;quot;location1&amp;quot;] = robot.position[0]&lt;br /&gt;
    robot[&amp;quot;location2&amp;quot;] = robot.position[1]&lt;br /&gt;
    robot[&amp;quot;location3&amp;quot;] = robot.position[2]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vervang ook de declaratie van robot[“robot_id”] door onderstaande. De central controller hoeft zo niet meer te vertellen om welke robot het gaat.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot; line&amp;gt;&lt;br /&gt;
# get the current controller &lt;br /&gt;
cont = bge.logic.getCurrentController()&lt;br /&gt;
robot = cont.owner&lt;br /&gt;
robot[&amp;quot;robot_id&amp;quot;] = robot.name[6:]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
De functie set_articles() ziet er als volgt uit:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot; line&amp;gt;&lt;br /&gt;
def set_articles():&lt;br /&gt;
    message = start_sens.bodies[0][1:]    &lt;br /&gt;
    order_length = len(re.findall(r&#039;[^\s ]+&#039;, message))&lt;br /&gt;
    robot[&amp;quot;articles&amp;quot;] = [&amp;quot;&amp;quot;]*order_length&lt;br /&gt;
    for i in range(order_length):&lt;br /&gt;
        robot[&amp;quot;articles&amp;quot;][i] = re.findall(r&#039;[^\s ]+&#039;, message)[i]  &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
De main() functie ziet er nu overzichtelijker uit:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot; line&amp;gt;&lt;br /&gt;
def main(): &lt;br /&gt;
    if robot[&amp;quot;target_desk&amp;quot;] == False:&lt;br /&gt;
        shelf_sens.propName = &amp;quot;Shelf&amp;quot;&lt;br /&gt;
        if robot[&amp;quot;article_number&amp;quot;] &amp;lt;= len(robot[&amp;quot;articles&amp;quot;]):&lt;br /&gt;
            track_act.target = robot[&amp;quot;articles&amp;quot;][robot[&amp;quot;article_number&amp;quot;]-1]&lt;br /&gt;
    else:&lt;br /&gt;
        shelf_sens.propName = &amp;quot;Desk&amp;quot;&lt;br /&gt;
        track_act.target = &amp;quot;Desk_&amp;quot; + str(robot[&amp;quot;robot_id&amp;quot;])&lt;br /&gt;
    if shelf_sens.positive:&lt;br /&gt;
        if robot[&amp;quot;target_desk&amp;quot;] == True:&lt;br /&gt;
            robot[&amp;quot;article_number&amp;quot;] += 1&lt;br /&gt;
            if robot[&amp;quot;article_number&amp;quot;]  == len(robot[&amp;quot;articles&amp;quot;]) +1:&lt;br /&gt;
                cont.deactivate(track_act)&lt;br /&gt;
                print(&amp;quot;done robot &amp;quot;+ str(robot[&amp;quot;robot_id&amp;quot;]))&lt;br /&gt;
                GameLogic.sendMessage(&amp;quot;Done&amp;quot;, robot[&amp;quot;robot_id&amp;quot;] , &amp;quot;Ground&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
                GameLogic.sendMessage(&amp;quot;Done&amp;quot;, str(robot[&amp;quot;distance&amp;quot;]) , &amp;quot;Ground&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
        robot[&amp;quot;target_desk&amp;quot;]=  not robot[&amp;quot;target_desk&amp;quot;]  &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
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:&lt;br /&gt;
&lt;br /&gt;
[[Bestand:balk_physics.png]]&lt;br /&gt;
&lt;br /&gt;
Verander dan de form factor in 0.0:&lt;br /&gt;
&lt;br /&gt;
[[Bestand:form_factor.png]]&lt;br /&gt;
&lt;br /&gt;
Doe dit voor beide robots.&lt;br /&gt;
&lt;br /&gt;
==Hervat les 6 - Robots van elkaar laten leren ==&lt;br /&gt;
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. &lt;br /&gt;
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.&lt;br /&gt;
Het eindresultaat kun je zien op https://www.youtube.com/watch?v=LwOjSqbDy0g&lt;br /&gt;
&lt;br /&gt;
==Observeren van botsingen==&lt;br /&gt;
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.&lt;br /&gt;
De centrale controller moet ook veranderd worden omdat we nu twee teams hebben. Doe daarvoor de volgende aanpassingen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot; line&amp;gt;&lt;br /&gt;
if sens.positive:&lt;br /&gt;
    robot_team = [&amp;quot;10&amp;quot;,&amp;quot;11&amp;quot;]&lt;br /&gt;
    central[&amp;quot;active_robots&amp;quot;] = [0,0,0,0,0,0,0,0,0,0,0]&lt;br /&gt;
    central[&amp;quot;distance&amp;quot;] =0&lt;br /&gt;
    central[&amp;quot;time&amp;quot;] = 0.0&lt;br /&gt;
    Send_order(robot_team)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot; line&amp;gt;&lt;br /&gt;
if message.positive:&lt;br /&gt;
    central[&amp;quot;active_robots&amp;quot;][int(message.bodies[0])-1]=0&lt;br /&gt;
    central[&amp;quot;distance&amp;quot;] += float(message.bodies[1])&lt;br /&gt;
    if central[&amp;quot;boxes_done&amp;quot;] &amp;lt; central[&amp;quot;boxes_tot&amp;quot;]-1 and central[&amp;quot;active_robots&amp;quot;][10-1]+central[&amp;quot;active_robots&amp;quot;][11-1]==0:&lt;br /&gt;
        central[&amp;quot;boxes_done&amp;quot;] +=1&lt;br /&gt;
        print(&amp;quot;number of boxes done:&amp;quot;)&lt;br /&gt;
        print(central[&amp;quot;boxes_done&amp;quot;])&lt;br /&gt;
        Send_order([&amp;quot;10&amp;quot;,&amp;quot;11&amp;quot;])&lt;br /&gt;
    if central[&amp;quot;boxes_done&amp;quot;] &amp;lt; central[&amp;quot;boxes_tot&amp;quot;]-1 and central[&amp;quot;active_robots&amp;quot;][9-1]+central[&amp;quot;active_robots&amp;quot;][8-1]==0:&lt;br /&gt;
        central[&amp;quot;boxes_done&amp;quot;] +=1&lt;br /&gt;
        print(&amp;quot;number of boxes done:&amp;quot;)&lt;br /&gt;
        print(central[&amp;quot;boxes_done&amp;quot;])&lt;br /&gt;
        Send_order([&amp;quot;8&amp;quot;,&amp;quot;9&amp;quot;])&lt;br /&gt;
    if sum(central[&amp;quot;active_robots&amp;quot;]) == 0: &lt;br /&gt;
        print(&amp;quot;Total walked distance:&amp;quot;)&lt;br /&gt;
        print(central[&amp;quot;distance&amp;quot;])&lt;br /&gt;
        print(central[&amp;quot;time&amp;quot;])&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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:&lt;br /&gt;
# 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.&lt;br /&gt;
# 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. &lt;br /&gt;
We kiezen voor algoritme 2 om te laten zien hoe je een robot van slimme kennis voorziet.&lt;br /&gt;
&lt;br /&gt;
== Kunnen reageren op andere robots ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
===Veranderen pakhuis omgeving===&lt;br /&gt;
Omdat we de controller van de robot gaan veranderen, mag je robot 9, 10 en 11 weer verwijderen. En de volgende stappen uitvoeren:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Stap 1:&#039;&#039;&#039;&lt;br /&gt;
Voeg aan de robot een string game property toe met de naam  “Robot”. Dit is om elkaar te kunnen herkennen met een Radar&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Stap 2:&#039;&#039;&#039;&lt;br /&gt;
Zet de Physics Type op Character en vink de box Actor aan:&lt;br /&gt;
&lt;br /&gt;
[[Bestand: balk_actor.png]]&lt;br /&gt;
&lt;br /&gt;
[[Bestand: set_as_actor.png]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Stap 3:&#039;&#039;&#039;&lt;br /&gt;
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:&lt;br /&gt;
&lt;br /&gt;
[[Bestand: change_physics.png]]&lt;br /&gt;
&lt;br /&gt;
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:&lt;br /&gt;
&lt;br /&gt;
[[Bestand: nieuwe_arena.png]]&lt;br /&gt;
&lt;br /&gt;
===Veranderen robot controller ===&lt;br /&gt;
De robots moeten elkaar nu herkennen, hier op reageren en vervolgens weer doorgaan met het ophalen van artikelen. We moeten veel gaan veranderen aan de controller. We nemen dit stap voor stap door:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Stap 1:&#039;&#039;&#039;&lt;br /&gt;
We hebben een extra Radar nodig om een ontwijkactie te starten en we moeten kunnen meten of de robot een goede actie gedaan heeft. Dit doen we met een collission sensor. De always sensor is nodig om de taak weer op te pakken na de ontwijkactie:&lt;br /&gt;
[[Bestand: add_radar.png]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Stap 2:&#039;&#039;&#039;&lt;br /&gt;
De ontwijkactie houdt in dat de robot, na het detecteren van een andere robot, een aantal seconden rondjes draait, weg loopt van de robot en daarna zijn taak weer oppakt. Dit definiëren we in een extra state: &lt;br /&gt;
[[Bestand: add_state.png]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Stap 3:&#039;&#039;&#039;&lt;br /&gt;
Voeg extra game properties toe:&lt;br /&gt;
[[Bestand: add_game_property.png]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Stap 4:&#039;&#039;&#039;&lt;br /&gt;
Het script moet ook onder handen genomen worden. Er moet een extra package geïmporteerd worden omdat we de robot een willekeurige waarde geven voor het draaien om zijn eigen as en het weglopen van de radar locatie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot; line&amp;gt;&lt;br /&gt;
# import necessary packages&lt;br /&gt;
import bge&lt;br /&gt;
import GameLogic&lt;br /&gt;
import re&lt;br /&gt;
import random&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
De extra sensors moeten gedefinieerd worden: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot; line&amp;gt;&lt;br /&gt;
# get sensors and actuators&lt;br /&gt;
start_sens = cont.sensors[&amp;quot;Start&amp;quot;]&lt;br /&gt;
shelf_sens = cont.sensors[&amp;quot;Shelf&amp;quot;]&lt;br /&gt;
track_act = cont.actuators[&amp;quot;TrackTo&amp;quot;]&lt;br /&gt;
robot_radar = cont.sensors[&amp;quot;RobotRadar&amp;quot;]&lt;br /&gt;
robot_collission = cont.sensors[&amp;quot;RobotCollission&amp;quot;]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wanneer de robot voor de eerste keer begint met de order, worden de parameters gedefinieerd die te maken hebben met het ontwijken van de andere robot:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot; line&amp;gt;&lt;br /&gt;
if start_sens.positive:&lt;br /&gt;
    cont.activate(track_act) &lt;br /&gt;
    print(&amp;quot;Start new order:&amp;quot;)&lt;br /&gt;
    get_order()  &lt;br /&gt;
    # set avoidance parameters and evaluation variables&lt;br /&gt;
    print(&amp;quot;begin&amp;quot;)&lt;br /&gt;
    if robot[&amp;quot;active&amp;quot;] == False:&lt;br /&gt;
        robot[&amp;quot;sec_rot&amp;quot;] = random.uniform(0,2)&lt;br /&gt;
        robot[&amp;quot;sec_walk&amp;quot;] = random.uniform(0,2)&lt;br /&gt;
        robot[&amp;quot;active&amp;quot;] =True&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wanneer een robot iemand op de radar heeft, moet de robot de ontwijkactie uit gaan voeren in de andere state. Ook moet bijgehouden worden of de robot alsnog tegen een ander aan stoot. Wanneer de robot een slechte ontwijkactie heeft en vaak tegen iemand op botst, willen we dat deze robot een nieuwe ontwijkreactie krijgt. Dit noemen we een “reset”. Dit is nodig als de robot ergens vast zit:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot; line&amp;gt;&lt;br /&gt;
if robot_radar.positive == True:&lt;br /&gt;
    cont.deactivate(track_act)&lt;br /&gt;
    robot[&amp;quot;radar&amp;quot;] +=1&lt;br /&gt;
    robot[&amp;quot;time&amp;quot;] = 0.0&lt;br /&gt;
    robot.state = 2&lt;br /&gt;
&lt;br /&gt;
if robot_collission.positive:&lt;br /&gt;
    robot[&amp;quot;collission&amp;quot;] +=1&lt;br /&gt;
    &lt;br /&gt;
if robot[&amp;quot;collission&amp;quot;] &amp;gt;=20:&lt;br /&gt;
    #reset parameters because its stuck&lt;br /&gt;
    robot[&amp;quot;sec_rot&amp;quot;] = random.uniform(0,2)&lt;br /&gt;
    robot[&amp;quot;sec_walk&amp;quot;] = random.uniform(0,2)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In de extra state hebben we gezien dat er nog een “avoiding.py” gemaakt moet worden. Deze ziet er als volgt uit:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot; line&amp;gt;&lt;br /&gt;
# import necessary packages&lt;br /&gt;
import bge&lt;br /&gt;
import GameLogic&lt;br /&gt;
import re&lt;br /&gt;
&lt;br /&gt;
# get the current controller &lt;br /&gt;
cont = bge.logic.getCurrentController()&lt;br /&gt;
robot = cont.owner&lt;br /&gt;
robot[&amp;quot;robot_id&amp;quot;] = robot.name[6:]&lt;br /&gt;
&lt;br /&gt;
# get sensors and actuators&lt;br /&gt;
rot_act = cont.actuators[&amp;quot;Rotate&amp;quot;]&lt;br /&gt;
walk_act = cont.actuators[&amp;quot;Walk&amp;quot;]&lt;br /&gt;
robot_collission2 = cont.sensors[&amp;quot;RobotCollission2&amp;quot;]&lt;br /&gt;
robot_radar2 = cont.sensors[&amp;quot;RobotRadar2&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
robot[&amp;quot;time&amp;quot;] += 1/60&lt;br /&gt;
&lt;br /&gt;
if robot[&amp;quot;time&amp;quot;] &amp;lt; robot[&amp;quot;sec_rot&amp;quot;]:&lt;br /&gt;
    cont.activate(rot_act)&lt;br /&gt;
&lt;br /&gt;
if robot[&amp;quot;time&amp;quot;] &amp;gt; robot[&amp;quot;sec_rot&amp;quot;] and robot[&amp;quot;time&amp;quot;] &amp;lt; (robot[&amp;quot;sec_rot&amp;quot;] + robot[&amp;quot;sec_walk&amp;quot;]):&lt;br /&gt;
    cont.deactivate(rot_act)&lt;br /&gt;
    cont.activate(walk_act)&lt;br /&gt;
&lt;br /&gt;
if robot[&amp;quot;time&amp;quot;] &amp;gt; (robot[&amp;quot;sec_rot&amp;quot;] + robot[&amp;quot;sec_walk&amp;quot;]):&lt;br /&gt;
    robot.state =1&lt;br /&gt;
&lt;br /&gt;
if robot_collission2.positive:&lt;br /&gt;
    robot[&amp;quot;collission&amp;quot;] +=1&lt;br /&gt;
&lt;br /&gt;
if robot_radar2.positive:&lt;br /&gt;
    robot[&amp;quot;radar&amp;quot;] +=1&lt;br /&gt;
    robot[&amp;quot;time&amp;quot;] = 0.0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wanneer je de robots nu laat starten met het ophalen van bestellingen, zie je dat ze op elkaar reageren en hun ontwijkactie uitvoeren. De acties die ze uitvoeren zijn hetzelfde maar hoelang ze deze actie uit voeren kan verschillen. Sommige robots zullen beter kunnen ontwijken en sneller door kunnen gaan met hun bestelling dan andere robots. De robots die een goede ontwijkstrategie hebben kunnen hun strategie doorgeven aan de andere robots.&lt;br /&gt;
&lt;br /&gt;
==Optimaliseren van reactie==&lt;br /&gt;
Wanneer de robots met hun eigen ontwijkingsstrategie orders gaan verzamelen, zul je verschillen zien in de aanpak. De ene robot draait lang een rondje terwijl de andere robot bijna gelijk weer verder gaat met de bestelling. Je wilt dat de robots van elkaar leren en de beste strategieën nadoen zodat ze totaal zo min mogelijk botsen. Botsen kan er namelijk voor zorgen dat de robot kapot gaat of dat een artikel op de grond valt.&lt;br /&gt;
Omdat we 6 robots hebben beginnen we met 6 verschillende strategieën (ieder tweetal met het aantal seconden rondjes draaien en rechtdoor lopen is een strategie). Na een bepaalde tijd moeten we weten hoe goed de strategie van iedere robot is zodat de goede robots dit door kunnen geven aan de andere robots.&lt;br /&gt;
Het uitwisselen van deze informatie en het veranderen van de strategie gebeurd in de centrale controller op de volgende manier:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Stap 1:&#039;&#039;&#039;&lt;br /&gt;
Importeer extra package numpy:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot; line&amp;gt;&lt;br /&gt;
# import necessary packages&lt;br /&gt;
import bge&lt;br /&gt;
import GameLogic&lt;br /&gt;
import random&lt;br /&gt;
import numpy&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Stap 2:&#039;&#039;&#039;&lt;br /&gt;
Voeg een extra team toe met robot 6 en 7. Je weet van de vorige les al hoe dit moet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Stap 3:&#039;&#039;&#039;&lt;br /&gt;
Voeg een extra tijd meting toe om de strategieën te kunnen updaten: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot; line&amp;gt;&lt;br /&gt;
central[&amp;quot;time&amp;quot;]+= 1/60&lt;br /&gt;
central[&amp;quot;time_minute&amp;quot;]+= 1/60&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Stap 4:&#039;&#039;&#039;&lt;br /&gt;
Per minuut gaan we de strategieën van de robots herzien en veranderen op de volgende manier:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot; line&amp;gt;&lt;br /&gt;
if central[&amp;quot;time_minute&amp;quot;] &amp;gt;=60:&lt;br /&gt;
    central[&amp;quot;time_minute&amp;quot;] = 0&lt;br /&gt;
    robots = [&amp;quot;Robot_6&amp;quot;, &amp;quot;Robot_7&amp;quot;, &amp;quot;Robot_8&amp;quot;, &amp;quot;Robot_9&amp;quot;, &amp;quot;Robot_10&amp;quot;, &amp;quot;Robot_11&amp;quot;]&lt;br /&gt;
    result = [[0,0,0,&amp;quot;&amp;quot;] for i in range(len(robots))]&lt;br /&gt;
    alg_result = 0&lt;br /&gt;
    for i in range(len(robots)):&lt;br /&gt;
        robot = scene.objects[robots[i]]&lt;br /&gt;
        result[i][0] = robot[&amp;quot;collission&amp;quot;] &lt;br /&gt;
        result[i][1] = robot[&amp;quot;sec_rot&amp;quot;]&lt;br /&gt;
        result[i][2] = robot[&amp;quot;sec_walk&amp;quot;]&lt;br /&gt;
        result[i][3] = robot&lt;br /&gt;
        alg_result += robot[&amp;quot;collission&amp;quot;]&lt;br /&gt;
        robot[&amp;quot;collission&amp;quot;] = 0&lt;br /&gt;
        robot[&amp;quot;radar&amp;quot;]=0   &lt;br /&gt;
    central[&amp;quot;algorithm&amp;quot;].append(alg_result)&lt;br /&gt;
    # print number of collissions per minute&lt;br /&gt;
    print(central[&amp;quot;algorithm&amp;quot;])&lt;br /&gt;
    result = sorted(result, key=lambda a_entry: a_entry[0]) &lt;br /&gt;
    print(result)&lt;br /&gt;
    print(&amp;quot;Total walked distance:&amp;quot;)&lt;br /&gt;
    print(central[&amp;quot;distance&amp;quot;])&lt;br /&gt;
    print(central[&amp;quot;time&amp;quot;])&lt;br /&gt;
    # update values&lt;br /&gt;
    for i in range(len(robots)):&lt;br /&gt;
        robot = scene.objects[robots[i]]&lt;br /&gt;
        take_from = random.choice([0,1])&lt;br /&gt;
        robot[&amp;quot;sec_rot&amp;quot;] = max(0,result[take_from][1] + random.gauss(0, 0.1))&lt;br /&gt;
        robot[&amp;quot;sec_walk&amp;quot;] = max(0,result[take_from][2] + random.gauss(0, 0.1))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wat we in deze functie doen is het evalueren van de prestatie van de robots. Met prestatie bedoelen we het aantal keer opbotsen tegen de andere robots. Hoe minder dit gebeurd, hoe beter. Voor iedere robot wordt dit aantal opgeslagen samen met de twee waarden die hiervoor zorgden. Deze prestatie wordt opgeteld bij het algehele resultaat van de groep en de waarden worden weer op 0 gezet voor de volgende minuut. &lt;br /&gt;
Vervolgens worden de strategieën van de robots aangepast. We nemen de strategieën van de 2 beste robots, de robots met het minste aantal botsingen, om door te geven aan de anderen. Op deze waarden passen we nog een kleine variatie toe om te kijken of we in de volgende minuut nog een betere strategie tegen gaan komen. Zo kunnen de robots blijven leren. &lt;br /&gt;
&lt;br /&gt;
==Experimenten==&lt;br /&gt;
Wanneer je de robots nu aan het werk zet zie je per minuut een update van de prestatie van het algoritme uitgeprint in de Terminal. Het is moeilijk te analyseren of deze methode echt werkt als je alleen naar deze geprinte waarden. Je kan de robots aan het werk zetten en een aantal boxen laten vullen en deze cijfers in de gaten houden maar je kan er pas echt wat over zeggen als je een goed experiment uitvoert. Dit gaan we doen in Les 7.&lt;br /&gt;
&lt;br /&gt;
==Plusopdracht==&lt;br /&gt;
Denk alvast na over hoe je kan testen of dit algoritme werkt.&lt;/div&gt;</summary>
		<author><name>Jacqueline</name></author>
	</entry>
	<entry>
		<id>https://infvo.nl/lab/index.php?title=Logistieke_Robots/les_3&amp;diff=462</id>
		<title>Logistieke Robots/les 3</title>
		<link rel="alternate" type="text/html" href="https://infvo.nl/lab/index.php?title=Logistieke_Robots/les_3&amp;diff=462"/>
		<updated>2014-12-17T16:08:00Z</updated>

		<summary type="html">&lt;p&gt;Jacqueline: /* Stap 4: Script afmaken */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Zijbalk Logistieke Robots}}&lt;br /&gt;
&lt;br /&gt;
== Morsy besturen met Python ==&lt;br /&gt;
In de vorige les hebben we gezien dat de controller van Morsy veel complexer wordt als we hem autonoom aan willen sturen. Wanneer we Morsy nog meer taken willen geven, en wanneer we Morsy in een groep willen laten werken, zijn de logic bricks niet meer toereikend. Daarom gaan we Blender combineren met de programmeertaal Python.&lt;br /&gt;
&lt;br /&gt;
Controleer eerst of de juiste versie van Python op je systeem geïnstalleerd is, op de juiste plaats. (Zie: [[../Python installeren|Python installeren]] voor verdere aanwijzingen.) In sommige gevallen is Python geïnstalleerd als onderdeel van Blender.&lt;br /&gt;
&lt;br /&gt;
== Blender combineren met programmeertaal Python ==&lt;br /&gt;
In deze les gebruiken we [https://googledrive.com/host/0B4Wf_Tca5KDuNnFUWTc4R09jblU/logistieke-robots/warehouse.blend warehouse.blend]. Deze omgeving zullen we gedurende de rest van het project gebruiken. Het openen van het bestand gaat nu anders omdat we de Python output willen zien. Dit is verschillend voor de Windows en voor de OS X versie van Blender.&lt;br /&gt;
&lt;br /&gt;
=== OS X: Blender opstarten met Terminal ===&lt;br /&gt;
&lt;br /&gt;
Ga naar de Blender applicatie en open de Package Contents van Blender.&lt;br /&gt;
&lt;br /&gt;
[[Bestand:osx-show-package.png|350px|Show Package contents]]&lt;br /&gt;
&lt;br /&gt;
Open vervolgens het blender executable bestand via het openen van de volgende folders: &amp;lt;code&amp;gt;Contents &amp;gt; MacOS &amp;gt; blender &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bestand:osx-blender-terminal.png|700px|Blender starten met terminal]]&lt;br /&gt;
&lt;br /&gt;
Als Blender opstart, kun je via &amp;lt;code&amp;gt;File&amp;gt;Open&amp;lt;/code&amp;gt; het bestand “warehouse.blend” openen.&lt;br /&gt;
&lt;br /&gt;
=== Windows: ===&lt;br /&gt;
&lt;br /&gt;
Open Blender op de gebruikelijke manier. Ga naar de Info Window en klik op &amp;lt;code&amp;gt;Window &amp;gt;Toggle System Console&amp;lt;/code&amp;gt;. Er is nu een extra scherm in beeld.&lt;br /&gt;
&lt;br /&gt;
Wanneer je de file “warehouse.blend” geopend hebt, zie je in het window linksonder een Tekst Editor. Hier kun je een Python controller ontwikkelen.&lt;br /&gt;
&lt;br /&gt;
=== Controleren of Python werkt in Blender ===&lt;br /&gt;
&lt;br /&gt;
Om te testen of de link tussen Blender en Python werkt, voeren we de volgende stappen uit:&lt;br /&gt;
# Voeg aan Robot_11 (de voorste) een Always sensor toe.&lt;br /&gt;
# Maak een nieuw Python script aan:&lt;br /&gt;
## klik op de &amp;quot;+&amp;quot; onderin het Text Editor venster (naast de naam van het bestand).&lt;br /&gt;
## verander de naam van het bestand in &amp;quot;Text.py&amp;quot;&lt;br /&gt;
## typ in de Text Editor:      &amp;lt;code&amp;gt;print(“Hello”)&amp;lt;/code&amp;gt;&lt;br /&gt;
# Voeg aan Robot_11 een Python controller: &amp;lt;br&amp;gt; [[Bestand:Les3-robot11-python-controller.png|350px|Voeg Python controller toe]]&lt;br /&gt;
# Selecteer als script voor deze Python-controller: &amp;quot;Text.py&amp;quot;&lt;br /&gt;
# Link de controller met de sensor: &amp;lt;br&amp;gt; [[Bestand:Les3-robot11-sensor-controller.png|700px|Link sensor en controller]]&lt;br /&gt;
# Ga na de spel modus (of, voor OS X, naar de Terminal) en kijk naar de console. Dit moet er nu in de console te zien zijn: &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Blender Game Engine Started&lt;br /&gt;
Hello&lt;br /&gt;
Blender Game Engine Finished&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ontwikkelen van een controller in Python ==&lt;br /&gt;
 &lt;br /&gt;
Nu je weet hoe je Python aan Blender moet koppelen, kunnen we een Python controller maken. We gaan Morsy, nu genaamd Robot_11, naar een kast laten lopen om een artikel op te halen en in de box te zetten op tafel. Voordat we hieraan kunnen beginnen moeten we begrijpen hoe je sensoren kunt opvangen en actuatoren kunt aansturen via een Python controller.&lt;br /&gt;
&lt;br /&gt;
=== Morsy laten lopen door een Python controller ===&lt;br /&gt;
&lt;br /&gt;
Wat je in deze paragraaf gaat leren lijkt op wat je geleerd hebt in les 2, het autonoom laten ophalen van objecten en naar een bepaald doel brengen, maar nu doen we dat via een Python controller.&lt;br /&gt;
&lt;br /&gt;
==== Stap 1: Onderdelen van een script ====&lt;br /&gt;
Blender heeft al een opzet voor hoe je een robot moet aansturen. Ga in de Tekst editor window naar &amp;lt;code&amp;gt;Templates &amp;gt; Python&amp;gt; GameLogic Simple&amp;lt;/code&amp;gt;. Je ziet nu de volgende code verschijnen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot; line&amp;gt;&lt;br /&gt;
import bge&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
&lt;br /&gt;
    cont = bge.logic.getCurrentController()&lt;br /&gt;
    own = cont.owner&lt;br /&gt;
&lt;br /&gt;
    sens = cont.sensors[&#039;mySensor&#039;]&lt;br /&gt;
    actu = cont.actuators[&#039;myActuator&#039;]&lt;br /&gt;
&lt;br /&gt;
    if sens.positive:&lt;br /&gt;
        cont.activate(actu)&lt;br /&gt;
    else:&lt;br /&gt;
        cont.deactivate(actu)&lt;br /&gt;
&lt;br /&gt;
main()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dit heet een script. Dit script bestaat uit verschillende onderdelen.&lt;br /&gt;
* (r. 1) &amp;lt;code&amp;gt;import bge&amp;lt;/code&amp;gt; importeert de Blender Game Engine module voor Python. In deze module is onder andere de functie &amp;lt;code&amp;gt;logic.getCurrentController()&amp;lt;/code&amp;gt; gedefinieerd.&lt;br /&gt;
* (r. 4-15) De definitie van de functie &amp;lt;code&amp;gt;main()&amp;lt;/code&amp;gt;; &lt;br /&gt;
* (r. 17) Een aanroep van de functie &amp;lt;code&amp;gt;main()&amp;lt;/code&amp;gt;: de opdrachten in de definitie daarvan worden uitgevoerd.&lt;br /&gt;
&lt;br /&gt;
Het is belangrijk om te begrijpen hoe een script werkt. Wanneer deze controller geactiveerd wordt (bijvoorbeeld door een sensor), wordt het script uitgevoerd, en gebeurt er het volgende:&lt;br /&gt;
# &amp;lt;code&amp;gt;import bge&amp;lt;/code&amp;gt;    - Het script importeert de module ‘bge’ en beschikt zo over alle gedefinieerde functies in de bge module.&lt;br /&gt;
# &amp;lt;code&amp;gt;def main():&amp;lt;/code&amp;gt;    - definieert de functie main met de daarop volgende opdrachten. &lt;br /&gt;
# &amp;lt;code&amp;gt;main() &amp;lt;/code&amp;gt;  - aanroep van de functie main. De opdrachten in de definitie (“body”) van de functie main worden uitgevoerd.&lt;br /&gt;
&lt;br /&gt;
=== Stap 2: Sensoren en actuatoren toevoegen ===&lt;br /&gt;
Als we op ENTER (ofwel Return) drukken willen we dat Morsy naar de voorste kast gaat lopen. Ga door de volgende stappen heen om de juiste sensors en actuators toe te voegen:&lt;br /&gt;
# Verander de Always sensor in een Keyboard sensor met als Key de ENTER knop. Geef deze sensor de naam ‘Start’ &lt;br /&gt;
# Voeg een Steering actuator toe. Laat deze de naam ‘Steering’ houden en over de –X as bewegen.&lt;br /&gt;
# Voeg een Collission sensor genaamd ‘AtTarget’ toe link deze aan de Python controller.&lt;br /&gt;
Dit zijn alle actuators en sensors die we nodig hebben om de genoemde taak uit te voeren.&lt;br /&gt;
&lt;br /&gt;
=== Stap 3: Triggers ontvangen en versturen door de Python controller ===&lt;br /&gt;
In de vorige lessen hadden we een sensor, bijvoorbeeld een Keyboard sensor, aan een And controller gekoppeld. Wanneer je de juiste toets aanraakt op je toetsenbord gaat er een positieve ‘trigger’ naar de And controller die de bijbehorende actuator activeert.&lt;br /&gt;
&lt;br /&gt;
Nu moeten we de Start trigger op zien te vangen in de Python controller. Doe dit als volgt:&lt;br /&gt;
&lt;br /&gt;
* Het script moet de &#039;&#039;controller&#039;&#039; kunnen aanroepen waar de sensoren en actuatoren aan gekoppeld zijn. Dit kan door de functie &amp;lt;code&amp;gt;bge.logic.getCurrentController()&amp;lt;/code&amp;gt;&lt;br /&gt;
* Vervolgens moet de controller kunnen herkennen welke van de inkomende sensoren een trigger geeft om een juiste actuator aan te roepen. Je kunt deze sensoren vinden via &amp;lt;code&amp;gt;cont.sensors[“Start”]&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;cont.sensors[“AtTarget”]&amp;lt;/code&amp;gt;&lt;br /&gt;
Om de  code overzichtelijk te houden kun je verwijzingen maken naar de sensoren en actuatoren. Je mag deze namen zelf verzinnen of de volgende gebruiken:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
import bge&lt;br /&gt;
cont = bge.logic.getCurrentController()&lt;br /&gt;
start = cont.sensors[“Start”]&lt;br /&gt;
collision = cont.sensors[“AtTarget”]&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
  # define function main…&lt;br /&gt;
&lt;br /&gt;
main()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*  Bij het indrukken van de ENTER key, willen we dat Morsy zijn taak uit gaat voeren. Zowel het indrukken als het loslaten van de ENTER key geeft een trigger aan de controller. Het indrukken is een positive pulse en loslaten een negative pulse. Via een boolean (met waarde TRUE of FALSE) wordt aangegeven of er een pulse gegeven wordt. We willen dat de main() alleen aangeroepen wordt als start.positive TRUE is. Omdat start.positive een boolean is kun je dit als volgt opschrijven:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
if start.positive&lt;br /&gt;
    main()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
(Let op: een Tab in Python staat gelijk aan 4 spaties en is nodig om aan te geven wat er moet gebeuren als de conditie van de if &amp;lt;code&amp;gt;TRUE&amp;lt;/code&amp;gt; is)&lt;br /&gt;
* Zorg ervoor dat in de definitie van de functie &amp;lt;code&amp;gt;main() &amp;lt;/code&amp;gt; de Steering actuator geactiveerd wordt en naar Shelf_8 toe gaat (de voorste kast). De code ziet er nu als volgt uit:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
import bge&lt;br /&gt;
&lt;br /&gt;
cont = bge.logic.getCurrentController()&lt;br /&gt;
start = cont.sensors[“Start”]&lt;br /&gt;
collision = cont.sensors[“AtTarget”]&lt;br /&gt;
steering - cont.actuators[“Steering”]&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    steering.target = “Shelf_8”&lt;br /&gt;
    cont.activate(steering)&lt;br /&gt;
&lt;br /&gt;
if start.positive:&lt;br /&gt;
    main()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Stap 4: Script afmaken ===&lt;br /&gt;
Wanneer je nu in de play modus gaat en op ENTER drukt zie je dat Morsy naar Shelf_8 gaat lopen.&lt;br /&gt;
&lt;br /&gt;
In deze stap ga je zelf uitzoeken hoe  Morsy heen en weer loopt naar de kast. Het is geen vereiste meer dat de ENTER key voor de start zorgt. Morsy mag gelijk van start gaan in de play modus. Denk zelf na hoe je dit moet doen.&lt;br /&gt;
&lt;br /&gt;
Tips: je moet een Game Property aanmaken voor Desk_11, Shelf_8 en een voor Robot_11 om aan te geven waar hij heen moet lopen. Deze kun je aanroepen en veranderen via de variabele &amp;lt;code&amp;gt;cont.owner[“naam van game propery”]&amp;lt;/code&amp;gt; . Ook moet je in de Collision sensor de Tap button aanklikken om maar 1 trigger te geven bij aanraking van de tafel of kast.&lt;br /&gt;
&lt;br /&gt;
De Start sensor kun je veranderen in een Always sensors zodat Morsy gelijk begint met lopen.&lt;br /&gt;
 &lt;br /&gt;
Het is niet erg als je er zelf nog niet helemaal uit bent gekomen. Juist als het niet werkt zoals je wilt leer je hier meer van doordat je de verkeerde code moet herstellen. Wanneer je er niet uit komt kun je naar onderstaande uitwerking kijken:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
import bge&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    print(&amp;quot;main called&amp;quot;)&lt;br /&gt;
    cont = bge.logic.getCurrentController()&lt;br /&gt;
    own = cont.owner&lt;br /&gt;
&lt;br /&gt;
    collision1 = cont.sensors[&#039;AtTarget&#039;]&lt;br /&gt;
    steering = cont.actuators[&#039;Steering&#039;]&lt;br /&gt;
   &lt;br /&gt;
    if collision1.positive:&lt;br /&gt;
        print(&amp;quot;Collision   target=&amp;quot; + steering.target.name)&lt;br /&gt;
        if steering.target.name == &amp;quot;Shelf_8&amp;quot;:&lt;br /&gt;
            steering.target = &amp;quot;Desk_11&amp;quot;&lt;br /&gt;
            collision1.propName = &amp;quot;Desk&amp;quot;&lt;br /&gt;
        else:&lt;br /&gt;
            steering.target = &amp;quot;Shelf_8&amp;quot;&lt;br /&gt;
            collision1.propName = &amp;quot;Shelf&amp;quot;&lt;br /&gt;
    else:&lt;br /&gt;
        print(&amp;quot;no Collision&amp;quot;)        &lt;br /&gt;
&lt;br /&gt;
    cont.activate(steering)&lt;br /&gt;
&lt;br /&gt;
main()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voor hulp zie: https://www.youtube.com/watch?v=y36ZGsFDA2E&lt;/div&gt;</summary>
		<author><name>Jacqueline</name></author>
	</entry>
	<entry>
		<id>https://infvo.nl/lab/index.php?title=Logistieke_Robots/les_2&amp;diff=461</id>
		<title>Logistieke Robots/les 2</title>
		<link rel="alternate" type="text/html" href="https://infvo.nl/lab/index.php?title=Logistieke_Robots/les_2&amp;diff=461"/>
		<updated>2014-12-17T16:07:03Z</updated>

		<summary type="html">&lt;p&gt;Jacqueline: /* Uiteindelijk resultaat */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Zijbalk Logistieke Robots}}&lt;br /&gt;
&lt;br /&gt;
== Les 2 - Objecten zoeken en verplaatsen ==&lt;br /&gt;
 &lt;br /&gt;
In dit project willen we robots toepassen in de logistieke sector. Wanneer robots actief zijn in de logistieke sector betekent dit vaak dat robots bepaalde objecten moeten zoeken, oppakken en naar een doel moeten brengen. Hoe we een robot moeten aansturen die dit kan gaan we zien in deze les.&lt;br /&gt;
 &lt;br /&gt;
Voor deze les maken we gebruik van het bestand [https://googledrive.com/host/0B4Wf_Tca5KDuNnFUWTc4R09jblU/logistieke-robots/living_room.blend living_room.blend]. Wanneer je het bestand opent zie je een huiskamer en een aantal boeken die rondslingeren in de kamer. We willen dat de robot de boeken kan herkennen, er naar toe kan lopen, op kan pakken en in de boekenkast kan zetten. In paragraaf 1 zullen we de robot aansturen via het toetsenbord en in paragraaf 2 laten we de robot deze taak autonoom (=zelfstandig) uitvoeren.&lt;br /&gt;
&lt;br /&gt;
== Object naar het doel verplaatsten met het toetsenbord ==&lt;br /&gt;
Aan de hand van 5 stappen kunnen we de controller gaan maken. Zorg ervoor dat je eerst zelf nadenkt over de stappen die je uit moet voeren voordat je naar de print kijkt hoe de controller eruit moet zien.&lt;br /&gt;
 &lt;br /&gt;
=== Stap 1: Naar het boek lopen ===&lt;br /&gt;
Wanneer je op Morsy klikt, zie je in de logic editor dat er vier Keyboard sensors aangemaakt zijn. Hier kunnen we Morsy mee naar een boek laten lopen. Als je goed kijkt zie je ook dat er een Game Property aangemaakt is met de naam Morsy. Zo kunnen andere objecten Morsy herkennen. Waarom dit nodig is zien we later.&lt;br /&gt;
 &lt;br /&gt;
=== Stap 2: Boek vastpakken ===&lt;br /&gt;
Omdat Morsy geen armen heeft kan hij het boek niet vasthouden zoals wij dat zouden doen met onze handen. Morsy kan wel naar het boek lopen en wanneer hij contact heeft met het boek kun je je voorstellen dat het boek vast zit aan Morsy door middel van een magneet. Dit kunnen we als volgt doen:&lt;br /&gt;
Ga naar de controller van book_blue_ground en voeg een Collision sensor toe. Geef bij Property aan dat het om Morsy gaat.&lt;br /&gt;
Voeg een Parent actuator toe waarbij je bij Parent Object Morsy selecteert. Verbind de twee met elkaar. Er komt dan automatisch een And controller tussen.&lt;br /&gt;
Wanneer je nu in de spelmodus gaat (druk op P) en naar het blauwe boek loopt, zie je dat het blauwe boek vast blijft zitten aan Morsy. De controller ziet er als volgt uit: &lt;br /&gt;
&lt;br /&gt;
[[Bestand:Les2-book-controller.png|700px]]&lt;br /&gt;
&lt;br /&gt;
=== Stap 3: Naar het doel lopen ===&lt;br /&gt;
Het doel, de kast waar de drie dezelfde boeken wel in de kast staan, kan bereikt worden door middel van het toetsenbord.&lt;br /&gt;
Wanneer Morsy met het boek bij de kast is wil je dat het boek in de kast komt te staan. Het visualiseren van deze actie is niet een van de leerdoelen van dit project. Uiteraard mag je Morsy voorzien van een grijparm en visualiseren hoe Morsy het boek in de kast zet maar dit zal veel tijd in beslag nemen. Daarom gebruiken we een eenvoudiger methode.&lt;br /&gt;
 &lt;br /&gt;
=== Stap 4: Boek in de kast plaatsen ===&lt;br /&gt;
Wanneer Morsy de kast bereikt met een boek, wil je dat dit boek verdwijnt en dat het boek in de kast zichtbaar wordt. Voordat Morsy kan herkennen of er aanraking plaatsvindt met de kast, moet de kast een Game Property hebben.&lt;br /&gt;
&lt;br /&gt;
==== Voeg kast-game property &amp;quot;Goal&amp;quot; toe ====&lt;br /&gt;
Selecteer de kast en voeg een ‘String’ Game Property toe aan de kast met de naam ‘Goal’:&lt;br /&gt;
[[Bestand:Les2-stap4-goal.png|700px|Add property: Goal]]&lt;br /&gt;
&lt;br /&gt;
==== Voeg Morsy-sensoren en actuatoren toe ====&lt;br /&gt;
&lt;br /&gt;
Selecteer nu weer Morsy en voeg een Collision sensor toe en twee Message actuatoren naar het blauwe boek op de grond en in de kast met als Subject ‘Done’: &lt;br /&gt;
[[Bestand:Les2-stap4-done.png|700px|Add message actuators: Done]]&lt;br /&gt;
&lt;br /&gt;
==== Boek op de grond wordt opgepakt (onzichtbaar) ====&lt;br /&gt;
Zorg ervoor dat het blauwe boek op de grond het bericht kan ontvangen en hierna onzichtbaar wordt: &lt;br /&gt;
[[Bestand:Les2-stap4-book.png|700px|Boek wordt onzichtbaar]]&lt;br /&gt;
&lt;br /&gt;
==== Boek in de kast wordt zichtbaar ====&lt;br /&gt;
Zorg er ook voor dat het boek in de kast vanaf het begin onzichtbaar is &lt;br /&gt;
totdat deze het bericht ‘Done’ krijgt van Morsy. Neem zelf even de tijd om te bedenken hoe dit moet. &lt;br /&gt;
[[Bestand:Les2-stap4-shelf.png|700px|Boek wordt in kast zichtbaar]]&lt;br /&gt;
&lt;br /&gt;
=== Uiteindelijk resultaat ===&lt;br /&gt;
Het kan er uiteindelijk als volgt uit zien:  &lt;br /&gt;
&lt;br /&gt;
[[Bestand:Les2-stap5-afronden.png|500px|Morsy verplaatst het boek]]&lt;br /&gt;
Voor hulp zie: https://www.youtube.com/watch?v=nEgubbYwRy0&lt;br /&gt;
&lt;br /&gt;
Wanneer je zelf andere sensoren en actuatoren gebruikt die hetzelfde resultaat als gevolg hebben, mag dit ook.&lt;br /&gt;
&lt;br /&gt;
== Object herkennen met een radar ==&lt;br /&gt;
&lt;br /&gt;
In deze paragraaf leren we hoe Morsy zelf naar de boeken kan lopen zonder aansturing via het toetsenbord. &lt;br /&gt;
Hiervoor moet Morsy tussen verschillende States (toestanden) kunnen schakelen. Morsy moet eerst de kamer afzoeken naar de boeken. Wanneer Morsy een boek gevonden heeft moet hij hier naartoe lopen en erna mogelijk weer verder zoeken om vervolgens de boeken bij de kast af te leveren.&lt;br /&gt;
&lt;br /&gt;
We gebruiken de volgende toestanden (states):&lt;br /&gt;
* 1: zoeken naar boek 1 (met een radar-sensor), bewegen naar het boek, en oppakken van het boek&lt;br /&gt;
* 2: oppakken van boek 1 en in de kast plaatsen&lt;br /&gt;
* 3: zoeken naar boek 2&lt;br /&gt;
* 4: oppakken van boek 4 &lt;br /&gt;
* 5: loop naar de kast en plaats de boeken daarin   &lt;br /&gt;
&lt;br /&gt;
=== Stap 1: Opzetten ===&lt;br /&gt;
In de vorige paragraaf konden wij de boeken zien liggen en Morsy erheen sturen via het toetsenbord. Nu willen we dat Morsy zelf de boeken kan vinden. Geef de boeken die op de grond liggen de Game Property ‘book_1’ en ‘book_2’ en verwijder alle sensorsen en actuators van Morsy.&lt;br /&gt;
&lt;br /&gt;
=== Stap 2: Boeken detecteren ===&lt;br /&gt;
We gaan Morsy voorzien van verschillende Radars die de boeken kunnen detecteren. We voegen eerst een radar toe voor &amp;lt;code&amp;gt;book_1&amp;lt;/code&amp;gt;&lt;br /&gt;
* Om de boeken te kunnen zien met de Radars moet Morsy rondjes draaien. Voeg een Always sensor toe die een Motion actuator activeert waarbij je 2 graden om de Z as beweegt. &lt;br /&gt;
** controleer of deze werkt;&lt;br /&gt;
* Voeg een Radar sensor toe met Property &amp;lt;code&amp;gt;book_1&amp;lt;/code&amp;gt;, over de –X as (&amp;lt;code&amp;gt;-X axis&amp;lt;/code&amp;gt;), een hoek (&amp;lt;code&amp;gt;Angle&amp;lt;/code&amp;gt;) van 50 graden en een afstand (&amp;lt;code&amp;gt;Distance&amp;lt;/code&amp;gt;) van 8 meter. &lt;br /&gt;
** Om de radar te kunnen zien in de 3D view, kun je in de info window van Blender drukken op &amp;lt;code&amp;gt;Game &amp;gt; Show Physics Visualization&amp;lt;/code&amp;gt;. Wanneer je nu naar de spel modus gaat kun je de radar zien.  Je kunt de Physics Visualization hierna weer uitzetten.&lt;br /&gt;
&lt;br /&gt;
=== Stap 3: Boeken ophalen in verschillende states ===&lt;br /&gt;
* Voeg aan Morsy een Integer Game Property toe genaamd ‘number’. Dit is het aantal boeken dat Morsy opgepakt heeft. We laten Morsy de boeken in een speciale volgorde ophalen. Dit is nodig wanneer je met de logic bricks werkt. In de volgende les zien we dat het met Python sneller kan. Wanneer de radar het boek ziet met property &amp;lt;code&amp;gt;book_1&amp;lt;/code&amp;gt; en deze moet ophalen (property number is dan nog 0) gaat Morsy naar state 2. De controller ziet er nu als volgt uit: &amp;lt;br&amp;gt; [[Bestand:Les2-state1.png|700px|Controller state 1]]&lt;br /&gt;
&lt;br /&gt;
Nu moeten we een invulling gaan geven aan de controller in state 2.&lt;br /&gt;
* Druk op het plusje links naast de Controller bar. En ga naar state 2. Initial geeft aan in welke state je begint. &amp;lt;br&amp;gt; In deze state wil je dat Morsy naar een bepaald boek loopt. In dit geval het boek met property book_1. Dit kan met een Steering actuator. Je kan variëren met de snelheid en afstand om het ophalen zo natuurlijk mogelijk te laten verlopen.&lt;br /&gt;
* Wanneer Morsy het boek bereikt heeft moeten er een aantal dingen gebeuren. &lt;br /&gt;
** Morsy moet laten weten aan het boek dat het zich vast moet klampen aan de robot.&lt;br /&gt;
** Vervolgens gaat de number property 1 omhoog zodat Morsy op zoek kan naar het volgende boek wanneer hij teruggezet wordt naar state 1. De controller ziet er nu als volgt uit: &amp;lt;br&amp;gt; [[Bestand:Les2-state2.png|700px|Controller state 2]]  &lt;br /&gt;
* Wanneer we een bericht sturen naar het boek, moeten we de controller van het boek wel aanpassen. De Collision sensor van het boek veranderen we in een Message sensor op de volgende manier: &amp;lt;br&amp;gt;  [[Bestand:Voorbeeld.png]]&lt;br /&gt;
&lt;br /&gt;
Herhaal deze procedure voor boek 2 en 3 (gebruik states 3 en 4 hiervoor). Wanneer Morsy alle boeken gevonden heeft, zal de number property op 3 staan en moet Morsy terug naar de kast. Het lopen naar de kast kan gezien worden als state 5. Voeg in state 1 een property sensor toe. Als deze gelijk is aan 3, zet Morsy dan in state 5.&lt;br /&gt;
&lt;br /&gt;
In state 5 moet je altijd sturen naar de kast. Als je hier bent stuur je een Done message naar alle boeken. Zet Morsy vervolgens in state 6: een lege state. State 5 ziet er als volgt uit:&lt;br /&gt;
[[Bestand:Voorbeeld.png]]&lt;br /&gt;
&lt;br /&gt;
== Plusopdracht ==&lt;br /&gt;
Het is je vast al opgevallen dat het best lastig is om van een toetsenbord controller naar een autonome controller te gaan. In de plusopdracht verbeter je twee aspecten:&lt;br /&gt;
# Wanneer de radar afstand van Morsy kleiner is, moet Morsy naast alleen draaien ook gaan wandelen om de boeken te kunnen detecteren. &lt;br /&gt;
# Met een toetsenbord kun je makkelijker om een obstakel heen navigeren. Nu zal Morsy tegen alles opbotsen wat tussen hem en het doel instaat. Zorg ervoor dat Morsy om obstakels heen kan lopen.&lt;br /&gt;
Als je even niet meer wilt programmeren kun je ook gaan werken met de camera&#039;s&lt;br /&gt;
# Probeer de kamer vanuit Morsy te bekijken. Voor hulp zie: https://www.youtube.com/watch?v=Rmeq85kt8zE&lt;/div&gt;</summary>
		<author><name>Jacqueline</name></author>
	</entry>
	<entry>
		<id>https://infvo.nl/lab/index.php?title=Logistieke_Robots/les_4&amp;diff=460</id>
		<title>Logistieke Robots/les 4</title>
		<link rel="alternate" type="text/html" href="https://infvo.nl/lab/index.php?title=Logistieke_Robots/les_4&amp;diff=460"/>
		<updated>2014-12-17T16:06:25Z</updated>

		<summary type="html">&lt;p&gt;Jacqueline: /* Stap 3: Programmeren script “central_controller.py” */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Zijbalk Logistieke Robots}}&lt;br /&gt;
&lt;br /&gt;
== Les 4 ==&lt;br /&gt;
&lt;br /&gt;
In de vorige les heb je de basis geleerd om een controller te ontwikkelen met behulp van Python. We hebben ook de omgeving geïntroduceerd waar we de rest van het project mee blijven werken: een magazijn. De robots krijgen bestellingen binnen die uit verschillende artikelen bestaan. Ze moeten deze artikelen gaan verzamelen om de bestelling compleet te maken. Dit kan natuurlijk op meerdere manieren: een robot kan de artikelen 1 voor 1 ophalen, allemaal in 1 keer of misschien kan deze robot maar een maximaal aantal artikelen tillen, of een maximaal gewicht. Als de bestelling compleet is, krijgt een robot een nieuwe bestelling.&lt;br /&gt;
&lt;br /&gt;
In deze les leren we hoe we een controller kunnen maken voor 1 robot die de artikelen 1 voor 1 ophaalt. Open de file “[https://googledrive.com/host/0B4Wf_Tca5KDuNnFUWTc4R09jblU/logistieke-robots/warehouse_one_order.blend warehouse_one_order.blend]”.&lt;br /&gt;
Wat je in deze les ontwikkelt, gebruik je in de volgende lessen als basis om op door werken.&lt;br /&gt;
&lt;br /&gt;
== Sturen van de bestelling door centrale systeem ==&lt;br /&gt;
Een robot moet een bestelling doorkrijgen van een computer die het overzicht heeft over alle bestellingen. Deze controller moeten we aan een centraal object in Blender toegevoegen. We kiezen hiervoor de vloer (Ground object).&lt;br /&gt;
&lt;br /&gt;
Net als in de vorige les ontwikkelen we de controller via de logic bricks en via Python scripting. &lt;br /&gt;
&lt;br /&gt;
=== Stap 1: Python script aanmaken voor Ground object ===&lt;br /&gt;
* Selecteer het Ground object;&lt;br /&gt;
* Maak een nieuw Python script aan door op het ‘+ New’ teken te drukken in de header van de tekst editor. Geef het script de naam “central_controller.py”;&lt;br /&gt;
* Voeg een Python controller aan met dit script.&lt;br /&gt;
&lt;br /&gt;
=== Stap 2: Logic bricks voor Ground object ===&lt;br /&gt;
* Voeg een keyboard “Start” sensor toe met de ENTER key. Druk op Tap. Dit betekent dat de sensor eenmalig een positieve puls geeft aan de controller in plaats van zolang de sensor waar is.  &lt;br /&gt;
&lt;br /&gt;
[[Bestand:Les4-keyboard-tap.png|350px|Keyboard controller met tap-instelling]]&lt;br /&gt;
&lt;br /&gt;
* Verbind deze sensor met de Python-controller van de vorige stap.&lt;br /&gt;
&lt;br /&gt;
=== Stap 3: Programmeren script “central_controller.py” ===&lt;br /&gt;
In deze stap programmeren we de centrale controller die de bestellingen verstuurt aan de robot. Hier zullen we voor het eerst ingewikkeldere Python kennis gebruiken. Het script bouwen we op de volgende manier op:&lt;br /&gt;
&lt;br /&gt;
* Importeren van de nodige packages, ophalen van de controller en het object en declareren van de sensor. Dit hebben we ook gezien in de vorige les.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
import bge&lt;br /&gt;
import GameLogic&lt;br /&gt;
import random&lt;br /&gt;
&lt;br /&gt;
cont = bge.logic.getCurrentController()  # controller of this script&lt;br /&gt;
central = cont.owner                     # game object owning this controller&lt;br /&gt;
&lt;br /&gt;
# get sensors&lt;br /&gt;
sens = cont.sensors[&amp;quot;Start&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Definiëren van variabelen. We hebben al gezien dat je variabelen kunt definiëren door “Game Properties” aan te maken voor een game-object zoals een robot. De vloer is ook een dergelijk game-object waar we een controller en variabelen aan kunnen koppelen.  Deze variabelen kun je aanmaken en een waarde geven via het script met behulp van de volgende code:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
game_object[“naam_variabele”] = waarde&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Belangrijke variabelen in het pakhuis zijn hoeveel boxen er gevuld moeten worden, hoe groot de bestellingen zijn en welke artikelen in deze box kunnen zitten. Dit coderen we dus als volgt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
# define game properties&lt;br /&gt;
central[&amp;quot;boxes_tot&amp;quot;] = 5&lt;br /&gt;
central[&amp;quot;box_size&amp;quot;] = 3&lt;br /&gt;
&lt;br /&gt;
box_articles = [&amp;quot;Shelf_1&amp;quot;, &amp;quot;Shelf_2&amp;quot;, &amp;quot;Shelf_3&amp;quot;, &amp;quot;Shelf_4&amp;quot;, &amp;quot;Shelf_5&amp;quot;, &amp;quot;Shelf_6&amp;quot;, &amp;quot;Shelf_7&amp;quot;, &amp;quot;Shelf_8&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
“boxes_tot” en “box_size” zijn game properties verbonden aan het Ground object. &lt;br /&gt;
&lt;br /&gt;
“box_articles” is een lokale variabele in het script - en geen game-property. Dit is een array van strings: deze declareren we op de manier van Python.&lt;br /&gt;
Shelf_1 tot en met Shelf_8 corresponderen met de kasten die te zien zijn in het pakhuis en iedere kast heeft één soort artikel. Shelf_1 heeft dus een kast vol met artikelen nummer 1.&lt;br /&gt;
  &lt;br /&gt;
* We willen dat het systeem pas begint wanneer we op ENTER drukken. Wanneer deze sensor, “sens”, een positieve puls krijgt, wil je Robot_11 een bestelling (order) meegeven. Dit kan op de volgende manier:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
if sens.positive:&lt;br /&gt;
    robot = &amp;quot;11&amp;quot;&lt;br /&gt;
    Send_order(robot)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
waarin &amp;lt;code&amp;gt;Send_order&amp;lt;/code&amp;gt; als volgt gedefinieerd is:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
def Send_order(robot):&lt;br /&gt;
    order = &amp;quot;&amp;quot;&lt;br /&gt;
    for j in range(central[&amp;quot;box_size&amp;quot;]):&lt;br /&gt;
        order += &amp;quot; &amp;quot; + random.choice(box_articles)&lt;br /&gt;
    GameLogic.sendMessage(&amp;quot;Start&amp;quot;, order , &amp;quot;Robot_&amp;quot;+robot , &amp;quot;Ground&amp;quot;)&lt;br /&gt;
    GameLogic.sendMessage(&amp;quot;Start&amp;quot;, robot , &amp;quot;Robot_&amp;quot;+robot , &amp;quot;Ground&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zoals je kunt zien krijgt de functie Send_order een getal mee van de robot waar de bestelling naar toe moet. Dit doen we omdat we straks meer robots aan gaan sturen met deze functie. &lt;br /&gt;
Vervolgens maken we een order aan. Dit moet in de vorm van een String variabelen omdat we deze anders niet mee kunnen sturen naar de robot. We plakken steeds een willekeurig artikel (tussen 1 en 8) aan de order. Wanneer we de lengte van de order bereikt hebben, in ons geval 3, sturen we de order naar de robot en ook de variabele “robot”. Dit laatste doen we zodat we de robot.py controller kunnen hergebruiken voor alle robots. We hoeven dan niet een aparte python controller te maken voor iedere robot. De sendMessage functie is een functie die Blender al voor ons heeft gemaakt. Aan deze functie moet je de titel geven van de message (let op: de robot moet dus een message “Start” sensor hebben), wat er in de message staat, naar wie de message toe moet en wie deze message stuurt.&lt;br /&gt;
&lt;br /&gt;
hulp: https://www.youtube.com/watch?v=jbsFA7qwFak&lt;/div&gt;</summary>
		<author><name>Jacqueline</name></author>
	</entry>
	<entry>
		<id>https://infvo.nl/lab/index.php?title=Logistieke_Robots/les_1&amp;diff=459</id>
		<title>Logistieke Robots/les 1</title>
		<link rel="alternate" type="text/html" href="https://infvo.nl/lab/index.php?title=Logistieke_Robots/les_1&amp;diff=459"/>
		<updated>2014-12-17T16:01:56Z</updated>

		<summary type="html">&lt;p&gt;Jacqueline: /* Blender interface */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Zijbalk Logistieke Robots}}&lt;br /&gt;
&lt;br /&gt;
== Inhoud les 1 ==&lt;br /&gt;
 &lt;br /&gt;
In deze les leer je hoe je voor een robot eenvoudige “brein software” kunt ontwikkelen in Blender. Deze “Brein software” zullen we vanaf nu een controller noemen. Je gaat eerst een controller ontwikkelen die je kunt aansturen via het toetsenbord.&lt;br /&gt;
In latere lessen zul je deze controller verder automatiseren, door middel van een Python-programma, zodat de robot zelfstandig (autonoom) aan de slag kan.&lt;br /&gt;
&lt;br /&gt;
Voordat je hiermee kunnen starten moet je ervoor zorgen dat Blender op je systeem geïnstalleerd is. [[../Blender installeren|Installeren Blender]]&lt;br /&gt;
&lt;br /&gt;
== Werken met Blender ==&lt;br /&gt;
&lt;br /&gt;
Het openen van Blender kan wat overweldigend zijn. Er zijn erg veel knoppen en getallen te zien en dit is nog niet alles. Voor dit project gebruiken we lang niet alle mogelijkheden die Blender heeft. We bespreken daarom ook niet alle knoppen die je nu ziet. Veel van de uitleg in deze paragraaf is overgenomen van http://wiki.blender.org/index.php/Doc:NL/2.6/Manual.&lt;br /&gt;
&lt;br /&gt;
Mocht je geïnteresseerd zijn in alle mogelijkheden van Blender kun je op deze site kijken. Ook zijn er mensen die graag hun creaties in Blender willen delen via het internet. We zullen hier verderop ook gebruik van maken.&lt;br /&gt;
&lt;br /&gt;
=== Blender interface ===&lt;br /&gt;
&lt;br /&gt;
De pop-up is het opstartscherm. Hier kun je recent geopende bestanden zien als je die hebt. Wanneer je een nieuw bestand wilt beginnen klik je ergens buiten het opstartscherm. Nu is de standaard lay-out zichtbaar met een kubus voorzien van assen. De standaard lay-out kan opgedeeld worden in verschillende vensters. Deze vensters, inclusief de meest gebruikte basiselementen, zijn aangegeven in figuur 1.&lt;br /&gt;
&lt;br /&gt;
[[Bestand:Blender-vensters.png|600px|Blender vensters]]&lt;br /&gt;
&lt;br /&gt;
Figuur 1&lt;br /&gt;
 &lt;br /&gt;
De vijf vensters in het startscherm zijn:&lt;br /&gt;
* Info Window: bovenaan het scherm, bestaande uit alleen een header&lt;br /&gt;
* 3D Window: hier kun je de uiteindelijke robots in actie zien&lt;br /&gt;
* Timeline Window: deze zullen we in dit project niet gebruiken&lt;br /&gt;
* Outliner Window: dit scherm geeft alle gemaakte objecten (inclusief de robots) weer in de omgeving&lt;br /&gt;
* Properties Window: hier kun je kenmerken van objecten wijzigen (bijvoorbeeld kleur en naam)&lt;br /&gt;
Er zijn meerdere Windows die je kan weergeven in je scherm. Het type venster kun je wijzigen door het Window Type te veranderen, te vinden in de linkerhoek van de headers van de windows.&lt;br /&gt;
Voor hulp zie: https://www.youtube.com/watch?v=TLJThln4eOE&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
De meest gebruikte basiselementen zijn:&lt;br /&gt;
* Current Screen Layout: Blender heeft passende startschermen voor verschillende gebruiksdoeleinden. Wij gebruiken Default of Scripting.&lt;br /&gt;
* Current Scene: je kunt verschillende 3D windows ontwikkelen. Dit zijn scenes. Wij zullen maar een Scene ontwikkelen&lt;br /&gt;
* Current Rendering Engine:&lt;br /&gt;
* Toggle Fullscreen: schakel de fullscreen mode aan/uit&lt;br /&gt;
* 3D Transform Manipulator: visueel hulpmiddel bij het transformeren van objecten (grab/verplaatsen, roteren en schalen). Dit kan ook met behulp van het toetsenbord (G, R, S)&lt;br /&gt;
* 3D cursor: heeft meerdere functies. Nieuwe objecten worden hier bijvoorbeeld geplaats en het geeft aan waar het rotatiepunt zit&lt;br /&gt;
* Cube Mesh / Light / Camera: bij het openen van een nieuw bestand in Blender is er standaard Cube Mesh, een Light en een Camera aanwezig&lt;br /&gt;
* Selected object: dit veld toont de naam van het huidige geselecteerde object&lt;br /&gt;
* 3D Window Header: alle vensters in Blender hebben een header, maar deze zit aan de onderkant. Hij bestaat onder andere uit:&lt;br /&gt;
** Viewport shading: hiermee kan het shading type aangegeven worden. Deze functie zal niet aangepast worden tijdens dit project&lt;br /&gt;
** Layers: wanneer je vele objecten hebt gecreëerd kan het makkelijk zijn om deze te ordenen in functionele groepen (robots in de ene layer, de omgeving in de andere). Hier zullen we geen gebruik van maken&lt;br /&gt;
* Buttons (Properties) Window Header: dit venster toont panels en deze panels zijn gegroepeerd. Om een andere groep te zien kunnen de knoppen in de header aangeklikt worden &amp;lt;br&amp;gt; [[Bestand:venster-knoppen.png|400px|Venster-knoppen]]&lt;br /&gt;
* Outliner Window: dit venster laat alle objecten in een scene zien.&lt;br /&gt;
* Timeline Window: Dit venster laat een tijdlijn zien die gebruikt kan worden voor karakter animaties. Dit zullen we niet gaan toepassen in dit project&lt;br /&gt;
* Window types: zoals eerder gezegd zijn er vele mogelijke vensters. Ieder venster werkt onafhankelijk van de anderen en het is mogelijk om het zelfde type venster meerdere keren open te hebben. We zullen niet alle types gebruiken. Degene die we wel gaan gebruiken, naast de basis schermen, zijn:&lt;br /&gt;
** Logic Editor: hiermee kan een controller gemaakt worden&lt;br /&gt;
** Text editor: hier schrijven we Python code&lt;br /&gt;
** Console: hier kun je de output zien van de Python code.&lt;br /&gt;
&lt;br /&gt;
===  Besturen van het 3D scherm ===&lt;br /&gt;
&lt;br /&gt;
Alle handelingen in Blender kun je doen door te werken met de muis. Voor iedere handeling is er ook een shortcut beschikbaar via het keyboard. Blender maakt gebruik van alle functies op een muis. Om deze reden is het aan te raden dat je een uitgebreide muis gebruikt (met een scrol functie die ingedrukt kan worden) voor de Windows computer. Voor de Mac is de touchpad toereikend. Gedurende dit project zullen we onderstaande codes gebruikten om te refereren naar handelingen met de muis.&lt;br /&gt;
* LMB  - Linker muisknop&lt;br /&gt;
* MMB  - Druk op het scroll wiel alsof het een knop is&lt;br /&gt;
* RMB  - Rechter muisknop&lt;br /&gt;
* Wheel  - Scrol wiel&lt;br /&gt;
 &lt;br /&gt;
De muis gebruik je voornamelijk om de 3D view te besturen&lt;br /&gt;
* MMB: hiermee kun je de scene vanuit alle hoeken bekijken&lt;br /&gt;
* Wheel: in/uitzoomen&lt;br /&gt;
* LMB: vastpakken van een object&lt;br /&gt;
* RMB: selecteren van een object&lt;br /&gt;
&lt;br /&gt;
De opdrachten hebben altijd betrekking op het subvenster waar de cursor staat. Je kunt bijvoorbeeld zowel in het 3D View als in het logic control venster in- en uitzoomen.&lt;br /&gt;
&lt;br /&gt;
== Aansturen van Morsy de Robot ==&lt;br /&gt;
[[Bestand:Morsy.png|thumb|200px|right|Morsy]]&lt;br /&gt;
&lt;br /&gt;
Nu gaan we echt aan de slag met Blender. We gaan een robot aansturen via het toetsenbord. Voordat we een robot kunnen aansturen moeten we er natuurlijk een hebben.&lt;br /&gt;
We gebruiken, om snel aan de slag te kunnen met de controller, een robot die al is ontwikkeld genaamd Morsy. Morsy komt uit de MORSE code, de Modular OpenRobots Simulation Engine. (https://www.openrobots.org/wiki/morse/)&lt;br /&gt;
Een plaatje van Morsy zie je hiernaast.&lt;br /&gt;
&lt;br /&gt;
Merk op dat deze logistieke robot geen armen heeft. Het oppakken van objecten om te verplaatsen zal dus meer symbolisch zijn. Het is mogelijk om armen met een animatie toe te voegen om een object op te pakken. Omdat dit niet het doel is van het project zullen we dit niet behandelen.&lt;br /&gt;
&lt;br /&gt;
=== Stap 1 ===&lt;br /&gt;
Open [https://googledrive.com/host/0B4Wf_Tca5KDuNnFUWTc4R09jblU/logistieke-robots/morsy.blend morsy.blend] (je moet deze eerst naar je eigen computer downloaden).&lt;br /&gt;
Je ziet dat we te maken hebben met dezelfde basis omgeving maar dat de Cube Mesh vervangen is door de Morsy robot.&lt;br /&gt;
&lt;br /&gt;
=== Stap 2 ===&lt;br /&gt;
Verander zonodig het window type van de timeline window (links onder) naar de logic editor (zie hiernaast).&lt;br /&gt;
&lt;br /&gt;
[[Bestand:Selecteer-logic-editor.png|thumb|200px|right|Selecteer Logic Editor]]&lt;br /&gt;
&lt;br /&gt;
=== Stap 3 ===&lt;br /&gt;
Maak de ruimte voor de logic editor iets groter en zoom indien nodig in (met de muis/touch pad) zodat de letters leesbaar zijn. Je kunt nu zien dat de logic editor bestaat uit sensoren, controllers en actuatoren. Sensoren zijn gebeurtenissen die Morsy kan waarnemen vanuit de omgeving. De controller bepaalt hoe je op deze gebeurtenis ingaat om zo eventueel een actuator aan te sturen.&lt;br /&gt;
&lt;br /&gt;
=== Stap 4: controller, sturen naar rechts ===&lt;br /&gt;
We kunnen nu de controller gaan maken. We willen de robot aansturen met de pijltjes op het toetsenbord. Iedere toets is dan een sensor. Wanneer deze sensor actief is (en dus ingedrukt wordt) moet de robot een bepaalde kant op gaan lopen. We beginnen met naar rechts lopen&lt;br /&gt;
Wanneer we de toets → indrukken willen we dat Morsy naar rechts gaat lopen (voor Morsy zelf is dit naar links). In de linker beneden hoek van het 3D scherm zien we de assen waarover de robot kan bewegen. We zien dat we Morsy moeten laten lopen over de –X as om deze naar rechts te laten gaan. Dit gaat als volgt:&lt;br /&gt;
* Voor het aanmaken van deze actie moeten we een sensor hebben die detecteert of we de toets → indrukken. Klik op “Add Sensor” en dan op Keyboard.&lt;br /&gt;
* Geef de Keyboard de naam “Right” en ga erna in het vakje “Key” staan waardoor je ziet “Press a key” en druk op →&lt;br /&gt;
* Ga naar “Add Controller” en voeg een “And” controller toe. Maak een link tussen de sensor en controller door de twee punten met elkaar te verbinden. Het moet er nu als volgt uit zien: &amp;lt;br&amp;gt; [[Bestand:Les1-keyboard-controller.png|700px|Keyboard sensor en controller]] &amp;lt;br&amp;gt; Wanneer we op de → toets drukken geeft dit een positief signaal aan de controller. De controller moet positieve signalen ontvangen van alle sensoren die verbonden zijn met deze controller om zelf een positief signaal door te kunnen geven. Dit is er nu maar 1. Wanneer alleen de toets → ingedrukt wordt geeft de controller dus een positief signaal.&lt;br /&gt;
*  Nu gaan we de controller verbinden aan een actie: lopen. Ga naar “Add Actuator” en voeg een “Motion” actuator toe. Geef deze ook de naam “Right” en een X loc waarde van -0.3. Druk ook op de L achter deze regel. Dit geeft aan dat we willen bewegen ten opzichte van de assen en niet ten opzichte van de locatie van Morsy zelf.  Maak een link tussen de controller en actuator. &amp;lt;br&amp;gt; [[Bestand:Les1-motion-actuator.png|700px|Add motion actuator]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Toevoegen van de vloer ====&lt;br /&gt;
Graag willen we nu weten of de robot naar rechts kan lopen. Als we nu in de “play” modus zouden gaan, zou de robot naar beneden vallen omdat we nog geen vloer hebben toegevoegd. Je zet Blender in de “play” modus door met de muis in het 3D view te staan en dan op ‘P’ te drukken. Je komt weer uit deze modus door op ‘Esc’ te drukken.&lt;br /&gt;
Voeg een vloer toe door in de header van de 3D view te klikken op “Add”, dan op “Mesh” en dan op “Plane”.&lt;br /&gt;
&lt;br /&gt;
[[Bestand:Les1-add-plane.png|350px|Add plane]]&lt;br /&gt;
   &lt;br /&gt;
Verschuif het vierkant onder Morsy door op de assen te klikken en de grond te verschuiven. Druk op “S” en gebruik de “Wheel” om de grond groter te maken.&lt;br /&gt;
Verander de kleur van de vloer door in het property venster te gaan naar:&lt;br /&gt;
&lt;br /&gt;
[[Bestand:Les1-plane-newmaterial.png|350px|Add new material]]&lt;br /&gt;
&lt;br /&gt;
en klik op “+ New”. Bij diffuse kun je een kleur uitkiezen.&lt;br /&gt;
Als het goed is ziet het 3D window er nu als volgt uit:&lt;br /&gt;
&lt;br /&gt;
[[Bestand:Les1-morsy-floor.png|700px|Morsy op het speelveld]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Druk nu op “P” en kijk of Morsy naar rechts beweegt bij het indrukken van de pijl naar rechts. Wanneer je dit getest hebt, druk weer op “Esc”. Wanneer Morsy niet naar rechts loopt, moet je stap 4 nogmaals doorlopen om te zien of je alles juist ingevoerd hebt.&lt;br /&gt;
* als Morsy naar links loopt, moet je het teken van de X-verplaatsing veranderen (bijv. van 0.2 naar -0.2);&lt;br /&gt;
* als Morse te snel of te langzaam loopt, moet je de verplaatsing kleiner of groter maken (bijv. van 0.4 naar 0.2);&lt;br /&gt;
* als er helemaal niets gebeurt, moet je controleren of je (i) de juiste toets ingevoerd hebt, in de Keyboard sensor; (ii) of je de verbinding tussen sensor en controller en controller en actuator gemaakt hebt;&lt;br /&gt;
&lt;br /&gt;
=== Stap 5: sturen naar links, achter en voor  ===&lt;br /&gt;
Zorg ervoor dat Morsy ook naar links, achter en naar voren kan lopen door middel van het toetsenbord.&lt;br /&gt;
&lt;br /&gt;
=== Stap 6: bestand opslaan voor vervolg ===&lt;br /&gt;
Sla het bestand op om volgende les mee verder te gaan.&lt;br /&gt;
&lt;br /&gt;
== Plusopdracht ==&lt;br /&gt;
Zorg ervoor dat de robot via het toetsenbord:&lt;br /&gt;
* Een rondje kan draaien om zijn eigen as met de toets ‘R’&lt;br /&gt;
* Kan springen bij wanneer de Spacebar en toets J ingedrukt zijn&lt;br /&gt;
* …&lt;br /&gt;
&lt;br /&gt;
== Referenties ==&lt;br /&gt;
&lt;br /&gt;
* [[../Blender installeren]]&lt;br /&gt;
* MORSE code, de Modular OpenRobots Simulation Engine. (https://www.openrobots.org/wiki/morse/)&lt;/div&gt;</summary>
		<author><name>Jacqueline</name></author>
	</entry>
	<entry>
		<id>https://infvo.nl/lab/index.php?title=Logistieke_Robots/les_2&amp;diff=458</id>
		<title>Logistieke Robots/les 2</title>
		<link rel="alternate" type="text/html" href="https://infvo.nl/lab/index.php?title=Logistieke_Robots/les_2&amp;diff=458"/>
		<updated>2014-12-17T15:59:51Z</updated>

		<summary type="html">&lt;p&gt;Jacqueline: /* Plusopdracht */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Zijbalk Logistieke Robots}}&lt;br /&gt;
&lt;br /&gt;
== Les 2 - Objecten zoeken en verplaatsen ==&lt;br /&gt;
 &lt;br /&gt;
In dit project willen we robots toepassen in de logistieke sector. Wanneer robots actief zijn in de logistieke sector betekent dit vaak dat robots bepaalde objecten moeten zoeken, oppakken en naar een doel moeten brengen. Hoe we een robot moeten aansturen die dit kan gaan we zien in deze les.&lt;br /&gt;
 &lt;br /&gt;
Voor deze les maken we gebruik van het bestand [https://googledrive.com/host/0B4Wf_Tca5KDuNnFUWTc4R09jblU/logistieke-robots/living_room.blend living_room.blend]. Wanneer je het bestand opent zie je een huiskamer en een aantal boeken die rondslingeren in de kamer. We willen dat de robot de boeken kan herkennen, er naar toe kan lopen, op kan pakken en in de boekenkast kan zetten. In paragraaf 1 zullen we de robot aansturen via het toetsenbord en in paragraaf 2 laten we de robot deze taak autonoom (=zelfstandig) uitvoeren.&lt;br /&gt;
&lt;br /&gt;
== Object naar het doel verplaatsten met het toetsenbord ==&lt;br /&gt;
Aan de hand van 5 stappen kunnen we de controller gaan maken. Zorg ervoor dat je eerst zelf nadenkt over de stappen die je uit moet voeren voordat je naar de print kijkt hoe de controller eruit moet zien.&lt;br /&gt;
 &lt;br /&gt;
=== Stap 1: Naar het boek lopen ===&lt;br /&gt;
Wanneer je op Morsy klikt, zie je in de logic editor dat er vier Keyboard sensors aangemaakt zijn. Hier kunnen we Morsy mee naar een boek laten lopen. Als je goed kijkt zie je ook dat er een Game Property aangemaakt is met de naam Morsy. Zo kunnen andere objecten Morsy herkennen. Waarom dit nodig is zien we later.&lt;br /&gt;
 &lt;br /&gt;
=== Stap 2: Boek vastpakken ===&lt;br /&gt;
Omdat Morsy geen armen heeft kan hij het boek niet vasthouden zoals wij dat zouden doen met onze handen. Morsy kan wel naar het boek lopen en wanneer hij contact heeft met het boek kun je je voorstellen dat het boek vast zit aan Morsy door middel van een magneet. Dit kunnen we als volgt doen:&lt;br /&gt;
Ga naar de controller van book_blue_ground en voeg een Collision sensor toe. Geef bij Property aan dat het om Morsy gaat.&lt;br /&gt;
Voeg een Parent actuator toe waarbij je bij Parent Object Morsy selecteert. Verbind de twee met elkaar. Er komt dan automatisch een And controller tussen.&lt;br /&gt;
Wanneer je nu in de spelmodus gaat (druk op P) en naar het blauwe boek loopt, zie je dat het blauwe boek vast blijft zitten aan Morsy. De controller ziet er als volgt uit: &lt;br /&gt;
&lt;br /&gt;
[[Bestand:Les2-book-controller.png|700px]]&lt;br /&gt;
&lt;br /&gt;
=== Stap 3: Naar het doel lopen ===&lt;br /&gt;
Het doel, de kast waar de drie dezelfde boeken wel in de kast staan, kan bereikt worden door middel van het toetsenbord.&lt;br /&gt;
Wanneer Morsy met het boek bij de kast is wil je dat het boek in de kast komt te staan. Het visualiseren van deze actie is niet een van de leerdoelen van dit project. Uiteraard mag je Morsy voorzien van een grijparm en visualiseren hoe Morsy het boek in de kast zet maar dit zal veel tijd in beslag nemen. Daarom gebruiken we een eenvoudiger methode.&lt;br /&gt;
 &lt;br /&gt;
=== Stap 4: Boek in de kast plaatsen ===&lt;br /&gt;
Wanneer Morsy de kast bereikt met een boek, wil je dat dit boek verdwijnt en dat het boek in de kast zichtbaar wordt. Voordat Morsy kan herkennen of er aanraking plaatsvindt met de kast, moet de kast een Game Property hebben.&lt;br /&gt;
&lt;br /&gt;
==== Voeg kast-game property &amp;quot;Goal&amp;quot; toe ====&lt;br /&gt;
Selecteer de kast en voeg een ‘String’ Game Property toe aan de kast met de naam ‘Goal’:&lt;br /&gt;
[[Bestand:Les2-stap4-goal.png|700px|Add property: Goal]]&lt;br /&gt;
&lt;br /&gt;
==== Voeg Morsy-sensoren en actuatoren toe ====&lt;br /&gt;
&lt;br /&gt;
Selecteer nu weer Morsy en voeg een Collision sensor toe en twee Message actuatoren naar het blauwe boek op de grond en in de kast met als Subject ‘Done’: &lt;br /&gt;
[[Bestand:Les2-stap4-done.png|700px|Add message actuators: Done]]&lt;br /&gt;
&lt;br /&gt;
==== Boek op de grond wordt opgepakt (onzichtbaar) ====&lt;br /&gt;
Zorg ervoor dat het blauwe boek op de grond het bericht kan ontvangen en hierna onzichtbaar wordt: &lt;br /&gt;
[[Bestand:Les2-stap4-book.png|700px|Boek wordt onzichtbaar]]&lt;br /&gt;
&lt;br /&gt;
==== Boek in de kast wordt zichtbaar ====&lt;br /&gt;
Zorg er ook voor dat het boek in de kast vanaf het begin onzichtbaar is &lt;br /&gt;
totdat deze het bericht ‘Done’ krijgt van Morsy. Neem zelf even de tijd om te bedenken hoe dit moet. &lt;br /&gt;
[[Bestand:Les2-stap4-shelf.png|700px|Boek wordt in kast zichtbaar]]&lt;br /&gt;
&lt;br /&gt;
=== Uiteindelijk resultaat ===&lt;br /&gt;
Het kan er uiteindelijk als volgt uit zien:  &lt;br /&gt;
&lt;br /&gt;
[[Bestand:Les2-stap5-afronden.png|500px|Morsy verplaatst het boek]]&lt;br /&gt;
&lt;br /&gt;
Wanneer je zelf andere sensoren en actuatoren gebruikt die hetzelfde resultaat als gevolg hebben, mag dit ook.&lt;br /&gt;
&lt;br /&gt;
== Object herkennen met een radar ==&lt;br /&gt;
&lt;br /&gt;
In deze paragraaf leren we hoe Morsy zelf naar de boeken kan lopen zonder aansturing via het toetsenbord. &lt;br /&gt;
Hiervoor moet Morsy tussen verschillende States (toestanden) kunnen schakelen. Morsy moet eerst de kamer afzoeken naar de boeken. Wanneer Morsy een boek gevonden heeft moet hij hier naartoe lopen en erna mogelijk weer verder zoeken om vervolgens de boeken bij de kast af te leveren.&lt;br /&gt;
&lt;br /&gt;
We gebruiken de volgende toestanden (states):&lt;br /&gt;
* 1: zoeken naar boek 1 (met een radar-sensor), bewegen naar het boek, en oppakken van het boek&lt;br /&gt;
* 2: oppakken van boek 1 en in de kast plaatsen&lt;br /&gt;
* 3: zoeken naar boek 2&lt;br /&gt;
* 4: oppakken van boek 4 &lt;br /&gt;
* 5: loop naar de kast en plaats de boeken daarin   &lt;br /&gt;
&lt;br /&gt;
=== Stap 1: Opzetten ===&lt;br /&gt;
In de vorige paragraaf konden wij de boeken zien liggen en Morsy erheen sturen via het toetsenbord. Nu willen we dat Morsy zelf de boeken kan vinden. Geef de boeken die op de grond liggen de Game Property ‘book_1’ en ‘book_2’ en verwijder alle sensorsen en actuators van Morsy.&lt;br /&gt;
&lt;br /&gt;
=== Stap 2: Boeken detecteren ===&lt;br /&gt;
We gaan Morsy voorzien van verschillende Radars die de boeken kunnen detecteren. We voegen eerst een radar toe voor &amp;lt;code&amp;gt;book_1&amp;lt;/code&amp;gt;&lt;br /&gt;
* Om de boeken te kunnen zien met de Radars moet Morsy rondjes draaien. Voeg een Always sensor toe die een Motion actuator activeert waarbij je 2 graden om de Z as beweegt. &lt;br /&gt;
** controleer of deze werkt;&lt;br /&gt;
* Voeg een Radar sensor toe met Property &amp;lt;code&amp;gt;book_1&amp;lt;/code&amp;gt;, over de –X as (&amp;lt;code&amp;gt;-X axis&amp;lt;/code&amp;gt;), een hoek (&amp;lt;code&amp;gt;Angle&amp;lt;/code&amp;gt;) van 50 graden en een afstand (&amp;lt;code&amp;gt;Distance&amp;lt;/code&amp;gt;) van 8 meter. &lt;br /&gt;
** Om de radar te kunnen zien in de 3D view, kun je in de info window van Blender drukken op &amp;lt;code&amp;gt;Game &amp;gt; Show Physics Visualization&amp;lt;/code&amp;gt;. Wanneer je nu naar de spel modus gaat kun je de radar zien.  Je kunt de Physics Visualization hierna weer uitzetten.&lt;br /&gt;
&lt;br /&gt;
=== Stap 3: Boeken ophalen in verschillende states ===&lt;br /&gt;
* Voeg aan Morsy een Integer Game Property toe genaamd ‘number’. Dit is het aantal boeken dat Morsy opgepakt heeft. We laten Morsy de boeken in een speciale volgorde ophalen. Dit is nodig wanneer je met de logic bricks werkt. In de volgende les zien we dat het met Python sneller kan. Wanneer de radar het boek ziet met property &amp;lt;code&amp;gt;book_1&amp;lt;/code&amp;gt; en deze moet ophalen (property number is dan nog 0) gaat Morsy naar state 2. De controller ziet er nu als volgt uit: &amp;lt;br&amp;gt; [[Bestand:Les2-state1.png|700px|Controller state 1]]&lt;br /&gt;
&lt;br /&gt;
Nu moeten we een invulling gaan geven aan de controller in state 2.&lt;br /&gt;
* Druk op het plusje links naast de Controller bar. En ga naar state 2. Initial geeft aan in welke state je begint. &amp;lt;br&amp;gt; In deze state wil je dat Morsy naar een bepaald boek loopt. In dit geval het boek met property book_1. Dit kan met een Steering actuator. Je kan variëren met de snelheid en afstand om het ophalen zo natuurlijk mogelijk te laten verlopen.&lt;br /&gt;
* Wanneer Morsy het boek bereikt heeft moeten er een aantal dingen gebeuren. &lt;br /&gt;
** Morsy moet laten weten aan het boek dat het zich vast moet klampen aan de robot.&lt;br /&gt;
** Vervolgens gaat de number property 1 omhoog zodat Morsy op zoek kan naar het volgende boek wanneer hij teruggezet wordt naar state 1. De controller ziet er nu als volgt uit: &amp;lt;br&amp;gt; [[Bestand:Les2-state2.png|700px|Controller state 2]]  &lt;br /&gt;
* Wanneer we een bericht sturen naar het boek, moeten we de controller van het boek wel aanpassen. De Collision sensor van het boek veranderen we in een Message sensor op de volgende manier: &amp;lt;br&amp;gt;  [[Bestand:Voorbeeld.png]]&lt;br /&gt;
&lt;br /&gt;
Herhaal deze procedure voor boek 2 en 3 (gebruik states 3 en 4 hiervoor). Wanneer Morsy alle boeken gevonden heeft, zal de number property op 3 staan en moet Morsy terug naar de kast. Het lopen naar de kast kan gezien worden als state 5. Voeg in state 1 een property sensor toe. Als deze gelijk is aan 3, zet Morsy dan in state 5.&lt;br /&gt;
&lt;br /&gt;
In state 5 moet je altijd sturen naar de kast. Als je hier bent stuur je een Done message naar alle boeken. Zet Morsy vervolgens in state 6: een lege state. State 5 ziet er als volgt uit:&lt;br /&gt;
[[Bestand:Voorbeeld.png]]&lt;br /&gt;
&lt;br /&gt;
== Plusopdracht ==&lt;br /&gt;
Het is je vast al opgevallen dat het best lastig is om van een toetsenbord controller naar een autonome controller te gaan. In de plusopdracht verbeter je twee aspecten:&lt;br /&gt;
# Wanneer de radar afstand van Morsy kleiner is, moet Morsy naast alleen draaien ook gaan wandelen om de boeken te kunnen detecteren. &lt;br /&gt;
# Met een toetsenbord kun je makkelijker om een obstakel heen navigeren. Nu zal Morsy tegen alles opbotsen wat tussen hem en het doel instaat. Zorg ervoor dat Morsy om obstakels heen kan lopen.&lt;br /&gt;
Als je even niet meer wilt programmeren kun je ook gaan werken met de camera&#039;s&lt;br /&gt;
# Probeer de kamer vanuit Morsy te bekijken. Voor hulp zie: https://www.youtube.com/watch?v=Rmeq85kt8zE&lt;/div&gt;</summary>
		<author><name>Jacqueline</name></author>
	</entry>
	<entry>
		<id>https://infvo.nl/lab/index.php?title=Logistieke_Robots&amp;diff=455</id>
		<title>Logistieke Robots</title>
		<link rel="alternate" type="text/html" href="https://infvo.nl/lab/index.php?title=Logistieke_Robots&amp;diff=455"/>
		<updated>2014-12-17T15:42:54Z</updated>

		<summary type="html">&lt;p&gt;Jacqueline: /* Over het project */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Zijbalk Logistieke Robots}}&lt;br /&gt;
&lt;br /&gt;
== Over het project==&lt;br /&gt;
[[Bestand:stofzuig_robot.png|thumb|200px|right|zie: https://www.youtube.com/watch?v=hKzMWGVi-YM]] &lt;br /&gt;
&lt;br /&gt;
We zien robots steeds meer in ons dagelijkse leven verschijnen, van simpele stofzuigers (zie rechts voor link) tot zelf rijdende auto’s. Deze robots moeten over een passende intelligentie beschikken om hun taak goed uit te kunnen voeren. Robots worden in vele sectoren in het bedrijfsleven gebruikt waaronder de logistieke sector. Een goed voorbeeld hiervan is de Kiva robot. Deze robot helpt werknemers bestellingen in te pakken in een pakhuis (zie rechts voor link).&lt;br /&gt;
[[Bestand:Kiva_Robot.jpg|thumb|200px|right|zie: https://www.youtube.com/watch?v=6KRjuuEVEZs]] &lt;br /&gt;
&lt;br /&gt;
In dit project leer je hoe je soortgelijke “brein software” kan ontwikkelen om een groep robots aan te sturen om bestellingen in te pakken in een magazijn. &lt;br /&gt;
&lt;br /&gt;
=== Blender ===&lt;br /&gt;
&lt;br /&gt;
Het softwareprogramma wat ons hierbij zal ondersteunen is Blender. Blender is gratis, opensource en erg snel te installeren op meerdere platforms (Windows, Mac OS X,Linux).&lt;br /&gt;
&lt;br /&gt;
=== Leerdoelen ===&lt;br /&gt;
&lt;br /&gt;
Na het succesvol afronden van dit project kun je:&lt;br /&gt;
# overweg met het simulatiepakket Blender in combinatie met Python,&lt;br /&gt;
# robot software ontwikkelen voor individuele robots,&lt;br /&gt;
# robot software ontwikkelen voor een samenwerkende robots,&lt;br /&gt;
# zelf verbeterende robot software ontwikkelen voor een groep samenwerkende robots,&lt;br /&gt;
# het experimenteel testen en beoordelen van robot gedrag, &lt;br /&gt;
# het koppelen van bovenstaande aan een werkveld, met name Logistiek.&lt;br /&gt;
&lt;br /&gt;
Het project is opgebouwd uit 8 lessen. Iedere les duurt 2-3 uur. Iedere les heeft een verschillend aantal plusopdrachten waar je tussen de lessen door mee aan de slag kunt.&lt;br /&gt;
De opdrachtomschrijving is getest op een Mac en Windows. Indien je een ander platform gebruikt, kun je wellicht op problemen stuiten. Het wordt dus aangeraden een Mac of Windows computer te gebruiken maar andere platformen zouden ook mogelijk kunnen zijn&lt;br /&gt;
&lt;br /&gt;
Je kan nu beginnen met Les 1!&lt;br /&gt;
&lt;br /&gt;
== Ontwikkeling ==&lt;br /&gt;
Het maken van dit lesmateriaal is mogelijk gemaakt dankzij subsidie van de gemeente Amsterdam. Het project is uitgevoerd aan de Vrije Universiteit Amsterdam, afdeling Computational Intelligence, in samenwerking met ICT in de Wolken Amsterdam.&lt;br /&gt;
&lt;br /&gt;
Voor vragen over de totstandkoming van dit project kunt u terecht bij:&lt;br /&gt;
&lt;br /&gt;
* Jacqueline Heinerman (j.v.heinerman@vu.nl)&lt;br /&gt;
* Eelco Dijkstra (eelco@infvo.com)&lt;br /&gt;
&lt;br /&gt;
== Referenties ==&lt;br /&gt;
* [[/Bestanden]]&lt;/div&gt;</summary>
		<author><name>Jacqueline</name></author>
	</entry>
	<entry>
		<id>https://infvo.nl/lab/index.php?title=Logistieke_Robots&amp;diff=454</id>
		<title>Logistieke Robots</title>
		<link rel="alternate" type="text/html" href="https://infvo.nl/lab/index.php?title=Logistieke_Robots&amp;diff=454"/>
		<updated>2014-12-17T15:42:21Z</updated>

		<summary type="html">&lt;p&gt;Jacqueline: /* Over het project */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Zijbalk Logistieke Robots}}&lt;br /&gt;
&lt;br /&gt;
== Over het project==&lt;br /&gt;
[[Bestand:stofzuig_robot.png|thumb|200px|right|zie: https://www.youtube.com/watch?v=hKzMWGVi-YM]] &lt;br /&gt;
&lt;br /&gt;
We zien robots steeds meer in ons dagelijkse leven verschijnen, van simpele stofzuigers tot zelf rijdende auto’s. Deze robots moeten over een passende intelligentie beschikken om hun taak goed uit te kunnen voeren. Robots worden in vele sectoren in het bedrijfsleven gebruikt waaronder de logistieke sector. Een goed voorbeeld hiervan is de Kiva robot. Deze robot helpt werknemers bestellingen in te pakken in een pakhuis.&lt;br /&gt;
[[Bestand:Kiva_Robot.jpg|thumb|200px|right|zie: https://www.youtube.com/watch?v=6KRjuuEVEZs]] &lt;br /&gt;
&lt;br /&gt;
In dit project leer je hoe je soortgelijke “brein software” kan ontwikkelen om een groep robots aan te sturen om bestellingen in te pakken in een magazijn. &lt;br /&gt;
&lt;br /&gt;
=== Blender ===&lt;br /&gt;
&lt;br /&gt;
Het softwareprogramma wat ons hierbij zal ondersteunen is Blender. Blender is gratis, opensource en erg snel te installeren op meerdere platforms (Windows, Mac OS X,Linux).&lt;br /&gt;
&lt;br /&gt;
=== Leerdoelen ===&lt;br /&gt;
&lt;br /&gt;
Na het succesvol afronden van dit project kun je:&lt;br /&gt;
# overweg met het simulatiepakket Blender in combinatie met Python,&lt;br /&gt;
# robot software ontwikkelen voor individuele robots,&lt;br /&gt;
# robot software ontwikkelen voor een samenwerkende robots,&lt;br /&gt;
# zelf verbeterende robot software ontwikkelen voor een groep samenwerkende robots,&lt;br /&gt;
# het experimenteel testen en beoordelen van robot gedrag, &lt;br /&gt;
# het koppelen van bovenstaande aan een werkveld, met name Logistiek.&lt;br /&gt;
&lt;br /&gt;
Het project is opgebouwd uit 8 lessen. Iedere les duurt 2-3 uur. Iedere les heeft een verschillend aantal plusopdrachten waar je tussen de lessen door mee aan de slag kunt.&lt;br /&gt;
De opdrachtomschrijving is getest op een Mac en Windows. Indien je een ander platform gebruikt, kun je wellicht op problemen stuiten. Het wordt dus aangeraden een Mac of Windows computer te gebruiken maar andere platformen zouden ook mogelijk kunnen zijn&lt;br /&gt;
&lt;br /&gt;
Je kan nu beginnen met Les 1!&lt;br /&gt;
&lt;br /&gt;
== Ontwikkeling ==&lt;br /&gt;
Het maken van dit lesmateriaal is mogelijk gemaakt dankzij subsidie van de gemeente Amsterdam. Het project is uitgevoerd aan de Vrije Universiteit Amsterdam, afdeling Computational Intelligence, in samenwerking met ICT in de Wolken Amsterdam.&lt;br /&gt;
&lt;br /&gt;
Voor vragen over de totstandkoming van dit project kunt u terecht bij:&lt;br /&gt;
&lt;br /&gt;
* Jacqueline Heinerman (j.v.heinerman@vu.nl)&lt;br /&gt;
* Eelco Dijkstra (eelco@infvo.com)&lt;br /&gt;
&lt;br /&gt;
== Referenties ==&lt;br /&gt;
* [[/Bestanden]]&lt;/div&gt;</summary>
		<author><name>Jacqueline</name></author>
	</entry>
	<entry>
		<id>https://infvo.nl/lab/index.php?title=Logistieke_Robots&amp;diff=453</id>
		<title>Logistieke Robots</title>
		<link rel="alternate" type="text/html" href="https://infvo.nl/lab/index.php?title=Logistieke_Robots&amp;diff=453"/>
		<updated>2014-12-17T15:40:20Z</updated>

		<summary type="html">&lt;p&gt;Jacqueline: /* Over het project */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Zijbalk Logistieke Robots}}&lt;br /&gt;
&lt;br /&gt;
== Over het project==&lt;br /&gt;
[[Bestand:stofzuig_robot.png|thumb|200px|right|zie: https://www.youtube.com/watch?v=hKzMWGVi-YM]] &lt;br /&gt;
&lt;br /&gt;
We zien robots steeds meer in ons dagelijkse leven verschijnen, van simpele stofzuigers tot zelf rijdende auto’s. Deze robots moeten over een passende intelligentie beschikken om hun taak goed uit te kunnen voeren. Robots worden in vele sectoren in het bedrijfsleven gebruikt waaronder de logistieke sector. Een goed voorbeeld hiervan is de Kiva robot. Deze robot helpt werknemers bestellingen in te pakken in een pakhuis.&lt;br /&gt;
[[Bestand:Kiva_robot.jpg|thumb|200px|right|zie: https://www.youtube.com/watch?v=6KRjuuEVEZs]] &lt;br /&gt;
&lt;br /&gt;
In dit project leer je hoe je soortgelijke “brein software” kan ontwikkelen om een groep robots aan te sturen om bestellingen in te pakken in een magazijn. &lt;br /&gt;
&lt;br /&gt;
=== Blender ===&lt;br /&gt;
&lt;br /&gt;
Het softwareprogramma wat ons hierbij zal ondersteunen is Blender. Blender is gratis, opensource en erg snel te installeren op meerdere platforms (Windows, Mac OS X,Linux).&lt;br /&gt;
&lt;br /&gt;
=== Leerdoelen ===&lt;br /&gt;
&lt;br /&gt;
Na het succesvol afronden van dit project kun je:&lt;br /&gt;
# overweg met het simulatiepakket Blender in combinatie met Python,&lt;br /&gt;
# robot software ontwikkelen voor individuele robots,&lt;br /&gt;
# robot software ontwikkelen voor een samenwerkende robots,&lt;br /&gt;
# zelf verbeterende robot software ontwikkelen voor een groep samenwerkende robots,&lt;br /&gt;
# het experimenteel testen en beoordelen van robot gedrag, &lt;br /&gt;
# het koppelen van bovenstaande aan een werkveld, met name Logistiek.&lt;br /&gt;
&lt;br /&gt;
Het project is opgebouwd uit 8 lessen. Iedere les duurt 2-3 uur. Iedere les heeft een verschillend aantal plusopdrachten waar je tussen de lessen door mee aan de slag kunt.&lt;br /&gt;
De opdrachtomschrijving is getest op een Mac en Windows. Indien je een ander platform gebruikt, kun je wellicht op problemen stuiten. Het wordt dus aangeraden een Mac of Windows computer te gebruiken maar andere platformen zouden ook mogelijk kunnen zijn&lt;br /&gt;
&lt;br /&gt;
Je kan nu beginnen met Les 1!&lt;br /&gt;
&lt;br /&gt;
== Ontwikkeling ==&lt;br /&gt;
Het maken van dit lesmateriaal is mogelijk gemaakt dankzij subsidie van de gemeente Amsterdam. Het project is uitgevoerd aan de Vrije Universiteit Amsterdam, afdeling Computational Intelligence, in samenwerking met ICT in de Wolken Amsterdam.&lt;br /&gt;
&lt;br /&gt;
Voor vragen over de totstandkoming van dit project kunt u terecht bij:&lt;br /&gt;
&lt;br /&gt;
* Jacqueline Heinerman (j.v.heinerman@vu.nl)&lt;br /&gt;
* Eelco Dijkstra (eelco@infvo.com)&lt;br /&gt;
&lt;br /&gt;
== Referenties ==&lt;br /&gt;
* [[/Bestanden]]&lt;/div&gt;</summary>
		<author><name>Jacqueline</name></author>
	</entry>
	<entry>
		<id>https://infvo.nl/lab/index.php?title=Logistieke_Robots&amp;diff=452</id>
		<title>Logistieke Robots</title>
		<link rel="alternate" type="text/html" href="https://infvo.nl/lab/index.php?title=Logistieke_Robots&amp;diff=452"/>
		<updated>2014-12-17T15:39:18Z</updated>

		<summary type="html">&lt;p&gt;Jacqueline: /* Over het project */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Zijbalk Logistieke Robots}}&lt;br /&gt;
&lt;br /&gt;
== Over het project==&lt;br /&gt;
[[Bestand:stofzuig_robot.png|thumb|200px|right|zie: https://www.youtube.com/watch?v=hKzMWGVi-YM]] &lt;br /&gt;
&lt;br /&gt;
We zien robots steeds meer in ons dagelijkse leven verschijnen, van simpele stofzuigers tot zelf rijdende auto’s. Deze robots moeten over een passende intelligentie beschikken om hun taak goed uit te kunnen voeren. Robots worden in vele sectoren in het bedrijfsleven gebruikt waaronder de logistieke sector. Een goed voorbeeld hiervan is de Kiva robot. Deze robot helpt werknemers bestellingen in te pakken in een pakhuis.&lt;br /&gt;
[[Bestand:kiva_robot.jpg|thumb|200px|right|zie: https://www.youtube.com/watch?v=6KRjuuEVEZs]] &lt;br /&gt;
&lt;br /&gt;
In dit project leer je hoe je soortgelijke “brein software” kan ontwikkelen om een groep robots aan te sturen om bestellingen in te pakken in een magazijn. &lt;br /&gt;
&lt;br /&gt;
=== Blender ===&lt;br /&gt;
&lt;br /&gt;
Het softwareprogramma wat ons hierbij zal ondersteunen is Blender. Blender is gratis, opensource en erg snel te installeren op meerdere platforms (Windows, Mac OS X,Linux).&lt;br /&gt;
&lt;br /&gt;
=== Leerdoelen ===&lt;br /&gt;
&lt;br /&gt;
Na het succesvol afronden van dit project kun je:&lt;br /&gt;
# overweg met het simulatiepakket Blender in combinatie met Python,&lt;br /&gt;
# robot software ontwikkelen voor individuele robots,&lt;br /&gt;
# robot software ontwikkelen voor een samenwerkende robots,&lt;br /&gt;
# zelf verbeterende robot software ontwikkelen voor een groep samenwerkende robots,&lt;br /&gt;
# het experimenteel testen en beoordelen van robot gedrag, &lt;br /&gt;
# het koppelen van bovenstaande aan een werkveld, met name Logistiek.&lt;br /&gt;
&lt;br /&gt;
Het project is opgebouwd uit 8 lessen. Iedere les duurt 2-3 uur. Iedere les heeft een verschillend aantal plusopdrachten waar je tussen de lessen door mee aan de slag kunt.&lt;br /&gt;
De opdrachtomschrijving is getest op een Mac en Windows. Indien je een ander platform gebruikt, kun je wellicht op problemen stuiten. Het wordt dus aangeraden een Mac of Windows computer te gebruiken maar andere platformen zouden ook mogelijk kunnen zijn&lt;br /&gt;
&lt;br /&gt;
Je kan nu beginnen met Les 1!&lt;br /&gt;
&lt;br /&gt;
== Ontwikkeling ==&lt;br /&gt;
Het maken van dit lesmateriaal is mogelijk gemaakt dankzij subsidie van de gemeente Amsterdam. Het project is uitgevoerd aan de Vrije Universiteit Amsterdam, afdeling Computational Intelligence, in samenwerking met ICT in de Wolken Amsterdam.&lt;br /&gt;
&lt;br /&gt;
Voor vragen over de totstandkoming van dit project kunt u terecht bij:&lt;br /&gt;
&lt;br /&gt;
* Jacqueline Heinerman (j.v.heinerman@vu.nl)&lt;br /&gt;
* Eelco Dijkstra (eelco@infvo.com)&lt;br /&gt;
&lt;br /&gt;
== Referenties ==&lt;br /&gt;
* [[/Bestanden]]&lt;/div&gt;</summary>
		<author><name>Jacqueline</name></author>
	</entry>
	<entry>
		<id>https://infvo.nl/lab/index.php?title=Logistieke_Robots&amp;diff=451</id>
		<title>Logistieke Robots</title>
		<link rel="alternate" type="text/html" href="https://infvo.nl/lab/index.php?title=Logistieke_Robots&amp;diff=451"/>
		<updated>2014-12-17T15:19:11Z</updated>

		<summary type="html">&lt;p&gt;Jacqueline: /* Over het project */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Zijbalk Logistieke Robots}}&lt;br /&gt;
&lt;br /&gt;
== Over het project==&lt;br /&gt;
&lt;br /&gt;
We zien robots steeds meer in ons dagelijkse leven verschijnen, van simpele stofzuigers [[Bestand:stofzuig_robot.png]] (https://www.youtube.com/watch?v=hKzMWGVi-YM) tot zelf rijdende auto’s. Deze robots moeten over een passende intelligentie beschikken om hun taak goed uit te kunnen voeren. Robots worden in vele sectoren in het bedrijfsleven gebruikt waaronder de logistieke sector. Een goed voorbeeld hiervan is de Kiva robot. Deze robot helpt werknemers bestellingen in te pakken in een pakhuis:  [[Bestand:kiva_robot.jpg]]  https://www.youtube.com/watch?v=6KRjuuEVEZs.&lt;br /&gt;
In dit project leer je hoe je soortgelijke “brein software” kan ontwikkelen om een groep robots aan te sturen om bestellingen in te pakken in een magazijn. &lt;br /&gt;
&lt;br /&gt;
=== Blender ===&lt;br /&gt;
&lt;br /&gt;
Het softwareprogramma wat ons hierbij zal ondersteunen is Blender. Blender is gratis, opensource en erg snel te installeren op meerdere platforms (Windows, Mac OS X,Linux).&lt;br /&gt;
&lt;br /&gt;
=== Leerdoelen ===&lt;br /&gt;
&lt;br /&gt;
Na het succesvol afronden van dit project kun je:&lt;br /&gt;
# overweg met het simulatiepakket Blender in combinatie met Python,&lt;br /&gt;
# robot software ontwikkelen voor individuele robots,&lt;br /&gt;
# robot software ontwikkelen voor een samenwerkende robots,&lt;br /&gt;
# zelf verbeterende robot software ontwikkelen voor een groep samenwerkende robots,&lt;br /&gt;
# het experimenteel testen en beoordelen van robot gedrag, &lt;br /&gt;
# het koppelen van bovenstaande aan een werkveld, met name Logistiek.&lt;br /&gt;
&lt;br /&gt;
Het project is opgebouwd uit 8 lessen. Iedere les duurt 2-3 uur. Iedere les heeft een verschillend aantal plusopdrachten waar je tussen de lessen door mee aan de slag kunt.&lt;br /&gt;
De opdrachtomschrijving is getest op een Mac en Windows. Indien je een ander platform gebruikt, kun je wellicht op problemen stuiten. Het wordt dus aangeraden een Mac of Windows computer te gebruiken maar andere platformen zouden ook mogelijk kunnen zijn&lt;br /&gt;
&lt;br /&gt;
Je kan nu beginnen met Les 1!&lt;br /&gt;
&lt;br /&gt;
== Ontwikkeling ==&lt;br /&gt;
Het maken van dit lesmateriaal is mogelijk gemaakt dankzij subsidie van de gemeente Amsterdam. Het project is uitgevoerd aan de Vrije Universiteit Amsterdam, afdeling Computational Intelligence, in samenwerking met ICT in de Wolken Amsterdam.&lt;br /&gt;
&lt;br /&gt;
Voor vragen over de totstandkoming van dit project kunt u terecht bij:&lt;br /&gt;
&lt;br /&gt;
* Jacqueline Heinerman (j.v.heinerman@vu.nl)&lt;br /&gt;
* Eelco Dijkstra (eelco@infvo.com)&lt;br /&gt;
&lt;br /&gt;
== Referenties ==&lt;br /&gt;
* [[/Bestanden]]&lt;/div&gt;</summary>
		<author><name>Jacqueline</name></author>
	</entry>
	<entry>
		<id>https://infvo.nl/lab/index.php?title=Logistieke_Robots&amp;diff=450</id>
		<title>Logistieke Robots</title>
		<link rel="alternate" type="text/html" href="https://infvo.nl/lab/index.php?title=Logistieke_Robots&amp;diff=450"/>
		<updated>2014-12-17T15:17:01Z</updated>

		<summary type="html">&lt;p&gt;Jacqueline: /* Over het project */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Zijbalk Logistieke Robots}}&lt;br /&gt;
&lt;br /&gt;
== Over het project==&lt;br /&gt;
&lt;br /&gt;
We zien robots steeds meer in ons dagelijkse leven verschijnen, van simpele stofzuigers [[Bestand:stofzuig_robot.jpg]] (https://www.youtube.com/watch?v=hKzMWGVi-YM) tot zelf rijdende auto’s. Deze robots moeten over een passende intelligentie beschikken om hun taak goed uit te kunnen voeren. Robots worden in vele sectoren in het bedrijfsleven gebruikt waaronder de logistieke sector. Een goed voorbeeld hiervan is de Kiva robot. Deze robot helpt werknemers bestellingen in te pakken in een pakhuis:  [[Bestand:kiva_robot.jpg]]  https://www.youtube.com/watch?v=6KRjuuEVEZs.&lt;br /&gt;
In dit project leer je hoe je soortgelijke “brein software” kan ontwikkelen om een groep robots aan te sturen om bestellingen in te pakken in een magazijn. &lt;br /&gt;
&lt;br /&gt;
=== Blender ===&lt;br /&gt;
&lt;br /&gt;
Het softwareprogramma wat ons hierbij zal ondersteunen is Blender. Blender is gratis, opensource en erg snel te installeren op meerdere platforms (Windows, Mac OS X,Linux).&lt;br /&gt;
&lt;br /&gt;
=== Leerdoelen ===&lt;br /&gt;
&lt;br /&gt;
Na het succesvol afronden van dit project kun je:&lt;br /&gt;
# overweg met het simulatiepakket Blender in combinatie met Python,&lt;br /&gt;
# robot software ontwikkelen voor individuele robots,&lt;br /&gt;
# robot software ontwikkelen voor een samenwerkende robots,&lt;br /&gt;
# zelf verbeterende robot software ontwikkelen voor een groep samenwerkende robots,&lt;br /&gt;
# het experimenteel testen en beoordelen van robot gedrag, &lt;br /&gt;
# het koppelen van bovenstaande aan een werkveld, met name Logistiek.&lt;br /&gt;
&lt;br /&gt;
Het project is opgebouwd uit 8 lessen. Iedere les duurt 2-3 uur. Iedere les heeft een verschillend aantal plusopdrachten waar je tussen de lessen door mee aan de slag kunt.&lt;br /&gt;
De opdrachtomschrijving is getest op een Mac en Windows. Indien je een ander platform gebruikt, kun je wellicht op problemen stuiten. Het wordt dus aangeraden een Mac of Windows computer te gebruiken maar andere platformen zouden ook mogelijk kunnen zijn&lt;br /&gt;
&lt;br /&gt;
Je kan nu beginnen met Les 1!&lt;br /&gt;
&lt;br /&gt;
== Ontwikkeling ==&lt;br /&gt;
Het maken van dit lesmateriaal is mogelijk gemaakt dankzij subsidie van de gemeente Amsterdam. Het project is uitgevoerd aan de Vrije Universiteit Amsterdam, afdeling Computational Intelligence, in samenwerking met ICT in de Wolken Amsterdam.&lt;br /&gt;
&lt;br /&gt;
Voor vragen over de totstandkoming van dit project kunt u terecht bij:&lt;br /&gt;
&lt;br /&gt;
* Jacqueline Heinerman (j.v.heinerman@vu.nl)&lt;br /&gt;
* Eelco Dijkstra (eelco@infvo.com)&lt;br /&gt;
&lt;br /&gt;
== Referenties ==&lt;br /&gt;
* [[/Bestanden]]&lt;/div&gt;</summary>
		<author><name>Jacqueline</name></author>
	</entry>
	<entry>
		<id>https://infvo.nl/lab/index.php?title=Bestand:Kiva_Robot.jpg&amp;diff=449</id>
		<title>Bestand:Kiva Robot.jpg</title>
		<link rel="alternate" type="text/html" href="https://infvo.nl/lab/index.php?title=Bestand:Kiva_Robot.jpg&amp;diff=449"/>
		<updated>2014-12-17T15:14:59Z</updated>

		<summary type="html">&lt;p&gt;Jacqueline: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Jacqueline</name></author>
	</entry>
	<entry>
		<id>https://infvo.nl/lab/index.php?title=Bestand:Stofzuig_robot.png&amp;diff=448</id>
		<title>Bestand:Stofzuig robot.png</title>
		<link rel="alternate" type="text/html" href="https://infvo.nl/lab/index.php?title=Bestand:Stofzuig_robot.png&amp;diff=448"/>
		<updated>2014-12-17T15:13:40Z</updated>

		<summary type="html">&lt;p&gt;Jacqueline: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Jacqueline</name></author>
	</entry>
	<entry>
		<id>https://infvo.nl/lab/index.php?title=Logistieke_Robots&amp;diff=446</id>
		<title>Logistieke Robots</title>
		<link rel="alternate" type="text/html" href="https://infvo.nl/lab/index.php?title=Logistieke_Robots&amp;diff=446"/>
		<updated>2014-12-17T14:43:06Z</updated>

		<summary type="html">&lt;p&gt;Jacqueline: /* Over het project */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Zijbalk Logistieke Robots}}&lt;br /&gt;
&lt;br /&gt;
== Over het project==&lt;br /&gt;
&lt;br /&gt;
We zien robots steeds meer in ons dagelijkse leven verschijnen, van simpele stofzuigers (https://www.youtube.com/watch?v=hKzMWGVi-YM) tot zelf rijdende auto’s. Deze robots moeten over een passende intelligentie beschikken om hun taak goed uit te kunnen voeren. Robots worden in vele sectoren in het bedrijfsleven gebruikt waaronder de logistieke sector. Een goed voorbeeld hiervan is de Kiva robot. Deze robot helpt werknemers bestellingen in te pakken in een pakhuis: https://www.youtube.com/watch?v=6KRjuuEVEZs.&lt;br /&gt;
In dit project leer je hoe je soortgelijke “brein software” kan ontwikkelen om een groep robots aan te sturen om bestellingen in te pakken in een magazijn. &lt;br /&gt;
&lt;br /&gt;
Het softwareprogramma wat ons hierbij zal ondersteunen is Blender. Blender is gratis, opensource en erg snel te installeren op meerdere platforms (Windows, Mac OS X,Linux).&lt;br /&gt;
&lt;br /&gt;
Na het succesvol afronden van dit project kun je:&lt;br /&gt;
# overweg met het simulatiepakket Blender in combinatie met Python,&lt;br /&gt;
# robot software ontwikkelen voor individuele robots,&lt;br /&gt;
# robot software ontwikkelen voor een samenwerkende robots,&lt;br /&gt;
# zelf verbeterende robot software ontwikkelen voor een groep samenwerkende robots,&lt;br /&gt;
# het experimenteel testen en beoordelen van robot gedrag, &lt;br /&gt;
# het koppelen van bovenstaande aan een werkveld, met name Logistiek.&lt;br /&gt;
&lt;br /&gt;
Het project is opgebouwd uit 8 lessen. Iedere les duurt 2-3 uur. Iedere les heeft een verschillend aantal plusopdrachten waar je tussen de lessen door mee aan de slag kunt.&lt;br /&gt;
De opdrachtomschrijving is getest op een Mac en Windows. Indien je een ander platform gebruikt, kun je wellicht op problemen stuiten. Het wordt dus aangeraden een Mac of Windows computer te gebruiken maar andere platformen zouden ook mogelijk kunnen zijn&lt;br /&gt;
&lt;br /&gt;
Je kan nu beginnen met Les 1!&lt;br /&gt;
&lt;br /&gt;
== Ontwikkeling ==&lt;br /&gt;
Het maken van dit lesmateriaal is mogelijk gemaakt dankzij subsidie van de gemeente Amsterdam. Het project is uitgevoerd aan de Vrije Universiteit Amsterdam, afdeling Computational Intelligence, in samenwerking met ICT in de Wolken Amsterdam.&lt;br /&gt;
&lt;br /&gt;
Voor vragen over de totstandkoming van dit project kunt u terecht bij:&lt;br /&gt;
&lt;br /&gt;
* Jacqueline Heinerman (j.v.heinerman@vu.nl)&lt;br /&gt;
* Eelco Dijkstra (eelco@infvo.com)&lt;br /&gt;
&lt;br /&gt;
== Referenties ==&lt;br /&gt;
* [[/Bestanden]]&lt;/div&gt;</summary>
		<author><name>Jacqueline</name></author>
	</entry>
	<entry>
		<id>https://infvo.nl/lab/index.php?title=Logistieke_Robots&amp;diff=445</id>
		<title>Logistieke Robots</title>
		<link rel="alternate" type="text/html" href="https://infvo.nl/lab/index.php?title=Logistieke_Robots&amp;diff=445"/>
		<updated>2014-12-17T14:34:47Z</updated>

		<summary type="html">&lt;p&gt;Jacqueline: /* Over het project */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Zijbalk Logistieke Robots}}&lt;br /&gt;
&lt;br /&gt;
== Over het project==&lt;br /&gt;
Robots worden steeds slimmer en in de toekomst zullen steeds meer taken vervuld gaan worden door robots. Een voorbeeld van een robot die al te koop is in de winkel is de stofzuig robot. Zie https://www.youtube.com/watch?v=hKzMWGVi-YM. &lt;br /&gt;
Robots worden niet alleen in het huishouden gebruikt. Ze worden in vele sectoren in het bedrijfsleven gebruikt waaronder de logistieke sector. Een goed voorbeeld hiervan is de Kiva robot. Deze robot helpt werknemers bestellingen in te pakken in een pakhuis: https://www.youtube.com/watch?v=6KRjuuEVEZs.&lt;br /&gt;
De robots nemen dus taken over van de werknemers maar er ontstaan ook nieuwe werkzaamheden omdat de robots wel aangestuurd moeten worden om deze taken te kunnen vervullen. In dit project zullen we leren hoe we robots aan sturen om ze taken te laten vervullen in de logistieke sector. &lt;br /&gt;
Je kan nu beginnen met Les 1!&lt;br /&gt;
&lt;br /&gt;
== Ontwikkeling ==&lt;br /&gt;
Het maken van dit lesmateriaal is mogelijk gemaakt dankzij subsidie van de gemeente Amsterdam. Het project is uitgevoerd aan de Vrije Universiteit Amsterdam, afdeling Computational Intelligence, in samenwerking met ICT in de Wolken Amsterdam.&lt;br /&gt;
&lt;br /&gt;
Voor vragen over de totstandkoming van dit project kunt u terecht bij:&lt;br /&gt;
&lt;br /&gt;
* Jacqueline Heinerman (j.v.heinerman@vu.nl)&lt;br /&gt;
* Eelco Dijkstra (eelco@infvo.com)&lt;br /&gt;
&lt;br /&gt;
== Referenties ==&lt;br /&gt;
* [[/Bestanden]]&lt;/div&gt;</summary>
		<author><name>Jacqueline</name></author>
	</entry>
	<entry>
		<id>https://infvo.nl/lab/index.php?title=Logistieke_Robots&amp;diff=444</id>
		<title>Logistieke Robots</title>
		<link rel="alternate" type="text/html" href="https://infvo.nl/lab/index.php?title=Logistieke_Robots&amp;diff=444"/>
		<updated>2014-12-17T14:33:31Z</updated>

		<summary type="html">&lt;p&gt;Jacqueline: /* Over het project */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Zijbalk Logistieke Robots}}&lt;br /&gt;
&lt;br /&gt;
== Over het project==&lt;br /&gt;
Robots worden steeds slimmer en in de toekomst zullen steeds meer taken vervuld gaan worden door robots. Een voorbeeld van een robot die al te koop is in de winkel is de stofzuig robot. Zie https://www.youtube.com/watch?v=hKzMWGVi-YM. &lt;br /&gt;
Robots worden niet alleen in het huishouden gebruikt. Ze worden in vele sectoren in het bedrijfsleven gebruikt waaronder de logistieke sector. Een goed voorbeeld hiervan is de Kiva robot. Deze robot helpt werknemers bestellingen in te pakken in een pakhuis: https://www.youtube.com/watch?v=6KRjuuEVEZs.&lt;br /&gt;
De robots nemen dus taken over van de werknemers maar er ontstaan ook nieuwe werkzaamheden omdat de robots wel aangestuurd moeten worden om deze taken te kunnen vervullen. In dit project zullen we leren hoe we robots aan sturen om ze taken te laten vervullen in de logistieke sector.&lt;br /&gt;
&lt;br /&gt;
== Ontwikkeling ==&lt;br /&gt;
Het maken van dit lesmateriaal is mogelijk gemaakt dankzij subsidie van de gemeente Amsterdam. Het project is uitgevoerd aan de Vrije Universiteit Amsterdam, afdeling Computational Intelligence, in samenwerking met ICT in de Wolken Amsterdam.&lt;br /&gt;
&lt;br /&gt;
Voor vragen over de totstandkoming van dit project kunt u terecht bij:&lt;br /&gt;
&lt;br /&gt;
* Jacqueline Heinerman (j.v.heinerman@vu.nl)&lt;br /&gt;
* Eelco Dijkstra (eelco@infvo.com)&lt;br /&gt;
&lt;br /&gt;
== Referenties ==&lt;br /&gt;
* [[/Bestanden]]&lt;/div&gt;</summary>
		<author><name>Jacqueline</name></author>
	</entry>
	<entry>
		<id>https://infvo.nl/lab/index.php?title=Logistieke_Robots&amp;diff=443</id>
		<title>Logistieke Robots</title>
		<link rel="alternate" type="text/html" href="https://infvo.nl/lab/index.php?title=Logistieke_Robots&amp;diff=443"/>
		<updated>2014-12-17T14:30:46Z</updated>

		<summary type="html">&lt;p&gt;Jacqueline: /* Over het project */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Zijbalk Logistieke Robots}}&lt;br /&gt;
&lt;br /&gt;
== Over het project==&lt;br /&gt;
Robots worden steeds slimmer en in de toekomst zullen meer steeds taken vervuld gaan worden door robots. Een voorbeeld van een robot die al te koop is in de winkel is de stofzuig robot. Zie https://www.youtube.com/watch?v=hKzMWGVi-YM. &lt;br /&gt;
Robots worden niet alleen in het huishouden gebruikt. Ze worden in vele sectoren in het bedrijfsleven gebruikt waaronder de logistieke sector. Een goed voorbeeld hiervan is de Kiva robot. Deze robot helpt mensen om bestellingen in te pakken in een pakhuis: https://www.youtube.com/watch?v=6KRjuuEVEZs.&lt;br /&gt;
De robots nemen dus taken over van de mensen maar tegelijk moeten de mensen de robot wel leren besturen om taken te kunnen vervullen. In dit project zullen we leren hoe we robots aan sturen om ze taken te laten vervullen in de logistieke sector.&lt;br /&gt;
&lt;br /&gt;
== Ontwikkeling ==&lt;br /&gt;
Het maken van dit lesmateriaal is mogelijk gemaakt dankzij subsidie van de gemeente Amsterdam. Het project is uitgevoerd aan de Vrije Universiteit Amsterdam, afdeling Computational Intelligence, in samenwerking met ICT in de Wolken Amsterdam.&lt;br /&gt;
&lt;br /&gt;
Voor vragen over de totstandkoming van dit project kunt u terecht bij:&lt;br /&gt;
&lt;br /&gt;
* Jacqueline Heinerman (j.v.heinerman@vu.nl)&lt;br /&gt;
* Eelco Dijkstra (eelco@infvo.com)&lt;br /&gt;
&lt;br /&gt;
== Referenties ==&lt;br /&gt;
* [[/Bestanden]]&lt;/div&gt;</summary>
		<author><name>Jacqueline</name></author>
	</entry>
	<entry>
		<id>https://infvo.nl/lab/index.php?title=Logistieke_Robots&amp;diff=442</id>
		<title>Logistieke Robots</title>
		<link rel="alternate" type="text/html" href="https://infvo.nl/lab/index.php?title=Logistieke_Robots&amp;diff=442"/>
		<updated>2014-12-17T14:30:07Z</updated>

		<summary type="html">&lt;p&gt;Jacqueline: /* Over het project */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Zijbalk Logistieke Robots}}&lt;br /&gt;
&lt;br /&gt;
== Over het project==&lt;br /&gt;
Robots worden steeds slimmer en in de toekomst zullen meer steeds taken vervuld gaan worden door robots. Een voorbeeld van een robot die al te koop is in de winkel is de stofzuig robot. Zie https://www.youtube.com/watch?v=hKzMWGVi-YM. &lt;br /&gt;
Robots worden niet alleen in het huishouden gebruikt. Ze worden in vele sectoren in het bedrijfsleven gebruikt en ook in de logistieke sector. Een goed voorbeeld hiervan is de Kiva robot. Deze robot helpt mensen om bestellingen in te pakken in een pakhuis: https://www.youtube.com/watch?v=6KRjuuEVEZs.&lt;br /&gt;
De robots nemen dus taken over van de mensen maar tegelijk moeten de mensen de robot wel leren besturen om taken te kunnen vervullen. In dit project zullen we leren hoe we robots aan sturen om ze taken te laten vervullen in de logistieke sector.&lt;br /&gt;
&lt;br /&gt;
== Ontwikkeling ==&lt;br /&gt;
Het maken van dit lesmateriaal is mogelijk gemaakt dankzij subsidie van de gemeente Amsterdam. Het project is uitgevoerd aan de Vrije Universiteit Amsterdam, afdeling Computational Intelligence, in samenwerking met ICT in de Wolken Amsterdam.&lt;br /&gt;
&lt;br /&gt;
Voor vragen over de totstandkoming van dit project kunt u terecht bij:&lt;br /&gt;
&lt;br /&gt;
* Jacqueline Heinerman (j.v.heinerman@vu.nl)&lt;br /&gt;
* Eelco Dijkstra (eelco@infvo.com)&lt;br /&gt;
&lt;br /&gt;
== Referenties ==&lt;br /&gt;
* [[/Bestanden]]&lt;/div&gt;</summary>
		<author><name>Jacqueline</name></author>
	</entry>
	<entry>
		<id>https://infvo.nl/lab/index.php?title=Logistieke_Robots&amp;diff=441</id>
		<title>Logistieke Robots</title>
		<link rel="alternate" type="text/html" href="https://infvo.nl/lab/index.php?title=Logistieke_Robots&amp;diff=441"/>
		<updated>2014-12-17T14:22:26Z</updated>

		<summary type="html">&lt;p&gt;Jacqueline: /* Ontwikkeling */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Zijbalk Logistieke Robots}}&lt;br /&gt;
&lt;br /&gt;
== Over het project==&lt;br /&gt;
Robots worden steeds slimmer en in de toekomst zullen meer steeds taken vervuld gaan worden door robots. Een voorbeeld zijn de &lt;br /&gt;
Werkzaamheden die nu mensen nog doen zullen dan gedaan worden door robots. Dit zorgt voor een verschuiving van werkzaamheden van het uitvoeren van de taak naar het aansturen van de robot voor deze taak. In dit project leer je hoe je een robot aan moet sturen om taken in de logistieke sector te vervullen.&lt;br /&gt;
&lt;br /&gt;
== Ontwikkeling ==&lt;br /&gt;
Het maken van dit lesmateriaal is mogelijk gemaakt dankzij subsidie van de gemeente Amsterdam. Het project is uitgevoerd aan de Vrije Universiteit Amsterdam, afdeling Computational Intelligence, in samenwerking met ICT in de Wolken Amsterdam.&lt;br /&gt;
&lt;br /&gt;
Voor vragen over de totstandkoming van dit project kunt u terecht bij:&lt;br /&gt;
&lt;br /&gt;
* Jacqueline Heinerman (j.v.heinerman@vu.nl)&lt;br /&gt;
* Eelco Dijkstra (eelco@infvo.com)&lt;br /&gt;
&lt;br /&gt;
== Referenties ==&lt;br /&gt;
* [[/Bestanden]]&lt;/div&gt;</summary>
		<author><name>Jacqueline</name></author>
	</entry>
	<entry>
		<id>https://infvo.nl/lab/index.php?title=Logistieke_Robots/Bestanden&amp;diff=440</id>
		<title>Logistieke Robots/Bestanden</title>
		<link rel="alternate" type="text/html" href="https://infvo.nl/lab/index.php?title=Logistieke_Robots/Bestanden&amp;diff=440"/>
		<updated>2014-12-17T14:21:04Z</updated>

		<summary type="html">&lt;p&gt;Jacqueline: /* Bestanden */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Bestanden ==&lt;br /&gt;
&lt;br /&gt;
De Blender-bestanden zijn te vinden via:&lt;br /&gt;
* https://googledrive.com/host/0B4Wf_Tca5KDuNnFUWTc4R09jblU/logistieke-robots&lt;br /&gt;
** https://googledrive.com/host/0B4Wf_Tca5KDuNnFUWTc4R09jblU/logistieke-robots/morsy.blend&lt;br /&gt;
** https://googledrive.com/host/0B4Wf_Tca5KDuNnFUWTc4R09jblU/logistieke-robots/living_room.blend&lt;br /&gt;
** https://googledrive.com/host/0B4Wf_Tca5KDuNnFUWTc4R09jblU/logistieke-robots/warehouse.blend&lt;br /&gt;
** https://googledrive.com/host/0B4Wf_Tca5KDuNnFUWTc4R09jblU/logistieke-robots/warehouse_one_order.blend&lt;br /&gt;
** https://googledrive.com/host/0B4Wf_Tca5KDuNnFUWTc4R09jblU/logistieke-robots/warehouse_team.blend&lt;br /&gt;
** https://googledrive.com/host/0B4Wf_Tca5KDuNnFUWTc4R09jblU/logistieke-robots/warehouse_team_collission.blend&lt;br /&gt;
* uitwerkingen: https://googledrive.com/host/0B4Wf_Tca5KDuNnFUWTc4R09jblU/logistieke-robots-final&lt;br /&gt;
** https://googledrive.com/host/0B4Wf_Tca5KDuNnFUWTc4R09jblU/logistieke-robots-final/morsy_final.blend&lt;br /&gt;
** https://googledrive.com/host/0B4Wf_Tca5KDuNnFUWTc4R09jblU/logistieke-robots-final/living_room_final.blend&lt;br /&gt;
** https://googledrive.com/host/0B4Wf_Tca5KDuNnFUWTc4R09jblU/logistieke-robots-final/warehouse_final.blend&lt;br /&gt;
** https://googledrive.com/host/0B4Wf_Tca5KDuNnFUWTc4R09jblU/logistieke-robots-final/warehouse_one_order_final.blend&lt;br /&gt;
** https://googledrive.com/host/0B4Wf_Tca5KDuNnFUWTc4R09jblU/logistieke-robots-final/warehouse_team_final.blend&lt;br /&gt;
** https://googledrive.com/host/0B4Wf_Tca5KDuNnFUWTc4R09jblU/logistieke-robots-final/warehouse_team_collission_final.blend&lt;/div&gt;</summary>
		<author><name>Jacqueline</name></author>
	</entry>
	<entry>
		<id>https://infvo.nl/lab/index.php?title=Logistieke_Robots&amp;diff=439</id>
		<title>Logistieke Robots</title>
		<link rel="alternate" type="text/html" href="https://infvo.nl/lab/index.php?title=Logistieke_Robots&amp;diff=439"/>
		<updated>2014-12-17T14:08:04Z</updated>

		<summary type="html">&lt;p&gt;Jacqueline: /* Ontwikkeling */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Zijbalk Logistieke Robots}}&lt;br /&gt;
&lt;br /&gt;
== Over het project==&lt;br /&gt;
Robots worden steeds slimmer en in de toekomst zullen meer steeds taken vervuld gaan worden door robots. Een voorbeeld zijn de &lt;br /&gt;
Werkzaamheden die nu mensen nog doen zullen dan gedaan worden door robots. Dit zorgt voor een verschuiving van werkzaamheden van het uitvoeren van de taak naar het aansturen van de robot voor deze taak. In dit project leer je hoe je een robot aan moet sturen om taken in de logistieke sector te vervullen.&lt;br /&gt;
&lt;br /&gt;
== Ontwikkeling ==&lt;br /&gt;
Het maken van dit lesmateriaal is mogelijk gemaakt dankzij subsidie van de gemeente Amsterdam. Het project is uitgevoerd aan de Vrije Universiteit Amsterdam, afdeling Computational Intelligence, in samenwerking met ICT in de Wolken Amsterdam.&lt;br /&gt;
&lt;br /&gt;
Voor vragen over de totstandkoming van dit project kunt u terecht bij:&lt;br /&gt;
&lt;br /&gt;
* Jacqueline Heinerman (j.v.heinerman@vu.nl)&lt;br /&gt;
* Eelco Dijkstra (eelco@infvo.com)&lt;br /&gt;
&lt;br /&gt;
De objecten in Blender komen van https://www.openrobots.org/wiki/morse/&lt;br /&gt;
&lt;br /&gt;
== Referenties ==&lt;br /&gt;
* [[/Bestanden]]&lt;/div&gt;</summary>
		<author><name>Jacqueline</name></author>
	</entry>
	<entry>
		<id>https://infvo.nl/lab/index.php?title=Logistieke_Robots&amp;diff=438</id>
		<title>Logistieke Robots</title>
		<link rel="alternate" type="text/html" href="https://infvo.nl/lab/index.php?title=Logistieke_Robots&amp;diff=438"/>
		<updated>2014-12-17T13:58:57Z</updated>

		<summary type="html">&lt;p&gt;Jacqueline: /* Over het project */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Zijbalk Logistieke Robots}}&lt;br /&gt;
&lt;br /&gt;
== Over het project==&lt;br /&gt;
Robots worden steeds slimmer en in de toekomst zullen meer steeds taken vervuld gaan worden door robots. Een voorbeeld zijn de &lt;br /&gt;
Werkzaamheden die nu mensen nog doen zullen dan gedaan worden door robots. Dit zorgt voor een verschuiving van werkzaamheden van het uitvoeren van de taak naar het aansturen van de robot voor deze taak. In dit project leer je hoe je een robot aan moet sturen om taken in de logistieke sector te vervullen.&lt;br /&gt;
&lt;br /&gt;
== Ontwikkeling ==&lt;br /&gt;
Het maken van dit lesmateriaal is mogelijk gemaakt dankzij subsidie van de gemeente Amsterdam. Het project is uitgevoerd aan de Vrije Universiteit Amsterdam, afdeling Computational Intelligence, in samenwerking met ICT in de Wolken Amsterdam.&lt;br /&gt;
&lt;br /&gt;
Voor vragen over de totstandkoming van dit project kunt u terecht bij:&lt;br /&gt;
&lt;br /&gt;
* Jacqueline Heinerman (j.v.heinerman@vu.nl)&lt;br /&gt;
* Eelco Dijkstra (eelco@infvo.com)&lt;br /&gt;
&lt;br /&gt;
== Referenties ==&lt;br /&gt;
* [[/Bestanden]]&lt;/div&gt;</summary>
		<author><name>Jacqueline</name></author>
	</entry>
	<entry>
		<id>https://infvo.nl/lab/index.php?title=Logistieke_Robots&amp;diff=437</id>
		<title>Logistieke Robots</title>
		<link rel="alternate" type="text/html" href="https://infvo.nl/lab/index.php?title=Logistieke_Robots&amp;diff=437"/>
		<updated>2014-12-17T13:54:22Z</updated>

		<summary type="html">&lt;p&gt;Jacqueline: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Zijbalk Logistieke Robots}}&lt;br /&gt;
&lt;br /&gt;
== Over het project==&lt;br /&gt;
Robots worden steeds slimmer en in de toekomst zullen meer steeds taken vervuld gaan worden door robots.&lt;br /&gt;
&lt;br /&gt;
 Werkzaamheden die nu mensen nog doen zullen dan gedaan worden door robots. Dit zorgt voor een verschuiving van werkzaamheden van het uitvoeren van de taak naar het aansturen van de robot voor deze taak. In dit project leer je hoe je een robot aan moet sturen om taken in de logistieke sector te vervullen&lt;br /&gt;
&lt;br /&gt;
== Ontwikkeling ==&lt;br /&gt;
Het maken van dit lesmateriaal is mogelijk gemaakt dankzij subsidie van de gemeente Amsterdam. Het project is uitgevoerd aan de Vrije Universiteit Amsterdam, afdeling Computational Intelligence, in samenwerking met ICT in de Wolken Amsterdam.&lt;br /&gt;
&lt;br /&gt;
Voor vragen over de totstandkoming van dit project kunt u terecht bij:&lt;br /&gt;
&lt;br /&gt;
* Jacqueline Heinerman (j.v.heinerman@vu.nl)&lt;br /&gt;
* Eelco Dijkstra (eelco@infvo.com)&lt;br /&gt;
&lt;br /&gt;
== Referenties ==&lt;br /&gt;
* [[/Bestanden]]&lt;/div&gt;</summary>
		<author><name>Jacqueline</name></author>
	</entry>
	<entry>
		<id>https://infvo.nl/lab/index.php?title=Logistieke_Robots/les_5&amp;diff=434</id>
		<title>Logistieke Robots/les 5</title>
		<link rel="alternate" type="text/html" href="https://infvo.nl/lab/index.php?title=Logistieke_Robots/les_5&amp;diff=434"/>
		<updated>2014-12-17T13:45:37Z</updated>

		<summary type="html">&lt;p&gt;Jacqueline: /* Les 5 - Robots laten samen werken */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Zijbalk Logistieke Robots}}&lt;br /&gt;
&lt;br /&gt;
==Les 5 - Robots laten samen werken ==&lt;br /&gt;
In de vorige les heb je een controller gemaakt voor 1 robot om bestellingen te kunnen verzamelen. In deze les leer je om een team van twee robots samen te laten werken om mogelijk sneller de bestellingen te laten verzamelen. &lt;br /&gt;
&lt;br /&gt;
Je kan een team van twee robots op veel verschillende manieren met elkaar samen laten werken. In de praktijk heb je vaak te maken met beperkingen zoals het maximale gewicht wat een robot kan tillen. Wij gaan in onze simulatie uit van de volgende restrictie:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Robots kunnen in één keer meerdere artikelen meenemen uit een kast indien deze artikelen dezelfde zijn. Dit geldt niet voor verschillende artikelen.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Bij een enkele robot kunnen we ons dus voorstellen dat hij eerst de hele bestelling doorneemt om te kijken of er dezelfde artikelen in zitten. Wanneer dit het geval is loopt de robot naar de juiste kast en pakt een pakket waar al twee dezelfde artikelen in zitten. Een efficiëntie verbetering kunnen we vervolgens uitdrukken als het aantal minder gelopen meters.&lt;br /&gt;
&lt;br /&gt;
We implementeren in deze les het volgende scenario: 2 robots werken samen om 2 bestellingen op te halen waarbij de bovengenoemde voorwaarde nog steeds geld en waarbij de robots niet naar dezelfde kasten lopen. We richten ons in deze les vooral op de programmering dan op de visualisatie.&lt;br /&gt;
&lt;br /&gt;
== Bijhouden van de gelopen afstand ==&lt;br /&gt;
Voordat we efficiëntie verbeteringen kunnen detecteren, moeten we eerst de huidige situatie kunnen meten. Dit doen we aan de hand van de gelopen afstand in meters van de robot. Hoe je dit doet leer je in deze paragraaf.&lt;br /&gt;
&lt;br /&gt;
=== Verandering robot controller ===&lt;br /&gt;
Logisch is dat we een extra variabele gaan creëren die de gelopen afstand van de robot opslaat. Minder logisch is dat we ook de 3 verschillende coördinaten bijhouden van de robot. De coördinaten van de x,y en z as kun je ophalen met de functie positon. Waarom dit nodig is zien we zo. De variabelen declareer je op de volgende positie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
def get_order():&lt;br /&gt;
    # get articles from central controller&lt;br /&gt;
    robot[&amp;quot;articles&amp;quot;] = start_sens.bodies[0][1:]&lt;br /&gt;
    print(robot[&amp;quot;articles&amp;quot;])&lt;br /&gt;
    # set game properties&lt;br /&gt;
    robot[&amp;quot;article_number&amp;quot;] = 1 &lt;br /&gt;
    robot[&amp;quot;target_desk&amp;quot;] = False &lt;br /&gt;
    robot[&amp;quot;robot_id&amp;quot;] = start_sens.bodies[1]&lt;br /&gt;
    # distance variables&lt;br /&gt;
    robot[&amp;quot;distance&amp;quot;] = 0.0&lt;br /&gt;
    robot[&amp;quot;location1&amp;quot;] = robot.position[0]&lt;br /&gt;
    robot[&amp;quot;location2&amp;quot;] = robot.position[1]&lt;br /&gt;
    robot[&amp;quot;location3&amp;quot;] = robot.position[2]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wanneer de order ingepakt is geef je niet alleen de robot id mee aan de centrale controller maar ook de gelopen afstand. Wanneer de robot een nieuwe order krijgt wordt de afstand namelijk weer op 0 gezet. Hoe de centrale controller omgaat met dit bericht zien we in de volgende paragraaf.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
GameLogic.sendMessage(&amp;quot;Done&amp;quot;, robot[&amp;quot;robot_id&amp;quot;] , &amp;quot;Ground&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
GameLogic.sendMessage(&amp;quot;Done&amp;quot;, str(robot[&amp;quot;distance&amp;quot;]) , &amp;quot;Ground&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Het updaten van de gelopen afstand gaat op de volgende manier:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
main()&lt;br /&gt;
robot[&amp;quot;distance&amp;quot;] += robot.getVectTo([robot[&amp;quot;location1&amp;quot;], robot[&amp;quot;location2&amp;quot;], robot[&amp;quot;location3&amp;quot;]])[0]&lt;br /&gt;
loc1 = robot.position[0]&lt;br /&gt;
loc2 = robot.position[1]&lt;br /&gt;
loc3 = robot.position[2]&lt;br /&gt;
robot[&amp;quot;location1&amp;quot;] = loc1&lt;br /&gt;
robot[&amp;quot;location2&amp;quot;] = loc2&lt;br /&gt;
robot[&amp;quot;location3&amp;quot;] = loc3&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Iedere keer als je de controller aanroept gebruik je de functie getVectTo() om de afstand te berekenen tussen de locatie waar de robot op dat moment is en de laatst opgeslagen locatie. Vervolgend update je de locatie coördinaten naar degene waar de robot nu staat. Zo kan je de totaal gelopen afstand van de robot bijhouden.&lt;br /&gt;
&lt;br /&gt;
=== Verandering centrale controller ===&lt;br /&gt;
De robot moet zijn eigen gelopen afstand bij houden maar de centrale controller moet dit voor alle robots doen. Hiervoor is dus ook een variabele nodig:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
if sens.positive:&lt;br /&gt;
    robot = &amp;quot;11&amp;quot;&lt;br /&gt;
    central[&amp;quot;distance&amp;quot;] = 0&lt;br /&gt;
    Send_order(robot)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
De waarde van de variabele wordt aangepast als de centrale controller een message krijgt. De gelopen afstand is het tweede bericht gestuurd door de robot en deze is dus te vinden in message.bodies[1]. &lt;br /&gt;
Wanneer alle orders zijn vervuld, kun je de totale afstand van de robot printen op de volgende manier:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
if message.positive:&lt;br /&gt;
    central[&amp;quot;boxes_done&amp;quot;] +=1&lt;br /&gt;
    print(&amp;quot;number of boxes done:&amp;quot;)&lt;br /&gt;
    print(central[&amp;quot;boxes_done&amp;quot;])&lt;br /&gt;
    central[&amp;quot;distance&amp;quot;] += float(message.bodies[1])&lt;br /&gt;
    if central[&amp;quot;boxes_done&amp;quot;] &amp;lt; central[&amp;quot;boxes_tot&amp;quot;]&lt;br /&gt;
        robot = message.bodies[0]&lt;br /&gt;
        Send_order(robot)&lt;br /&gt;
    else:&lt;br /&gt;
        print(&amp;quot;Total walked distance:&amp;quot;)&lt;br /&gt;
        print(central[&amp;quot;distance&amp;quot;])&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Experiment ===&lt;br /&gt;
Nu kunnen we gaan meten hoe efficiënt de robot is in de huidige situatie. Dit doen we door het huidige algoritme een aantal keer te draaien: we gaan een experiment doen. Meerder runs zijn nodig omdat de bestelling steeds verschilt. Op basis van één run kunnen we niet zeggen hoe het algoritme gemiddeld presteert. Het kan namelijk zo zijn dat je alleen naar de dichtstbijzijnde kast hoeft te lopen. Dit is geen goede representatie van een gemiddelde bestelling. Daarom doen we nu 5 runs. &lt;br /&gt;
&lt;br /&gt;
Hieronder staan de uitkomsten van een experiment:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Run !! Afstand&lt;br /&gt;
|-&lt;br /&gt;
|Run 1	|| 615&lt;br /&gt;
|-&lt;br /&gt;
|Run 2 ||	709&lt;br /&gt;
|-&lt;br /&gt;
|Run 3 ||	683&lt;br /&gt;
|-&lt;br /&gt;
|Run 4 ||	698&lt;br /&gt;
|-&lt;br /&gt;
|Run 5||	719&lt;br /&gt;
|-&lt;br /&gt;
|Gemiddelde	|| 684,8&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Doe zelf ook een experiment met minimaal 5 runs en bekijk of het gemiddelde overeenkomt met de resultaten in bovenstaande tabel. Hoe meer runs je hebt, hoe preciezer je schatting van de prestatie van de robot.&lt;br /&gt;
&lt;br /&gt;
==Efficiëntie verbetering voor 1 robot==&lt;br /&gt;
In het vorige algoritme kon het zo zijn dat de robot 2 keer naar dezelfde kast moest lopen. Het gevolg van de voorwaarde die we in het begin van deze les introduceerden is dat dit niet meer hoeft. We gaan nu zien hoe we dit moeten veranderen en wat het gevolg is op de prestatie. &lt;br /&gt;
&lt;br /&gt;
===Verandering centrale controller===&lt;br /&gt;
&lt;br /&gt;
We moeten nu gaan bedenken wat de beste manier is om deze opzet te implementeren in het systeem. Logischer is dat de robot de order doorgaat en zoekt naar dubbelen. Maar dit is programmeer technisch gezien meer werk. Daarom laten we de centrale controller kijken of er dubbele in de order zitten. We hoeven dan geen aanpassingen te doen in de robot controller en maar een kleine aanpassing in de centrale controller:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
def Send_order(robot_team):&lt;br /&gt;
    pre_order = [random.choice(box_articles) for t in range(central[&amp;quot;box_size&amp;quot;])]&lt;br /&gt;
    pre_order = list(set(pre_order))&lt;br /&gt;
    order = &amp;quot;&amp;quot;&lt;br /&gt;
    for j in range(len(pre_order)):&lt;br /&gt;
            order += &amp;quot; &amp;quot; + pre_order[j]&lt;br /&gt;
    GameLogic.sendMessage(&amp;quot;Start&amp;quot;, order , &amp;quot;Robot_&amp;quot;+robot, &amp;quot;Ground&amp;quot;)&lt;br /&gt;
    GameLogic.sendMessage(&amp;quot;Start&amp;quot;, robot , &amp;quot;Robot_&amp;quot;+robot, &amp;quot;Ground&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zoals je kunt zien moet je nu gebruik maken van een array voor het aanmaken van de bestelling. Dan kun je namelijk de functie list() en set() gebruiken voor het eruit halen van dubbele artikelen. Aan de robot kunnen we alleen een string meegeven en daarom moeten we de array nog omzetten in een string. De grootte van de order kan nu 1, 2 of nog steeds 3 zijn.&lt;br /&gt;
&lt;br /&gt;
===Experiment ===&lt;br /&gt;
De resultaten zijn nu als volgt:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Run !! Afstand&lt;br /&gt;
|-&lt;br /&gt;
|Run 1	|| 495&lt;br /&gt;
|-&lt;br /&gt;
|Run 2 ||	592&lt;br /&gt;
|-&lt;br /&gt;
|Run 3 ||	599&lt;br /&gt;
|-&lt;br /&gt;
|Run 4 ||	437&lt;br /&gt;
|-&lt;br /&gt;
|Run 5||	648&lt;br /&gt;
|-&lt;br /&gt;
|Gemiddelde	|| 554,2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Te zien is dat de gemiddelde afstand van een run naar beneden is gegaan met 130,6 meter. &lt;br /&gt;
Als je deze afstand omzet naar de tijd die de robot daardoor sneller is kun je nadenken of je moet investeren in robots die meer artikelen uit een kast kunnen halen. Wanneer de investering namelijk kleiner is dan de opbrengt zal dit voor extra winst zorgen. &lt;br /&gt;
&lt;br /&gt;
==Efficiëntie verbetering door samenwerking==&lt;br /&gt;
Dat we een verbetering zouden zien is natuurlijk begrijpelijk omdat de robots ineens meer kunnen tillen. Interessanter is dat we met deze simulatie hebben kunnen zien wat de efficiëntie winst precies zal zijn en of het zin heeft om in deze complexere machines te investeren.   &lt;br /&gt;
&lt;br /&gt;
We gaan nu kijken naar de efficiëntie verbetering is door met een team van 2 robots te werken. Naast de vermindering in totaal gelopen meters gaan we nu ook kijken naar de tijd die het kost om de orders in te pakken. &lt;br /&gt;
&lt;br /&gt;
===Creëren team===&lt;br /&gt;
De robots gaan nu in tweetallen werken om de artikelen op te halen. Er zijn veel mogelijkheden hoe de robots samen kunnen werken. Verdelen van soorten artikelen, eerstvolgende artikel op de lijst ophalen, eerst de verste artikelen etc. Omdat de robots naast elkaar staan maakt het qua gelopen afstand niet veel uit welke robot welk artikel haalt. Het gaat hier dus vooral om de winst in tijd.&lt;br /&gt;
We gaan twee verschillende algoritmen implementeren. Eerst geven we de robots verantwoordelijkheid over de helft van de artikelen en vervolgens kijken we naar een goede verdeling op basis van de binnengekregen order.&lt;br /&gt;
&lt;br /&gt;
Om een team aan het werk te kunnen zetten, moeten we wel een team hebben. Selecteer Robot_11 en kopieer de robot (ctrl+c, ctrl+v voor Windows en cmd+c, cmd+v voor Mac) druk op de toets G en de toets X en sleep robot naar achter. Je hebt nu twee robots:&lt;br /&gt;
&lt;br /&gt;
[[Bestand:2_robots.png]]&lt;br /&gt;
&lt;br /&gt;
Verander de naam van de tweede robot in Robot_10 op de volgende manier:&lt;br /&gt;
&lt;br /&gt;
[[Bestand:rename_robot.png]]&lt;br /&gt;
&lt;br /&gt;
Verwijder de extra python controllers door deze te selecteren en op ‘x’ te drukken. Zorg ervoor dat je alleen de twee onderstaande controllers overhoudt:&lt;br /&gt;
&lt;br /&gt;
[[Bestand:delete_controllers.png]]&lt;br /&gt;
&lt;br /&gt;
Voeg de robot controller toe aan Robot_10:&lt;br /&gt;
&lt;br /&gt;
[[Bestand:change_controller.png]]&lt;br /&gt;
&lt;br /&gt;
===Veranderingen centrale controller===&lt;br /&gt;
We nemen de code weer stap voor stap onder handen. Bij het definiëren van de box_articles is het nu handiger als de “Shelf_” er niet voor staat. Waarom zien we zo.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
# define game properties&lt;br /&gt;
central[&amp;quot;boxes_tot&amp;quot;] = 5&lt;br /&gt;
central[&amp;quot;box_size&amp;quot;] = 3&lt;br /&gt;
box_articles = [1,2,3,4,5,6,7,8]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In plaats dat we nu een robot meegeven aan Send_order() geven we een team mee. We moeten nu ook bijhouden of de robots op hun teammaatje aan het wachten zijn voordat een nieuwe order kan gaan starten. Hiervoor maken we een array aan met de waarden 0/1 voor 11 robots. Naast de afstand houden we ook de tijd bij.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
if sens.positive:&lt;br /&gt;
    robot_team = [&amp;quot;10&amp;quot;,&amp;quot;11&amp;quot;]&lt;br /&gt;
    central[&amp;quot;active_robots&amp;quot;] = [0,0,0,0,0,0,0,0,0,0,0]&lt;br /&gt;
    central[&amp;quot;distance&amp;quot;] =0&lt;br /&gt;
    central[&amp;quot;time&amp;quot;] = 0.0&lt;br /&gt;
    Send_order(robot_team)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
De order wordt nu twee keer zo lang omdat de robots samen werken. We knippen de order op bij artikel 4. Robot 10 gaat dus artikelen 1, 2, 3 en 4 ophalen en Robot 11 de rest:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
def Send_order(robot_team):&lt;br /&gt;
    pre_order = [random.choice(box_articles) for t in range(len(robot_team)*central[&amp;quot;box_size&amp;quot;])]&lt;br /&gt;
    pre_order = list(set(pre_order))&lt;br /&gt;
    pre_order.sort()&lt;br /&gt;
    order = &amp;quot;&amp;quot;&lt;br /&gt;
    order2= &amp;quot;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    for j in range(len(pre_order)):&lt;br /&gt;
        if j &amp;lt;= len(pre_order)/2 -1 :&lt;br /&gt;
            order += &amp;quot; Shelf_&amp;quot; + str(pre_order[j])&lt;br /&gt;
        else:&lt;br /&gt;
            order2 += &amp;quot; Shelf_&amp;quot; + str(pre_order[j])&lt;br /&gt;
    GameLogic.sendMessage(&amp;quot;Start&amp;quot;, order , &amp;quot;Robot_&amp;quot;+robot_team[0] , &amp;quot;Ground&amp;quot;)&lt;br /&gt;
    GameLogic.sendMessage(&amp;quot;Start&amp;quot;, robot_team[0] , &amp;quot;Robot_&amp;quot;+robot_team[0] , &amp;quot;Ground&amp;quot;)&lt;br /&gt;
    central[&amp;quot;active_robots&amp;quot;][int(robot_team[0])-1]=1&lt;br /&gt;
    GameLogic.sendMessage(&amp;quot;Start&amp;quot;, order2 , &amp;quot;Robot_&amp;quot;+robot_team[1] , &amp;quot;Ground&amp;quot;)&lt;br /&gt;
    GameLogic.sendMessage(&amp;quot;Start&amp;quot;, robot_team[1] , &amp;quot;Robot_&amp;quot;+robot_team[1] , &amp;quot;Ground&amp;quot;)&lt;br /&gt;
    central[&amp;quot;active_robots&amp;quot;][int(robot_team[1])-1]=1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wanneer de robot klaar is met zijn deel van de bestelling moet hij wachten op zijn teamgenoot voordat er een nieuwe order kan starten. Dit kan op de volgende manier geprogrammeerd worden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
if message.positive:&lt;br /&gt;
    central[&amp;quot;active_robots&amp;quot;][int(message.bodies[0])-1]=0&lt;br /&gt;
    central[&amp;quot;distance&amp;quot;] += float(message.bodies[1])&lt;br /&gt;
    if central[&amp;quot;boxes_done&amp;quot;] &amp;lt; central[&amp;quot;boxes_tot&amp;quot;]-1 and central[&amp;quot;active_robots&amp;quot;][10-1]+central[&amp;quot;active_robots&amp;quot;][11-1]==0:&lt;br /&gt;
        central[&amp;quot;boxes_done&amp;quot;] +=1&lt;br /&gt;
        print(&amp;quot;number of boxes done:&amp;quot;)&lt;br /&gt;
        print(central[&amp;quot;boxes_done&amp;quot;])&lt;br /&gt;
        Send_order([&amp;quot;10&amp;quot;,&amp;quot;11&amp;quot;])&lt;br /&gt;
    if sum(central[&amp;quot;active_robots&amp;quot;]) == 0: &lt;br /&gt;
        print(&amp;quot;Total walked distance:&amp;quot;)&lt;br /&gt;
        print(central[&amp;quot;distance&amp;quot;])&lt;br /&gt;
        print(central[&amp;quot;time&amp;quot;])&lt;br /&gt;
 &lt;br /&gt;
central[&amp;quot;time&amp;quot;]+= 1/60&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
De tijd wordt bijgehouden met central[“time”]. Hiervoor moet je een Always sensor toevoegen met een pulse. Deze geeft 60 keer per seconde een pulse aan de central controller. Door bij iedere pulse 1/60 toe te voegen aan de variabele, kunnen we de tijd bijhouden. &lt;br /&gt;
&lt;br /&gt;
[[Bestand:add_pulse.png]]&lt;br /&gt;
&lt;br /&gt;
In de robot.py kun je print(“done robot 11”) vervangen door onderstaande regel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
print(&amp;quot;done robot &amp;quot;+ str(robot[&amp;quot;robot_id&amp;quot;]))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Experiment===&lt;br /&gt;
Hieronder staan de resultaten van een experiment.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Experiment 1&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Run !! Afstand !! Tijd&lt;br /&gt;
|-&lt;br /&gt;
|Run 1	|| 929 ||	124&lt;br /&gt;
|-&lt;br /&gt;
|Run 2 ||	879 ||	134&lt;br /&gt;
|-&lt;br /&gt;
|Run 3 ||	1092 ||	154&lt;br /&gt;
|-&lt;br /&gt;
|Run 4 ||	863	|| 121&lt;br /&gt;
|-&lt;br /&gt;
|Run 5||	805	|| 109&lt;br /&gt;
|-&lt;br /&gt;
|Gemiddelde	|| 913,6 ||	128,4&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Als we de gemiddelde afstand willen vergelijken met de afstanden uit de vorige experimenten moeten we dit getal eerst delen door 2 omdat er nu 2 keer zoveel bestellingen gedaan worden. We zien dan weer een verbetering in het totaal gelopen meters. Omdat dit niet erg verassend is gaan we nu kijken naar het tweede algoritme. Hier bekijken we een slimmere aanpak voor het verdelen van de artikelen in de order zodat de robots minder lang op elkaar wachten. We kunnen zo een winst in tijd behalen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Experiment 2&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Nu kan het voorkomen dat het aantal op te halen artikelen erg verschillend is doordat de artikelen alleen in kast 1 t/m 4 of 5 t/m 8 staan. Dit willen we gaan verbeteren. Dit kun je op de volgende manier doen: kijk naar het aantal artikelen in de array pre_order en deel dit door 2. Bij een oneven aantal artikelen krijgt Robot 11 het extra artikel. De code ziet er dan als volgt uit:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
def Send_order(robot_team):&lt;br /&gt;
    pre_order = [random.choice(box_articles) for t in range(len(robot_team)*central[&amp;quot;box_size&amp;quot;])]&lt;br /&gt;
    pre_order = list(set(pre_order))&lt;br /&gt;
    pre_order.sort()&lt;br /&gt;
    order = &amp;quot;&amp;quot;&lt;br /&gt;
    order2= &amp;quot;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    for j in range(len(pre_order)):&lt;br /&gt;
        if j &amp;lt;= len(pre_order)/2 -1 :&lt;br /&gt;
            order += &amp;quot; Shelf_&amp;quot; + str(pre_order[j])&lt;br /&gt;
        else:&lt;br /&gt;
            order2 += &amp;quot; Shelf_&amp;quot; + str(pre_order[j])&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
De resultaten van het experiment zijn nu:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Run !! Afstand !! Tijd&lt;br /&gt;
|-&lt;br /&gt;
|Run 1	|| 950 ||	114&lt;br /&gt;
|-&lt;br /&gt;
|Run 2 ||	940 ||	111&lt;br /&gt;
|-&lt;br /&gt;
|Run 3 ||	940 ||	112&lt;br /&gt;
|-&lt;br /&gt;
|Run 4 ||	993	|| 117&lt;br /&gt;
|-&lt;br /&gt;
|Run 5||	996	|| 116&lt;br /&gt;
|-&lt;br /&gt;
|Gemiddelde	|| 963,8 ||	114&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
We zien dat, ondanks de verhoging van het aantal gelopen meters, de totale tijd afgenomen is. Dit is dus een echte verbetering van het algoritme omdat dezelfde opstelling gebruikt wordt maar er slimmer gebruik wordt gemaakt van de robots.&lt;br /&gt;
&lt;br /&gt;
===Plusopdracht===&lt;br /&gt;
Bedenk andere manieren om de taken tussen de robots te verdelen om de gelopen afstand of tijd naar beneden te krijgen. Doe hier experimenten mee&lt;/div&gt;</summary>
		<author><name>Jacqueline</name></author>
	</entry>
	<entry>
		<id>https://infvo.nl/lab/index.php?title=Logistieke_Robots/les_5&amp;diff=432</id>
		<title>Logistieke Robots/les 5</title>
		<link rel="alternate" type="text/html" href="https://infvo.nl/lab/index.php?title=Logistieke_Robots/les_5&amp;diff=432"/>
		<updated>2014-12-17T13:42:46Z</updated>

		<summary type="html">&lt;p&gt;Jacqueline: /* Les 5 - Robots laten samen werken */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Zijbalk Logistieke Robots}}&lt;br /&gt;
&lt;br /&gt;
==Les 5 - Robots laten samen werken ==&lt;br /&gt;
In de vorige les heb je een controller gemaakt voor 1 robot om bestellingen te kunnen verzamelen. In deze les leer je om een team van twee robots samen te laten werken om mogelijk sneller de bestellingen te laten verzamelen. &lt;br /&gt;
&lt;br /&gt;
Je kan een team van twee robots op veel verschillende manieren met elkaar samen laten werken. In de praktijk heb je vaak te maken met beperkingen zoals het maximale gewicht wat een robot kan tillen. Wij gaan in onze simulatie uit van de volgende restrictie:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Robots kunnen in één keer meerdere artikelen meenemen uit een kast indien deze artikelen dezelfde zijn. Dit geldt niet voor verschillende artikelen.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Bij een enkele robot kunnen we ons dus voorstellen dat hij eerst de hele bestelling doorneemt om te kijken of er dezelfde artikelen in zitten. Wanneer dit het geval is loopt de robot naar de juiste kast en pakt een pakket waar al twee dezelfde artikelen in zitten. Een efficiëntie verbetering kunnen we vervolgens uitdrukken als het aantal minder gelopen meters.&lt;br /&gt;
&lt;br /&gt;
We implementeren in deze les het volgende scenario: 2 robots werken samen om 2 bestellingen op te halen waarbij de bovengenoemde voorwaarde nog steeds geld en waarbij de robots niet naar dezelfde kasten lopen. We richten ons in deze les vooral op de programmering dan op de visualisatie.&lt;br /&gt;
&lt;br /&gt;
[[embedvideo]]&lt;br /&gt;
http://youtu.be/nEgubbYwRy0&lt;br /&gt;
[[/embedvideo]]&lt;br /&gt;
&lt;br /&gt;
== Bijhouden van de gelopen afstand ==&lt;br /&gt;
Voordat we efficiëntie verbeteringen kunnen detecteren, moeten we eerst de huidige situatie kunnen meten. Dit doen we aan de hand van de gelopen afstand in meters van de robot. Hoe je dit doet leer je in deze paragraaf.&lt;br /&gt;
&lt;br /&gt;
=== Verandering robot controller ===&lt;br /&gt;
Logisch is dat we een extra variabele gaan creëren die de gelopen afstand van de robot opslaat. Minder logisch is dat we ook de 3 verschillende coördinaten bijhouden van de robot. De coördinaten van de x,y en z as kun je ophalen met de functie positon. Waarom dit nodig is zien we zo. De variabelen declareer je op de volgende positie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
def get_order():&lt;br /&gt;
    # get articles from central controller&lt;br /&gt;
    robot[&amp;quot;articles&amp;quot;] = start_sens.bodies[0][1:]&lt;br /&gt;
    print(robot[&amp;quot;articles&amp;quot;])&lt;br /&gt;
    # set game properties&lt;br /&gt;
    robot[&amp;quot;article_number&amp;quot;] = 1 &lt;br /&gt;
    robot[&amp;quot;target_desk&amp;quot;] = False &lt;br /&gt;
    robot[&amp;quot;robot_id&amp;quot;] = start_sens.bodies[1]&lt;br /&gt;
    # distance variables&lt;br /&gt;
    robot[&amp;quot;distance&amp;quot;] = 0.0&lt;br /&gt;
    robot[&amp;quot;location1&amp;quot;] = robot.position[0]&lt;br /&gt;
    robot[&amp;quot;location2&amp;quot;] = robot.position[1]&lt;br /&gt;
    robot[&amp;quot;location3&amp;quot;] = robot.position[2]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wanneer de order ingepakt is geef je niet alleen de robot id mee aan de centrale controller maar ook de gelopen afstand. Wanneer de robot een nieuwe order krijgt wordt de afstand namelijk weer op 0 gezet. Hoe de centrale controller omgaat met dit bericht zien we in de volgende paragraaf.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
GameLogic.sendMessage(&amp;quot;Done&amp;quot;, robot[&amp;quot;robot_id&amp;quot;] , &amp;quot;Ground&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
GameLogic.sendMessage(&amp;quot;Done&amp;quot;, str(robot[&amp;quot;distance&amp;quot;]) , &amp;quot;Ground&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Het updaten van de gelopen afstand gaat op de volgende manier:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
main()&lt;br /&gt;
robot[&amp;quot;distance&amp;quot;] += robot.getVectTo([robot[&amp;quot;location1&amp;quot;], robot[&amp;quot;location2&amp;quot;], robot[&amp;quot;location3&amp;quot;]])[0]&lt;br /&gt;
loc1 = robot.position[0]&lt;br /&gt;
loc2 = robot.position[1]&lt;br /&gt;
loc3 = robot.position[2]&lt;br /&gt;
robot[&amp;quot;location1&amp;quot;] = loc1&lt;br /&gt;
robot[&amp;quot;location2&amp;quot;] = loc2&lt;br /&gt;
robot[&amp;quot;location3&amp;quot;] = loc3&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Iedere keer als je de controller aanroept gebruik je de functie getVectTo() om de afstand te berekenen tussen de locatie waar de robot op dat moment is en de laatst opgeslagen locatie. Vervolgend update je de locatie coördinaten naar degene waar de robot nu staat. Zo kan je de totaal gelopen afstand van de robot bijhouden.&lt;br /&gt;
&lt;br /&gt;
=== Verandering centrale controller ===&lt;br /&gt;
De robot moet zijn eigen gelopen afstand bij houden maar de centrale controller moet dit voor alle robots doen. Hiervoor is dus ook een variabele nodig:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
if sens.positive:&lt;br /&gt;
    robot = &amp;quot;11&amp;quot;&lt;br /&gt;
    central[&amp;quot;distance&amp;quot;] = 0&lt;br /&gt;
    Send_order(robot)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
De waarde van de variabele wordt aangepast als de centrale controller een message krijgt. De gelopen afstand is het tweede bericht gestuurd door de robot en deze is dus te vinden in message.bodies[1]. &lt;br /&gt;
Wanneer alle orders zijn vervuld, kun je de totale afstand van de robot printen op de volgende manier:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
if message.positive:&lt;br /&gt;
    central[&amp;quot;boxes_done&amp;quot;] +=1&lt;br /&gt;
    print(&amp;quot;number of boxes done:&amp;quot;)&lt;br /&gt;
    print(central[&amp;quot;boxes_done&amp;quot;])&lt;br /&gt;
    central[&amp;quot;distance&amp;quot;] += float(message.bodies[1])&lt;br /&gt;
    if central[&amp;quot;boxes_done&amp;quot;] &amp;lt; central[&amp;quot;boxes_tot&amp;quot;]&lt;br /&gt;
        robot = message.bodies[0]&lt;br /&gt;
        Send_order(robot)&lt;br /&gt;
    else:&lt;br /&gt;
        print(&amp;quot;Total walked distance:&amp;quot;)&lt;br /&gt;
        print(central[&amp;quot;distance&amp;quot;])&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Experiment ===&lt;br /&gt;
Nu kunnen we gaan meten hoe efficiënt de robot is in de huidige situatie. Dit doen we door het huidige algoritme een aantal keer te draaien: we gaan een experiment doen. Meerder runs zijn nodig omdat de bestelling steeds verschilt. Op basis van één run kunnen we niet zeggen hoe het algoritme gemiddeld presteert. Het kan namelijk zo zijn dat je alleen naar de dichtstbijzijnde kast hoeft te lopen. Dit is geen goede representatie van een gemiddelde bestelling. Daarom doen we nu 5 runs. &lt;br /&gt;
&lt;br /&gt;
Hieronder staan de uitkomsten van een experiment:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Run !! Afstand&lt;br /&gt;
|-&lt;br /&gt;
|Run 1	|| 615&lt;br /&gt;
|-&lt;br /&gt;
|Run 2 ||	709&lt;br /&gt;
|-&lt;br /&gt;
|Run 3 ||	683&lt;br /&gt;
|-&lt;br /&gt;
|Run 4 ||	698&lt;br /&gt;
|-&lt;br /&gt;
|Run 5||	719&lt;br /&gt;
|-&lt;br /&gt;
|Gemiddelde	|| 684,8&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Doe zelf ook een experiment met minimaal 5 runs en bekijk of het gemiddelde overeenkomt met de resultaten in bovenstaande tabel. Hoe meer runs je hebt, hoe preciezer je schatting van de prestatie van de robot.&lt;br /&gt;
&lt;br /&gt;
==Efficiëntie verbetering voor 1 robot==&lt;br /&gt;
In het vorige algoritme kon het zo zijn dat de robot 2 keer naar dezelfde kast moest lopen. Het gevolg van de voorwaarde die we in het begin van deze les introduceerden is dat dit niet meer hoeft. We gaan nu zien hoe we dit moeten veranderen en wat het gevolg is op de prestatie. &lt;br /&gt;
&lt;br /&gt;
===Verandering centrale controller===&lt;br /&gt;
&lt;br /&gt;
We moeten nu gaan bedenken wat de beste manier is om deze opzet te implementeren in het systeem. Logischer is dat de robot de order doorgaat en zoekt naar dubbelen. Maar dit is programmeer technisch gezien meer werk. Daarom laten we de centrale controller kijken of er dubbele in de order zitten. We hoeven dan geen aanpassingen te doen in de robot controller en maar een kleine aanpassing in de centrale controller:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
def Send_order(robot_team):&lt;br /&gt;
    pre_order = [random.choice(box_articles) for t in range(central[&amp;quot;box_size&amp;quot;])]&lt;br /&gt;
    pre_order = list(set(pre_order))&lt;br /&gt;
    order = &amp;quot;&amp;quot;&lt;br /&gt;
    for j in range(len(pre_order)):&lt;br /&gt;
            order += &amp;quot; &amp;quot; + pre_order[j]&lt;br /&gt;
    GameLogic.sendMessage(&amp;quot;Start&amp;quot;, order , &amp;quot;Robot_&amp;quot;+robot, &amp;quot;Ground&amp;quot;)&lt;br /&gt;
    GameLogic.sendMessage(&amp;quot;Start&amp;quot;, robot , &amp;quot;Robot_&amp;quot;+robot, &amp;quot;Ground&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zoals je kunt zien moet je nu gebruik maken van een array voor het aanmaken van de bestelling. Dan kun je namelijk de functie list() en set() gebruiken voor het eruit halen van dubbele artikelen. Aan de robot kunnen we alleen een string meegeven en daarom moeten we de array nog omzetten in een string. De grootte van de order kan nu 1, 2 of nog steeds 3 zijn.&lt;br /&gt;
&lt;br /&gt;
===Experiment ===&lt;br /&gt;
De resultaten zijn nu als volgt:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Run !! Afstand&lt;br /&gt;
|-&lt;br /&gt;
|Run 1	|| 495&lt;br /&gt;
|-&lt;br /&gt;
|Run 2 ||	592&lt;br /&gt;
|-&lt;br /&gt;
|Run 3 ||	599&lt;br /&gt;
|-&lt;br /&gt;
|Run 4 ||	437&lt;br /&gt;
|-&lt;br /&gt;
|Run 5||	648&lt;br /&gt;
|-&lt;br /&gt;
|Gemiddelde	|| 554,2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Te zien is dat de gemiddelde afstand van een run naar beneden is gegaan met 130,6 meter. &lt;br /&gt;
Als je deze afstand omzet naar de tijd die de robot daardoor sneller is kun je nadenken of je moet investeren in robots die meer artikelen uit een kast kunnen halen. Wanneer de investering namelijk kleiner is dan de opbrengt zal dit voor extra winst zorgen. &lt;br /&gt;
&lt;br /&gt;
==Efficiëntie verbetering door samenwerking==&lt;br /&gt;
Dat we een verbetering zouden zien is natuurlijk begrijpelijk omdat de robots ineens meer kunnen tillen. Interessanter is dat we met deze simulatie hebben kunnen zien wat de efficiëntie winst precies zal zijn en of het zin heeft om in deze complexere machines te investeren.   &lt;br /&gt;
&lt;br /&gt;
We gaan nu kijken naar de efficiëntie verbetering is door met een team van 2 robots te werken. Naast de vermindering in totaal gelopen meters gaan we nu ook kijken naar de tijd die het kost om de orders in te pakken. &lt;br /&gt;
&lt;br /&gt;
===Creëren team===&lt;br /&gt;
De robots gaan nu in tweetallen werken om de artikelen op te halen. Er zijn veel mogelijkheden hoe de robots samen kunnen werken. Verdelen van soorten artikelen, eerstvolgende artikel op de lijst ophalen, eerst de verste artikelen etc. Omdat de robots naast elkaar staan maakt het qua gelopen afstand niet veel uit welke robot welk artikel haalt. Het gaat hier dus vooral om de winst in tijd.&lt;br /&gt;
We gaan twee verschillende algoritmen implementeren. Eerst geven we de robots verantwoordelijkheid over de helft van de artikelen en vervolgens kijken we naar een goede verdeling op basis van de binnengekregen order.&lt;br /&gt;
&lt;br /&gt;
Om een team aan het werk te kunnen zetten, moeten we wel een team hebben. Selecteer Robot_11 en kopieer de robot (ctrl+c, ctrl+v voor Windows en cmd+c, cmd+v voor Mac) druk op de toets G en de toets X en sleep robot naar achter. Je hebt nu twee robots:&lt;br /&gt;
&lt;br /&gt;
[[Bestand:2_robots.png]]&lt;br /&gt;
&lt;br /&gt;
Verander de naam van de tweede robot in Robot_10 op de volgende manier:&lt;br /&gt;
&lt;br /&gt;
[[Bestand:rename_robot.png]]&lt;br /&gt;
&lt;br /&gt;
Verwijder de extra python controllers door deze te selecteren en op ‘x’ te drukken. Zorg ervoor dat je alleen de twee onderstaande controllers overhoudt:&lt;br /&gt;
&lt;br /&gt;
[[Bestand:delete_controllers.png]]&lt;br /&gt;
&lt;br /&gt;
Voeg de robot controller toe aan Robot_10:&lt;br /&gt;
&lt;br /&gt;
[[Bestand:change_controller.png]]&lt;br /&gt;
&lt;br /&gt;
===Veranderingen centrale controller===&lt;br /&gt;
We nemen de code weer stap voor stap onder handen. Bij het definiëren van de box_articles is het nu handiger als de “Shelf_” er niet voor staat. Waarom zien we zo.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
# define game properties&lt;br /&gt;
central[&amp;quot;boxes_tot&amp;quot;] = 5&lt;br /&gt;
central[&amp;quot;box_size&amp;quot;] = 3&lt;br /&gt;
box_articles = [1,2,3,4,5,6,7,8]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In plaats dat we nu een robot meegeven aan Send_order() geven we een team mee. We moeten nu ook bijhouden of de robots op hun teammaatje aan het wachten zijn voordat een nieuwe order kan gaan starten. Hiervoor maken we een array aan met de waarden 0/1 voor 11 robots. Naast de afstand houden we ook de tijd bij.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
if sens.positive:&lt;br /&gt;
    robot_team = [&amp;quot;10&amp;quot;,&amp;quot;11&amp;quot;]&lt;br /&gt;
    central[&amp;quot;active_robots&amp;quot;] = [0,0,0,0,0,0,0,0,0,0,0]&lt;br /&gt;
    central[&amp;quot;distance&amp;quot;] =0&lt;br /&gt;
    central[&amp;quot;time&amp;quot;] = 0.0&lt;br /&gt;
    Send_order(robot_team)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
De order wordt nu twee keer zo lang omdat de robots samen werken. We knippen de order op bij artikel 4. Robot 10 gaat dus artikelen 1, 2, 3 en 4 ophalen en Robot 11 de rest:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
def Send_order(robot_team):&lt;br /&gt;
    pre_order = [random.choice(box_articles) for t in range(len(robot_team)*central[&amp;quot;box_size&amp;quot;])]&lt;br /&gt;
    pre_order = list(set(pre_order))&lt;br /&gt;
    pre_order.sort()&lt;br /&gt;
    order = &amp;quot;&amp;quot;&lt;br /&gt;
    order2= &amp;quot;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    for j in range(len(pre_order)):&lt;br /&gt;
        if j &amp;lt;= len(pre_order)/2 -1 :&lt;br /&gt;
            order += &amp;quot; Shelf_&amp;quot; + str(pre_order[j])&lt;br /&gt;
        else:&lt;br /&gt;
            order2 += &amp;quot; Shelf_&amp;quot; + str(pre_order[j])&lt;br /&gt;
    GameLogic.sendMessage(&amp;quot;Start&amp;quot;, order , &amp;quot;Robot_&amp;quot;+robot_team[0] , &amp;quot;Ground&amp;quot;)&lt;br /&gt;
    GameLogic.sendMessage(&amp;quot;Start&amp;quot;, robot_team[0] , &amp;quot;Robot_&amp;quot;+robot_team[0] , &amp;quot;Ground&amp;quot;)&lt;br /&gt;
    central[&amp;quot;active_robots&amp;quot;][int(robot_team[0])-1]=1&lt;br /&gt;
    GameLogic.sendMessage(&amp;quot;Start&amp;quot;, order2 , &amp;quot;Robot_&amp;quot;+robot_team[1] , &amp;quot;Ground&amp;quot;)&lt;br /&gt;
    GameLogic.sendMessage(&amp;quot;Start&amp;quot;, robot_team[1] , &amp;quot;Robot_&amp;quot;+robot_team[1] , &amp;quot;Ground&amp;quot;)&lt;br /&gt;
    central[&amp;quot;active_robots&amp;quot;][int(robot_team[1])-1]=1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wanneer de robot klaar is met zijn deel van de bestelling moet hij wachten op zijn teamgenoot voordat er een nieuwe order kan starten. Dit kan op de volgende manier geprogrammeerd worden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
if message.positive:&lt;br /&gt;
    central[&amp;quot;active_robots&amp;quot;][int(message.bodies[0])-1]=0&lt;br /&gt;
    central[&amp;quot;distance&amp;quot;] += float(message.bodies[1])&lt;br /&gt;
    if central[&amp;quot;boxes_done&amp;quot;] &amp;lt; central[&amp;quot;boxes_tot&amp;quot;]-1 and central[&amp;quot;active_robots&amp;quot;][10-1]+central[&amp;quot;active_robots&amp;quot;][11-1]==0:&lt;br /&gt;
        central[&amp;quot;boxes_done&amp;quot;] +=1&lt;br /&gt;
        print(&amp;quot;number of boxes done:&amp;quot;)&lt;br /&gt;
        print(central[&amp;quot;boxes_done&amp;quot;])&lt;br /&gt;
        Send_order([&amp;quot;10&amp;quot;,&amp;quot;11&amp;quot;])&lt;br /&gt;
    if sum(central[&amp;quot;active_robots&amp;quot;]) == 0: &lt;br /&gt;
        print(&amp;quot;Total walked distance:&amp;quot;)&lt;br /&gt;
        print(central[&amp;quot;distance&amp;quot;])&lt;br /&gt;
        print(central[&amp;quot;time&amp;quot;])&lt;br /&gt;
 &lt;br /&gt;
central[&amp;quot;time&amp;quot;]+= 1/60&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
De tijd wordt bijgehouden met central[“time”]. Hiervoor moet je een Always sensor toevoegen met een pulse. Deze geeft 60 keer per seconde een pulse aan de central controller. Door bij iedere pulse 1/60 toe te voegen aan de variabele, kunnen we de tijd bijhouden. &lt;br /&gt;
&lt;br /&gt;
[[Bestand:add_pulse.png]]&lt;br /&gt;
&lt;br /&gt;
In de robot.py kun je print(“done robot 11”) vervangen door onderstaande regel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
print(&amp;quot;done robot &amp;quot;+ str(robot[&amp;quot;robot_id&amp;quot;]))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Experiment===&lt;br /&gt;
Hieronder staan de resultaten van een experiment.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Experiment 1&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Run !! Afstand !! Tijd&lt;br /&gt;
|-&lt;br /&gt;
|Run 1	|| 929 ||	124&lt;br /&gt;
|-&lt;br /&gt;
|Run 2 ||	879 ||	134&lt;br /&gt;
|-&lt;br /&gt;
|Run 3 ||	1092 ||	154&lt;br /&gt;
|-&lt;br /&gt;
|Run 4 ||	863	|| 121&lt;br /&gt;
|-&lt;br /&gt;
|Run 5||	805	|| 109&lt;br /&gt;
|-&lt;br /&gt;
|Gemiddelde	|| 913,6 ||	128,4&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Als we de gemiddelde afstand willen vergelijken met de afstanden uit de vorige experimenten moeten we dit getal eerst delen door 2 omdat er nu 2 keer zoveel bestellingen gedaan worden. We zien dan weer een verbetering in het totaal gelopen meters. Omdat dit niet erg verassend is gaan we nu kijken naar het tweede algoritme. Hier bekijken we een slimmere aanpak voor het verdelen van de artikelen in de order zodat de robots minder lang op elkaar wachten. We kunnen zo een winst in tijd behalen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Experiment 2&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Nu kan het voorkomen dat het aantal op te halen artikelen erg verschillend is doordat de artikelen alleen in kast 1 t/m 4 of 5 t/m 8 staan. Dit willen we gaan verbeteren. Dit kun je op de volgende manier doen: kijk naar het aantal artikelen in de array pre_order en deel dit door 2. Bij een oneven aantal artikelen krijgt Robot 11 het extra artikel. De code ziet er dan als volgt uit:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
def Send_order(robot_team):&lt;br /&gt;
    pre_order = [random.choice(box_articles) for t in range(len(robot_team)*central[&amp;quot;box_size&amp;quot;])]&lt;br /&gt;
    pre_order = list(set(pre_order))&lt;br /&gt;
    pre_order.sort()&lt;br /&gt;
    order = &amp;quot;&amp;quot;&lt;br /&gt;
    order2= &amp;quot;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    for j in range(len(pre_order)):&lt;br /&gt;
        if j &amp;lt;= len(pre_order)/2 -1 :&lt;br /&gt;
            order += &amp;quot; Shelf_&amp;quot; + str(pre_order[j])&lt;br /&gt;
        else:&lt;br /&gt;
            order2 += &amp;quot; Shelf_&amp;quot; + str(pre_order[j])&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
De resultaten van het experiment zijn nu:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Run !! Afstand !! Tijd&lt;br /&gt;
|-&lt;br /&gt;
|Run 1	|| 950 ||	114&lt;br /&gt;
|-&lt;br /&gt;
|Run 2 ||	940 ||	111&lt;br /&gt;
|-&lt;br /&gt;
|Run 3 ||	940 ||	112&lt;br /&gt;
|-&lt;br /&gt;
|Run 4 ||	993	|| 117&lt;br /&gt;
|-&lt;br /&gt;
|Run 5||	996	|| 116&lt;br /&gt;
|-&lt;br /&gt;
|Gemiddelde	|| 963,8 ||	114&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
We zien dat, ondanks de verhoging van het aantal gelopen meters, de totale tijd afgenomen is. Dit is dus een echte verbetering van het algoritme omdat dezelfde opstelling gebruikt wordt maar er slimmer gebruik wordt gemaakt van de robots.&lt;br /&gt;
&lt;br /&gt;
===Plusopdracht===&lt;br /&gt;
Bedenk andere manieren om de taken tussen de robots te verdelen om de gelopen afstand of tijd naar beneden te krijgen. Doe hier experimenten mee&lt;/div&gt;</summary>
		<author><name>Jacqueline</name></author>
	</entry>
	<entry>
		<id>https://infvo.nl/lab/index.php?title=Logistieke_Robots/les_5&amp;diff=431</id>
		<title>Logistieke Robots/les 5</title>
		<link rel="alternate" type="text/html" href="https://infvo.nl/lab/index.php?title=Logistieke_Robots/les_5&amp;diff=431"/>
		<updated>2014-12-17T13:41:51Z</updated>

		<summary type="html">&lt;p&gt;Jacqueline: /* Les 5 - Robots laten samen werken */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Zijbalk Logistieke Robots}}&lt;br /&gt;
&lt;br /&gt;
==Les 5 - Robots laten samen werken ==&lt;br /&gt;
In de vorige les heb je een controller gemaakt voor 1 robot om bestellingen te kunnen verzamelen. In deze les leer je om een team van twee robots samen te laten werken om mogelijk sneller de bestellingen te laten verzamelen. &lt;br /&gt;
&lt;br /&gt;
Je kan een team van twee robots op veel verschillende manieren met elkaar samen laten werken. In de praktijk heb je vaak te maken met beperkingen zoals het maximale gewicht wat een robot kan tillen. Wij gaan in onze simulatie uit van de volgende restrictie:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Robots kunnen in één keer meerdere artikelen meenemen uit een kast indien deze artikelen dezelfde zijn. Dit geldt niet voor verschillende artikelen.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Bij een enkele robot kunnen we ons dus voorstellen dat hij eerst de hele bestelling doorneemt om te kijken of er dezelfde artikelen in zitten. Wanneer dit het geval is loopt de robot naar de juiste kast en pakt een pakket waar al twee dezelfde artikelen in zitten. Een efficiëntie verbetering kunnen we vervolgens uitdrukken als het aantal minder gelopen meters.&lt;br /&gt;
&lt;br /&gt;
We implementeren in deze les het volgende scenario: 2 robots werken samen om 2 bestellingen op te halen waarbij de bovengenoemde voorwaarde nog steeds geld en waarbij de robots niet naar dezelfde kasten lopen. We richten ons in deze les vooral op de programmering dan op de visualisatie.&lt;br /&gt;
&lt;br /&gt;
[[embedvideo]]&lt;br /&gt;
&amp;lt;iframe width=&amp;quot;420&amp;quot; height=&amp;quot;315&amp;quot; src=&amp;quot;//www.youtube.com/embed/nEgubbYwRy0&amp;quot; frameborder=&amp;quot;0&amp;quot; allowfullscreen&amp;gt;&amp;lt;/iframe&amp;gt;&lt;br /&gt;
[[/embedvideo]]&lt;br /&gt;
&lt;br /&gt;
== Bijhouden van de gelopen afstand ==&lt;br /&gt;
Voordat we efficiëntie verbeteringen kunnen detecteren, moeten we eerst de huidige situatie kunnen meten. Dit doen we aan de hand van de gelopen afstand in meters van de robot. Hoe je dit doet leer je in deze paragraaf.&lt;br /&gt;
&lt;br /&gt;
=== Verandering robot controller ===&lt;br /&gt;
Logisch is dat we een extra variabele gaan creëren die de gelopen afstand van de robot opslaat. Minder logisch is dat we ook de 3 verschillende coördinaten bijhouden van de robot. De coördinaten van de x,y en z as kun je ophalen met de functie positon. Waarom dit nodig is zien we zo. De variabelen declareer je op de volgende positie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
def get_order():&lt;br /&gt;
    # get articles from central controller&lt;br /&gt;
    robot[&amp;quot;articles&amp;quot;] = start_sens.bodies[0][1:]&lt;br /&gt;
    print(robot[&amp;quot;articles&amp;quot;])&lt;br /&gt;
    # set game properties&lt;br /&gt;
    robot[&amp;quot;article_number&amp;quot;] = 1 &lt;br /&gt;
    robot[&amp;quot;target_desk&amp;quot;] = False &lt;br /&gt;
    robot[&amp;quot;robot_id&amp;quot;] = start_sens.bodies[1]&lt;br /&gt;
    # distance variables&lt;br /&gt;
    robot[&amp;quot;distance&amp;quot;] = 0.0&lt;br /&gt;
    robot[&amp;quot;location1&amp;quot;] = robot.position[0]&lt;br /&gt;
    robot[&amp;quot;location2&amp;quot;] = robot.position[1]&lt;br /&gt;
    robot[&amp;quot;location3&amp;quot;] = robot.position[2]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wanneer de order ingepakt is geef je niet alleen de robot id mee aan de centrale controller maar ook de gelopen afstand. Wanneer de robot een nieuwe order krijgt wordt de afstand namelijk weer op 0 gezet. Hoe de centrale controller omgaat met dit bericht zien we in de volgende paragraaf.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
GameLogic.sendMessage(&amp;quot;Done&amp;quot;, robot[&amp;quot;robot_id&amp;quot;] , &amp;quot;Ground&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
GameLogic.sendMessage(&amp;quot;Done&amp;quot;, str(robot[&amp;quot;distance&amp;quot;]) , &amp;quot;Ground&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Het updaten van de gelopen afstand gaat op de volgende manier:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
main()&lt;br /&gt;
robot[&amp;quot;distance&amp;quot;] += robot.getVectTo([robot[&amp;quot;location1&amp;quot;], robot[&amp;quot;location2&amp;quot;], robot[&amp;quot;location3&amp;quot;]])[0]&lt;br /&gt;
loc1 = robot.position[0]&lt;br /&gt;
loc2 = robot.position[1]&lt;br /&gt;
loc3 = robot.position[2]&lt;br /&gt;
robot[&amp;quot;location1&amp;quot;] = loc1&lt;br /&gt;
robot[&amp;quot;location2&amp;quot;] = loc2&lt;br /&gt;
robot[&amp;quot;location3&amp;quot;] = loc3&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Iedere keer als je de controller aanroept gebruik je de functie getVectTo() om de afstand te berekenen tussen de locatie waar de robot op dat moment is en de laatst opgeslagen locatie. Vervolgend update je de locatie coördinaten naar degene waar de robot nu staat. Zo kan je de totaal gelopen afstand van de robot bijhouden.&lt;br /&gt;
&lt;br /&gt;
=== Verandering centrale controller ===&lt;br /&gt;
De robot moet zijn eigen gelopen afstand bij houden maar de centrale controller moet dit voor alle robots doen. Hiervoor is dus ook een variabele nodig:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
if sens.positive:&lt;br /&gt;
    robot = &amp;quot;11&amp;quot;&lt;br /&gt;
    central[&amp;quot;distance&amp;quot;] = 0&lt;br /&gt;
    Send_order(robot)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
De waarde van de variabele wordt aangepast als de centrale controller een message krijgt. De gelopen afstand is het tweede bericht gestuurd door de robot en deze is dus te vinden in message.bodies[1]. &lt;br /&gt;
Wanneer alle orders zijn vervuld, kun je de totale afstand van de robot printen op de volgende manier:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
if message.positive:&lt;br /&gt;
    central[&amp;quot;boxes_done&amp;quot;] +=1&lt;br /&gt;
    print(&amp;quot;number of boxes done:&amp;quot;)&lt;br /&gt;
    print(central[&amp;quot;boxes_done&amp;quot;])&lt;br /&gt;
    central[&amp;quot;distance&amp;quot;] += float(message.bodies[1])&lt;br /&gt;
    if central[&amp;quot;boxes_done&amp;quot;] &amp;lt; central[&amp;quot;boxes_tot&amp;quot;]&lt;br /&gt;
        robot = message.bodies[0]&lt;br /&gt;
        Send_order(robot)&lt;br /&gt;
    else:&lt;br /&gt;
        print(&amp;quot;Total walked distance:&amp;quot;)&lt;br /&gt;
        print(central[&amp;quot;distance&amp;quot;])&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Experiment ===&lt;br /&gt;
Nu kunnen we gaan meten hoe efficiënt de robot is in de huidige situatie. Dit doen we door het huidige algoritme een aantal keer te draaien: we gaan een experiment doen. Meerder runs zijn nodig omdat de bestelling steeds verschilt. Op basis van één run kunnen we niet zeggen hoe het algoritme gemiddeld presteert. Het kan namelijk zo zijn dat je alleen naar de dichtstbijzijnde kast hoeft te lopen. Dit is geen goede representatie van een gemiddelde bestelling. Daarom doen we nu 5 runs. &lt;br /&gt;
&lt;br /&gt;
Hieronder staan de uitkomsten van een experiment:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Run !! Afstand&lt;br /&gt;
|-&lt;br /&gt;
|Run 1	|| 615&lt;br /&gt;
|-&lt;br /&gt;
|Run 2 ||	709&lt;br /&gt;
|-&lt;br /&gt;
|Run 3 ||	683&lt;br /&gt;
|-&lt;br /&gt;
|Run 4 ||	698&lt;br /&gt;
|-&lt;br /&gt;
|Run 5||	719&lt;br /&gt;
|-&lt;br /&gt;
|Gemiddelde	|| 684,8&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Doe zelf ook een experiment met minimaal 5 runs en bekijk of het gemiddelde overeenkomt met de resultaten in bovenstaande tabel. Hoe meer runs je hebt, hoe preciezer je schatting van de prestatie van de robot.&lt;br /&gt;
&lt;br /&gt;
==Efficiëntie verbetering voor 1 robot==&lt;br /&gt;
In het vorige algoritme kon het zo zijn dat de robot 2 keer naar dezelfde kast moest lopen. Het gevolg van de voorwaarde die we in het begin van deze les introduceerden is dat dit niet meer hoeft. We gaan nu zien hoe we dit moeten veranderen en wat het gevolg is op de prestatie. &lt;br /&gt;
&lt;br /&gt;
===Verandering centrale controller===&lt;br /&gt;
&lt;br /&gt;
We moeten nu gaan bedenken wat de beste manier is om deze opzet te implementeren in het systeem. Logischer is dat de robot de order doorgaat en zoekt naar dubbelen. Maar dit is programmeer technisch gezien meer werk. Daarom laten we de centrale controller kijken of er dubbele in de order zitten. We hoeven dan geen aanpassingen te doen in de robot controller en maar een kleine aanpassing in de centrale controller:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
def Send_order(robot_team):&lt;br /&gt;
    pre_order = [random.choice(box_articles) for t in range(central[&amp;quot;box_size&amp;quot;])]&lt;br /&gt;
    pre_order = list(set(pre_order))&lt;br /&gt;
    order = &amp;quot;&amp;quot;&lt;br /&gt;
    for j in range(len(pre_order)):&lt;br /&gt;
            order += &amp;quot; &amp;quot; + pre_order[j]&lt;br /&gt;
    GameLogic.sendMessage(&amp;quot;Start&amp;quot;, order , &amp;quot;Robot_&amp;quot;+robot, &amp;quot;Ground&amp;quot;)&lt;br /&gt;
    GameLogic.sendMessage(&amp;quot;Start&amp;quot;, robot , &amp;quot;Robot_&amp;quot;+robot, &amp;quot;Ground&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zoals je kunt zien moet je nu gebruik maken van een array voor het aanmaken van de bestelling. Dan kun je namelijk de functie list() en set() gebruiken voor het eruit halen van dubbele artikelen. Aan de robot kunnen we alleen een string meegeven en daarom moeten we de array nog omzetten in een string. De grootte van de order kan nu 1, 2 of nog steeds 3 zijn.&lt;br /&gt;
&lt;br /&gt;
===Experiment ===&lt;br /&gt;
De resultaten zijn nu als volgt:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Run !! Afstand&lt;br /&gt;
|-&lt;br /&gt;
|Run 1	|| 495&lt;br /&gt;
|-&lt;br /&gt;
|Run 2 ||	592&lt;br /&gt;
|-&lt;br /&gt;
|Run 3 ||	599&lt;br /&gt;
|-&lt;br /&gt;
|Run 4 ||	437&lt;br /&gt;
|-&lt;br /&gt;
|Run 5||	648&lt;br /&gt;
|-&lt;br /&gt;
|Gemiddelde	|| 554,2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Te zien is dat de gemiddelde afstand van een run naar beneden is gegaan met 130,6 meter. &lt;br /&gt;
Als je deze afstand omzet naar de tijd die de robot daardoor sneller is kun je nadenken of je moet investeren in robots die meer artikelen uit een kast kunnen halen. Wanneer de investering namelijk kleiner is dan de opbrengt zal dit voor extra winst zorgen. &lt;br /&gt;
&lt;br /&gt;
==Efficiëntie verbetering door samenwerking==&lt;br /&gt;
Dat we een verbetering zouden zien is natuurlijk begrijpelijk omdat de robots ineens meer kunnen tillen. Interessanter is dat we met deze simulatie hebben kunnen zien wat de efficiëntie winst precies zal zijn en of het zin heeft om in deze complexere machines te investeren.   &lt;br /&gt;
&lt;br /&gt;
We gaan nu kijken naar de efficiëntie verbetering is door met een team van 2 robots te werken. Naast de vermindering in totaal gelopen meters gaan we nu ook kijken naar de tijd die het kost om de orders in te pakken. &lt;br /&gt;
&lt;br /&gt;
===Creëren team===&lt;br /&gt;
De robots gaan nu in tweetallen werken om de artikelen op te halen. Er zijn veel mogelijkheden hoe de robots samen kunnen werken. Verdelen van soorten artikelen, eerstvolgende artikel op de lijst ophalen, eerst de verste artikelen etc. Omdat de robots naast elkaar staan maakt het qua gelopen afstand niet veel uit welke robot welk artikel haalt. Het gaat hier dus vooral om de winst in tijd.&lt;br /&gt;
We gaan twee verschillende algoritmen implementeren. Eerst geven we de robots verantwoordelijkheid over de helft van de artikelen en vervolgens kijken we naar een goede verdeling op basis van de binnengekregen order.&lt;br /&gt;
&lt;br /&gt;
Om een team aan het werk te kunnen zetten, moeten we wel een team hebben. Selecteer Robot_11 en kopieer de robot (ctrl+c, ctrl+v voor Windows en cmd+c, cmd+v voor Mac) druk op de toets G en de toets X en sleep robot naar achter. Je hebt nu twee robots:&lt;br /&gt;
&lt;br /&gt;
[[Bestand:2_robots.png]]&lt;br /&gt;
&lt;br /&gt;
Verander de naam van de tweede robot in Robot_10 op de volgende manier:&lt;br /&gt;
&lt;br /&gt;
[[Bestand:rename_robot.png]]&lt;br /&gt;
&lt;br /&gt;
Verwijder de extra python controllers door deze te selecteren en op ‘x’ te drukken. Zorg ervoor dat je alleen de twee onderstaande controllers overhoudt:&lt;br /&gt;
&lt;br /&gt;
[[Bestand:delete_controllers.png]]&lt;br /&gt;
&lt;br /&gt;
Voeg de robot controller toe aan Robot_10:&lt;br /&gt;
&lt;br /&gt;
[[Bestand:change_controller.png]]&lt;br /&gt;
&lt;br /&gt;
===Veranderingen centrale controller===&lt;br /&gt;
We nemen de code weer stap voor stap onder handen. Bij het definiëren van de box_articles is het nu handiger als de “Shelf_” er niet voor staat. Waarom zien we zo.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
# define game properties&lt;br /&gt;
central[&amp;quot;boxes_tot&amp;quot;] = 5&lt;br /&gt;
central[&amp;quot;box_size&amp;quot;] = 3&lt;br /&gt;
box_articles = [1,2,3,4,5,6,7,8]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In plaats dat we nu een robot meegeven aan Send_order() geven we een team mee. We moeten nu ook bijhouden of de robots op hun teammaatje aan het wachten zijn voordat een nieuwe order kan gaan starten. Hiervoor maken we een array aan met de waarden 0/1 voor 11 robots. Naast de afstand houden we ook de tijd bij.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
if sens.positive:&lt;br /&gt;
    robot_team = [&amp;quot;10&amp;quot;,&amp;quot;11&amp;quot;]&lt;br /&gt;
    central[&amp;quot;active_robots&amp;quot;] = [0,0,0,0,0,0,0,0,0,0,0]&lt;br /&gt;
    central[&amp;quot;distance&amp;quot;] =0&lt;br /&gt;
    central[&amp;quot;time&amp;quot;] = 0.0&lt;br /&gt;
    Send_order(robot_team)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
De order wordt nu twee keer zo lang omdat de robots samen werken. We knippen de order op bij artikel 4. Robot 10 gaat dus artikelen 1, 2, 3 en 4 ophalen en Robot 11 de rest:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
def Send_order(robot_team):&lt;br /&gt;
    pre_order = [random.choice(box_articles) for t in range(len(robot_team)*central[&amp;quot;box_size&amp;quot;])]&lt;br /&gt;
    pre_order = list(set(pre_order))&lt;br /&gt;
    pre_order.sort()&lt;br /&gt;
    order = &amp;quot;&amp;quot;&lt;br /&gt;
    order2= &amp;quot;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    for j in range(len(pre_order)):&lt;br /&gt;
        if j &amp;lt;= len(pre_order)/2 -1 :&lt;br /&gt;
            order += &amp;quot; Shelf_&amp;quot; + str(pre_order[j])&lt;br /&gt;
        else:&lt;br /&gt;
            order2 += &amp;quot; Shelf_&amp;quot; + str(pre_order[j])&lt;br /&gt;
    GameLogic.sendMessage(&amp;quot;Start&amp;quot;, order , &amp;quot;Robot_&amp;quot;+robot_team[0] , &amp;quot;Ground&amp;quot;)&lt;br /&gt;
    GameLogic.sendMessage(&amp;quot;Start&amp;quot;, robot_team[0] , &amp;quot;Robot_&amp;quot;+robot_team[0] , &amp;quot;Ground&amp;quot;)&lt;br /&gt;
    central[&amp;quot;active_robots&amp;quot;][int(robot_team[0])-1]=1&lt;br /&gt;
    GameLogic.sendMessage(&amp;quot;Start&amp;quot;, order2 , &amp;quot;Robot_&amp;quot;+robot_team[1] , &amp;quot;Ground&amp;quot;)&lt;br /&gt;
    GameLogic.sendMessage(&amp;quot;Start&amp;quot;, robot_team[1] , &amp;quot;Robot_&amp;quot;+robot_team[1] , &amp;quot;Ground&amp;quot;)&lt;br /&gt;
    central[&amp;quot;active_robots&amp;quot;][int(robot_team[1])-1]=1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wanneer de robot klaar is met zijn deel van de bestelling moet hij wachten op zijn teamgenoot voordat er een nieuwe order kan starten. Dit kan op de volgende manier geprogrammeerd worden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
if message.positive:&lt;br /&gt;
    central[&amp;quot;active_robots&amp;quot;][int(message.bodies[0])-1]=0&lt;br /&gt;
    central[&amp;quot;distance&amp;quot;] += float(message.bodies[1])&lt;br /&gt;
    if central[&amp;quot;boxes_done&amp;quot;] &amp;lt; central[&amp;quot;boxes_tot&amp;quot;]-1 and central[&amp;quot;active_robots&amp;quot;][10-1]+central[&amp;quot;active_robots&amp;quot;][11-1]==0:&lt;br /&gt;
        central[&amp;quot;boxes_done&amp;quot;] +=1&lt;br /&gt;
        print(&amp;quot;number of boxes done:&amp;quot;)&lt;br /&gt;
        print(central[&amp;quot;boxes_done&amp;quot;])&lt;br /&gt;
        Send_order([&amp;quot;10&amp;quot;,&amp;quot;11&amp;quot;])&lt;br /&gt;
    if sum(central[&amp;quot;active_robots&amp;quot;]) == 0: &lt;br /&gt;
        print(&amp;quot;Total walked distance:&amp;quot;)&lt;br /&gt;
        print(central[&amp;quot;distance&amp;quot;])&lt;br /&gt;
        print(central[&amp;quot;time&amp;quot;])&lt;br /&gt;
 &lt;br /&gt;
central[&amp;quot;time&amp;quot;]+= 1/60&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
De tijd wordt bijgehouden met central[“time”]. Hiervoor moet je een Always sensor toevoegen met een pulse. Deze geeft 60 keer per seconde een pulse aan de central controller. Door bij iedere pulse 1/60 toe te voegen aan de variabele, kunnen we de tijd bijhouden. &lt;br /&gt;
&lt;br /&gt;
[[Bestand:add_pulse.png]]&lt;br /&gt;
&lt;br /&gt;
In de robot.py kun je print(“done robot 11”) vervangen door onderstaande regel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
print(&amp;quot;done robot &amp;quot;+ str(robot[&amp;quot;robot_id&amp;quot;]))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Experiment===&lt;br /&gt;
Hieronder staan de resultaten van een experiment.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Experiment 1&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Run !! Afstand !! Tijd&lt;br /&gt;
|-&lt;br /&gt;
|Run 1	|| 929 ||	124&lt;br /&gt;
|-&lt;br /&gt;
|Run 2 ||	879 ||	134&lt;br /&gt;
|-&lt;br /&gt;
|Run 3 ||	1092 ||	154&lt;br /&gt;
|-&lt;br /&gt;
|Run 4 ||	863	|| 121&lt;br /&gt;
|-&lt;br /&gt;
|Run 5||	805	|| 109&lt;br /&gt;
|-&lt;br /&gt;
|Gemiddelde	|| 913,6 ||	128,4&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Als we de gemiddelde afstand willen vergelijken met de afstanden uit de vorige experimenten moeten we dit getal eerst delen door 2 omdat er nu 2 keer zoveel bestellingen gedaan worden. We zien dan weer een verbetering in het totaal gelopen meters. Omdat dit niet erg verassend is gaan we nu kijken naar het tweede algoritme. Hier bekijken we een slimmere aanpak voor het verdelen van de artikelen in de order zodat de robots minder lang op elkaar wachten. We kunnen zo een winst in tijd behalen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Experiment 2&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Nu kan het voorkomen dat het aantal op te halen artikelen erg verschillend is doordat de artikelen alleen in kast 1 t/m 4 of 5 t/m 8 staan. Dit willen we gaan verbeteren. Dit kun je op de volgende manier doen: kijk naar het aantal artikelen in de array pre_order en deel dit door 2. Bij een oneven aantal artikelen krijgt Robot 11 het extra artikel. De code ziet er dan als volgt uit:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
def Send_order(robot_team):&lt;br /&gt;
    pre_order = [random.choice(box_articles) for t in range(len(robot_team)*central[&amp;quot;box_size&amp;quot;])]&lt;br /&gt;
    pre_order = list(set(pre_order))&lt;br /&gt;
    pre_order.sort()&lt;br /&gt;
    order = &amp;quot;&amp;quot;&lt;br /&gt;
    order2= &amp;quot;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    for j in range(len(pre_order)):&lt;br /&gt;
        if j &amp;lt;= len(pre_order)/2 -1 :&lt;br /&gt;
            order += &amp;quot; Shelf_&amp;quot; + str(pre_order[j])&lt;br /&gt;
        else:&lt;br /&gt;
            order2 += &amp;quot; Shelf_&amp;quot; + str(pre_order[j])&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
De resultaten van het experiment zijn nu:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Run !! Afstand !! Tijd&lt;br /&gt;
|-&lt;br /&gt;
|Run 1	|| 950 ||	114&lt;br /&gt;
|-&lt;br /&gt;
|Run 2 ||	940 ||	111&lt;br /&gt;
|-&lt;br /&gt;
|Run 3 ||	940 ||	112&lt;br /&gt;
|-&lt;br /&gt;
|Run 4 ||	993	|| 117&lt;br /&gt;
|-&lt;br /&gt;
|Run 5||	996	|| 116&lt;br /&gt;
|-&lt;br /&gt;
|Gemiddelde	|| 963,8 ||	114&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
We zien dat, ondanks de verhoging van het aantal gelopen meters, de totale tijd afgenomen is. Dit is dus een echte verbetering van het algoritme omdat dezelfde opstelling gebruikt wordt maar er slimmer gebruik wordt gemaakt van de robots.&lt;br /&gt;
&lt;br /&gt;
===Plusopdracht===&lt;br /&gt;
Bedenk andere manieren om de taken tussen de robots te verdelen om de gelopen afstand of tijd naar beneden te krijgen. Doe hier experimenten mee&lt;/div&gt;</summary>
		<author><name>Jacqueline</name></author>
	</entry>
	<entry>
		<id>https://infvo.nl/lab/index.php?title=Bestand:Grafiek_2.png&amp;diff=402</id>
		<title>Bestand:Grafiek 2.png</title>
		<link rel="alternate" type="text/html" href="https://infvo.nl/lab/index.php?title=Bestand:Grafiek_2.png&amp;diff=402"/>
		<updated>2014-12-09T15:56:30Z</updated>

		<summary type="html">&lt;p&gt;Jacqueline: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Jacqueline</name></author>
	</entry>
	<entry>
		<id>https://infvo.nl/lab/index.php?title=Bestand:Grafiek_1.png&amp;diff=401</id>
		<title>Bestand:Grafiek 1.png</title>
		<link rel="alternate" type="text/html" href="https://infvo.nl/lab/index.php?title=Bestand:Grafiek_1.png&amp;diff=401"/>
		<updated>2014-12-09T15:55:54Z</updated>

		<summary type="html">&lt;p&gt;Jacqueline: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Jacqueline</name></author>
	</entry>
	<entry>
		<id>https://infvo.nl/lab/index.php?title=Bestand:Grafiek_maken_excel.png&amp;diff=400</id>
		<title>Bestand:Grafiek maken excel.png</title>
		<link rel="alternate" type="text/html" href="https://infvo.nl/lab/index.php?title=Bestand:Grafiek_maken_excel.png&amp;diff=400"/>
		<updated>2014-12-09T15:55:36Z</updated>

		<summary type="html">&lt;p&gt;Jacqueline: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Jacqueline</name></author>
	</entry>
	<entry>
		<id>https://infvo.nl/lab/index.php?title=Bestand:Excel_waarden.png&amp;diff=399</id>
		<title>Bestand:Excel waarden.png</title>
		<link rel="alternate" type="text/html" href="https://infvo.nl/lab/index.php?title=Bestand:Excel_waarden.png&amp;diff=399"/>
		<updated>2014-12-09T15:55:14Z</updated>

		<summary type="html">&lt;p&gt;Jacqueline: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Jacqueline</name></author>
	</entry>
	<entry>
		<id>https://infvo.nl/lab/index.php?title=Logistieke_Robots/les_7&amp;diff=398</id>
		<title>Logistieke Robots/les 7</title>
		<link rel="alternate" type="text/html" href="https://infvo.nl/lab/index.php?title=Logistieke_Robots/les_7&amp;diff=398"/>
		<updated>2014-12-09T15:54:35Z</updated>

		<summary type="html">&lt;p&gt;Jacqueline: Nieuwe pagina aangemaakt met &amp;#039;{{Zijbalk Logistieke Robots}}  ==Les 7 - Algoritmen met elkaar vergelijken ==  De eerste vraag die we natuurlijk willen onderzoeken is: werkt dit echt? Zorgt dit al...&amp;#039;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Zijbalk Logistieke Robots}}&lt;br /&gt;
&lt;br /&gt;
==Les 7 - Algoritmen met elkaar vergelijken ==&lt;br /&gt;
&lt;br /&gt;
De eerste vraag die we natuurlijk willen onderzoeken is: werkt dit echt? Zorgt dit algoritme echt voor een verbetering ten opzichte van niet met elkaar communiceren? Voordat we hier echt uitspraken over kunnen doen, moeten we eerst veel experimenteren.&lt;br /&gt;
Let daarbij ook op het feit dat het simuleren met robots ontzettend lastig is. Er kan, zoals je misschien wel gezien hebt, van alles verkeerd gaan. Robot kunnen vast blijven zitten tussen de kasten, elkaar steeds in de radar hebben en daardoor niet verder kunnen etc. De simulaties die in deze les gedaan zijn kunnen dan ook erg verschillen van jouw resultaten. Dit is helemaal niet erg. Er is ook geen beste oplossing en het is ontzettend lastig om de juiste waarden te vinden die ervoor zorgen dat de robots snel van elkaar leren. Maar dit maakt het ook weer erg leuk! &lt;br /&gt;
&lt;br /&gt;
We gaan op de volgende manier ons algoritme testen:&lt;br /&gt;
We gaan eerst experimenten doen met waarden van de robots niet veranderen. Wanneer we hier een aantal runs van gedaan hebben, hebben we een idee van de prestatie van het algoritme zonder leren. Vervolgens laten we de waarden wel veranderen met ons evolutionair algoritme. We kunnen nu de uitkomsten van beide manieren met elkaar vergelijken.&lt;br /&gt;
&lt;br /&gt;
We moeten dan alles onder “# update values” in commentaar zetten door voor iedere regels een # te zetten. Laat de robots totaal 50 boxen vullen en zet de robots aan het werk. In het terminal venster zie je de orders geprint worden en je ziet ook een array die steeds groter wordt naarmate de robots langer bezig zijn. Dit is het central[“algorithm”] array en geeft per minuut het aantal botsingen weer. &lt;br /&gt;
Doe 5 keer een run. Het kan gebeuren dat de robots vast lopen. Stop deze run dan en probeer het opnieuw. Wanneer dit vaak gebeurd, open Blender dan opnieuw. Hieronder staat de ruwe data van 5 complete runs:&lt;br /&gt;
&lt;br /&gt;
Run 1:&lt;br /&gt;
Prestatie:&lt;br /&gt;
[28.0, 4.0, 2.0, 18.0, 0.0, 4.0, 4.0, 6.0, 0.0, 6.0, 32.0]&lt;br /&gt;
[[0.0, 1.1033122539520264, 1.4639674425125122, Robot_6], [0.0, 1.2986571788787842, 0.5416139364242554, Robot_10], [0.0, 0.651454746723175, 1.3667792081832886, Robot_11], [3.0, 1.9125906229019165, 1.1833915710449219, Robot_9], [8.0, 0.0756225660443306, 1.3220340013504028, Robot_7], [21.0, 1.4247708320617676, 1.0523004531860352, Robot_8]]&lt;br /&gt;
Total walked distance:&lt;br /&gt;
13691&lt;br /&gt;
659.673114329765&lt;br /&gt;
&lt;br /&gt;
Run 2:&lt;br /&gt;
[2.0, 29.0, 9.0, 13.0, 55.0, 9.0, 18.0, 0.0, 8.0, 22.0, 12.0]&lt;br /&gt;
[[0.0, 0.11781859397888184, 0.6557546257972717, Robot_9], [0.0, 1.0547598600387573, 0.571683406829834, Robot_11], [1.0, 1.167196273803711, 1.976454496383667, Robot_6], [1.0, 1.3991421461105347, 1.4800572395324707, Robot_8], [5.0, 1.9634203910827637, 1.1145190000534058, Robot_7], [5.0, 1.4843071699142456, 0.8718631267547607, Robot_10]]&lt;br /&gt;
Total walked distance:&lt;br /&gt;
13488&lt;br /&gt;
660.432861328125&lt;br /&gt;
&lt;br /&gt;
Run 3:&lt;br /&gt;
[105.0, 8.0, 27.0, 8.0, 24.0, 34.0, 41.0, 4.0, 0.0, 0.0, 26.0]&lt;br /&gt;
[[0.0, 0.6206476092338562, 1.2706804275512695, Robot_6], [0.0, 1.888157606124878, 0.8151676058769226, Robot_7], [0.0, 1.1586012840270996, 1.4619909524917603, Robot_8], [3.0, 1.3452816009521484, 1.9687161445617676, Robot_11], [8.0, 0.7305728793144226, 0.9222739934921265, Robot_10], [15.0, 0.5778017044067383, 1.1174777746200562, Robot_9]]&lt;br /&gt;
Total walked distance:&lt;br /&gt;
14184&lt;br /&gt;
660.0662841796875&lt;br /&gt;
&lt;br /&gt;
Run 4:&lt;br /&gt;
[14.0, 18.0, 29.0, 4.0, 12.0, 31.0, 6.0, 8.0, 33.0, 0.0, 6.0]	[[0.0, 0.5198497176170349, 1.950926661491394, Robot_6], [0.0, 0.5083528757095337, 1.4684268236160278, Robot_9], [0.0, 0.339052677154541, 1.2538245916366577, Robot_11], [1.0, 1.4567952156066895, 1.5516620874404907, Robot_7], [11.0, 1.5452338457107544, 0.8980489373207092, Robot_10], [21.0, 0.24807365238666534, 0.017792876809835434, Robot_8]]&lt;br /&gt;
Total walked distance:&lt;br /&gt;
13029&lt;br /&gt;
559.6408081054688&lt;br /&gt;
&lt;br /&gt;
Run 5:&lt;br /&gt;
[6.0, 16.0, 4.0, 4.0, 54.0, 14.0, 24.0, 15.0, 10.0, 43.0]&lt;br /&gt;
[[0.0, 1.8651994466781616, 0.8983461260795593, Robot_6], [0.0, 0.7337772846221924, 1.389615535736084, Robot_8], [0.0, 0.24811603128910065, 1.3182649612426758, Robot_9], [0.0, 1.664925456047058, 0.2161814123392105, Robot_11], [2.0, 0.9058579206466675, 1.5737985372543335, Robot_7], [41.0, 1.09906005859375, 1.6222947835922241, Robot_10]]&lt;br /&gt;
Total walked distance:&lt;br /&gt;
13590&lt;br /&gt;
600.0642700195312&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
We willen deze waarden presenteren in een grafiek. Open Excel en typ de waarden over:&lt;br /&gt;
&lt;br /&gt;
[[Bestand: excel_waarden.png]]&lt;br /&gt;
&lt;br /&gt;
Het kan zijn dat niet alle cellen gevuld zijn omdat het inpakken de ene keer sneller ging dan de andere keer. Selecteer de waarden in kolom 2-7 en voeg een grafiek toe:&lt;br /&gt;
&lt;br /&gt;
[[Bestand: grafiek_maken_excel.png]]&lt;br /&gt;
&lt;br /&gt;
De volgende grafiek ontstaat nu:&lt;br /&gt;
&lt;br /&gt;
[[Bestand: grafiek_1.png]]&lt;br /&gt;
&lt;br /&gt;
Pas op dit moment kunnen we iets zeggen over de prestatie van het algoritme.&lt;br /&gt;
We zien erg veel variatie in het aantal botsingen per minuut en tussen de runs. Verschil tussen de runs kan komen door de verschillende (willekeurige) startwaarden. Wel kunnen we vaststellen dat geen een run een klein aantal botsingen heeft voor iedere minuut.&lt;br /&gt;
&lt;br /&gt;
We gaan nu experimenten doen waarbij de robots van elkaar leren. We hopen hierbij te zien dat het aantal botsingen een dalende lijn is bij iedere run.&lt;br /&gt;
We zeggen hier met nadruk “hopen” omdat je niet zeker weet of dit het geval is. Doe weer een aantal runs. &lt;br /&gt;
&lt;br /&gt;
Run 1:&lt;br /&gt;
[69.0, 0.0, 4.0, 2.0, 47.0, 0.0, 50.0, 2.0, 0.0, 6.0, 2.0]&lt;br /&gt;
[[0.0, 2.146437644958496, 1.5113431215286255, Robot_6], [0.0, 1.5602511167526245, 1.0936894416809082, Robot_7], [0.0, 1.9991168975830078, 1.5253989696502686, Robot_8], [0.0, 1.5248929262161255, 0.983869194984436, Robot_9], [0.0, 1.957208514213562, 1.5127331018447876, Robot_10], [0.0, 1.8197909593582153, 1.096867561340332, Robot_11]]&lt;br /&gt;
Total walked distance:&lt;br /&gt;
13318&lt;br /&gt;
720.0682983398438&lt;br /&gt;
&lt;br /&gt;
Run 2:&lt;br /&gt;
[37.0, 17.0, 8.0, 4.0, 0.0, 0.0, 0.0, 13.0, 31.0, 4.0]&lt;br /&gt;
[[0.0, 2.028287887573242, 0.7059972286224365, Robot_6], [0.0, 2.0065548419952393, 1.0062334537506104, Robot_8], [0.0, 2.313992977142334, 0.997683584690094, Robot_9], [0.0, 2.0005781650543213, 0.9316716194152832, Robot_10], [2.0, 2.1137619018554688, 0.9539632797241211, Robot_7], [2.0, 2.295074224472046, 1.1398147344589233, Robot_11]]&lt;br /&gt;
Total walked distance:&lt;br /&gt;
12566&lt;br /&gt;
600.0642700195312&lt;br /&gt;
&lt;br /&gt;
Run 3:&lt;br /&gt;
[13.0, 12.0, 6.0, 30.0, 2.0, 2.0, 30.0, 17.0]&lt;br /&gt;
[[0.0, 0.4430656433105469, 0.5342904329299927, Robot_10], [0.0, 0.5598312020301819, 0.3072521984577179, Robot_11], [1.0, 0.3825035095214844, 0.6534862518310547, Robot_9], [4.0, 0.4900607466697693, 0.3672640025615692, Robot_7], [5.0, 0.6171832084655762, 0.5994473695755005, Robot_8], [7.0, 0.32172659039497375, 0.5386554598808289, Robot_6]]&lt;br /&gt;
Total walked distance:&lt;br /&gt;
12057&lt;br /&gt;
480.06024169921875&lt;br /&gt;
&lt;br /&gt;
Run 4:&lt;br /&gt;
[13.0, 0.0, 7.0, 0.0, 0.0, 0.0, 6.0, 6.0, 2.0, 0.0]&lt;br /&gt;
[[0.0, 1.5696516036987305, 0.019686052575707436, Robot_6], [0.0, 1.553520679473877, 0.2368871420621872, Robot_7], [0.0, 1.6649249792099, 0.3868585228919983, Robot_8], [0.0, 1.4215301275253296, 0.05945594608783722, Robot_9], [0.0, 1.315022349357605, 0.0, Robot_10], [0.0, 1.4969103336334229, 0.0028564489912241697, Robot_11]]&lt;br /&gt;
Total walked distance:&lt;br /&gt;
12796&lt;br /&gt;
600.0642700195312&lt;br /&gt;
&lt;br /&gt;
Run 5:&lt;br /&gt;
[6.0, 0.0, 4.0, 20.0, 0.0, 0.0, 0.0, 64.0, 13.0]&lt;br /&gt;
[[0.0, 1.2154109477996826, 1.8105230331420898, Robot_6], [0.0, 1.3451547622680664, 1.8669763803482056, Robot_7], [0.0, 1.3241212368011475, 1.782742977142334, Robot_9], [0.0, 1.600753664970398, 1.936579942703247, Robot_11], [2.0, 1.7318297624588013, 2.0279102325439453, Robot_8], [3.0, 1.4447206258773804, 1.689884901046753, Robot_10]]&lt;br /&gt;
Total walked distance:&lt;br /&gt;
15149&lt;br /&gt;
720.0682983398438&lt;br /&gt;
&lt;br /&gt;
Wanneer we van deze resultaten een grafiek maken krijgen we het volgende:&lt;br /&gt;
&lt;br /&gt;
[[Bestand: grafiek_2.png]]&lt;br /&gt;
&lt;br /&gt;
We zien duidelijk dat het aantal botsingen in de eerste paar minuten afnemen. Dit kan zijn omdat de slechte strategieën snel vervangen worden door de betere. Hierna zien we jammer genoeg weer een stijging. &lt;br /&gt;
Iedere run zal anders zijn en jouw grafiek zal vast verschillen van degene die hierboven staat. In de grafiek hierboven kun je een interessant gegeven halen. We zien namelijk dat Run 4 in iedere minuut een klein aantal botsingen heeft. Het is dan interessant om te kijken naar de waarden van de strategieën in Run 4 en deze al beginwaarden te nemen voor een nieuw experiment. Zo kunnen we de robots voorzien van eerder zelf geleerde kennis!&lt;br /&gt;
&lt;br /&gt;
Belangrijk om te leren van deze les is dat werken met robots in de echte wereld veel moeilijkheden met zich meebrengt. Voor ons is het zo vanzelfsprekend om niet tegen andere mensen aan te botsen maar voor robots is dit helemaal niet het geval. Hoe ga je hiermee om? &lt;br /&gt;
&lt;br /&gt;
==Plusopdracht==&lt;br /&gt;
Je kan op dit moment ontzettend veel gaan onderzoeken. Je kan zelf waarden meegeven aan de robots waarvan jij denkt dat het de juiste zijn. Je kan robots verschillende waarden geven zodat ze niet op precies hetzelfde moment weer verder gaan met de bestelling en elkaar weer tegen komen, je kan de variatie die opgeteld wordt bij de nieuwe strategie veranderen. Kortom: je kan van alles proberen om het aantal botsingen naar beneden te krijgen. Je kan zelfs de hele strategie wijzigen, misschien wil je wel dat wanneer de robots elkaar tegen komren op de radar, de een gaat versnellen om de andere robot net voor te zijn? Of wil je dat ze met elkaar communiceren om een plan te maken wie welke kant op stapt?&lt;/div&gt;</summary>
		<author><name>Jacqueline</name></author>
	</entry>
	<entry>
		<id>https://infvo.nl/lab/index.php?title=Logistieke_Robots/les_6&amp;diff=397</id>
		<title>Logistieke Robots/les 6</title>
		<link rel="alternate" type="text/html" href="https://infvo.nl/lab/index.php?title=Logistieke_Robots/les_6&amp;diff=397"/>
		<updated>2014-12-09T15:47:36Z</updated>

		<summary type="html">&lt;p&gt;Jacqueline: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Zijbalk Logistieke Robots}}&lt;br /&gt;
&lt;br /&gt;
==Les 6 - Robots van elkaar laten leren ==&lt;br /&gt;
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 &amp;quot;warehouse_team_collission.blend&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==Verbetering code na les 5 ==&lt;br /&gt;
We gaan een functie set_articles() maken zodat er een array aangemaakt &lt;br /&gt;
wordt met de artikelen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot; line&amp;gt;&lt;br /&gt;
def get_order():&lt;br /&gt;
    # get articles from central controller&lt;br /&gt;
    set_articles()&lt;br /&gt;
    print(robot[&amp;quot;articles&amp;quot;])&lt;br /&gt;
    # set game properties&lt;br /&gt;
    robot[&amp;quot;article_number&amp;quot;] = 1 &lt;br /&gt;
    robot[&amp;quot;target_desk&amp;quot;] = False &lt;br /&gt;
    # distance variables&lt;br /&gt;
    robot[&amp;quot;distance&amp;quot;] = 0.0&lt;br /&gt;
    robot[&amp;quot;location1&amp;quot;] = robot.position[0]&lt;br /&gt;
    robot[&amp;quot;location2&amp;quot;] = robot.position[1]&lt;br /&gt;
    robot[&amp;quot;location3&amp;quot;] = robot.position[2]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vervang ook de declaratie van robot[“robot_id”] door onderstaande. De central controller hoeft zo niet meer te vertellen om welke robot het gaat.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot; line&amp;gt;&lt;br /&gt;
# get the current controller &lt;br /&gt;
cont = bge.logic.getCurrentController()&lt;br /&gt;
robot = cont.owner&lt;br /&gt;
robot[&amp;quot;robot_id&amp;quot;] = robot.name[6:]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
De functie set_articles() ziet er als volgt uit:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot; line&amp;gt;&lt;br /&gt;
def set_articles():&lt;br /&gt;
    message = start_sens.bodies[0][1:]    &lt;br /&gt;
    order_length = len(re.findall(r&#039;[^\s ]+&#039;, message))&lt;br /&gt;
    robot[&amp;quot;articles&amp;quot;] = [&amp;quot;&amp;quot;]*order_length&lt;br /&gt;
    for i in range(order_length):&lt;br /&gt;
        robot[&amp;quot;articles&amp;quot;][i] = re.findall(r&#039;[^\s ]+&#039;, message)[i]  &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
De main() functie ziet er nu overzichtelijker uit:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot; line&amp;gt;&lt;br /&gt;
def main(): &lt;br /&gt;
    if robot[&amp;quot;target_desk&amp;quot;] == False:&lt;br /&gt;
        shelf_sens.propName = &amp;quot;Shelf&amp;quot;&lt;br /&gt;
        if robot[&amp;quot;article_number&amp;quot;] &amp;lt;= len(robot[&amp;quot;articles&amp;quot;]):&lt;br /&gt;
            track_act.target = robot[&amp;quot;articles&amp;quot;][robot[&amp;quot;article_number&amp;quot;]-1]&lt;br /&gt;
    else:&lt;br /&gt;
        shelf_sens.propName = &amp;quot;Desk&amp;quot;&lt;br /&gt;
        track_act.target = &amp;quot;Desk_&amp;quot; + str(robot[&amp;quot;robot_id&amp;quot;])&lt;br /&gt;
    if shelf_sens.positive:&lt;br /&gt;
        if robot[&amp;quot;target_desk&amp;quot;] == True:&lt;br /&gt;
            robot[&amp;quot;article_number&amp;quot;] += 1&lt;br /&gt;
            if robot[&amp;quot;article_number&amp;quot;]  == len(robot[&amp;quot;articles&amp;quot;]) +1:&lt;br /&gt;
                cont.deactivate(track_act)&lt;br /&gt;
                print(&amp;quot;done robot &amp;quot;+ str(robot[&amp;quot;robot_id&amp;quot;]))&lt;br /&gt;
                GameLogic.sendMessage(&amp;quot;Done&amp;quot;, robot[&amp;quot;robot_id&amp;quot;] , &amp;quot;Ground&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
                GameLogic.sendMessage(&amp;quot;Done&amp;quot;, str(robot[&amp;quot;distance&amp;quot;]) , &amp;quot;Ground&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
        robot[&amp;quot;target_desk&amp;quot;]=  not robot[&amp;quot;target_desk&amp;quot;]  &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
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:&lt;br /&gt;
&lt;br /&gt;
[[Bestand:balk_physics.png]]&lt;br /&gt;
&lt;br /&gt;
Verander dan de form factor in 0.0:&lt;br /&gt;
&lt;br /&gt;
[[Bestand:form_factor.png]]&lt;br /&gt;
&lt;br /&gt;
Doe dit voor beide robots.&lt;br /&gt;
&lt;br /&gt;
==Hervat les 6 - Robots van elkaar laten leren ==&lt;br /&gt;
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. &lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
==Observeren van botsingen==&lt;br /&gt;
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.&lt;br /&gt;
De centrale controller moet ook veranderd worden omdat we nu twee teams hebben. Doe daarvoor de volgende aanpassingen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot; line&amp;gt;&lt;br /&gt;
if sens.positive:&lt;br /&gt;
    robot_team = [&amp;quot;10&amp;quot;,&amp;quot;11&amp;quot;]&lt;br /&gt;
    central[&amp;quot;active_robots&amp;quot;] = [0,0,0,0,0,0,0,0,0,0,0]&lt;br /&gt;
    central[&amp;quot;distance&amp;quot;] =0&lt;br /&gt;
    central[&amp;quot;time&amp;quot;] = 0.0&lt;br /&gt;
    Send_order(robot_team)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot; line&amp;gt;&lt;br /&gt;
if message.positive:&lt;br /&gt;
    central[&amp;quot;active_robots&amp;quot;][int(message.bodies[0])-1]=0&lt;br /&gt;
    central[&amp;quot;distance&amp;quot;] += float(message.bodies[1])&lt;br /&gt;
    if central[&amp;quot;boxes_done&amp;quot;] &amp;lt; central[&amp;quot;boxes_tot&amp;quot;]-1 and central[&amp;quot;active_robots&amp;quot;][10-1]+central[&amp;quot;active_robots&amp;quot;][11-1]==0:&lt;br /&gt;
        central[&amp;quot;boxes_done&amp;quot;] +=1&lt;br /&gt;
        print(&amp;quot;number of boxes done:&amp;quot;)&lt;br /&gt;
        print(central[&amp;quot;boxes_done&amp;quot;])&lt;br /&gt;
        Send_order([&amp;quot;10&amp;quot;,&amp;quot;11&amp;quot;])&lt;br /&gt;
    if central[&amp;quot;boxes_done&amp;quot;] &amp;lt; central[&amp;quot;boxes_tot&amp;quot;]-1 and central[&amp;quot;active_robots&amp;quot;][9-1]+central[&amp;quot;active_robots&amp;quot;][8-1]==0:&lt;br /&gt;
        central[&amp;quot;boxes_done&amp;quot;] +=1&lt;br /&gt;
        print(&amp;quot;number of boxes done:&amp;quot;)&lt;br /&gt;
        print(central[&amp;quot;boxes_done&amp;quot;])&lt;br /&gt;
        Send_order([&amp;quot;8&amp;quot;,&amp;quot;9&amp;quot;])&lt;br /&gt;
    if sum(central[&amp;quot;active_robots&amp;quot;]) == 0: &lt;br /&gt;
        print(&amp;quot;Total walked distance:&amp;quot;)&lt;br /&gt;
        print(central[&amp;quot;distance&amp;quot;])&lt;br /&gt;
        print(central[&amp;quot;time&amp;quot;])&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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:&lt;br /&gt;
# 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.&lt;br /&gt;
# 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. &lt;br /&gt;
We kiezen voor algoritme 2 om te laten zien hoe je een robot van slimme kennis voorziet.&lt;br /&gt;
&lt;br /&gt;
== Kunnen reageren op andere robots ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
===Veranderen pakhuis omgeving===&lt;br /&gt;
Omdat we de controller van de robot gaan veranderen, mag je robot 9, 10 en 11 weer verwijderen. En de volgende stappen uitvoeren:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Stap 1:&#039;&#039;&#039;&lt;br /&gt;
Voeg aan de robot een string game property toe met de naam  “Robot”. Dit is om elkaar te kunnen herkennen met een Radar&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Stap 2:&#039;&#039;&#039;&lt;br /&gt;
Zet de Physics Type op Character en vink de box Actor aan:&lt;br /&gt;
&lt;br /&gt;
[[Bestand: balk_actor.png]]&lt;br /&gt;
&lt;br /&gt;
[[Bestand: set_as_actor.png]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Stap 3:&#039;&#039;&#039;&lt;br /&gt;
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:&lt;br /&gt;
&lt;br /&gt;
[[Bestand: change_physics.png]]&lt;br /&gt;
&lt;br /&gt;
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:&lt;br /&gt;
&lt;br /&gt;
[[Bestand: nieuwe_arena.png]]&lt;br /&gt;
&lt;br /&gt;
===Veranderen robot controller ===&lt;br /&gt;
De robots moeten elkaar nu herkennen, hier op reageren en vervolgens weer doorgaan met het ophalen van artikelen. We moeten veel gaan veranderen aan de controller. We nemen dit stap voor stap door:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Stap 1:&#039;&#039;&#039;&lt;br /&gt;
We hebben een extra Radar nodig om een ontwijkactie te starten en we moeten kunnen meten of de robot een goede actie gedaan heeft. Dit doen we met een collission sensor. De always sensor is nodig om de taak weer op te pakken na de ontwijkactie:&lt;br /&gt;
[[Bestand: add_radar.png]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Stap 2:&#039;&#039;&#039;&lt;br /&gt;
De ontwijkactie houdt in dat de robot, na het detecteren van een andere robot, een aantal seconden rondjes draait, weg loopt van de robot en daarna zijn taak weer oppakt. Dit definiëren we in een extra state: &lt;br /&gt;
[[Bestand: add_state.png]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Stap 3:&#039;&#039;&#039;&lt;br /&gt;
Voeg extra game properties toe:&lt;br /&gt;
[[Bestand: add_game_property.png]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Stap 4:&#039;&#039;&#039;&lt;br /&gt;
Het script moet ook onder handen genomen worden. Er moet een extra package geïmporteerd worden omdat we de robot een willekeurige waarde geven voor het draaien om zijn eigen as en het weglopen van de radar locatie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot; line&amp;gt;&lt;br /&gt;
# import necessary packages&lt;br /&gt;
import bge&lt;br /&gt;
import GameLogic&lt;br /&gt;
import re&lt;br /&gt;
import random&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
De extra sensors moeten gedefinieerd worden: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot; line&amp;gt;&lt;br /&gt;
# get sensors and actuators&lt;br /&gt;
start_sens = cont.sensors[&amp;quot;Start&amp;quot;]&lt;br /&gt;
shelf_sens = cont.sensors[&amp;quot;Shelf&amp;quot;]&lt;br /&gt;
track_act = cont.actuators[&amp;quot;TrackTo&amp;quot;]&lt;br /&gt;
robot_radar = cont.sensors[&amp;quot;RobotRadar&amp;quot;]&lt;br /&gt;
robot_collission = cont.sensors[&amp;quot;RobotCollission&amp;quot;]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wanneer de robot voor de eerste keer begint met de order, worden de parameters gedefinieerd die te maken hebben met het ontwijken van de andere robot:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot; line&amp;gt;&lt;br /&gt;
if start_sens.positive:&lt;br /&gt;
    cont.activate(track_act) &lt;br /&gt;
    print(&amp;quot;Start new order:&amp;quot;)&lt;br /&gt;
    get_order()  &lt;br /&gt;
    # set avoidance parameters and evaluation variables&lt;br /&gt;
    print(&amp;quot;begin&amp;quot;)&lt;br /&gt;
    if robot[&amp;quot;active&amp;quot;] == False:&lt;br /&gt;
        robot[&amp;quot;sec_rot&amp;quot;] = random.uniform(0,2)&lt;br /&gt;
        robot[&amp;quot;sec_walk&amp;quot;] = random.uniform(0,2)&lt;br /&gt;
        robot[&amp;quot;active&amp;quot;] =True&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wanneer een robot iemand op de radar heeft, moet de robot de ontwijkactie uit gaan voeren in de andere state. Ook moet bijgehouden worden of de robot alsnog tegen een ander aan stoot. Wanneer de robot een slechte ontwijkactie heeft en vaak tegen iemand op botst, willen we dat deze robot een nieuwe ontwijkreactie krijgt. Dit noemen we een “reset”. Dit is nodig als de robot ergens vast zit:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot; line&amp;gt;&lt;br /&gt;
if robot_radar.positive == True:&lt;br /&gt;
    cont.deactivate(track_act)&lt;br /&gt;
    robot[&amp;quot;radar&amp;quot;] +=1&lt;br /&gt;
    robot[&amp;quot;time&amp;quot;] = 0.0&lt;br /&gt;
    robot.state = 2&lt;br /&gt;
&lt;br /&gt;
if robot_collission.positive:&lt;br /&gt;
    robot[&amp;quot;collission&amp;quot;] +=1&lt;br /&gt;
    &lt;br /&gt;
if robot[&amp;quot;collission&amp;quot;] &amp;gt;=20:&lt;br /&gt;
    #reset parameters because its stuck&lt;br /&gt;
    robot[&amp;quot;sec_rot&amp;quot;] = random.uniform(0,2)&lt;br /&gt;
    robot[&amp;quot;sec_walk&amp;quot;] = random.uniform(0,2)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In de extra state hebben we gezien dat er nog een “avoiding.py” gemaakt moet worden. Deze ziet er als volgt uit:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot; line&amp;gt;&lt;br /&gt;
# import necessary packages&lt;br /&gt;
import bge&lt;br /&gt;
import GameLogic&lt;br /&gt;
import re&lt;br /&gt;
&lt;br /&gt;
# get the current controller &lt;br /&gt;
cont = bge.logic.getCurrentController()&lt;br /&gt;
robot = cont.owner&lt;br /&gt;
robot[&amp;quot;robot_id&amp;quot;] = robot.name[6:]&lt;br /&gt;
&lt;br /&gt;
# get sensors and actuators&lt;br /&gt;
rot_act = cont.actuators[&amp;quot;Rotate&amp;quot;]&lt;br /&gt;
walk_act = cont.actuators[&amp;quot;Walk&amp;quot;]&lt;br /&gt;
robot_collission2 = cont.sensors[&amp;quot;RobotCollission2&amp;quot;]&lt;br /&gt;
robot_radar2 = cont.sensors[&amp;quot;RobotRadar2&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
robot[&amp;quot;time&amp;quot;] += 1/60&lt;br /&gt;
&lt;br /&gt;
if robot[&amp;quot;time&amp;quot;] &amp;lt; robot[&amp;quot;sec_rot&amp;quot;]:&lt;br /&gt;
    cont.activate(rot_act)&lt;br /&gt;
&lt;br /&gt;
if robot[&amp;quot;time&amp;quot;] &amp;gt; robot[&amp;quot;sec_rot&amp;quot;] and robot[&amp;quot;time&amp;quot;] &amp;lt; (robot[&amp;quot;sec_rot&amp;quot;] + robot[&amp;quot;sec_walk&amp;quot;]):&lt;br /&gt;
    cont.deactivate(rot_act)&lt;br /&gt;
    cont.activate(walk_act)&lt;br /&gt;
&lt;br /&gt;
if robot[&amp;quot;time&amp;quot;] &amp;gt; (robot[&amp;quot;sec_rot&amp;quot;] + robot[&amp;quot;sec_walk&amp;quot;]):&lt;br /&gt;
    robot.state =1&lt;br /&gt;
&lt;br /&gt;
if robot_collission2.positive:&lt;br /&gt;
    robot[&amp;quot;collission&amp;quot;] +=1&lt;br /&gt;
&lt;br /&gt;
if robot_radar2.positive:&lt;br /&gt;
    robot[&amp;quot;radar&amp;quot;] +=1&lt;br /&gt;
    robot[&amp;quot;time&amp;quot;] = 0.0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wanneer je de robots nu laat starten met het ophalen van bestellingen, zie je dat ze op elkaar reageren en hun ontwijkactie uitvoeren. De acties die ze uitvoeren zijn hetzelfde maar hoelang ze deze actie uit voeren kan verschillen. Sommige robots zullen beter kunnen ontwijken en sneller door kunnen gaan met hun bestelling dan andere robots. De robots die een goede ontwijkstrategie hebben kunnen hun strategie doorgeven aan de andere robots.&lt;br /&gt;
&lt;br /&gt;
==Optimaliseren van reactie==&lt;br /&gt;
Wanneer de robots met hun eigen ontwijkingsstrategie orders gaan verzamelen, zul je verschillen zien in de aanpak. De ene robot draait lang een rondje terwijl de andere robot bijna gelijk weer verder gaat met de bestelling. Je wilt dat de robots van elkaar leren en de beste strategieën nadoen zodat ze totaal zo min mogelijk botsen. Botsen kan er namelijk voor zorgen dat de robot kapot gaat of dat een artikel op de grond valt.&lt;br /&gt;
Omdat we 6 robots hebben beginnen we met 6 verschillende strategieën (ieder tweetal met het aantal seconden rondjes draaien en rechtdoor lopen is een strategie). Na een bepaalde tijd moeten we weten hoe goed de strategie van iedere robot is zodat de goede robots dit door kunnen geven aan de andere robots.&lt;br /&gt;
Het uitwisselen van deze informatie en het veranderen van de strategie gebeurd in de centrale controller op de volgende manier:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Stap 1:&#039;&#039;&#039;&lt;br /&gt;
Importeer extra package numpy:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot; line&amp;gt;&lt;br /&gt;
# import necessary packages&lt;br /&gt;
import bge&lt;br /&gt;
import GameLogic&lt;br /&gt;
import random&lt;br /&gt;
import numpy&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Stap 2:&#039;&#039;&#039;&lt;br /&gt;
Voeg een extra team toe met robot 6 en 7. Je weet van de vorige les al hoe dit moet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Stap 3:&#039;&#039;&#039;&lt;br /&gt;
Voeg een extra tijd meting toe om de strategieën te kunnen updaten: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot; line&amp;gt;&lt;br /&gt;
central[&amp;quot;time&amp;quot;]+= 1/60&lt;br /&gt;
central[&amp;quot;time_minute&amp;quot;]+= 1/60&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Stap 4:&#039;&#039;&#039;&lt;br /&gt;
Per minuut gaan we de strategieën van de robots herzien en veranderen op de volgende manier:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot; line&amp;gt;&lt;br /&gt;
if central[&amp;quot;time_minute&amp;quot;] &amp;gt;=60:&lt;br /&gt;
    central[&amp;quot;time_minute&amp;quot;] = 0&lt;br /&gt;
    robots = [&amp;quot;Robot_6&amp;quot;, &amp;quot;Robot_7&amp;quot;, &amp;quot;Robot_8&amp;quot;, &amp;quot;Robot_9&amp;quot;, &amp;quot;Robot_10&amp;quot;, &amp;quot;Robot_11&amp;quot;]&lt;br /&gt;
    result = [[0,0,0,&amp;quot;&amp;quot;] for i in range(len(robots))]&lt;br /&gt;
    alg_result = 0&lt;br /&gt;
    for i in range(len(robots)):&lt;br /&gt;
        robot = scene.objects[robots[i]]&lt;br /&gt;
        result[i][0] = robot[&amp;quot;collission&amp;quot;] &lt;br /&gt;
        result[i][1] = robot[&amp;quot;sec_rot&amp;quot;]&lt;br /&gt;
        result[i][2] = robot[&amp;quot;sec_walk&amp;quot;]&lt;br /&gt;
        result[i][3] = robot&lt;br /&gt;
        alg_result += robot[&amp;quot;collission&amp;quot;]&lt;br /&gt;
        robot[&amp;quot;collission&amp;quot;] = 0&lt;br /&gt;
        robot[&amp;quot;radar&amp;quot;]=0   &lt;br /&gt;
    central[&amp;quot;algorithm&amp;quot;].append(alg_result)&lt;br /&gt;
    # print number of collissions per minute&lt;br /&gt;
    print(central[&amp;quot;algorithm&amp;quot;])&lt;br /&gt;
    result = sorted(result, key=lambda a_entry: a_entry[0]) &lt;br /&gt;
    print(result)&lt;br /&gt;
    print(&amp;quot;Total walked distance:&amp;quot;)&lt;br /&gt;
    print(central[&amp;quot;distance&amp;quot;])&lt;br /&gt;
    print(central[&amp;quot;time&amp;quot;])&lt;br /&gt;
    # update values&lt;br /&gt;
    for i in range(len(robots)):&lt;br /&gt;
        robot = scene.objects[robots[i]]&lt;br /&gt;
        take_from = random.choice([0,1])&lt;br /&gt;
        robot[&amp;quot;sec_rot&amp;quot;] = max(0,result[take_from][1] + random.gauss(0, 0.1))&lt;br /&gt;
        robot[&amp;quot;sec_walk&amp;quot;] = max(0,result[take_from][2] + random.gauss(0, 0.1))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wat we in deze functie doen is het evalueren van de prestatie van de robots. Met prestatie bedoelen we het aantal keer opbotsen tegen de andere robots. Hoe minder dit gebeurd, hoe beter. Voor iedere robot wordt dit aantal opgeslagen samen met de twee waarden die hiervoor zorgden. Deze prestatie wordt opgeteld bij het algehele resultaat van de groep en de waarden worden weer op 0 gezet voor de volgende minuut. &lt;br /&gt;
Vervolgens worden de strategieën van de robots aangepast. We nemen de strategieën van de 2 beste robots, de robots met het minste aantal botsingen, om door te geven aan de anderen. Op deze waarden passen we nog een kleine variatie toe om te kijken of we in de volgende minuut nog een betere strategie tegen gaan komen. Zo kunnen de robots blijven leren. &lt;br /&gt;
&lt;br /&gt;
==Experimenten==&lt;br /&gt;
Wanneer je de robots nu aan het werk zet zie je per minuut een update van de prestatie van het algoritme uitgeprint in de Terminal. Het is moeilijk te analyseren of deze methode echt werkt als je alleen naar deze geprinte waarden. Je kan de robots aan het werk zetten en een aantal boxen laten vullen en deze cijfers in de gaten houden maar je kan er pas echt wat over zeggen als je een goed experiment uitvoert. Dit gaan we doen in Les 7.&lt;br /&gt;
&lt;br /&gt;
==Plusopdracht==&lt;br /&gt;
Denk alvast na over hoe je kan testen of dit algoritme werkt.&lt;/div&gt;</summary>
		<author><name>Jacqueline</name></author>
	</entry>
	<entry>
		<id>https://infvo.nl/lab/index.php?title=Logistieke_Robots/les_6&amp;diff=396</id>
		<title>Logistieke Robots/les 6</title>
		<link rel="alternate" type="text/html" href="https://infvo.nl/lab/index.php?title=Logistieke_Robots/les_6&amp;diff=396"/>
		<updated>2014-12-09T15:40:43Z</updated>

		<summary type="html">&lt;p&gt;Jacqueline: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Zijbalk Logistieke Robots}}&lt;br /&gt;
&lt;br /&gt;
==Les 6 - Robots van elkaar laten leren ==&lt;br /&gt;
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 &amp;quot;warehouse_team_collission.blend&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==Verbetering code na les 5 ==&lt;br /&gt;
We gaan een functie set_articles() maken zodat er een array aangemaakt &lt;br /&gt;
wordt met de artikelen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot; line&amp;gt;&lt;br /&gt;
def get_order():&lt;br /&gt;
    # get articles from central controller&lt;br /&gt;
    set_articles()&lt;br /&gt;
    print(robot[&amp;quot;articles&amp;quot;])&lt;br /&gt;
    # set game properties&lt;br /&gt;
    robot[&amp;quot;article_number&amp;quot;] = 1 &lt;br /&gt;
    robot[&amp;quot;target_desk&amp;quot;] = False &lt;br /&gt;
    # distance variables&lt;br /&gt;
    robot[&amp;quot;distance&amp;quot;] = 0.0&lt;br /&gt;
    robot[&amp;quot;location1&amp;quot;] = robot.position[0]&lt;br /&gt;
    robot[&amp;quot;location2&amp;quot;] = robot.position[1]&lt;br /&gt;
    robot[&amp;quot;location3&amp;quot;] = robot.position[2]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vervang ook de declaratie van robot[“robot_id”] door onderstaande. De central controller hoeft zo niet meer te vertellen om welke robot het gaat.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot; line&amp;gt;&lt;br /&gt;
# get the current controller &lt;br /&gt;
cont = bge.logic.getCurrentController()&lt;br /&gt;
robot = cont.owner&lt;br /&gt;
robot[&amp;quot;robot_id&amp;quot;] = robot.name[6:]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
De functie set_articles() ziet er als volgt uit:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot; line&amp;gt;&lt;br /&gt;
def set_articles():&lt;br /&gt;
    message = start_sens.bodies[0][1:]    &lt;br /&gt;
    order_length = len(re.findall(r&#039;[^\s ]+&#039;, message))&lt;br /&gt;
    robot[&amp;quot;articles&amp;quot;] = [&amp;quot;&amp;quot;]*order_length&lt;br /&gt;
    for i in range(order_length):&lt;br /&gt;
        robot[&amp;quot;articles&amp;quot;][i] = re.findall(r&#039;[^\s ]+&#039;, message)[i]  &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
De main() functie ziet er nu overzichtelijker uit:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot; line&amp;gt;&lt;br /&gt;
def main(): &lt;br /&gt;
    if robot[&amp;quot;target_desk&amp;quot;] == False:&lt;br /&gt;
        shelf_sens.propName = &amp;quot;Shelf&amp;quot;&lt;br /&gt;
        if robot[&amp;quot;article_number&amp;quot;] &amp;lt;= len(robot[&amp;quot;articles&amp;quot;]):&lt;br /&gt;
            track_act.target = robot[&amp;quot;articles&amp;quot;][robot[&amp;quot;article_number&amp;quot;]-1]&lt;br /&gt;
    else:&lt;br /&gt;
        shelf_sens.propName = &amp;quot;Desk&amp;quot;&lt;br /&gt;
        track_act.target = &amp;quot;Desk_&amp;quot; + str(robot[&amp;quot;robot_id&amp;quot;])&lt;br /&gt;
    if shelf_sens.positive:&lt;br /&gt;
        if robot[&amp;quot;target_desk&amp;quot;] == True:&lt;br /&gt;
            robot[&amp;quot;article_number&amp;quot;] += 1&lt;br /&gt;
            if robot[&amp;quot;article_number&amp;quot;]  == len(robot[&amp;quot;articles&amp;quot;]) +1:&lt;br /&gt;
                cont.deactivate(track_act)&lt;br /&gt;
                print(&amp;quot;done robot &amp;quot;+ str(robot[&amp;quot;robot_id&amp;quot;]))&lt;br /&gt;
                GameLogic.sendMessage(&amp;quot;Done&amp;quot;, robot[&amp;quot;robot_id&amp;quot;] , &amp;quot;Ground&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
                GameLogic.sendMessage(&amp;quot;Done&amp;quot;, str(robot[&amp;quot;distance&amp;quot;]) , &amp;quot;Ground&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
        robot[&amp;quot;target_desk&amp;quot;]=  not robot[&amp;quot;target_desk&amp;quot;]  &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
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:&lt;br /&gt;
&lt;br /&gt;
[[Bestand:balk_physics.png]]&lt;br /&gt;
&lt;br /&gt;
Verander dan de form factor in 0.0:&lt;br /&gt;
&lt;br /&gt;
[[Bestand:form_factor.png]]&lt;br /&gt;
&lt;br /&gt;
Doe dit voor beide robots.&lt;br /&gt;
&lt;br /&gt;
==Hervat les 6 - Robots van elkaar laten leren ==&lt;br /&gt;
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. &lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
==Observeren van botsingen==&lt;br /&gt;
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.&lt;br /&gt;
De centrale controller moet ook veranderd worden omdat we nu twee teams hebben. Doe daarvoor de volgende aanpassingen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot; line&amp;gt;&lt;br /&gt;
if sens.positive:&lt;br /&gt;
    robot_team = [&amp;quot;10&amp;quot;,&amp;quot;11&amp;quot;]&lt;br /&gt;
    central[&amp;quot;active_robots&amp;quot;] = [0,0,0,0,0,0,0,0,0,0,0]&lt;br /&gt;
    central[&amp;quot;distance&amp;quot;] =0&lt;br /&gt;
    central[&amp;quot;time&amp;quot;] = 0.0&lt;br /&gt;
    Send_order(robot_team)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot; line&amp;gt;&lt;br /&gt;
if message.positive:&lt;br /&gt;
    central[&amp;quot;active_robots&amp;quot;][int(message.bodies[0])-1]=0&lt;br /&gt;
    central[&amp;quot;distance&amp;quot;] += float(message.bodies[1])&lt;br /&gt;
    if central[&amp;quot;boxes_done&amp;quot;] &amp;lt; central[&amp;quot;boxes_tot&amp;quot;]-1 and central[&amp;quot;active_robots&amp;quot;][10-1]+central[&amp;quot;active_robots&amp;quot;][11-1]==0:&lt;br /&gt;
        central[&amp;quot;boxes_done&amp;quot;] +=1&lt;br /&gt;
        print(&amp;quot;number of boxes done:&amp;quot;)&lt;br /&gt;
        print(central[&amp;quot;boxes_done&amp;quot;])&lt;br /&gt;
        Send_order([&amp;quot;10&amp;quot;,&amp;quot;11&amp;quot;])&lt;br /&gt;
    if central[&amp;quot;boxes_done&amp;quot;] &amp;lt; central[&amp;quot;boxes_tot&amp;quot;]-1 and central[&amp;quot;active_robots&amp;quot;][9-1]+central[&amp;quot;active_robots&amp;quot;][8-1]==0:&lt;br /&gt;
        central[&amp;quot;boxes_done&amp;quot;] +=1&lt;br /&gt;
        print(&amp;quot;number of boxes done:&amp;quot;)&lt;br /&gt;
        print(central[&amp;quot;boxes_done&amp;quot;])&lt;br /&gt;
        Send_order([&amp;quot;8&amp;quot;,&amp;quot;9&amp;quot;])&lt;br /&gt;
    if sum(central[&amp;quot;active_robots&amp;quot;]) == 0: &lt;br /&gt;
        print(&amp;quot;Total walked distance:&amp;quot;)&lt;br /&gt;
        print(central[&amp;quot;distance&amp;quot;])&lt;br /&gt;
        print(central[&amp;quot;time&amp;quot;])&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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:&lt;br /&gt;
# 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.&lt;br /&gt;
# 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. &lt;br /&gt;
We kiezen voor algoritme 2 om te laten zien hoe je een robot van slimme kennis voorziet.&lt;br /&gt;
&lt;br /&gt;
== Kunnen reageren op andere robots ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
===Veranderen pakhuis omgeving===&lt;br /&gt;
Omdat we de controller van de robot gaan veranderen, mag je robot 9, 10 en 11 weer verwijderen. En de volgende stappen uitvoeren:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Stap 1:&#039;&#039;&#039;&lt;br /&gt;
Voeg aan de robot een string game property toe met de naam  “Robot”. Dit is om elkaar te kunnen herkennen met een Radar&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Stap 2:&#039;&#039;&#039;&lt;br /&gt;
Zet de Physics Type op Character en vink de box Actor aan:&lt;br /&gt;
&lt;br /&gt;
[[Bestand: balk_actor.png]]&lt;br /&gt;
&lt;br /&gt;
[[Bestand: set_as_actor.png]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Stap 3:&#039;&#039;&#039;&lt;br /&gt;
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:&lt;br /&gt;
&lt;br /&gt;
[[Bestand: change_physics.png]]&lt;br /&gt;
&lt;br /&gt;
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:&lt;br /&gt;
&lt;br /&gt;
[[Bestand: nieuwe_arena.png]]&lt;br /&gt;
&lt;br /&gt;
===Veranderen robot controller ===&lt;br /&gt;
De robots moeten elkaar nu herkennen, hier op reageren en vervolgens weer doorgaan met het ophalen van artikelen. We moeten veel gaan veranderen aan de controller. We nemen dit stap voor stap door:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Stap 1:&#039;&#039;&#039;&lt;br /&gt;
We hebben een extra Radar nodig om een ontwijkactie te starten en we moeten kunnen meten of de robot een goede actie gedaan heeft. Dit doen we met een collission sensor. De always sensor is nodig om de taak weer op te pakken na de ontwijkactie:&lt;br /&gt;
[[Bestand: add_radar.png]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Stap 2:&#039;&#039;&#039;&lt;br /&gt;
De ontwijkactie houdt in dat de robot, na het detecteren van een andere robot, een aantal seconden rondjes draait, weg loopt van de robot en daarna zijn taak weer oppakt. Dit definiëren we in een extra state: &lt;br /&gt;
[[Bestand: add_state.png]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Stap 3:&#039;&#039;&#039;&lt;br /&gt;
Voeg extra game properties toe:&lt;br /&gt;
[[Bestand: add_game_property.png]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Stap 4:&#039;&#039;&#039;&lt;br /&gt;
Het script moet ook onder handen genomen worden. Er moet een extra package geïmporteerd worden omdat we de robot een willekeurige waarde geven voor het draaien om zijn eigen as en het weglopen van de radar locatie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot; line&amp;gt;&lt;br /&gt;
# import necessary packages&lt;br /&gt;
import bge&lt;br /&gt;
import GameLogic&lt;br /&gt;
import re&lt;br /&gt;
import random&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
De extra sensors moeten gedefinieerd worden: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot; line&amp;gt;&lt;br /&gt;
# get sensors and actuators&lt;br /&gt;
start_sens = cont.sensors[&amp;quot;Start&amp;quot;]&lt;br /&gt;
shelf_sens = cont.sensors[&amp;quot;Shelf&amp;quot;]&lt;br /&gt;
track_act = cont.actuators[&amp;quot;TrackTo&amp;quot;]&lt;br /&gt;
robot_radar = cont.sensors[&amp;quot;RobotRadar&amp;quot;]&lt;br /&gt;
robot_collission = cont.sensors[&amp;quot;RobotCollission&amp;quot;]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wanneer de robot voor de eerste keer begint met de order, worden de parameters gedefinieerd die te maken hebben met het ontwijken van de andere robot:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot; line&amp;gt;&lt;br /&gt;
if start_sens.positive:&lt;br /&gt;
    cont.activate(track_act) &lt;br /&gt;
    print(&amp;quot;Start new order:&amp;quot;)&lt;br /&gt;
    get_order()  &lt;br /&gt;
    # set avoidance parameters and evaluation variables&lt;br /&gt;
    print(&amp;quot;begin&amp;quot;)&lt;br /&gt;
    if robot[&amp;quot;active&amp;quot;] == False:&lt;br /&gt;
        robot[&amp;quot;sec_rot&amp;quot;] = random.uniform(0,2)&lt;br /&gt;
        robot[&amp;quot;sec_walk&amp;quot;] = random.uniform(0,2)&lt;br /&gt;
        robot[&amp;quot;active&amp;quot;] =True&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wanneer een robot iemand op de radar heeft, moet de robot de ontwijkactie uit gaan voeren in de andere state. Ook moet bijgehouden worden of de robot alsnog tegen een ander aan stoot. Wanneer de robot een slechte ontwijkactie heeft en vaak tegen iemand op botst, willen we dat deze robot een nieuwe ontwijkreactie krijgt. Dit noemen we een “reset”. Dit is nodig als de robot ergens vast zit:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot; line&amp;gt;&lt;br /&gt;
if robot_radar.positive == True:&lt;br /&gt;
    cont.deactivate(track_act)&lt;br /&gt;
    robot[&amp;quot;radar&amp;quot;] +=1&lt;br /&gt;
    robot[&amp;quot;time&amp;quot;] = 0.0&lt;br /&gt;
    robot.state = 2&lt;br /&gt;
&lt;br /&gt;
if robot_collission.positive:&lt;br /&gt;
    robot[&amp;quot;collission&amp;quot;] +=1&lt;br /&gt;
    &lt;br /&gt;
if robot[&amp;quot;collission&amp;quot;] &amp;gt;=20:&lt;br /&gt;
    #reset parameters because its stuck&lt;br /&gt;
    robot[&amp;quot;sec_rot&amp;quot;] = random.uniform(0,2)&lt;br /&gt;
    robot[&amp;quot;sec_walk&amp;quot;] = random.uniform(0,2)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In de extra state hebben we gezien dat er nog een “avoiding.py” gemaakt moet worden. Deze ziet er als volgt uit:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot; line&amp;gt;&lt;br /&gt;
# import necessary packages&lt;br /&gt;
import bge&lt;br /&gt;
import GameLogic&lt;br /&gt;
import re&lt;br /&gt;
&lt;br /&gt;
# get the current controller &lt;br /&gt;
cont = bge.logic.getCurrentController()&lt;br /&gt;
robot = cont.owner&lt;br /&gt;
robot[&amp;quot;robot_id&amp;quot;] = robot.name[6:]&lt;br /&gt;
&lt;br /&gt;
# get sensors and actuators&lt;br /&gt;
rot_act = cont.actuators[&amp;quot;Rotate&amp;quot;]&lt;br /&gt;
walk_act = cont.actuators[&amp;quot;Walk&amp;quot;]&lt;br /&gt;
robot_collission2 = cont.sensors[&amp;quot;RobotCollission2&amp;quot;]&lt;br /&gt;
robot_radar2 = cont.sensors[&amp;quot;RobotRadar2&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
robot[&amp;quot;time&amp;quot;] += 1/60&lt;br /&gt;
&lt;br /&gt;
if robot[&amp;quot;time&amp;quot;] &amp;lt; robot[&amp;quot;sec_rot&amp;quot;]:&lt;br /&gt;
    cont.activate(rot_act)&lt;br /&gt;
&lt;br /&gt;
if robot[&amp;quot;time&amp;quot;] &amp;gt; robot[&amp;quot;sec_rot&amp;quot;] and robot[&amp;quot;time&amp;quot;] &amp;lt; (robot[&amp;quot;sec_rot&amp;quot;] + robot[&amp;quot;sec_walk&amp;quot;]):&lt;br /&gt;
    cont.deactivate(rot_act)&lt;br /&gt;
    cont.activate(walk_act)&lt;br /&gt;
&lt;br /&gt;
if robot[&amp;quot;time&amp;quot;] &amp;gt; (robot[&amp;quot;sec_rot&amp;quot;] + robot[&amp;quot;sec_walk&amp;quot;]):&lt;br /&gt;
    robot.state =1&lt;br /&gt;
&lt;br /&gt;
if robot_collission2.positive:&lt;br /&gt;
    robot[&amp;quot;collission&amp;quot;] +=1&lt;br /&gt;
&lt;br /&gt;
if robot_radar2.positive:&lt;br /&gt;
    robot[&amp;quot;radar&amp;quot;] +=1&lt;br /&gt;
    robot[&amp;quot;time&amp;quot;] = 0.0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wanneer je de robots nu laat starten met het ophalen van bestellingen, zie je dat ze op elkaar reageren en hun ontwijkactie uitvoeren. De acties die ze uitvoeren zijn hetzelfde maar hoelang ze deze actie uit voeren kan verschillen. Sommige robots zullen beter kunnen ontwijken en sneller door kunnen gaan met hun bestelling dan andere robots. De robots die een goede ontwijkstrategie hebben kunnen hun strategie doorgeven aan de andere robots.&lt;br /&gt;
&lt;br /&gt;
==Optimaliseren van reactie==&lt;/div&gt;</summary>
		<author><name>Jacqueline</name></author>
	</entry>
	<entry>
		<id>https://infvo.nl/lab/index.php?title=Bestand:Add_game_property.png&amp;diff=395</id>
		<title>Bestand:Add game property.png</title>
		<link rel="alternate" type="text/html" href="https://infvo.nl/lab/index.php?title=Bestand:Add_game_property.png&amp;diff=395"/>
		<updated>2014-12-09T15:36:46Z</updated>

		<summary type="html">&lt;p&gt;Jacqueline: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Jacqueline</name></author>
	</entry>
	<entry>
		<id>https://infvo.nl/lab/index.php?title=Bestand:Add_state.png&amp;diff=394</id>
		<title>Bestand:Add state.png</title>
		<link rel="alternate" type="text/html" href="https://infvo.nl/lab/index.php?title=Bestand:Add_state.png&amp;diff=394"/>
		<updated>2014-12-09T15:36:27Z</updated>

		<summary type="html">&lt;p&gt;Jacqueline: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Jacqueline</name></author>
	</entry>
</feed>