[[2006a/C2/ロボコン]]

*プログラム紹介 [#j19e3d6c]
**プログラム内容 [#u0041896]
#hr
CENTER:COLOR(red):&size(25){ロボコン特設ページVol.2&br;};&br;
メインの輸送マシンとプログラムの説明
#hr

CENTER:製作者:伊藤 伊藤 糸島 佐藤 堀 (五十音順)

[[ルールとか>2006a/ロボコン]]
RIGHT:カウンタ&counter;
RIGHT:[[ロボティクス入門ゼミ]]
RIGHT:[[2006a/C2]]
|CENTER:BGCOLOR(white):[[1ページ>2006a/C2/ロボコン]]|CENTER:BGCOLOR(white):全体の構想、我々の,予想と結果とその原因・・・・|
|CENTER:BGCOLOR(white):[[2ページ>2006a/C2/ロボコン/No.2]]|CENTER:BGCOLOR(white):CENTER:COLOR(red):このページ|
|CENTER:BGCOLOR(white):[[3ページ>2006a/C2/ロボコン/No.3]]|CENTER:BGCOLOR(white):CENTER:COLOR(#0000FF):補助のマシン紹介のページ|

--COLOR(red):目次
#contents

&br;


*輸送ロボット [#dbd9f0d4]

|BGCOLOR(red):&ref(2006a/C2/ロボコン/No.2/VFSH0009.JPG,40%,全体図);|CENTER:''輸送ロボット''|
|~|・メインの輸送ロボット&br; &br;・缶をスタートからゴールまで運ぶ&br; &br;・四角形のアームで缶を包み込む&br; &br;・ライトセンサーを3つ持っている、これにより正確にラインをトレースできる&br; &br;・この3つの光センサーの使い方に注目|

**マシン紹介 [#p014ed5d]

|>|>|>|CENTER:''輸送ロボット''|
|&ref(2006a/C2/ロボコン/No.2/VFSH0006.JPG,40%);|>|>|・アームとタイヤが接触することを防止するために急遽パーツを取り付けた&br;&br;・ギヤ比は通常のドライブベースと同じ&br; &br;・アームが缶の重さに負けないようにしっかりと装着した &br; &br;・これ一台で缶を運ぶ&br; &br;・ライトセンサーを3つ持っている、これにより正確にラインをトレースできる&br; &br;|
|CENTER:2台並んで|CENTER:裏|CENTER:横|CENTER:前|
|&ref(2006a/C2/ロボコン/No.2/VFSH0001.JPG,35%);|  &ref(2006a/C2/ロボコン/No.2/VFSH0007.JPG,20%); |  &ref(2006a/C2/ロボコン/No.2/VFSH0010.JPG,30%);| &ref(2006a/C2/ロボコン/No.2/VFSH0008.JPG,30%);|
 

**プログラム紹介 [#u0041896]
 #define light 35
 #define light2 38
 #define straight OnRev(OUT_A + OUT_C);
 #define buck_turn OnFwd(OUT_A + OUT_C);
 #define right_turn OnRev(OUT_A);OnFwd(OUT_C);
 #define left_turn OnRev(OUT_C);OnFwd(OUT_A);
 #define right OnRev(OUT_A);Off(OUT_C);
 #define buck_right OnFwd(OUT_C);Off(OUT_A);
 #define left OnRev(OUT_C);Off(OUT_A);
 #define buck_left OnFwd(OUT_A);Off(OUT_C);
 #define off Off(OUT_A + OUT_C);
 #define up OnRev(OUT_B);
 #define down OnFwd(OUT_B);
 #define Stop Off(OUT_B);
 int count = 0;
 int count2 = 0;
 int timer = 0;
 int cm_per_s = 0;
 int metel = 0;
 int circuit = 0;
 
 task main(){
     SetSensor(SENSOR_1,SENSOR_LIGHT);
     SetSensor(SENSOR_2,SENSOR_LIGHT);
     SetSensor(SENSOR_3,SENSOR_LIGHT);
      
     while(1){
     while(count < 2){
         if((SENSOR_1 > light) && (SENSOR_2 > light) && (SENSOR_3 > light)){
             straight;
         }else if((SENSOR_1 <= light) && (SENSOR_2 > light) && (SENSOR_3 > light)){              straight;
              straight;
         }else if((SENSOR_1 <= light) && (SENSOR_2 > light) && (SENSOR_3 > light)){           
              straight;
          }else if((SENSOR_1 <= light) && (SENSOR_2 <= light) && (SENSOR_3 > light)){
              left;
          }else if((SENSOR_1 > light) && (SENSOR_2 <= light) && (SENSOR_3 > light)){
              left_turn;
          }else if((SENSOR_1 <= light) && (SENSOR_2 > light) && (SENSOR_3 <= light)){
              right;
          }else if((SENSOR_1 > light) && (SENSOR_2 > light) && (SENSOR_3 <= light)){
              right_turn;
          }else if((SENSOR_2 <= light2) && (SENSOR_3 <= light2)){
              count++;
              Wait(10);
              switch(count){
                  case 1:
                      Wait(10);
                      straight;
                      ClearTimer(0);
                      break;
                  case 2:
                      timer = FastTimer(0);
                      cm_per_s = 25 / timer;
                      metel = 8 / cm_per_s;
                      circuit = (32 / cm_per_s) * 2 - 10;
                      Wait(metel);
                      off;
                      Wait(20);
                      right_turn;
                      Wait(circuit);
                      off;
                      break;
              }
          }
      }
      straight;
      Wait((40 / cm_per_s) * 3);
      off;
      Wait(20);
      left_turn;
      Wait(circuit);
      off;
      Wait(20);
      buck_turn;
      Wait((25 / cm_per_s) * 3);
      off;
      Wait(20);
      down;
      Wait(70);
      Stop;
      Wait(20);
      straight;
      Wait((25 / cm_per_s) * 3);
      off;
      Wait(20);
      left_turn;
      Wait(circuit);
      off;
      Wait(20);
      straight;
      Wait((40 / cm_per_s) * 3);
      off;
      Wait(20);
      left_turn;
      Wait(circuit);
      off;
      Wait(20);
      straight;
      Wait((25 / cm_per_s) * 3);
      off;
      Wait(20);
      right;
      Wait(20);
      off;
      Wait(20);
      straight;
      Wait((30 / cm_per_s) * 3);
      off;
      Wait(20);
      right;
      Wait(20);
      off;
      Wait(20);
      straight;
      Wait((30 / cm_per_s) * 3);
      off;
      Wait(20);
      right;
      Wait(20);
      off;
      Wait(20);
      straight;
      Wait((25 / cm_per_s) * 3);
      off;
      Wait(20);
      left_turn;
      Wait(circuit);
      off;
      Wait(20);
      straight;
      Wait((40 / cm_per_s) * 3);
      off;
      Wait(20);
      right_turn;
      Wait((25 / cm_per_s) * 3);
      }
  }
  
**プログラム解説 [#de008a19]
***プログラム解説 [#de008a19]
-今回最終的に使用したプログラムはこのプログラムです。見ても分かると思いますが、製作途中です。つまり、大会に参加した段階ではまだ未完成だったのです。ここに準備不足が顕著に表れています。ちなみに、この形になるまでに6回ほど書き直しました。大会会場でも二回ほど書き直したのですが、今考えてみると一つのプログラムを詰めていった方が確実だったのかと思います。
-まず、このプログラムではswitch文を最初から最後まで使おうとしていました。理由としては、最初にプログラムを書くにあたって十字(三つのセンサーが同時に黒)の部分を数えていって旋回をしようと考えていたためです。そのため、if文を大量に使うよりもswitch文でケース分けした方が楽だろうと考えていたのです。
-まず、文の冒頭でif文を用いて旋回をさせています。センサーがそれぞれどのように反応したかでどちら側に旋回をするか、外輪のみを回すのか、外輪を正転・内輪を逆転させるのか、といった感じで条件をかけて旋回運動をさせようとしてみました。
-switch文のcountは全てのセンサーが黒を認識した場合のみカウントしています。これによって十字の数を認識しています。
-switch文の内部は、このプログラムでは一つめの十字(T字)は直進、二つめの十字は左に旋回をするようにしています。
-その後はcountを使って、秒指定で動かしています。
**言い訳 [#y0ce5591]

***通常走行プログラム(序盤のみ)解説 [#b3c1e152]
|条件|行動|センサー位置状況|
|SENSOR_1 > light, SEN SENSOR_2 > light, SENSOR_3 > light|straight(直進)|&ref(2006a/C2/ロボコン/No.2/case-white.JPG,50%);|
|SENSOR_1 <= light, SEN SENSOR_2 > light, SENSOR_3 > light|straight(直進)|&ref(2006a/C2/ロボコン/No.2/case1-straight.JPG,50%);|
|SENSOR_1 <= light, SEN SENSOR_2 <= light, SENSOR_3 > light|left(左輪正転のみ)|&ref(2006a/C2/ロボコン/No.2/case4-right.JPG,50%);|
|SENSOR_1 > light, SEN SENSOR_2 <= light, SENSOR_3 > light|left_turn(左輪正転、右輪逆転)|&ref(2006a/C2/ロボコン/No.2/case5-right_turn.JPG,50%);|
|SENSOR_1 <= light, SEN SENSOR_2 > light, SENSOR_3 <= light|right(右輪正転のみ)|&ref(2006a/C2/ロボコン/No.2/case2-left.JPG,50%);|
|SENSOR_1 > light, SEN SENSOR_2 > light, SENSOR_3 <= light|right_turn(左輪逆転、右輪正転)|&ref(2006a/C2/ロボコン/No.2/case3-left_turn.JPG,50%);|
|SENSOR_1 <= light, SEN SENSOR_2 <= light, SENSOR_3 <= light|switch文へ|&ref(2006a/C2/ロボコン/No.2/case6-cross.JPG,50%);|

-こんな感じで序盤は走行しておりました。本来の予定では全行程をこの走行プログラムを基盤として走らせる予定だったのですが、途中でもう訳が分からなくなって序盤以外は完全に時限式にしてしまおうという暴挙に出てしまいました。

-ちなみにセンサーの位置として、SENSOR_1が中央、SENSOR_2が右、SENSOR_3が左、となっています。

-このレポートを書いていて気がついたのですが、プログラムではleftなのに左輪を正転させている、つまり右に旋回しているんですね。つまり、左右が逆になっていることになります。それとも、プログラムを書いているときは左側に偏っているからleftと書いたのでしょうか?徹夜明けで疲れた状態のプログラミングだったのでよく覚えていません。(駄目じゃん)

-もうひとつ付け加えますと、leftのときCモーターをOnRevで正転させています。つまり、このマシンは後ろを向いて走っていたことになります。何ともめちゃくちゃなヤツだったんだな、と今更気がつかされました。

***言い訳 [#y0ce5591]
-このプログラムになるまでにはいくつかの経緯があります。
-まず最初の段階では二台のマシンが、中央まで運ぶマシン・ゴールまで運ぶマシンに分けようということになっていました。そして、このマシンはゴールまで運ぶマシンだったのです。なので、後^ゴールまで運ぶプログラムとして書いていました。ですがなかなかうまくいかず、この段階で二回ほど書き直していました。一方マシンの方は、途中でこの二台で活用するのは難しいだろうということで、このゴールを運ぶマシンのみで全てをまかなうことになりました。この判断は多分正しかったと思います。しかし、決断を下したのが大会の前日だったという点がネックでした。一度全てプログラムを書き直し(といっても基盤は同じなのですが)てプログラムを作ったのですが、どうしても間に合いませんでした。
-

-まず最初の段階では二台のマシンが、中央まで運ぶマシン・ゴールまで運ぶマシンに分けようということになっていました。そして、このマシンはゴールまで運ぶマシンだったのです。なので、このプログラムはゴールまで運ぶプログラムとして書いていました。ですがなかなかうまくいかず、この段階で二回ほど書き直していました。

-一方マシンの方は、途中でこの二台で活用するのは難しいだろうということで、このゴールを運ぶマシンのみで全てをまかなうことになりました。この判断は多分正しかったと思います。しかし、決断を下したのが大会の前日だったという点がネックでした。一度全てプログラムを書き直し(といっても基盤は同じなのですが)てプログラムを作ったのですが、どうしても間に合いませんでした。

-一番大きかったのは、やはりプログラムの書き直しです。何度も何度も書き直していたせいでなかなか進まず、いらだちながらの作業でしたし、無駄に時間を浪費してしまったという気がしてなりません。
***コメント [#w9144a1b]
#comment
----------------

|CENTER:BGCOLOR(white):[[1ページ>2006a/C2/ロボコン]]|CENTER:BGCOLOR(white):全体の構想、我々の,予想と結果とその原因・・・・|
|CENTER:BGCOLOR(white):[[2ページ>2006a/C2/ロボコン/No.2]]|CENTER:BGCOLOR(white):CENTER:COLOR(red):このページ|
|CENTER:BGCOLOR(white):[[3ページ>2006a/C2/ロボコン/No.3]]|CENTER:BGCOLOR(white):CENTER:COLOR(#0000FF):補助のマシン紹介のページ|



RIGHT:[[ロボティクス入門ゼミ]]
RIGHT:[[2006a/C2]]


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