===== Środowisko i sterowanie =====
==== 1. SI w środowisku ====
- {{ lab_steer_srodowisko.pdf |Agent inteligentny w środowisku}}
- Hunt the Wumpus! \\ {{wumpus_world.jpg?direct&300|}}
- Definicje:
* Sukces: zebrać złoto i przeżyć
* Wiedza o środowisku a priori:
* są jamy (możemy wpaść; czuć wiatr)
* jest wumpus (może nas zjeść; ma zapach)
* Możliwe akcje:
* Poruszanie się
* Strzelanie
* Podnoszenie złota
* Czynione obserwacje:
* Pole jest puste, czujemy zapach / wiatr
- Zagraj chwilę w [[https://thiagodnf.github.io/wumpus-world-simulator/|Wumpus World Simulator]]
* 8x złoto, 8x wumpus \\ Strzałki - obracanie i poruszanie się \\ Enter - zbierz złoto \\ Spacja - strzał w sąsiednie pole
* Mój rekord do pobicia: 12 450 pkt ;-)
* **Jak chcielibyśmy, żeby zachowywał się inteligentny bot w Wumpus World?**
* **Racjonalność?** \\ {{wumpus_world_issue1.jpg?direct&0x350|}} {{wumpus_world_issue2.jpg?direct&0x350|}}
- {{ lab_steer_decyzje_swiat.pdf |Decyzje projektowe}}
==== 2. Sterowanie ====
- Podstawa: [[http://www.red3d.com/cwr/steer/gdc99/|Craig W. Reynolds "Steering Behaviors For Autonomous Characters" (1999)]] \\ Śledzenie, Ucieczka, Przybycie, Wyrównywanie, Pościg, Unikanie, Wędrowanie, Omijanie przeszkód, Podążanie ścieżką, Algorytm stada
- Opis i symulacje w języku Processing: [[https://natureofcode.com/book/chapter-6-autonomous-agents/|Chapter 6 w "Nature of Code"]]
* Jest to baza do całej dalszej części laboratorium - warto mieć otwarte "w tle"
- Będziemy pracować w języku [[https://processing.org/|Processing]] (konkretnie w wersji JavaScript = [[https://p5js.org/|p5js]])
* Nie wymaga żadnych edytorów, wszystkie zadania możemy robić w przeglądarce
* Edytor online: **[[https://editor.p5js.org/]]**
* Dokumentacja p5js: **[[https://p5js.org/reference/]]**
* "Nature of Code" w p5.js: [[https://github.com/nature-of-code/noc-examples-p5.js|noc-examples-p5.js]]
- Śledzenie i Ucieczka:
- Przypomnij sobie algorytm śledzenia (pewnie był już na wykładzie?) przeglądając sekcję [[https://natureofcode.com/book/chapter-6-autonomous-agents/#chapter06_section3|6.3 The Steering Force]] w "Nature of Code" \\ {{steer1.jpg?direct&0x120|}} \\ {{steer2.jpg?direct&0x120|}} \\ {{steer3.jpg?direct&0x120|}} \\ {{steer4.jpg?direct&0x120|}} \\ {{steer5.jpg?direct&0x120|}}
- Obejrzyj symulację śledzenia w [[https://natureofcode.com/book/chapter-6-autonomous-agents/#chapter06_example1|Example 6.1: Seeking a target]]
- Otwórz kod w p5js (dla powyższego Example 6.1): [[https://github.com/nature-of-code/noc-examples-p5.js/tree/master/chp06_agents/NOC_6_01_Seek|noc-examples-p5.js/NOC_6_01_Seek]]
* ''index.html'' służy do osadzenia ramki z symulacją (i załadowania odpowiednich plików ''js'')
* ''sketch.js'' to podstawowy plik symulacji: funkcja ''setup()'' wywoływana jest jednorazowo na starcie, funkcja ''draw()'' służy do każdorazowej aktualizacji stanu symulacji i przerysowania ekranu
* ''vehicle.js'' to klasa opisująca pojedynczego boida (w kolejnych zadaniach będzie ich więcej); najważniejsze funkcje to te wywoływane w ''sketch.js'', czyli: v.seek(mouse); //wyszukuje target (wektor desired) i ustala jaką "poprawkę" trzeba zrobić
v.update(); //wylicza aktualne położenie zgodnie z aktualnymi parametrami
v.display(); //rysuje boid w nowym położeniu
- Otwórz edytor online: https://editor.p5js.org/
* Możesz założyć konto (nie jest to konieczne do zajęć) - umożliwia ono zapisywanie swoich projektów
* Do nowego projektu wklej zawartość wszystkich trzech plików z przykładu
* Uruchom symulację
- Poeksperymentuj z parametrami w ''vehicle.js'', sprawdź jak wpływają na śledzenie: this.maxspeed = 8;
this.maxforce = 0.2;
- W jaki sposób ze śledzenia zrobić ucieczkę?
* Chcemy zmierzać w kierunku przeciwnym do target (w tym przypadku kursora myszy) = wektor ''desired'' musi mieć zmieniony zwrot
* Wystarczy więc zmienić wyliczanie wektora ''desired'': desired = p5.Vector.sub(target, this.position); //szukanie
desired = p5.Vector.sub(this.position, target); //ucieczka
* W razie potrzeby można zajrzeć do dokumentacji funkcji ''[[https://p5js.org/reference/#/p5.Vector/sub|p5.Vector.sub()]]''
- **__Zadania do samodzielnej realizacji:__**
- [1.5 EXP] Ucieczka przed kursorem (modyfikacja [[https://github.com/nature-of-code/noc-examples-p5.js/tree/master/chp06_agents/NOC_6_01_Seek|NOC_6_01_Seek]], jak wyżej), ale należy pozostawać wewnątrz granic (zob. [[https://natureofcode.com/book/chapter-6-autonomous-agents/#chapter06_example3|Example 6.3: "Stay within walls" steering behavior]], [[https://github.com/nature-of-code/noc-examples-p5.js/tree/master/chp06_agents/NOC_6_03_StayWithinWalls|NOC_6_03_StayWithinWalls]])
- [1.5 EXP] Wędrowanie zgodnie z pomysłem Reynoldsa ([[https://natureofcode.com/book/chapter-6-autonomous-agents/#chapter06_section5|Sekcja 6.5 w Nature of Code]] może być przydatna)
- [2 EXP] Podążanie za zmieniającą się ścieżką ([[https://natureofcode.com/book/chapter-6-autonomous-agents/#chapter06_exercise11|Zadanie 6.11 w Nature of Code]]) - uruchom, przeanalizuj i zmodyfikuj [[https://natureofcode.com/book/chapter-6-autonomous-agents/#chapter06_example6|Example 6.6: Path following]] ([[https://github.com/nature-of-code/noc-examples-p5.js/tree/master/chp06_agents/NOC_6_06_PathFollowing|NOC_6_06_PathFollowing]])
- [2 EXP] Grupowe zbliżanie i unikanie ze zmieniającymi się wagami - co się wtedy dzieje ([[https://natureofcode.com/book/chapter-6-autonomous-agents/#chapter06_exercise14|Zadanie 6.14 w Nature of Code]])? Uruchom, przeanalizuj i zmodyfikuj [[https://natureofcode.com/book/chapter-6-autonomous-agents/#chapter06_example8|Example 6.8: Combining steering behaviors: Seek and separate]] ([[https://github.com/nature-of-code/noc-examples-p5.js/tree/master/chp06_agents/NOC_6_08_SeparationAndSeek|NOC_6_08_SeparationAndSeek]])
- [2 EXP] Stado, w którym każdy obiekt ma ograniczone pole widzenia ([[https://natureofcode.com/book/chapter-6-autonomous-agents/#chapter06_exercise15|Zadanie 6.15 w Nature of Code]]) - uruchom, przeanalizuj i zmodyfikuj [[https://natureofcode.com/book/chapter-6-autonomous-agents/#chapter06_example9|Example 6.9: Flocking]] ([[https://github.com/nature-of-code/noc-examples-p5.js/tree/master/chp06_agents/NOC_6_09_Flocking|NOC_6_09_Flocking]])