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

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

Материал из Linuxformat
(Различия между версиями)
Перейти к: навигация, поиск
(Япон­ская борь­ба)
(Япон­ская борь­ба)
Строка 25: Строка 25:
 
Так как пол­но­цен­ную фи­зи­ку взаи­мо­дей­ст­вия опи­сать доста­точ­но слож­но (осо­бен­но в Scratch, и осо­бен­но для тех, кто не зна­ком с по­ня­тия­ми мо­мен­та и уп­ру­го­го со­уда­рения и три­го­но­мет­ри­че­­ски­­ми функ­ция­ми), мы по­пы­та­ем­ся сде­лать уп­ро­щен­ную мо­дель, ко­то­рая с неко­то­рым при­бли­жением бу­дет ими­ти­ро­вать ре­аль­ную, но об­хо­дить­ся без слож­ных функ­ций.
 
Так как пол­но­цен­ную фи­зи­ку взаи­мо­дей­ст­вия опи­сать доста­точ­но слож­но (осо­бен­но в Scratch, и осо­бен­но для тех, кто не зна­ком с по­ня­тия­ми мо­мен­та и уп­ру­го­го со­уда­рения и три­го­но­мет­ри­че­­ски­­ми функ­ция­ми), мы по­пы­та­ем­ся сде­лать уп­ро­щен­ную мо­дель, ко­то­рая с неко­то­рым при­бли­жением бу­дет ими­ти­ро­вать ре­аль­ную, но об­хо­дить­ся без слож­ных функ­ций.
  
Пред­ста­вим, что у ро­бо­та два ко­ле­са, и ес­ли его спе­ци­аль­но не по­вер­нуть, он мо­жет дви­гать­ся при столк­но­вении толь­ко впе­ред и на­зад. Для это­го мы ис­поль­зу­ем по­ня­тие на­прав­ления Scratch (то есть угол по­во­ро­та ро­бо­та) и дви­жения, про­ис­хо­дя­ще­го впе­ред и на­зад по пря­мой линии на­прав­ления. Борь­ба бу­дет ме­ж­ду крас­ным и синим ро­бо­том, по­это­му соз­дай­те два пер­со­на­жа, как по­ка­за­но на рис. 1.
+
Пред­ста­вим, что у ро­бо­та два ко­ле­са, и ес­ли его спе­ци­аль­но не по­вер­нуть, он мо­жет дви­гать­ся при столк­но­вении толь­ко впе­ред и на­зад. Для это­го мы ис­поль­зу­ем по­ня­тие на­прав­ления Scratch (то есть угол по­во­ро­та ро­бо­та) и дви­жения, про­ис­хо­дя­ще­го впе­ред и на­зад по пря­мой линии на­прав­ления. Борь­ба бу­дет ме­ж­ду крас­ным и синим ро­бо­том, по­это­му соз­дай­те два пер­со­на­жа, как по­ка­за­но на рис. 1.[[Файл:Robosumo1_opt.png |right|400px |thumb|]]
 
[[Файл: Robots_opt.png|left |100px |thumb|Рис. 1. Порт­ре­ты ро­бо­тов-со­пер­ни­ков: го­ря­чий про­тив хо­лод­но­го? ]]  
 
[[Файл: Robots_opt.png|left |100px |thumb|Рис. 1. Порт­ре­ты ро­бо­тов-со­пер­ни­ков: го­ря­чий про­тив хо­лод­но­го? ]]  
 
По­ня­тие на­прав­ления мы раз­би­ра­ли в ста­тье LXF156 «Ро­бот на эк­ране. Дви­жение и управ­ление» в рам­ках по­ня­тия Ори­ен­та­ция.
 
По­ня­тие на­прав­ления мы раз­би­ра­ли в ста­тье LXF156 «Ро­бот на эк­ране. Дви­жение и управ­ление» в рам­ках по­ня­тия Ори­ен­та­ция.
  
 
Так как наш ро­бот круг­лый, нуж­но бу­дет толь­ко оп­ре­де­лить, ку­да дви­гал­ся ро­бот со­перника, а ку­да – наш ро­бот, и под­ви­нуть ро­бо­та в нуж­ном на­прав­лении. Код при­бли­зи­тель­но бу­дет вы­гля­деть следующим образом:
 
Так как наш ро­бот круг­лый, нуж­но бу­дет толь­ко оп­ре­де­лить, ку­да дви­гал­ся ро­бот со­перника, а ку­да – наш ро­бот, и под­ви­нуть ро­бо­та в нуж­ном на­прав­лении. Код при­бли­зи­тель­но бу­дет вы­гля­деть следующим образом:
[[Файл:Robosumo1_opt.png |right|400px |thumb|]]
+
 
 
Ес­ли наш ро­бот ехал в по­ло­жи­тель­ном на­прав­лении (боль­ше ну­ля – на­пра­во), а ро­бот со­перника дви­гал­ся в от­ри­ца­тель­ном (мень­ше ну­ля – на­ле­во, на­встре­чу нам), то нас от­бро­сит на­зад. То же про­изой­дет, ес­ли мы дви­га­лись в от­ри­ца­тель­ном на­прав­лении (на­ле­во), а ро­бот со­перника, на­обо­рот, на­пра­во: нас так­же от­бро­сит на­зад (то есть нуж­но бу­дет дви­гать­ся на ми­нус чис­ло ша­гов).
 
Ес­ли наш ро­бот ехал в по­ло­жи­тель­ном на­прав­лении (боль­ше ну­ля – на­пра­во), а ро­бот со­перника дви­гал­ся в от­ри­ца­тель­ном (мень­ше ну­ля – на­ле­во, на­встре­чу нам), то нас от­бро­сит на­зад. То же про­изой­дет, ес­ли мы дви­га­лись в от­ри­ца­тель­ном на­прав­лении (на­ле­во), а ро­бот со­перника, на­обо­рот, на­пра­во: нас так­же от­бро­сит на­зад (то есть нуж­но бу­дет дви­гать­ся на ми­нус чис­ло ша­гов).
  

Версия 02:32, 24 сентября 2018


Шко­ла LXF

Ро­бо­ты-спорт­сме­ны? Да!

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

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

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

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

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

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

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

Япон­ская борь­ба

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

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

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

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

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

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

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

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

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

Код для крас­но­го ро­бо­та –

Movie red opt.png

Код для си­не­го ро­бо­та –

Movie blue opt.png

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

Kasanie red opt2.png

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

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

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