ぱわぷろ活動日誌

ゆったりまったり技術を学んでいます。備忘録代わりのブログです。書いてあることは私見が多いので参考程度にしてください。

クラシックマウスを作ろう!(11)〜マウスのモデリングと制御システム〜

初めましての方は初めまして。

そうでない方はお疲れ様です。

進捗どうですか?…ボクは1年以上時が止まっているようです。

 

今回はモデリングと制御システムという事でまたまたとっつきにくそうなテーマです。ただ動かすのに最低限必要な知識とその実装に関する話なので深くまでは触れません。

宗教によって突っ込みどころは沢山ありますが、ご容赦ください。 

 

目次はこちら。

 

モデリング

ロボットを作るだけでなく、あらゆるエンジニアリングで重要と言われているのがモデリングです。工学におけるモデリングは、事象の必要な要素を抽出して数理モデルなりコンセプトモデルなりを作成することです。

ロボットとかのイメージだと、ニュートン運動方程式やキルヒホッフの回路方程式に代表される物理の式に落とし込むことでしょうか。

 

ではロボット製作で何のためにモデリングをするのか?

出力に対応する「変化」を予測するため

です。

 

ロボットは入力としてセンサ、出力としてアクチュエータを駆使することは

クラシックマウスを作ろう!(6)~必要な回路の抽出とGPIO、シリアル通信~ - ぱわぷろ活動日誌

で述べた通りです。

しかし、ここには状態という媒介変数が入ります。

出力が状態を「変化」させ

入力で状態を、しいては「変化」を観測します。

この「変化」をモデリングを用いて予測できれば、常に理想的な出力を得ることができ、究極的にはセンサなどの入力すら不必要になります。

モデルには誤差が付きまとうので、その誤差を修正したいか、それとも許容するかでセンサが必要か否か決まります。

 

モデリングの方式には主に以下の3つがあげられます。

第一原理モデリングはまさしく物理学に完全に基づいたモデルです。ホワイトボックスモデルと呼ばれたりします。教科書などで扱う理論はそのままに、現実は忠実に理論と一致するという考えに基づいたモデリングです。摩擦力や空気抵抗を真剣に考慮してもホワイトボックスモデルに含まれます。

ブラックボックスモデルは入力と出力の関係が完全に分からないものを指します。ただし、入力と出力は実測できるのでこれらの結果から伝達関数を予想したりできますが、非線形伝達関数などは非常に難しいと言われています。そもそも、線形なのか、非線形なのかも分からないので頭がワニワニパニックになるのは想像に難くないと思われます。

グレーボックスモデルはこれらの良い所どりを試みたものです。物理の式で立式したもので、式の形が大まかに分かってきてもその係数や変数が不明なものとかに当たります。これは、質量や定数などが測定不可、もしくは個体差が混じっているなどが原因です。現実の問題としては非常に実用的なモデルです。

 

第一原理モデリングはカタログ等の値で係数が分かります。

その他二つに関しては実機(もしくはそれに準ずるもの)を動かして入力と出力のデータを取得し、これらの結果から係数、もしくは式の形を予測します。この流れはシステム同定と呼ばれる方法で、現代ではMATLABなどを用いて手軽に実行することができます。

MATLABを提供するMathWorks社は、マイクロマウスだけでなく様々なものづくりコンテストのスポンサーであり、競技選手にはライセンスを配布したりして技術者教育に多大な貢献をしている企業さんです。

MATLABを用いたマイクロマウス開発をしているブログを以下に載せます。

idken.net

blog.oino.li

今回の記事はこの2つを理解するための基礎知識なのでこれらを読める人には不要かもしれません。

ただ、マイクロマウスに関しては必ずしもモデリングが必要ではありません。(性能アップにはほぼ必須な気もしますが…)

それはある制御方式の恩恵だったりします。

モデリングを隠す魔術(PID)

少し寄り道して制御の話です。

制御の考え方は主に2つに分けられます。

入力情報無しの出力決め打ち制御「フィードフォワード制御

入力情報から出力を変化させる「フィードバック制御

です。

違いはこの辺り参考に。

controlabo.com

 

究極のモデリングがもたらす制御システムは

「出力から起こる変化を完全に予測して、センサ無しでも理想通りに動くこと」

です。これは制御工学で言うところのフィードフォワード制御のみで動くということです。

これはモデリングと現実の誤差が許容できる時には有効です。

しかし、ここまでのモデリングは大変難しい。

そこである考えの宗派が生まれます。

「目標と現在のセンサ値の差が0になるように、出力を変える」

制御工学で言うところのフィードバック制御と呼ばれるものです。

このフィードバック制御の中で簡易さと効能のコスパが高いものがあります。

PID制御と呼ばれるものです。

jp.mathworks.com

 

PID制御は実世界で最も用いられている制御といっても過言ではないでしょう。これはある時刻nでのセンサ目標値とセンサ取得値から偏差を計算します。この偏差、偏差の微分積分のそれぞれに係数をかけたものを出力とする、たったそれだけの方式です。

微分とか積分といっても、ロボットは離散時間で制御されることが多いので実際は近似の式を使っています。プログラム上は下の式みたいな感じになるかと思います。C言語で書くと4行ぐらいでしょうか。

 

f:id:ss_sholaw_wmmc:20210228160042p:plain

PIDの理論式と実際の処理に用いるときの近似

 

f:id:ss_sholaw_wmmc:20210228163702p:plain

