Files
Filesdocsrobotlekce6 | |
---|---|
.. | |
assets | |
example6 | |
project6 | |
for.md | |
index.md | |
turtle.md |
turtle.mdLekce 6.5 - Cykly znovu a lépe
Tato lekce ukazuje praktické využití cyklů za účelem kreslení obrazců. V předchozích lekcích jsme si ukázali jednoduchou jízdu s robotem a zvedání tužky, a navážeme na to dále.
Želvička
Tato lekce je určena primárně na práci v Simulátoru . Program obsahuje zjednodušenou verzi reality, ve které nám bude jezdit želvička a přijímat příkazy na základě vnějších podnětů.
Programy nám budou fungovat i na skutečném robotovi. Je však je důležité nejdříve si v simulaci ověřit funkčnost, aby se nám skutečný robot nezačal chovat neočekávaným způsobem a nezpůsobil sobě nebo nám škody.
Program má textové okno, kam můžeme psát příkazy. Nám již známé příkazy jsou:
robutek.rotate(deg)
- želvička se otočí odeg
stupňů po směru hodinových ručičekrobutek.move(direction, options)
- želvička jede některým směrem na základě zadaných parametrůZadání A
V jedné z předchozích lekcí jsme použili znalosti o ovládání motorů a fixy na nakreslení čtverce. Museli jsme však několikrát pod sebou kopírovat kód na pohyb dopředu a otočení, ačkoliv jsme vykonávali čtyřikrát to stejné. Tentokrát pomocí for cyklu napište kód, díky kterému robot nakreslí čtverec a vrátí se do výchozí polohy.
??? note "Řešení" ```ts import * as robutek from "./libs/robutek.js"; // ovládání motorů
let pen = new Servo(robutek.Pins.Servo2, 1, 4); pen.write(robutek.PenPos.Down); // dáme dolů tužku
robutek.setSpeed(100) // nastavíme rychlost na 100 mm/s
for (let i: number = 0; i < 4; i++) { // chování opakujeme 4x, pro každou stěnu čtverce await robutek.move(0, { distance: 200 }); // posun dopředu o 20 cm await robutek.rotate(90); // rotace doprava o 90 stupňů } ```
Zadání B
Napište kód, pomocí kterého nakreslíte několik na sebe navazujících kruhů. Dá se na to využít zatáčení pomocí
motors.move(1)
. Vzdálenost, kterou je potřeba ujet si dopočítáme na základě toho, že kola jsou od sebe82mm
daleko. Po nakreslení každého kola se můžeme otočit, ale pro plynulý pohyb chceme kreslit každé kolo z jiného směru. K tomu může pomoct například stavová proměnná, která nám řekne, jestli tentokrát pojedeme doprava, nebo doleva.??? note "Řešení" ```ts import * as robutek from "./libs/robutek.js"; // ovládání motorů
let pen = new Servo(robutek.Pins.Servo2, 1, 4); pen.write(robutek.PenPos.Down); // dáme dolů tužku
robutek.setSpeed(100) // nastavíme rychlost na 100 mm/s
let direction: number = 1; // směr otáčení let circumference: number = 2 * 3.14 * 82; // obvod jednoho kruhu, který robot objede for (let i: number = 0; i < 4; i++) { // chování opakujeme 4x await robutek.move(direction, { distance: circumference * 1.5 }); // chceme projet obvod 1,5x if( direction == 1 ){ direction = -1; } else { direction = 1; } } ```
Výstupní úkol V1 - Trojúhelník
Napište kód, který způsobí, že želvička nakreslí místo čtverce trojúhelník. Rozměry trojúhelníku jsou na vás, jen musí skutečně jít o trojúhelník.
!!! tip "Jak na Trojúhelníky"" Tvar s délkami
a
,b
ac
nazýváme trojúhelníkem, pokud splňuje trojúhelníkovou nerovnost:math a + b > c a + c > b b + c > a
Nejjednodušší trojúhelník je rovnostranný, který bude mít všechny strany stejně dlouhé a 60° vnitřní úhel na každém rohu.
Hned po něm následuje rovnoramenný, který v nejjednodušším případě bude mít 90° úhel mezi kratšími stranami, a 45° mezi krátkou a dlouhou.
Pokud chceme nějaký méně pravidelný trojúhelník, můžeme na výpočet úhlu a délek použít kosínovu větu.
Výstupní úkol V2 - Domeček
Propojte dosavadní znalosti do jednoho kódu. Napište program, který způsobí že si želvička nakreslí domeček z čtverce a trojúhelníkové střechy.
Následně želvička přestane kreslit, a vjede doprostřed domečku, kde zastaví.
Dobrovolný úkol - Spuštění na vlastním robotovi
Pokud vám program funguje v simulátoru, zkuste si ho nahrát do skutečného robota. Funguje vám? Pozorujete nějaké rozdíly v jeho chování oproti zjednodušenému prostředí?