Práce s knihovnou

Lego Mindstorms

Knihovna gyarab_mindstorms obsahuje funkce, které ulehčují programování robota. V téhle části se dozvíte o každé funkci a o tom, jak se používají.

Pohyb

Tip

Všechny příklady z této kapitoly jsou nahrané v robotovi v adresáři gyarab_mindstorms_examples. Spouští se tak, jak bylo popsáno v předchozí kapitole.

forward, backward

forward(duration, speed, stop=True)
backward(duration, speed, stop=True)

Posouvá robota dopředu/dozadu po danou dobu danou rychlostí.

Argumenty

  • duration - jak dlouho se má robot pohybovat v milisekundách
  • speed (nepovinný) - rychlost, jakou se má robot pohybovat, hodnota od 1 do 1000, v základu 500
  • stop (nepovinný) - viz Pohyb bez zastavení

Příklad (move_forward_backward.py)

#!/usr/bin/env pybricks-micropython

from gyarab_mindstorms import backward, forward, wait

# go forward for 1.5 seconds at default speed
forward(1500)
wait(1000)  # wait for 1 second
# go backward for 1.5 seconds at default speed (return to start)
backward(1500)
wait(1000)  # wait for 1 second

# go forward for half a second at max speed
forward(500, 1000)
wait(1000)  # wait for 1 second

# go backward for 3 seconds slowly
backward(3000, 100)

Tip

Pro jízdu po trati pravděpodobně budete potřebovat příkazy jako: "Jeď rovně 30cm" ale tahle knihovna obsahuje jenom funkci pro pohyb po nějakou dobu nějakou rychlostí. Jak tedy na to? Může se hodit vyzkoušet různé varianty duration a speed a změřit, jakou vzdálenost robot urazil.

rotate_left, rotate_right

rotate_left(angle, speed)
rotate_right(angle, speed)

Robot se otáčí na místě do leva/do prava o daný úhel

Argumenty

  • angle - úhel, o jaký se má robot otočit ve stupních
  • speed (nepovinný) - rychlost, jakou se má robot otáčet, hodnota od 1 do 1000, v základu 300

Příklad (move_rotate.py)

Robot se nejdříve otočí doprava o 180° a zase zpátky. Potom se otočí do prava o 120° a do leva o 30°. Celkově by tedy měl skončit otočený do prava o 90° oproti původní pozici.

#!/usr/bin/env pybricks-micropython

from gyarab_mindstorms import rotate_left, rotate_right, wait

# rotate right by 180 degrees at default speed
rotate_right(180)
wait(1000)  # wait for 1 second

# rotate left by 180 degrees at default speed
rotate_left(180)
wait(1000)  # wait for 1 second

# fast rotate right by 120 degrees
rotate_right(120, speed=1000)
wait(1000)  # wait for 1 second

# slowly rotate left by 30 degrees
rotate_left(30, speed=50)
wait(1000)  # wait for 1 second

Poznámka

Robot má tendenci otočku trochu "přestřelit", při malé rychlosti to není znatelné ale u vyšších už ano. Jednotlivé odchylky se navíc mohou sčítat, takže čím víckrát se bude robot otáčet, tím větší bude celková odchylka. Je tedy docela užitečné zkontrolovat o kolik stupňů se robot opravdu otočil.

turn_left, turn_right

turn_left(angle, radius, speed, stop), turn_right(angle, radius, speed, stop)

Robot zatáčí do leva/do prava.

Argumenty

  • angle - úhel, o jaký se má robot otočit ve stupních
  • radius - přibližný poloměr zatáčky, v milimetrech, měřeno od středu vnějšího kola
  • speed (nepovinný) - rychlost vnějšího kola, hodnota od 1 do 1000, v základu 500
  • stop (nepovinný) - viz Pohyb bez zastavení

Příklad (move_turn.py)

Robot jede ve tvaru osmičky.

#!/usr/bin/env pybricks-micropython

from gyarab_mindstorms import (
    forward,
    turn_left,
    turn_right,
)

forward(2000)
turn_right(270, 300)  # turn right by 270 degrees with a turning radius of 300mm
forward(2000)
turn_left(270, 300)  # turn left by 270 degrees with a turning radius of 300mm

Note

Korekce směru robota při pohybu závisí na datech z gyroskopu. Občas se stane, že gyroskop vrací špaté hodnoty. Pokud si všimnete, že je otáčení robota nepřesné, zkuste ho restartovat.

Pohyb bez zastavení

Pokud jste si zkoušeli předchozí příklady, určitě jste si všimli, že robot se pohybuje "trhaně". Například pokud chceme aby jel rovně a pak zatočil, robot pojede rovně, zastaví a pak se znovu rozjede do zatáčky. To stojí nějaký čas. Jak zařídit, aby robot jezdil plynule?

U funkcí forward, backward, turn_left a turn_right k tomu slouží boolean argument stop. Ukážeme si to na funkci forward, u ostatních to ale funguje úplně stejně.

Když zavoláme funkci forward takhle:

forward(1000)
# nebo
forward(1000, stop=True)
říkáme robotovi: "Jeď rovně 1 vteřinu a pak se zastav". Pokud ale zavoláme funkci takhle:
forward(1000, stop=False)
říkáme: "Jeď rovně 1 vteřinu a pokračuj dalším příkazem aniž bys před tím zastavil". Můžeme takhle dosáhnout plynulého pohybu.

Důležité!