C言語でのPID制御フローイメージ

ここまででこの式の無理さ加減に気付いた方は相当いい感じに理解できてると思います。

赤字で示された比例係数、ゲインと呼ばれるものの値はいくつ?

この値を知るための手法がモデリングです。つまり、モデリングが的確にできていればこの値は計算できます。しかし、経験則でこの係数をいい感じに調節できればモデリングを行わずとも機体を動かすことができます。 

巷でとりあえずPIDで良くね…?って言われるのはこれが原因です。

この係数の決め方も一通りではなく、目的によって適した係数のバランスがあったりします。また、偏差の扱いを少々変えて外乱に対する応答を変えたりする微分先行型や比例微分先行型などの亜種も存在します。

arduinopid.web.fc2.com

魔法のゲインによるモデリングを隠す魔術、PID制御は非常に有用ですが立ち上がりの応答が弱いなどのデメリットもある程度はあるので覚えておくとよいです。

亜種との違いを理解しようとするとシステム線図などの古典制御がほぼ必須かと思うので制御工学っぽくなってきます。

 

ちなみに過去のボクはもう1つ違和感を感じていましたが、それは後の項に触れます。

(感じてなければもう動かせると思います)

マイクロマウスをDCモータで動かす

じゃあ真剣にマイクロマウスを動かすことを考えましょう。

センサからの入力情報とアクチュエータでコントロールできるものは何かと考えると次の図の様なイメージになります。

 

f:id:ss_sholaw_wmmc:20210305002218p:plain

センサ情報と出力

ここで大事なのは重心の角速度データをジャイロから取得している点です。差動二輪は一般的には両輪の速度さえ分かれば回転運動を行うことができます。しかし、これを実際にやろうとするといい感じにハードもソフトも工夫する必要が出てきます。

(上手くいけばそれでいいんですが…)

それで変に処理加えるぐらいならジャイロ使ったほうが誰でも簡単にできるのでは???って感じです。フィルタ掛けたりも楽ですし…。

上げられる明確なメリットが少ないのはボクの勉強不足ですね。

あとPWMで既製品モタドラであれば出力はデューティ比でいいと思います。

したがって簡単にPID制御を書くことができると思います。

 

ちなみに並進運動と回転運動はそれぞれ独立しているのでそれぞれの計算結果を足し合わせたものを出力すれば統合できます。

  • 並進の項は左右で同符号
  • 回転の項は左右で異符号

として出力の式に入れてください。

 

PIDも書けるし、センサも出力も分かった。

これでDCマウスを動かせますね?

…ボクはできませんでした。

ここまで述べた方法は制御するための方法であって、「どんな動きを目標にして制御をするか」については説明していないからです。

具体的には「PIDの目標値はどうやって決めるのか」って話です。

機械工学で古くから使われる「制御手法」は「理想の動きに追従する」ためのものです。(ファジィとか、パーティクルはその限りではないけども)

したがって、PID制御ができたとしても「理想の動き」を数値化しないと機体を動かすことはできません。

マイクロマウスの制御システム

一般的な移動ロボットは6自由度を持つと知られています。

X, Y, Z の並進運動及び回転運動、この組み合わせで計3つです。

しかし、マイクロマウスは(一般的には)2次元上の運動です。

これにより、並進運動はX, Yの2つ、さらに回転運動はヨー軸(Z軸を中心とした回転運動)の計3つに限定されます。

またマイクロマウスで多い差動二輪ロボットはその構造上、突然真横に並進移動することはできません。その場回転(超信地旋回)する必要があります。

以上を考慮すると、マイクロマウスの単位時間当たりの移動量は重心の並進速度と回転速度のみで表現される。

 

お堅く書くと上みたいになりますが、要は

マウスの理想の動きは進行方向の並進速度と角速度を使って極座標で表せるよ

ってことです。

 前回で書いた極座標にやっと繋がりましたね。

速度をどのように変化させるか、角速度をどのように変化させるか、それらの速度に追従すると軌道を描くか、これをExcelとかMATLABとかPythonとかでグラフ作りながら「理想の動き」を作り、プログラミングしていきます。

180mmだけ前進して止まるにはどう変化させればいいか?

90degだけ回転して止まるにはどうすればいいか?

もちろん、速度だけでなく走った距離や角度もセンシングして加速や減速のタイミングを計る必要があります。

 

そして速度をベースで考えると、位置の積分誤差がたまるので補正が必要です。

これは壁制御や壁切れによる補正、尻当てなどがあります。

(位置を基準にして軌道を生成し、軌道自体に追従する制御方式もあります)

したがって、マイクロマウスには主に

  • 並進速度のPID制御
  • 回転速度のPID制御
  • 壁制御(Pだけだったり、Dが入っていたり…)
  • 自己位置の補正(壁切れによる位置補正、尻当てなど)

などが同時に働いています。

ここは個人の工夫が目立つところなので人によって異なると思います。あくまで一般論です。ボク自身も必ずしもこの通りではありません。

このシリーズでは速度追従について扱います。というか自分はそれしかやったことない…。目標速度の作り方は本当はこの記事で触れる予定でしたが、ここまであんまりにも長くなったので次回にします…。

 

当初は12回で完結の予定でしたが、長々と駄文を綴ってしまっているため次回では終わりになりそうにないですね…。はたしていつの日になる事やら…。

ここまで読んでいた方、飛ばして読んでいる方、皆様ありがとうございます。

それではまた。