2013b/Member

メンバー紹介

satoT 農学部応用生命科学科   プログラミングを担当  ロボット本体を持って帰る

tomato 工学部電気電子工学科  ロボット製作担当    ロボットの材料を持って帰る   

課題1

まず、初めにスタートしてライントレースをして行き、途中の空き缶をどかし元の場所に 戻し進んでいき、ゴールする。

ルール

・缶は交差点から10cm以上離さなければならない。

・黒線に沿って動いてゴール手間の好きなところでで空き缶を置く。

・交差点では正しく判断させて直進させる。
ava4.JPG

二つの缶はこのように置くことにした。

以下の説明は、左回りの場合とする。

ロボット作成

最初の状態のロボットだと、円を交差点と誤感知してしまう事が多く、改造することに決めた。 改造のコンセプトは、なるべく軽量化を目指して作り、光センサーを使い缶を感知できるようにして、正確に動くように改良した。

さらに、ライントレースするための光センサーの位置は初期状態の物よりも低く改造することによって、より精度の高いライントレースをするように改良を施した。

完成したロボットはこれである。


ava1.JPG

ロボットの説明



では、ロボットの説明をする。

下の写真は、ロボットがライントレースするための光センサーが写っているが初期状態のロボットよりも低く設置することによって、正確にライントレースができるように工夫した。


ava5.JPG

次に下の写真はロボットの後部を写したものである。

初期状態では、四輪であるが、右側の円のカーブを交差点と誤感知してしまうことから、小回りが利くようになる三輪のロボットを作った。


ava6.JPG

次にアームについての説明をする。元々アームは同じ長さの棒のようにつけて、缶を引きずって移動させるという方法を考えていた。

しかし、アームの長さの故に左側の円を回る時にアームが当たってしまい、缶が移動してしまうという問題が起きてしまった。

解決策としてこのようなアームにした。
ava3.JPG

写真のように、左のアームを短くしたのである。

左のアームを短くした利益としては、下の写真のように左の円のカーブを缶に当たらずに進むことが可能になる。
ava2.jpg

プログラミング作成

ここでは、課題の左回りのコンセプトとプログラムを紹介していく。

プログラミング全体

プログラムとしては 最初に缶を感知したら、少しだけ進む 左旋回して少し進む、そのあと後ろに下がり缶を置く 右旋回して戻り交差点を4回渡るまでライントレースをする 2回目の缶も1回目の缶と同じように置いて行き ライントレースをしてゴールする。

プログラムの説明

「#define ○○ 命令式」と書くことで後に○○と打つと、命令式をそこに書いたのと同じ意味になり、プログラミングを短くまとめることが出来る。

このプログラムでの定義付けは以下の通り。解説を交えて、説明する。 なおこれは、左回りのプログラムである。 

