Training Tracerのシステム同定とコントローラの設計

Training Tracerのヨー回転運動の伝達関数を同定してコントローラーも設計してみる
①おもむろにsimulinkのブロック図を描く

直進にPWM duty50%を使い、回転の制御量にduty±40%を与える構成にしている。
今回は回転の入力にランダム信号を選択した。信号ソースはPN Sequence Generatorブロックを使用した
Bernoulli Binary Generatorブロックも試したが監視と調整で通信しようとするとXCP通信エラーがでて使いこなせなかった
PN Sequence Generatorブロックの出力を制御周期の5ms毎に切り替えると機体が全く応答しなかったので0.1s間隔で信号を切り替えるようにZero-Order Holdブロックを挿入している

②監視と調整で実機の応答波形を取得する

④MATLABのアプリからシステム同定アプリを起動して1次遅れ系と2次遅れ系の2種で伝達関数を推定した

1次遅れ系としての推定

2次遅れ系として推定

⑤シミュレーション用のsimulinkのブロック図を描く

モデルの部分はTransfer Fcnブロックではなく、LTI Systemブロックを選択してシステム同定アプリで導出したモデル名(tf1)を選択する

⑥コントローラーのゲインを調整する

今回もゲイン調整は自動ではうまく動かず。
1次遅れ系のモデルを使用すると、ちょっと無理な感じのハイゲインまで設定できたので、1次遅れ系は使用を見送り
(2次遅れ系のモデルでも結果的に実機よりもハイゲインまで動くようで、低いゲインから実機との相関をとっていく必要がありそう)

⑦シミュレーション環境でのコントローラーのゲインの合わせこみ結果

(実機と往復してゲインを下げていった最終のもの)

⑧実機制御用のsimulinkを描き、調整したコントローラーをコピペする

⑨監視と調整を行い、シミュレーションと実機の波形を比較する

青がシミュレーションの応答波形で、赤が実機の応答波形
何度かシミュレーションと実機を行き来した結果、ゲインが高すぎない場合はそこそこ一致できた

DCモータのコントローラを作成する

同定したDCモータの伝達関数を利用してコントローラを作成してみる
①おもむろにsimulinkでブロック図を作る

ステップ入力、Sum、PIDコントローラとTransfer Fcnブロックを配置してFB系を作る。Transfer Fcnには前回導出した伝達関数を入力する。
PIDコントローラは離散系にして、サンプリング時間は実機に合わせて0.005sに、実機に合わせて出力の上下限とアンチワインドアップも設定しておく。
②モデル設定のソルバーを固定ステップにして、時間を0.005sに設定する

③PIDコントローラーのゲインを調整する

シミュレーションの結果を見ながら調整を行う。
本当は自動調整を利用したかったが、離散系を選択するとゲインの自動調整ではゲインが強すぎて発振したため断念。

合わせこんだ結果の波形
④実機制御のslimulinkを立ち上げで、調整したPIDコントローラーをコピー貼り付けする

⑤監視と調整を行い実機の波形を取得する

緑がシミュレーション結果で、赤が実機の応答結果。かなり一致しているようだ

モータの伝達関数を推定する

Training Tracerに付属しているエンコーダ付きDCモータの伝達関数(時定数)を推定してみる
①おもむろにsimulinkのブロック図を描く
DCモータへのステップ入力(0s-0.5sはPWM duty20%、0.5s-1.0sはPWM duty90%)と、制御周期(ステップ時間5ms)毎のエンコーダの速度を取得するブロックを作る。
そして二つの信号を後ほどシステム同定アプリで使いたいのでto Workspaceブロックに繋ぐ。信号の保存形式は2次元配列に設定する。システム同定アプリへの入力にdouble型が求められるので型の変換ブロックも追加する。
②simulinkの監視と調整で実機を動かす。実機が動いた後にこのような波形が取れる

③MATLABに戻るとworkspaceに、to Workspaceブロックで取得した配列が保存されている
④MATLABのアプリからシステム同定アプリを起動する

⑤システム同定アプリの右上側のimport dataからtimedomain dataを選択して
⑥出てきたimport dataの画面のinputとoutputにworkspaceの配列を入力、start timeは0に、Sample timeはsimulinkのステップ時間の0.005sを入力して、画面下のimportを押す
⑦画面中央のEstimateからtransfer Function modelを選択して
⑧Estimate transfer Function画面の極(pole)を1に零点(zero)を0に選択してEstimateを押す
⑨同定が完了する。この画面は閉じる
⑩システム同定アプリに戻るとft1の名前で結果が保存されているのでクリック。開いた画面で伝達関数を確認できる(時定数で37ms程度になる)

制御周期は間に合っているか?

Embedded Coderの出力するコードの制御周期が本当にソルバーの固定ステップの指定時間周期で動いているのか疑問だったが、無理な値では正しく動かないらしい。そして、制御周期が間に合っているかの判断は、監視と調整の設定時間と実時間があっているかで判断できる。
ソルバーの時間を過度に短く設定すると監視と調整の終了時間を過ぎても終わらなくなり、例えば10秒設定なのに20秒間続くようになる。

Training Tracerの制御周期のボトルネックはジャイロセンサとのI2C通信のようで、Hardware Blockset の初期値ではジャイロのセンサのほとんど全ての値を取得しているために制御周期は8ms程度が限度になった。そこから加速度や磁気のブロックをコメントアウトすると4ms周期で動くようになり、Z軸のジャイロのみに絞ると2ms周期で動いた

