[[2016a/Member]]
#contents
*2016年課題2 [#ie6e0909]
下の図のようなコースを各チームで作成し、「ミッション」を遂行するためのロボットを作成せよ。([[課題2:http://yakushi.shinshu-u.ac.jp/robotics/?2016a%2FMission2]])
#ref(2016a/Member/hareruya/Mission2/IMG_7779.png,80%,コース)
コースは支給された紙にマジックペンで幅約1センチのラインを引いたものを使用した。
**ミッション [#b4f05d28]
次のいずれかの経路を黒い線にそって動くロボットを作成する (他のメンバーとは別の経路になるようにする)。ただし、なるべく速く正確に動くロボットになるように工夫して、交差点では1秒間停止すること。

A地点からB地点へ (1人目)

  A地点 → P直進 → Q直進 → Q直進 → R左折 → B地点

B地点からC地点へ (2人目)

  B地点 → R右折 → Q直進 → Q直進 →P右折 → S右折 → C地点

C地点からA地点へ (3人目)

  C地点 → S左折 → P左折 → Q直進 → Q直進 → R右折 → P左折 → A地点

また、私は3人目に該当するのでC地点からA地点へ進むプログラムを作った。

*ロボットの解説 [#yf896001]
土台のRISのロボットは課題1と同じようにあまり改造せずにそのままにして、光センサーをロボットの前方に外付けする形にした。また、課題1の作業をしているときにRISの黄色の本体が頻繁に取れて課題の進行に影響を与えた。なので、今回は土台との接地面積を増やすことで安定性の向上を図り、外れにくくした。

下の写真はロボットを斜め前から撮影したものである。前面に光センサーを取り付けている。本体から少し離れているが、プログラムと実際の動きとの誤差は気にならないものだった。

#ref(2016a/Member/hareruya/Mission2/IMG_7777.jpg,15%,ロボット)

下の写真はロボットを真上から撮影したものである。光センサーはロボットの中心線に合わせて左右対称の位置に取り付けている。
 
#ref(2016a/Member/hareruya/Mission2/IMG_7778.jpg,15%,ロボット)
*プログラム [#e99cbb4b]
定義などの課題1で使っていたもので再使用するものは、以前使用したものを再利用して時間のロスと打ち間違いによるミスを減らした。また、プログラムの絶対量が多くなって打ち間違いをするミスを抑えるために、サブルーチンを使用して1つのまとまりごとにプログラムを定義した。以下のプログラムは、3人目のC地点からA地点へ向かうように組んだものですが上手くいかない。

**定義 [#j4b1bc1a]

 #define BLACK 41
 #define WHITE 50
 #define RIGHT_H OnFwd(OUT_A); OnRev(OUT_C);//右旋回
 #define RIGHT_L OnFwd(OUT_A); Off(OUT_C);//右回転
 #define LEFT_H OnFwd(OUT_C); OnRev(OUT_A);//左旋回
 #define LEFT_L OnFwd(OUT_C); Off(OUT_A);//左回転
 #define GO_FORWARD(t) OnFwd(OUT_AC); Wait(t); Off(OUT_AC);
 #define STEP 1

**ライントレースのサブルーチン [#b2a4010a]
交差点で止まった時に音が鳴るようにしました。交差点の判別にはタイマーを使用し、黒が0.5秒以上続いたときに1秒止まり、音が鳴ります。ラインの右側を通るようにトレースをします。黒を認識したら右、白を認識したら左に進みます。

 sub LINE()
 {
  ClearTimer(0);//タイマの初期化
  while(FastTimer(0) <= 50) //括弧の中はタイマーが一定の時間を超えるまで行われる
    {
       if (SENSOR_2 <= BLACK) {//括弧内が満たされれば次のプログラムを、それ以外はelse以下を実行する
        RIGHT_H;
        } 
         else 
          if (SENSOR_2 < BLACK){
            RIGHT_L;                
           } else if (SENSOR_2 < WHITE) { 
            LEFT_L;
            ClearTimer(0);
           } else if (SENSOR_2 >= WHITE) {
            LEFT_H;               
            ClearTimer(0);
           } else {
            OnFwd(OUT_AC);
            ClearTimer(0);
           }
  
            Wait(STEP);
            }
             Off(OUT_AC);
             ClearTimer(0);
             PlaySound(SOUND_UP);
             Wait(100);//1秒間音が鳴る
 }

**右折のサブルーチン [#h2f74bda]
右に1秒曲がる
 
 sub CROSS_RIGHT()
 {
    while(FastTimer(0) < 100) {
       RIGHT_L;
   }
    ClearTimer(0);
   }
 
**左折のサブルーチン [#p6b1161b]
左に1.6秒間曲がる

 sub CROSS_LEFT()
 {
    while(FastTimer(0) < 160) {
        LEFT_L;
    }
    ClearTimer(0);
   }


**C地点からA地点へ進むプログラム [#l03815ed]
 
 task main()
 {
   SetSensor(SENSOR_2, SENSOR_LIGHT);
   GO_FORWARD(120);
   LINE();
   CROSS_LEFT();
   LINE();
   CROSS_LEFT();
   LINE();
   GO_FORWARD(50);
   LINE();
   CROSS_LEFT();
   LINE();
   GO_FORWARD(50);
   LINE();
   CROSS_RIGHT();
   LINE();
   CROSS_LEFT();
   LINE();
   CROSS_RIGHT();
   LINE();
   CROSS_RIGHT();
   LINE();
   CROSS_LEFT();
   LINE();
   CROSS_RIGHT();
   LINE();
   CROSS_LEFT();
   LINE();
   GO_FORWARD(120);
 }
*結果 [#r04452e7]
プログラムが思うように組めなくて、カーブを曲がり交差点までしかライントレースをすることが出来なかった。
*感想[#m5187625]
新しく教えられたプログラムの全ての意味をしっかり理解出来なかったためか、最後まで動くようにプログラムすることがかなわなかった。先生の話を聞いても一度で全て理解できなかったので、その後ロボティクス入門ゼミのホームページを見ましたがそれでも理解できない部分があった。そのことが今回、プログラムを正確にRISに伝えることが出来なかった一つの大きな原因だと思う。
*反省点 [#m19beecc]
もっと、友達或いは先生に質問して、初期の段階で疑問は出来る限り解消するべきであった。次回からは、自分で調べて解決できる問題と出来ない問題とを早めに判断して行動しようと思った。他のグループはロボットをコンパクトにしたり、センサーの位置をロボットの中心になるべく近づけたりして誤差が少なくなるように努めていた。なので、次回の課題ではその用途にあった形をしたロボットに組み替えようと思う。

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS