nacarの独り言

マイクロマウス作ってるらしいです

JASALMAのプログラム解読Part4 壁制御

皆様お久しぶりです。

 

最近は次作マウスの設計に追われていてブログを書く余裕がありませんでした。

今は少しの間実家に帰っており、製作ができない状況(部室じゃないと活動できないできない病)なので1回でも2回でもブログの更新ができればと思っております。

 

さてさて何を書こうかって感じはすごいあるんですけどやっぱりPart3で止まっているプログラム解読をやっていこうと思います。

前回までで走行系とバッテリー・センサーの基礎は書いたつもりなので、今回のPart4で何か書こうかな~と思った結果、思いついたのは左手法でした。

が、

書いてる途中に「あ、壁制御書いて無くね?」と思いまして、「まあ次かその次かに書けばいいか」と思っていたのですがそもそも左手法を書いていた下書きが保存できておらず、きれいさっぱり無くなっていたので本来の作成順の通り先に壁制御について書いていきます。

 

さて前置きが長くなりましたここから本題

「マウスを走らせていて区画の真ん中を走っていない!このままじゃ壁にぶつかってしまう!」そんな風に思ったことが一度はありますよね!(←マウス初心者向けに書いているつもりです・・・)

そんな時に便利なのがこれ!

”壁制御”

(↑マウス初心者向けに書いているつもりです・・・(重要なことなので2回言いました))

じゃあ壁制御とは何か

→センサー値を用いて自身の位置(区画中心との差)を認識し、その情報をもとに区画の真ん中を走るように調整するような制御です。

この制御はPID制御の中のP制御にあたるらしい(?)ですがその辺は詳しくないので強い方かGoogle先生に聞いてみてください。

 

壁制御の理屈がわかったところでどのようなプログラムが必要か考えて行きます。

簡単に書いてしまえば右に寄っていたら右のモータを早く回し、左に寄っていたら左のモータを早く回せばいいってだけになると思います。

さらに言えばどれだけモータを早く回すかっていうところをセンサー値に比例して決めてあげればいい(比例(P)制御?)という話になります。

 

そんな中壁制御について調べていたらMice Wikiにも壁制御のページがあったことを思い出したので貼っておきます。

 

ここにも書いてあるようにモータの速度に式は以下のようになります。

右モータ速度=重心速度+制御量

左モータ速度=重心速度ー制御量

 

じゃあ次に気になるのは制御量ってどうやって求めるのか?ってところだと思います。

 

ので以下では制御量の求め方について記していきます。

制御量を決めるのは左右の壁に対するセンサー値である、と言いました。

一方で左右の壁の有無は両壁有or無・左右のどちらかのみ有の4パターンがありそれらは区別してあげなければなりません。

(そうでないと左壁だけ有の場合に右のセンサー値が低くなりこれを基準値に戻そうとする制御が起こりどんどん右に流れて行ってしまいます。)

そのためパターン分けしたうえで制御量を求める式を書いていくこととします。

 

  • 両壁有

制御量=Kp*(右センサー値-右基準値)-(左センサー値-左基準値)

  • 左壁のみ

制御量=Kp*(-(左センサー値-左基準値)*2)

  • 右壁のみ

制御量=Kp*(右センサー値-右基準値)*2

  • 両壁なし

制御量=0

 

さて、新しい要素が2つ出てきました。

それがKpと基準値です。

基準値は説明すつほど大したものではないですが機体を区画中心(左右に寄っていない状態)にした際の左右のセンサーの値です。

制御量の式を見てもらえればわかるようにセンサー値が基準値と一致すれば制御量が0になることから壁制御によって目指すべき場所、という意味になります(?(←日本語が上手じゃない気がする・・・))

 

次にKpについて。

これは単に比例定数です。

この値によって壁制御の強さを変更できます。

小さすぎるとなかなか真ん中に戻らないし、大きすぎると振動する・・・?のかな?

まあまあとにかく程よい値にする必要があると。

程よいってのがどれくらいなのかは宗教によるものらしいので「何が正解!」とかはないと思います。

(僕が聞いたのは1区画くらいで真ん中に戻れるくらい、とかって感じでした)

そう考え試してみるとKpは0.2~0.5くらいの値になるのかな~と漠然と思っています。

ただセンサー値とかにもよるので個体差大いにあり、です。

 

んで、あと残っているのが壁があるかないかの判断基準のセンサー値、吸い込まれ対策、とかとかを書いてあげると壁制御ができると思います。

が、

疲れたし長くなってきたので今回はここでやめて残りはまた次回にまわします。

 

ではでは(^.^)/~~~

Q