2009a/MemberOnly/進行状況A

目次

課題

懐中電灯に向かって、白いホイールを投げる以下のプログラムを作成せよ。BY BOSS松本

(1) 全方向から懐中電灯の方向を探しだし、懐中電灯を狙ってブロックを投げる。懐中電灯は動かさないが、いろいろな距離や方向にある懐中電灯に対応できるロボットにすること。

(2) 懐中電灯をゆっくり動かしたとき懐中電灯に向かって進み、懐中電灯の動きを止めれば一定の距離(懐中電灯から30cm以上離れた距離)まで近づいて懐中電灯を狙ってブロックを投げる。

(3)懐中電灯を動かしたとき懐中電灯に向かって進み、見失った時には再び全方向から懐中電灯を探しだす。7秒以上追尾できたら懐中電灯に向かってブロックを投げる。

ロボットの紹介

  • 投げる部分
090710_1648~0001.jpg

ホイールを投げる形に作るのがとても大変でした。

  • 車輪部
090710_1730~0001.jpg
090710_1730~0002.jpg

前輪をつけるとうまく進まなくなりブレーキがかかってしまい、前輪をとると重心が前にいってしまい、ブロックでブレーキがかかってしまった。 試行錯誤の結果、前輪をつけることにし、前輪部分を修正することによってスムーズに進めるようにした。

  • 本体
090710_1649~0001.jpg
090710_1649~0002.jpg

今回のロボットは見た目が不細工になってしまったが、課題を達成するという目的を優先したので、そこは目をつぶっていただきたい。

プログラム

  • 課題3(1)(制作者 まさと)
#define THROW 50   //ブロックを投げるときの光の値を50に設定
task main()
{
SetSensor(SENSOR_1, SENSOR_LIGHT);  //センサー1をライトセンサーとする
SetPower(OUT_C,4); //モーターCのパワーを4に設定
int light_max=0;
int t_max=0;
SetSensor(SENSOR_1,SENSOR_LIGHT); //一番明るい方向を探し出す
ClearTimer(0);
OnFwd(OUT_C);
while ( Timer(0)<70){
if(SENSOR_1>light_max){
light_max=SENSOR_1;
t_max=Timer(0);
}
}
Off(OUT_C);
Wait(20);
OnFwd(OUT_C);
Wait(t_max);
Off(OUT_C);
while(SENSOR_1<THROW){  //明るくなるまで近づく
OnFwd(OUT_C);
Wait(10);
OnRev(OUT_C);
Wait(10);
} 
if(SENSOR_1 >THROW)  //定めた値より大きくなったらブロックを投げる
{
Off(OUT_C);
Wait(10);
OnFwd(OUT_A);
Wait(15);
OnRev(OUT_A);
Wait(3);
Off(OUT_A);
break;  //ブロックを投げたら止まる       
Off(OUT_A+OUT_C);
}
}
}
  • 課題3(2)(制作者 SYO)
 #define THERESHOLD 50 //光を追う動作で用いる闘値
 #define THROW 60 //ブロックを投げる動作で用いる闘値
 
 task main ()
{
    SetSensor(SENSOR_1,SENSOR_LIGHT); //センサー1は光学センサー
    SetSensor(SENSOR_3,SENSOR_LIGHT); //センサー3は光学センサー
    while(SENSOR_3<=THRESHOLD){ //ロボットが光源にある程度まで近づくまで繰り返す
         if (SENSOR_1<THERESHOLD){
              if (SENSOR_3<THERESHOLD){
                   OnRev(OUT_A);
              } else {
                   OnFwd(OUT_A);
              }
         }
    }
//センサー1,3が規定値(THROW)より大きくなったらブロックを投げて止まる//
       if((SENSOR_1> THROW)&&(SENSOR_3> THROW)){
       Off(OUT_C);
               Wait(10);                 
              OnFwd(OUT_A); //投げる
              Wait(15);
              OnRev(OUT_A);
              Wait(3);
              Off(OUT_A);
              Wait(3)
              Off(OUT_A+OUT_C);  //終わる
         }
}
  • 課題3(3)(制作者 MOMO)
#define THRESHOLD 50 //光の値を定義
#define THROW 60
task main()
{
   SetSensor(SENSOR_1,SENSOR_LIGHT); //センサー1,3をライトセンサーに設定
   SetSensor(SENSOR_3,SENSOR_LIGHT);
   SetPower(OUT_C,4); //モーターCのパワーを4に設定 
clear_timer(1)
while(Timer(1)<700){    //7秒間繰り返す
if((SENSOR_1>THRESHOLD)&&(SENSOR_3>THRESHOLD)){
OnFwd(OUT_C);  //両方のセンサーの明るさが規定値(THRESHOLD)より大きいとき前進
Wait(20);
OnRev(OUT_C);
Wait(20);
if((SENSOR_1>THRESHOLD)&&(SENSOR_3<THRESHOLD)){ //センサー1のみ規定値より大きいとき左回転して明るくなるところを探す
OnFwd(OUT_C);
Wait(50);
}
if((SENSOR_1>THROW)&&(SENSOR_3<THROW)){   //両方のセンサーの明るさが規定値(THROW)より大きいとき停止
Off(OUT_C);
}
else{  //それ以外のとき右回転して明るくなるところを探す
OnRev(OUT_C);
Wait(50); 
}
}
Off(OUT_C);   //7秒後ブロックを投げる
Wait(10);
OnFwd(OUT_A);
Wait(15);
OnRev(OUT_A);
Wait(3);
Off(OUT_A);
break;  //ブロックを投げたら止まる       
Off(OUT_A+OUT_C);
}
}
}

