[[2006b/MemberOnly/進行状況A]]

[[ロボティクス入門ゼミ]]

[[2006b/A2]]



CENTER:&color(blue){&size(50){ロボコン};};

#contents

*ロボコンのルール [#s21e915e]
**フィールド [#h7c352bd]
 
&ref(ロボコン・コース);

&ref(robocon-2006b-1.jpg);
 
&size(15){フィールドの説明};
 
-フィールドは約180cm×80cm
-運搬する500mlの紙パック(以下単に紙パックと呼ぶ)は約7cm×7cm×10.3cm
-紙パックはすべての面に緑色の画用紙がはられている。
-アルミ缶は350mlで側面にのみ緑色の画用紙がはられている。


**ルール [#zf408ee5]
&size(15){基本ルール};

-所定の時間内にアルミ缶と紙パックを分別して所定の場所に運ぶ。
-競技時間は2分とする。ただし紙パックあるいはアルミ缶を1個運ぶごとに時間を30秒延長する。
-中央のサークル内からスタートする。ただし地面に接していない部分はサークル外にあってもよい
-スタート時のロボットは3個を越えないこと (スタート後はいくつに分裂してもかまわない)。
-開始の合図から5秒以内にRCXのスタートボタンを押す作業を完了すること。
-競技が終了するまで、ロボットに触ったり人間が遠隔で操作してはならない。
-途中でうまく動かなくなった場合、1回限り再スタートすることができる。

&size(15){基本得点の計算方法};

-紙パックあるいはアルミ缶を一個運ぶと+2点
-間違ったカゴに入れると-1点

&size(15){技術点の計算方法};
~以下の動作の精度・スピード・確実性などを含めた技術的な工夫や芸術性について全てのチーム(自チームを含む7チーム)が10点満点で採点し、その平均点を求める。得点の目安:

-紙パック・アルミ缶を集める動作 (2点)
-紙パック・アルミ缶を運搬・分別する動作 (3点)
-自立型のロボットとしての形や動作の美しさ、斬新さ(3点)
-その他 (2点)


*作戦 [#uc20c5b3]

作戦1:積まれたまま三つ同時に運び、振り分ける。→断念

作戦2:一つずつ物を判別し、確実に振り分ける。→断念

作戦3:ロボを二台にして、役割を決めて振り分ける。これが最終的な作戦でした。

*ロボット [#c636733f]
**ロボット完成までの道のり [#k131635f]
 ロボットが完成するまでには、様々な試行錯誤が行なわれました。

&color(green){作戦1};
 まず初めに、私たちは缶と牛乳パックを積まれているまま一度に三つ運べるロボットを作ろうと試みました。しかし、一度に三つすべてを掴む確率が悪いということで、そのロボットの製作は断念しました。

&color(green){作戦2};
 次に考えたロボットは、缶と牛乳パックを光センサーで見分けて、一つずつ確実に運べるロボットでした。アームにタイヤを利用し、そのアームで物を左右から挟み取るロボットにした。さらに、物を掴んだら、もう一つのモーターでアームを上に持ち上げられるようにして、最後の籠に入れる際の段差をもろともしないロボットを作り出した。
&ref(robocon 3.JPG);                   

↑これが缶と牛乳パックを両方掴むことが可能なアーム。タイヤを利用したことで、物をつかんだ後に落とさないように工夫した。

 ここまでで出来たロボットがこちらです。

&ref(robocon 1.JPG);&ref(robocon 2.JPG);

 この後、私たちは、RCXを二つ利用して、缶か牛乳パックかを見分ける光センサーの他に、ライントレースをするための光センサーと、積んである缶がどこにあるか、また、壁に当たった時の為のタッチセンサーを取り付けようと試みました。しかし、それ以前に、アームを上下させることがあまりに困難であったので、このロボットでも缶を確実に運べないという結論に至った。そこで一からロボットを作り直すことが決定したが、ロボコンまで残り二日、正直行き詰った。

&color(green){作戦3};
 最終的に考えたのが、ロボットを二つ作り、一つは牛乳パック専用ロボット、もう一つが缶専用ロボットにすることです。

牛乳パック専用ロボットは、物をつかんで運ぶのではなく、ロボットの前方に囲いを設けて、そこに入れて押しながら運ぶといったロボットにしました。

&ref(robocon 6.JPG);

↑囲いに注目!!このスペースに牛乳パックを入れて運ぶ。

また、缶専用ロボットは缶しか入らないネットを前方に設けたロボットにしました。

&ref(robocon 11.JPG);

↑缶しか取ることが出来なく形作ったアーム。

**完成したロボット [#vb425367]

 前の項目で述べてきたように、苦労して出来上がったロボットがこちらです↓

&ref(robocon 9.JPG);←牛乳パック専用ロボ
&ref(robocon 15.JPG);←缶専用ロボ

**工夫したこと・苦労したこと [#me417824]
***牛乳パック専用ロボット [#o4b265c5]

牛乳パックを籠に入れるときに持ち上げられるように、ロボット前方に一つキャタピラを付けた。

&ref(robocon 7.JPG);←キャタピラに注目!!

ここでさらに工夫したことがあります。まずこちらの写真をご覧下さい。

&ref(robocon 4.JPG);&ref(robocon 5.JPG);

キャタピラの赤く囲ってある部分に注目してください。最初はキャタピラの角度を垂直に近いくらに取り付けたが、試しにやってみたところ、牛乳パックが分別スペースに入らないことがあったので、キャタピラの角度を初めより鋭角にして、牛乳パックが分別スペースに入りやすくなるようにした。このことで、牛乳パックを運ぶ際の安定性もアップした。

また、牛乳パックを運ぶ際の囲いが長いブロック一本が一対だけで、ロボットが壁にぶつかったときにすぐ壊れてしまうから補強しました。

&ref(robocon 8.JPG);

***缶専用ロボット [#h4959424]

&ref(robocon 14.JPG);

↑缶を取るアームの上げ下げが非常に早かったので、その動作を遅くするために、モーターからの力が直接行かないようにしました。


*プログラム [#q8c065a0]
**紙パック専門のロボットのプログラム[#sfe4924f]
 #define  go_straight(t)  OnFwd(OUT_A+OUT_C);Wait(t);Off   (OUT_A+OUT_C);         //進む
 #define  back(t)         OnRev(OUT_A+OUT_C);Wait(t);Off(OUT_A+OUT_C);         //バック
 #define  turn_right(t)   OnRev(OUT_C);OnFwd(OUT_A);Wait(t);Off(OUT_A+OUT_C);  //右に曲がる
 #define  turn_left(t)    OnRev(OUT_A);OnFwd(OUT_C);Wait (t);Off(OUT_A+OUT_C);  //左に曲がる
 #define THRESHOLD 40  
 #define run_time 80
 
 #define Do 523                     //音階の周波数を定義する
 #define Do_s 554
 #define Re 587
 #define Re_s 622
 #define Mi 659
 #define Fa 698
 #define Fa_s 740
 #define Sol 784
 #define Sol_s 831
 #define La 880
 #define La_s 932
 #define Si 988
 #define Do_up 1047
 #define Re_up 1175
 
 task play_music()                      //大塚愛の『さくらんぼ』の音楽を演奏する
 {
  while (true)
  {      PlayTone(La,15);Wait(20);
     PlayTone(Si,15);Wait(20);
 	PlayTone(La,15);Wait(20);
 	PlayTone(Sol,15);Wait(20);
 	PlayTone(Sol,50);Wait(60);
 	PlayTone(Si,25);Wait(30);
 	
 	PlayTone(Re_up,25);Wait(30);
 	PlayTone(Fa_s,15);Wait(20);
 	PlayTone(Fa_s,50);Wait(55);
	PlayTone(Sol,50);Wait(55);
	PlayTone(Sol,15);Wait(20);
	
	PlayTone(Fa_s,15);Wait(20);
	PlayTone(Sol,15);Wait(20);
	PlayTone(Si,25);Wait(30);
	PlayTone(Re,15);Wait(20);
	PlayTone(Re,50);Wait(55);
	PlayTone(Mi,25);Wait(30);
	
	PlayTone(Sol,25);Wait(30);
	PlayTone(Fa_s,15);Wait(20);
	PlayTone(Sol,15);Wait(20);
	PlayTone(La,15);Wait(20);
	PlayTone(Re,15);Wait(20);
	PlayTone(Si,25);Wait(30);
	
	PlayTone(Fa_s,15);Wait(20);
	PlayTone(Sol,25);Wait(30);
	PlayTone(Re,15);Wait(20);
	PlayTone(Do,25);Wait(30);
	PlayTone(Re,25);Wait(30);
	PlayTone(Mi,25);Wait(30);
	
	PlayTone(Sol,15);Wait(20);
	PlayTone(Sol,15);Wait(20);
	PlayTone(Fa_s,15);Wait(20);
	PlayTone(Sol,15);Wait(20);
	PlayTone(La,15);Wait(20);
	PlayTone(La,15);Wait(20);
	
	PlayTone(La,15);Wait(20);
	PlayTone(Si,15);Wait(20);
	PlayTone(La,15);Wait(20);
	PlayTone(Sol,15);Wait(20);
	PlayTone(Sol,50);Wait(55);
	PlayTone(Si,15);Wait(20); 
	
	PlayTone(Re_up,25);Wait(30);
	PlayTone(Fa_s,15);Wait(20);
	PlayTone(Fa_s,50);Wait(55);
	PlayTone(Sol,50);Wait(55);
	PlayTone(Sol,15);Wait(20);
	
	PlayTone(Fa_s,15);Wait(20);
	PlayTone(Sol,15);Wait(20);
	PlayTone(Si,25);Wait(30);
	PlayTone(Re,15);Wait(20);
	PlayTone(Re,50);Wait(55);
	PlayTone(Mi,25);Wait(30);
	
	PlayTone(Sol,25);Wait(30);
	PlayTone(Fa_s,15);Wait(20);
	PlayTone(Sol,15);Wait(20);
	PlayTone(La,15);Wait(20);
	PlayTone(Re,15);Wait(20);
	PlayTone(Si,25);Wait(30);
	
	PlayTone(Do_up,25);Wait(30);
	PlayTone(Si,25);Wait(30);
	PlayTone(La,25);Wait(30);
	PlayTone(Mi,25);Wait(30);
	PlayTone(Sol,15);Wait(20);
	PlayTone(Sol,15);Wait(20);
	
	PlayTone(Fa_s,15);Wait(20);
	PlayTone(Sol,15);Wait(20);
	PlayTone(La,15);Wait(20);
	PlayTone(Fa_s,15);Wait(20);
	PlayTone(Sol,25);Wait(30);
	Wait(50);
	}
  }
      
 task main()
 { 
  start play_music; 
   
   SetSensor(SENSOR_1,SENSOR_LIGHT);  //センサー1が光センサーと定義
   SetSensor(SENSOR_3,SENSOR_LIGHT);  //センサー3が光センサーと定義
  
 go_straight(170);   
 turn_left(85);  
 go_straight(585);
 turn_left(90);  
 go_straight(80); 
 turn_left(95);  
 OnFwd(OUT_B);
 go_straight(1100);          //1個目の箱を入れる動作
 
 
 if((SENSOR_1<THRESHOLD)&&(SENSOR_3<THRESHOLD))
 {OnFwd(OUT_C);OnRev(OUT_A);}
 ClearTimer(0); 
 while(Timer(0)<=run_time)
   {if(SENSOR_1<THRESHOLD)
    {OnFwd(OUT_A);
    Off(OUT_C);}
    if(SENSOR_3<THRESHOLD)
    {OnFwd(OUT_C);
      Off(OUT_A);}}                    //黒い線に沿って進むプログラム 
 
 repeat(2)
 {Off(OUT_B);
  back(450);
  turn_right(180);
  go_straight(500);
  turn_right(100);
  go_straight(50);
  turn_right(90);
  OnFwd(OUT_B);
  go_straight(1200);      //右側  right
 
  Off(OUT_B);
  back(400); 
  turn_right(180);
  go_straight(600);
  turn_left(100);
  go_straight(50);
  turn_left(100);
  OnFwd(OUT_B);
  go_straight(1200);     //右側  left
 
 
 
  back(200);
  turn_right(90);
  turn_left(90);
  go_straight(150);     //左側に移動
 
 
  Off(OUT_B);
  back(450);
  turn_left(180);
  go_straight(500);
  turn_right(100);
  go_straight(50);
  turn_right(90);
  OnFwd(OUT_B);
  go_straight(1200);      //左側  right
 
  Off(OUT_B);
  back(400); 
  turn_right(180);
  go_straight(600);
  turn_left(100);
  go_straight(50);
  turn_left(100);
  OnFwd(OUT_B);
  go_straight(1200);}     //左側  left
 }

**缶専門のロボットのプログラム [#w85f2708]

 task main()
 {
 SetSensor(SENSOR_2,SENSOR_TOUCH);  //タッチセンサーを定義
 Wait(1250);            //待ち時間
 while(true)                       
 {OnFwd(OUT_A+OUT_C);        //前進
 until (SENSOR_2 ==1);             //タッチセンサーが反応
 OnRev(OUT_A+OUT_C);        //後進
 Wait(30);                          
 OnFwd(OUT_C);OnRev(OUT_A);      //右折
 Wait(140);             
 OnFwd(OUT_A+OUT_C);                //前進
 until(SENSOR_2 ==1);               //タッチセンサーが反応
 OnRev(OUT_A+OUT_C);                //後進
 Wait(90);                          
 OnFwd(OUT_A+OUT_C);                //前進
 until(SENSOR_2 ==1);               //タッチセンサーが反応
 OnRev(OUT_A+OUT_C);                //後進
 Wait(30);                          
 OnFwd(OUT_B);                      //アームをあげる
 Wait(80);                          
 Off(OUT_B);                         
 OnFwd(OUT_A);OnRev(OUT_C);         //反転
 Wait(180);                         
 OnFwd(OUT_A+OUT_C);                //前進
 until(SENSOR_2 == 1);              //タッチセンサーが反応
 Off(OUT_A+OUT_C);                   
 OnRev(OUT_B);                      //アームをさげる
 Wait(85);                          
 OnFwd(OUT_B);                      //アームをあげる
 Wait(80);                          
 Off(OUT_B);                         
 OnRev(OUT_A+OUT_C);                //後進
 Wait(20);                          
 OnFwd(OUT_A);                      //反転
 Wait(175);                         
 OnRev(OUT_B);                      //アームをさげる
 Wait(85);                          
 Off(OUT_B);                        
 }
 }

-工夫した点

アームをやわらかくしたため、接触したときなど破損しにくくなっている。そして、アームの後ろにタッチセンサーがあるので、アームが曲がることによりセンサーが反応しやすくなっている。

&ref(robocon 12.JPG);

運ぶものを壁におしてアームに乗せるというプログラムにしてるため、缶以外は運ぶことが出来ない。この特徴を利用して缶専用のロボットになった。

最初に待ち時間を設けたため、仲間のロボットとの接触を避けた。もし接触しても、タッチセンサーがついているため避けることが出来る。



-苦労した点

アームが少しでも浮いているとタッチセンサーに接触せず、センサーが反応しなかった。これを解決するために、アームの上げ下げの時間の調節を何度も行った。

このアームは、缶がアームの真ん中に来ないと運ぶことができない。これを解決しようといろいろなことを試してみたが、解決することができなかった。

*結果 [#ud1f6059]

 結果は4位でした。本番はロボットを動かし始める位置がとても重要で、一回目はリスタートした。しかし二回目はうまくいき、三点をゲットすることができました。ロボコンのときのようすです↓

&ref(robocon 16.JPG);&ref(robocon 17.JPG);

*感想 [#j9a6534a]

ロボコンのテーマは分別ロボットということだったが、なかなかうまく分別は出来なかった。プログラムで分別するのではなく、缶なら缶しか運べないロボットを作って分別したことは工夫したと思う。もっと缶や牛乳パックを分別したかったが、本番で牛乳パックが分別スペースに入ったときはとても嬉しかったです。

&ref(robocon 18.JPG);

最後に、ロボコンを頑張ってくれたロボット達ありがとう。お疲れ様でした。

&ref(robocon 19.JPG);

そして、ロボットを共に完成させたグループのみんなもありがとう。本当にお疲れ様でした。
-お疲れ様! -- [[ゆき(TA)]] &new{2007-02-13 (火) 17:13:16};

#comment


トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS