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

LXF159:Школа LXF: Роботы-спортсмены? Да!

Материал из Linuxformat
(Различия между версиями)
Перейти к: навигация, поиск
(Япон­ская борь­ба)
(Япон­ская борь­ба)
 
(не показаны 35 промежуточных версий 1 участника)
Строка 20: Строка 20:
 
'''
 
'''
 
==Япон­ская борь­ба==
 
==Япон­ская борь­ба==
 
+
[[Файл:Robosumo1_opt.png |right|200px |thumb|Рис.4. Код движения робота ]]
 +
[[Файл: Movie_red_opt.png|left|200px|thumb|Код для управления крас­но­го ро­бо­та ]]
 +
[[Файл: Movie_blue_opt.png|left|200px|thumb| Код для управления си­не­го ро­бо­та ]]
 +
[[Файл:Kasanie_red_opt2.png |right|200px|thumb|Касание]]
 +
[[Файл:Scena_script_opt.png |right|200px |thumb|Код "Для сцены"]]
 
Начнем с си­му­ля­то­ра японской борь­бы су­мо. Она как-никак под­хо­дит к ро­бо­там – не прав­да ли, вид тол­стяч­ков-сумотори (борцов) свер­ху на­по­ми­на­ет круг­лый кор­пус ро­бо­та? Пра­ви­ла борь­бы очень про­сты: вы­толкни дру­го­го из кру­га. Но за­да­ча дан­но­го пла­на го­раз­до сложнее, чем про­сто ез­да по линии – нам на­до смо­де­ли­ро­вать неко­то­рые фи­зи­че­­ские яв­ления, а имен­но столк­но­вение ро­бо­тов. То есть ро­бо­ты долж­ны дви­гать­ся, стал­ки­вать­ся и от­пи­хи­вать друг дру­га.
 
Начнем с си­му­ля­то­ра японской борь­бы су­мо. Она как-никак под­хо­дит к ро­бо­там – не прав­да ли, вид тол­стяч­ков-сумотори (борцов) свер­ху на­по­ми­на­ет круг­лый кор­пус ро­бо­та? Пра­ви­ла борь­бы очень про­сты: вы­толкни дру­го­го из кру­га. Но за­да­ча дан­но­го пла­на го­раз­до сложнее, чем про­сто ез­да по линии – нам на­до смо­де­ли­ро­вать неко­то­рые фи­зи­че­­ские яв­ления, а имен­но столк­но­вение ро­бо­тов. То есть ро­бо­ты долж­ны дви­гать­ся, стал­ки­вать­ся и от­пи­хи­вать друг дру­га.
 +
[[Файл: Arena_opt.png|right|100px|thumb|Рис. 2. Арена ]]
 +
[[Файл: Robots_opt.png|right |100px |thumb|Рис. 1. Порт­ре­ты ро­бо­тов-со­пер­ни­ков: го­ря­чий про­тив хо­лод­но­го? ]]
  
 
Так как пол­но­цен­ную фи­зи­ку взаи­мо­дей­ст­вия опи­сать доста­точ­но слож­но (осо­бен­но в Scratch, и осо­бен­но для тех, кто не зна­ком с по­ня­тия­ми мо­мен­та и уп­ру­го­го со­уда­рения и три­го­но­мет­ри­че­­ски­­ми функ­ция­ми), мы по­пы­та­ем­ся сде­лать уп­ро­щен­ную мо­дель, ко­то­рая с неко­то­рым при­бли­жением бу­дет ими­ти­ро­вать ре­аль­ную, но об­хо­дить­ся без слож­ных функ­ций.
 
