この記事はMice Advent Calendar2018の8日目の記事です。
昨日はb4rrAcud4のPython&Matplotlibで簡単シミュレータを作るでした。
GUIにおいて、今となってはUI/UXを考えて作るのは当たり前であり、それは、は自分を手助けしてくれるためのものです。
しかし、UI/UXの設計を怠ると、当たり前な便利な機能やUIを遠回りして実装してしまう、なんてこともあります。良いUIがあれば率先してパクりましょう。OSSやフレームワークはそれを助けてくれるはずです。
0. 斜めの姿勢制御について(About control on diagonal running.)
マイクロマウス、クラシックマウス共に、最短時の鬼門1つが、斜め直進時の姿勢制御だといっても過言では ないだろう。
今回はその制御の一つの解を示せたらと思う。
1.なぜ斜めの姿勢制御は難しいのか(Why Diagonal Running is so difficult?)
通常の直進時は、事前にセンシングして見つけた一定のリファレンス値を理想値として、PID制御を行う。
斜めの姿勢制御では前向きのセンサーを数度傾けることで、ズレた際に見える柱を検知し、避けるように制御することが多い。(あるいは、通過後の柱のピーク値から偏差を推定し、移動するなど。)
今は思う、それ直進時と全く制御するモノが違うじゃん。と
ただのPID制御だけでいい感じに行ってくれと思いませんか?
2. 簡単に制御するためのあるべき論は?(A certain argument for easy control.)
あるべき論としては、勿論、以下の通り。
常に理想とする場所があって、そこに収束するように制御ができるようにする。
言い換えると、直進時と同様、
事前にセンシングして見つけた一定のリファレンス値を理想値として、PID制御を行う。
3. マイクロマウスのルールについて(Rule of MicroMouse)
以下抜粋
2-4 各単位区画の四隅にある0.6cm×0.6cmの小正方形部分を格子点と呼ぶ。終点領域内を除いたすべての格子点には少なくとも1つの壁が接している(図1参照)。また、迷路全体の外周の壁は全て存在する(図1、図2参照)。
上記のルール上、以下のことが言える。
斜め走行中の車体の近接する柱には壁がある。
つまり、これを以下のように考える。
斜め直進中、壁が見えるようにセンサーを置け。
4. センサーの配置を斜め用に考える(Think of the arrangement of sensors for diagonal use)
以下の画像の通り、真横90度センサーと45度センサーを使う
このとき、斜め進行中、以下のように壁が見える。
このとき、45度センサーが柱・壁の切れ目をとらえることが重要である。
壁が進行方向に対し、手前を向いているとき、45度センサーによって、確実に見える。
壁が進行方向に対し、手前を向いていないとき、90度センサーによって確実に見える。
5. 理想のリファレンス値をとる(Take the ideal reference value)
45度センサーの壁・柱の切れ目の閾値を定め、斜め直進をする。 その際、ログ情報として以下を扱う。
- 45度センサーの値
- 90度センサーの値
- 45度センサーの切れ目からの直進した距離(周期は180×1/2 or 90×21/2)
- 左右それぞれ、壁切れからの距離を加算
45度センサーの値と直進した距離を同時プロットしたのが以下。
90度センサーの値と直進した距離を同時プロットしたのが以下。
45度センサーが検知した、切れ目以降の距離0から180×21/2 (or 90×21/2)までの値をテーブルとして持つ。 これを90度センサーも同様に行うと、距離に対し、理想のセンサー値は以下のグラフの関係がある。
横軸=距離としてテーブルにすればよい。
あとは切れ目以降、この距離に応じたリファレンス値を参照して、その偏差をPID制御を行えばよい。
注意点として、柱などの付近、黄色の30~50、160~190、灰色の0~20、220~250は切れ目に近く、不安定だと判断したため、現在、この区間にいる際は制御に使ってない。
ね?簡単でしょ?
真横90度センサーがあることで、Y.Iがで示していた補正とはまた異なる、探索中の壁切れの「スラロームの後区画中に壁切れ」が実現します。
センサー5個アリだと思いませんか?勿論、最後の一つは正面に配置します。 前壁制御に使うことで、より正確にスラロームの前区画の調整します。
最後に(at last...)
明日、12/9はmm_55Tさんの「寄席に初めて行った感想」です。
概念の上の存在だったあの人が、浅草に顕現したときのお話です。