Журнал LinuxFormat - перейти на главную

LXF156:Робот на экране

Материал из Linuxformat
Перейти к: навигация, поиск

Содержание

Ро­бот на эк­ра­не. Дви­же­ние и управ­ле­ние

Шко­ла LXF

Обмен опытом и передовые идеи по использованию свободного ПО в образовании

Ро­бо­то­тех­ни­ка в шко­ле – до­ро­гое и очень слож­ное за­ня­тие? А вот и нет, ес­ли по­дой­ти к не­му твор­че­ски, как это сде­ла­ла Тать­я­на Ка­зан­це­ва.

Наш эксперт

Во вре­мя, сво­бод­ное от кор­пе­ния над на­пи­са­ни­ем ме­то­ди­ки скре­щи­ва­ния Scratch и Arduino, Тать­я­на Ка­зан­це­ва от­та­чи­ва­ет на­вы­ки ра­бо­ты со сво­бод­ным ПО для ис­поль­зо­ва­ния в шко­ле и до­ма.

Тер­ми­но­ло­гия
  • Ис­пол­ни­тель - Ком­пь­ю­тер­ная про­грам­ма или ме­ха­низм, управ­ляе­мый ею, вы­пол­няю­щий не­по­сред­ст­вен­ные при­ка­зы поль­зо­ва­те­ля или ра­бо­таю­щий по за­дан­но­му ал­го­рит­му. Ис­пол­ни­тель име­ет оп­ре­де­лен­ный на­бор ко­манд – сис­те­му ко­манд ис­пол­ни­те­ля и ог­ра­ни­че­ния ра­бо­ты.
  • Ал­го­ритм - По­сле­до­ва­тель­ность ко­манд, за­дан­ная поль­зо­ва­те­лем, ко­то­рую дол­жен вы­пол­нить Ис­пол­ни­тель.

Мно­гие ду­ма­ют, что управ­ление ро­бо­том тре­бу­ет на­ли­чия ог­ром­ной «же­ле­зя­ки», ко­то­рая бу­дет, под­чи­ня­ясь ко­ман­дам поль­зо­ва­те­ля по типу «Ро­бот, иди ту­да», гро­хо­тать по по­ме­щению. Но ес­ли ра­зо­брать­ся с том, что фак­ти­че­­ски пред­став­ля­ет со­бой ро­бот, то это про­сто Ис­полнитель, ко­то­рый вы­пол­ня­ет оп­ре­де­лен­ные ко­ман­ды Поль­зо­ва­те­ля или ра­бо­та­ет по за­дан­но­му Ал­го­рит­му. Вы уже на­вер­ня­ка зна­ко­мы с эти­ми по­ня­тия­ми и изу­ча­ли их ранее на уро­ках ин­фор­ма­ти­ки.

По­это­му пре­ж­де чем пе­ре­хо­дить к ре­аль­но­му ро­бо­ту, на­до по­трениро­вать­ся на его ком­пь­ю­тер­ной ими­та­ции (си­му­ля­ции), а так­же осво­ить ра­бо­ту с основ­ны­ми мик­ро­элек­трон­ны­ми ком­понен­та­ми – то есть ра­дио­де­та­ля­ми и со­б­ран­ны­ми на их осно­ве дат­чи­ка­ми и управ­ляю­щи­ми бло­ка­ми (мы же не за­бы­ли, что Ро­бот со­сто­ит из ра­дио­де­та­лей?). В рам­ках руб­ри­ки Шко­ла LXF мы на­чи­на­ем цикл ста­тей, где все по­сле­дую­щие за­дания осно­ва­ны на управ­лении вир­ту­аль­ным ро­бо­том-ис­полните­лем. Изу­чив и вы­полнив их, мы поз­же смо­жем управ­лять ре­аль­ным ме­ханиз­мом, бла­го та­кой ро­бот пре­достав­лен нам про­ек­том Тырнет и но­сит имя Скрат­чдуи­но. Мы бу­дем ис­поль­зо­вать про­грамм­ную сре­ду Scratch, по­это­му пре­ж­де чем при­сту­пать к за­ня­ти­ям, со­ве­тую вам прой­ти (вме­сте с ученика­ми) курс по дан­ной сре­де, ко­то­рый (как и учеб­ные по­со­бия) мож­но най­ти на сай­те http://letopisi.ru/index.php/Школа_Scratch.

Дви­жение ро­бо­та

