DATE: --/--/--(--)   CATEGORY: スポンサー広告
スポンサーサイト
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
page top
DATE: 2015/12/30(水)   CATEGORY: 未分類
うむ夫。探索編(3) ~壁制御編~

2015年もあと少しですね.
今回は壁制御について書いていこうと思います.
壁制御について書くと言っても全てを説明するのも面倒なのでこちらを見てください.

うむ夫。はリンクされているURLに書いてある内容と同じような制御で走っています.
自分はこれについて,経験をもとにポイントや工夫点をまとめたいと思います.
長文になってしまったため興味がある人は下線部がついている部分,下のほうだけを読んでもらっても構いません.
これから,壁制御にとりかかる人や現在壁制御で躓いている人の参考になればいいなと思います.

壁制御とは,Mice Wikiに書いてある通り
「横向きに照射している光センサからの情報を使って、車体の姿勢を制御する方法」
です.
壁制御の実装や仕組みについてはMice Wikiを参照してください.
よし!壁制御を実装しようと思った人は気づくと思いますが,壁制御において重要なパラメータはいくつかあります.
自分としては重要なパラメータは4つです.
その4つとはMice Wikiの言葉をでいうと,

1.真ん中に置いた時のセンサの値
2.制御定数
3.閾値
4.一定の変化量

です.それぞれについて説明していきたいと思います.


1.真ん中に置いたときのセンサの値
このパラメータが重要な理由ですが,偏差の式を見ていただければすぐにわかると思います.偏差の式は,

「偏差 = (左センサの値 - 真ん中に置いた時の左センサの値) - (右センサの値 - 真ん中に置いた時の右センサの値) 」

と定義しています.このことからわかるように,真ん中に置いたときのセンサの値は偏差の値に影響を及ぼすため,しっかりとした値を決めないとうまく走ることができません.
値の決め方としては,壁がある状態でマウスを迷路の区画の中央に置いたときに読み取ることができる値を使ってください.以下の写真の状態でセンサ値を確認してもらえば大丈夫だと思います.

中央でのセンサ値の取り方

おそらく,左右のセンサ値がおよそ同じ機体でなら適当な値を入れても「両壁がある」場合なら中央を走ってくれると思います.
しかし,片壁のみで制御をしなければならないときは中央から寄って走ると思います.理由としては簡単です.
片壁のみある場合,偏差の式が変わるからです.例として,右壁のみの場合の偏差の式を見てみましょう.

「偏差 = -2 * (右センサの値 - 真ん中に置いた時の右センサの値) 」

壁制御では偏差を0に近づけるように走ろうとします.それ故に,実際の値とずれた値を入れてしまうとマウスはずれた値を中央だと思うので中央から寄ったり離れたりして走ってしまうと思います.片壁のみの場合でも中央を走るために,壁がある状態でマウスを迷路の区画の中央に置いたときに読み取ることができる値を用いることが重要です.


2.制御定数
簡単に言うと,制御定数壁制御の強さを決める値だと思ってください.値が高いと制御が強くかかります.逆に低いと制御は弱くなります.値を高くし過ぎるとと動きがガタガタします.値を低くし過ぎると制御がかからず壁制御の意味がなくなります.マウスを区画の端に置いて動かしたときに1~1.5区画以内に中央に戻れる値に決めましょう.適切な値は機体により個体差があるのでビシッとは言えませんが0.1~0.5くらいがいいと思います.参考までにうむ夫。の場合は0.2でした.


3.閾値
閾値とは,壁の有無を判断する値です.つまり,偏差の式の使い分け(両壁,片壁,壁無し)は,この値をもって行います.閾値を決めるときに重要なことは,2つです.

1.壁の無いときのセンサ値と壁の有るときのセンサ値との間であること
2.壁が無いと判断するタイミングが同じでであること

これらを考慮して値を決めなければいけません.値の決め方としては,区画と区画の境目から数 cmずつ離れた位置に壁を配置し,そのときのセンサ値を閾値として用いるという方法です.以下の写真を参考にしてください.これは,区画と区画の境目から3 cmずつ離れた値を閾値として用いています.

閾値の取り方

1については当たり前のことなので説明を省きます.2については説明しようと思います.壁が無いと判断するタイミングが同じでであることが重要になるのは両壁が有る状態から両壁が無い状態に変わるときに起きます.例えば,十字路への侵入や袋小路からの脱出のときです.このような場合,偏差の式は「両壁→壁無し」となることが望ましいです.壁が無いと判断するタイミングが違うと「両壁→片壁→壁無し」のように変化します.この影響は吸い込まれる現象が起きる場合に姿勢を大きく乱す原因になります.


