こんにちは、ショウです。前回から走行制御を作り直していて時間が空いてしまいました。
今回はのりさんがブログで紹介してくれた力学的制御をベースにして走行制御を組み込んでいきます。
のりさんは2輪マウスなので、摩擦項目はなくすか検討していましたが、4輪にすると摩擦の影響が大きく発生していたので摩擦項目を入れて作成しています。
摩擦について調べてみたものの、これが正しいというものがある訳ではなく、速度や材質によってもかなり大きく変わるようなのでログから推測して作成しています。
自己流に近い形になってしまったので、問題があったら教えてほしいです。
台形駆動
マイクロマウスの走行制御では、基本的には目標となる速度と角速度を計算して、目標値に向けて制御を行なって走行させています。
目標値を急激に変化させるとスリップしたり、走行が不安定になります。
そのために走行速度を徐々に変更させる必要があり、マイクロマウスではよく台形駆動が使われます。
台形駆動についてはいろいろなブログに書いてあるのでここでは省略します。
台形駆動で目標とする速度が計算できるので、機体が目標通りに動作するように制御を行います。
マイクロマウスの制御で一般的に使用されているのはPID制御によるフィードバック制御です。
ただし、PID制御のみだと立ち上がりが遅れて目標どおりに動作させることは難しいので、フィードフォワード制御も使った2自由度制御で制御する形にしています。
力学的制御
のりさんの力学的制御の式を算出していきますが、実際にはいくつかのパラメータは算出できないので、0として考えるか、走行ログから感覚的に求めるしかありません。
例えば、マイクロマウス競技に使用するモータの電気抵抗は情報があったり、測定できたりしますが、モータ内部の粘性抵抗は測定できません。粘性抵抗や車輪慣性モーメント、インダクタンスは走行への影響は少ないと考えて、0として計算しています。
のりさんのブログの計算2から見ていくと、リンク情報に使用する車体質量は直接測定できますが、慣性モーメントは直接測定できないので、fusion360でおおよその車体質量を合わせたモデルを作成して慣性モーメントを決めています。
また、綿谷さんによると、4輪マウスの場合、超信地旋回時とスラローム時の回転に関わるトレットが変化するので、走行方法によってリンク情報が変化して複雑になります。
今回はスラロームまで考慮していないので、リンク情報が変更されるかもしれません。
床摩擦、機械的抵抗については複雑なので後回しにします。
計算3の部分はかなり値を端折っています。ここの項目は測れないものが多いので、慣性モーメントと粘性抵抗係数をともに0として計算しています。
タイヤの慣性モーメントは計算する必要があるかと思ったのですが、計算してみたところトルクの計算値に対して小さかったので今回は0としています。
MK06-4.5のトルク定数は明記されていないので、計測をした方のブログに載っていた値を使わせていただきました。(家で簡単に測定できなかったので)ロットによるズレはあると思いますがおおよそ合うと考えて使用しています。
後は計算4、5の抵抗や逆起電力定数、バッテリ電圧を入れてDuty比を計算しています。インダクタンスはモータに情報がなかったので0としています。
床摩擦
床摩擦を考える際には、直接測定ができないのでログから感覚的に値を決めています。
簡易的に、直進時には床摩擦はなく機械的抵抗のみが発生していると考え、旋回時には機械摩擦に加えて床摩擦も発生しているとして計算しています。
直進は少し機械的抵抗の成分を調整するだけでおおよそ値が一致しました。
旋回動作では4輪マウスはタイヤを引きずる形になるので、タイヤの摩擦が大きく、摩擦項目入れないとFFでまともに速度が上がらず、制御できませんでした。
わざとPIDのゲインと摩擦項目を0としてターンさせてみるとほとんど速度が上がらずに止まってしまいます。
特に私の機体は重心がモータ軸の直ぐ側にあるので、摩擦の影響をもろに受けているようです。
マイクロマウスで床に接触しているのはタイヤのゴムなので、ゴムの摩擦を考慮する必要があります。
ゴムの摩擦にはヒステリシス摩擦と凝着摩擦の2種類があり、ヒステリシス摩擦はゴムの変形に依存する摩擦で、凝着摩擦は接地面積に依存する摩擦だそうです。
凝着摩擦の方ですが、こちらは接地面積に依存する項目で、今回は一定値として計算しています。
ヒステリシス摩擦はゴムの変形によって発生する摩擦で、速度が早くなると変形量が大きくなり、摩擦力が大きくなるようです。
正確ではないのですが、簡単に今回は速度に比例するものとして計算しています。
また当然ですが、摩擦は移動方向の反対向きに発生するので、目標値に対して逆方向に発生するようにしています。
この状態で実験をしてみたところ、どうしても立ち上がり直後がどうにもならないログが出てきました。
上のログを見てみると立ち上がり直後に値が荒れていました。PID制御でその後の値は一致していますが、最初が荒れていては立ち上がりの改善になっていません。
摩擦の値を小さくすると立ち上がりが遅れてしまい、立ち上がり前後がどうしても追従しませんでした。
摩擦、PID無しのログを見ると最初だけ立ち上がっているので、タイヤの変形が原因と予想して対策をしてみました。
考えとしては、摩擦が強く、タイヤの変形だけが発生している。->変形量が最大になり、静止摩擦が力で車体が停止する。->静止摩擦力を超えて車体が動き出すと考えました。
上のログでは目標以上に上がっていますが、これは最初の変形の段階で変形量分以上に摩擦の値を入れて回転させているので、回りすぎているのだと予想しています。
そのため、角度が一定値以下の時とそれ以上の時で摩擦の式を変化させてみることにしました。
void CTRL_getFloorFriction(float* p_err){ if(f_TrgtAngleS<0){ if(Get_NowAngle() < -0.002) *p_err = (-1)*0.35/1000.0 + (-1)*0.45/1000.0+f_TrgtAngleS*tread/2/PI/109.0; else *p_err = (-1)*0.35/1000.0; } else if(f_TrgtAngleS>0){ if(Get_NowAngle() > 0.002) *p_err = 0.35/1000.0 + 0.45/1000.0+f_TrgtAngleS*tread/2/PI/109.0; else *p_err = 0.35/1000.0; }else{ *p_err = 0; } }
係数に関してはひたすらログを取りながら調整しています。
こうすることで減速が起こりにくくなって立ち上がりが安定したように思えます。
4輪でも2輪と同じような制御で動作すると聞いたこともありますが、今回実際にやってみた感じ重心位置で挙動が変わるのだと思います。機体の重心位置が前よりで、ほぼ前輪に荷重がかかっているマウスの場合、後輪の摩擦はかなり小さくなるので、疑似的に2輪として考えて制御することが可能なのだと思います。
PIDと比較
比較のためにのりさんのブログのフィードバック制御例3を使ったバージョンも作成して、ログを比較するとこのようになりました。
ある程度調整したものの、立ち上がりが一致せず、立ち上がりを合わせようとすると振動が発生してしまい、制御できなくなりました。
比較をしてみて、PID制御だけでも立ち上がり以外は追従できそうですが、立ち上がりがどうしても追従できませんでした。これは4輪の摩擦影響が大きすぎるということだと思うので、2輪の場合PIDのみでも十分に制御可能だと思います。
他の推定方法
他にもMATLABでシステム同定をしてPIDゲインを決める方法があります。
しかし、この方法では機体を実際に走行させたログが必要になるので、機体を走行させる広いスペースが必要です。(特に直進はかなり広いスペースがないと測定できません)そのため、今回はシステム同定をする方法は使いませんでした。
いつかは比較のためやってみたいと思ってます。
結論
4輪になると摩擦成分の推測が必要になるので調整が非常にめんどくさいということがわかりました。摩擦は一定でない上に、変形が原因と思われる挙動もあったのでログから調整しなければいけない項目が多く、トライ&エラーを繰り返すしかありませんでした。
ただ、時間がかかる分ちゃんと立ち上がりが追従してくれるているので、制御はきれいになるようです。床面の状態が違う時にどの程度影響が出るのか怖いですが…
また、吸引を使うと前側に力がかかるので、見た目上の重心位置が変わるので摩擦項目が変わってくる可能性があるのでその時はまた調整していきます。
次回は最初に設計を間違えたモータマウントの修正をしていきます。
参考URL
台形駆動について
2自由度制御について
摩擦について
MATLABによるシステム同定