2007b/A1/ロボコン


ロボコン

目次

目的

プログラミングやロボットを1から考案、創意工夫して課題を克服することで今まで授業の中で培ってきたことを用い、この授業のまとめをする。

課題内容

簡単にいうとテニスボールをスタートからゴールまで運ぶという課題です。 詳しいルールや、フィールドの概要については下記のリンク先を参照のこと。 課題:ボール運搬ロボット

ロボット

ロボットの概要,特徴

我々は2台のロボットを作成し、ボールの受け渡しを行い通信機能を用いることで2台のロボットが連携して動くことが最大の特徴です。 個々のロボットの特徴を見てみましょう。

  • 前半のロボットはスタート地点からボールを出し中継地点まで運ぶ所を担います。 このロボットは内部が空洞でありまたフロント部分が開閉式になっています。 これにより内部にボールを入れられることでボールを運びやすくしています。
    Image3091-2.jpg
Image3121-1.jpg
Image3151-1.jpg
  • 後半のロボットは中継地点からボールを受け取りゴールまで運びゴール地点にボールを入れるところまでが仕事です。 後半ロボットは前半ロボットからの指令がきて初めて動きます。このロボはライントレースをしながらゴール地点まで動きます。アームが上からボールを引きずり込む形になるので前半ロボットのボールの出し方が多少甘くてもしっかりボールを受け取れるのが特徴です。
    Image3191-1.jpg
Image3201-1.jpg
Image3211-1.jpg
Image3181-1.jpg

プログラム

前半のロボットのプログラム

前半のロボットのプログラムは、

#define MOVE 5     //通信機能の値を5に設定
task main()
{
    OnFwd(OUT_A);
    OnRev(OUT_C);
    Wait(100);     //前進
    OnRev(OUT_A);
    OnFwd(OUT_C);
    Wait(50);     //後退
    Off(OUT_A+OUT_C);     //停止
    OnRev(OUT_B);
    Wait(100);     //扉を上げる
    OnFwd(OUT_A);
    OnRev(OUT_C);
    Wait(200);     //前進
    OnFwd(OUT_B);
    Wait(100);     //扉を下げる
    Off(OUT_B);    
    OnRev(OUT_A);
    OnFwd(OUT_C);
    Wait(5);     //後退
    OnFwd(OUT_A+OUT_C);
    Wait(200);     //右へ方向転換
    OnFwd(OUT_A);
    OnRev(OUT_C);
    Wait(50);     //前進
    Off(OUT_A+OUT_C);     //停止
    OnRev(OUT_B);
    Wait(100);     //扉を上げる
    Off(OUT_B);
    Wait(50);
    OnRev(OUT_A);
    OnFwd(OUT_C);
    Wait(110);     //後退
    Off(OUT_A+OUT_C);
    OnFwd(OUT_B);
    Wait(100);     //扉を下げる
    OnFwd(OUT_A);
    OnRev(OUT_C);
    Wait(300);     //前進
    OnRev(OUT_A);
    OnFwd(OUT_C);
    Wait(100);     //後退
    OnFwd(OUT_A+OUT_C);
    Wait(150);     //右へ方向転換
    Off(OUT_A+OUT_C+OUT_B);
    SendMessage(MOVE);     //通信を送る
}

このプログラムは単純でライントレースやタッチセンサーを用いていません。実は当初の予定では開閉部分に光センサーをつけてライントレースする形やタッチセンサーを用いた構造を考えていましたが、ライントレースする距離が短く、また狭いためこのプログラムが一番ベストであるということで廃案になりました。

後半のロボットのプログラム