Так как пол­но­цен­ную фи­зи­ку взаи­мо­дей­ст­вия опи­сать доста­точ­но слож­но (осо­бен­но в Scratch, и осо­бен­но для тех, кто не зна­ком с по­ня­тия­ми мо­мен­та и уп­ру­го­го со­уда­рения и три­го­но­мет­ри­че­­ски­­ми функ­ция­ми), мы по­пы­та­ем­ся сде­лать уп­ро­щен­ную мо­дель, ко­то­рая с неко­то­рым при­бли­жением бу­дет ими­ти­ро­вать ре­аль­ную, но об­хо­дить­ся без слож­ных функ­ций.
  
 
Пред­ста­вим, что у ро­бо­та два ко­ле­са, и ес­ли его спе­ци­аль­но не по­вер­нуть, он мо­жет дви­гать­ся при столк­но­вении толь­ко впе­ред и на­зад. Для это­го мы ис­поль­зу­ем по­ня­тие на­прав­ления Scratch (то есть угол по­во­ро­та ро­бо­та) и дви­жения, про­ис­хо­дя­ще­го впе­ред и на­зад по пря­мой линии на­прав­ления. Борь­ба бу­дет ме­ж­ду крас­ным и синим ро­бо­том, по­это­му соз­дай­те два пер­со­на­жа, как по­ка­за­но на рис. 1.
 
Пред­ста­вим, что у ро­бо­та два ко­ле­са, и ес­ли его спе­ци­аль­но не по­вер­нуть, он мо­жет дви­гать­ся при столк­но­вении толь­ко впе­ред и на­зад. Для это­го мы ис­поль­зу­ем по­ня­тие на­прав­ления Scratch (то есть угол по­во­ро­та ро­бо­та) и дви­жения, про­ис­хо­дя­ще­го впе­ред и на­зад по пря­мой линии на­прав­ления. Борь­ба бу­дет ме­ж­ду крас­ным и синим ро­бо­том, по­это­му соз­дай­те два пер­со­на­жа, как по­ка­за­но на рис. 1.
[[Файл: Robots_opt.png|left |100px |thumb|Рис. 1. Порт­ре­ты ро­бо­тов-со­пер­ни­ков: го­ря­чий про­тив хо­лод­но­го? ]]
+
 
 
По­ня­тие на­прав­ления мы раз­би­ра­ли в ста­тье LXF156 «Ро­бот на эк­ране. Дви­жение и управ­ление» в рам­ках по­ня­тия Ори­ен­та­ция.
 
По­ня­тие на­прав­ления мы раз­би­ра­ли в ста­тье LXF156 «Ро­бот на эк­ране. Дви­жение и управ­ление» в рам­ках по­ня­тия Ори­ен­та­ция.
  
Так как наш ро­бот круг­лый, нуж­но бу­дет толь­ко оп­ре­де­лить, ку­да дви­гал­ся ро­бот со­перника, а ку­да – наш ро­бот, и под­ви­нуть ро­бо­та в нуж­ном на­прав­лении. Код при­бли­зи­тель­но бу­дет вы­гля­деть следующим образом:
+
Так как наш ро­бот круг­лый, нуж­но бу­дет толь­ко оп­ре­де­лить, ку­да дви­гал­ся ро­бот со­перника, а ку­да – наш ро­бот, и под­ви­нуть ро­бо­та в нуж­ном на­прав­лении. Код движения робота при­бли­зи­тель­но отображен на рис.4.
[[Файл:Robosumo1_opt.png |right|400px |thumb|]]
+
[[Файл:Init_red_opt.png |left|200px | thumb| Начальное положение крас­но­го ро­бо­та]]
 +
[[Файл:Init_blue_opt.png |left|200px | thumb|Начальное положения синего робота ]]
 +
[[Файл: Full_kasanie_red_opt.png|right|200px | thumb| Сигнал победы синего робота]]
 
Ес­ли наш ро­бот ехал в по­ло­жи­тель­ном на­прав­лении (боль­ше ну­ля – на­пра­во), а ро­бот со­перника дви­гал­ся в от­ри­ца­тель­ном (мень­ше ну­ля – на­ле­во, на­встре­чу нам), то нас от­бро­сит на­зад. То же про­изой­дет, ес­ли мы дви­га­лись в от­ри­ца­тель­ном на­прав­лении (на­ле­во), а ро­бот со­перника, на­обо­рот, на­пра­во: нас так­же от­бро­сит на­зад (то есть нуж­но бу­дет дви­гать­ся на ми­нус чис­ло ша­гов).
 
