subgoal2-2
競技1.Autonomous Speed Circuit (続)

1. 実験の目的
  「センサ‐情報処理‐アクチュエータ」系による外界とのインタラクションを補う
   知能行動体の設計製作を体験する。それによって、各授業科目の重要性、必要性、
   意義を体感する。そして、自分で考え工夫すること、設計製作すること、
   グループで協力することの楽しさを体験する。
2. 競技内容
    ・スピード競争
   <ルール>
   スタートラインから黒線のトラックに沿いながら2周し、タイムとルートの正確さを競う。
   <点数>
   1、もっとも短いタイムでゴールしたチームを20点とし、以下タイム順に少なくなる。
   2、半周ごとに銀紙が這ってあり、そこを通ったときに音を鳴らせば10点、
    2周で計4回通ることになり最大40点となる。
   3、上記の点数とは別にして、1周できるごとに5点。2周で計10点となる。
3. ロボットの説明及び特徴
  マシン構造は、ステアリング+後輪駆動である。
  前輪の幅とタイヤは小さくしてある。
  後輪のギアはモーターを小さくして、車軸のギアを大きくした。
  回転センサは前輪の車軸に接続した。
  光センサは感度を良くするために車体の一番前に地面と1mmぐらい
  の位置でとりつけて、センサのまわりにブロックで影を作った。
  こうすることで天候や時間によって太陽の光が変わっても
  光センサに影響を及ぼしにくいためである。
4. プログラム及び説明

program test {
	#include 
	#include 
	#include 
	#include 
	var lightning = 0
	var lighting = 0
	var lighting2 = 0
	var lighting1 = 0
	var lighting3 = 0
	sensor light1 on 1
	light1 is light as percent
	sensor rotation3 on 3
	rotation3 is rotation as angle
	main {
	ext InterfaceType "kFreestyle"
	rcx_ClearTimers
	bbs_GlobalReset([A B C])
	try {
	direction [  ] [ A ]
	power [ A  ] 6
	power [ C  ] 8
	rcx_Calibrate(4,4)
	clear Rotation3
	on [ A  ]
	} retry on fail
	try {
	forever {
	if light1 is 35..37{
	if rotation3 = 0{
	on [ A  ]
	}
	else{
	if rotation3 > 0{
	direction [  ] [ C ]
	on [ C  ]  for 3
	off [ C  ]
	}
	else{
	direction [ C  ] [ ]
	on [ C  ]  for 3
	off [ C  ]
	}
	}
	}
	else{
	if light1 is 38..44{
	if rotation3 = -3{
	on [ A  ]
	}
	else{
	if rotation3 < -3{
	direction [ C  ] [ ]
	on [ C  ]  for 3
	off [ C  ]
	}
	else{
	direction [  ] [ C ]
	on [ C  ]  for 3
	off [ C  ]
	}
	}
	}
	else{
	if light1 is 45..49{
	if rotation3 = 4{
	on [ A  ]
	}
	else{
	if rotation3 > 4{
	direction [  ] [ C ]
	on [ C  ]  for 2
	off [ C  ]
	}
	else{
	direction [ C  ] [ ]
	on [ C  ]  for 2
	off [ C  ]
	}
	}
	}
	else{
	if light1 > 50{
	sound 1
	}
	else{
	on [ A  ]
	}
	if rotation3 = 0{
	on[ A  ]					
	}
	else{
	if rotation3 > 0{
	direction [  ] [ C ]
	on [ C  ]  for 1
	off [ C  ]
	}
	else{
	direction [ C  ] [ ]
	on [ C  ]  for 1
	off [ C  ]
	}
	}
	}
	}
	}
	}
	} retry on fail
	}
}
  <説明>
  初めにAの方向とパワーの設定およびCのパワーをセットし初めに置いた
  前輪の位置を0とするように回転センサをリセットしてAをonにする。
  光センサで明るさを感知して35〜37(黒色)なら回転センサの値で
  Cの方向を合わせてAをonにする。
  感知した値が38〜44(灰色)なら黒色と同じようにCの方向を決めAをonにする。
  感知した値が45〜49(白色)なら黒色と逆にCの方向を決めてAをonにする。
  感知した値が50以上(銀色)なら音を鳴らして回転センサの値によって
  Cの方向を決めてAをonにする。
