こんにちわ。青木です。
HM-StarterKit初級者 Part1とPart2までは、ハードウェアに対しての対処方法について紹介しました。Part3からは、ソフトウェアに関しての困りごとの対処方法になります。Part3は、車体角速度制御PIDのゲイン調整用のログの取得開始時間の調整方法になります。
車体角速度制御って?
角速度の名前に車体と書いてあります。角速度だけで良いのでは?と思う方もいると思いますが、角速度は、回転系の速度をいいます。マイクロマウスの場合、回転するものは、車体(図1)とホイール(図2)の2種類あります。
そのため、角速度の文字の前に車体と書いてどの角速度に対して制御するのかを明確にしています。(上司のチェック時に角速度制御と書いて提出したら車体を書け〜と言われて”はっ”と思ったので説明を追加しておきました)
ここでの車体角速度制御については、超信地旋回時の調整についてになります。
車体角速度制御PIDのゲインの調整方法
車体角速度制御PIDのゲインの調整方法ですが、HM-Starterkitをご購入された方のみダウンロードができるマイクロマウスHM StarterKitパート4「操作説明書」の3-3-4 回転方向のPIDゲイン調整のところで調整方法が書いてあります。回転方向のPIDゲイン調整方法ですが、並進方向のPIDゲイン調整と同じやり方です。並進方向のPIDゲイン調整については、HM-StarterKid入門Part12 をみてください。
ざっくり流れを説明すると、PIDゲイン調整をするとき、P、I、D全てを同時に調整するのはベタランでないと厳しいです。そこで、P(比例制御)のゲインの調整を行なった後、I(積分制御)とD(微分制御)のゲイン調整をしています。初めにPゲインを調整するとき、IとDの制御を無効にするため、IとDのゲインを”0″にします。Pのゲインの値を調整して、目標の角速度と大幅なずれがない値を探します。
上級者になると簡易モデルを作ってシミュレーションを行い、ある程度のゲインのあたりをつけてから微調整しますが、ここでは、実際に走行させてゲインが適切な値になっているか繰り返し値を変更して確認します。走行中の動きからどの程度ターゲットからずれているのわかれば、ゲインの調整がしやすいのですが、マイクロマウスを始めたばかりでは、ターゲットとのずれが分からないので、目視ではなく、走行データをグラフ化してゲインの値を大きくしたり小さくしたりします。
走行データ(ログ)の取り方は、モード15(LED全点灯)->モード3(旋回調整)を選択し、センサの前に手をかざすとジャイロのキャリブレーションをした後、旋回行動を行います。その後、TeraTermを起動し、リセットがかからないように通信ケーブルをつけてモード7(ログの送信)を選択し、センサの前に手をかざすとTeraTermにデータが出力されます。TeraTermのデータをExcelに貼り付けてグラフ化すると以下のようになります。グラフ化した項目は、tar_degree、degree、tar_ang_vel、ang_velです。
黒色がターゲットの車体角速度でオレンジが実際の車体角速度です。これをみるとゲインをあげる必要があることがわかります。
グラフの初めに変化していないところがある
お気づきかもしれませんが、このグラフは旋回全てを記録できていません。ログは1000個まで保存できるようにメモリを確保しており、1000を超えるとデータが保存されません。また、500ぐらいまでデータに変化がないことがわかります。
プログラムを見るとジャイロのキャリブレーションをした後に、ログを収集を開始するフラグlog_flagを1にしています。その後、turn関数(run.cファイルにあります)が呼ばれています。turn関数内の先頭にはwait_ms(WAIT_TIME);という待ち時間が入っています。WAIT_TIMEの値が500となっているのでちょうど上記のグラフと合っています。wait_ms(WAIT_TIME);をコメントアウトして、再度データを取り直してみると以下のグラフになります。
今度は、旋回の最初から最後までデータが取れています。しかし、wait_ms(WAIT_TIME);をコメントアウトしてしまったので、走行の時に影響が出るはずです。
改善方法
ゲイン調整ではturn関数のwait_msの引数を0にしたく、実際の走行の時は、wait_msの引数を500にすると都合が良くなります。大幅に修正をするとバグを作ってしまうことになるので、必要最小限で改善ができないか考えてみます。
WAIT_TIMEはparameters.hで#define WAIT_TIME 500と定義されています。これを変数にすれば影響なくWAIT_TIMEを0にしたり500にしたりすることができます。
修正するファイルの中身は以下のようになります。
parameters.hの#define WAIT_TIME 500 をコメントアウト
glob.hにGLOBAL int WAIT_TIME;を追加
init.cのparameters関数にWAIT_TIME=500;を追加
adjust.cの旋回の調整のところでWAITの値を変更し、走行が終わったら元に戻します。
これらを修正することで、turnの調整時はwait_msの待ち時間がなく、走行時は500ms待ってから旋回開始するようになります。
次回は、迷路の場所によって目標値が変わってしまう時の対処方法についてです。
お知らせ
手のひらサイズのマイクロマウスキット「HM-StarterKit」
33%OFFの特別価格で販売中!
製品ページはこちら
アールティロボットショップで購入する