2023年度クラシックマウス carmine 解説 ③ソフトウェア編

2023年度クラシックマウス 機体解説記事になります。

今回はソフトウェア編になります。

 

機体の概要は↓

b4rracud4.hatenadiary.jp

●制御

駆動系の制御システムのブロック線図をつくってみました。(合ってるか分らんけど)

 

darwioというのを教えてもらって初めて触りましたがすごい使いやすいですね。

drive.google.com

なお、制御系とブロック線図についてはこちらを参考にさせて頂いています。

qiita.com

 

制御は速度&角速度フィードフォワード(FF),フィードバック(FB)と電流FBをカスケード接続しています。

メインループ(制御周期1kHz)では速度/角速度のPI制御に加速度/角加速度のFFを追加し目標電流を出力し、サブループ(制御周期20kHz)では電流FBとモーター回転数に比例した逆起電圧の補償を入れています。

FFは加速度/角加速度に対してのみ入れています。目的は加速開始時のサーボ遅れを緩和するためです。速度FFも試してみましたが不安定化したので無くしました。加速度FFも理論上は機体重量/イナーシャからゲインが決まりますが、実際は調整してやや小さめに設定しています。少なくともDCモーターのマイクロマウスにおいてはFFが強すぎると制御が不安定化しかねないので、程ほどにしておくのが無難なようです。

大きな特徴はモーター電流FBを採用している点です。モーターの本質は電気エネルギーを運動エネルギー(=トルク)に変換するもので、出力するトルクを制御したいのが本音です。そして、モーターの出力トルクは流れる電流に比例するため、電流制御≒トルク制御と言えます。実際には目標電圧と電流センサからの計測電圧でPI制御をし、電圧(=Duty)で出力しています。

また、モーターは回転数に比例した逆起電圧を出力するため、最終段で逆起電圧分の補償を入れて出力しています。

電流FBに関してはu氏等の先駆者様のブログ等を参考にさせて頂きました。

hidejrlab.blog104.fc2.com

hidejrlab.blog104.fc2.com

電流FBは時定数が短いためメインループとタイマーを分けてサブループとして独立させています。サブループの制御周期が速いので今回のマイコンでは計算速度がカツカツらしく、コンパイラの最適化オプションを速度優先(-Ofast)にしないとまともに動きませんでした。次回作を作る場合はもっと動作周波数が高いマイコンを採用した方がよさそうです。

 

ここまで書いておいてアレですが、制御工学は学術的な内容を理解できていないので、他の人を参考にしながら勘とゲインチューニングのパワープレイでなんとなし動いている状態にしています。

↓PID制御の悪魔

 

●多段加速

上でも触れましたが、モーターは電流に比例したトルクを出力し、回転数に比例した逆起電圧を出力します。これをT-N特性と呼んだりします。

www.nidec.com

DCモータを使ったマイクロマウス入門③ | RT Robot Shop Blog

この特性から、加速時に一定の加速度を維持しようとすると、モーター回転数に比例して印加する電圧(Duty)を上げる必要があります。ただし、印加できる電圧の上限はバッテリーの性能で決まってしまうため、一般的な台形加減速の場合、高回転域でのDuty見合いで加速度が決まってしまうため、低回転域でDutyを持て余してしまいます。

そこで、昨年度から加速度を複数設定できる多段加速を採用しています。自分の場合は加速度を3段用意しており、速度が上がるにつれて加速度が下がるようになっています。本来であれば回転数見合いで加速度を連続的に変化させるのが理想ですが、距離計算が面倒ですしこの方法でも十分だと思います。

この辺りはあさ氏のブログにも取り上げられていますが、上位勢は結構やっている人が多い印象です。

haido.blog.jp

 

●壁切れ

最短走行時の補正方法として「壁切れ」と呼ばれる手法があります。これはターン前に壁センサーの値を監視し、一定に閾値を下回った(=壁がなくなった)タイミングを見て距離補正する手法です。詳しくは用語集をご確認ください。

blog.tokor.org

単純な割に強力なので、中級者以上であれば殆どの方が実装されていると思います。自分の場合はすべてのターンが壁切れを確認してからターンするようにしています。

壁切れの判定方法はいくつかありますが、自分は壁センサー値と、その変化量の両方を用いています。基本は壁センサー値で判定していますが、姿勢が乱れたりした際の誤検知を防止するため、変化量を補助的に用いています。

ちなみにセンサー値は離散値になるので、変化量の計算(微分)にはコツが要ります。

regarasu.blogspot.com

 

●壁制御

簡単に言うと壁センサーで壁との距離を測定し、区画中央を走るようセンシングする制御を指します。詳しくは下記記事に全部書いてあるので見てください。

blog.tokor.org

また、一般的な赤外線ダイオードを発光させて壁からの反射量を受光素子で読み取る方式だと、壁が無くなった区画でセンサー値が緩やかに変化するため、制御の切り替えを単純な閾値のみで判定すると壁が無くなった方に機体が吸い込まれる現象が発生します。

対策として、こちらも壁切れの変化量を確認してます。変化量が閾値以上の場合は、吸い込まれる方向の制御量が0になるような条件処理を入れています。

下記記事では、壁制御の閾値を上げる方法を解説していますが、いっそ制御量を0にしてしまっていいと思います。

mice.deca.jp

 

●探索アルゴリズム

探索は最初にゴール区画に入るまでは通常の足立法で入っています。

ゴール後はダイクストラを用いて最短経路を探索しに行くアルゴリズムになっています。

ダイクストラ区画境界にノードを置き、直進と斜めでエッジの重みを変えることで通常の足立法と比較して斜め移動で短い経路を見つけやすくなっています。また、直進が連続する区画は例外的にエッジの重みが軽くなるような処理を入れることで長い直線を優先するようになっています。

ちなみに探索アルゴリズムは初めてクラシックマウスを作ってから全く変更を加えていませんでしたが、今年になってバグを見つけました...

ただしこのアルゴリズム

↓第44回全日本 クラシック迷路の探索結果

 

ここまでで解説編は一旦終わりとなります。

もうちょっと踏み込んで書きたいことはいっぱいあるんですが、疲れたし内容が長くなりすぎるので、余裕が出来たら別途記事を書こうと思います。