Pokud používáte tyto funkce se stop=False, musíte za poslední takovou funkcí zavolat funkci stop(), jinak se robot nezastaví.

Příklad (move_turn_no_stop.py)

Robot projede dráhu ve tvaru osmičky bez zastavování mezi jednotlivými příkazy.

#!/usr/bin/env pybricks-micropython

from gyarab_mindstorms import forward, stop, turn_left, turn_right

forward(2000, stop=False)
turn_right(
    270, 300, stop=False
)  # turn right by 270 degrees with a turning radius of 300mm
forward(2000, stop=False)
turn_left(
    270, 300, stop=False
)  # turn left by 270 degrees with a turning radius of 300mm

stop()  # IMPORTANT!!! - robot will not stop without this

Předchozí: Nahrávání a spouštění programů

Pomocné funkce

  • display_print(message)
  • beep()
  • wait_for_button()

display_print()

Vypisuje zprávu na displej robota.

Argumenty

message - zpráva, která má být vypsána na display

Příklad (misc_display_print.py)

#!/usr/bin/env pybricks-micropython

from gyarab_mindstorms import display_print, wait

display_print("Hello, world!")
# Wait for 1 second
wait(1000)

beep()

Přehraje krátký tón.

Příklad (misc_beep.py)

#!/usr/bin/env pybricks-micropython

from gyarab_mindstorms import beep

beep()

wait_for_button()

Zastaví program a čeká na zmáčknutí prostředního tlačítka. Tuhle funkci se hodí zavolat v případě, že nechcete, aby se robot začal pohybovat ihned po spuštění programu.

Příklad (misc_wait_for_button.py)

Robot čeká na zmáčknutí tlačítka a pak jede dopředu.

#!/usr/bin/env pybricks-micropython

from gyarab_mindstorms import backward, forward, wait, wait_for_button

wait_for_button()
forward(1500)

Senzory

  • get_color()
  • get_distance()
  • get_gyro()

get_color()

Vrací data z senzoru barev.

Návratová hodnota

Funkce vrací následující barvy, případně None pokud není detekována žádná barva.

  • Color.BLACK
  • Color.BLUE
  • Color.GREEN
  • Color.YELLOW
  • Color.RED
  • Color.WHITE
  • Color.BROWN
  • None

Příklad (sensor_color.py)

Program, který pořád čte barvu ze senzoru a určuje, jestli barva, kterou senzor vidí, je červená.

#!/usr/bin/env pybricks-micropython

from gyarab_mindstorms import Color, display_print, get_color, wait

while True:
    # Get the color from the color sensor
    color = get_color()

    # Print error if no color was detected
    if not color:
        display_print("No color found")
        continue

    # Determine whether the color is red
    if color == Color.RED:
        display_print("Red")

    else:
        display_print("Not red")

    # Wait for 100 milliseconds
    wait(100)

get_distance()

Vrací vzdálenost od překážky podle ultrazvukového senzoru.

Návratová hodnota

vzdálenost v milimetrech

Příklad (sensor_distance.py)

Program čte vzdálenost z ultrazvukového senzoru a vypisuje ji na displej.

#!/usr/bin/env pybricks-micropython

from gyarab_mindstorms import display_print, get_distance, wait

while True:
    # Get the distance from the ultrasonic sensor
    distance = get_distance()
    # Print the distance to the display
    display_print(distance)
    # Wait for 100 milliseconds
    wait(100)

get_gyro()

Vrací aktuální orientaci robota podle gyroskopu.

Návratová hodnota

Vrací úhel robota oproti startu programu. Hodnota je od 0 do 359 stupňů, úhel roste ve směru hodinových ručiček, tzn.

  • robot míří stejným směrem jako při spuštění => 0
  • robot se otočil o 90° do prava => 90
  • robot se otočil o 90° do leva => 270

Příklad (sensor_gyro.py)

Program čte úhel z gyroskopu a vypisuje jej na displej.

#!/usr/bin/env pybricks-micropython

from gyarab_mindstorms import display_print, get_gyro, wait

while True:
    # Get the angle from the gyro sensor
    angle = get_gyro()
    # Print the angle to the display
    display_print(angle)
    # Wait for 100 milliseconds
    wait(100)

Další příklady

Kružnice (move_circle.py)

Robot opisuje kružnici. Změnou proměnné radius můžete měnit poloměr kružnice.

from gyarab_mindstorms import turn_left

turn_radius = 350  # in mm

turn_left(360, turn_radius)

Čtverec (move_square.py)

Robot jede ve tvaru čtverce. Délku strany čtverce závisí na tom, jak dlouho jede robot rovně mezi zatáčením.

from gyarab_mindstorms import forward, rotate_left

forward_duration = 2000  # in milliseconds

forward(forward_duration)
rotate_left(90, 100)

forward(forward_duration)
rotate_left(90, 100)

forward(forward_duration)
rotate_left(90, 100)

forward(forward_duration)
rotate_left(90, 100)

Slalom (move_zig_zag.py)

Robot jede ve slalom - střídavě zatačí doleva a doprava, každou zatáčkou objede půlkružnici.

from gyarab_mindstorms import stop, turn_left, turn_right

turn_radius = 250  # in mm

turn_left(180, turn_radius, stop=False)

turn_right(180, turn_radius, stop=False)

turn_left(180, turn_radius, stop=False)

turn_right(180, turn_radius, stop=False)

stop()

Předchozí: Nahrávání a spouštění programů