Ес­ли наш ро­бот ехал в по­ло­жи­тель­ном на­прав­лении (боль­ше ну­ля – на­пра­во), а ро­бот со­перника дви­гал­ся в от­ри­ца­тель­ном (мень­ше ну­ля – на­ле­во, на­встре­чу нам), то нас от­бро­сит на­зад. То же про­изой­дет, ес­ли мы дви­га­лись в от­ри­ца­тель­ном на­прав­лении (на­ле­во), а ро­бот со­перника, на­обо­рот, на­пра­во: нас так­же от­бро­сит на­зад (то есть нуж­но бу­дет дви­гать­ся на ми­нус чис­ло ша­гов).
 
+
[[Файл: Full_kasanie_red_opt.png|left|200px | thumb| Сигнал победы крас­но­го ро­бо­та]]
 
Для от­сле­жи­вания на­прав­ления мы вво­дим две пе­ре­мен­ные – napr1 и napr2, для крас­но­го и синего ро­бо­та со­от­вет­ст­вен­но, а из­менение на­прав­ления оп­ре­де­ля­ем со­бы­ти­ем kasanie.
 
Для от­сле­жи­вания на­прав­ления мы вво­дим две пе­ре­мен­ные – napr1 и napr2, для крас­но­го и синего ро­бо­та со­от­вет­ст­вен­но, а из­менение на­прав­ления оп­ре­де­ля­ем со­бы­ти­ем kasanie.
  
Строка 39: Строка 47:
 
До­ба­вив к ро­бо­там код управ­ления, мож­но пе­ре­ме­щать ро­бо­тов по по­лю со­от­вет­ст­вен­но стрел­ка­ми кур­со­ра и кла­ви­ша­ми WASD.
 
До­ба­вив к ро­бо­там код управ­ления, мож­но пе­ре­ме­щать ро­бо­тов по по­лю со­от­вет­ст­вен­но стрел­ка­ми кур­со­ра и кла­ви­ша­ми WASD.
  
Код для крас­но­го ро­бо­та
+
Да­лее нуж­но реа­ли­зо­вать код реа­ги­ро­вания на ка­сание. Пе­ре­да­дим сиг­нал kasanie, ес­ли бу­дет ка­сание про­ти­во­по­лож­но­го пер­со­на­жа. На­при­мер, для крас­но­го ро­бо­та этот уча­сток ко­да отображен на рисунке "Касание" ниже и справа.
  
[[Файл: Movie_red_opt.png|left |300px ]]
 
 
Код для си­не­го ро­бо­та –
 
[[Файл: Movie_blue_opt.png|left |300px ]]
 
Да­лее нуж­но реа­ли­зо­вать код реа­ги­ро­вания на ка­сание. Пе­ре­да­дим сиг­нал kasanie, ес­ли бу­дет ка­сание про­ти­во­по­лож­но­го пер­со­на­жа. На­при­мер, для крас­но­го ро­бо­та этот уча­сток ко­да бу­дет вы­гля­деть так:
 
[[Файл:Kasanie_red_opt.png |right |200px]]
 
 
Те­перь уже мож­но по­го­нять ро­бо­тов по по­лю; но на­ша за­да­ча – реа­ли­зо­вать на­стоя­щую борь­бу. Для это­го за­про­грам­ми­ру­ем аре­ну.
 
Те­перь уже мож­но по­го­нять ро­бо­тов по по­лю; но на­ша за­да­ча – реа­ли­зо­вать на­стоя­щую борь­бу. Для это­го за­про­грам­ми­ру­ем аре­ну.
  
 
На­ри­суй­те фон для сце­ны, как по­ка­за­но на рис. 2.
 
На­ри­суй­те фон для сце­ны, как по­ка­за­но на рис. 2.
[[Файл: Arena_opt.png|right |100px]]
+
 
 +
 
 +
 
 +