Го­во­ря ко­му-то, ку­да ему дви­гать­ся, вы от­дае­те ко­ман­ду. Эта ко­ман­да мо­жет быть при­вя­за­на к неко­му ори­ен­ти­ру, что­бы Ис­полнитель ко­ман­ды мог по­нять, что от него хо­тят. В ча­ст­но­сти, ори­ен­ти­ром (или его еще на­зы­ва­ют мая­ком) мо­же­те быть вы – на­при­мер, вы дае­те ко­ман­ду ва­ше­му при­яте­лю: «иди ко мне». Так­же мая­ком мо­жет быть ка­кой-то пред­мет: «Иди до то­го сто­ла». Или ко­ман­да мо­жет быть при­вя­за­на к ка­кой-ли­бо сис­те­ме ко­ор­ди­нат.

(thumbnail)
Сориентируем нашего робота по направлениям.
(thumbnail)
Наш ро­бот дви­га­ет­ся в аб­со­лют­ных ко­ор­ди­на­тах и мо­жет быть ус­та­нов­лен или пе­ре­ме­щен в лю­бую точ­ку. В ре­аль­ной жиз­ни так ра­бо­та­ют, ска­жем, ро­бо­ты-ма­ни­пу­ля­то­ры сбо­роч­ных про­из­водств.

Встав ли­цом к Ис­полните­лю, вы са­ми бу­де­те для него мая­ком, и он смо­жет вы­пол­нять ко­ман­ды от­но­си­тель­но вас – впе­ред (от вас), на­зад (к вам), вле­во и впра­во. Или, ес­ли это эк­ран, Ис­полнитель смо­жет дви­гать­ся вверх, вниз, вле­во или впра­во, счи­тая мая­ка­ми сто­ро­ны эк­ра­на. Что же вы­брать? Так как мы име­ем де­ло с ро­бо­том, то на ме­ст­но­сти мы име­ем де­ло с при­вяз­кой к по­верх­но­сти и сто­ро­нам све­та, по­это­му счи­та­ем, что на эк­ране пе­ред на­ми вид на Ро­бо­та свер­ху и он дол­жен пе­ре­дви­гать­ся от­но­си­тель­но вас. Вы на­хо­ди­тесь за пре­де­ла­ми эк­ра­на, внизу. То есть, по ко­ман­де «впе­ред» (от вас), ро­бот на эк­ране бу­дет дви­гать­ся вверх; по ко­ман­де «вниз» – к вам.

  • ЗАДАНИЕ На­ри­суй­те, ку­да бу­дет дви­гать­ся ро­бот по ко­ман­дам «вле­во» и «впра­во».

Дви­же­ние в аб­со­лют­ных ко­ор­ди­на­тах

От­крой­те Scratch, уда­ли­те те­ку­щий пер­со­наж (щелчок пра­вой кноп­кой мы­ши на нем – Уда­лить) и вы­бе­ри­те Ри­со­вать но­вый объ­ект New image fmt.png Наш ро­бот бу­дет круг­лый, по­это­му на­ри­суй­те что-то по­хо­жее на за­кра­шен­ный круг.

Те­перь со­ста­вим про­грам­му, управ­ляю­щую ро­бо­том. За­гля­нув в раз­дел Дви­жение, вы не об­на­ру­жи­те па­ра­мет­ров «впе­ред, на­зад, вле­во, впра­во», так как управ­ление про­грамм­ным ро­бо­том (как вы уже, на­вер­ное, знае­те) идет по сис­те­ме ко­ор­ди­нат. В на­шем слу­чае дви­жение впе­ред бу­дет оз­на­чать уве­ли­чение ко­ор­ди­на­ты Y, на­зад – ее умень­шение. Впра­во – уве­ли­чи­ва­ет ко­ор­ди­на­ту X, а вле­во – умень­ша­ет ее. Центр эк­ра­на бу­дет иметь ко­ор­ди­на­ты X=0, Y=0.

За­дай­те сле­дую­щий код:

Cod1 opt.jpeg

При стар­те про­грам­мы ро­бот уста­нав­ли­ва­ет­ся в ис­ход­ную точ­ку (ко­ор­ди­на­ту 0,0). При на­жа­тии стрел­ки вверх ро­бот пе­ре­мес­тит­ся впе­ред (то есть уве­ли­чит ко­ор­ди­на­ту Y). Наш ро­бот те­перь име­ет соб­ст­вен­ный на­бор команд – «впе­ред», «на­зад», «вле­во», «впра­во»

  • ЗАДАНИЕ До­ра­бо­тай­те про­грам­му, что­бы ро­бот пе­ре­ме­щал­ся по на­жа­тию стре­лок вниз, впра­во или вле­во.