Training TracerのHardware Blockset


Training Tracer Ver.2の機体の仕様を知らずにHardware Blocksetを使って躓いたところ

  • Swithブロックの出力は初期値が1で押下時に0になる
  • Motorsブロックの入力は右モータはdirection=0で前転で、左モータはdirection=0で後転になっている。転方向を左右で揃えるために一方の入力を反転したいがエンコーダは初期の回転で正回転(前転)と判定しているため、モータの回転向きを修正するとこちらも修正が必要になる
  • バッテリ電圧は回路図を参照すると上段20kΩと下段10kΩで分圧している。ADCのリファレンス電圧が3.3Vで分解能が12bitだとするとバッテリ電圧5V時にSOCの信号は2068程度になりそうだが、結構誤差が大きいようだ。マイコンのADCポートの入り口にコンデンサが無いのも気になる
  • TrainingTracer_V3では0.1uFが追加されている

    Embedded Coder Support Package for STM32の必須ファイル

    Training Tracer Ver.2のソフトをsimulinkで書く場合、Embedded Coder Support Package for STM32が必須になる。
    Embedded Coder Support Package for STM32のセットアップ時には、さらに別のソフトのインストールを求められて戸惑った。
    ①ARM Compiler
    コンパイラーを別途ダウンロードする必要があり、アカウントの作成も必要になった
    ②STM32CubeMX
    STM32マイコンのプリフェラル設定そのコードを出力するソフト、ダウンロードにはSTMのアカウント登録が必要で、MATLAB上からそのソフトを動かすにはソフト上でのログインが必要

    Training Tracer Ver.2のハードウェアで躓くところ


    ①ファームウェアの書き込み中に左モータが回転する。
    書き込み中にプルアップされるポートがモータ制御用に割り当てられているため。上の写真のようにプルダウン抵抗をつけると良い
    TrainingTracer_V3では10kΩのプルダウン抵抗が追加されている

    ②パワースイッチをONにしないと書き込みができない
    マイコンボードにUSBを繋ぐとマイコンボード上のLEDが点灯するため、一見書き込みができそうに思えるが。この状態ではSTMマイコンに通電しておらず書き込みできない

    Training Tracer Ver.2関連情報置き場

    資料が複数サイトにあって迷うので備忘録
    RT社
    Training Tracer Ver.2 Download Contents
    組み立てマニュアル、Arduinoサンプルスケッチ
    GitHub – rt-net/TrainingTracer_V2_Hardware: Training Tracer Ver.2のハードウェア資料です
    CPUボードの改造箇所、回路図

    MathWorks社
    Line Trace for Micromouse with Simulink – File Exchange – MATLAB Central
    Simulinkのモデル
    GitHub – mathworks/Line-Trace-for-Micromouse
    同上、MATLAB環境構築方法など
    How to Make a Line-Following Robot Using STM32
    解説動画
    マイクロマウスで学ぶ!ロボティクス開発 × モデルベースデザイン入門
    54分30秒~解説

    壁センサの線形化

    この記事はマイクロマウス Advent Calendar 2025の2日目の記事です。1日目の記事は社畜博士によるロボトレース競技に使えるギヤ付きホイールの作り方の紹介でした。

    マイクロマウス大会のスポンサーであるMathWorks社からMATLABのライセンスを提供してもらえているので、せっかくなのでMATLABを使って壁センサの線形化をやってみた。
    ちなみに去年までは壁センサからの値の常用対数そのまま利用していて制御的には困っていなかったけれど、物理量(距離)への変換をしていないため、壁との距離を直観的に把握することができなかったことが少し不便だった。

    ということでmatlabを使ってセンサの線形化をした手順の紹介
    ①治具を使って壁とロボットの距離を可変できるようにする

    ②壁との距離を変えながらセンサの値を取得する。今回はロボットの前後方向の中心が柱の位置にある場所を45mmとして、ロボットが区間の中心にある場所を90mmとした。L列に左前センサの値、R列に右前センサの値を記録する

    ③測定結果をテキストファイルに保存する

    ④matlabを立ち上げてデータのインポートボタンを押して、③で作ったテキストファイルを選択する

    ⑤インポートツールが立ち上がるので選択のインポートを押したのち、画面を閉じる

    これで変数maekabeがmatlabにインポートされる

    ⑥matlabメイン画面のアプリのタブに移動して、アプリの一覧から曲線フィッターを選択して、曲線フィッターを立ち上げる
    ⑦データの選択を押して、X軸に変数maekabeのセンサの値の列を、Y軸に変数maekabeの壁との距離の列を選択する

    ⑧近似曲線から対数を選ぶとフィッティングされるので、右下の近似パラメーターの値a,bをメモする。

    ⑨マウスのソフトに組み込む
    今回の実装では、自然対数の計算は遅いのでテーブルln_table[]を作成してそれを参照するようにし、
    また、距離分解能が1mm刻みだと少し荒く感じたので、45mm=450になるように近似パラメーターa,bをそれぞれ10倍して反映させている

    以上の手順によって、matlabを使うことで手早くセンサの線形化ができた

    明日のAdvent Calendarはあこちゃんによる誰でも作れる、シリコンタイヤ !です