Programování

B3B35RO1| Ing. David Pařil - Python a BriVis pro Briana

Něco málo o mně

  • 1. robosoutěž 2016
  • Absolvent ČVUT FEL – Kybernetika a Robotika
  • Lektor @ Katedra kybernetiky & Katedra řídicí techniky
  • Lékařské přístroje – kardiochirurgie – Maastricht
  • Organizátor a vedoucí Robotábora

 

NXT

2006

EV3

2013

NXT

2006

EV3

2013

SPIKE

2020

NXT

2006

EV3

2013

SPIKE

2020

BRIAN

2025

NXT

2006

EV3

2013

SPIKE

2020

BRIAN

2025

NXT

2006

EV3

2013

SPIKE

2020

BRIAN

2025

„Inteligentní“ kostka
2 dotykové senzory
Zvukový sensor
Světelný sensor
Ultrazvukový sensor
3 velké servo motory

„Inteligentní“ kostka
2 dotykové senzory
Gyroskop
Světelný sensor
Ultrazvukový sensor
2 velké servo motory
1 malý servo motor

„Inteligentní“ kostka
2 tlakové senzory
Gyroskop (integr.)
Světelný sensor
2 Ultrazvukové sens.
1 větší servo motor
2 malé servo motory

„Inteligentní“ kostka
2 dotykové senzory
Gyroskop
Světelný sensor
Ultrazvukový sensor
2 velké servo motory
1 malý servo motor

NXT

2006

EV3

2013

SPIKE

2020

BRIAN

2025

256 KB Flash
64 KB RAM
48 MHz
BT

16 MB Flash
64 MB RAM
300 MHz
BT + Ext. Wi-Fi

SD Karta

1 MB Flash
320 KB RAM
100 MHz
BT

16 MB Flash
8 MB RAM
Dualcore 240 MHz
Wifi + BT

RT coprocessor
USB-C, SD Karta

NXT

2006

EV3

2013

SPIKE

2020

BRIAN

2025

Barevný dotykový display

Rotační enkodér

Reproduktor

Headphone jack

SD Karta

USB-C Fastcharge

Motorporty

Senzorporty

Zapojte se

Nahlašte problémy s Brianem

  1. Vedoucímu na cvičení
  2. Sepsat a nahlásit příště

Připojte se k vývoji

  1. Dokumentace
  2. Tutoriály a výukové materiály
  3. Vývoj motorů / senzorů
  4. BriVis, BriCode, Bremote, ...

→ parildav@fel.cvut.cz | hlinovsm@fel.cvut.cz

Programování

Přehled podporovaných programovacích jazyků:

Platforma Grafické uPython Java C ostatní
NXT ⚠️ ⚠️ ⚠️
EV3 ⚠️ ⚠️ ⚠️
SPIKE
BRIAN

✅ oficiální podpora
⚠️ neoficiální podpora
❌ nepodporováno
❔ možná v budoucnu

Nahrávání programu do Briana

Do Briana lze nahrát soubory:

  1. Přes kabel USB-C - chová se jako externí médium
  2. Přes Wi-Fi portál Bremote

 

Brian umí pustit libovolný uPython soubor

   např. hello_world.py

s validní uPython syntaxí + BrianAPI.

print("Ahoj, tady Brian")

    Brivis

Grafické programování pro Briana

  • Jednoduché ovládání
  • Přehledný seznam API bloků
  • Real-time překlad do uPython
  • Možnost ukládat/nahrávat kódy

 

brivis.fel.cvut.cz
brivis.voltavian.com

Bremote (Wi-Fi)

Umožňuje:

  • Upravovat Python a Brivis programy
  • Spouštět programy a vyčítat konzoli
  • Ovládání motorů / senzorů
  • ...

 

Typicky: 192.168._._ (viz Brian nastavení)

Realtime :o

Bremoting BriVis

Přes Bremote můžete otevřít Brivis v

 

Synchronizovaném režimu

 

BriVis se propisuje do Briana v reálném čase.

 

Obě karty musí zůstat otevřené!
(Doporučuji side-by-side s konzolí)

Bri... Python?

Libovolné IDE:

  • VSCode - podpora BriCode ⭐️
  • Pycharm
  • Gedit
  • vim

 

Lze si stáhnout balíček python typing:

https://voltavian.com/docs/brian/assets/brian.typing.zip

BriCode

Rozšíření do VS Code

  • Umožňuje nahrát program
    do Briana jedním klikem
    (zatím pouze USB)
  • Umožňuje stáhnout Brian
    typings
     (intellisense)

Brian Dokumentace

Dokumentace Briana, primárně Python API