4.一定の変化量
一定の変化量を用いる目的はMice Wikiを読んだ人ならわかると思いますが,吸い込まれる現象を回避するためです.上記のことを守ってもらえれば,ずっと同じパターンで壁が有る場合ならまっすぐ走れるはずです.しかし,迷路上ではそうはいきません.

では,なぜ吸い込まれ現象は起こるのかということについて考えましょう.例として,両壁→左壁のみとなる場合を考えましょう.センサ値は反射光の強さによって変わります.壁がなくなる位置に近づくにつれてセンサ値は徐々に低くなります.このときにマウスがどのような動きをするか考えましょう.

両壁がある状態では偏差の式は,

「偏差 = (左センサの値 - 真ん中に置いた時の左センサの値) - (右センサの値 - 真ん中に置いた時の右センサの値)
= 左センサの差 - 右センサの差」

に従います.このとき,「偏差 > 0ならば左に寄っている,偏差 < 0ならば右に寄っていると判断されます」.ここがポイントです.
では,両壁→左壁のみとなる場合の偏差の値を考えましょう.
① 両壁がある場合
偏差 = 0
→中央にいると判断

② 移動して右のセンサ値が低くなっているとき
左センサの差 = 0
右センサの差 < 0
→偏差 > 0
→左に寄っていると判断

このように実際には中央を走っているにも関わらず,左に寄っているという判断をしてしまうのです.このため,吸い込まれる現象は起こります.これを解決する方法が閾値を引き上げるという方法です.閾値を引き上げるということは,壁の無い状態と判断させやすくする,つまり偏差の式を変えてあげるということです.

一定の変化量の値は,センサ値を読み取る周期によりますので変化量のログをとって吸い込まれなくなるような値を使ってください.

壁制御は姿勢を正す制御です.大きく中央から外れた場合からの復帰のときは必ず移動距離にずれが生じます.そのずれを補正する手段は別に考えておいたほうがいいのではないかと思います.


壁制御の基礎は以上で終わりです.ここからは,うむ夫。を動かす上で工夫している点を紹介します.

1.櫛において真ん中に置いた時のセンサの値を低くする.

うむ夫。は櫛にとても弱いんですね.櫛に入るときに姿勢がずれていた場合は柱を使って姿勢を直さなければいけません.うむ夫。はこれがすごい苦手です….そこで,櫛を走っているときは真ん中に置いた時のセンサの値を柱の中央のみに当たっている値にしています.こうすると,柱での制御が効きやすくなりました.櫛である区画の判断は各々で異なると思いますので割愛します.


2.減速区間の半分は壁制御を切る.

これは,180°ターンしたいときに必要です.袋小路以外で180°ターンする場合,前壁センサ用のLEDの影響でセンサ値が非常に高くなる場合があります.それを防止するために,このようなことを行っています.


3.低速域,高速域や加速域では壁制御を切るもしくは弱める.

これは誰もがやっていることだと思います.低速域下で壁制御がかかる場合,片側の速度が低くなりすぎてしまうことがあります.それを防ぐためにこれは行います.高速域や加速域では壁制御により車体が大きくぶれることがあります.そこに過度の制御をかける場合,脱調をする恐れが増します.故に,制御定数を弱めています.


4.一定の変化量による閾値の変化はセンサ値が真ん中に置いた時のセンサの値の±30以内でしか適用しない.

これは,一定の変化量を設けたら,端から置いてスタートしたらマウスがガタついて距離がずれてしまう病の人にお勧めです.変化量を絶対値でとる場合,片壁に寄ってしまっているときからの復帰時には両センサで変化量が生じます.それにより,偏差の式が変わろうとしマウスがガタつきました.変化量を絶対値でとる場合,この対策は何らかの方法で必要だと思います.そこで,思いついたのがこの方法です.一定の変化量を設ける目的は吸い込まれ防止です.吸い込まれるときは,中央にいるときに限ります.それを考えるとこの方法でいいのでは?と思いつき実装しました.同じようなバグを抱えている人はぜひ試してみてください.


自分が伝えたいことは以上です.壁制御は奥が深いのでまだまだ勉強が必要だと思います.


追記
先日行われたMicethon 2015においてソースコードが汚いなど基礎ができていないなどお説教を受けることになりました.次回作では直していきたいです.

スポンサーサイト

コメントの投稿

 管理者にだけ表示を許可する
Copyright © うむ夫の歩み. all rights reserved.
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。