マイクロマウス製作六十八日目


こんにちは♪

今朝はとてもきれいに晴れた空が綺麗ですね♪
気候も涼しくなり、秋の気配を感じます。
まさに「秋来ぬと目にはさやかに見えねども 風の音にぞおどろかれぬる」という歌を思い出してしまうようなさわやかな心地です。

このまま素直に季節が進んでくれるといいが…

さて、マイクロマウス研修です。

実は今週末に中部初級者大会を控えております。
それまでに壁切れをきちんと実装せねば、完走すらままならない可能性もあります。

昨日のようにPCを前に唖然としていては間に合わないw

そうそう。
私のブログにはコメント機能がないので、これをご覧になっている皆様からのアドバイスやツッコミは、いつもお会いするときくらいしか頂けないのですが、
九州地区大会に参加される方と怒涛の九州→中部地区大会計画メールをしていたら、ありがたいことにアドバイスを頂きました^^

それはこちらの2つ。
①もっと簡略化して書ける部分がある(同じ処理を複数書いている)
②実際には壁があるのに、何らかの原因で壁がないと判断されることもありえるが、どう回避する?

①については、書きながら「見る人が見たらムキーッってなってるのかなあ」と思っていました。
②については、盲点です。
マイクロマウスは、壁や床や照明がいつも完全に均一な状況だとは限りません。
また、そのイレギュラーな環境下においても正確で素早い走りを追求するというのが、マイクロマウスの技術進歩の要とも言えるかなあと思っています。

これは、私にとっては難しいけれど、考慮しなければならない問題ですね。

アドバイスありがとうございます。
中部初級者大会での完走が危ぶまれる(というか現段階では無理です…壁切れのバグがあるので)今すぐには取り組めませんが、
いずれのり先生に詳しく教えてもらおっと♪

—–

さて、昨日途方に暮れた部分。
もうちょっとのり先生にアドバイスを求めてみます。

昨日この部分に目をつけたのはいい判断だったようです。

	while((mypos.x != x) || (mypos.y != y)){		//ゴールするまで繰り返す


		switch(get_nextdir(x,y,MASK_SECOND,&glob_nextdir))	//次に行く方向を戻り値とする関数を呼ぶ
		{
			case front:										//直線をまとめて走るようにする
				straight_count++;
				break;
			
			case right:
				straight_for_fast(straight_count*SECTION,0);		//直線を走る
				rotate(right,1);							//右に曲がる
				straight_count = 1;							//走る直線の距離をリセット
				break;
			
			case left:
				straight_for_fast(straight_count*SECTION,0);		//直線を走る
				rotate(left,1);								//左に曲がる
				straight_count = 1;							//走る直線の距離をリセット
				break;
			
			case rear:
				straight_for_fast(straight_count*SECTION,0);		//直線を走る	
				rotate(left,2);								//後ろに向く
				straight_count = 1;							//走る直線の距離をリセット
				break;
		}
	

この部分は、探索で把握した「曲がるべき位置と方向」の指示をぱっぱっとスイッチングしている部分です。
ですから、ここの指示を利用すれば探索に基づいた走行と壁切れ補正を両立できるそう。

それには、右折時と左折時の部分をそれぞれいじる必要があるそうです。

なるほど!
今は、右に曲がるときも左に曲がるときも「straight_for_fast」を呼び出してますが、
右に曲がるときと左に曲がるときで違う関数を呼び出せば、あらかじめ探索した迷路情報によって走ってくれるので、
混乱を回避できそうです。

さっそく変えてみました。
straight_for_fast_right
straight_for_fast_left
という二つの関数を分けて作り、それぞれ右折時と左折時に振り分けました。

straight_for_fast_rightだけお見せするとこんな感じです。
これと対称なものとしてstraight_for_fast_leftもあります。

紆余曲折のエラーたちバグたちを乗り越えて…

走らせてみました♪

迷路を変えてもう一度!!

むむむーーー!

曲がる直前にお尻を振っているぞ!!!
これはどうしてだ?

というところで時間切れになってしまいました。
今日は、のり先生にもらったヒントを元にプログラムの構造を変えるのに必死で時間を使ってしまいましたね。
あまりそれぞれがどういう働きをしているかということをじっくり見なかったので、
明日きちんと一行ずつ追えばわかる…のではないでしょうか…。
今している謎の走りもきちんと検証する必要がありますが、お腹がすいたのでご飯を食べようとおもいます^^!!!

驚異的な進歩wでのり先生を驚かそうと思いましたがそうは甘くない…(;_;)


Posted in Pi:Co Classic製作記