🇨🇿 brian.fel.cvut.cz/cs/introduction.html

🇬🇧 brian.fel.cvut.cz/introduction.html

 

 

 

 

 

 

Aktualizace FW

Dokumentace Briana + nástroje pro aktualizaci a USB debug:

🇬🇧 voltavian.com/docs/brian/fwupdate/

*Firefox nepodporuje komunikaci s USB zařízeními

 

 

 

 

 

Metodické pokyny (příručka)

Vzorové projekty a příklady pro práci s Brianem.

Od prvních programů až po regulace.

 

 

 

 

 

Dočasný odkaz

Hardware

Kostka: LCD + tlačítka + reproduktory

4 Senzorové porty

4 Motorové porty

Využití tlačítek na kostce

START / STOP

Okamžité zastavení robota

Využití tlačítek na kostce

Využití tlačítek na kostce

Debugování

ZVUK

DISPLAY

BAREVNÁ TLAČÍTKA

Návod na stavbu základního robota

Základní buggy-drive robot se světelným senzorem na sledování čáry:

https://www.tinyurl.com/brian-line-follower

Motory

Servo motory
    tj. DC (stejnosměrný) motor, převodovka a
Enkodér
    děrované kolečko
    2 svítící LED a 2 fotodiody

enkodér

Source: lastminuteengineers.com

NXT

2006

EV3

2013

SPIKE

2020

2ot/s
~20Ncm

2ot/s
20Ncm

3ot/s
8Ncm

2ot/s
8Ncm

2ot/s
3.5Ncm

1ot/s
1.8Ncm

BRIAN

2025

?

Endstop

Motor jako sensor

Dotykový senzor

Tlačítko – nedetekuje sílu, pouze zmáčknuto/nezmáčknuto (spike detekuje sílu)
Stisk musí být kolmý – jinak nefunguje spolehlivě

 

Využití:

  • Detekce kolize
  • Detekce hrany stolu
  • Kalibrace

 

Dotykový senzor

Dotykový senzor

Světelný senzor

Měří intenzitu okolního osvětlení.
Umí si rozsvítit přídavnou červenou [nebo RGB] LED diodu.

 

Využití:

  • Sledování čáry
  • Detekce hrany
  • Třízení dle barvy
  • Detekce překážky

 

RGB neoficiální verze

Světelný senzor

Množství odraženého světla závisí na barvě objektu/světla, úhlu, …
Sensor si umí sám nasvítit předměty červenou barvou.

 

Světelný senzor

Trik: můžeme se senzorem blikat a porovnávat hodnoty s a bez přisvícení

→ získáme čistě hodnotu přisvícení*

(* zanedbaje nelinearity měření)

Sledování čáry

Odhad vzdálenosti

Detekce barvy

Ultrazvukový senzor

Vysílá ultrazvukový signál a čeká na jeho opětovné přijetí.
Z prodlevy mezi vysíláním a příjmem signálu vypočítá vzdálenost.
Citlivý na odrazivost překážky a úhel dopadu!!

 

 

Využití:

  • Detekce překážek (10-255cm)
  • Sledování stěny

 

Source: www.ubuy.vn

Ultrazvukový senzor

Source: www.hackster.io/ioarvanit/measuring-distance-with-sound-353c17

Ultrazvukový senzor

Source: www.hackster.io/ioarvanit/measuring-distance-with-sound-353c17

Ultrazvukový senzor

Source: www.hackster.io/ioarvanit/measuring-distance-with-sound-353c17

Gyroskop

Pouze jednoosý rotační akcelerometr.
Dvojitá integrace -> integrační chyby.
Potřebuje pravidelně kalibrovat!

 

 

Využití:

  • Náklon robota
  • Otočení robota (přesnější zatáčení)

 

Source: https://www.researchgate.net/publication/261417429_Modeling_and_simulation_of_the_MEMS_vibratory_gyroscope

Co budeme řešit:

Úlohy pro akademický rok 2025/26:

  • Sledování čáry
  • Sledování s objížděním
  • Bludiště
  • Sumo
  • Tetris

 

~ 48 bodů

~ 14 bodů

~ 10 bodů

= 20 bodů

≤ 240 bodů

Sledování čáry

Délka dráhy ~9m

Body:

  • Varianta A: 60 [60cm/s] až 20 [~14cm/s]
  • Varianta B: 21 [45cm/s] až 8 [~13cm/s]

 

Pro běžná kola: 60cm/s 3,4 otáčky za sekundu

Pro velká kola:  60cm/s 2,3 otáčky za sekundu

(za předpokladu, že robot nezatáčí)

Bludiště

Až 40 políček (bodů)

