メンバー紹介

  • 金野泰之 工学部電気電子工学科 元メガネ
  • 鈴木健太 工学部機械システム工学科 Dr.Mario

ロボットの紹介

  • 221×166,ロボットゥ
  • アームを赤外線センサーより少し前に出す工夫を行ったおかげで、缶に赤外線があたり誤作動が起きてしまう問題を解決している。またアームを何度か改良して少し遠くても取れるように作り直した。
  • アーム部分をできるだけ軽く作って、ロボットが前傾しないように工夫しました。

コース攻略法

※自分は右回り担当です

  • 870×525,コース全体
  • コースを攻略するにあたって難所が3つありました。´△魯薀ぅ鵐肇譟璽垢できず、は缶を正確に置けず悩みました。以下は自分なりの解決法です。
  • 428×288,1
  • 416×288,wa
  • 注意点のように私が書いたプログラムでは鋭角の交差点は直進できるが鈍角の交差点は出来ませんので、注意点の上の図のように,魯薀ぅ鵐肇譟璽垢鮃線の右側から黒線の左側に切り替えることで問題を解決しています。
  • 429×288,2
  • △廊,汎瑛猶坡冑分だけを通るよう左右切り替えを行いました。ちなみにこの切り替えはタイマーを使ってやっています。そのため動作が少し不安定でした。
  • 429×288,3
  • は缶を置くためだけの工夫です。どうやって正確に缶を置かせるか悩んだ末、カウンタを使うことにしました。図の赤い点付近からカウンタを起動させ(これもタイマーで)、赤い点以降に交差点が一個でもあればカウントさせるというものです。そうすれば青い円から置く場所までにかかる時間を走らせれば置けると思ったのです。つまり青い円の交差点(どちらかというとT字路)をカウントし、180°回転させ缶を置く位置までライントレースさせる(タイマーで)ということです。そうして缶を置くという難所を解決しました。

プログラムの説明

