58 lines
4.9 KiB
Plaintext
58 lines
4.9 KiB
Plaintext
![]() |
\b;Упражнение
|
|||
|
Пусть бот отыщет на земле все \l;синие кресты\u object\waypoint;. Как только бот пройдет над одним из крестов, он исчезнет. Вот общий принцип, который вы должны применить:
|
|||
|
|
|||
|
Повторять всегда:
|
|||
|
o Искать крест
|
|||
|
o Если креста нет, остановить программу.
|
|||
|
o Рассчитать направление к кресту.
|
|||
|
o Установить скорость моторов таким способом, чтобы они могли найти путь к кресту.
|
|||
|
|
|||
|
\b;Программа
|
|||
|
Используйте цикл \c;\l;while\u cbot\while;\n;, чтобы повторять несколько инструкций снова и снова:
|
|||
|
\s;\c;while ( true )
|
|||
|
\s;{
|
|||
|
\s; \n;инструкции...\c;
|
|||
|
\s;}
|
|||
|
\n;
|
|||
|
Инструкция \c;\l;radar\u cbot\radar;\n; будет искать синие кресты и переводить направление к ним в переменную, например \c;spot\n;. В этом случае инструкции \c;\l;radar\u cbot\radar;()\n; необходим всего один параметр, т.е. категория объекта, который он должен искать:
|
|||
|
\s;\c;spot = radar(WayPoint);
|
|||
|
\n;
|
|||
|
Когда будут найдены все кресты, \c;radar\n; возвратит значение \c;\l;null\u cbot\null;\n;. Вы должны будете все это проверить и действовать согласно инструкции \c;\l;if\u cbot\if;\n;:
|
|||
|
\s;\c;if ( spot == null ) // no more ?
|
|||
|
\s;{
|
|||
|
\s; motor(0, 0); // stops the motors
|
|||
|
\s; break; // stops the loop
|
|||
|
\s;}
|
|||
|
\n;Инструкция \c;\l;break\u cbot\break;\n; остановит бесконечный цикл \c;while (true)\n;.
|
|||
|
|
|||
|
Используйте инструкцию \c;\l;direction\u cbot\direct;()\n; чтобы рассчитать угол, на который должен развернуться бот, чтобы повернуться в направлении синего креста. Координаты объекта задаются \c;spot.position\n;. Следующие строки устанавливают угол необходимого поворота в \l;переменную\u cbot\var; \c;dir\n;:
|
|||
|
\s;\c;dir = direction(spot.position);
|
|||
|
\n;
|
|||
|
Значение угла положительное, если синий крест расположен слева от вас, и отрицательное, если он справа. Если крест расположен слева, вы должны установить максимальную скорость правостороннего мотора и установить левосторонний мотор на более низкие обороты, в соответствии с углом:
|
|||
|
|
|||
|
направлние = \c; 0\n; -> скорость = \c; 1.0\n;
|
|||
|
направлние = \c; 45\n; -> скорость = \c; 0.5\n;
|
|||
|
направлние = \c; 90\n; -> скорость = \c; 0.0\n;
|
|||
|
направлние = \c;135\n; -> скорость = \c;-0.5\n;
|
|||
|
направлние = \c;180\n; -> скорость = \c;-1.0\n;
|
|||
|
|
|||
|
График внизу отображает скорость левостороннего и правостороннего мотора, как было задано инструкцией \c;\l;motor\u cbot\motor;\n;, в соответствии с углом:
|
|||
|
|
|||
|
\image radar2 14 10;
|
|||
|
Если крест расположен прямо впереди, угол равен 0 градусов. Моторы будут работать на скорости 1 и 1, что означает полный вперед. Если крест сзади, правый мотор будет работать на скорости -1: бот развернется. Вы можете использовать \l;выражение\u cbot\expr; \c;1+dir/90\n; чтобы рассчитать необходимую скорость моторов:
|
|||
|
\s;\c;if ( dir < 0 ) // справа?
|
|||
|
\s;{
|
|||
|
\s; motor(1, 1+dir/90); // поворачивает
|
|||
|
\s;}
|
|||
|
\n;
|
|||
|
Используйте тот же принцип, если угол принимает положительное значение между 0 и 180 градусами. Вы можете использовать или не использовать в точности эти инструкции:
|
|||
|
\s;\c;else // слева?
|
|||
|
\s;{
|
|||
|
\s; \n;здесь идет код, написанный вами...\c;
|
|||
|
\s;}
|
|||
|
\n;
|
|||
|
В самом начале программы вы должны задать переменные. \c;spot\n; относится к типу \c;\l;object\u cbot\object;\n;, а \c;dir\n; к типу \c;\l;float\u cbot\float;\n;.
|
|||
|
|
|||
|
\t;См. также
|
|||
|
\l;Программирование\u cbot;, \l;типы\u cbot\type; и \l;категории\u cbot\category;.
|