#define kurot 42//黒線の中央を定義
#define kurok 45//黒線と白い所の境界を定義
#define kurog 47//ギリギリ黒となるところを定義
#define shiro 49//白い所を定義
#define hi 2//大きい力の出力を定義
#define low 1//小さい力の出力の定義
#define sh SetPower(OUT_AC, hi);//左右の車輪に大きい力の出力を定義
#define sl SetPower(OUT_AC,low);//左右の車輪に小さい力の出力を定義
#define slh SetPower(OUT_A,low); SetPower(OUT_C,hi);左の車輪に小さい力の出力、右の車輪に大きい力の出力を定義
#define shl SetPower(OUT_A,hi);  SetPower(OUT_C,low);左の車輪に大きい力の出力、右の車輪に小さい力の出力を定義
#define sss SetPower(OUT_A,1);SetPower(OUT_C,1);左右の車輪最も小さい力の出力を定義
#define mae sh OnFwd(OUT_AC);前に進む
#define ushiro OnRev(OUT_AC); 後ろに下がる
#define migi0 sl; OnFwd(OUT_A); Off(OUT_C);通常のライントレースで右に進む
#define migi1 sl; OnFwd(OUT_A); OnRev(OUT_C); 右旋回をする
#define migi2 slh;OnFwd(OUT_A); OnRev(OUT_C);migi1よりも急なな右旋回
#define migi3 shl; OnFwd(OUT_A); OnRev(OUT_C);migi1よりもゆるやかな右旋回
#define hidari0 sl; Off(OUT_A); OnFwd(OUT_C);通常のライントレースで左に進む
#define hidari1 sl; OnRev(OUT_A); OnFwd(OUT_C);左旋回をする
#define hidari2 shl; OnRev(OUT_A); OnFwd(OUT_C);hidari1よりも急な左旋回をする
#define hidari3 slh; OnRev(OUT_A); OnFwd(OUT_C);hidari1よりもゆるやかな左旋回をする
#define STEP 1//0.01秒の周期
#define nMAX 9//交差点と判断するための黒と判断した回数
#define yasumi Off(OUT_AC); Wait(100);//1秒間止まって休む
#define cross 25 //黒線を渡る時間
#define cross_line  sl; OnFwd(OUT_AC); Wait(cross); yasumi;//交差点で黒線を渡る
 int p=0;//黒線の中央だと感知した回数
 int n=0;//交差点を渡った回数
 int x=0;//交差点を渡る回数
 int y=0;//Timerの定義
 sub migime(){//nがxよりも大きくなるまで右側をラインレース
   while(n < x){//nがxよりも大きくなるまで続ける
     while(p < nMAX){//センサー2がnMAX回黒の中央と感知した時交差点と判断する
     if (SENSOR_2 < kurot){//センサーが黒線の中央と感知した時、右旋回
       migi1;
       p++;//pの回数を増やす
     } else {
     if(SENSOR_2 < kurok){//黒線と白い所の境界を感知した時、右に進む
       migi0;
     } else if(SENSOR_2 < kurog){//ギリギリ黒線があるところは前に進む
       mae;
     } else if(SENSOR_2 < shiro){//白い所を感知した時、左に進む
       hidari0;
     } else {
       hidari1;//それ以外の時左旋回
      }
       p=0;//pを0にする
      }
       Wait(STEP);//STEPの時間の周期だけ繰越す
      }
       yasumi;//1秒間止まる
       hidari1;//左旋回
       Wait(nMAX*STEP*2);//余計に曲がった分だけ戻る
       cross_line;交差点を渡る
       n++;//交差点を渡った回数を増やす
       p=0;//pをする
      }
   }
 sub hidarime(){//nがxよりもおおきくなるまで左側をライントレース
   while(n < x){//nがxよりも大きくなるまで続ける
     while(p < nMAX){//センサー2黒の中央と感知した回数pがnMAXよりも大きくなった時交差点 と判断
     if (SENSOR_2 < kurot){
       hidari1;
       p++;
     } else {
     if(SENSOR_2 < kurok){
       hidari0;
     } else if (SENSOR_2 < kurog){
       mae;
     } else if (SENSOR_2 < shiro){
       migi0;
     } else {
       migi1;
      }
       p=0;
      }
       Wait(STEP);
      }
       yasumi;1秒間止まる
       migi1;//右に旋回
       Wait(nMAX*STEP*2);//余計に曲がった分だけ戻る
       cross_line;//交差点を渡る
       n++;
       p=0;
       }
   }
 sub migikata(){ //ただの右側のライントレース   
   while(FastTimer(0) <= y ) {//yだけこのプログラムを続ける
     if (SENSOR_2 < kurot) {
      migi1;
   } else if (SENSOR_2 < kurok) {
      migi0;
   } else if (SENSOR_2 < kurog) {
      mae;
   } else if (SENSOR_2 < shiro) {
     hidari0;
   } else {
     hidari1;
    }
     Wait(STEP);
    }
 }
 sub hidarikata(){//ただの左側のライントレース
   while(FastTimer(0) <= y ) {//yの時間だけこのプログラムを続ける
     if (SENSOR_2 < kurot) {
      hidari1;
   } else if (SENSOR_2 < kurok) {
      hidari0;
   } else if (SENSOR_2 < kurog) {
      mae;
   } else if (SENSOR_2 < shiro) {
     migi0;
   } else {
     migi1;
    }
     Wait(STEP);
    }
 }
 sub migite(){//感を感知するまで右側をライントレースをする
   while(SENSOR_1 < 49) {//缶に感知するまで続ける
     if (SENSOR_2 < kurot) {
      migi1;
   } else if (SENSOR_2 < kurok) {
     migi0;
   } else if (SENSOR_2 < kurog) {
     mae;
   } else if (SENSOR_2 < shiro) {
     hidari0;
   } else {
     hidari1;
    }
    Wait(STEP);
    }
 }
 sub hidarite(){//缶に感知するまで左側をライントレース
   while(SENSOR_1 < 49) {//缶に感知するまで続ける
     if (SENSOR_2 < kurot) {
      hidari1;
   } else if (SENSOR_2 < kurok) {
     hidari0;
   } else if (SENSOR_2 < kurog) {
     mae;
   } else if (SENSOR_2 < shiro) {
     migi0;
   } else {
     migi1;
    }
    Wait(STEP);
    }
 }

 task main()  {

   SetSensor(SENSOR_1,SENSOR_LIGHT);
   SetSensor(SENSOR_2,SENSOR_LIGHT);
   hidarite(); //缶を感知するまで左側をライントレース
   ClearTimer(0); //リセット
   y=400;hidarikata(); //普通に三秒間ライントレース
   sss;OnFwd(OUT_C);OnRev(OUT_A);Wait(80); //180度旋回
   sss;OnFwd(OUT_C);OnRev(OUT_A);until(SENSOR_2 < 45);Off(OUT_AC); //180度旋回
   ClearTimer(0); //リセット
   y=100;migikata(); //ちょっとライントレース
   sss;OnRev(OUT_AC);Wait(75); //缶を置いていく
   sss;OnFwd(OUT_A);Off(OUT_C);Wait(10); //180度旋回
   sss;OnFwd(OUT_A);OnRev(OUT_C);until(SENSOR_2 < 45);Off(OUT_AC); //180度旋回
   sss;OnRev(OUT_A);OnFwd(OUT_C);Wait(30); //調整
   x=4;hidarime();//4回交差点を認識するライントレースをする
   hidarite();//缶を感知するライントレースをする
   ClearTimer(0); //リセット
   y=400;hidarikata(); //普通に三秒間ライントレース
   sss;OnFwd(OUT_C);OnRev(OUT_A);Wait(80); //180度旋回
   sss;OnFwd(OUT_C);OnRev(OUT_A);until(SENSOR_2 < 45);Off(OUT_AC); //180度旋回
   ClearTimer(0); //リセット
   y=100;migikata(); //ちょっとライントレース
   sss;OnRev(OUT_AC);Wait(100); //缶を置いていく
   sss;OnFwd(OUT_A);Off(OUT_C);Wait(10); //180度旋回
   sss;OnFwd(OUT_A);OnRev(OUT_C);until(SENSOR_2 < 45);Off(OUT_AC); //180度旋回
   sss;OnRev(OUT_A);OnFwd(OUT_C);Wait(30); //曲がりすぎないように調整
   hidarite();//ただのライントレース

 }