#define zone1 37
#define zone2 45
#define zone3 60
#define zone4 65
#define zensin OnFwd(OUT_BC,40) //前進します
#define sasetu OnFwd(OUT_B,40);Off(OUT_C) //左折します
#define kyuusasetu OnFwd(OUT_B,40);OnRev(OUT_C,35) //左旋回します
#define usetu OnFwd(OUT_C,40);Off(OUT_B) //右折します
#define kyuuusetu OnFwd(OUT_C,40);OnRev(OUT_B,35) //右旋回します
#define STEP 1
#define nMAX 200
#define short_break Off(OUT_BC);Wait(1000);
task main ()
{
   SetSensorLight(S3);
   int nOnline=0;
   long t0 = CurrentTick();
   int n=0;
  • ↑前進するときはzensin右折はusetuなどわかりやすく定義しました。
       while (CurrentTick()-t0 <= 6000) {  //最初の6秒間は黒なら右、白なら左のライントレース
           if (SENSOR_3 < zone1) {
               kyuuusetu;
           } else if (SENSOR_3 < zone2) {
               usetu;
           } else if (SENSOR_3 < zone3) {
               zensin;
           } else if (SENSOR_3 < zone4) {
               sasetu;
           } else {
               kyuusasetu;
           }
          Wait(STEP);
       }
          OnRev(OUT_A,50);Wait(500);Off(OUT_A); //缶を掴みます
  • ↑このwhile節では缶を掴むまでライントレースをさせています
   while (CurrentTick()-t0 <= 18000) {
       while(nOnline < nMAX && CurrentTick()-t0 <= 18000) { //nOnlineがnMAXを超える、もしくは18秒以上たったらこのwhile節をやめる。
           if (SENSOR_3 < zone1) {
           kyuuusetu;
           nOnline++;
     } else {
         if (SENSOR_3 < zone2) {
           usetu;
       } else if (SENSOR_3 < zone3) {
           zensin;
       } else if (SENSOR_3 < zone4) {
           sasetu;
       } else {
           kyuusasetu;
         }
       nOnline=0;
       }
      Wait(STEP);
   }
   kyuusasetu;Wait(nMAX*STEP);
   OnFwd(OUT_BC,40);Wait(200);
   nOnline=0;
 }sasetu;Wait(100);
  • ↑18秒後のライントレースの左右切り替え、つまり「プログラムの説明」の,里燭瓩離廛蹈哀薀爐任后&&(論理積)を使う発想に中々気づけず苦悩しました。18秒は何度も測って設定しました。
   while (CurrentTick()-t0 <= 34000) {
       while(nOnline < nMAX && CurrentTick()-t0 <= 34000) {
           if (SENSOR_3 < zone1) {
           kyuusasetu;
           nOnline++;
     } else {
         if (SENSOR_3 < zone2) {
           sasetu;
       } else if (SENSOR_3 < zone3) {
           zensin;
       } else if (SENSOR_3 < zone4) {
           usetu;
       } else {
           kyuuusetu;
         }
       nOnline=0;
       }
      Wait(STEP);
   }
   kyuuusetu;Wait(nMAX*STEP);
   OnFwd(OUT_BC,40);Wait(200);
   nOnline=0;
 }usetu;Wait(200);
  • ↑⇒僂while節です。,任論睫世鮠覆ましたが、while節の下に「usetu;Wait(200);」と入れることで左右切り替えの失敗を軽減しています。
       while (CurrentTick()-t0 <= 40000) {
           while(nOnline < nMAX && CurrentTick()-t0 <= 40000) {
               if (SENSOR_3 < zone1) {
               kyuuusetu;
               nOnline++;
         } else {
             if (SENSOR_3 < zone2) {
               usetu;
           } else if (SENSOR_3 < zone3) {
               zensin;
           } else if (SENSOR_3 < zone4) {
               sasetu;
           } else {
               kyuusasetu;
             }
           nOnline=0;
           }
          Wait(STEP);
       }
       kyuusasetu;Wait(nMAX*STEP);
       OnFwd(OUT_BC,40);Wait(200);
       nOnline=0;
     }
  • ↑これはの図で言う赤印の手前までのプログラムです。赤印を超えると次のwhile節に移ります。これも時間で切り替えているので早く行き過ぎると失敗します。だいたい40秒ぐらいが失敗しない(赤印で切り替えてくれる)値でした。
   while (n<2) {
       while(nOnline < nMAX && n<2) {
           if (SENSOR_3 < zone1) {
           kyuuusetu;
           nOnline++;
     } else {
         if (SENSOR_3 < zone2) {
           usetu;
       } else if (SENSOR_3 < zone3) {
           zensin;
       } else if (SENSOR_3 < zone4) {
           sasetu;
       } else {
           kyuusasetu;
         }
       nOnline=0;
       }
      Wait(STEP);
   }
   kyuusasetu;Wait(nMAX*STEP);
   OnFwd(OUT_BC,40);Wait(200);
   nOnline=0;n++;
 }
  • ↑赤印から青い円までのプログラムで、見ての通りカウンタを使って青い円(T字路)をカウントさせています。カウントすると缶を置く位置に移動するプログラムが作動します。
       OnRev(OUT_BC,50);Wait(500);
       OnFwd(OUT_C,50);OnRev(OUT_B,50);Wait(300);
       OnFwd(OUT_C,50);OnRev(OUT_B,50);until(SENSOR_3 < 50);
       long t1 = CurrentTick();
  • ↑ここは180°旋回させるだけのプログラムなので、上の行からざっくりと説明します。ちょっと後ろに下がる→白い部分まで時計回りに回転させる(90°ぐらいまで)→赤外線センサーを使って黒線までそのまま時計回りの回転(正確に180°回転させるため)
         while (CurrentTick()-t1 <= 1800) {
           if (SENSOR_3 < zone1) {
               kyuusasetu;
           } else if (SENSOR_3 < zone2) {
               sasetu;
           } else if (SENSOR_3 < zone3) {
               zensin;
           } else if (SENSOR_3 < zone4) {
               usetu;
           } else {
               kyuuusetu;
           }
          Wait(STEP);
       }
  • ↑缶を置く場所までライントレース(時間を測りまくった結果、だいたい1.8秒)
       usetu;Wait(270);Off(OUT_BC);
       OnFwd(OUT_A,50);Wait(300);Off(OUT_A);
       OnRev(OUT_BC,50);Wait(400);
       OnFwd(OUT_B,50);OnRev(OUT_C,50);Wait(300);
       OnFwd(OUT_B,50);OnRev(OUT_C,50);until(SENSOR_3 < 50);
       long t2 = CurrentTick();
  • ↑ここも缶をおいた後缶を倒さないように180°旋回させるだけです。上の行から、少し「usetu」させてロボットをまっすぐにさせる→アームを開いて缶を置く→少しバック→さっきと同様に180°旋回
           while (CurrentTick()-t2 <= 3900) {
           if (SENSOR_3 < zone1) {
               kyuuusetu;
           } else if (SENSOR_3 < zone2) {
               usetu;
           } else if (SENSOR_3 < zone3) {
               zensin;
           } else if (SENSOR_3 < zone4) {
               sasetu;
           } else {
               kyuusasetu;
           }
          Wait(STEP);
       }
       Off(OUT_BC);
    }
  • ↑普通にライントレースをして出口から出てってもらってます。

まとめ

  • ロボット本体を重くしすぎたせいで動作に安定性がなくなり、同じプログラムでも日によって成功率が変わった。これには電池への考慮が欠けていたこともあり次回の課題までにしっかりと反省しておきたいところである。今回は数値を変えて対処したが今後はそのことを考慮したプログラムが必須である。また一番重いCPUを少し上に設置しすぎたため動きがぶれてしまったことも注意したい。

次回の課題で大切にしたいこと

  • ロボットの軽量化
  • 電池の残量に左右されないプログラムの作成
  • 出来るだけ協力して課題を攻略する
  • プログラムよりもロボットの構造
  • 重いものは下に

添付ファイル: fileダウンロード.jpg 289件 [詳細] fileロボ資料1.png 312件 [詳細] fileロボkdfなs.png 310件 [詳細] fileろぼgdn.png 318件 [詳細] fileろのじょ.png 317件 [詳細] filegajga.png 309件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2013-07-12 (金) 15:02:54