[[2016a/Member]]
目次
#contents

*課題内容 [#rb1c1d6b]

 今回の課題は、2班合同で行うもので課題2で用いたコースをもとにロボットに紙コップを重ねさせそのタイム(制限時間はなし)と重ねた個数を競うものであり主なルールは~
     ・C地点とD地点にそれぞれ紙コップを3個ずつ置き交互に重ねる~
     ・紙コップは下から数えて奇数番目はC地点から、偶数番目はD地点からとなるように重ねる~
     ・紙コップは最終的に交差点Qを含む円の中に重ねて置く~
     ・ロボットはA地点、B地点からそれぞれ1機ずつスタートさせる~
 といった規定があり、ルールの詳細については以下参照。


[[asd:http://yakushi.shinshu-u.ac.jp/robotics/?2016a%2FMission3]]

#ref(2016a/Member/jake57/Mission3/2016a-mission2.png,40%,課題2のコース)

*ロボット [#x9bed8d1]
 今回の課題で使用したロボットがこちらです。~

#ref(2016a/Member/jake57/Mission3/Image_e96ab92.jpg,50%,ロボットの写真1)~



 このロボットは先端に付けてあるタイヤのゴムによって紙コップが滑らないようになっていて、~
 紙コップをつかんだあと先端のアームで紙コップ上に持ち上げてそのまま動き出し、次の紙コップをセンサーでとらえたときにアームを下し紙コップを重ねることができるようになっています。~

 また、下に付いている紫色のパーツは紙コップを重ねる時に下になる紙コップと上に重ねる紙コップとの誤差を小さくすろための役割りをしています。






#ref(2016a/Member/jake57/Mission3/Image_24378f2.jpg,50%,ロボットの写真2)



 このロボットで使用しているセンサーは、ライントレース用の光センサーのみである。~

 このセンサーのほかに~
     ・「コップがある高さまで持ち上がったら次の動作を行う」という動作の過程にある、ある高さを知るためのタッチセンサー~
     ・紙コップがロボットの前にあることを認識する光センサー~
 なども考えていたが、試行錯誤の結果本番は紙コップ1個を確実に運ぶという方針に変わったのでこれらのセンサーは使用しなかった。







*プログラム [#f580972c]



 ・白と黒を見分けるライントレース用の中央値
 #define Middle 45




 ・センサーやモーターの力の初期設定
  (実際にセンサーは、SENSOR1のみ使用)

 sub setting()
 {	
 	SetSensor(SENSOR_1,SENSOR_LIGHT);//ライントレース用			
 	SetSensor(SENSOR_2,SENSOR_TOUCH);//モータB止める用
 	SetSensor(SENSOR_3,SENSOR_LIGHT);//紙コップを確認する用	
 	SetPower(OUT_AC,4);//タイヤ
 	SetPower(OUT_B,7);//アームの上下、開き
 } 


 ・ロボットの前に現れた黒く塗った紙コップを光センサーで認識
  (実際は、上手く認識することができなかったので使用していない)

 sub copjugde()
 {
    while(SENSOR_3 < 46)//
	OnRev(OUT_AC);
	Off(OUT_AC);
	Wait(100);
 }



 ・紙コップを上に持ち上げたまま維持~
  「sub」ではなく「task」を用いているのはライントレースと同時に行うため
 task keep()
 {
 	while(1)
        {
 		OnRev(OUT_B);
 		Wait(1);
 		OnFwd(OUT_B);
 		Wait(1);
 	}
 }




 ・紙コップを下に下げる動作
 sub down()
 {
	OnRev(OUT_B);
       Wait(200);
 }


 ・スタートのA地点の四角い枠から抜け出す~
  (ロボットをライントレース用の黒線に対してやや斜めにしてからスタートするのがポイント)

 sub STARTING_OPERATION()
 {
	while(SENSOR_1<Middle)
	{
		OnRev(OUT_AC);
	}
	while(SENSOR_1>Middle)
	{
		OnRev(OUT_AC);
	}
	OnRev(OUT_AC);
	Wait(50);
	Off(OUT_C);
	OnRev(OUT_A);
	Wait(40);
	while(SENSOR_1<Middle)
	{
		OnRev(OUT_AC);
	}
	Off(OUT_AC);
 }


 ・180度回転~
  やや進ませてから回転の動作にはいるのは~
  ロボットの長さを考慮してライントレース用の光センサーが回転前と回転後で同じ地点からスタートできるようにするため

 sub TURN_180()
 {
	OnFwd(OUT_AC);
	Wait(80);
	Off(OUT_AC);
	
	OnRev(OUT_A);
	Wait(130);
	while(SENSOR_1>40)
	{
		OnFwd(OUT_C);
		OnRev(OUT_A);
	}
	Off(OUT_AC);
 }






【今回の課題で使用したプログラムの全容(紙コップ1個用)】

  task main()
 {
 	setting();
	STARTING_OPERATION();
	repeat(2)
	{
		TRACE();
		zensin();
	}
   
        //交差点からD地点へ向かう
  
        TRACE();	
	OnRev(OUT_C);
	Wait(25);
	TRACE();
	
        //誤差修正
	
        OnRev(OUT_A);
	Wait(95);
	Off(OUT_AC);
  
        //D地点に到着
  
	OnFwd(OUT_B);//コップつかむ
	Wait(250);
	start keep;
	TURN_180();//180°回転
       	OnFwd(OUT_A);//Qの方向を向く
	OnRev(OUT_C);
	Wait(200);
	Off(OUT_AC);
	OnRev(OUT_AC);//進む
	Wait(100);
	Off(OUT_AC);
	
        //センサー使って進む
	
        while(SENSOR_1 > Middle-4)
	  OnRev(OUT_AC);
	stop keep;
	
        //放す
	
        Off(OUT_AC);
	down();
 }
 sub setting()
 {	
 	SetSensor(SENSOR_1,SENSOR_LIGHT);//ライントレース用			
 	SetSensor(SENSOR_2,SENSOR_TOUCH);//モータB止める用
 	SetSensor(SENSOR_3,SENSOR_LIGHT);//紙コップを確認する用	
 	SetPower(OUT_AC,4);//タイヤ
 	SetPower(OUT_B,7);//アームの上下、開き
 } 
 sub zensin()
 {
       OnRev(OUT_A);
       Wait(106);
       Off(OUT_A);
 }
 sub copjugde()*使ってない
 {
    while(SENSOR_3 < 46)
	OnRev(OUT_AC);
	Off(OUT_AC);
	Wait(100);
 }
 task keep()*(紙コップの保持)
 {
 	while(1)
        {
 		OnRev(OUT_B);
 		Wait(1);
 		OnFwd(OUT_B);
 		Wait(1);
 	}
 }
 sub TRACE()
 //ライントレース用メソッド
 {
 	ClearTimer(0);
 	while(FastTimer(0)<=42){
 		if(SENSOR_1>Middle+4)//白 左旋回
 		{
 			OnFwd(OUT_C);
 			OnRev(OUT_A);
 			ClearTimer(0);
 		}
 		else if(SENSOR_1>Middle+2)//やや白 左折
 		{
 			Off(OUT_C);
 			OnRev(OUT_A);
 			ClearTimer(0);
 		}
 		else if(SENSOR_1>Middle)//直進
 		{
 			OnRev(OUT_AC);
 			ClearTimer(0);
 		}
 		else if(SENSOR_1>Middle-2)//やや黒 右折
 		{
 			Off(OUT_A);
 			OnRev(OUT_C);
 		}
 		else //黒 右旋回
 		{
 			OnFwd(OUT_A);
 			OnRev(OUT_C);
 		}	
 	}
 	Off(OUT_AC);
 	PlaySound(SOUND_FAST_UP);//トレース終了、交差点認識
 }  
 sub down()
 {
	OnRev(OUT_B);
       Wait(200);
 }
 sub STARTING_OPERATION()
 {
	while(SENSOR_1<Middle)
	{
		OnRev(OUT_AC);
	}
	while(SENSOR_1>Middle)
	{
		OnRev(OUT_AC);
	}
	OnRev(OUT_AC);
	Wait(50);
	Off(OUT_C);
	OnRev(OUT_A);
	Wait(40);
	while(SENSOR_1<Middle)
	{
		OnRev(OUT_AC);
	}
	Off(OUT_AC);
 }
 sub TURN_180()
 {
	OnFwd(OUT_AC);
	Wait(80);
	Off(OUT_AC);
	
	OnRev(OUT_A);
	Wait(130);
	while(SENSOR_1>40)
	{
		OnFwd(OUT_C);
		OnRev(OUT_A);
	}
	Off(OUT_AC);
 }

 

*結果 [#tdfe2910]
 本番は紙コップ1個を円の中に運び入れることができなかった。~
 スタートを上手くすることはできたが、ライントレースが上手くいかず3つめの交差点で誤認識してしまい紙コップまでたどりつけなかった。


*感想 [#q9a8d717]
 今回の課題は、ライントレースをしつつ紙コップを交互に重ねることが目的で様々な案がでてそれらを試行して最善の方法をとろうと試みたがどれも上手くいかず、特に、ライントレースは前回のものを使えばいいと思っていたが前回までのライントレースに特化したロボットではないので全然上手くいかずライントレースさせるのが難しかった。
 今回の課題は、ライントレースをしつつ紙コップを交互に重ねることが目的で様々な案がでてそれらを試行して最善の方法をとろうと試みたがどれも上手くいかず、特に、ライントレースは前回のものを使えばいいと思っていたが前回までのライントレースに特化したロボットではないので全然上手くいかずライントレースさせるのが難しかった。~
 また、課題の紙コップ6個というのを意識していて初めから6個重ねようという考えがよくなかった。~


 この「ロボティクス入門ゼミ」には興味があって受講しましたがプログラミング初心者の自分には結構厳しく最後までついていけるか不安でしたが、班員に助けてもらいながらなんとか最終課題まで達することができました。~
私はロボットはプログラム通りに動いてくれるものだと思っていましたが、実際はその時の環境(主に電池の残量)に大きく作用されてしまい思い通りにいかないことを知りました。~
最後に、この講義を通してプログラミングの難しさ、楽しさ、班員と共同で課題をこなす達成感など大変な講義ではありましたが、良い経験ができました。  
 


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