交差点を渡るプログラム

以下は交差点を渡るために使用するプログラムである。

       yasumi;//1秒間休む
       migi1;//右に旋回
       Wait(nMAX*STEP*2);//余計に曲がった分だけ戻る
       cross_line;//交差点を渡る
       n++;
       p=0;

migi1のWaitの時間がnMAX*STEP*2である理由は、 nMAX*STEPの間だけ余計に左旋回してしまったのをもどすためである。

反省点

反省点は大きく分けて2つある。のはライントレースして、交差点を渡るときに交差点と判断してくれなかった時でまた、 交差点を渡るための閾値を下げると渡れるはずであった、カーブを交差点とご感知する点である。 調整が非常に難しかった。

今度は閾値に振り回されないようなプログラムを作ろうと考えた

2つ目はTimerが機能しなかった事でである。結局理由はよく分からなかったが、最初から作り直すことにより上手く機能するようになった。

原因を機能しなかったプログラムを吟味して追求していこうと考えている。


添付ファイル: fileava7.JPG 132件 [詳細] fileava6.JPG 239件 [詳細] fileava5.JPG 269件 [詳細] fileava4.JPG 286件 [詳細] fileava3.JPG 260件 [詳細] fileava2.jpg 253件 [詳細] fileava1.JPG 261件 [詳細] filerobo4.jpg 117件 [詳細] filerobo3.jpg 133件 [詳細] filerobo2.jpg 151件 [詳細] filerobo1.jpg 137件 [詳細]

トップ   編集 凍結 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2014-01-13 (月) 14:30:12