ロボコン
 *ロボコンについて
*ロボコンについて [#u30ae257]
[[概要>2006b/A4/概要]]
*ロボット [#oe7f4bf4]
**構想 [#zcbcee84]
まずはじめはメンバー全員で、次の点について話し合いました。
+ロボットを2台に分けるか1台でいくか
+缶とパックをどのように分別するか
+どのようにつかむか

他にも次のような意見が出ました。
-2台に分けるなら、そのうちの一台はゴールの前に固定して、もう一台が運んできたものを受け取って枠に入れるだけにする
-もういっそのこと分別せずに全部同じほうに入れてしまう(それでも点数はプラスになる可能性が高い)
-はじめに積んである缶とパックは崩さないほうがいいのではないか
-掴むことはせずに、枠に押し込んでしまう

**最初のロボット [#j0e9899a]
以上のような話し合いの末に、最初のスタイルとして、「1台で、横になっている標的を左右からはさんで持ち上げる」となりました。またこのときの分別方法は、下の図のようにしました。(写真はありませんが)

&ref(2006b/A4/ロボコン/分別法.JPG,50%,センサー1・2両方が反応したときはパック、1のみ反応したときは缶、という風に分別);

しかし、時間をかけて作った最初のロボットには重大な欠点が・・・それは、「強度」でした。はじめのロボットのアームの稼動部分は、モーターの回転軸を中心に回転運動するものではなく、棒状のパーツが、ガイドレール上をウォームギアによってスライドするものでした。しかし、レゴの仕様なのか自分の技術が足りないのか、きっちりかみ合わず、強度がほとんど無いような状態でした。稼動部分の強化にもいろいろ手を打ちましたが、完全な解決には至らず、泣く泣く新たな構造を考えることにしました。
**次のロボット [#p98c33d0]
前回の失敗の原因は、構造上の絶対的な強度不足にありました。それを克服するためには、回転移動するアームを作る必要がありました。そうして出来上がったアームは、

&ref(2006b/A4/ロボコン/VFTS0006.JPG,50%,アーム完成版);

こんな感じです。2つのモーターを使っており、ひとつは「つかむ」ため、もうひとつは「持ち上げる」ためです。やはり回転機構は、レゴの特性(ブロックの凹凸と軸穴の位置関係)上前作よりはるかに丈夫なロボットになりました。分別方法も、少し不安定だったので手を加えて、こんな感じに

&ref(2006b/A4/ロボコン/VFTS0005.JPG,30%,分別機構・改);

くぼんだ構造のおくにタッチセンサーをつけ、缶をつかんだときにのみ反応するようにしました。

全体像

#ref(2006b/A4/ロボコン/VFTS0001.JPG,40%,全体像1)

#ref(2006b/A4/ロボコン/VFTS0002.JPG,40%,全体像2)

使用したセンサーは、
-ライントレース用に2つ
-分別用に2つ
-壁に接触したことを判別するタッチセンサーがひとつ
の計5つです。

**苦労した点 [#n7352aa2]
-最初につくったロボットは時間をかけた割にはほぼ無駄に終わったところ。時間的にも精神的にも苦労した
-目標物をつかめる状況であることを判断するのに、タッチセンサーを使っていたため、壁と目標物の判別ができなかった
-上の点を改善するため、タッチセンサーではなく光センサーを使った。それで問題点は改善されたが、部屋の明かりによって値が変わってしまう問題点が出た。また、壁に対して誤認識することも100%無いわけではなかった。
-つかむためのモーターは、アームの上に取り付けているが、そのためにかなりアームが重くなってしまっている
-補強を重ねることで強度を保つことはできたが、見た目にもいかつい感じになってしまい、シンプルさに欠けるものがあった

**工夫した点 [#vc1e9c99]
-不安定だったはじめの分別構造から、くぼみの形状を利用して缶だけがタッチセンサーに反応するように、新しく作り直したことで、つかむことさえできればほぼ完璧に分別することが可能になった
-わずかでも製作時間の短縮になるよう、ドライブベースにはほぼ手を加えなかった
-目標物の識別に光センサーを使い、実際のロボコンのステージで数値の設定をしたことでかなり確実に目標物の認識が正確になった
-前方下部にガイドアームを取り付け、左右に回転することでどんな方向で目標物を認識しても、しっかり持てるように横向きに直すようにした
-アームを上下させるためのギアは二箇所に設置して強度と安定さをだした
-アームの先端にタイヤを回転しないように取り付け、滑り止めとした

**反省点 [#gb8109c3]
ロボット作りに時間をかけすぎたことです。そのおかげで、時間が足りなくなり、少し改良すればいいような問題が残ってしまいました。たとえば、ギア比について、アームを支えるギアが適切でなく、プログラムでoffにしてもアームの重さに耐えられずに下がってきてしまう。分解して、ウォームギアに組み替えれば解決できたことではあるが、その時間が無く、プログラムを若干複雑化することで解決せざるを得なかったこと。

*プログラム [#fe82c9cc]
アーム第一稿
[[第壱稿>2006b/A4/第壱稿]]
プログラムの第1稿。つかむ位置によって、うまくライントレースができないことが多かった。

  #define ARM_TIME 25
 #define UP_TIME 25
 task main(){
  SetSensor(SENSOR_1,SENSOR_TOUCH);
  SetSensor(SENSOR_2,SENSOR_TOUCH);
  while(true){
    ClearMessage();
   if((SENSOR_1==1)&&(SENSOR_2==1))
    {SendMessage(2);
     OnFwd(OUT_A); Wait(ARM_TIME); 
     OnFwd(OUT_B); Wait(UP_TIME);Off(OUT_A+OUT_B);}
   if( (SENSOR_1==1))
    {SendMessage(1);
     OnFwd(OUT_A); Wait(ARM_TIME); 
     OnFwd(OUT_B); Wait(UP_TIME);Off(OUT_A+OUT_B);}
   if(Message()==3){OnRev(OUT_B); Wait(25); 
       OnRev(OUT_A); Wait(30);Off(OUT_A+OUT_B);}
   }
  }
足回り第一稿
 #define line_1   while ( Timer(2) <= 60 ) {  if(SENSOR_1<40){OnFwd(OUT_A);OnRev(OUT_C);  Wait(5);}if(SENSOR_2<40){OnFwd(OUT_C);OnRev(OUT_A);Wait(5);}else{OnFwd(OUT_A+OUT_C);}  } 
 #define line_2   while ( Timer(2) <= 20 ) {  if(SENSOR_1<40){OnFwd(OUT_A);OnRev(OUT_C);  Wait(5);}if(SENSOR_2<40){OnFwd(OUT_C);OnRev(OUT_A);Wait(5);}else{OnFwd(OUT_A+OUT_C);}  } 
 #define line_3  while ( Timer(0) <= 80 ) {  if(SENSOR_1<40){OnFwd(OUT_A);OnRev(OUT_C);  Wait(5);}if(SENSOR_2<40){OnFwd(OUT_C);OnRev(OUT_A);Wait(5);}else{OnFwd(OUT_A+OUT_C);}  } 
 int turn_time;
 task main()
 {
   SetSensor(SENSOR_1,SENSOR_LIGHT);
   SetSensor(SENSOR_2,SENSOR_LIGHT);
   SetSensor(SENSOR_3,SENSOR_LIGHT);
   turn_time=10;  
  while(true){
    ClearMessage();
    ClearTimer(0);
    ClearTimer(1);
    ClearTimer(2);
   OnFwd(OUT_A+OUT_C); Wait(30); 
   if(Message()==1) {
     Off(OUT_A+OUT_C); Wait(60); OnRev(OUT_A+OUT_C);  Wait(15);
     OnFwd(OUT_C); OnRev(OUT_A); 
     Wait(80); OnFwd(OUT_A+OUT_C); Wait(10);
     line_1; OnFwd(OUT_A+OUT_C); 
    if(SENSOR_3<40){OnFwd(OUT_C); OnRev(OUT_A); Wait(30);}
     line_2; SendMessage(3); 
     Float(OUT_A+OUT_C); Wait(60); OnRev(OUT_A+OUT_C);  Wait(20);
     OnFwd(OUT_A); OnRev(OUT_C); Wait(40);
     line_3;}
   if(Message()==2) {
     Off(OUT_A+OUT_C); Wait(60); OnRev(OUT_A+OUT_C); Wait(15);
     OnFwd(OUT_A); OnRev(OUT_C); 
     Wait(80); OnFwd(OUT_A+OUT_C); Wait(10);
     line_1; OnFwd(OUT_A+OUT_C); 
    if(SENSOR_3<40){OnFwd(OUT_A); OnRev(OUT_C); Wait(30);}
     line_2; SendMessage(3); 
  Float(OUT_A+OUT_C);Wait(60);OnRev(OUT_A+OUT_C);Wait(20);                                                       
     OnFwd(OUT_C); OnRev(OUT_A); Wait(40);line_3;}
   else{while(Message()!=0){OnFwd(OUT_A+OUT_C); Wait(35); 
     OnRev(OUT_A+OUT_C); Wait(30);
     OnFwd(OUT_A); OnRev(OUT_C); Wait(turn_time); 
     turn_time =turn_time+5;
     OnFwd(OUT_A+OUT_C); Wait(35); OnRev(OUT_A+OUT_C); Wait(30);
     OnFwd(OUT_C); OnRev(OUT_A); Wait(turn_time);
     turn_time =turn_time+5;}
      }
    }  }
第二稿 
アーム
#define ARM_TIME 35
#define UP_TIME 35
[[第弐稿>2006b/A4/第弐稿]]
プログラムの第2稿。うまくプログラムを組むことができずに、無駄に長くなってしまった。
-塔を崩した後に進んでは曲がり変数を加えその変数とつかんだものにより6パターンの行動をする予定でした。

task main(){
[[本番>2006b/A4/本番]]
本番用のプログラム。前日から当日にかけて、簡略化と、つかむ確率を上げるようにしたもの。物を円上でつかむようにしたため、センサー類を減らし変数などもなくした。
-塔を崩し転がったものを円を半円状に回って拾い、ライントレースをし缶ならそのまま入れて箱なら缶の場所から移動するようになっています。

 SetSensor(SENSOR_1,SENSOR_TOUCH);
 SetSensor(SENSOR_3,SENSOR_TOUCH);
 while(true){
   ClearMessage();
  if((SENSOR_1==1)&&(SENSOR_3==1))
   {SendMessage(2);
    OnFwd(OUT_A); Wait(ARM_TIME); 
    OnFwd(OUT_C); Wait(UP_TIME);Off(OUT_A+OUT_C);}
 
  if( (SENSOR_3==1))
   {SendMessage(1);
    OnFwd(OUT_A); Wait(ARM_TIME); 
    OnFwd(OUT_C); Wait(UP_TIME);Off(OUT_A+OUT_C);}
 
**苦労した点 [#xd092d0c]
-ライントレースのコースの途中に円があり、三叉路となってしまうので物をつかんだ後の向きと位置でライントレースがうまくできずに円状に走り続けてしまったり、反対方向に走ってしまったりした。最後まで悩みどころとなった。
-物をうまくつかむことができずに本番ぎりぎりまでつかむための調整にかかってしまったこと。
-はじめは、変数を設定してその値によってライントレースを行おうと思っていた。しかし、プログラムが複雑になり物を拾うために動く動かし方も変更したため、丸々カットとなった。
-うまくプログラムがまとめられなかったので、ミスの発見に時間がかかってしまったこと。
**工夫した点 [#y2fde9e8]
-最終的に缶をとっても箱をとっても先ず間のところに移動してから箱の場合は、箱を入れる位置まで移動するようにしたため、プログラムは簡略化した。
-ぶつかっただけでは、塔がうまく崩れなかったので、アームを上下させることで崩すようにした。
-物を拾うときに半円状に動くことにより、その後のライントレースをやりやすくした。
**反省点 [#ff0d78be]
-物をつかむまでのところで手間取ってしまい、物をつかんでから入れるまでのプログラムを煮詰めることができなかった。
-初期のプログラムが長くなってしまったために、調整に時間がかかってしまった。そのため時間がいくらあっても足りない状態になってしまった。
-ロボットを作ったりプログラムを組むときにもっとチームの人と話し合っておくべきだった。

  if(Message()==3){OnRev(OUT_C); Wait(35); 
                 OnRev(OUT_A); Wait(40);Off(OUT_A+OUT_C);}
  }
 }

#define line_h_l   while (Timer(0) <= 260) {if(SENSOR_1<42){OnFwd(OUT_A); OnRev(OUT_C); Wait(10);} if(SENSOR_2<42){OnFwd(OUT_C); OnRev(OUT_A); Wait(10);} else{OnFwd(OUT_C+OUT_A); Wait(10);} if((SENSOR_1<43)&&(SENSOR_2<43)){OnFwd(OUT_C); OnRev(OUT_A); Wait(40); }}
#define line_k_r   while (Timer(0) <= 260) {if(SENSOR_1<42){OnFwd(OUT_A); OnRev(OUT_C); Wait(10);} if(SENSOR_2<42){OnFwd(OUT_C); OnRev(OUT_A); Wait(10);} else{OnFwd(OUT_C+OUT_A); Wait(10);} if((SENSOR_1<43)&&(SENSOR_2<43)){OnFwd(OUT_A); OnRev(OUT_C); Wait(40); }} 
#define line_h_r_1 while (Timer(0) <= 200) {if(SENSOR_1<42){OnFwd(OUT_A); OnRev(OUT_C); Wait(10);} if(SENSOR_2<42){OnFwd(OUT_C); OnRev(OUT_A); Wait(10);} else{OnFwd(OUT_C+OUT_A); Wait(10);} if((SENSOR_1<43)&&(SENSOR_2<43)){OnFwd(OUT_C); OnRev(OUT_A); Wait(40); }} 
#define line_h_r_2 while (Timer(1) <= 70)   {if(SENSOR_1<42){OnFwd(OUT_A); OnRev(OUT_C); Wait(10);} if(SENSOR_2<42){OnFwd(OUT_C); OnRev(OUT_A); Wait(10);} else{OnFwd(OUT_C+OUT_A); Wait(10);} if((SENSOR_1<43)&&(SENSOR_2<43)){OnFwd(OUT_A); OnRev(OUT_C); Wait(40); }}
#define line_k_l_1 while (Timer(0) <= 200) {if(SENSOR_1<42){OnFwd(OUT_A); OnRev(OUT_C); Wait(10);} if(SENSOR_2<42){OnFwd(OUT_C); OnRev(OUT_A); Wait(10);} else{OnFwd(OUT_C+OUT_A); Wait(10);} if((SENSOR_1<43)&&(SENSOR_2<43)){OnFwd(OUT_C); OnRev(OUT_A); Wait(40); }} 
#define line_k_l_2 while (Timer(1) <= 70)   {if(SENSOR_1<42){OnFwd(OUT_A); OnRev(OUT_C); Wait(10);} if(SENSOR_2<42){OnFwd(OUT_C); OnRev(OUT_A); Wait(10);} else{OnFwd(OUT_C+OUT_A); Wait(10);} if((SENSOR_1<43)&&(SENSOR_2<43)){OnFwd(OUT_A); OnRev(OUT_C); Wait(40); }}  
*全体を通して [#i0917f54]
全体的には、反省する点はたくさんある。何より大きな点は、本番までに完成せず、ロボコンで一点も取ることができなかったところだ。そしてその原因は、基本的な部分の制作に時間をかけすぎてしまい、もっと大事な細かい調整にかける時間がほとんどなくなってしまったことにある。頭の中でのシミュレーションや、部分部分の動作確認は繰り返したが、肝心な全体を通した動作確認はしなかった。そこが最も反省すべき点だと考える。

int i;
int turn_time;
つまり、時間をもっと有効に使うこと、チームで作業を分担して効率化を図ること、アイデアをもっと精錬することが足りなかったのだと思う。もちろん効率アップのための工夫もしなかったわけではなかった。ロボットのアームが未完成だったときも、同時進行でライントレースのプログラムができるようにドライブべースとは別に作るなど。

task hako_l() {
  SetSensor(SENSOR_1,SENSOR_LIGHT);
  SetSensor(SENSOR_2,SENSOR_LIGHT);
  while(true){
   ClearMessage();
   ClearTimer(0);
  
    Off(OUT_A+OUT_C); Wait(400); OnRev(OUT_A+OUT_C); Wait(50);
    OnFwd(OUT_C); OnRev(OUT_A); 
    Wait(200); OnFwd(OUT_A+OUT_C); Wait(20);
    line_h_l; SendMessage(3); 
    Float(OUT_A+OUT_C); Wait(400); OnRev(OUT_A+OUT_C); Wait(50);
    OnFwd(OUT_A); OnRev(OUT_C); Wait(190);  OnFwd(OUT_A+OUT_C); Wait(300);
    Off(OUT_A+OUT_C);} }
また、アイデアについても、ひとつのアイデアに固執しすぎた節がある。もっと柔軟に、大胆に発想を変えることができればもっとよい結果を出すことができたと思う。僕たちの班は難しい方法にこだわりすぎたのだろう。これで成功すれば、ほかの班とはまったく違った方法なので、格好がよかったなと思う・・・

task hako_r() {
  SetSensor(SENSOR_1,SENSOR_LIGHT);
  SetSensor(SENSOR_2,SENSOR_LIGHT);
  while(true){
   ClearMessage();
   ClearTimer(0);
   ClearTimer(1);
  
    Off(OUT_A+OUT_C); Wait(400); OnRev(OUT_A+OUT_C); Wait(50);
    OnFwd(OUT_C); OnRev(OUT_A); 
    Wait(200); OnFwd(OUT_A+OUT_C); Wait(20);
    line_h_r_1; line_h_r_2;SendMessage(3); 
    Float(OUT_A+OUT_C); Wait(400); OnRev(OUT_A+OUT_C); Wait(50);
    OnFwd(OUT_A); OnRev(OUT_C); Wait(190);  OnFwd(OUT_A+OUT_C); Wait(300);
    Off(OUT_A+OUT_C);} }
    
task kann_r() {
  SetSensor(SENSOR_1,SENSOR_LIGHT);
  SetSensor(SENSOR_2,SENSOR_LIGHT);
  while(true){
   ClearMessage();
   ClearTimer(0);
  
    Off(OUT_A+OUT_C); Wait(400); OnRev(OUT_A+OUT_C); Wait(50);
    OnFwd(OUT_A); OnRev(OUT_C); 
    Wait(200); OnFwd(OUT_A+OUT_C); Wait(20);
    line_k_r; SendMessage(3); 
    Float(OUT_A+OUT_C); Wait(400); OnRev(OUT_A+OUT_C); Wait(50);
    OnFwd(OUT_C); OnRev(OUT_A); Wait(200);  OnFwd(OUT_A+OUT_C); Wait(450);
    Off(OUT_A+OUT_C);} }
    
task kann_l() {
  SetSensor(SENSOR_1,SENSOR_LIGHT);
  SetSensor(SENSOR_2,SENSOR_LIGHT);
  while(true){
   ClearMessage();
   ClearTimer(0);
  
    Off(OUT_A+OUT_C); Wait(400); OnRev(OUT_A+OUT_C); Wait(50);
    OnFwd(OUT_A); OnRev(OUT_C); 
    Wait(200); OnFwd(OUT_A+OUT_C); Wait(20);
    line_k_l_1; line_k_l_2; SendMessage(3); 
    Float(OUT_A+OUT_C); Wait(400); OnRev(OUT_A+OUT_C); Wait(50);
    OnFwd(OUT_C); OnRev(OUT_A); Wait(200);  OnFwd(OUT_A+OUT_C); Wait(450);
    Off(OUT_A+OUT_C);} }
    
task main() {
  SetSensor(SENSOR_1,SENSOR_LIGHT);
  SetSensor(SENSOR_2,SENSOR_LIGHT);
  
  turn_time=20;
  i=0;
  
 while(true){
   ClearMessage();
   ClearTimer(0);
  
  OnFwd(OUT_A+OUT_C);until(Message()!=0); 
  
  if((Message()==1)&&((i==1)||(i==3)||(i==5)||(i==7))) 
  {start hako_l;}
  
  if((Message()==1)&&((i==0)||(i==2)||(i==4)||(i==6)))
  {start hako_r;}
  
  if((Message()==2)&&((i==1)||(i==3)||(i==5)||(i==7))) 
  {start kann_r;}
  
  if((Message()==2)&&((i==0)||(i==2)||(i==4)||(i==6)))
  {start kann_l;}
   
  else{while(Message()!=0){OnFwd(OUT_A+OUT_C); Wait(55); 
    OnRev(OUT_A+OUT_C); Wait(50);
    OnFwd(OUT_A); OnRev(OUT_C); Wait(turn_time); 
    turn_time =turn_time+10; i=i+1;
    OnFwd(OUT_A+OUT_C); Wait(55); OnRev(OUT_A+OUT_C); Wait(50);
    OnFwd(OUT_C); OnRev(OUT_A); Wait(turn_time);
    turn_time =turn_time+10;}
     }
   } 
}
とはいえ、このアイデアで点を取ることはできたと思う。ただ、それができなかったのは十分な時間が必要であることに気づくのが遅かったからだろう。もっと早くに原型を完成させて、煮詰める作業にもっと時間をかければよかったと思う。

*ご自由にコメントをどうぞ [#h7661dc8]
#comment


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