・目次

課題

コース画像

今回の課題は決められたコースを人の手を借りずにロボット自身で道を判断する、という課題。 私はCからAまで進むコースを担当した。 線上を進みつつ、3度の左折、1度の右折、2度の直進を各交差点で1秒とまってから実行するプログラムを組むことが必要となる。

機体

60,機体画像 今回は前回の反省を活かし、光センサーの取り付けを担当した。 回転しないように取り付けることが難しく、パーツを組み合わせて固定させるなど力がついたと同時に、自分の何も手本がない状態からモノを作る能力の無さを実感した。 課題3では適材適所というと逃げているように感じるが、効率を優先させるという建前のもとプログラミング面で力を発揮したい。

考察

今回のプロミングでは交差点を如何にして判断するかが、鍵となると考えられる。 交差点を交差点だとコンピューターに認識させるには、交差点が何かということを理解する必要がある。交差点とは線と線が交差している場所、つまり交差する線により角となる部分ができている。そこではずっと一方向だった線が横へと広がりを見せている場所だと考えることにした。 横に線が伸びていることで何が起きるかライントレースをしながら進む際、線上か線上でないかで進む方向を変える方法をとった。そこで線上と判断し進む方向を変えたにもかかわらず、線上で在り続ける状況が、交差点では発生すると考えられる。 よって、今回は線上に長くいる状態を交差点と判断するようにプログラムを組むことにした。

プログラム

今回は隣の班員の1人と協力しプログラミングを進めた。よって定義名などは違うが全体としての流れは同じものとなった。

#define BLACK 35                              //しきい値を設定する
#define turn_migi OnFwd(OUT_B,40);OnRev(OUT_A,20);
#define turn_hidari OnFwd(OUT_A,40);OnRev(OUT_B,20);
#define blecfast Off(OUT_AB);PlaySound(SOUND_UP);Wait(1000);
#define left OnFwd(OUT_A,40);OnRev(OUT_B,20);Wait(500);Off(OUT_AB);
#define left2 OnFwd(OUT_A,40);OnRev(OUT_B,20);Wait(300);Off(OUT_AB);
#define left3 OnFwd(OUT_A,40);OnRev(OUT_B,20);Wait(170);Off(OUT_AB);
#define rap OnFwd(OUT_AB,40);Wait(350);
#define rap2 OnFwd(OUT_AB,40);Wait(150);
#define roal OnFwd(OUT_B,40);OnRev(OUT_A,40);Wait(650);Off(OUT_AB);
#define roal2 OnFwd(OUT_B,40);OnRev(OUT_A,20);Wait(200);Off(OUT_AB);
#define raigt OnFwd(OUT_B,40);OnRev(OUT_A,20);Wait(200);Off(OUT_AB);
#define goal OnFwd(OUT_AB,40);Wait(500);Off(OUT_AB);

線の右側に沿って移動するプログラムをサブルーチンとして作っておく

sub standrt ()              //交差点まで線の右を移動して、交差点と判断すると1秒止まる
{
   SetSensorLight(S4);   //センサーを起動
   int nOnline=0;     //右折回数をカウントするための整数を定義
   int k=0;        //プログラムの実行回数をカウントするための定義
      while(k==0)     //プログラムを1度完遂するまで実行する
 {
         while (nOnline < 200)    //右折のカウントが一定たまると交差点であると判断
  {
            if(SENSOR_4 < BLACK)   //線上は右折しカウントをとる
   {
               turn_migi;
               nOnline++;
   }
            else if (SENSOR_4 < BLACK+15)   //線上からはみ出ると左折しカウントをリセット
   {
               turn_hidari;
               nOnline=0;
   }
            Wait(1);      //0.001秒毎に判断
  }
         blecfast;       //交差点と判断すると1秒止まり音をだしプログラムを完遂したと判断させる
         k++;
         nOnline=0;
 }
}

指摘を受けプログラムを見直したがwhile(K==0)は必要ないと分かった。 初め、交差点と判断した後に次の動きに進ませたいために、交差点と判断した後またライントレースを始めないようにするために交差点と判断したらカウントをし、そのカウントを次の動作に行くための鍵しようと考えこの部分を組んだが、この部分がなくとも交差点と判断するまででライントレースの動きが止まることに気づいた。このような無駄なプログラムがあると容量を多くとってしまうので、見直しをきちんとし、このようなことがない要にしたい。

上記の線上を動くプログラムを使い、交差点を認識するごとにそれぞれの対応をするように構築した。

task main ()    //交差点ごとに個別の対応をするよう構築
{
   standrt();
      left;    //1つめの交差点は左折する
   standrt();   
      left;    //2つめの交差点も左折する
   standrt();
      rap;     //3つめの交差点は直進して線を見つけ直す
         left2;
   standrt();
      rap2;    //4つめの交差点も直進させるが3つめとは別につくり最適化
         left3;
   standrt();
      roal;    //急カーブを交差点と判断するので回って線を見つけ直すようにする
         roal2;
            rap;
   standrt();
      raigt;   //5つめの交差点は右折させる
   standrt();
      left;    //6つめの交差点は1つめ2つめとおなじように左折させる
   standrt();
      goal;    //Aにたどり着く
}

結果

CからAに移動することができた。前回の課題と違い、再現性の高いプログラムを構築することができた。 しかし、一箇所。交差点でないにもかかわらず、交差点だと判断する箇所があった。それは、ほぼUターンとなる場所だ。そこでは線上と判断して方向を変えるライントレースによる方向転換が間に合わず、交差点と判断するほど長く、線上に居続けたことが原因で、交差点と判断してしまった。ここで交差点であると判断するまでを長くすると、Uターンの箇所は無事乗り越えることができるかもしれないが、正しい交差点でも交差点でないとご判断してしまう可能性を考慮するため、あえて修正せずに、交差点ではないが、交差点として進むことにした。 これによりゴールすることは可能になり、また再現性も高いプログラムとなった。が、他の場所を交差点と誤認識してしまうようなことがあると、ごーるすることは できないだろう。

感想

今回は前回と違い、課題を達成することができた。これは、シンプルに力がついたと言えるのではないだろうか。まだまだ改善の余地はあるだろうが、ひとまず及第点としたい。 プログラムを組むなかでもやはりUターンの場所を乗り越えることが1番大変に感じた。仕方なくその場所を乗り越えるようにプログラムを修正し、なんとかしたが実際にプログラミングを仕事とした時、そのイレギュラーに1つ1つ対応していくことは非常に難しい作業になるだろうと、考える。 前回の課題からの問題だが、汎用性が高いプログラムというものの重要性を強く感じた。交差点の判断の方法、いくつめの交差点ではどういった行動をとるのかそれだけを伝えれば動くプログラムを組むことが最善であると考える。


添付ファイル: fileCocUyg_VIAE57s0.jpg:large.jpeg 89件 [詳細] file2016a-mission2.png 91件 [詳細]

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