Ори­ен­та­ция (от­но­си­тель­ные ко­­ор­­ди­­на­­ты)

По­про­си­те своего дру­га временно по­быть Ро­бо­том. Пускай он встанет спи­ной к вам, а за­тем вы­полнит ва­ши ко­ман­ды «впе­ред, на­зад, вле­во, впра­во». Вы за­ме­ти­ли, что его ори­ен­та­ция от­но­си­тель­но вас не из­менилась?

Ско­ман­дуй­те дру­гу «по­вернись на­пра­во». Вы ви­ди­те, что он стал к вам бо­ком. Те­перь дай­те ко­ман­ду «впе­ред». Ваш друг, изо­бра­жая ро­бо­та, толь­ко что пе­ре­мес­тил­ся ту­да, ку­да ранее вы мог­ли пе­ре­мес­тить ро­бо­та ко­ман­дой «вле­во». То есть ро­бот сменил свое рас­по­ло­жение в про­стран­ст­ве (ори­ен­та­цию), и те­перь ста­рые ко­ман­ды вы­зы­ва­ют его пе­ре­ме­щение в дру­гом на­прав­лении.

В ре­аль­ной жизни ро­бо­ты так­же обыч­но ори­ен­ти­ро­ва­ны – они не в состоянии про­сто пе­ре­мес­тить­ся вле­во или впра­во, не по­ме­няв свою ори­ен­та­цию в про­стран­ст­ве.

По­правь­те спрайт ро­бо­та в меню спрайта, что­бы он стал вы­гля­деть так (Спрайт > Кос­тю­мы > Ре­дак­ти­ро­вать): Robot2 fmt.png

  • ВОПРОС Каким образом те­перь ори­ен­ти­ро­ван ро­бот от­но­си­тель­но вас?
(thumbnail)
Наш робот ориентирован в пространстве

Вы мо­же­те за­ме­тить, что ро­бот сто­ит, по­вер­нув­шись впра­во. Все спрай­ты в Scratch из­на­чаль­но име­ют та­кое на­прав­ление (на­прав­ление 90 или «впра­во»), ко­то­рое за­тем вы мо­же­те из­менить «кир­пи­чи­ком»:Повернуть в направлении opt.png

Те­ку­щую ори­ен­та­цию мож­но уви­деть в ме­ню спрай­та или вы­вес­ти на эк­ран, от­ме­тив в раз­де­ле Дви­жение кир­пи­чик [] На­прав­ление. На­прав­ления обо­зна­че­ны циф­ра­ми как: 90 – «впра­во», 0 – «вверх, -90 – «вле­во», 180 – «вниз».

Ви­до­из­меним пре­ды­ду­щую про­грам­му, за­дав по на­жа­тию кла­виш вле­во и впра­во по­во­рот ро­бо­та. Для это­го ис­поль­зуем блок Повернуться на opt.png

При по­воро­те ро­бо­та обыч­но не ис­поль­зу­ют по­ня­тия «вле­во» и «впра­во», а го­во­рят, что он дол­жен по­вер­нуть­ся «по ча­со­вой стрел­ке» или «про­тив ча­со­вой стрелки».

  • ВОПРОС Ку­да по­вернет­ся ро­бот при по­во­ро­те «по ча­со­вой стрел­ке»? Вле­во или впра­во?

Из­мените в пре­ды­ду­щей про­грам­ме бло­ки управ­ления стрел­ка­ми сле­дую­щим об­ра­зом: Cod2 opt.jpeg

Те­перь за­пусти­те про­грам­му. Вы уви­ди­те, что при на­жа­тии на стрел­ки вле­во или впра­во ро­бот по­во­ра­чи­ва­ет­ся на 90 гра­ду­сов. Но ес­ли на­жать вверх или вниз, то он на­чи­на­ет сме­щать­ся, а не дви­гать­ся по на­прав­лению стрел­ки. Это про­ис­хо­дит из-за то­го, что мы сме­ша­ли сис­те­мы ко­ор­ди­нат. У нас те­перь нет при­вяз­ки к кон­крет­ным зна­чениям и нет точ­ки от­сче­та, по­это­му необ­хо­ди­мо ис­поль­зо­вать ко­ман­ды ви­да «впе­ред» или «на­зад», ука­зав зна­чение для пе­ре­ме­щения.

Sprite info opt.png


Из­мените бло­ки управ­ления стрел­ка­ми «вверх» и «вниз», ис­поль­зуя кон­ст­рук­цию Идти на opt.png

(thumbnail)
Сце­на для до­ро­ги ро­бо­та

