2009a

ロボコンのルール

  • 基本ルール
    • 開始から5秒以内に始め、審判が続行不能と判断、あるいはリタイアするまで続ける。一回限り再スタートできる。
    • スタート時のロボットは1つで開始し(スタート後はいくつに分裂してもかまわない)。 、スタート地点からはみ出てはいけない。
    • 競技終了時点で、運んだ紙パックにロボットの一部が触れていてはならない。触れている場合は、その紙パックは加算しない。
  • 基本得点の計算方法
    • それぞれの色につき、1個目は2点、2個目は4点、3個目は8点とする。(満点は28点)
    • 間違った色の紙パックが1個混入されている場合は、その色の紙パックの合計点を半分にする。2個混入されている場合は、1/4の得点にする。
      • 仮に白枠に白の牛乳パックが3つと緑の牛乳パックが1つあり緑枠に緑の牛乳パックが2つある場合は白枠で2+4+8=14点 緑枠で(2+4)/2=3点 計17点となる。の?

ロボコンの概要

  • 課題 紙パックを収集して色ごとに別の目的地まで運ぶ
    robocon2009a-1[1].png
  • フィールドの説明
    • フィールドは約160cm×110cm
    • 運搬する500mlの紙パック(以下単に紙パックと呼ぶ)は約7cm×7cm×10.3cm
    • 紙パックはすべての面に白あるいは緑色の画用紙がはられている
    • スタート地点の壁、中央の壁、ゴール近くの障害壁の断面は約89mm x 38mm
    • 目的地の正方形の3辺は19mm×19mmの角材で仕切られている
    • 黒い線の太さは約25mm

ロボットの製作

  • 方向性・・・2台のロボの連係プレーでなんとかする
  • ロボット本体の作成
    • 一号機  二号機を壁の向こう側へと運ぶ役割を持ったロボ。以外と早く完成しあまりいじられていない  こいつが牛乳パックを二号機の方へと落とす役割も兼ねる
      090804_162233.jpg
      上に二号機を乗せるためなんだかペタンとしている くっついている棒で牛乳パックを落とす
    • 二号機  牛乳パックを受け取りなんやかんやして枠の中へと投げ込むロボ
      IMGP1775.JPG
      牛乳パックを受け取る部分 何度か変更したがこの形に落ち着く
      IMGP1777.JPG
      モーター付近、遠心力でアームが抜けないように固定。
      IMGP1776.JPG
      実際に受け取ってみたw
      IMGP1779.JPG
      IMGP1780.JPG
      IMGP1781.JPG
      どんな角度でもおk

