суббота, 9 марта 2013 г.

NXT R3PTAR - пишем свою программу

В школе, где проходит наш кружок робототехники, нужно было провести "удивительный урок" для первоклассников, приуроченный к 23 феваряля и 8 марта. Одним из роботов, который должен был появиться на этом уроке, было решено сделать - NXT R3PTAR - змею, похожую на EV3 R3PTAR, только выполненную из набора NXT 2.0.
Об существующих инструкциях по сборке для данного "животного" уже упоминалось в блоге. А вот программу пришлось составлять самостоятельно. А поскольку кто-то захочет повторить этот опыт - процесс составления программы приводиться в этой заметке.



Итак, чтобы хотелось получить?
  • Движение змеи вперед. При этом тело ее должно извиваться подобно тому, как двигаются настоящие змеи.
  • При обнаружении препятствия на пути движения, змея должна напасть на "обидчика", попытавшись укусить и издав какой-нибудь шипящий звук.
  • После укуса, змея должна отползти назад, тем самым попытавшись объехать препятствие.
Что ж, приступим!

Движение вперед осуществляется одним мотором. При этом другой мотор должен вращаться, то вперед, то назад, заставляя тело змеи извиваться. Программа должна обнаружить, что этот мотор достиг своей некоторой крайней точки вращения и ему пора начать вращаться в противоположную сторону. Для этого будет использован блок "Motor PID Block", который уже довольно подробно освещался в блоге.

Во-первых, этот блок может автоматически рассчитать "среднее положение" мотора, отвечающего за повороты тела змеи, т.е. то положение при котором змея будет ехать прямо. Это положение будет также автоматически обозначено, как нулевая позиция. Поэтому последующие отклонения вперед и назад на определенное количество градусов будут задавать повороты тела змеи.


Используя при этом свойство, что блок оперирует позициями оси мотора относительными от нулевой позиции, то программе будет абсолютно неважно, в какой позиции мотор поворота остановился в момент обнаружения препятствия перед роботом. После возобновления движения мотор сможет либо довернуться до заданной изначально позиции, либо двигаться к новой позиции, но заданной также относительно нулевой точки - не нужно будет рассчитывать сколько мотору нужно пройти сначала до 0, а потом до заданного положения.


Во-вторых, у блока есть возможность запустить его на вращение к заданному положению и отдать управление в следующий блок в программе. Это позволит определять, находится ли препятствие перед змей, в любой момент времени, а не только в крайних положениях тела змеи.


В-третьих, другое свойство блока - возможность узнать, а сколько же осталось до достижения нужной положения: разность между текущим положением и заданным. Поскольку программа явно не ждет в этом блоке достижения заданной позиции, то нужно время от времени спрашивать, а находиться ли теперь мотор в нужном положении (разность между нужными и текущим положениями становиться равно нулю). Как только мотор достиг требуемой позиции, ему передается команда начинать вращаться в противоположную сторону.


Программа движения вперед и обнаружения препятствия, тогда выглядит следующим образом:


В принципе, аналогичного поведения можно добиться исходя из того, что крайние положения двигателя поворота всегда физически ограничены, то вместо блока Motor PID Block можно было использовать блок Move с ограничением движения по времени. Время указывается в этом случае чуть большее, чем нужно мотору для того, чтобы повернуться пока не произойдет физическое ограничения вращения. Но этот способ более вреден для мотора, поэтому и не был реализован.

Движение головой для выполнения укуса управляется третьим мотором. Мотор вращается в одну сторону - голова идет вперед, пасть открывается; вращение в противоположную сторону - голова движется назад, пасть закрывается. Оказалось, что использовать в этом месте Motor PID Block тоже удобнее - не надо задумываться на сколько градусов нужно повернуть вперед или назад мотор - вместо этого поворачиваем его вперед или назад до физических пределов вращения.


Движение назад - просто вращение мотором, двигающего всю змею, в противоположном направлении в течение какого-то времени. При этом в какую сторону будет выполняться разворот змеи будет определяться положением хвоста в момент остановки робота перед препятствием.

Кусок программы, отвечающий за выполнение укуса и за движение назад выглядит следующим образом:



Итоговую программу можно скачать вот здесь.

1 комментарий:

  1. А у меня что то программка не хочет работать, точнее даже не хочет в змея перегонятся,, пишет что то про broken data wires...

    ОтветитьУдалить

Related Posts Plugin for WordPress, Blogger...