Это за­ста­вит ро­бо­та пе­ре­мес­тить­ся в за­дан­ном на­прав­лении на ука­зан­ное чис­ло ша­гов (в слу­чае Scratch это чис­ло пик­се­лей на эк­ране). «Впе­ред» бу­дет за­да­вать­ся по­ло­жи­тель­ным чис­лом (+), а «на­зад» – от­ри­ца­тель­ным.

У вас долж­на в ито­ге по­лу­чить­ся сле­дую­щая про­грам­ма:

Cod3 opt.jpeg

Ро­бот мо­жет обой­тись без заднего хо­да. Ес­ли его кон­ст­рук­ция по­зво­ля­ет ему по­во­ра­чи­вать­ся на мес­те, как у на­ше­го иде­аль­но­го ком­пь­ю­тер­но­го Ро­бо­та, то доста­точ­но вы­полнить по­во­рот на 180 гра­ду­сов, и ро­бот по­едет в об­рат­ную сто­ро­ну. Так­же ро­бот мо­жет по­во­ра­чи­вать­ся не толь­ко на 90 гра­ду­сов.

  • ЗАДАНИЕ 1: По­экс­пе­ри­мен­ти­руй­те с уг­ла­ми по­во­ро­та. За­ме­ните 90 гра­ду­сов на 45, 30, 15, 5 и по­смот­ри­те, что при этом по­лу­чит­ся.
  • ЗАДАНИЕ 2: По­ме­няй­те на­чаль­ное на­прав­ление. По­ставь­те ро­бо­та в на­прав­ление «вверх» и по­смот­ри­те, как из­ме­ня­ет­ся управ­ление им.
  • ЗАДАНИЕ 3: Из­мените ве­ли­чи­ну ша­га. Вы­ясните, как влия­ет данная ве­ли­чи­на на ско­рость дви­жения ро­бо­та.

Управ­ляе­мость (точ­ность от­ра­бот­ки ал­го­рит­ма)

Наш ро­бот уже мо­жет управ­лять­ся с кла­виа­ту­ры, и вы мо­же­те «го­нять» его по эк­ра­ну. Ес­ли вы вы­полнили пре­ды­ду­щие за­дания, то знае­те, как сде­лать ро­бо­та бо­лее управ­ляе­мым – то есть за­ста­вить его по­во­ра­чи­вать­ся на боль­ший или мень­ший угол, из­ме­нять ско­рость его дви­жения, а так­же за­да­вать на­чаль­ную ори­ен­та­цию.

Но ре­аль­ный ро­бот име­ет, увы, худ­шую управ­ляе­мость (по крайней ме­ре наш учеб­ный ро­бот, ко­то­ро­го мы смо­жем за­про­грам­ми­ро­вать в дальней­шем). Что это оз­на­ча­ет?

Ре­аль­ный ро­бот не мо­жет по­вер­нуть­ся на точ­ный угол (плюс-ми­нус оп­ре­де­лен­ное ко­ли­че­­ст­во гра­ду­сов), не мо­жет пе­ре­мес­тить­ся на точ­ное ко­ли­че­­ст­во ша­гов, и воз­мож­ны за­держ­ки и про­пуски на­ших команд из-за про­блем при пе­ре­да­че дан­ных к ро­бо­ту.

Да­же уста­но­вив так на­зы­вае­мую «об­рат­ную связь» – то есть спе­ци­аль­ные уст­рой­ст­ва, ко­то­рые смо­гут ска­зать, что ро­бот выпо­лнил дей­ст­вие с неко­то­рой точ­но­стью – мы все рав­но бу­дем иметь оп­ре­де­лен­ную по­греш­ность, да и стои­мость са­мо­го ро­бота воз­рас­тет.

Во мно­гих слу­ча­ях точ­ность ро­бо­та по от­ра­бот­ке команд ал­го­рит­ма не так важ­на, как ско­рость ре­ак­ции на со­бы­тия и от­ра­ботки команд из­вне. Да­вай­те по­смот­рим, как влия­ет неточ­ность от­ра­бот­ки команд ал­го­рит­ма на на­ше­го ком­пь­ю­тер­но­го ро­бо­та. Для это­го до­ба­вим в ка­ж­дую ко­ман­ду слу­чай­ную со­став­ляю­щую. На­ша про­грам­ма при­мет сле­дую­щий вид:
Cod4 opt.jpeg

Бло­ки по­во­ро­та на слу­чай­ную ве­ли­чи­ну при дви­жении впе­ред и на­зад нуж­ны, по­то­му что ре­аль­ный ро­бот при дви­жении впе­ред обыч­но от­кло­ня­ет­ся в ту или иную сто­ро­ну из-за по­греш­но­сти ра­бо­ты дви­га­те­лей.