Časový limit 90s

Sumo

Časový limit 60s

Tetris

Časový limit 90s

Až 240 bodů

 

Možnost účasti na Robosoutěži

Regulace

Řízení (regulace) je všude kolem nás…
Řízený systém využívá 1 nebo více regulátorů.

 

Základním principem regulace je, že se hodnota regulované veličiny měří a porovnává s požadovanou referenční hodnotou, a jejich rozdíl (tak zvaná regulační odchylka) se používá pro ovlivňování soustavy takovým způsobem, aby se regulační odchylka zmenšovala.

Source: cs.wikipedia.org/wiki/Regulace_(technika)

Regulátory

Základní princip regulace

Snažíme se minimalizovat chybu

Základní princip regulace

Snažíme se minimalizovat chybu

Bang Bang regulátor

Nejjednodušší typ regulace - dvoustavová regulace
Nastavujeme pouze

threshold

Bang Bang regulátor

Bang bang lze využít pouze v situacích, kdy přesnost a bezpečnost nehraje roli.

  • Jednoduchý
  • Levná implementace

Systémy využívající Bang Bang regulaci

  • Odvětrávací/chladící systémy
  • Teplotní řízení (domu, vody, 3D tiskárny)
  • Čerpadla

Source:  https://cerpadla.heureka.cz/gude-gs-7502-pl-94641

PID regulátor

Regulátor vhodný pro většinu využití. Nejpoužívanější druh regulace.

 

Proporcionálně
Integračně
Derivační
Regulátor

 

Nastavuje se pomocí koeficientů \(\textcolor{white}{K_P, K_I, K_D}\), které udávají, jak moc se daná složka regulátoru projevuje.

import brian.sensors as sensors
import brian.motors as motors

color = sensors.EV3.ColorSensorEV3(sensors.SensorPort.S3)

motor_l = motors.EV3LargeMotor(motors.MotorPort.A)
motor_l.wait_until_ready()
motor_r = motors.EV3LargeMotor(motors.MotorPort.B)
motor_r.wait_until_ready()

Kp = 4 # Otestovaná hodnota
WHITE = 80 # Změřené hodnoty
BLACK = 0
target = ( WHITE + BLACK ) / 2

while True:
	lightValue = color.reflected_value()
	error = lightValue - target
	turn = Kp * error
	motor_l.run_at_speed(200 + turn)
	motor_r.run_at_speed(200 - turn)

Cvičení: Co můžeme zlepšit?

PID normalizace

Na vstupu a výstupu regulátoru chceme vždy hodnoty ve stejném rozmezí.

 

Špatná implementace:

  • Vstup: odchylka v jednotkách světelného senzoru
  • Výstup: zpomalení/zrychlení motoru

 

Dobrá implementace:

  • Vstup: míra vyjetí z čáry
  • Výstup: míra zatáčení

PID normalizace

Regulátor PID potřebuje vždy stejné rozmezí vstupů, aby dával stejné výstupy.

(na vstupu musí být vždy stejná data, aby se jeho chování neměnilo)

PID implementace

\(Err = chceme - máme\)

 

\(\textcolor{magenta}{P} = \textcolor{magenta}{K_P} \times Err\)

\(integrace = integrace + Err \times \delta t\)

\(\textcolor{magenta}{I} = \textcolor{magenta}{K_I} \times integrace\)

\(derivace = (Err - prevErr) / \delta t\)

\(\textcolor{magenta}{D} = \textcolor{magenta}{K_D} \times derivace\)

\(\textcolor{magenta}{out} = \textcolor{magenta}{P + I + D}\)

\(prevErr = Err\)

V uPythonu time.time() je int!

Lze využít:

  • time.ticks_ms()
  • time.ticks_us()
  • time.ticks_diff(t1, t2)

Na jaké frekvenci má běžet naše PID smyčka a proč?

PID integrace

Integrační složka může při dlouho trvající chybě (zatáčka) nabývat obřích hodnot.

 

Anti-windup mechanismy zamezují integrační složce nabýt nebezpečných rozměrů.

 

Což přidává další parametr do regulátoru.

PID Vlastnosti

Výhody:

  • Dostačující pro většinu aplikací
  • Konstanty lze většinou nalézt metodou Hokus Pokus™
  • Jednoduchá implementace

 

Nevýhody:

  • Neumí kompenzovat zpoždění vstup-výstup
  • Velice pokročilé systémy potřebují pokročilejší regulaci

 

Odezva regulátoru

Odezva regulátoru

Odezva regulátoru

Děkuji za pozornost

Ing. David Pařil

ROB_01

By David Pařil

ROB_01

  • 5