工夫、がんばった点

・ホイールをうまく遠くに飛ばすために、投げる部分を改良し、上の写真にある通りに仕上げました。

・タイヤを動かすためのモーターを1つにしなければならないという規定があったので、ロボット作りがとても大変でした。電池を入れる部分やモーターはとても重いので、一つのモーターのパワーでは負担が大きく、動くようにするのが大変でした。

感想

今回の課題は前回に比べてBoss松本のヒントなどがあり、比較的やりやすかった。 しかしプログラムは、前回に引き続き苦戦を強いられたが、先輩などのプログラムを参考になんとか仕上げることができた。

コメント欄

ご自由にどうぞ^^

  • プログラムで気になる点をいくつか。まさとさんのプログラムは、インデントを入れていただかないとどうにも読みづらすぎます。「#define THRESHOLD 45 //光の値を50に設定」←もなぞです。(45?50?) SYOさんのプログラムは、「//センサー1が規定値より小さく、センサー3が大きいとき右回転//」のときのif文の式の不等号が違うような…?また、「センサー1,3が規定値より小さいとき」は何も起こらないままになってしまう気がします。 MOMOさんのプログラムは、7秒後であるということをどのように判定しているのでしょうか?また、elseの処理が{}でくくられていないのも気になります。 -- こさか? 2009-07-23 (木) 22:07:20
  • •松本先生曰く、今回の課題は絶対的に明るい方向を探すのではなく、変数を用いて相対的に最も明るい方向を探す課題だそうです。つまり、一つ目のプログラムだと、懐中電灯に近い方向にも投げてしまう恐れがあります。また、細かいミスも本質的なミスもある気がするのでチェックしなおしたほうがいいかもしれません。例えば、二つ目のプログラムで光を見失ったときにはどうするのでしょうか。 -- FI? 2009-08-05 (水) 13:53:08
  • 変数を用いて相対的に明るい方向を探した方がうまくできるというアドバイスはいっていましたが、そのように仕上げろと言っていなかったと思います。 -- A12? 2009-08-05 (水) 15:49:17
  • 絶対的な明るさを閾値として使う方法では、閾値を越えた方角とさらに回転して閾値を割った方角との中間の方角を採用する、などの動作が必要ですね。ちなみに授業中説明したように、この課題の趣旨は最大値や極大値などを求める最も初歩的なアルゴリズムの学習です。 -- 松本 2009-08-07 (金) 14:47:03
  • 一つ目のプログラムに関して言うと、#define THRESHOLD 50としているので、elseif(SENSOR_1 > THRESHOLD&&SENSOR_1 < 50)が無意味となっています。変数を使ったプログラムにするか、先生のアドバイスを参考にするかしてください。
    二つ目のプログラムでは真ん中あたりのelseの中のifの中の命令が同じなので、ifの意味がありません。統一するか、光を見失ったときは早めに回転するなど違いをつけてください。
    3つ目のプログラムに関してはまとまりがはっきりわかるようにしましょう。また、光を見失ったときは時間を決めて探すより光センサが光を見つけるとした方がよいのではないでしょうか?(懐中電灯も動いているので)-- FI?
  • まさとさんのプログラムで、ifがないところにelseが出てきているような…?インデントしていただかないと見るほうはツライです。。。SYOさんのプログラムでは「while(SENSOR_3<=LIGHT)」のLIGHTというのが謎です(打ち間違いかな…?)。それと、breakの時点でwhileから出てしまうので、その後に行いたい処理はwhileの外に書いてやらないと実行されません。MOMOさんのプログラムも、インデントがないと見づら過ぎます…説明ももう少し欲しいです。 -- こさか? 2009-08-09 (日) 22:46:01
  • もう一度、while、if、elseの基本を確認して改良してください。また、まとまりをはっきりさせましょう。細かいミスも多いです。 -- FI? 2009-08-12 (水) 18:57:19
  • プログラム手直ししました。 -- SYO? 2009-08-15 (土) 19:01:18
  • 一つ目のプログラムに関して言えばインデントしてください(まとまりごとに行をあけること)細かいことですが、直前にwhile(SENSOR_1 <THROW)があるのでif(SENSOR_1 >THROW)はいらないかと思います。二つ目に関しては、 while(SENSOR_3<=THRESHOLD)の中でSENSOR_3THRESHOLDの値の大小で場合分けしても意味がないかと思います。また、どのようにして光を追跡するかをはっきり書いてください。最後のは、インデントしてください。また、光を追跡するときの不等号が一つおかしいと思います。 -- FI? 2009-08-31 (月) 17:20:08


添付ファイル: file090710_1730~0002.jpg 212件 [詳細] file090710_1730~0001.jpg 236件 [詳細] file090710_1649~0002.jpg 228件 [詳細] file090710_1649~0001(2).jpg 128件 [詳細] file090710_1649~0001.jpg 233件 [詳細] file090710_1648~0001.jpg 216件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2009-08-31 (月) 17:23:52