プログラム紹介

  • 一号機(土台となってパックを落とす)
    #define R OnFwd(OUT_C);OnRev(OUT_A);Wait(100);Off(OUT_A+OUT_C);     //右に曲がる動きを定義する
    #define L OnFwd(OUT_A);OnRev(OUT_C);Wait(100);Off(OUT_A+OUT_C);     //左に曲がる動きを定義する
    #define turn_R(t) OnFwd(OUT_C);Wait(t);Off(OUT_C);         //右に曲がる時間
    #define turn_L(t) OnFwd(OUT_A);Wait(t);Off(OUT_A);         //左に曲がる時間
    #define go(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 line_g if ( SENSOR_1>BORDER){if(SENSOR_3>BORDER){OnFwd(OUT_A+OUT_C);}else{OnFwd(OUT_A);OnRev(OUT_C)  ;}}else{if(SENSOR_3>BORDER){OnRev(OUT_A);OnFwd(OUT_C);}}
    #define line_b if ( SENSOR_1>BORDER){if(SENSOR_3>BORDER){OnRev(OUT_A+OUT_C);}else{OnRev(OUT_A);OnFwd(OUT_C); }}else{if(SENSOR_3>BORDER){OnFwd(OUT_A);OnRev(OUT_C);}}
    #define wait(t) Off(OUT_A+OUT_C);Wait(t);
    #define BORDER 44
    #define SIGNALON_J 11    //2号機から受け取るメッセージ
    #define SIGNALOFF_J 12       //2号機から受け取るメッセージ
    #define SIGNALON_S 13        //2号機から受け取るメッセージ
    #define tuusin_on SendMessage(SIGNALON_S);
    #define tuusin 
    int RUN_TIME;
    int RUN_TIME1;
     
    task main(){
    SetSensor(SENSOR_1,SENSOR_LIGHT);  //光センサーを認識させる
    SetSensor(SENSOR_2,SENSOR_TOUCH);    //タッチセンサーを認識させる
    SetSensor(SENSOR_3,SENSOR_LIGHT);    //光センサーを認識させる
    RUN_TIME==80;
    RUN_TIME1==35;
    ClearMessage();
    go(100) ;        //スタート地点から2号機を下ろすところまでの移動
    turn_L(270); 
    go(210);
    turn_L(270);
    go(190);
    turn_R(320);
    OnFwd(OUT_A+OUT_C);
    until(SENSOR_2==1);   //タッチセンサーが反応したら2号機を下ろす
    Off(OUT_A+OUT_C);
    
    
    Wait(1200);    //2号機が下りるのを待つ
    back(150);    //下がって向きを変え、パックを落とす動作へ
    turn_R(270);
    go(100);
    
    until(Message()==12);  //2号機からメッセージ12を受けたら前に進みパックを落とす
    go(100);
    
    until(Message()==13);    //2号機からメッセージ13を受けたら前に進みパックを落とす
    go(100);
    until(Message()==14);    //2号機からメッセージ14を受けたら後ろに下がってパックを落とす
    back(400);
    
    until(Message()==15);    //2号機からメッセージ15を受けたら後ろに下がってパックを落とす  
    back(100);
    
    until(Message()==16);    //2号機からメッセージ16を受けたら後ろに下がってパックを落とす
    back(100);
  • 二号機(パックを運ぶ方)
    #define R OnFwd(OUT_C);;Wait(80);Off(OUT_C);   //右に90度旋回する
    #define L OnFwd(OUT_A);;Wait(80);Off(OUT_A);   //左に90度旋回する
    #define turn_R(t) OnFwd(OUT_C);OnRev(OUT_A);Wait(t);Off(OUT_A+OUT_C); //決められた時間右に曲がる
    #define turn_L(t) OnFwd(OUT_A);OnRev(OUT_C);Wait(t);Off(OUT_A+OUT_C);  //決められた時間左に曲がる
    #define go(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 wait(t) Off(OUT_A+OUT_C);Wait(t);
    #define arm OnRev(OUT_B);Wait(20);Off(OUT_B);Wait(50);OnFwd(OUT_B);Wait(20); //パックをゴールに投げる動き
    #define BORDER 47
    #define SIGNALON_1 11      //1号機メッセージを送る
    #define tuusin_on_1 SendMessage(SIGNALON_1);  
    #define SIGNALOFF_1 12     //1号機メッセージを送る
    #define tuusin_off_1 SendMessage(SIGNALOFF_1);
    #define SIGNALON_2 13     //1号機メッセージを送る
    #define tuusin_on_2 SendMessage(SIGNALON_2);
    #define SIGNALOFF_2 14     //1号機メッセージを送る
    #define tuusin_off_2 SendMessage(SIGNALOFF_2);
    #define SIGNALON_3 15      //1号機メッセージを送る
    #define tuusin_on_3 SendMessage(SIGNALON_3);
    #define SIGNALOFF_3 16     //1号機メッセージを送る
    #define tuusin_off_3 SendMessage(SIGNALOFF_3);
    #define SIGNALON_4 17     //1号機メッセージを送る
    #define tuusin_on_4 SendMessage(SIGNALON_4);
    #define SIGNALOFF_4 18      //1号機メッセージを送る
    #define tuusin_off_4 SendMessage(SIGNALOFF_4);
    task main(){
    SetSensor(SENSOR_1,SENSOR_LIGHT);
    SetSensor(SENSOR_2,SENSOR_TOUCH);
    SetSensor(SENSOR_3,SENSOR_LIGHT);
    Off(OUT_A+OUT_C);
    Wait(2200);
    go(160);   //1号機が所定の位置にきたら発進
    wait(100);
    back(60);
    wait(100); 
    turn_R(45);
    Off(OUT_A+OUT_C);
    Wait(20);
    go(100);
    Off(OUT_A+OUT_C);
    Wait(20);
    turn_R(45);
    Off(OUT_A+OUT_C);
    Wait(20);
    go(80);
    Off(OUT_A+OUT_C);
    Wait(500);     //直進と90旋回を繰り返し右側の一番近い白のパックのところに行く
    tuusin_on_1;
    wait(200);
    tuusin_off_1; //パックを落とすメッセージを送る
    back(80);
    Off(OUT_A+OUT_C);
    Wait(20);
    turn_R(100);
    Off(OUT_A+OUT_C);
    Wait(20);
    go(110);
    Off(OUT_A+OUT_C);
    Wait(20);
    arm;     //白のゴールに入れる
    back(140);
    Off(OUT_A+OUT_C);
    Wait(20);
    Off(OUT_A+OUT_C);
    Wait(20);
    go(80);
    Off(OUT_A+OUT_C);
    Wait(20);
    turn_R(45);
    Off(OUT_A+OUT_C);
    Wait(20);
    go(40);
    Off(OUT_A+OUT_C);    //直進と90旋回を繰り返し右側の次の緑のパックのところに行く
    tuusin_on_2;
    wait(200);
    tuusin_off_2;     //パックを落とすメッセージを送る
    back(40);
    Off(OUT_A+OUT_C);
    Wait(20);
    turn_R(45);
    Off(OUT_A+OUT_C);
    Wait(20);
    go(200);
    Off(OUT_A+OUT_C);
    Wait(20);
    turn_R(45);
    Off(OUT_A+OUT_C);
    Wait(20);
    go(130);
    Off(OUT_A+OUT_C);
    Wait(20);
    arm;      //緑のゴールに入れる
    back(130);
    turn_R(100);
    go(80);
    Off(OUT_A+OUT_C);    //直進と90旋回を繰り返し左側の一番近い緑のパックのところに行く
    tuusin_on_3;
    wait(200);
    tuusin_off_3;      //パックを落とすメッセージを送る
    back(80);
    turn_R(110);
    go(170);
    arm;    //白のゴールに入れる
    back(170);
    turn_L(55);  
    go(80);
    turn_R(55);
    go(80);
    Off(OUT_A+OUT_C);   //直進と90旋回を繰り返し左側の次の白のパックのところに行く
    tuusin_on_4;
    wait(200);
    tuusin_off_4;       //パックを落とすメッセージを送る
    back(80);
    turn_L(110);
    go(260);
    turn_L(70);
    go(170);
    arm;    //緑のゴールに入れる
    back(80);
    }
}

