AVE -1・ソフトウェアの秘密





探索時の小細工



さて、探索のところで少し触れましたが、
「2秒以上マウスが静止したら、走行を中止したものとみなす」という規定が、この大会から導入されました。
この規定に引っかからないようにするためには、
当然、「走行しながら探索方向を考える」ことが必要になります。

特に、今回使っている足立法は、等高線の計算が結構重たいですから、このことはかなり重要です。
しかし、走行しながら考えると、姿勢制御が疎かになるという危険が付きまといます。
これに関しては、CPUを早くして計算している時間を少なくするか、計算モジュールを最適化して、
少しでも早くするかしかありません。

H8/3048Fを使っている方であれば、3052Fに変更する、という解決方法をお勧めします。(つまりCPUを早くする)
ただしこの方法は、それなりにマイコンの知識がある方に限ります。

3048Fと3052Fは、同じバイナリを理解できるので、変更なしでも動いてくれます。
しかし、メインクロックが16MHzから25MHzに上がっている都合上、時間に関係する部分は
すべて書きかえる必要があります。(当然、タイマー周りは一切合財書きなおすことになる・・・と思います。)

よって、ちょっと敷居が高いです・・・。

私は両者の違いは、大体理解していたのでこの方法をとるつもりでした。
しかし、3048F用にデバッグボードを開発していて、これがそのまま3052Fに使えない(ちょっと手を入れる必要あり)
事がわかったので、この乗り換えはやめました。

結局モジュールの最適化を行うことにしました。
(最適化といっても、大したことはありません。ループ文を削ったり、関数呼び出しを極力止めたり
といった事をしただけです。当然、これをやるとコードが読みにくくなります。)


さて、ここまで作ったところで重大な問題にぶち当たりました。
それは、「等高線を引くためには、現在いる区画の壁情報を正確かつ完全に取る必要がある」
ということです。


ここで、AVE−1の形状を見てみましょう。

前壁を取る、センサの長さを見てください。
この写真だと分かりにくいかもしれませんが、実は3センチちょっとしかありません。
その3センチの先に、1つずつ、合計2つのセンサが下向きについています。

このセンサで自分の進行方向の壁を見つけようとすると、「その区画に完全に入りきる必要がある」
必要があります。


ところで先ほど、等高線の計算を最適化したと書きましたが、たとえ最適化したとしても、
計算している間に、3・4センチ以上は進んでしまう位、重い計算です。


・・・ということは・・・。
壁を見つけた→計算中→・・・その間に4センチ以上進んでしまう・・・
あれ・・・?

あ・・・

「計算中に壁に突っ込んじゃった!!」

・・・という事態が発生してしまうわけです。



こりゃ、駄目だ。どうしよう・・・。ここで3つの解決策を考えました。

1.探索時の進行速度を落とす。
2.センサをもっと前につける。
3.思い切って止まって考える。

1、もしくは3は、現実的な解決で、悪くないです。
ですが、過去に時間切れでゴールが公式記録にならなかった経験から言うと、
少しでも早く探索を済ませたいのが人情(?)でしょう。

2も試してみましたが、
センサの位置が変わることによって、大幅なコードの見直しが必要になりますし、
高速走行時、車体の安定度がかなり落ちてしまう、という欠点があったので、
(かなり良い方法だったのですが)却下しました。
(取り付け方がまずかっただけかもしれませんが・・・。)



なんとか他に良い方法はないか・・・と考えていると。

かなり馬鹿馬鹿しい(?)方法を考え付くにいたりました。


・取れない情報は、前壁だけだ。前壁以外は正確な情報を、区画に完全に入り切る前に得ることができる。

・前壁だけ分からないとしたら、想定できるデータは、「前壁ありの区画」と「前壁なしの区画」の2つだけだ。

・区画にマウスのセンサ部分が入ってから、車体が完全に区画に入るまでは、10センチ以上ある。
ということは、結構時間があることになる。

以上の考察から、
「前壁がある場合と、前壁がない場合、2通りについてあらかじめ考えておけば良い」
という、結論を導き出しました。


これは、具体的には以下のようなものです。

・区画にセンサが入った後、横壁の状態を知ることができます。その区画に「入って」きたのだから、後ろ壁は当然なし。

・さて肝心の前壁は、あるかないかの二通り。

・ここで、「前壁があった」として、現在いる区画の情報を仮に作り等高線を引いて、移動する方向を決定し、
仮の変数にその方向を保存。

・次に、「前壁がなかった」として、同じように方向を決定し、これも保存。


これだけの計算をしたあと、車体の角度をまっすぐに直します。
その後、一定距離を進んで、その区画に完全に入ったことになります。
つまり、前に壁があるかどうかが判断できる場所まで進んだわけです。

もう後はお分かりですね?
壁があったら、「前壁があった」時に進む方向を、保存してある変数からとりだし、そちらの方向へ進みます。
なかったら、「前壁がなかった」時に進む方向を、保存してある変数の方から取り出して、それに従います。

ただそれだけです。



こういう重たい処理をしてこのマウスは進んでいるのです・・・。

・・・これを書いているうちに思ったんですが、センサの配置に関しては、明らかな設計ミスですね・・・。
もっと前に、安定する形でとりつけられれば、こんな苦労はしなくても良かったんですが。
きっと、AVE−1もこの点には不満を感じているでしょう(?)。



ちなみにBASICMOUSEのような今時のマウスだと、アナログ的に前壁までの距離が読めるので、
区画の真中、果ては区画に入りかけの状態でも、前壁の情報を取ることができます。

つまり、こんな苦労をする必要はないはずです。





戻る