Как вид­но, у нас име­ет­ся аре­на жел­то­го цве­та и зе­ле­ное по­ле реа­ги­ро­вания для оп­ре­де­ления вы­тал­ки­вания ро­бо­та. Вы мо­же­те офор­мить аре­ну как вам нра­вит­ся – глав­ное, не ис­поль­зуй­те цвет, вы­бран­ный для про­стран­ст­ва вне аре­ны, чтобы они зрительно не сливались.
 +
 
 +
Так­же соз­да­дим еще два фо­на: один с со­об­щением о вы­иг­ры­ше крас­но­го ро­бо­та, вто­рой – синего (рис. 3).
 +
Для крас­но­го ро­бо­та –
 +
 
 +
Для ото­бра­жения нуж­но­го фо­на вве­дем два со­бы­тия – redwin и bluewin.
 +
Смотри код "Для сцены":
 +
 
 +
Теперь нам оста­ет­ся сде­лать две последние ве­щи: до­пи­сать к ко­ду ка­сания вы­да­чу сиг­на­ла, обозначающего вы­иг­ры­ш ро­бо­та про­ти­во­по­лож­но­го цве­та при ка­сании зе­ле­но­го по­ля, а так­же по­ста­вить ро­бо­тов в на­чаль­ное по­ло­жение. До­пи­шем эти два уча­стка ко­да.
 +
 
 +
Вы мо­же­те ска­чать пол­ный код про­ек­та с сай­та http://scratch.mit.edu/projects/akdengi/2618677.
 +
 
 +
В сле­дую­щей час­ти мы снаб­дим на­ших ро­бо­тов «ра­зу­мом» и раз­бе­рем раз­лич­ные ал­го­рит­мы их управ­ления. Ес­ли вы су­ме­е­те сде­лать это рань­ше нас, на­пи­ши­те нам на info@linuxformat.ru, и мы обя­за­тель­но опуб­ли­ку­ем и ва­ше ре­ше­ние. |

Текущая версия на 17:01, 26 сентября 2018


Шко­ла LXF

[править] Ро­бо­ты-спорт­сме­ны? Да!

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

Воз­мож­но ли та­кое? Тать­я­на Ка­зан­це­ва ут­вер­жда­ет, что воз­мож­но – для них да­же су­ще­ст­ву­ет своя Олим­пиа­да.

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

Как уз­нать, чей ро­бот луч­ше — уст­ро­ить кон­курс кра­со­ты? По­ве­рить на сло­во его соз­да­те­лям? Вер­ный от­вет нам мо­жет дать толь­ко че­ст­ная борь­ба. Ро­бо­олим­пиа­ды (или Robocup) — уже при­знан­ный спо­соб вы­явить, чей ро­бот име­ет луч­шую кон­ст­рук­цию и ал­го­рит­мы ра­бо­ты и ко­му бла­го­во­лит фор­ту­на.

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

Уча­стие в та­ких со­рев­но­ваниях яв­ля­ет­ся не толь­ко же­ла­тель­ным, но да­же обя­за­тель­ным для при­знания кон­ст­рук­ции ро­бо­та успеш­ной, и по­зво­ля­ет вы­явить де­фек­ты кон­ст­рук­ции.

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

[править] Япон­ская борь­ба

(thumbnail)
Рис.4. Код движения робота
(thumbnail)
Код для управления крас­но­го ро­бо­та
(thumbnail)
Код для управления си­не­го ро­бо­та
(thumbnail)
Касание
(thumbnail)
Код "Для сцены"

Начнем с си­му­ля­то­ра японской борь­бы су­мо. Она как-никак под­хо­дит к ро­бо­там – не прав­да ли, вид тол­стяч­ков-сумотори (борцов) свер­ху на­по­ми­на­ет круг­лый кор­пус ро­бо­та? Пра­ви­ла борь­бы очень про­сты: вы­толкни дру­го­го из кру­га. Но за­да­ча дан­но­го пла­на го­раз­до сложнее, чем про­сто ез­да по линии – нам на­до смо­де­ли­ро­вать неко­то­рые фи­зи­че­­ские яв­ления, а имен­но столк­но­вение ро­бо­тов. То есть ро­бо­ты долж­ны дви­гать­ся, стал­ки­вать­ся и от­пи­хи­вать друг дру­га.

