[[2017a/Member]]
#contents
*課題について [#i9a3515a]
**空き缶の配置 [#ydf1cb15]
#ref(./2017a-mission3.png,15.3KB  ,image/jpeg)
上の図のようなフィールドに置いてある空き缶を収集し、ゴールになるべく高く空き缶を積み上げる、というもので、フィールドについては以下の通り。

 〇フィールドは課題2で使用した紙を使用する。

 〇図のピンク色の場所に350mlの空き缶を置く。

 〇図のライトブルーの円のいずれか一箇所に中身の入った350mlの缶を置く。

 〇中身の入った缶には紙をはったり図などを描いてもよい。

**基本ルール [#i22bfdde]

 〇競技時間は審判が続行不能と判断するまで、あるいはリタイアするまで。

 〇図のA地点または(および)PQRSで囲まれた中央部の円からスタートする。ただし接地している部分はそれぞれの領域内に収まるものとする(線上はOK)。上空部分は領域からはみ出していてもよい。

 〇空き缶を集めて図のT地点を含む「ゴール」と書かれた3/4円と2線分で囲まれる領域に空き缶を運ぶ

 〇なるべく高く空き缶を積み上げる

 〇運び終わった後、あるいは積み上げた後はロボットはゴールの領域から外に出ること。また空き缶と接触していてはいけない。

 〇開始の合図から5秒以内にスタートボタンを押す作業を完了すること。

 〇競技が終了するまで、ロボットに触ったり人間が遠隔で操作してはならない。

 〇ロボットスタート後、速やかに1〜3の数字が記されたくじを引き、中身の入った缶を引いたくじの位置に設置する。

 〇途中でうまく動かなくなった場合、1回限り再スタートすることができる(再スタートの際に別プログラムで起動してよい)。

**基本得点の計算方法 (片道) [#u59814b1]

 〇n段目の空き缶の点数を3n点とし、すべての空き缶の点数を合計する。

 ◦中身の入った缶については、その缶自身を含め、その缶の上下に積まれている缶の点数をすべて倍にする

 ◦例:中身の入った缶の上に3本の空き缶を積んだ場合:(3+6+9+12)×2 = 60点

 ◦例:空き缶を3段と4段に分けて積み、中身の入った缶は運搬するだけでその上に空き缶を積まなかった場合: (3+6+9) + (3+6+9+12) + 3x2 = 54点

**技術点の計算方法 [#b4eb4bab]
以下の動作の精度・スピード・確実性などを含めた技術的な工夫や芸術性について他の全てのチーム(5チーム)が20点満点で採点し、その平均点を求める。

 得点の目安: 

  ◦空き缶を取りにいくまでの動作 (3点)

  ◦空き缶を掴む動作 (3点)

  ◦空き缶をを運ぶ動作(2点)

  ◦空き缶を積み上げる動作(5点)

  ◦2台のRCXまたはNXT、EV3の連携の良さ(3点)

  ◦自立型のロボットとしての形や動作の美しさ、斬新さ(2点)

  ◦その他 (2点)

*ロボットについて [#fed020d0]
**全体図 [#vd0e7990]
#ref(./2017_08_07_3.jpg,50.8KB  ,image/jpeg)

過去の作品を参考にして、RIS2台を向かい合わせにして交信を行い、すべての作業を一台のロボットだけで行う、というものにした。

その結果、前方に機能が固まってしまいバランスが取れなかったので、一番後ろに重しをつけることとなってしまった。

本番で他の班の発表を見て、RIS本体を立てて繋ぐようにすればバランスが取れたのでは、と思ったが、自分たちの班の場合は結局前方部分が重くなってしまうことは変わらないので、やはりロボットを2台に分けるのが一番良い案な気がする。
**前方部分 [#ff90f8d2]
#ref(./2017_08_07_5.jpg,52.5KB  ,image/jpeg)
イメージとしては、写真の赤い線で囲われたアームで空き缶2つを、緑の線で囲われたタイヤに押さえつけながらタイヤを回すことで、奥にある空き缶�,�上に上がり、もう一つの空き缶�△�アームの力によって、持ち上がった空き缶�,硫爾貌�り込んで2段になる、というものである。

と言葉で説明するのは簡単だが、実際には一回しか成功したことはない。

***アームの部分 [#w06b73ad]
#ref(./2017_08_07_9.jpg,45.8KB  ,image/jpeg)
本来なら、RIS本体の電源を入れれば写真中央のギアが回りづらくなり、アームが固定されるはずだったのだが、アームが重さで遠心力が大きくなった結果、まったく固定できず、ギアを回しているとき以外は常にパカパカしているといったものになってしまった。

これ自体はあまり障害にならないだろうと思っていたが、スタート地点でアームを開く幅が微妙にずれると同じプログラムでも全く違った結果になるという、とんでもない障害になってしまった。

何度も改善を試みたが、アームがもろくなってしまうことだけは避けたかったので、あきらめることとなった。
***缶を持ち上げる部分 [#gbd22640]
&ref(2017a/Member/fukupon/Mission3/2017_08_07_12.jpg,42.8KB,image/jpeg);
&ref(2017a/Member/fukupon/Mission3/2017_08_07_8.jpg,41.6KB,image/jpeg);

失敗の原因はほぼここにある。

缶が持ち上がる途中まではいいのだが、写真の赤い線で囲われた部分、つまり持ち上げるためのタイヤが終わる部分に缶の下の部分が入り込んでしまって缶が傾き、あと少しのところで下に缶が入らない。

これの改善策として、缶が傾いたところで一度タイヤを止めアームで押さえつけることで、缶の傾きを直すと同時に缶の下にもう一つの缶を押し込むことが可能になった。

はずなのだが、なぜかなかなか成功せず、本番は運任せとなってしまった。
**後輪 [#i12635eb]
#ref(./2017_08_07_11.jpg,27.0KB  ,image/jpeg)
この部分は他の班員が作ったところで、長い本体で右折などをするために前はギアにつないだタイヤを左右2つずつ、後ろはどんな方向にも曲がれるようにキャスターにした。

*プログラムについて [#aca6acd4]
自分は主にロボット本体の作業をしたので、詳しい説明は他の班員のものを参照してほしい。

大まかな流れとしては、

 ��E→F→カーブの順で3つ

 �▲好拭璽斑賄世北瓩�

 ��G→カーブの順で2つ

 �ぅ好拭璽斑賄世北瓩�

 ��H→Tの順で2つ

 �Ν,罵召辰振�き缶と中身の入った缶を重ねる

という大それたものだったが、結局�,泙任靴�できなかった。

発信者がタイヤとつながっている前のRISで、受信者が後ろのRIS。
**発信者 [#nf25b671]
***定義 [#d893d9ff]
 #define SIGNALON 11
 #define SIGNALOFF 12
 #define SIGNALUP 21
 #define SIGNALDOWN 22  
 #define SIGNALOPEN 31
 #define SIGNALCLOSE 32

***プログラム [#o92e3bd9]
� 銑�
 task main()
 {
   OnFwd(OUT_AC);
   Wait(321);
   Off(OUT_AC);
  SendMessage(SIGNALUP);
   OnRev(OUT_A); 
   OnFwd(OUT_C);
   Wait(30);
  SendMessage(SIGNALDOWN); 
   Off(OUT_AC);
  SendMessage(SIGNALOPEN);
   Wait(10);
  SendMessage(SIGNALCLOSE);
   OnFwd(OUT_AC);
   Wait(150);
   Off(OUT_AC);
  SendMessage(SIGNALON);
   Wait(500);
  SendMessage(SIGNALOFF);
  SendMessage(SIGNALOPEN);
   Wait(5);
  SendMessage(SIGNALCLOSE);
  SendMessage(SIGNALON);
   Wait(50);
  SendMessage(SIGNALOFF);
   OnFwd(OUT_AC);
   Wait(90);
   Off(OUT_AC);
   OnFwd(OUT_C);
   OnRev(OUT_A);
  SendMessage(SIGNALUP);
   Wait(60);
  SendMessage(SIGNALDOWN);
   Off(OUT_AC);
   OnFwd(OUT_AC);
   Wait(180);
   Off(OUT_AC);
  SendMessage(SIGNALOPEN);
   Wait(100);
  SendMessage(SIGNALCLOSE);
   OnRev(OUT_AC);
   Wait(200);
   Off(OUT_AC);
   OnRev(OUT_C);
   OnFwd(OUT_A);
   Wait(98);
   Off(OUT_AC);
   OnRev(OUT_AC);
   Wait(900);
   Off(OUT_AC);
   OnRev(OUT_C);
   OnFwd(OUT_A);
   Wait(98);
   Off(OUT_AC);
   OnRev(OUT_AC);
   Wait(600);
   Off(OUT_AC);    //A
   Off(OUT_AC);    

��〜��
   OnFwd(OUT_AC);
   Wait(50);
   Off(OUT_AC);
   OnFwd(OUT_C);
   OnRev(OUT_A);
   Wait(98);
   Off(OUT_AC);
   OnFwd(OUT_AC);
   Wait(800);
   Off(OUT_AC);
   OnFwd(OUT_A);
   OnRev(OUT_C);
   Wait(98);
   Off(OUT_AC);
  SendMessage(SIGNALON);
   Wait(500);
  SendMessage(SIGNALOFF);
  SendMessage(SIGNALOPEN);
   Wait(10);
  SendMessage(SIGNALCLOSE);
  SendMessage(SIGNALON);
   Wait(50);
  SendMessage(SIGNALOFF);
   OnFwd(OUT_AC);
   Wait(200);
   Off(OUT_AC);
  SendMessage(SIGNALOPEN);
   Wait(100);
  SendMessage(SIGNALCLOSE);        //GG
  SendMessage(SIGNALCLOSE);        

��
   OnRev(OUT_AC);
   Wait(200);
   Off(OUT_AC);
   OnFwd(OUT_C);
   OnRev(OUT_A);
   Wait(98);
   Off(OUT_AC);
   OnRev(OUT_AC);
   Wait(800);
   Off(OUT_AC);
   OnFwd(OUT_C);
   OnRev(OUT_A);
   Wait(98);
   Off(OUT_AC);
   OnFwd(OUT_AC);
   Wait(50);
   Off(OUT_AC);
   OnFwd(OUT_A);
   OnRev(OUT_C);
   Wait(98);
   Off(OUT_AC);

ここから��
��
   OnFwd(OUT_AC);
   Wait(900);
   Off(OUT_AC);
   OnFwd(OUT_A);
   OnRev(OUT_C);
   Wait(98);
   Off(OUT_AC);
  SendMessage(SIGNALON);
   Wait(500);
  SendMessage(SIGNALOFF);
  SendMessage(SIGNALOPEN);
   Wait(10);
  SendMessage(SIGNALCLOSE);
  SendMessage(SIGNALON);
   Wait(50);
  SendMessage(SIGNALOFF);
   OnFwd(OUT_AC);
   Wait(380);
   Off(OUT_AC);
  SendMessage(SIGNALOPEN);
   Wait(100);
  SendMessage(SIGNALCLOSE);
   OnRev(OUT_AC);
   Wait(200);
   Off(OUT_AC);
 }  
 
**受信者 [#gda064f9]
***定義 [#v6e4d5b5]
 #define SIGNALON 11
 #define SIGNALOFF 12  
 #define SIGNALUP 21
 #define SIGNALDOWN 22
 #define SIGNALOPEN 31
 #define SIGNALCLOSE 32

***プログラム [#g654bf37]
 task main()
 {
  ClearMessage();
  while(true){
   until (Message()==SIGNALON);
    OnRev(OUT_C);
    OnFwd(OUT_A);
   until(Message()==SIGNALOFF);
    Off(OUT_AC);
   until (Message()==SIGNALUP);
    OnRev(OUT_C);
   until(Message()==SIGNALDOWN);
    Off(OUT_C);
   until (Message()==SIGNALOPEN);
    OnFwd(OUT_C);
   until(Message()==SIGNALCLOSE);
    Off(OUT_C);
   }
 }
*結果と反省 [#ice55114]
やはり2段に重ねることはできなかったが、順位は6位と失敗した割には上出来だった。

今回は期末テストがあったり、講義がなかったりと、班員全員で集まり機会が少なかったので苦労したが、全員集まらなくても少しずつ進めたおかげでなんとか間に合わせることができた。

とはいっても、結果は理想とはだいぶかけ離れたものだった。(理想が高すぎたのもある気が...)

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS