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


こんにちは。

先日、従兄弟におすすめしてもらった「パンズラビリンス」という映画を観ました。
ファンタスティックなパッケージにわくわくして観てみたら…
鬱屈としました。。 夢と恐怖と絶望感が詰まっていましたw

ですが、とても素敵な映画なので、みなさんも是非観てみてください^^
PG-12指定の理由がよーくわかります。

さて、そんなこんなで、マイクロマウス研修。

実は4月からマイクロマウスについてブログを書かせていただいていて、
一番書きづらいなあと思うのがプログラムを勉強しているときのブログです。

手を動かして何か作ったり作業するのは、写真も用意しやすいですし、説明も簡単です。
それがいざプログラムとなると、写真は画面キャプチャくらいになってしまいますし、 全体像を把握していないため説明も苦しいですw

それでも、実はわたしが一番心から興味深いと思っているのはプログラムのお勉強です。

最近のり先生は絶妙なタイミングで放置プレイに走るので、 私がひとりで考えて書いてみるという試練に立ち向かう機会が多いですw

でも、うーんうーんと悩みながらそれらしいものが書けて、ビルドが成功すると嬉しいですw

前置きが長くなりましたが、 今日も昨日に引き続き「壁切れ補正」を実際に書いていきます。

昨日も確認しましたが、わたしが実装する壁切れ補正は以下の条件化で発動するようにしたいと考えています。

・最短走行時のみ
・停止~停止まで2区画以上走る場合のみ
・超信地旋回のため停止する直前に壁の切れ目を見て走行距離を補正 写真 2013-08-13 12 00 03

今日は昨日よりずっと踏み込んでプログラムを書いてみました。

とはいえ、様々な条件を考慮しつつ正常に走行できるプログラムをはじめから書くのは至難の業なので、
練習として、下図のような 「2区画以上(昨日すでに書いた条件)走った後に右折する場合」 のみの壁切れを見るプログラムを書くことにしました。

20130813

実際に書いてみた者ものがこちらです。


void straight_for_fast(int len, int tar_speed) //直線走行
{
 //走行距離len[mm] と 目標速度tar_speed[mm/s] を指定する。
 //最高速度は変数max_speedに予め代入すること

 int obj_step; //目標ステップ数

r_accel = accel; //加速度(後で指定方法を変更すること)
 step_r = step_l = 0; //ステップ数カウントのリセット

con_wall.enable = true; //壁による姿勢制御を有効にする

 obj_step = LEN2STEP(len); //目標ステップ数を算出

MOT_CWCCW_R = MOT_CWCCW_L = MOT_FORWARD; //もしカウントが入ってきたら前方に進む

MTU2.TSTR.BIT.CST3 = MTU2.TSTR.BIT.CST4 = 1; //カウントスタート

 //目標速度が最低速度を下回らないようにする
 if(tar_speed < MIN_SPEED)
 {
 tar_speed = MIN_SPEED;
 }

 //減速を開始し始めるところまで待つ(あと走るべき距離が減速するべき距離より短くなったら・・・)=メインの処理
 while( (len - STEP2LEN(step_r + step_l) ) > ( ((speed*speed) - (tar_speed*tar_speed)) / (2.0*1000.0*accel) ));

r_accel = -accel; //減速する

 //最短走行時の超信地旋回前壁切れ補正

 if(len > SECTION*2) //2区画以上走る場合
 {
 while(len - STEP2LEN(step_r + step_l) > SECTION*1); //停止する1区間前まで走る

while(sen_r.is_wall == true); //右側に横壁がある間ずっと走る

 step_r = step_l = 0; //ステップ数カウントのリセット

 while((step_r + step_l) < LEN2STEP(len_remains)); //あと走るべき距離走る

 MTU2.TSTR.BIT.CST3 = 0; //モータのカウントをストップ
 MTU2.TSTR.BIT.CST4 = 0; //モータのカウントをストップ
//おしまい
 }

 while((step_r + step_l) < obj_step) ; //目標地点まで走行

 MTU2.TSTR.BIT.CST3 = 0; //モータのカウントをストップ
 MTU2.TSTR.BIT.CST4 = 0; //モータのカウントをストップ

}

「//最短走行時の超信地旋回前壁切れ補正」 以降から、「//おしまい」までが松崎が書いてみたプログラムです。
len_remainsは、壁切れを読んでから停止するまでの距離をパラメータにしたものです。

 

これでビルドはきちんとエラーなく完了したので(歓喜!!)、 実際に走らせてみます。

うまくいけば、早速はじめのコーナーで右折の壁切れ補正が適用されるはずです。

 

松崎の予想ではGenieちゃんは、
特に走行時の見た目は変わらない(小さなコースでの試走なので修正されるような誤差はないのでは?)けど、 Genieちゃんの頭の中では処理がされている、 という様子で走行する予定です。

で、す、が…!

結果は、、、

右折する前に止まる!!!!!!

なぜ? 非常に勢いよくとまってしまいます、、、

きっとプログラムが何かGenieちゃんにとって間違っているのでしょう。
ショックですが、実際こうやって止まってしまう、という結果とプログラムをちゃんと照らし合わせて、 原因を把握し次はちゃんと動くプログラムを書きたいです。

くうう><
今日のブログ、お詳しいみなさんには、ツッコミたいけどツッコメないもどかしさを感じさせるブログかもしれないですねw


Posted in Pi:Co Classic製作記