考察と感想

  • ロボの製作が終わりプログラムに取りかかってみたのはいいが、何度やっても思い通りにいかずギリギリまでやってた
  • 2号機の車体が少しおおき過ぎてタイヤが壁に当たってしまい端のパックを受け取ることができなくなってしまった。
  • 時間がもう少しあれば車体をもっとコンパクトに出来たが全体的に時間をうまく使えずロボコンでも2号機を送りだすところまでしかできなかった

コメント欄

  • コメントをお願いします
  • プログラムに説明を入れましょう -- FI? 2009-08-12 (水) 21:17:20


添付ファイル: file090804_162233.jpg 238件 [詳細] fileIMGP1787.JPG 151件 [詳細] fileIMGP1786.JPG 130件 [詳細] fileIMGP1784.JPG 127件 [詳細] fileIMGP1783.JPG 140件 [詳細] fileIMGP1782.JPG 144件 [詳細] fileIMGP1781.JPG 226件 [詳細] fileIMGP1780.JPG 229件 [詳細] fileIMGP1779.JPG 235件 [詳細] fileIMGP1778.JPG 136件 [詳細] fileIMGP1777.JPG 238件 [詳細] fileIMGP1776.JPG 268件 [詳細] fileIMGP1775.JPG 227件 [詳細] filerobocon2009a-1[1].png 240件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2009-08-13 (木) 11:15:44 (3659d)