Logistieke Robots/les 4

Uit Lab
Naar navigatie springen Naar zoeken springen
Logistieke Robots

Lessen

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

Software

Zie ook Regels en richtlijnen
Zie ook Artikelen bewerken

Les 4

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.

In deze les leren we hoe we een controller kunnen maken voor 1 robot die de artikelen 1 voor 1 ophaalt. Open de file “warehouse_one_order.blend”. Wat je in deze les ontwikkelt, gebruik je in de volgende lessen als basis om op door werken.

Sturen van de bestelling door centrale systeem

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).

Net als in de vorige les ontwikkelen we de controller via de logic bricks en via Python scripting.

Stap 1: Python script aanmaken voor Ground object

  • Selecteer het Ground object;
  • 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”;
  • Voeg een Python controller aan met dit script.

Stap 2: Logic bricks voor Ground object

  • 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.

Keyboard controller met tap-instelling

  • Verbind deze sensor met de Python-controller van de vorige stap.

Stap 3: Programmeren script “central_controller.py”

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:

  • 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.
import bge
import GameLogic
import random

cont = bge.logic.getCurrentController()  # controller of this script
central = cont.owner                     # game object owning this controller

# get sensors
sens = cont.sensors["Start"]
  • 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:
game_object[“naam_variabele”] = waarde

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:

# define game properties
central["boxes_tot"] = 5
central["box_size"] = 3

box_articles = ["Shelf_1", "Shelf_2", "Shelf_3", "Shelf_4", "Shelf_5", "Shelf_6", "Shelf_7", "Shelf_8"]

“boxes_tot” en “box_size” zijn game properties verbonden aan het Ground object.

“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. 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.

  • 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:
if sens.positive:
    robot = "11"
    Send_order(robot)

waarin Send_order als volgt gedefinieerd is:

def Send_order(robot):
    order = ""
    for j in range(central["box_size"]):
        order += " " + random.choice(box_articles)
    GameLogic.sendMessage("Start", order , "Robot_"+robot , "Ground")
    GameLogic.sendMessage("Start", robot , "Robot_"+robot , "Ground")

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. 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.