5. フローチャート


6. 競技結果
  2周タイム:24秒
 銀紙での音:4回

7. 主に担当したことの説明
  主にプログラムの作成をしました。Speed競技をすると決めた
 段階からプログラム自体のおおまかな形は決まっていたのですが
 車の形が変わって行くに連れてだんだん変えていかなければばらなくなり
 しんどかった。実験をする時間帯によって微妙に光センサの値を変えたり
 後輪のモーターの馬力や前輪の回転角度をを変えたりしました。 

8. 考察
 <基本的な動作について>
 マシンは時計まわりに白いラインに入ると右に、灰色ラインに入ると
 左に曲がるように走らせた。
 
 <光センサ>
 マシンの一番先頭部分に光センサを付け、センサのまわりに影になるブロックを
 取りつけた。そうすることで外的な影響を受けずにより正しくラインの色の違いを
 読み取るようになった。実験の後半になってくると日が落ちて外が暗くなり、
 光センサの値がしょっちゅう変わったのでこのような工夫をした。
 しかし、銀色部分の値は影となるブロックをつけても銀色そのものが光を反射したり
 するのでよくマシンが間違った判断をしていた。

 <回転センサ>
 マシンの前輪の車軸に付け、車軸の値によって制御した。白いラインに入ったときに
 どこまで前輪を曲げるか、灰色ラインにはいった時もどこまで曲げるのか、
 実際に走らせて少しずつプログラム上で値を変えて試した。

 <プログラムの補足説明>
 白色ライン:入ったら前輪を右に曲げて走らせる。そのさいに回転センサの
 決められた値ならばAのモーターをonにし、その値以外ならその値になるまで
 前輪を曲げる、またその値以上に曲がった場合はその値まで前輪を戻す。
 
 灰色ライン:入ったら前輪を左に曲げて走らせる。そのさいに回転センサの
 決められた値ならばAのモーターをonにし、その値以外ならその値になるまで
 前輪を曲げる、またその値以上に曲がった場合はその値まで前輪を戻す。
 
 黒色ライン:入ったら直進させる。そのさいに回転センサの
 決められた値ならばAのモーターをonにし、その値以外ならその値になるまで
 前輪を曲げる、またその値以上に曲がった場合はその値まで前輪を戻す。
 
 銀色ライン:入ったら音を鳴らして走らせる。そのさいに回転センサの
 決められた値ならばAのモーターをonにし、その値以外ならその値になるまで
 前輪を曲げる、またその値以上に曲がった場合はその値まで前輪を戻す。
 問題点:競技一週間前にマシンの構造をいきなり変えたこと。
 それによってプログラムの細かい部分を色々変えなければならなくなった。
 それと、最初、プログラムに合わせてマシンを作っていたこと。
 
 解決策:初めからマシンをある程度完成させてからそのマシンにあったプログラムを
 作成するべきだった。どの班もマシンが違えばプログラムも色々変わってくる、
 それに早くから気づくべきだった。
 銀色ラインに入ったときに光センサに影響を与えずに走らせたい。
 カーブを曲がるときに前輪の角度によって曲がりきれずに止まってしまうことが
 多々あった、止まらずにスムーズに曲がれるようにしたい。
 デジタル回路の実験のあとにあったせいかsubgoal1のときははとても楽しかった、
 開放感さえおぼえました。でもsubgoal2に入り、マシンが思う様に動かせず、
 すごくイライラしたり、楽しないと感じてしまいました。
 しかし、競技会の当日に共同実験者と遅くまで残ってやってると、すごくやる気に
 なって楽しかったです。