65 lines
3.4 KiB
Plaintext
65 lines
3.4 KiB
Plaintext
\b;Ćwiczenie
|
|
Dotrzyj jak najszybciej do platformy końcowej (25 m przed Tobą), używając instrukcji \c;motor( , )\n;. Przed końcem ruchu musisz stopniowo zwalniać, aby robot nie wpadł na \l;miny\u object\mine; i nie wybuchł.
|
|
|
|
Równie dobrze możesz napisać jedynie instrukcję \c;\l;move\u cbot\move;(25);\n;, która wykona to samo zadanie, jednak celem tego ćwiczenia jest nauka używania instrukcji \c;\l;motor\u cbot\motor;\n;.
|
|
|
|
Instrukcja ta potrzebuje dwóch wartości:
|
|
1) Prędkości lewego silnika.
|
|
2) Prędkości prawego silnika.
|
|
|
|
\s;\c; motor( lewy, prawy );
|
|
\n;
|
|
Wartości muszą się zawierać w przedziale od -1 do 1:
|
|
-1 = pełny ciąg wstecz
|
|
0 = silnik zatrzymany
|
|
1 = pełny ciąg naprzód
|
|
|
|
Na przykład instrukcja \c;motor(0.5, 0.5);\n; będzie poruszała robotem naprzód z połową prędkości, aż do podania silnikom nowych instrukcji.
|
|
|
|
Po napotkaniu instrukcji \c;motor(0.5, 0.6);\n;, robot będzie się poruszał do przodu z połową prędkości, wykonując w tym samym czasie niewielki obrót w lewo: prawy silnik porusza się nieco szybciej (\c;0.6\n;) niż lewy (\c;0.5\n;).
|
|
|
|
\b;Ogólny algorytm
|
|
Aby przejechać dokładnie 25 metrów, należy jechać z pełną prędkością przez pierwsze 23 metry, a następnie stopniowo zmniejszać prędkość przez ostatnie dwa metry.
|
|
\l;Zmienna\u cbot\var; \l;position\u cbot\object; podaje bieżącą pozycję robota, a instrukcja \c;\l;distance\u cbot\dist;( , );\n; oblicza odległość między dwoma punktami. Najlepszy sposób na poznanie własnej pozycji, polega na zachowaniu bieżącej pozycji przed startem w \l;zmiennej\u cbot\var;, nazwanej na przykład \c;start\n;. Następnie można obliczyć odległość między pozycją startową i bieżącą pozycją za pomocą instrukcji \c;distance(position, start)\n;.
|
|
|
|
\b;Program
|
|
1) zadeklaruj zmienne
|
|
\s;\c; point start;
|
|
\s; float len;
|
|
\n;
|
|
2) zapisz pozycję startową
|
|
\s;\c; start = position;
|
|
\n;
|
|
3) na początek z pełną mocą:
|
|
\s;\c; motor(1, 1);
|
|
\n;
|
|
4) wykonaj pętlę nieskończoną \c;\l;while\u cbot\while;\n;:
|
|
\s;\c; while ( true )
|
|
\s; {
|
|
\s; len = distance(position, start);
|
|
\s; if ( len > 25-2 )
|
|
\s; {
|
|
\s; motor( mniej niż poprzednio! );
|
|
\s; }
|
|
\s; }
|
|
\n;
|
|
Tak długo jak odległość pomiędzy pozycją startową i bieżącą jest mniejsza od 23m, instrukcje w klamrach po instrukcji \c;\l;if\u cbot\if;\n; nie będą wykonywane, więc silniki utrzymają maksymalną prędkość nadaną im instrukcją \c;\l;motor\u cbot\motor;(1,1);\n;.
|
|
|
|
Aby stopniowo zwalniać, prędkość silników musi być proporcjonalna do pozostałej odległości:
|
|
o zostały \c;2.0\n; metry -> prędkość = \c;1.00\n; (maksymalna)
|
|
o zostało \c;1.5\n; metra -> prędkość = \c;0.75\n;
|
|
o został \c;1.0\n; metr -> prędkość = \c;0.50\n;
|
|
o zostało \c;0.5\n; metra -> prędkość = \c;0.25\n;
|
|
o zostało \c;0.0\n; metrów -> prędkość = \c;0.00\n; (zatrzymanie)
|
|
|
|
\image tdragst1 12 6;
|
|
Do obliczenia prędkości, która zostanie podana silnikom możesz użyć następującego \l;wyrażenia\u cbot\expr;: \c;(25-len)/2\n;.
|
|
|
|
Do Ciebie należy złożenie tego wszystkiego razem i przetestowanie programu.
|
|
|
|
\t;Uwaga
|
|
Możesz używać wartości większych od 1 dla instrukcji \c;\l;motor\u cbot\motor;();\n;, ale robot nie będzie poruszał się szybciej.
|
|
|
|
\t;Zobacz również
|
|
\l;Programowanie\u cbot;, \l;typy\u cbot\type; i \l;kategorie\u cbot\category;.
|