(thumbnail)
Рис. 2. Арена
(thumbnail)
Рис. 1. Порт­ре­ты ро­бо­тов-со­пер­ни­ков: го­ря­чий про­тив хо­лод­но­го?

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

Пред­ста­вим, что у ро­бо­та два ко­ле­са, и ес­ли его спе­ци­аль­но не по­вер­нуть, он мо­жет дви­гать­ся при столк­но­вении толь­ко впе­ред и на­зад. Для это­го мы ис­поль­зу­ем по­ня­тие на­прав­ления Scratch (то есть угол по­во­ро­та ро­бо­та) и дви­жения, про­ис­хо­дя­ще­го впе­ред и на­зад по пря­мой линии на­прав­ления. Борь­ба бу­дет ме­ж­ду крас­ным и синим ро­бо­том, по­это­му соз­дай­те два пер­со­на­жа, как по­ка­за­но на рис. 1.

По­ня­тие на­прав­ления мы раз­би­ра­ли в ста­тье LXF156 «Ро­бот на эк­ране. Дви­жение и управ­ление» в рам­ках по­ня­тия Ори­ен­та­ция.

Так как наш ро­бот круг­лый, нуж­но бу­дет толь­ко оп­ре­де­лить, ку­да дви­гал­ся ро­бот со­перника, а ку­да – наш ро­бот, и под­ви­нуть ро­бо­та в нуж­ном на­прав­лении. Код движения робота при­бли­зи­тель­но отображен на рис.4.

(thumbnail)
Начальное положение крас­но­го ро­бо­та
(thumbnail)
Начальное положения синего робота
(thumbnail)
Сигнал победы синего робота

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

(thumbnail)
Сигнал победы крас­но­го ро­бо­та

Для от­сле­жи­вания на­прав­ления мы вво­дим две пе­ре­мен­ные – napr1 и napr2, для крас­но­го и синего ро­бо­та со­от­вет­ст­вен­но, а из­менение на­прав­ления оп­ре­де­ля­ем со­бы­ти­ем kasanie.

Ко­ды для крас­но­го и синего ро­бо­та аб­со­лют­но оди­на­ко­вы.

До­ба­вив к ро­бо­там код управ­ления, мож­но пе­ре­ме­щать ро­бо­тов по по­лю со­от­вет­ст­вен­но стрел­ка­ми кур­со­ра и кла­ви­ша­ми WASD.

Да­лее нуж­но реа­ли­зо­вать код реа­ги­ро­вания на ка­сание. Пе­ре­да­дим сиг­нал kasanie, ес­ли бу­дет ка­сание про­ти­во­по­лож­но­го пер­со­на­жа. На­при­мер, для крас­но­го ро­бо­та этот уча­сток ко­да отображен на рисунке "Касание" ниже и справа.

Те­перь уже мож­но по­го­нять ро­бо­тов по по­лю; но на­ша за­да­ча – реа­ли­зо­вать на­стоя­щую борь­бу. Для это­го за­про­грам­ми­ру­ем аре­ну.

На­ри­суй­те фон для сце­ны, как по­ка­за­но на рис. 2.


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

Так­же соз­да­дим еще два фо­на: один с со­об­щением о вы­иг­ры­ше крас­но­го ро­бо­та, вто­рой – синего (рис. 3). Для крас­но­го ро­бо­та –

Для ото­бра­жения нуж­но­го фо­на вве­дем два со­бы­тия – redwin и bluewin. Смотри код "Для сцены":

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

Вы мо­же­те ска­чать пол­ный код про­ек­та с сай­та http://scratch.mit.edu/projects/akdengi/2618677.

В сле­дую­щей час­ти мы снаб­дим на­ших ро­бо­тов «ра­зу­мом» и раз­бе­рем раз­лич­ные ал­го­рит­мы их управ­ления. Ес­ли вы су­ме­е­те сде­лать это рань­ше нас, на­пи­ши­те нам на info@linuxformat.ru, и мы обя­за­тель­но опуб­ли­ку­ем и ва­ше ре­ше­ние. |

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