Cod5 opt.jpeg

Вы мо­же­те от­сле­дить те­ку­щее пе­ре­ме­щение ро­бо­та с по­мо­щью «пе­ра» в Scratch. Для это­го до­бавь­те сле­дую­щий блок:

Те­перь по на­жа­тию кла­ви­ши «Про­бел» ро­бот бу­дет остав­лять за со­бой «след».

В код на­чаль­ной инициа­ли­за­ции по­сле за­дания на­прав­ления не за­будь­те до­ба­вить «кир­пи­чик» Очи­стить. Так­же вы мо­же­те уста­но­вить на­чаль­ные ко­ор­ди­на­ты ро­бо­та, от­лич­ные от (0,0).

  • ЗАДАНИЕ 1: На­ри­суй­те ро­бо­ту до­ро­гу, по­хо­жую на изо­бра­жен­ной на ри­сун­ке, и за­гру­зи­те ее в ка­че­­ст­ве фо­на Сце­ны. По­про­си­те ва­ших дру­зей или зна­ко­мых про­ехать по дан­ной до­ро­ге, а так­же по­тренируй­тесь са­ми управ­лять «поч­ти» ре­аль­ным ро­бо­том.
  • ЗАДАНИЕ 2: По­экс­пе­ри­мен­ти­руй­те c ве­ли­чи­на­ми слу­чай­ных чи­сел. Чем боль­ше дан­ное чис­ло, тем ху­же ра­бо­та­ет ро­бот. Что про­изой­дет, ес­ли ве­ли­чи­на слу­чай­но­го чис­ла бу­дет боль­ше са­мой ве­ли­чи­ны дей­ст­вия?

А те­перь сде­ла­ем так, что­бы при на­жа­тии стрел­ки «вверх» ро­бот на­чи­нал дви­гать­ся впе­ред, а при на­жа­тии «вниз» оста­нав­ли­вал­ся. Для это­го нуж­но за­менить код ал­го­рит­ма по на­жа­тию этих стре­лок на та­кой еди­ный блок:

Cod6 opt.jpeg

Что он де­ла­ет? При на­жа­тии на фла­жок за­пуска запуска­ет­ся ра­бо­та бес­конеч­но­го цик­ла и идет про­вер­ка усло­вия Ес­ли на­жа­та стрел­ка вверх. При его вы­полнении на­чи­на­ет работу По­вто­рять до – э­то бу­дет продолжать­ся в цик­ле, по­ка не на­жму­т стрел­ку «вниз». Внут­ри цик­ла – код дви­жения впе­ред с по­греш­но­стью.

  • ВОПРОС Когда управ­ляе­мость ро­бо­том луч­ше – при ис­поль­зо­вании пре­ры­ви­сто­го или непре­рыв­но­го дви­жения? Что менее уто­ми­тель­но для управ­ляю­ще­го ро­бо­том? Ка­кой спо­соб управ­ления вы бы пред­по­чли?

Ес­ли ро­бот едет слиш­ком бы­ст­ро, умень­ши­те зна­чение ша­га, к при­ме­ру, до 5 (а слу­чай­ную ве­ли­чи­ну сделайте от 1 до 2) или до­ба­вьте в цикл по­сле «кир­пи­чи­ка» Ид­ти за­держ­ку («кир­пи­чик») в 0,2 – 0,5 се­кунд.Ждать opt.png


  • ВОПРОС Как влия­ет из­менение ве­ли­чи­ны ша­га и за­держ­ки на управ­ляе­мость Ро­бо­том?

Га­ле­рея с при­ме­ра­ми рас­по­ло­же­на на сай­те http://scratch.mit.edu/galleries/view/157855.

На­де­ем­ся, что вы лег­ко осво­ите на­чаль­ные премуд­ро­сти ро­бо­то­техники и на­пи­сания про­грамм в Скратч. В дальней­шем нас ждут ве­щи послож­нее – оп­ре­де­ление по­ло­жения и дви­жение в за­дан­ные мес­та, дат­чи­ки и, ес­ли у вас бу­дет ин­те­рес к дан­ной те­ме, ис­поль­зо­вание ре­аль­ных ро­бо­тов и кон­трол­ле­ров. Напи­ши­те нам на info@linuxformat.ru, ес­ли эта те­ма для вас ак­ту­аль­на.

Персональные инструменты
купить
подписаться
Яндекс.Метрика