後半のロボットのプログラムは、

  #define MOVE 5         //MOVE 5 というメッセージを定義
  task main()
   {      
     SetSensor(SENSOR_1, SENSOR_LIGHT);     //光センサ−1を設置
     SetSensor(SENSOR_3, SENSOR_LIGHT);     //光センサー3を設置
     ClearMessage();    //以前のメッセージを消去
     until (Message() == MOVE);    //MOVE というメッセージを受け取ってから以下の動きをする。
     OnRev(OUT_B);Wait(60);Off(OUT_B);     //アームを0.60秒間上げて止める。
     while(true)                                                               //以下の動作を繰り返す。
     {
         if(SENSOR_1>38)                                                //もしセンサー1(左)が白を感知し、
           {
             if(SENSOR_3>40)                                                     //a,センサー3(右)も白を感知した時
                {
                OnFwd(OUT_A+OUT_C);                                                       //前進をする。
                }
             if(SENSOR_3<40)                                                     //b,センサー3(右)が黒を感知した時
                {
                OnFwd(OUT_A);OnRev(OUT_C);                                          //右に進路を修正する。
                }
           }     
         if(SENSOR_1<38)                                                 //もしセンサー1(左)が黒を感知し、
           {
             if(SENSOR_3>40)                                                      //a,センサー3(右)が白を感知した時
                {
                OnRev(OUT_A);OnFwd(OUT_C);                                           //左に進路を修正する。
                }
             if(SENSOR_3<40)                                                      //b,センサー3(右)も黒を感知した時
                {
                OnFwd(OUT_A+OUT_C);Wait(50);                                                 //0.50秒間前進する。
                OnFwd(OUT_A);OnRev(OUT_C);Wait(50);                                     //0.50秒間反時計回りに回転する。
                OnFwd(OUT_A+OUT_C);Wait(90);                                                 //0.90秒間前進する。
                OnRev(OUT_C);Wait(50);Off(OUT_C);                                            //さらに0.50秒間反時計回りする。*
                OnFwd(OUT_A+OUT_C);Wait(200);                                               //2.00秒間前進する。
                OnFwd(OUT_B);Wait(60);Off(OUT_B);                                            //アームをあげる。
                OnFwd(OUT_A+OUT_C);Wait(150);                                               //1.50秒間前進する。
                Off(OUT_A+OUT_C);                                                              //停止する。
                }
           }
      }
  }

* これはより正確にロボット本体がゴールの三角形の枠に入るための調整の役割を果たしています。

挟み込むタイプのライントレースのプログラムが主です。今回の場合、コースもそれほど複雑ではなかったので比較的うまくいきました。しかし、ゴール直前以外にて両方が黒と判断してしまうと修正できないのが難点です。このことについては苦労した点でも述べます。

結果

1,2回目は前半のロボットが上手く中継地点にボールを運べず連携を見せられずに終わってしまいました。3回目は前半のロボットも後半のロボットもしっかり連携してボールをゴール近くに運ぶことができました。しかし、ボールを離すタイミングが 早すぎてギリギリ入りませんでした。本番前には9割近く入っていただけに残念です。

課題を遂行させるにあたって苦労した点,失敗した点

  • 前半のロボットは前述した通り単純なプログラムですがその分修正が利かないので失敗する確率が高いという点が難点でした。
  • 後半のロボットでは最初光センサーの感度が違いすぎライントレースがうまくいかなかったのですが閾値をそれぞれ個別に設定することですぐに解決しました。また、赤外線センサーの位置が逆で1からロボットを組み直さなくてはならなかったりなどもありました。
  • レポート段階の話なんですが写真をアップロードできなくなってしまいました。

感想

  • 07T2045A  時間も遅くまで残らないといけないし、たくさんの時間を取られてしまって大変だったけど、とても楽しく受講することができたので、とても満足しています。
  • 07F6015K たいき  この授業ではロボット作るだけでなくプログラミングも作るということで、非常に大変でした。特に最初の方はプログラミングでかなりの時間がかかってました。しかし、慣れてくれば楽しくなってくるもので、最後のロボコンなどではどうすれば課題をクリアできるか考えるのも大変ながらなかなか面白かったです。とにかく楽しかったので良かったです。
  • 07A1026C まもの感想  最初は何かリモコンでロボを操作するのもだと思い込んでました(笑)ロボを作るのはマジ楽しかった!! ロボコンの作品ではLEGOみたいなノリでちょっとこだわってみました!たくさん遊ばせてもらいました。
  • 07T1009J ちなり  このゼミでLEGOはなかなか侮れない存在だということを痛感しました。プログラミングも、どこが間違っているのか,なぜ思い通りに動いてくれないのか,etc...といった感じでこれまた難航しました。が、LEGOは組み方次第で様々な応用ができ、いろんな動作を行えたので、全体的に見てもとても面白かったです。

コメントをお願いします。



添付ファイル: fileImage3191-1.jpg 251件 [詳細] fileImage3211-1.jpg 234件 [詳細] fileImage3201-1.jpg 255件 [詳細] fileImage3181-1.jpg 238件 [詳細] fileImage3151-1.jpg 261件 [詳細] fileImage3121-1.jpg 264件 [詳細] fileImage3091-2.jpg 257件 [詳細] fileImage3091-1.jpg 137件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2008-02-09 (土) 12:49:15 (4215d)